Changeset 831
- Timestamp:
- 01/01/11 04:20:07 (14 years ago)
- Files:
-
- branches/dmd-1.x/src/backend/cod2.c (modified) (1 diff)
- trunk/src/backend/cod2.c (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
branches/dmd-1.x/src/backend/cod2.c
r828 r831 643 643 } 644 644 } 645 645 rval = reghasvalue(byte ? BYTEREGS : ALLREGS,i,&rreg); 646 646 cs.IEV2.Vint = i; 647 647 L3: 648 648 op1 ^= byte; 649 649 cs.Iflags |= word; 650 650 if (rval) 651 651 { cs.Iop = op1 ^ 2; 652 652 mode = rreg; 653 653 } 654 654 else 655 655 cs.Iop = 0x81; 656 656 cs.Irm = modregrm(3,mode&7,reg&7); 657 657 if (mode & 8) 658 658 cs.Irex |= REX_R; 659 659 if (reg & 8) 660 660 cs.Irex |= REX_B; 661 661 if (I64 && sz == 8) 662 662 cs.Irex |= REX_W; 663 if (I64 && byte && reg >= 4)663 if (I64 && byte && (reg >= 4 || (rval && rreg >= 4))) 664 664 cs.Irex |= REX; 665 665 cs.IFL2 = (e2->Eoper == OPconst) ? FLconst : el_fl(e2); 666 666 /* Modify instruction for special cases */ 667 667 switch (e->Eoper) 668 668 { case OPadd: 669 669 { int iop; 670 670 671 671 if (i == 1) 672 672 iop = 0; /* INC reg */ 673 673 else if (i == -1) 674 674 iop = 8; /* DEC reg */ 675 675 else 676 676 break; 677 677 cs.Iop = (0x40 | iop | reg) ^ byte; 678 678 if ((byte && *pretregs & mPSW) || I64) 679 679 { cs.Irm = modregrm(3,0,reg & 7) | iop; 680 680 cs.Iop = 0xFF; 681 681 } 682 682 break; 683 683 } trunk/src/backend/cod2.c
r828 r831 643 643 } 644 644 } 645 645 rval = reghasvalue(byte ? BYTEREGS : ALLREGS,i,&rreg); 646 646 cs.IEV2.Vint = i; 647 647 L3: 648 648 op1 ^= byte; 649 649 cs.Iflags |= word; 650 650 if (rval) 651 651 { cs.Iop = op1 ^ 2; 652 652 mode = rreg; 653 653 } 654 654 else 655 655 cs.Iop = 0x81; 656 656 cs.Irm = modregrm(3,mode&7,reg&7); 657 657 if (mode & 8) 658 658 cs.Irex |= REX_R; 659 659 if (reg & 8) 660 660 cs.Irex |= REX_B; 661 661 if (I64 && sz == 8) 662 662 cs.Irex |= REX_W; 663 if (I64 && byte && reg >= 4)663 if (I64 && byte && (reg >= 4 || (rval && rreg >= 4))) 664 664 cs.Irex |= REX; 665 665 cs.IFL2 = (e2->Eoper == OPconst) ? FLconst : el_fl(e2); 666 666 /* Modify instruction for special cases */ 667 667 switch (e->Eoper) 668 668 { case OPadd: 669 669 { int iop; 670 670 671 671 if (i == 1) 672 672 iop = 0; /* INC reg */ 673 673 else if (i == -1) 674 674 iop = 8; /* DEC reg */ 675 675 else 676 676 break; 677 677 cs.Iop = (0x40 | iop | reg) ^ byte; 678 678 if ((byte && *pretregs & mPSW) || I64) 679 679 { cs.Irm = modregrm(3,0,reg & 7) | iop; 680 680 cs.Iop = 0xFF; 681 681 } 682 682 break; 683 683 }
