VirtualBox

source: vbox/trunk/include/iprt/asm-watcom-x86-32.h@ 102939

Last change on this file since 102939 was 98103, checked in by vboxsync, 22 months ago

Copyright year updates by scm.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 17.4 KB
Line 
1/** @file
2 * IPRT - Assembly Functions, x86 32-bit Watcom C/C++ pragma aux.
3 */
4
5/*
6 * Copyright (C) 2006-2023 Oracle and/or its affiliates.
7 *
8 * This file is part of VirtualBox base platform packages, as
9 * available from https://www.virtualbox.org.
10 *
11 * This program is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU General Public License
13 * as published by the Free Software Foundation, in version 3 of the
14 * License.
15 *
16 * This program is distributed in the hope that it will be useful, but
17 * WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 * General Public License for more details.
20 *
21 * You should have received a copy of the GNU General Public License
22 * along with this program; if not, see <https://www.gnu.org/licenses>.
23 *
24 * The contents of this file may alternatively be used under the terms
25 * of the Common Development and Distribution License Version 1.0
26 * (CDDL), a copy of it is provided in the "COPYING.CDDL" file included
27 * in the VirtualBox distribution, in which case the provisions of the
28 * CDDL are applicable instead of those of the GPL.
29 *
30 * You may elect to license modified versions of this file under the
31 * terms and conditions of either the GPL or the CDDL or both.
32 *
33 * SPDX-License-Identifier: GPL-3.0-only OR CDDL-1.0
34 */
35
36#ifndef IPRT_INCLUDED_asm_watcom_x86_32_h
37#define IPRT_INCLUDED_asm_watcom_x86_32_h
38/* no pragma once */
39
40#ifndef IPRT_INCLUDED_asm_h
41# error "Don't include this header directly."
42#endif
43
44#ifndef __FLAT__
45# error "Only works with flat pointers! (-mf)"
46#endif
47
48/*
49 * Note! The #undef that preceds the #pragma aux statements is for undoing
50 * the mangling, because the symbol in #pragma aux [symbol] statements
51 * doesn't get subjected to preprocessing. This is also why we include
52 * the watcom header at both the top and the bottom of asm.h file.
53 */
54
55#undef ASMCompilerBarrier
56#ifdef IPRT_ASM_WATCOM_X86_32_WITH_PRAGMAS
57# if 0 /* overkill version. */
58# pragma aux ASMCompilerBarrier = \
59 "nop" \
60 parm [] \
61 modify exact [eax ebx ecx edx es ds fs gs];
62# else
63# pragma aux ASMCompilerBarrier = \
64 "" \
65 parm [] \
66 modify exact [];
67# endif
68#endif
69
70#undef ASMNopPause
71#ifdef IPRT_ASM_WATCOM_X86_32_WITH_PRAGMAS
72#pragma aux ASMNopPause = \
73 ".686p" \
74 ".xmm2" \
75 "pause" \
76 parm [] nomemory \
77 modify exact [] nomemory;
78#endif
79
80#undef ASMAtomicXchgU8
81#ifdef IPRT_ASM_WATCOM_X86_32_WITH_PRAGMAS
82#pragma aux ASMAtomicXchgU8 = \
83 "xchg [ecx], al" \
84 parm [ecx] [al] \
85 value [al] \
86 modify exact [al];
87#endif
88
89#undef ASMAtomicXchgU16
90#ifdef IPRT_ASM_WATCOM_X86_32_WITH_PRAGMAS
91#pragma aux ASMAtomicXchgU16 = \
92 "xchg [ecx], ax" \
93 parm [ecx] [ax] \
94 value [ax] \
95 modify exact [ax];
96#endif
97
98#undef ASMAtomicXchgU32
99#ifdef IPRT_ASM_WATCOM_X86_32_WITH_PRAGMAS
100#pragma aux ASMAtomicXchgU32 = \
101 "xchg [ecx], eax" \
102 parm [ecx] [eax] \
103 value [eax] \
104 modify exact [eax];
105#endif
106
107#undef ASMAtomicXchgU64
108#ifdef IPRT_ASM_WATCOM_X86_32_WITH_PRAGMAS
109#pragma aux ASMAtomicXchgU64 = \
110 ".586" \
111 "try_again:" \
112 "lock cmpxchg8b [esi]" \
113 "jnz try_again" \
114 parm [esi] [ebx ecx] \
115 value [eax edx] \
116 modify exact [edx ecx ebx eax];
117#endif
118
119#undef ASMAtomicCmpXchgU8
120#ifdef IPRT_ASM_WATCOM_X86_32_WITH_PRAGMAS
121#pragma aux ASMAtomicCmpXchgU8 = \
122 ".486" \
123 "lock cmpxchg [edx], cl" \
124 "setz al" \
125 parm [edx] [cl] [al] \
126 value [al] \
127 modify exact [al];
128#endif
129
130#undef ASMAtomicCmpXchgU16
131#ifdef IPRT_ASM_WATCOM_X86_32_WITH_PRAGMAS
132#pragma aux ASMAtomicCmpXchgU16 = \
133 ".486" \
134 "lock cmpxchg [edx], cx" \
135 "setz al" \
136 parm [edx] [cx] [ax] \
137 value [al] \
138 modify exact [ax];
139#endif
140
141#undef ASMAtomicCmpXchgU32
142#ifdef IPRT_ASM_WATCOM_X86_32_WITH_PRAGMAS
143#pragma aux ASMAtomicCmpXchgU32 = \
144 ".486" \
145 "lock cmpxchg [edx], ecx" \
146 "setz al" \
147 parm [edx] [ecx] [eax] \
148 value [al] \
149 modify exact [eax];
150#endif
151
152#undef ASMAtomicCmpXchgU64
153#ifdef IPRT_ASM_WATCOM_X86_32_WITH_PRAGMAS
154#pragma aux ASMAtomicCmpXchgU64 = \
155 ".586" \
156 "lock cmpxchg8b [edi]" \
157 "setz al" \
158 parm [edi] [ebx ecx] [eax edx] \
159 value [al] \
160 modify exact [eax edx];
161#endif
162
163#undef ASMAtomicCmpXchgExU32
164#ifdef IPRT_ASM_WATCOM_X86_32_WITH_PRAGMAS
165#pragma aux ASMAtomicCmpXchgExU32 = \
166 ".586" \
167 "lock cmpxchg [edx], ecx" \
168 "mov [edi], eax" \
169 "setz al" \
170 parm [edx] [ecx] [eax] [edi] \
171 value [al] \
172 modify exact [eax];
173#endif
174
175#undef ASMAtomicCmpXchgExU64
176#ifdef IPRT_ASM_WATCOM_X86_32_WITH_PRAGMAS
177#pragma aux ASMAtomicCmpXchgExU64 = \
178 ".586" \
179 "lock cmpxchg8b [edi]" \
180 "mov [esi], eax" \
181 "mov [esi + 4], edx" \
182 "setz al" \
183 parm [edi] [ebx ecx] [eax edx] [esi] \
184 value [al] \
185 modify exact [eax edx];
186#endif
187
188#undef ASMSerializeInstructionCpuId
189#ifdef IPRT_ASM_WATCOM_X86_32_WITH_PRAGMAS
190#pragma aux ASMSerializeInstructionCpuId = \
191 ".586" \
192 "xor eax, eax" \
193 "cpuid" \
194 parm [] \
195 modify exact [eax ebx ecx edx];
196#endif
197
198#undef ASMSerializeInstructionIRet
199#ifdef IPRT_ASM_WATCOM_X86_32_WITH_PRAGMAS
200#pragma aux ASMSerializeInstructionIRet = \
201 "pushf" \
202 "push cs" \
203 "call foo" /* 'push offset done' doesn't work */ \
204 "jmp done" \
205 "foo:" \
206 "iret" \
207 "done:" \
208 parm [] \
209 modify exact [];
210#endif
211
212#undef ASMSerializeInstructionRdTscp
213#ifdef IPRT_ASM_WATCOM_X86_32_WITH_PRAGMAS
214#pragma aux ASMSerializeInstructionRdTscp = \
215 0x0f 0x01 0xf9 \
216 parm [] \
217 modify exact [eax edx ecx];
218#endif
219
220#undef ASMAtomicReadU64
221#ifdef IPRT_ASM_WATCOM_X86_32_WITH_PRAGMAS
222#pragma aux ASMAtomicReadU64 = \
223 ".586" \
224 "xor eax, eax" \
225 "mov edx, eax" \
226 "mov ebx, eax" \
227 "mov ecx, eax" \
228 "lock cmpxchg8b [edi]" \
229 parm [edi] \
230 value [eax edx] \
231 modify exact [eax ebx ecx edx];
232#endif
233
234#undef ASMAtomicUoReadU64
235#ifdef IPRT_ASM_WATCOM_X86_32_WITH_PRAGMAS
236#pragma aux ASMAtomicUoReadU64 = \
237 ".586" \
238 "xor eax, eax" \
239 "mov edx, eax" \
240 "mov ebx, eax" \
241 "mov ecx, eax" \
242 "lock cmpxchg8b [edi]" \
243 parm [edi] \
244 value [eax edx] \
245 modify exact [eax ebx ecx edx];
246#endif
247
248#undef ASMAtomicAddU16
249#ifdef IPRT_ASM_WATCOM_X86_32_WITH_PRAGMAS
250#pragma aux ASMAtomicAddU16 = \
251 ".486" \
252 "lock xadd [ecx], ax" \
253 parm [ecx] [ax] \
254 value [ax] \
255 modify exact [ax];
256#endif
257
258#undef ASMAtomicAddU32
259#ifdef IPRT_ASM_WATCOM_X86_32_WITH_PRAGMAS
260#pragma aux ASMAtomicAddU32 = \
261 ".486" \
262 "lock xadd [ecx], eax" \
263 parm [ecx] [eax] \
264 value [eax] \
265 modify exact [eax];
266#endif
267
268#undef ASMAtomicIncU16
269#ifdef IPRT_ASM_WATCOM_X86_32_WITH_PRAGMAS
270#pragma aux ASMAtomicIncU16 = \
271 ".486" \
272 "mov ax, 1" \
273 "lock xadd [ecx], ax" \
274 "inc ax" \
275 parm [ecx] \
276 value [ax] \
277 modify exact [ax];
278#endif
279
280#undef ASMAtomicIncU32
281#ifdef IPRT_ASM_WATCOM_X86_32_WITH_PRAGMAS
282#pragma aux ASMAtomicIncU32 = \
283 ".486" \
284 "mov eax, 1" \
285 "lock xadd [ecx], eax" \
286 "inc eax" \
287 parm [ecx] \
288 value [eax] \
289 modify exact [eax];
290#endif
291
292/* ASMAtomicIncU64: Should be done by C inline or in external file. */
293
294#undef ASMAtomicDecU16
295#ifdef IPRT_ASM_WATCOM_X86_32_WITH_PRAGMAS
296#pragma aux ASMAtomicDecU16 = \
297 ".486" \
298 "mov ax, 0ffffh" \
299 "lock xadd [ecx], ax" \
300 "dec ax" \
301 parm [ecx] \
302 value [ax] \
303 modify exact [ax];
304#endif
305
306#undef ASMAtomicDecU32
307#ifdef IPRT_ASM_WATCOM_X86_32_WITH_PRAGMAS
308#pragma aux ASMAtomicDecU32 = \
309 ".486" \
310 "mov eax, 0ffffffffh" \
311 "lock xadd [ecx], eax" \
312 "dec eax" \
313 parm [ecx] \
314 value [eax] \
315 modify exact [eax];
316#endif
317
318/* ASMAtomicDecU64: Should be done by C inline or in external file. */
319
320#undef ASMAtomicOrU32
321#ifdef IPRT_ASM_WATCOM_X86_32_WITH_PRAGMAS
322#pragma aux ASMAtomicOrU32 = \
323 "lock or [ecx], eax" \
324 parm [ecx] [eax] \
325 modify exact [];
326#endif
327
328/* ASMAtomicOrU64: Should be done by C inline or in external file. */
329
330#undef ASMAtomicAndU32
331#ifdef IPRT_ASM_WATCOM_X86_32_WITH_PRAGMAS
332#pragma aux ASMAtomicAndU32 = \
333 "lock and [ecx], eax" \
334 parm [ecx] [eax] \
335 modify exact [];
336#endif
337
338/* ASMAtomicAndU64: Should be done by C inline or in external file. */
339
340#undef ASMAtomicUoOrU32
341#ifdef IPRT_ASM_WATCOM_X86_32_WITH_PRAGMAS
342#pragma aux ASMAtomicUoOrU32 = \
343 "or [ecx], eax" \
344 parm [ecx] [eax] \
345 modify exact [];
346#endif
347
348/* ASMAtomicUoOrU64: Should be done by C inline or in external file. */
349
350#undef ASMAtomicUoAndU32
351#ifdef IPRT_ASM_WATCOM_X86_32_WITH_PRAGMAS
352#pragma aux ASMAtomicUoAndU32 = \
353 "and [ecx], eax" \
354 parm [ecx] [eax] \
355 modify exact [];
356#endif
357
358/* ASMAtomicUoAndU64: Should be done by C inline or in external file. */
359
360#undef ASMAtomicUoIncU32
361#ifdef IPRT_ASM_WATCOM_X86_32_WITH_PRAGMAS
362#pragma aux ASMAtomicUoIncU32 = \
363 ".486" \
364 "xadd [ecx], eax" \
365 "inc eax" \
366 parm [ecx] \
367 value [eax] \
368 modify exact [eax];
369#endif
370
371#undef ASMAtomicUoDecU32
372#ifdef IPRT_ASM_WATCOM_X86_32_WITH_PRAGMAS
373#pragma aux ASMAtomicUoDecU32 = \
374 ".486" \
375 "mov eax, 0ffffffffh" \
376 "xadd [ecx], eax" \
377 "dec eax" \
378 parm [ecx] \
379 value [eax] \
380 modify exact [eax];
381#endif
382
383#undef ASMMemZeroPage
384#ifdef IPRT_ASM_WATCOM_X86_32_WITH_PRAGMAS
385#pragma aux ASMMemZeroPage = \
386 "mov ecx, 1024" \
387 "xor eax, eax" \
388 "rep stosd" \
389 parm [edi] \
390 modify exact [eax ecx edi];
391#endif
392
393#undef ASMMemZero32
394#ifdef IPRT_ASM_WATCOM_X86_32_WITH_PRAGMAS
395#pragma aux ASMMemZero32 = \
396 "shr ecx, 2" \
397 "xor eax, eax" \
398 "rep stosd" \
399 parm [edi] [ecx] \
400 modify exact [eax ecx edi];
401#endif
402
403#undef ASMMemFill32
404#ifdef IPRT_ASM_WATCOM_X86_32_WITH_PRAGMAS
405#pragma aux ASMMemFill32 = \
406 "shr ecx, 2" \
407 "rep stosd" \
408 parm [edi] [ecx] [eax]\
409 modify exact [ecx edi];
410#endif
411
412#undef ASMProbeReadByte
413#ifdef IPRT_ASM_WATCOM_X86_32_WITH_PRAGMAS
414#pragma aux ASMProbeReadByte = \
415 "mov al, [ecx]" \
416 parm [ecx] \
417 value [al] \
418 modify exact [al];
419#endif
420
421#undef ASMBitSet
422#ifdef IPRT_ASM_WATCOM_X86_32_WITH_PRAGMAS
423#pragma aux ASMBitSet = \
424 "bts [ecx], eax" \
425 parm [ecx] [eax] \
426 modify exact [];
427#endif
428
429#undef ASMAtomicBitSet
430#ifdef IPRT_ASM_WATCOM_X86_32_WITH_PRAGMAS
431#pragma aux ASMAtomicBitSet = \
432 "lock bts [ecx], eax" \
433 parm [ecx] [eax] \
434 modify exact [];
435#endif
436
437#undef ASMBitClear
438#ifdef IPRT_ASM_WATCOM_X86_32_WITH_PRAGMAS
439#pragma aux ASMBitClear = \
440 "btr [ecx], eax" \
441 parm [ecx] [eax] \
442 modify exact [];
443#endif
444
445#undef ASMAtomicBitClear
446#ifdef IPRT_ASM_WATCOM_X86_32_WITH_PRAGMAS
447#pragma aux ASMAtomicBitClear = \
448 "lock btr [ecx], eax" \
449 parm [ecx] [eax] \
450 modify exact [];
451#endif
452
453#undef ASMBitToggle
454#ifdef IPRT_ASM_WATCOM_X86_32_WITH_PRAGMAS
455#pragma aux ASMBitToggle = \
456 "btc [ecx], eax" \
457 parm [ecx] [eax] \
458 modify exact [];
459#endif
460
461#undef ASMAtomicBitToggle
462#ifdef IPRT_ASM_WATCOM_X86_32_WITH_PRAGMAS
463#pragma aux ASMAtomicBitToggle = \
464 "lock btc [ecx], eax" \
465 parm [ecx] [eax] \
466 modify exact [];
467#endif
468
469
470#undef ASMBitTestAndSet
471#ifdef IPRT_ASM_WATCOM_X86_32_WITH_PRAGMAS
472#pragma aux ASMBitTestAndSet = \
473 "bts [ecx], eax" \
474 "setc al" \
475 parm [ecx] [eax] \
476 value [al] \
477 modify exact [eax];
478#endif
479
480#undef ASMAtomicBitTestAndSet
481#ifdef IPRT_ASM_WATCOM_X86_32_WITH_PRAGMAS
482#pragma aux ASMAtomicBitTestAndSet = \
483 "lock bts [ecx], eax" \
484 "setc al" \
485 parm [ecx] [eax] \
486 value [al] \
487 modify exact [eax];
488#endif
489
490#undef ASMBitTestAndClear
491#ifdef IPRT_ASM_WATCOM_X86_32_WITH_PRAGMAS
492#pragma aux ASMBitTestAndClear = \
493 "btr [ecx], eax" \
494 "setc al" \
495 parm [ecx] [eax] \
496 value [al] \
497 modify exact [eax];
498#endif
499
500#undef ASMAtomicBitTestAndClear
501#ifdef IPRT_ASM_WATCOM_X86_32_WITH_PRAGMAS
502#pragma aux ASMAtomicBitTestAndClear = \
503 "lock btr [ecx], eax" \
504 "setc al" \
505 parm [ecx] [eax] \
506 value [al] \
507 modify exact [eax];
508#endif
509
510#undef ASMBitTestAndToggle
511#ifdef IPRT_ASM_WATCOM_X86_32_WITH_PRAGMAS
512#pragma aux ASMBitTestAndToggle = \
513 "btc [ecx], eax" \
514 "setc al" \
515 parm [ecx] [eax] \
516 value [al] \
517 modify exact [eax];
518#endif
519
520#undef ASMAtomicBitTestAndToggle
521#ifdef IPRT_ASM_WATCOM_X86_32_WITH_PRAGMAS
522#pragma aux ASMAtomicBitTestAndToggle = \
523 "lock btc [ecx], eax" \
524 "setc al" \
525 parm [ecx] [eax] \
526 value [al] \
527 modify exact [eax];
528#endif
529
530#undef ASMBitTest
531#ifdef IPRT_ASM_WATCOM_X86_32_WITH_PRAGMAS
532#pragma aux ASMBitTest = \
533 "bt [ecx], eax" \
534 "setc al" \
535 parm [ecx] [eax] nomemory \
536 value [al] \
537 modify exact [eax] nomemory;
538#endif
539
540#if 0
541/** @todo this is way to much inline assembly, better off in an external function. */
542#undef ASMBitFirstClear
543#ifdef IPRT_ASM_WATCOM_X86_32_WITH_PRAGMAS
544#pragma aux ASMBitFirstClear = \
545 "mov edx, edi" /* save start of bitmap for later */ \
546 "add ecx, 31" \
547 "shr ecx, 5" /* cDWord = RT_ALIGN_32(cBits, 32) / 32; */ \
548 "mov eax, 0ffffffffh" \
549 "repe scasd" \
550 "je done" \
551 "lea edi, [edi - 4]" /* rewind edi */ \
552 "xor eax, [edi]" /* load inverted bits */ \
553 "sub edi, edx" /* calc byte offset */ \
554 "shl edi, 3" /* convert byte to bit offset */ \
555 "mov edx, eax" \
556 "bsf eax, edx" \
557 "add eax, edi" \
558 "done:" \
559 parm [edi] [ecx] \
560 value [eax] \
561 modify exact [eax ecx edx edi];
562#endif
563
564/* ASMBitNextClear: Too much work, do when needed. */
565
566/** @todo this is way to much inline assembly, better off in an external function. */
567#undef ASMBitFirstSet
568#ifdef IPRT_ASM_WATCOM_X86_32_WITH_PRAGMAS
569#pragma aux ASMBitFirstSet = \
570 "mov edx, edi" /* save start of bitmap for later */ \
571 "add ecx, 31" \
572 "shr ecx, 5" /* cDWord = RT_ALIGN_32(cBits, 32) / 32; */ \
573 "mov eax, 0ffffffffh" \
574 "repe scasd" \
575 "je done" \
576 "lea edi, [edi - 4]" /* rewind edi */ \
577 "mov eax, [edi]" /* reload previous dword */ \
578 "sub edi, edx" /* calc byte offset */ \
579 "shl edi, 3" /* convert byte to bit offset */ \
580 "mov edx, eax" \
581 "bsf eax, edx" \
582 "add eax, edi" \
583 "done:" \
584 parm [edi] [ecx] \
585 value [eax] \
586 modify exact [eax ecx edx edi];
587#endif
588
589/* ASMBitNextSet: Too much work, do when needed. */
590#else
591/* ASMBitFirstClear: External file. */
592/* ASMBitNextClear: External file. */
593/* ASMBitFirstSet: External file. */
594/* ASMBitNextSet: External file. */
595#endif
596
597#undef ASMBitFirstSetU32
598#ifdef IPRT_ASM_WATCOM_X86_32_WITH_PRAGMAS
599#pragma aux ASMBitFirstSetU32 = \
600 "bsf eax, eax" \
601 "jz not_found" \
602 "inc eax" \
603 "jmp done" \
604 "not_found:" \
605 "xor eax, eax" \
606 "done:" \
607 parm [eax] nomemory \
608 value [eax] \
609 modify exact [eax] nomemory;
610#endif
611
612#undef ASMBitFirstSetU64
613#ifdef IPRT_ASM_WATCOM_X86_32_WITH_PRAGMAS
614#pragma aux ASMBitFirstSetU64 = \
615 "bsf eax, eax" \
616 "jz not_found_low" \
617 "inc eax" \
618 "jmp done" \
619 \
620 "not_found_low:" \
621 "bsf eax, edx" \
622 "jz not_found_high" \
623 "add eax, 33" \
624 "jmp done" \
625 \
626 "not_found_high:" \
627 "xor eax, eax" \
628 "done:" \
629 parm [eax edx] nomemory \
630 value [eax] \
631 modify exact [eax] nomemory;
632#endif
633
634#undef ASMBitFirstSetU16
635#ifdef IPRT_ASM_WATCOM_X86_32_WITH_PRAGMAS
636#pragma aux ASMBitFirstSetU16 = \
637 "movzx eax, ax" \
638 "bsf eax, eax" \
639 "jz not_found" \
640 "inc eax" \
641 "jmp done" \
642 "not_found:" \
643 "xor eax, eax" \
644 "done:" \
645 parm [ax] nomemory \
646 value [eax] \
647 modify exact [eax] nomemory;
648#endif
649
650#undef ASMBitLastSetU32
651#ifdef IPRT_ASM_WATCOM_X86_32_WITH_PRAGMAS
652#pragma aux ASMBitLastSetU32 = \
653 "bsr eax, eax" \
654 "jz not_found" \
655 "inc eax" \
656 "jmp done" \
657 "not_found:" \
658 "xor eax, eax" \
659 "done:" \
660 parm [eax] nomemory \
661 value [eax] \
662 modify exact [eax] nomemory;
663#endif
664
665#undef ASMBitLastSetU64
666#ifdef IPRT_ASM_WATCOM_X86_32_WITH_PRAGMAS
667#pragma aux ASMBitLastSetU64 = \
668 "xchg eax, edx" \
669 "bsr eax, eax" \
670 "jz not_found_high" \
671 "add eax, 33" \
672 "jmp done" \
673 \
674 "not_found_high:" \
675 "bsr eax, edx" \
676 "jz not_found" \
677 "inc eax" \
678 "jmp done" \
679 \
680 "not_found:" \
681 "xor eax, eax" \
682 "done:" \
683 parm [eax edx] nomemory \
684 value [eax] \
685 modify exact [eax edx] nomemory;
686#endif
687
688#undef ASMBitLastSetU16
689#ifdef IPRT_ASM_WATCOM_X86_32_WITH_PRAGMAS
690#pragma aux ASMBitLastSetU16 = \
691 "movzx eax, ax" \
692 "bsr eax, eax" \
693 "jz not_found" \
694 "inc eax" \
695 "jmp done" \
696 "not_found:" \
697 "xor eax, eax" \
698 "done:" \
699 parm [ax] nomemory \
700 value [eax] \
701 modify exact [eax] nomemory;
702#endif
703
704#undef ASMByteSwapU16
705#ifdef IPRT_ASM_WATCOM_X86_32_WITH_PRAGMAS
706#pragma aux ASMByteSwapU16 = \
707 "ror ax, 8" \
708 parm [ax] nomemory \
709 value [ax] \
710 modify exact [ax] nomemory;
711#endif
712
713#undef ASMByteSwapU32
714#ifdef IPRT_ASM_WATCOM_X86_32_WITH_PRAGMAS
715#pragma aux ASMByteSwapU32 = \
716 "bswap eax" \
717 parm [eax] nomemory \
718 value [eax] \
719 modify exact [eax] nomemory;
720#endif
721
722#undef ASMRotateLeftU32
723#ifdef IPRT_ASM_WATCOM_X86_32_WITH_PRAGMAS
724#pragma aux ASMRotateLeftU32 = \
725 "rol eax, cl" \
726 parm [eax] [ecx] nomemory \
727 value [eax] \
728 modify exact [eax] nomemory;
729#endif
730
731#undef ASMRotateRightU32
732#ifdef IPRT_ASM_WATCOM_X86_32_WITH_PRAGMAS
733#pragma aux ASMRotateRightU32 = \
734 "ror eax, cl" \
735 parm [eax] [ecx] nomemory \
736 value [eax] \
737 modify exact [eax] nomemory;
738#endif
739
740#endif /* !IPRT_INCLUDED_asm_watcom_x86_32_h */
741
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette