20 #ifndef __X86EMU_PRIM_ASM_H 21 #define __X86EMU_PRIM_ASM_H 26 #define __HAVE_INLINE_ASSEMBLER__ 29 u32 get_flags_asm(
void);
30 #pragma aux get_flags_asm = "pushf" \ 31 "pop eax" value[eax] modify exact[eax]; 33 u16 aaa_word_asm(u32 *flags, u16 d);
34 #pragma aux aaa_word_asm = \ 39 "pop [edi]" parm[edi][ax] value[ax] modify exact[ax]; 41 u16 aas_word_asm(u32 *flags, u16 d);
42 #pragma aux aas_word_asm = \ 47 "pop [edi]" parm[edi][ax] value[ax] modify exact[ax]; 49 u16 aad_word_asm(u32 *flags, u16 d);
50 #pragma aux aad_word_asm = \ 55 "pop [edi]" parm[edi][ax] value[ax] modify exact[ax]; 57 u16 aam_word_asm(u32 *flags, u8 d);
58 #pragma aux aam_word_asm = \ 63 "pop [edi]" parm[edi][al] value[ax] modify exact[ax]; 65 u8 adc_byte_asm(u32 *flags, u8 d, u8 s);
66 #pragma aux adc_byte_asm = \ 71 "pop [edi]" parm[edi][al][bl] value[al] modify exact[al bl]; 73 u16 adc_word_asm(u32 *flags, u16 d, u16 s);
74 #pragma aux adc_word_asm = \ 79 "pop [edi]" parm[edi][ax][bx] value[ax] modify exact[ax bx]; 81 u32 adc_long_asm(u32 *flags, u32 d, u32 s);
82 #pragma aux adc_long_asm = \ 87 "pop [edi]" parm[edi][eax][ebx] value[eax] modify exact[eax ebx]; 89 u8 add_byte_asm(u32 *flags, u8 d, u8 s);
90 #pragma aux add_byte_asm = \ 95 "pop [edi]" parm[edi][al][bl] value[al] modify exact[al bl]; 97 u16 add_word_asm(u32 *flags, u16 d, u16 s);
98 #pragma aux add_word_asm = \ 103 "pop [edi]" parm[edi][ax][bx] value[ax] modify exact[ax bx]; 105 u32 add_long_asm(u32 *flags, u32 d, u32 s);
106 #pragma aux add_long_asm = \ 111 "pop [edi]" parm[edi][eax][ebx] value[eax] modify exact[eax ebx]; 113 u8 and_byte_asm(u32 *flags, u8 d, u8 s);
114 #pragma aux and_byte_asm = \ 119 "pop [edi]" parm[edi][al][bl] value[al] modify exact[al bl]; 121 u16 and_word_asm(u32 *flags, u16 d, u16 s);
122 #pragma aux and_word_asm = \ 127 "pop [edi]" parm[edi][ax][bx] value[ax] modify exact[ax bx]; 129 u32 and_long_asm(u32 *flags, u32 d, u32 s);
130 #pragma aux and_long_asm = \ 135 "pop [edi]" parm[edi][eax][ebx] value[eax] modify exact[eax ebx]; 137 u8 cmp_byte_asm(u32 *flags, u8 d, u8 s);
138 #pragma aux cmp_byte_asm = \ 143 "pop [edi]" parm[edi][al][bl] value[al] modify exact[al bl]; 145 u16 cmp_word_asm(u32 *flags, u16 d, u16 s);
146 #pragma aux cmp_word_asm = \ 151 "pop [edi]" parm[edi][ax][bx] value[ax] modify exact[ax bx]; 153 u32 cmp_long_asm(u32 *flags, u32 d, u32 s);
154 #pragma aux cmp_long_asm = \ 159 "pop [edi]" parm[edi][eax][ebx] value[eax] modify exact[eax ebx]; 161 u8 daa_byte_asm(u32 *flags, u8 d);
162 #pragma aux daa_byte_asm = \ 167 "pop [edi]" parm[edi][al] value[al] modify exact[al]; 169 u8 das_byte_asm(u32 *flags, u8 d);
170 #pragma aux das_byte_asm = \ 175 "pop [edi]" parm[edi][al] value[al] modify exact[al]; 177 u8 dec_byte_asm(u32 *flags, u8 d);
178 #pragma aux dec_byte_asm = \ 183 "pop [edi]" parm[edi][al] value[al] modify exact[al]; 185 u16 dec_word_asm(u32 *flags, u16 d);
186 #pragma aux dec_word_asm = \ 191 "pop [edi]" parm[edi][ax] value[ax] modify exact[ax]; 193 u32 dec_long_asm(u32 *flags, u32 d);
194 #pragma aux dec_long_asm = \ 199 "pop [edi]" parm[edi][eax] value[eax] modify exact[eax]; 201 u8 inc_byte_asm(u32 *flags, u8 d);
202 #pragma aux inc_byte_asm = \ 207 "pop [edi]" parm[edi][al] value[al] modify exact[al]; 209 u16 inc_word_asm(u32 *flags, u16 d);
210 #pragma aux inc_word_asm = \ 215 "pop [edi]" parm[edi][ax] value[ax] modify exact[ax]; 217 u32 inc_long_asm(u32 *flags, u32 d);
218 #pragma aux inc_long_asm = \ 223 "pop [edi]" parm[edi][eax] value[eax] modify exact[eax]; 225 u8 or_byte_asm(u32 *flags, u8 d, u8 s);
226 #pragma aux or_byte_asm = \ 231 "pop [edi]" parm[edi][al][bl] value[al] modify exact[al bl]; 233 u16 or_word_asm(u32 *flags, u16 d, u16 s);
234 #pragma aux or_word_asm = \ 239 "pop [edi]" parm[edi][ax][bx] value[ax] modify exact[ax bx]; 241 u32 or_long_asm(u32 *flags, u32 d, u32 s);
242 #pragma aux or_long_asm = \ 247 "pop [edi]" parm[edi][eax][ebx] value[eax] modify exact[eax ebx]; 249 u8 neg_byte_asm(u32 *flags, u8 d);
250 #pragma aux neg_byte_asm = \ 255 "pop [edi]" parm[edi][al] value[al] modify exact[al]; 257 u16 neg_word_asm(u32 *flags, u16 d);
258 #pragma aux neg_word_asm = \ 263 "pop [edi]" parm[edi][ax] value[ax] modify exact[ax]; 265 u32 neg_long_asm(u32 *flags, u32 d);
266 #pragma aux neg_long_asm = \ 271 "pop [edi]" parm[edi][eax] value[eax] modify exact[eax]; 273 u8 not_byte_asm(u32 *flags, u8 d);
274 #pragma aux not_byte_asm = \ 279 "pop [edi]" parm[edi][al] value[al] modify exact[al]; 281 u16 not_word_asm(u32 *flags, u16 d);
282 #pragma aux not_word_asm = \ 287 "pop [edi]" parm[edi][ax] value[ax] modify exact[ax]; 289 u32 not_long_asm(u32 *flags, u32 d);
290 #pragma aux not_long_asm = \ 295 "pop [edi]" parm[edi][eax] value[eax] modify exact[eax]; 297 u8 rcl_byte_asm(u32 *flags, u8 d, u8 s);
298 #pragma aux rcl_byte_asm = \ 303 "pop [edi]" parm[edi][al][cl] value[al] modify exact[al cl]; 305 u16 rcl_word_asm(u32 *flags, u16 d, u8 s);
306 #pragma aux rcl_word_asm = \ 311 "pop [edi]" parm[edi][ax][cl] value[ax] modify exact[ax cl]; 313 u32 rcl_long_asm(u32 *flags, u32 d, u8 s);
314 #pragma aux rcl_long_asm = \ 319 "pop [edi]" parm[edi][eax][cl] value[eax] modify exact[eax cl]; 321 u8 rcr_byte_asm(u32 *flags, u8 d, u8 s);
322 #pragma aux rcr_byte_asm = \ 327 "pop [edi]" parm[edi][al][cl] value[al] modify exact[al cl]; 329 u16 rcr_word_asm(u32 *flags, u16 d, u8 s);
330 #pragma aux rcr_word_asm = \ 335 "pop [edi]" parm[edi][ax][cl] value[ax] modify exact[ax cl]; 337 u32 rcr_long_asm(u32 *flags, u32 d, u8 s);
338 #pragma aux rcr_long_asm = \ 343 "pop [edi]" parm[edi][eax][cl] value[eax] modify exact[eax cl]; 345 u8 rol_byte_asm(u32 *flags, u8 d, u8 s);
346 #pragma aux rol_byte_asm = \ 351 "pop [edi]" parm[edi][al][cl] value[al] modify exact[al cl]; 353 u16 rol_word_asm(u32 *flags, u16 d, u8 s);
354 #pragma aux rol_word_asm = \ 359 "pop [edi]" parm[edi][ax][cl] value[ax] modify exact[ax cl]; 361 u32 rol_long_asm(u32 *flags, u32 d, u8 s);
362 #pragma aux rol_long_asm = \ 367 "pop [edi]" parm[edi][eax][cl] value[eax] modify exact[eax cl]; 369 u8 ror_byte_asm(u32 *flags, u8 d, u8 s);
370 #pragma aux ror_byte_asm = \ 375 "pop [edi]" parm[edi][al][cl] value[al] modify exact[al cl]; 377 u16 ror_word_asm(u32 *flags, u16 d, u8 s);
378 #pragma aux ror_word_asm = \ 383 "pop [edi]" parm[edi][ax][cl] value[ax] modify exact[ax cl]; 385 u32 ror_long_asm(u32 *flags, u32 d, u8 s);
386 #pragma aux ror_long_asm = \ 391 "pop [edi]" parm[edi][eax][cl] value[eax] modify exact[eax cl]; 393 u8 shl_byte_asm(u32 *flags, u8 d, u8 s);
394 #pragma aux shl_byte_asm = \ 399 "pop [edi]" parm[edi][al][cl] value[al] modify exact[al cl]; 401 u16 shl_word_asm(u32 *flags, u16 d, u8 s);
402 #pragma aux shl_word_asm = \ 407 "pop [edi]" parm[edi][ax][cl] value[ax] modify exact[ax cl]; 409 u32 shl_long_asm(u32 *flags, u32 d, u8 s);
410 #pragma aux shl_long_asm = \ 415 "pop [edi]" parm[edi][eax][cl] value[eax] modify exact[eax cl]; 417 u8 shr_byte_asm(u32 *flags, u8 d, u8 s);
418 #pragma aux shr_byte_asm = \ 423 "pop [edi]" parm[edi][al][cl] value[al] modify exact[al cl]; 425 u16 shr_word_asm(u32 *flags, u16 d, u8 s);
426 #pragma aux shr_word_asm = \ 431 "pop [edi]" parm[edi][ax][cl] value[ax] modify exact[ax cl]; 433 u32 shr_long_asm(u32 *flags, u32 d, u8 s);
434 #pragma aux shr_long_asm = \ 439 "pop [edi]" parm[edi][eax][cl] value[eax] modify exact[eax cl]; 441 u8 sar_byte_asm(u32 *flags, u8 d, u8 s);
442 #pragma aux sar_byte_asm = \ 447 "pop [edi]" parm[edi][al][cl] value[al] modify exact[al cl]; 449 u16 sar_word_asm(u32 *flags, u16 d, u8 s);
450 #pragma aux sar_word_asm = \ 455 "pop [edi]" parm[edi][ax][cl] value[ax] modify exact[ax cl]; 457 u32 sar_long_asm(u32 *flags, u32 d, u8 s);
458 #pragma aux sar_long_asm = \ 463 "pop [edi]" parm[edi][eax][cl] value[eax] modify exact[eax cl]; 465 u16 shld_word_asm(u32 *flags, u16 d, u16 fill, u8 s);
466 #pragma aux shld_word_asm = \ 471 "pop [edi]" parm[edi][ax][dx][cl] value[ax] modify exact[ax dx cl]; 473 u32 shld_long_asm(u32 *flags, u32 d, u32 fill, u8 s);
474 #pragma aux shld_long_asm = "push [edi]" \ 478 "pop [edi]" parm[edi][eax][edx] \ 479 [cl] value[eax] modify exact[eax edx cl]; 481 u16 shrd_word_asm(u32 *flags, u16 d, u16 fill, u8 s);
482 #pragma aux shrd_word_asm = \ 487 "pop [edi]" parm[edi][ax][dx][cl] value[ax] modify exact[ax dx cl]; 489 u32 shrd_long_asm(u32 *flags, u32 d, u32 fill, u8 s);
490 #pragma aux shrd_long_asm = "push [edi]" \ 494 "pop [edi]" parm[edi][eax][edx] \ 495 [cl] value[eax] modify exact[eax edx cl]; 497 u8 sbb_byte_asm(u32 *flags, u8 d, u8 s);
498 #pragma aux sbb_byte_asm = \ 503 "pop [edi]" parm[edi][al][bl] value[al] modify exact[al bl]; 505 u16 sbb_word_asm(u32 *flags, u16 d, u16 s);
506 #pragma aux sbb_word_asm = \ 511 "pop [edi]" parm[edi][ax][bx] value[ax] modify exact[ax bx]; 513 u32 sbb_long_asm(u32 *flags, u32 d, u32 s);
514 #pragma aux sbb_long_asm = \ 519 "pop [edi]" parm[edi][eax][ebx] value[eax] modify exact[eax ebx]; 521 u8 sub_byte_asm(u32 *flags, u8 d, u8 s);
522 #pragma aux sub_byte_asm = \ 527 "pop [edi]" parm[edi][al][bl] value[al] modify exact[al bl]; 529 u16 sub_word_asm(u32 *flags, u16 d, u16 s);
530 #pragma aux sub_word_asm = \ 535 "pop [edi]" parm[edi][ax][bx] value[ax] modify exact[ax bx]; 537 u32 sub_long_asm(u32 *flags, u32 d, u32 s);
538 #pragma aux sub_long_asm = \ 543 "pop [edi]" parm[edi][eax][ebx] value[eax] modify exact[eax ebx]; 545 void test_byte_asm(u32 *flags, u8 d, u8 s);
546 #pragma aux test_byte_asm = \ 551 "pop [edi]" parm[edi][al][bl] modify exact[al bl]; 553 void test_word_asm(u32 *flags, u16 d, u16 s);
554 #pragma aux test_word_asm = \ 559 "pop [edi]" parm[edi][ax][bx] modify exact[ax bx]; 561 void test_long_asm(u32 *flags, u32 d, u32 s);
562 #pragma aux test_long_asm = \ 567 "pop [edi]" parm[edi][eax][ebx] modify exact[eax ebx]; 569 u8 xor_byte_asm(u32 *flags, u8 d, u8 s);
570 #pragma aux xor_byte_asm = \ 575 "pop [edi]" parm[edi][al][bl] value[al] modify exact[al bl]; 577 u16 xor_word_asm(u32 *flags, u16 d, u16 s);
578 #pragma aux xor_word_asm = \ 583 "pop [edi]" parm[edi][ax][bx] value[ax] modify exact[ax bx]; 585 u32 xor_long_asm(u32 *flags, u32 d, u32 s);
586 #pragma aux xor_long_asm = \ 591 "pop [edi]" parm[edi][eax][ebx] value[eax] modify exact[eax ebx]; 593 void imul_byte_asm(u32 *flags, u16 *ax, u8 d, u8 s);
594 #pragma aux imul_byte_asm = \ 600 "mov [esi],ax" parm[edi][esi][al][bl] modify exact[esi ax bl]; 602 void imul_word_asm(u32 *flags, u16 *ax, u16 *dx, u16 d, u16 s);
603 #pragma aux imul_word_asm = \ 610 "mov [ecx],dx" parm[edi][esi][ecx][ax][bx] modify exact[esi edi ax \ 613 void imul_long_asm(u32 *flags, u32 *eax, u32 *edx, u32 d, u32 s);
614 #pragma aux imul_long_asm = "push [edi]" \ 620 "mov [ecx],edx" parm[edi][esi][ecx][eax] \ 621 [ebx] modify exact[esi edi eax ebx edx]; 623 void mul_byte_asm(u32 *flags, u16 *ax, u8 d, u8 s);
624 #pragma aux mul_byte_asm = \ 630 "mov [esi],ax" parm[edi][esi][al][bl] modify exact[esi ax bl]; 632 void mul_word_asm(u32 *flags, u16 *ax, u16 *dx, u16 d, u16 s);
633 #pragma aux mul_word_asm = \ 640 "mov [ecx],dx" parm[edi][esi][ecx][ax][bx] modify exact[esi edi ax \ 643 void mul_long_asm(u32 *flags, u32 *eax, u32 *edx, u32 d, u32 s);
644 #pragma aux mul_long_asm = \ 651 "mov [ecx],edx" parm[edi][esi][ecx][eax][ebx] modify exact[esi edi eax ebx \ 654 void idiv_byte_asm(u32 *flags, u8 *al, u8 *ah, u16 d, u8 s);
655 #pragma aux idiv_byte_asm = \ 662 "mov [ecx],ah" parm[edi][esi][ecx][ax][bl] modify exact[esi edi ax \ 665 void idiv_word_asm(u32 *flags, u16 *ax, u16 *dx, u16 dlo, u16 dhi, u16 s);
666 #pragma aux idiv_word_asm = "push [edi]" \ 672 "mov [ecx],dx" parm[edi][esi][ecx][ax][dx] \ 673 [bx] modify exact[esi edi ax dx bx]; 675 void idiv_long_asm(u32 *flags, u32 *eax, u32 *edx, u32 dlo, u32 dhi, u32 s);
676 #pragma aux idiv_long_asm = "push [edi]" \ 682 "mov [ecx],edx" parm[edi][esi][ecx][eax] \ 683 [edx][ebx] modify exact[esi edi eax edx ebx]; 685 void div_byte_asm(u32 *flags, u8 *al, u8 *ah, u16 d, u8 s);
686 #pragma aux div_byte_asm = \ 693 "mov [ecx],ah" parm[edi][esi][ecx][ax][bl] modify exact[esi edi ax \ 696 void div_word_asm(u32 *flags, u16 *ax, u16 *dx, u16 dlo, u16 dhi, u16 s);
697 #pragma aux div_word_asm = "push [edi]" \ 703 "mov [ecx],dx" parm[edi][esi][ecx][ax][dx] \ 704 [bx] modify exact[esi edi ax dx bx]; 706 void div_long_asm(u32 *flags, u32 *eax, u32 *edx, u32 dlo, u32 dhi, u32 s);
707 #pragma aux div_long_asm = "push [edi]" \ 713 "mov [ecx],edx" parm[edi][esi][ecx][eax][edx] \ 714 [ebx] modify exact[esi edi eax edx ebx];