1 /**************************************************************************** 2 * 3 * Realmode X86 Emulator Library 4 * 5 * Copyright (C) 1996-1999 SciTech Software, Inc. 6 * Copyright (C) David Mosberger-Tang 7 * Copyright (C) 1999 Egbert Eich 8 * 9 * ======================================================================== 10 * 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. 20 * 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. 28 * 29 * ======================================================================== 30 * 31 * Language: Watcom C++ 10.6 or later 32 * Environment: Any 33 * Developer: Kendall Bennett 34 * 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 39 * platform. 40 * 41 ****************************************************************************/ 42 43 #ifndef __X86EMU_PRIM_ASM_H 44 #define __X86EMU_PRIM_ASM_H 45 46 #ifdef __WATCOMC__ 47 48 #ifndef VALIDATE 49 #define __HAVE_INLINE_ASSEMBLER__ 50 #endif 51 52 u32 get_flags_asm(void); 53 #pragma aux get_flags_asm = \ 54 "pushf" \ 55 "pop eax" \ 56 value [eax] \ 57 modify exact [eax]; 58 59 u16 aaa_word_asm(u32 *flags,u16 d); 60 #pragma aux aaa_word_asm = \ 61 "push [edi]" \ 62 "popf" \ 63 "aaa" \ 64 "pushf" \ 65 "pop [edi]" \ 66 parm [edi] [ax] \ 67 value [ax] \ 68 modify exact [ax]; 69 70 u16 aas_word_asm(u32 *flags,u16 d); 71 #pragma aux aas_word_asm = \ 72 "push [edi]" \ 73 "popf" \ 74 "aas" \ 75 "pushf" \ 76 "pop [edi]" \ 77 parm [edi] [ax] \ 78 value [ax] \ 79 modify exact [ax]; 80 81 u16 aad_word_asm(u32 *flags,u16 d); 82 #pragma aux aad_word_asm = \ 83 "push [edi]" \ 84 "popf" \ 85 "aad" \ 86 "pushf" \ 87 "pop [edi]" \ 88 parm [edi] [ax] \ 89 value [ax] \ 90 modify exact [ax]; 91 92 u16 aam_word_asm(u32 *flags,u8 d); 93 #pragma aux aam_word_asm = \ 94 "push [edi]" \ 95 "popf" \ 96 "aam" \ 97 "pushf" \ 98 "pop [edi]" \ 99 parm [edi] [al] \ 100 value [ax] \ 101 modify exact [ax]; 102 103 u8 adc_byte_asm(u32 *flags,u8 d, u8 s); 104 #pragma aux adc_byte_asm = \ 105 "push [edi]" \ 106 "popf" \ 107 "adc al,bl" \ 108 "pushf" \ 109 "pop [edi]" \ 110 parm [edi] [al] [bl] \ 111 value [al] \ 112 modify exact [al bl]; 113 114 u16 adc_word_asm(u32 *flags,u16 d, u16 s); 115 #pragma aux adc_word_asm = \ 116 "push [edi]" \ 117 "popf" \ 118 "adc ax,bx" \ 119 "pushf" \ 120 "pop [edi]" \ 121 parm [edi] [ax] [bx] \ 122 value [ax] \ 123 modify exact [ax bx]; 124 125 u32 adc_long_asm(u32 *flags,u32 d, u32 s); 126 #pragma aux adc_long_asm = \ 127 "push [edi]" \ 128 "popf" \ 129 "adc eax,ebx" \ 130 "pushf" \ 131 "pop [edi]" \ 132 parm [edi] [eax] [ebx] \ 133 value [eax] \ 134 modify exact [eax ebx]; 135 136 u8 add_byte_asm(u32 *flags,u8 d, u8 s); 137 #pragma aux add_byte_asm = \ 138 "push [edi]" \ 139 "popf" \ 140 "add al,bl" \ 141 "pushf" \ 142 "pop [edi]" \ 143 parm [edi] [al] [bl] \ 144 value [al] \ 145 modify exact [al bl]; 146 147 u16 add_word_asm(u32 *flags,u16 d, u16 s); 148 #pragma aux add_word_asm = \ 149 "push [edi]" \ 150 "popf" \ 151 "add ax,bx" \ 152 "pushf" \ 153 "pop [edi]" \ 154 parm [edi] [ax] [bx] \ 155 value [ax] \ 156 modify exact [ax bx]; 157 158 u32 add_long_asm(u32 *flags,u32 d, u32 s); 159 #pragma aux add_long_asm = \ 160 "push [edi]" \ 161 "popf" \ 162 "add eax,ebx" \ 163 "pushf" \ 164 "pop [edi]" \ 165 parm [edi] [eax] [ebx] \ 166 value [eax] \ 167 modify exact [eax ebx]; 168 169 u8 and_byte_asm(u32 *flags,u8 d, u8 s); 170 #pragma aux and_byte_asm = \ 171 "push [edi]" \ 172 "popf" \ 173 "and al,bl" \ 174 "pushf" \ 175 "pop [edi]" \ 176 parm [edi] [al] [bl] \ 177 value [al] \ 178 modify exact [al bl]; 179 180 u16 and_word_asm(u32 *flags,u16 d, u16 s); 181 #pragma aux and_word_asm = \ 182 "push [edi]" \ 183 "popf" \ 184 "and ax,bx" \ 185 "pushf" \ 186 "pop [edi]" \ 187 parm [edi] [ax] [bx] \ 188 value [ax] \ 189 modify exact [ax bx]; 190 191 u32 and_long_asm(u32 *flags,u32 d, u32 s); 192 #pragma aux and_long_asm = \ 193 "push [edi]" \ 194 "popf" \ 195 "and eax,ebx" \ 196 "pushf" \ 197 "pop [edi]" \ 198 parm [edi] [eax] [ebx] \ 199 value [eax] \ 200 modify exact [eax ebx]; 201 202 u8 cmp_byte_asm(u32 *flags,u8 d, u8 s); 203 #pragma aux cmp_byte_asm = \ 204 "push [edi]" \ 205 "popf" \ 206 "cmp al,bl" \ 207 "pushf" \ 208 "pop [edi]" \ 209 parm [edi] [al] [bl] \ 210 value [al] \ 211 modify exact [al bl]; 212 213 u16 cmp_word_asm(u32 *flags,u16 d, u16 s); 214 #pragma aux cmp_word_asm = \ 215 "push [edi]" \ 216 "popf" \ 217 "cmp ax,bx" \ 218 "pushf" \ 219 "pop [edi]" \ 220 parm [edi] [ax] [bx] \ 221 value [ax] \ 222 modify exact [ax bx]; 223 224 u32 cmp_long_asm(u32 *flags,u32 d, u32 s); 225 #pragma aux cmp_long_asm = \ 226 "push [edi]" \ 227 "popf" \ 228 "cmp eax,ebx" \ 229 "pushf" \ 230 "pop [edi]" \ 231 parm [edi] [eax] [ebx] \ 232 value [eax] \ 233 modify exact [eax ebx]; 234 235 u8 daa_byte_asm(u32 *flags,u8 d); 236 #pragma aux daa_byte_asm = \ 237 "push [edi]" \ 238 "popf" \ 239 "daa" \ 240 "pushf" \ 241 "pop [edi]" \ 242 parm [edi] [al] \ 243 value [al] \ 244 modify exact [al]; 245 246 u8 das_byte_asm(u32 *flags,u8 d); 247 #pragma aux das_byte_asm = \ 248 "push [edi]" \ 249 "popf" \ 250 "das" \ 251 "pushf" \ 252 "pop [edi]" \ 253 parm [edi] [al] \ 254 value [al] \ 255 modify exact [al]; 256 257 u8 dec_byte_asm(u32 *flags,u8 d); 258 #pragma aux dec_byte_asm = \ 259 "push [edi]" \ 260 "popf" \ 261 "dec al" \ 262 "pushf" \ 263 "pop [edi]" \ 264 parm [edi] [al] \ 265 value [al] \ 266 modify exact [al]; 267 268 u16 dec_word_asm(u32 *flags,u16 d); 269 #pragma aux dec_word_asm = \ 270 "push [edi]" \ 271 "popf" \ 272 "dec ax" \ 273 "pushf" \ 274 "pop [edi]" \ 275 parm [edi] [ax] \ 276 value [ax] \ 277 modify exact [ax]; 278 279 u32 dec_long_asm(u32 *flags,u32 d); 280 #pragma aux dec_long_asm = \ 281 "push [edi]" \ 282 "popf" \ 283 "dec eax" \ 284 "pushf" \ 285 "pop [edi]" \ 286 parm [edi] [eax] \ 287 value [eax] \ 288 modify exact [eax]; 289 290 u8 inc_byte_asm(u32 *flags,u8 d); 291 #pragma aux inc_byte_asm = \ 292 "push [edi]" \ 293 "popf" \ 294 "inc al" \ 295 "pushf" \ 296 "pop [edi]" \ 297 parm [edi] [al] \ 298 value [al] \ 299 modify exact [al]; 300 301 u16 inc_word_asm(u32 *flags,u16 d); 302 #pragma aux inc_word_asm = \ 303 "push [edi]" \ 304 "popf" \ 305 "inc ax" \ 306 "pushf" \ 307 "pop [edi]" \ 308 parm [edi] [ax] \ 309 value [ax] \ 310 modify exact [ax]; 311 312 u32 inc_long_asm(u32 *flags,u32 d); 313 #pragma aux inc_long_asm = \ 314 "push [edi]" \ 315 "popf" \ 316 "inc eax" \ 317 "pushf" \ 318 "pop [edi]" \ 319 parm [edi] [eax] \ 320 value [eax] \ 321 modify exact [eax]; 322 323 u8 or_byte_asm(u32 *flags,u8 d, u8 s); 324 #pragma aux or_byte_asm = \ 325 "push [edi]" \ 326 "popf" \ 327 "or al,bl" \ 328 "pushf" \ 329 "pop [edi]" \ 330 parm [edi] [al] [bl] \ 331 value [al] \ 332 modify exact [al bl]; 333 334 u16 or_word_asm(u32 *flags,u16 d, u16 s); 335 #pragma aux or_word_asm = \ 336 "push [edi]" \ 337 "popf" \ 338 "or ax,bx" \ 339 "pushf" \ 340 "pop [edi]" \ 341 parm [edi] [ax] [bx] \ 342 value [ax] \ 343 modify exact [ax bx]; 344 345 u32 or_long_asm(u32 *flags,u32 d, u32 s); 346 #pragma aux or_long_asm = \ 347 "push [edi]" \ 348 "popf" \ 349 "or eax,ebx" \ 350 "pushf" \ 351 "pop [edi]" \ 352 parm [edi] [eax] [ebx] \ 353 value [eax] \ 354 modify exact [eax ebx]; 355 356 u8 neg_byte_asm(u32 *flags,u8 d); 357 #pragma aux neg_byte_asm = \ 358 "push [edi]" \ 359 "popf" \ 360 "neg al" \ 361 "pushf" \ 362 "pop [edi]" \ 363 parm [edi] [al] \ 364 value [al] \ 365 modify exact [al]; 366 367 u16 neg_word_asm(u32 *flags,u16 d); 368 #pragma aux neg_word_asm = \ 369 "push [edi]" \ 370 "popf" \ 371 "neg ax" \ 372 "pushf" \ 373 "pop [edi]" \ 374 parm [edi] [ax] \ 375 value [ax] \ 376 modify exact [ax]; 377 378 u32 neg_long_asm(u32 *flags,u32 d); 379 #pragma aux neg_long_asm = \ 380 "push [edi]" \ 381 "popf" \ 382 "neg eax" \ 383 "pushf" \ 384 "pop [edi]" \ 385 parm [edi] [eax] \ 386 value [eax] \ 387 modify exact [eax]; 388 389 u8 not_byte_asm(u32 *flags,u8 d); 390 #pragma aux not_byte_asm = \ 391 "push [edi]" \ 392 "popf" \ 393 "not al" \ 394 "pushf" \ 395 "pop [edi]" \ 396 parm [edi] [al] \ 397 value [al] \ 398 modify exact [al]; 399 400 u16 not_word_asm(u32 *flags,u16 d); 401 #pragma aux not_word_asm = \ 402 "push [edi]" \ 403 "popf" \ 404 "not ax" \ 405 "pushf" \ 406 "pop [edi]" \ 407 parm [edi] [ax] \ 408 value [ax] \ 409 modify exact [ax]; 410 411 u32 not_long_asm(u32 *flags,u32 d); 412 #pragma aux not_long_asm = \ 413 "push [edi]" \ 414 "popf" \ 415 "not eax" \ 416 "pushf" \ 417 "pop [edi]" \ 418 parm [edi] [eax] \ 419 value [eax] \ 420 modify exact [eax]; 421 422 u8 rcl_byte_asm(u32 *flags,u8 d, u8 s); 423 #pragma aux rcl_byte_asm = \ 424 "push [edi]" \ 425 "popf" \ 426 "rcl al,cl" \ 427 "pushf" \ 428 "pop [edi]" \ 429 parm [edi] [al] [cl] \ 430 value [al] \ 431 modify exact [al cl]; 432 433 u16 rcl_word_asm(u32 *flags,u16 d, u8 s); 434 #pragma aux rcl_word_asm = \ 435 "push [edi]" \ 436 "popf" \ 437 "rcl ax,cl" \ 438 "pushf" \ 439 "pop [edi]" \ 440 parm [edi] [ax] [cl] \ 441 value [ax] \ 442 modify exact [ax cl]; 443 444 u32 rcl_long_asm(u32 *flags,u32 d, u8 s); 445 #pragma aux rcl_long_asm = \ 446 "push [edi]" \ 447 "popf" \ 448 "rcl eax,cl" \ 449 "pushf" \ 450 "pop [edi]" \ 451 parm [edi] [eax] [cl] \ 452 value [eax] \ 453 modify exact [eax cl]; 454 455 u8 rcr_byte_asm(u32 *flags,u8 d, u8 s); 456 #pragma aux rcr_byte_asm = \ 457 "push [edi]" \ 458 "popf" \ 459 "rcr al,cl" \ 460 "pushf" \ 461 "pop [edi]" \ 462 parm [edi] [al] [cl] \ 463 value [al] \ 464 modify exact [al cl]; 465 466 u16 rcr_word_asm(u32 *flags,u16 d, u8 s); 467 #pragma aux rcr_word_asm = \ 468 "push [edi]" \ 469 "popf" \ 470 "rcr ax,cl" \ 471 "pushf" \ 472 "pop [edi]" \ 473 parm [edi] [ax] [cl] \ 474 value [ax] \ 475 modify exact [ax cl]; 476 477 u32 rcr_long_asm(u32 *flags,u32 d, u8 s); 478 #pragma aux rcr_long_asm = \ 479 "push [edi]" \ 480 "popf" \ 481 "rcr eax,cl" \ 482 "pushf" \ 483 "pop [edi]" \ 484 parm [edi] [eax] [cl] \ 485 value [eax] \ 486 modify exact [eax cl]; 487 488 u8 rol_byte_asm(u32 *flags,u8 d, u8 s); 489 #pragma aux rol_byte_asm = \ 490 "push [edi]" \ 491 "popf" \ 492 "rol al,cl" \ 493 "pushf" \ 494 "pop [edi]" \ 495 parm [edi] [al] [cl] \ 496 value [al] \ 497 modify exact [al cl]; 498 499 u16 rol_word_asm(u32 *flags,u16 d, u8 s); 500 #pragma aux rol_word_asm = \ 501 "push [edi]" \ 502 "popf" \ 503 "rol ax,cl" \ 504 "pushf" \ 505 "pop [edi]" \ 506 parm [edi] [ax] [cl] \ 507 value [ax] \ 508 modify exact [ax cl]; 509 510 u32 rol_long_asm(u32 *flags,u32 d, u8 s); 511 #pragma aux rol_long_asm = \ 512 "push [edi]" \ 513 "popf" \ 514 "rol eax,cl" \ 515 "pushf" \ 516 "pop [edi]" \ 517 parm [edi] [eax] [cl] \ 518 value [eax] \ 519 modify exact [eax cl]; 520 521 u8 ror_byte_asm(u32 *flags,u8 d, u8 s); 522 #pragma aux ror_byte_asm = \ 523 "push [edi]" \ 524 "popf" \ 525 "ror al,cl" \ 526 "pushf" \ 527 "pop [edi]" \ 528 parm [edi] [al] [cl] \ 529 value [al] \ 530 modify exact [al cl]; 531 532 u16 ror_word_asm(u32 *flags,u16 d, u8 s); 533 #pragma aux ror_word_asm = \ 534 "push [edi]" \ 535 "popf" \ 536 "ror ax,cl" \ 537 "pushf" \ 538 "pop [edi]" \ 539 parm [edi] [ax] [cl] \ 540 value [ax] \ 541 modify exact [ax cl]; 542 543 u32 ror_long_asm(u32 *flags,u32 d, u8 s); 544 #pragma aux ror_long_asm = \ 545 "push [edi]" \ 546 "popf" \ 547 "ror eax,cl" \ 548 "pushf" \ 549 "pop [edi]" \ 550 parm [edi] [eax] [cl] \ 551 value [eax] \ 552 modify exact [eax cl]; 553 554 u8 shl_byte_asm(u32 *flags,u8 d, u8 s); 555 #pragma aux shl_byte_asm = \ 556 "push [edi]" \ 557 "popf" \ 558 "shl al,cl" \ 559 "pushf" \ 560 "pop [edi]" \ 561 parm [edi] [al] [cl] \ 562 value [al] \ 563 modify exact [al cl]; 564 565 u16 shl_word_asm(u32 *flags,u16 d, u8 s); 566 #pragma aux shl_word_asm = \ 567 "push [edi]" \ 568 "popf" \ 569 "shl ax,cl" \ 570 "pushf" \ 571 "pop [edi]" \ 572 parm [edi] [ax] [cl] \ 573 value [ax] \ 574 modify exact [ax cl]; 575 576 u32 shl_long_asm(u32 *flags,u32 d, u8 s); 577 #pragma aux shl_long_asm = \ 578 "push [edi]" \ 579 "popf" \ 580 "shl eax,cl" \ 581 "pushf" \ 582 "pop [edi]" \ 583 parm [edi] [eax] [cl] \ 584 value [eax] \ 585 modify exact [eax cl]; 586 587 u8 shr_byte_asm(u32 *flags,u8 d, u8 s); 588 #pragma aux shr_byte_asm = \ 589 "push [edi]" \ 590 "popf" \ 591 "shr al,cl" \ 592 "pushf" \ 593 "pop [edi]" \ 594 parm [edi] [al] [cl] \ 595 value [al] \ 596 modify exact [al cl]; 597 598 u16 shr_word_asm(u32 *flags,u16 d, u8 s); 599 #pragma aux shr_word_asm = \ 600 "push [edi]" \ 601 "popf" \ 602 "shr ax,cl" \ 603 "pushf" \ 604 "pop [edi]" \ 605 parm [edi] [ax] [cl] \ 606 value [ax] \ 607 modify exact [ax cl]; 608 609 u32 shr_long_asm(u32 *flags,u32 d, u8 s); 610 #pragma aux shr_long_asm = \ 611 "push [edi]" \ 612 "popf" \ 613 "shr eax,cl" \ 614 "pushf" \ 615 "pop [edi]" \ 616 parm [edi] [eax] [cl] \ 617 value [eax] \ 618 modify exact [eax cl]; 619 620 u8 sar_byte_asm(u32 *flags,u8 d, u8 s); 621 #pragma aux sar_byte_asm = \ 622 "push [edi]" \ 623 "popf" \ 624 "sar al,cl" \ 625 "pushf" \ 626 "pop [edi]" \ 627 parm [edi] [al] [cl] \ 628 value [al] \ 629 modify exact [al cl]; 630 631 u16 sar_word_asm(u32 *flags,u16 d, u8 s); 632 #pragma aux sar_word_asm = \ 633 "push [edi]" \ 634 "popf" \ 635 "sar ax,cl" \ 636 "pushf" \ 637 "pop [edi]" \ 638 parm [edi] [ax] [cl] \ 639 value [ax] \ 640 modify exact [ax cl]; 641 642 u32 sar_long_asm(u32 *flags,u32 d, u8 s); 643 #pragma aux sar_long_asm = \ 644 "push [edi]" \ 645 "popf" \ 646 "sar eax,cl" \ 647 "pushf" \ 648 "pop [edi]" \ 649 parm [edi] [eax] [cl] \ 650 value [eax] \ 651 modify exact [eax cl]; 652 653 u16 shld_word_asm(u32 *flags,u16 d, u16 fill, u8 s); 654 #pragma aux shld_word_asm = \ 655 "push [edi]" \ 656 "popf" \ 657 "shld ax,dx,cl" \ 658 "pushf" \ 659 "pop [edi]" \ 660 parm [edi] [ax] [dx] [cl] \ 661 value [ax] \ 662 modify exact [ax dx cl]; 663 664 u32 shld_long_asm(u32 *flags,u32 d, u32 fill, u8 s); 665 #pragma aux shld_long_asm = \ 666 "push [edi]" \ 667 "popf" \ 668 "shld eax,edx,cl" \ 669 "pushf" \ 670 "pop [edi]" \ 671 parm [edi] [eax] [edx] [cl] \ 672 value [eax] \ 673 modify exact [eax edx cl]; 674 675 u16 shrd_word_asm(u32 *flags,u16 d, u16 fill, u8 s); 676 #pragma aux shrd_word_asm = \ 677 "push [edi]" \ 678 "popf" \ 679 "shrd ax,dx,cl" \ 680 "pushf" \ 681 "pop [edi]" \ 682 parm [edi] [ax] [dx] [cl] \ 683 value [ax] \ 684 modify exact [ax dx cl]; 685 686 u32 shrd_long_asm(u32 *flags,u32 d, u32 fill, u8 s); 687 #pragma aux shrd_long_asm = \ 688 "push [edi]" \ 689 "popf" \ 690 "shrd eax,edx,cl" \ 691 "pushf" \ 692 "pop [edi]" \ 693 parm [edi] [eax] [edx] [cl] \ 694 value [eax] \ 695 modify exact [eax edx cl]; 696 697 u8 sbb_byte_asm(u32 *flags,u8 d, u8 s); 698 #pragma aux sbb_byte_asm = \ 699 "push [edi]" \ 700 "popf" \ 701 "sbb al,bl" \ 702 "pushf" \ 703 "pop [edi]" \ 704 parm [edi] [al] [bl] \ 705 value [al] \ 706 modify exact [al bl]; 707 708 u16 sbb_word_asm(u32 *flags,u16 d, u16 s); 709 #pragma aux sbb_word_asm = \ 710 "push [edi]" \ 711 "popf" \ 712 "sbb ax,bx" \ 713 "pushf" \ 714 "pop [edi]" \ 715 parm [edi] [ax] [bx] \ 716 value [ax] \ 717 modify exact [ax bx]; 718 719 u32 sbb_long_asm(u32 *flags,u32 d, u32 s); 720 #pragma aux sbb_long_asm = \ 721 "push [edi]" \ 722 "popf" \ 723 "sbb eax,ebx" \ 724 "pushf" \ 725 "pop [edi]" \ 726 parm [edi] [eax] [ebx] \ 727 value [eax] \ 728 modify exact [eax ebx]; 729 730 u8 sub_byte_asm(u32 *flags,u8 d, u8 s); 731 #pragma aux sub_byte_asm = \ 732 "push [edi]" \ 733 "popf" \ 734 "sub al,bl" \ 735 "pushf" \ 736 "pop [edi]" \ 737 parm [edi] [al] [bl] \ 738 value [al] \ 739 modify exact [al bl]; 740 741 u16 sub_word_asm(u32 *flags,u16 d, u16 s); 742 #pragma aux sub_word_asm = \ 743 "push [edi]" \ 744 "popf" \ 745 "sub ax,bx" \ 746 "pushf" \ 747 "pop [edi]" \ 748 parm [edi] [ax] [bx] \ 749 value [ax] \ 750 modify exact [ax bx]; 751 752 u32 sub_long_asm(u32 *flags,u32 d, u32 s); 753 #pragma aux sub_long_asm = \ 754 "push [edi]" \ 755 "popf" \ 756 "sub eax,ebx" \ 757 "pushf" \ 758 "pop [edi]" \ 759 parm [edi] [eax] [ebx] \ 760 value [eax] \ 761 modify exact [eax ebx]; 762 763 void test_byte_asm(u32 *flags,u8 d, u8 s); 764 #pragma aux test_byte_asm = \ 765 "push [edi]" \ 766 "popf" \ 767 "test al,bl" \ 768 "pushf" \ 769 "pop [edi]" \ 770 parm [edi] [al] [bl] \ 771 modify exact [al bl]; 772 773 void test_word_asm(u32 *flags,u16 d, u16 s); 774 #pragma aux test_word_asm = \ 775 "push [edi]" \ 776 "popf" \ 777 "test ax,bx" \ 778 "pushf" \ 779 "pop [edi]" \ 780 parm [edi] [ax] [bx] \ 781 modify exact [ax bx]; 782 783 void test_long_asm(u32 *flags,u32 d, u32 s); 784 #pragma aux test_long_asm = \ 785 "push [edi]" \ 786 "popf" \ 787 "test eax,ebx" \ 788 "pushf" \ 789 "pop [edi]" \ 790 parm [edi] [eax] [ebx] \ 791 modify exact [eax ebx]; 792 793 u8 xor_byte_asm(u32 *flags,u8 d, u8 s); 794 #pragma aux xor_byte_asm = \ 795 "push [edi]" \ 796 "popf" \ 797 "xor al,bl" \ 798 "pushf" \ 799 "pop [edi]" \ 800 parm [edi] [al] [bl] \ 801 value [al] \ 802 modify exact [al bl]; 803 804 u16 xor_word_asm(u32 *flags,u16 d, u16 s); 805 #pragma aux xor_word_asm = \ 806 "push [edi]" \ 807 "popf" \ 808 "xor ax,bx" \ 809 "pushf" \ 810 "pop [edi]" \ 811 parm [edi] [ax] [bx] \ 812 value [ax] \ 813 modify exact [ax bx]; 814 815 u32 xor_long_asm(u32 *flags,u32 d, u32 s); 816 #pragma aux xor_long_asm = \ 817 "push [edi]" \ 818 "popf" \ 819 "xor eax,ebx" \ 820 "pushf" \ 821 "pop [edi]" \ 822 parm [edi] [eax] [ebx] \ 823 value [eax] \ 824 modify exact [eax ebx]; 825 826 void imul_byte_asm(u32 *flags,u16 *ax,u8 d,u8 s); 827 #pragma aux imul_byte_asm = \ 828 "push [edi]" \ 829 "popf" \ 830 "imul bl" \ 831 "pushf" \ 832 "pop [edi]" \ 833 "mov [esi],ax" \ 834 parm [edi] [esi] [al] [bl] \ 835 modify exact [esi ax bl]; 836 837 void imul_word_asm(u32 *flags,u16 *ax,u16 *dx,u16 d,u16 s); 838 #pragma aux imul_word_asm = \ 839 "push [edi]" \ 840 "popf" \ 841 "imul bx" \ 842 "pushf" \ 843 "pop [edi]" \ 844 "mov [esi],ax" \ 845 "mov [ecx],dx" \ 846 parm [edi] [esi] [ecx] [ax] [bx]\ 847 modify exact [esi edi ax bx dx]; 848 849 void imul_long_asm(u32 *flags,u32 *eax,u32 *edx,u32 d,u32 s); 850 #pragma aux imul_long_asm = \ 851 "push [edi]" \ 852 "popf" \ 853 "imul ebx" \ 854 "pushf" \ 855 "pop [edi]" \ 856 "mov [esi],eax" \ 857 "mov [ecx],edx" \ 858 parm [edi] [esi] [ecx] [eax] [ebx] \ 859 modify exact [esi edi eax ebx edx]; 860 861 void mul_byte_asm(u32 *flags,u16 *ax,u8 d,u8 s); 862 #pragma aux mul_byte_asm = \ 863 "push [edi]" \ 864 "popf" \ 865 "mul bl" \ 866 "pushf" \ 867 "pop [edi]" \ 868 "mov [esi],ax" \ 869 parm [edi] [esi] [al] [bl] \ 870 modify exact [esi ax bl]; 871 872 void mul_word_asm(u32 *flags,u16 *ax,u16 *dx,u16 d,u16 s); 873 #pragma aux mul_word_asm = \ 874 "push [edi]" \ 875 "popf" \ 876 "mul bx" \ 877 "pushf" \ 878 "pop [edi]" \ 879 "mov [esi],ax" \ 880 "mov [ecx],dx" \ 881 parm [edi] [esi] [ecx] [ax] [bx]\ 882 modify exact [esi edi ax bx dx]; 883 884 void mul_long_asm(u32 *flags,u32 *eax,u32 *edx,u32 d,u32 s); 885 #pragma aux mul_long_asm = \ 886 "push [edi]" \ 887 "popf" \ 888 "mul ebx" \ 889 "pushf" \ 890 "pop [edi]" \ 891 "mov [esi],eax" \ 892 "mov [ecx],edx" \ 893 parm [edi] [esi] [ecx] [eax] [ebx] \ 894 modify exact [esi edi eax ebx edx]; 895 896 void idiv_byte_asm(u32 *flags,u8 *al,u8 *ah,u16 d,u8 s); 897 #pragma aux idiv_byte_asm = \ 898 "push [edi]" \ 899 "popf" \ 900 "idiv bl" \ 901 "pushf" \ 902 "pop [edi]" \ 903 "mov [esi],al" \ 904 "mov [ecx],ah" \ 905 parm [edi] [esi] [ecx] [ax] [bl]\ 906 modify exact [esi edi ax bl]; 907 908 void idiv_word_asm(u32 *flags,u16 *ax,u16 *dx,u16 dlo,u16 dhi,u16 s); 909 #pragma aux idiv_word_asm = \ 910 "push [edi]" \ 911 "popf" \ 912 "idiv bx" \ 913 "pushf" \ 914 "pop [edi]" \ 915 "mov [esi],ax" \ 916 "mov [ecx],dx" \ 917 parm [edi] [esi] [ecx] [ax] [dx] [bx]\ 918 modify exact [esi edi ax dx bx]; 919 920 void idiv_long_asm(u32 *flags,u32 *eax,u32 *edx,u32 dlo,u32 dhi,u32 s); 921 #pragma aux idiv_long_asm = \ 922 "push [edi]" \ 923 "popf" \ 924 "idiv ebx" \ 925 "pushf" \ 926 "pop [edi]" \ 927 "mov [esi],eax" \ 928 "mov [ecx],edx" \ 929 parm [edi] [esi] [ecx] [eax] [edx] [ebx]\ 930 modify exact [esi edi eax edx ebx]; 931 932 void div_byte_asm(u32 *flags,u8 *al,u8 *ah,u16 d,u8 s); 933 #pragma aux div_byte_asm = \ 934 "push [edi]" \ 935 "popf" \ 936 "div bl" \ 937 "pushf" \ 938 "pop [edi]" \ 939 "mov [esi],al" \ 940 "mov [ecx],ah" \ 941 parm [edi] [esi] [ecx] [ax] [bl]\ 942 modify exact [esi edi ax bl]; 943 944 void div_word_asm(u32 *flags,u16 *ax,u16 *dx,u16 dlo,u16 dhi,u16 s); 945 #pragma aux div_word_asm = \ 946 "push [edi]" \ 947 "popf" \ 948 "div bx" \ 949 "pushf" \ 950 "pop [edi]" \ 951 "mov [esi],ax" \ 952 "mov [ecx],dx" \ 953 parm [edi] [esi] [ecx] [ax] [dx] [bx]\ 954 modify exact [esi edi ax dx bx]; 955 956 void div_long_asm(u32 *flags,u32 *eax,u32 *edx,u32 dlo,u32 dhi,u32 s); 957 #pragma aux div_long_asm = \ 958 "push [edi]" \ 959 "popf" \ 960 "div ebx" \ 961 "pushf" \ 962 "pop [edi]" \ 963 "mov [esi],eax" \ 964 "mov [ecx],edx" \ 965 parm [edi] [esi] [ecx] [eax] [edx] [ebx]\ 966 modify exact [esi edi eax edx ebx]; 967 968 #endif 969 970 #endif /* __X86EMU_PRIM_ASM_H */ 971