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