aca132bf1c517cbeb5d052ba3033003574ca3394
1 /****************************************************************************
3 * Realmode X86 Emulator Library
5 * Copyright (C) 1996-1999 SciTech Software, Inc.
6 * Copyright (C) David Mosberger-Tang
7 * Copyright (C) 1999 Egbert Eich
9 * ========================================================================
11 * Permission to use, copy, modify, distribute, and sell this software and
12 * its documentation for any purpose is hereby granted without fee,
13 * provided that the above copyright notice appear in all copies and that
14 * both that copyright notice and this permission notice appear in
15 * supporting documentation, and that the name of the authors not be used
16 * in advertising or publicity pertaining to distribution of the software
17 * without specific, written prior permission. The authors makes no
18 * representations about the suitability of this software for any purpose.
19 * It is provided "as is" without express or implied warranty.
21 * THE AUTHORS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
22 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
23 * EVENT SHALL THE AUTHORS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
24 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
25 * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
26 * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
27 * PERFORMANCE OF THIS SOFTWARE.
29 * ========================================================================
31 * Language: Watcom C++ 10.6 or later
33 * Developer: Kendall Bennett
35 * Description: Inline assembler versions of the primitive operand
36 * functions for faster performance. At the moment this is
37 * x86 inline assembler, but these functions could be replaced
38 * with native inline assembler for each supported processor
41 ****************************************************************************/
43 #ifndef __X86EMU_PRIM_ASM_H
44 #define __X86EMU_PRIM_ASM_H
49 #define __HAVE_INLINE_ASSEMBLER__
52 u32
get_flags_asm(void);
54 #pragma aux get_flags_asm = \
60 u16
aaa_word_asm(u32
* flags
, u16 d
);
62 #pragma aux aaa_word_asm = \
72 u16
aas_word_asm(u32
* flags
, u16 d
);
74 #pragma aux aas_word_asm = \
84 u16
aad_word_asm(u32
* flags
, u16 d
);
86 #pragma aux aad_word_asm = \
96 u16
aam_word_asm(u32
* flags
, u8 d
);
98 #pragma aux aam_word_asm = \
108 u8
adc_byte_asm(u32
* flags
, u8 d
, u8 s
);
110 #pragma aux adc_byte_asm = \
116 parm [edi] [al] [bl] \
118 modify exact [al bl];
120 u16
adc_word_asm(u32
* flags
, u16 d
, u16 s
);
122 #pragma aux adc_word_asm = \
128 parm [edi] [ax] [bx] \
130 modify exact [ax bx];
132 u32
adc_long_asm(u32
* flags
, u32 d
, u32 s
);
134 #pragma aux adc_long_asm = \
140 parm [edi] [eax] [ebx] \
142 modify exact [eax ebx];
144 u8
add_byte_asm(u32
* flags
, u8 d
, u8 s
);
146 #pragma aux add_byte_asm = \
152 parm [edi] [al] [bl] \
154 modify exact [al bl];
156 u16
add_word_asm(u32
* flags
, u16 d
, u16 s
);
158 #pragma aux add_word_asm = \
164 parm [edi] [ax] [bx] \
166 modify exact [ax bx];
168 u32
add_long_asm(u32
* flags
, u32 d
, u32 s
);
170 #pragma aux add_long_asm = \
176 parm [edi] [eax] [ebx] \
178 modify exact [eax ebx];
180 u8
and_byte_asm(u32
* flags
, u8 d
, u8 s
);
182 #pragma aux and_byte_asm = \
188 parm [edi] [al] [bl] \
190 modify exact [al bl];
192 u16
and_word_asm(u32
* flags
, u16 d
, u16 s
);
194 #pragma aux and_word_asm = \
200 parm [edi] [ax] [bx] \
202 modify exact [ax bx];
204 u32
and_long_asm(u32
* flags
, u32 d
, u32 s
);
206 #pragma aux and_long_asm = \
212 parm [edi] [eax] [ebx] \
214 modify exact [eax ebx];
216 u8
cmp_byte_asm(u32
* flags
, u8 d
, u8 s
);
218 #pragma aux cmp_byte_asm = \
224 parm [edi] [al] [bl] \
226 modify exact [al bl];
228 u16
cmp_word_asm(u32
* flags
, u16 d
, u16 s
);
230 #pragma aux cmp_word_asm = \
236 parm [edi] [ax] [bx] \
238 modify exact [ax bx];
240 u32
cmp_long_asm(u32
* flags
, u32 d
, u32 s
);
242 #pragma aux cmp_long_asm = \
248 parm [edi] [eax] [ebx] \
250 modify exact [eax ebx];
252 u8
daa_byte_asm(u32
* flags
, u8 d
);
254 #pragma aux daa_byte_asm = \
264 u8
das_byte_asm(u32
* flags
, u8 d
);
266 #pragma aux das_byte_asm = \
276 u8
dec_byte_asm(u32
* flags
, u8 d
);
278 #pragma aux dec_byte_asm = \
288 u16
dec_word_asm(u32
* flags
, u16 d
);
290 #pragma aux dec_word_asm = \
300 u32
dec_long_asm(u32
* flags
, u32 d
);
302 #pragma aux dec_long_asm = \
312 u8
inc_byte_asm(u32
* flags
, u8 d
);
314 #pragma aux inc_byte_asm = \
324 u16
inc_word_asm(u32
* flags
, u16 d
);
326 #pragma aux inc_word_asm = \
336 u32
inc_long_asm(u32
* flags
, u32 d
);
338 #pragma aux inc_long_asm = \
348 u8
or_byte_asm(u32
* flags
, u8 d
, u8 s
);
350 #pragma aux or_byte_asm = \
356 parm [edi] [al] [bl] \
358 modify exact [al bl];
360 u16
or_word_asm(u32
* flags
, u16 d
, u16 s
);
362 #pragma aux or_word_asm = \
368 parm [edi] [ax] [bx] \
370 modify exact [ax bx];
372 u32
or_long_asm(u32
* flags
, u32 d
, u32 s
);
374 #pragma aux or_long_asm = \
380 parm [edi] [eax] [ebx] \
382 modify exact [eax ebx];
384 u8
neg_byte_asm(u32
* flags
, u8 d
);
386 #pragma aux neg_byte_asm = \
396 u16
neg_word_asm(u32
* flags
, u16 d
);
398 #pragma aux neg_word_asm = \
408 u32
neg_long_asm(u32
* flags
, u32 d
);
410 #pragma aux neg_long_asm = \
420 u8
not_byte_asm(u32
* flags
, u8 d
);
422 #pragma aux not_byte_asm = \
432 u16
not_word_asm(u32
* flags
, u16 d
);
434 #pragma aux not_word_asm = \
444 u32
not_long_asm(u32
* flags
, u32 d
);
446 #pragma aux not_long_asm = \
456 u8
rcl_byte_asm(u32
* flags
, u8 d
, u8 s
);
458 #pragma aux rcl_byte_asm = \
464 parm [edi] [al] [cl] \
466 modify exact [al cl];
468 u16
rcl_word_asm(u32
* flags
, u16 d
, u8 s
);
470 #pragma aux rcl_word_asm = \
476 parm [edi] [ax] [cl] \
478 modify exact [ax cl];
480 u32
rcl_long_asm(u32
* flags
, u32 d
, u8 s
);
482 #pragma aux rcl_long_asm = \
488 parm [edi] [eax] [cl] \
490 modify exact [eax cl];
492 u8
rcr_byte_asm(u32
* flags
, u8 d
, u8 s
);
494 #pragma aux rcr_byte_asm = \
500 parm [edi] [al] [cl] \
502 modify exact [al cl];
504 u16
rcr_word_asm(u32
* flags
, u16 d
, u8 s
);
506 #pragma aux rcr_word_asm = \
512 parm [edi] [ax] [cl] \
514 modify exact [ax cl];
516 u32
rcr_long_asm(u32
* flags
, u32 d
, u8 s
);
518 #pragma aux rcr_long_asm = \
524 parm [edi] [eax] [cl] \
526 modify exact [eax cl];
528 u8
rol_byte_asm(u32
* flags
, u8 d
, u8 s
);
530 #pragma aux rol_byte_asm = \
536 parm [edi] [al] [cl] \
538 modify exact [al cl];
540 u16
rol_word_asm(u32
* flags
, u16 d
, u8 s
);
542 #pragma aux rol_word_asm = \
548 parm [edi] [ax] [cl] \
550 modify exact [ax cl];
552 u32
rol_long_asm(u32
* flags
, u32 d
, u8 s
);
554 #pragma aux rol_long_asm = \
560 parm [edi] [eax] [cl] \
562 modify exact [eax cl];
564 u8
ror_byte_asm(u32
* flags
, u8 d
, u8 s
);
566 #pragma aux ror_byte_asm = \
572 parm [edi] [al] [cl] \
574 modify exact [al cl];
576 u16
ror_word_asm(u32
* flags
, u16 d
, u8 s
);
578 #pragma aux ror_word_asm = \
584 parm [edi] [ax] [cl] \
586 modify exact [ax cl];
588 u32
ror_long_asm(u32
* flags
, u32 d
, u8 s
);
590 #pragma aux ror_long_asm = \
596 parm [edi] [eax] [cl] \
598 modify exact [eax cl];
600 u8
shl_byte_asm(u32
* flags
, u8 d
, u8 s
);
602 #pragma aux shl_byte_asm = \
608 parm [edi] [al] [cl] \
610 modify exact [al cl];
612 u16
shl_word_asm(u32
* flags
, u16 d
, u8 s
);
614 #pragma aux shl_word_asm = \
620 parm [edi] [ax] [cl] \
622 modify exact [ax cl];
624 u32
shl_long_asm(u32
* flags
, u32 d
, u8 s
);
626 #pragma aux shl_long_asm = \
632 parm [edi] [eax] [cl] \
634 modify exact [eax cl];
636 u8
shr_byte_asm(u32
* flags
, u8 d
, u8 s
);
638 #pragma aux shr_byte_asm = \
644 parm [edi] [al] [cl] \
646 modify exact [al cl];
648 u16
shr_word_asm(u32
* flags
, u16 d
, u8 s
);
650 #pragma aux shr_word_asm = \
656 parm [edi] [ax] [cl] \
658 modify exact [ax cl];
660 u32
shr_long_asm(u32
* flags
, u32 d
, u8 s
);
662 #pragma aux shr_long_asm = \
668 parm [edi] [eax] [cl] \
670 modify exact [eax cl];
672 u8
sar_byte_asm(u32
* flags
, u8 d
, u8 s
);
674 #pragma aux sar_byte_asm = \
680 parm [edi] [al] [cl] \
682 modify exact [al cl];
684 u16
sar_word_asm(u32
* flags
, u16 d
, u8 s
);
686 #pragma aux sar_word_asm = \
692 parm [edi] [ax] [cl] \
694 modify exact [ax cl];
696 u32
sar_long_asm(u32
* flags
, u32 d
, u8 s
);
698 #pragma aux sar_long_asm = \
704 parm [edi] [eax] [cl] \
706 modify exact [eax cl];
708 u16
shld_word_asm(u32
* flags
, u16 d
, u16 fill
, u8 s
);
710 #pragma aux shld_word_asm = \
716 parm [edi] [ax] [dx] [cl] \
718 modify exact [ax dx cl];
720 u32
shld_long_asm(u32
* flags
, u32 d
, u32 fill
, u8 s
);
722 #pragma aux shld_long_asm = \
728 parm [edi] [eax] [edx] [cl] \
730 modify exact [eax edx cl];
732 u16
shrd_word_asm(u32
* flags
, u16 d
, u16 fill
, u8 s
);
734 #pragma aux shrd_word_asm = \
740 parm [edi] [ax] [dx] [cl] \
742 modify exact [ax dx cl];
744 u32
shrd_long_asm(u32
* flags
, u32 d
, u32 fill
, u8 s
);
746 #pragma aux shrd_long_asm = \
752 parm [edi] [eax] [edx] [cl] \
754 modify exact [eax edx cl];
756 u8
sbb_byte_asm(u32
* flags
, u8 d
, u8 s
);
758 #pragma aux sbb_byte_asm = \
764 parm [edi] [al] [bl] \
766 modify exact [al bl];
768 u16
sbb_word_asm(u32
* flags
, u16 d
, u16 s
);
770 #pragma aux sbb_word_asm = \
776 parm [edi] [ax] [bx] \
778 modify exact [ax bx];
780 u32
sbb_long_asm(u32
* flags
, u32 d
, u32 s
);
782 #pragma aux sbb_long_asm = \
788 parm [edi] [eax] [ebx] \
790 modify exact [eax ebx];
792 u8
sub_byte_asm(u32
* flags
, u8 d
, u8 s
);
794 #pragma aux sub_byte_asm = \
800 parm [edi] [al] [bl] \
802 modify exact [al bl];
804 u16
sub_word_asm(u32
* flags
, u16 d
, u16 s
);
806 #pragma aux sub_word_asm = \
812 parm [edi] [ax] [bx] \
814 modify exact [ax bx];
816 u32
sub_long_asm(u32
* flags
, u32 d
, u32 s
);
818 #pragma aux sub_long_asm = \
824 parm [edi] [eax] [ebx] \
826 modify exact [eax ebx];
828 void test_byte_asm(u32
* flags
, u8 d
, u8 s
);
830 #pragma aux test_byte_asm = \
836 parm [edi] [al] [bl] \
837 modify exact [al bl];
839 void test_word_asm(u32
* flags
, u16 d
, u16 s
);
841 #pragma aux test_word_asm = \
847 parm [edi] [ax] [bx] \
848 modify exact [ax bx];
850 void test_long_asm(u32
* flags
, u32 d
, u32 s
);
852 #pragma aux test_long_asm = \
858 parm [edi] [eax] [ebx] \
859 modify exact [eax ebx];
861 u8
xor_byte_asm(u32
* flags
, u8 d
, u8 s
);
863 #pragma aux xor_byte_asm = \
869 parm [edi] [al] [bl] \
871 modify exact [al bl];
873 u16
xor_word_asm(u32
* flags
, u16 d
, u16 s
);
875 #pragma aux xor_word_asm = \
881 parm [edi] [ax] [bx] \
883 modify exact [ax bx];
885 u32
xor_long_asm(u32
* flags
, u32 d
, u32 s
);
887 #pragma aux xor_long_asm = \
893 parm [edi] [eax] [ebx] \
895 modify exact [eax ebx];
897 void imul_byte_asm(u32
* flags
, u16
* ax
, u8 d
, u8 s
);
899 #pragma aux imul_byte_asm = \
906 parm [edi] [esi] [al] [bl] \
907 modify exact [esi ax bl];
909 void imul_word_asm(u32
* flags
, u16
* ax
, u16
* dx
, u16 d
, u16 s
);
911 #pragma aux imul_word_asm = \
919 parm [edi] [esi] [ecx] [ax] [bx]\
920 modify exact [esi edi ax bx dx];
922 void imul_long_asm(u32
* flags
, u32
* eax
, u32
* edx
, u32 d
, u32 s
);
924 #pragma aux imul_long_asm = \
932 parm [edi] [esi] [ecx] [eax] [ebx] \
933 modify exact [esi edi eax ebx edx];
935 void mul_byte_asm(u32
* flags
, u16
* ax
, u8 d
, u8 s
);
937 #pragma aux mul_byte_asm = \
944 parm [edi] [esi] [al] [bl] \
945 modify exact [esi ax bl];
947 void mul_word_asm(u32
* flags
, u16
* ax
, u16
* dx
, u16 d
, u16 s
);
949 #pragma aux mul_word_asm = \
957 parm [edi] [esi] [ecx] [ax] [bx]\
958 modify exact [esi edi ax bx dx];
960 void mul_long_asm(u32
* flags
, u32
* eax
, u32
* edx
, u32 d
, u32 s
);
962 #pragma aux mul_long_asm = \
970 parm [edi] [esi] [ecx] [eax] [ebx] \
971 modify exact [esi edi eax ebx edx];
973 void idiv_byte_asm(u32
* flags
, u8
* al
, u8
* ah
, u16 d
, u8 s
);
975 #pragma aux idiv_byte_asm = \
983 parm [edi] [esi] [ecx] [ax] [bl]\
984 modify exact [esi edi ax bl];
986 void idiv_word_asm(u32
* flags
, u16
* ax
, u16
* dx
, u16 dlo
, u16 dhi
, u16 s
);
988 #pragma aux idiv_word_asm = \
996 parm [edi] [esi] [ecx] [ax] [dx] [bx]\
997 modify exact [esi edi ax dx bx];
999 void idiv_long_asm(u32
* flags
, u32
* eax
, u32
* edx
, u32 dlo
, u32 dhi
, u32 s
);
1001 #pragma aux idiv_long_asm = \
1009 parm [edi] [esi] [ecx] [eax] [edx] [ebx]\
1010 modify exact [esi edi eax edx ebx];
1012 void div_byte_asm(u32
* flags
, u8
* al
, u8
* ah
, u16 d
, u8 s
);
1014 #pragma aux div_byte_asm = \
1022 parm [edi] [esi] [ecx] [ax] [bl]\
1023 modify exact [esi edi ax bl];
1025 void div_word_asm(u32
* flags
, u16
* ax
, u16
* dx
, u16 dlo
, u16 dhi
, u16 s
);
1027 #pragma aux div_word_asm = \
1035 parm [edi] [esi] [ecx] [ax] [dx] [bx]\
1036 modify exact [esi edi ax dx bx];
1038 void div_long_asm(u32
* flags
, u32
* eax
, u32
* edx
, u32 dlo
, u32 dhi
, u32 s
);
1040 #pragma aux div_long_asm = \
1048 parm [edi] [esi] [ecx] [eax] [edx] [ebx]\
1049 modify exact [esi edi eax edx ebx];
1053 #endif /* __X86EMU_PRIM_ASM_H */