]>
git.ipfire.org Git - people/dweismueller/ipfire-2.x.git/blob - src/hwinfo/src/x86emu/x86emu/prim_asm.h
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 ****************************************************************************/
44 #ifndef __X86EMU_PRIM_ASM_H
45 #define __X86EMU_PRIM_ASM_H
50 #define __HAVE_INLINE_ASSEMBLER__
53 u32
get_flags_asm(void);
54 #pragma aux get_flags_asm = \
60 u16
aaa_word_asm(u32
*flags
,u16 d
);
61 #pragma aux aaa_word_asm = \
71 u16
aas_word_asm(u32
*flags
,u16 d
);
72 #pragma aux aas_word_asm = \
82 u16
aad_word_asm(u32
*flags
,u16 d
);
83 #pragma aux aad_word_asm = \
93 u16
aam_word_asm(u32
*flags
,u8 d
);
94 #pragma aux aam_word_asm = \
104 u8
adc_byte_asm(u32
*flags
,u8 d
, u8 s
);
105 #pragma aux adc_byte_asm = \
111 parm [edi] [al] [bl] \
113 modify exact [al bl];
115 u16
adc_word_asm(u32
*flags
,u16 d
, u16 s
);
116 #pragma aux adc_word_asm = \
122 parm [edi] [ax] [bx] \
124 modify exact [ax bx];
126 u32
adc_long_asm(u32
*flags
,u32 d
, u32 s
);
127 #pragma aux adc_long_asm = \
133 parm [edi] [eax] [ebx] \
135 modify exact [eax ebx];
137 u8
add_byte_asm(u32
*flags
,u8 d
, u8 s
);
138 #pragma aux add_byte_asm = \
144 parm [edi] [al] [bl] \
146 modify exact [al bl];
148 u16
add_word_asm(u32
*flags
,u16 d
, u16 s
);
149 #pragma aux add_word_asm = \
155 parm [edi] [ax] [bx] \
157 modify exact [ax bx];
159 u32
add_long_asm(u32
*flags
,u32 d
, u32 s
);
160 #pragma aux add_long_asm = \
166 parm [edi] [eax] [ebx] \
168 modify exact [eax ebx];
170 u8
and_byte_asm(u32
*flags
,u8 d
, u8 s
);
171 #pragma aux and_byte_asm = \
177 parm [edi] [al] [bl] \
179 modify exact [al bl];
181 u16
and_word_asm(u32
*flags
,u16 d
, u16 s
);
182 #pragma aux and_word_asm = \
188 parm [edi] [ax] [bx] \
190 modify exact [ax bx];
192 u32
and_long_asm(u32
*flags
,u32 d
, u32 s
);
193 #pragma aux and_long_asm = \
199 parm [edi] [eax] [ebx] \
201 modify exact [eax ebx];
203 u8
cmp_byte_asm(u32
*flags
,u8 d
, u8 s
);
204 #pragma aux cmp_byte_asm = \
210 parm [edi] [al] [bl] \
212 modify exact [al bl];
214 u16
cmp_word_asm(u32
*flags
,u16 d
, u16 s
);
215 #pragma aux cmp_word_asm = \
221 parm [edi] [ax] [bx] \
223 modify exact [ax bx];
225 u32
cmp_long_asm(u32
*flags
,u32 d
, u32 s
);
226 #pragma aux cmp_long_asm = \
232 parm [edi] [eax] [ebx] \
234 modify exact [eax ebx];
236 u8
daa_byte_asm(u32
*flags
,u8 d
);
237 #pragma aux daa_byte_asm = \
247 u8
das_byte_asm(u32
*flags
,u8 d
);
248 #pragma aux das_byte_asm = \
258 u8
dec_byte_asm(u32
*flags
,u8 d
);
259 #pragma aux dec_byte_asm = \
269 u16
dec_word_asm(u32
*flags
,u16 d
);
270 #pragma aux dec_word_asm = \
280 u32
dec_long_asm(u32
*flags
,u32 d
);
281 #pragma aux dec_long_asm = \
291 u8
inc_byte_asm(u32
*flags
,u8 d
);
292 #pragma aux inc_byte_asm = \
302 u16
inc_word_asm(u32
*flags
,u16 d
);
303 #pragma aux inc_word_asm = \
313 u32
inc_long_asm(u32
*flags
,u32 d
);
314 #pragma aux inc_long_asm = \
324 u8
or_byte_asm(u32
*flags
,u8 d
, u8 s
);
325 #pragma aux or_byte_asm = \
331 parm [edi] [al] [bl] \
333 modify exact [al bl];
335 u16
or_word_asm(u32
*flags
,u16 d
, u16 s
);
336 #pragma aux or_word_asm = \
342 parm [edi] [ax] [bx] \
344 modify exact [ax bx];
346 u32
or_long_asm(u32
*flags
,u32 d
, u32 s
);
347 #pragma aux or_long_asm = \
353 parm [edi] [eax] [ebx] \
355 modify exact [eax ebx];
357 u8
neg_byte_asm(u32
*flags
,u8 d
);
358 #pragma aux neg_byte_asm = \
368 u16
neg_word_asm(u32
*flags
,u16 d
);
369 #pragma aux neg_word_asm = \
379 u32
neg_long_asm(u32
*flags
,u32 d
);
380 #pragma aux neg_long_asm = \
390 u8
not_byte_asm(u32
*flags
,u8 d
);
391 #pragma aux not_byte_asm = \
401 u16
not_word_asm(u32
*flags
,u16 d
);
402 #pragma aux not_word_asm = \
412 u32
not_long_asm(u32
*flags
,u32 d
);
413 #pragma aux not_long_asm = \
423 u8
rcl_byte_asm(u32
*flags
,u8 d
, u8 s
);
424 #pragma aux rcl_byte_asm = \
430 parm [edi] [al] [cl] \
432 modify exact [al cl];
434 u16
rcl_word_asm(u32
*flags
,u16 d
, u8 s
);
435 #pragma aux rcl_word_asm = \
441 parm [edi] [ax] [cl] \
443 modify exact [ax cl];
445 u32
rcl_long_asm(u32
*flags
,u32 d
, u8 s
);
446 #pragma aux rcl_long_asm = \
452 parm [edi] [eax] [cl] \
454 modify exact [eax cl];
456 u8
rcr_byte_asm(u32
*flags
,u8 d
, u8 s
);
457 #pragma aux rcr_byte_asm = \
463 parm [edi] [al] [cl] \
465 modify exact [al cl];
467 u16
rcr_word_asm(u32
*flags
,u16 d
, u8 s
);
468 #pragma aux rcr_word_asm = \
474 parm [edi] [ax] [cl] \
476 modify exact [ax cl];
478 u32
rcr_long_asm(u32
*flags
,u32 d
, u8 s
);
479 #pragma aux rcr_long_asm = \
485 parm [edi] [eax] [cl] \
487 modify exact [eax cl];
489 u8
rol_byte_asm(u32
*flags
,u8 d
, u8 s
);
490 #pragma aux rol_byte_asm = \
496 parm [edi] [al] [cl] \
498 modify exact [al cl];
500 u16
rol_word_asm(u32
*flags
,u16 d
, u8 s
);
501 #pragma aux rol_word_asm = \
507 parm [edi] [ax] [cl] \
509 modify exact [ax cl];
511 u32
rol_long_asm(u32
*flags
,u32 d
, u8 s
);
512 #pragma aux rol_long_asm = \
518 parm [edi] [eax] [cl] \
520 modify exact [eax cl];
522 u8
ror_byte_asm(u32
*flags
,u8 d
, u8 s
);
523 #pragma aux ror_byte_asm = \
529 parm [edi] [al] [cl] \
531 modify exact [al cl];
533 u16
ror_word_asm(u32
*flags
,u16 d
, u8 s
);
534 #pragma aux ror_word_asm = \
540 parm [edi] [ax] [cl] \
542 modify exact [ax cl];
544 u32
ror_long_asm(u32
*flags
,u32 d
, u8 s
);
545 #pragma aux ror_long_asm = \
551 parm [edi] [eax] [cl] \
553 modify exact [eax cl];
555 u8
shl_byte_asm(u32
*flags
,u8 d
, u8 s
);
556 #pragma aux shl_byte_asm = \
562 parm [edi] [al] [cl] \
564 modify exact [al cl];
566 u16
shl_word_asm(u32
*flags
,u16 d
, u8 s
);
567 #pragma aux shl_word_asm = \
573 parm [edi] [ax] [cl] \
575 modify exact [ax cl];
577 u32
shl_long_asm(u32
*flags
,u32 d
, u8 s
);
578 #pragma aux shl_long_asm = \
584 parm [edi] [eax] [cl] \
586 modify exact [eax cl];
588 u8
shr_byte_asm(u32
*flags
,u8 d
, u8 s
);
589 #pragma aux shr_byte_asm = \
595 parm [edi] [al] [cl] \
597 modify exact [al cl];
599 u16
shr_word_asm(u32
*flags
,u16 d
, u8 s
);
600 #pragma aux shr_word_asm = \
606 parm [edi] [ax] [cl] \
608 modify exact [ax cl];
610 u32
shr_long_asm(u32
*flags
,u32 d
, u8 s
);
611 #pragma aux shr_long_asm = \
617 parm [edi] [eax] [cl] \
619 modify exact [eax cl];
621 u8
sar_byte_asm(u32
*flags
,u8 d
, u8 s
);
622 #pragma aux sar_byte_asm = \
628 parm [edi] [al] [cl] \
630 modify exact [al cl];
632 u16
sar_word_asm(u32
*flags
,u16 d
, u8 s
);
633 #pragma aux sar_word_asm = \
639 parm [edi] [ax] [cl] \
641 modify exact [ax cl];
643 u32
sar_long_asm(u32
*flags
,u32 d
, u8 s
);
644 #pragma aux sar_long_asm = \
650 parm [edi] [eax] [cl] \
652 modify exact [eax cl];
654 u16
shld_word_asm(u32
*flags
,u16 d
, u16 fill
, u8 s
);
655 #pragma aux shld_word_asm = \
661 parm [edi] [ax] [dx] [cl] \
663 modify exact [ax dx cl];
665 u32
shld_long_asm(u32
*flags
,u32 d
, u32 fill
, u8 s
);
666 #pragma aux shld_long_asm = \
672 parm [edi] [eax] [edx] [cl] \
674 modify exact [eax edx cl];
676 u16
shrd_word_asm(u32
*flags
,u16 d
, u16 fill
, u8 s
);
677 #pragma aux shrd_word_asm = \
683 parm [edi] [ax] [dx] [cl] \
685 modify exact [ax dx cl];
687 u32
shrd_long_asm(u32
*flags
,u32 d
, u32 fill
, u8 s
);
688 #pragma aux shrd_long_asm = \
694 parm [edi] [eax] [edx] [cl] \
696 modify exact [eax edx cl];
698 u8
sbb_byte_asm(u32
*flags
,u8 d
, u8 s
);
699 #pragma aux sbb_byte_asm = \
705 parm [edi] [al] [bl] \
707 modify exact [al bl];
709 u16
sbb_word_asm(u32
*flags
,u16 d
, u16 s
);
710 #pragma aux sbb_word_asm = \
716 parm [edi] [ax] [bx] \
718 modify exact [ax bx];
720 u32
sbb_long_asm(u32
*flags
,u32 d
, u32 s
);
721 #pragma aux sbb_long_asm = \
727 parm [edi] [eax] [ebx] \
729 modify exact [eax ebx];
731 u8
sub_byte_asm(u32
*flags
,u8 d
, u8 s
);
732 #pragma aux sub_byte_asm = \
738 parm [edi] [al] [bl] \
740 modify exact [al bl];
742 u16
sub_word_asm(u32
*flags
,u16 d
, u16 s
);
743 #pragma aux sub_word_asm = \
749 parm [edi] [ax] [bx] \
751 modify exact [ax bx];
753 u32
sub_long_asm(u32
*flags
,u32 d
, u32 s
);
754 #pragma aux sub_long_asm = \
760 parm [edi] [eax] [ebx] \
762 modify exact [eax ebx];
764 void test_byte_asm(u32
*flags
,u8 d
, u8 s
);
765 #pragma aux test_byte_asm = \
771 parm [edi] [al] [bl] \
772 modify exact [al bl];
774 void test_word_asm(u32
*flags
,u16 d
, u16 s
);
775 #pragma aux test_word_asm = \
781 parm [edi] [ax] [bx] \
782 modify exact [ax bx];
784 void test_long_asm(u32
*flags
,u32 d
, u32 s
);
785 #pragma aux test_long_asm = \
791 parm [edi] [eax] [ebx] \
792 modify exact [eax ebx];
794 u8
xor_byte_asm(u32
*flags
,u8 d
, u8 s
);
795 #pragma aux xor_byte_asm = \
801 parm [edi] [al] [bl] \
803 modify exact [al bl];
805 u16
xor_word_asm(u32
*flags
,u16 d
, u16 s
);
806 #pragma aux xor_word_asm = \
812 parm [edi] [ax] [bx] \
814 modify exact [ax bx];
816 u32
xor_long_asm(u32
*flags
,u32 d
, u32 s
);
817 #pragma aux xor_long_asm = \
823 parm [edi] [eax] [ebx] \
825 modify exact [eax ebx];
827 void imul_byte_asm(u32
*flags
,u16
*ax
,u8 d
,u8 s
);
828 #pragma aux imul_byte_asm = \
835 parm [edi] [esi] [al] [bl] \
836 modify exact [esi ax bl];
838 void imul_word_asm(u32
*flags
,u16
*ax
,u16
*dx
,u16 d
,u16 s
);
839 #pragma aux imul_word_asm = \
847 parm [edi] [esi] [ecx] [ax] [bx]\
848 modify exact [esi edi ax bx dx];
850 void imul_long_asm(u32
*flags
,u32
*eax
,u32
*edx
,u32 d
,u32 s
);
851 #pragma aux imul_long_asm = \
859 parm [edi] [esi] [ecx] [eax] [ebx] \
860 modify exact [esi edi eax ebx edx];
862 void mul_byte_asm(u32
*flags
,u16
*ax
,u8 d
,u8 s
);
863 #pragma aux mul_byte_asm = \
870 parm [edi] [esi] [al] [bl] \
871 modify exact [esi ax bl];
873 void mul_word_asm(u32
*flags
,u16
*ax
,u16
*dx
,u16 d
,u16 s
);
874 #pragma aux mul_word_asm = \
882 parm [edi] [esi] [ecx] [ax] [bx]\
883 modify exact [esi edi ax bx dx];
885 void mul_long_asm(u32
*flags
,u32
*eax
,u32
*edx
,u32 d
,u32 s
);
886 #pragma aux mul_long_asm = \
894 parm [edi] [esi] [ecx] [eax] [ebx] \
895 modify exact [esi edi eax ebx edx];
897 void idiv_byte_asm(u32
*flags
,u8
*al
,u8
*ah
,u16 d
,u8 s
);
898 #pragma aux idiv_byte_asm = \
906 parm [edi] [esi] [ecx] [ax] [bl]\
907 modify exact [esi edi ax bl];
909 void idiv_word_asm(u32
*flags
,u16
*ax
,u16
*dx
,u16 dlo
,u16 dhi
,u16 s
);
910 #pragma aux idiv_word_asm = \
918 parm [edi] [esi] [ecx] [ax] [dx] [bx]\
919 modify exact [esi edi ax dx bx];
921 void idiv_long_asm(u32
*flags
,u32
*eax
,u32
*edx
,u32 dlo
,u32 dhi
,u32 s
);
922 #pragma aux idiv_long_asm = \
930 parm [edi] [esi] [ecx] [eax] [edx] [ebx]\
931 modify exact [esi edi eax edx ebx];
933 void div_byte_asm(u32
*flags
,u8
*al
,u8
*ah
,u16 d
,u8 s
);
934 #pragma aux div_byte_asm = \
942 parm [edi] [esi] [ecx] [ax] [bl]\
943 modify exact [esi edi ax bl];
945 void div_word_asm(u32
*flags
,u16
*ax
,u16
*dx
,u16 dlo
,u16 dhi
,u16 s
);
946 #pragma aux div_word_asm = \
954 parm [edi] [esi] [ecx] [ax] [dx] [bx]\
955 modify exact [esi edi ax dx bx];
957 void div_long_asm(u32
*flags
,u32
*eax
,u32
*edx
,u32 dlo
,u32 dhi
,u32 s
);
958 #pragma aux div_long_asm = \
966 parm [edi] [esi] [ecx] [eax] [edx] [ebx]\
967 modify exact [esi edi eax edx ebx];
971 #endif /* __X86EMU_PRIM_ASM_H */