Changeset 827
- Timestamp:
- 12/29/10 05:32:48 (14 years ago)
- Files:
-
- branches/dmd-1.x/src/backend/cgen.c (modified) (1 diff)
- branches/dmd-1.x/src/iasm.c (modified) (1 diff)
- trunk/src/backend/cgen.c (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
branches/dmd-1.x/src/backend/cgen.c
r790 r827 796 796 } 797 797 r++; 798 798 } 799 799 800 800 if (value == 0 && !(flags & 8)) 801 801 { c = genclrreg(c,reg); // CLR reg 802 802 if (flags & 64) 803 803 code_orrex(c, REX_W); 804 804 } 805 805 else 806 806 { /* See if we can just load a byte */ 807 807 if (regm & BYTEREGS && 808 808 !(config.flags4 & CFG4speed && config.target_cpu >= TARGET_PentiumPro) 809 809 ) 810 810 { 811 811 if ((regv & 0xFFFFFF00) == (value & 0xFFFFFF00)) 812 812 { c = movregconst(c,reg,value,(flags & 8) |4|1); // load regL 813 813 return c; 814 814 } 815 815 if (regm & (mAX|mBX|mCX|mDX) && 816 (regv & ~(targ_size_t)0xFF00) == (value & ~(targ_size_t)0xFF00)) 816 (regv & ~(targ_size_t)0xFF00) == (value & ~(targ_size_t)0xFF00) && 817 !I64) 817 818 { c = movregconst(c,4|reg,value >> 8,(flags & 8) |4|1|16); // load regH 818 819 return c; 819 820 } 820 821 } 821 822 if (flags & 64) 822 823 c = genc2(c,0xC7,(REX_W << 16) | modregrmx(3,0,reg),value); // MOV reg,value64 823 824 else 824 825 c = genc2(c,0xC7,modregrmx(3,0,reg),value); // MOV reg,value 825 826 } 826 827 } 827 828 done: 828 829 regimmed_set(reg,value); 829 830 } 830 831 return c; 831 832 } 832 833 833 834 834 835 /********************************** 835 836 * Determine if one of the registers in regm has value in it. 836 837 * If so, return !=0 and set *preg to which register it is. branches/dmd-1.x/src/iasm.c
r771 r827 1313 1313 (uSizemaskTable1 & _32 && aoptyTable1 == _mnoi) || 1314 1314 (ptb.pptb1->usFlags & _16_bit_addr))) || 1315 1315 (I16 && 1316 1316 (amod1 == _addr32 || 1317 1317 (uSizemaskTable1 & _32 && aoptyTable1 == _rel) || 1318 1318 (uSizemaskTable1 & _48 && aoptyTable1 == _mnoi) || 1319 1319 (ptb.pptb1->usFlags & _32_bit_addr)))) 1320 1320 { 1321 1321 emit(0x67); // address size prefix 1322 1322 pc->Iflags |= CFaddrsize; 1323 1323 if (I32) 1324 1324 amod1 = _addr16; 1325 1325 else 1326 1326 amod1 = _addr32; 1327 1327 popnd1->usFlags &= ~CONSTRUCT_FLAGS(0,0,7,0); 1328 1328 popnd1->usFlags |= CONSTRUCT_FLAGS(0,0,amod1,0); 1329 1329 } 1330 1330 1331 1331 // If the size of the operand is unknown, assume that it is 1332 1332 // the default size 1333 if (( I32&& (ptb.pptb0->usFlags & _16_bit)) ||1333 if (((I64 || I32) && (ptb.pptb0->usFlags & _16_bit)) || 1334 1334 (I16 && (ptb.pptb0->usFlags & _32_bit))) 1335 1335 { 1336 1336 //if (asmstate.ucItype != ITjump) 1337 1337 { emit(0x66); 1338 1338 pc->Iflags |= CFopsize; 1339 1339 } 1340 1340 } 1341 1341 if (((pregSegment = (popndTmp = popnd1)->segreg) != NULL) || 1342 1342 ((popndTmp = popnd2) != NULL && 1343 1343 (pregSegment = popndTmp->segreg) != NULL) 1344 1344 ) 1345 1345 { 1346 1346 if ((popndTmp->pregDisp1 && 1347 1347 popndTmp->pregDisp1->val == _BP) || 1348 1348 popndTmp->pregDisp2 && 1349 1349 popndTmp->pregDisp2->val == _BP) 1350 1350 usDefaultseg = _SS; 1351 1351 else 1352 1352 usDefaultseg = _DS; 1353 1353 if (pregSegment->val != usDefaultseg) trunk/src/backend/cgen.c
r790 r827 796 796 } 797 797 r++; 798 798 } 799 799 800 800 if (value == 0 && !(flags & 8)) 801 801 { c = genclrreg(c,reg); // CLR reg 802 802 if (flags & 64) 803 803 code_orrex(c, REX_W); 804 804 } 805 805 else 806 806 { /* See if we can just load a byte */ 807 807 if (regm & BYTEREGS && 808 808 !(config.flags4 & CFG4speed && config.target_cpu >= TARGET_PentiumPro) 809 809 ) 810 810 { 811 811 if ((regv & 0xFFFFFF00) == (value & 0xFFFFFF00)) 812 812 { c = movregconst(c,reg,value,(flags & 8) |4|1); // load regL 813 813 return c; 814 814 } 815 815 if (regm & (mAX|mBX|mCX|mDX) && 816 (regv & ~(targ_size_t)0xFF00) == (value & ~(targ_size_t)0xFF00)) 816 (regv & ~(targ_size_t)0xFF00) == (value & ~(targ_size_t)0xFF00) && 817 !I64) 817 818 { c = movregconst(c,4|reg,value >> 8,(flags & 8) |4|1|16); // load regH 818 819 return c; 819 820 } 820 821 } 821 822 if (flags & 64) 822 823 c = genc2(c,0xC7,(REX_W << 16) | modregrmx(3,0,reg),value); // MOV reg,value64 823 824 else 824 825 c = genc2(c,0xC7,modregrmx(3,0,reg),value); // MOV reg,value 825 826 } 826 827 } 827 828 done: 828 829 regimmed_set(reg,value); 829 830 } 830 831 return c; 831 832 } 832 833 833 834 834 835 /********************************** 835 836 * Determine if one of the registers in regm has value in it. 836 837 * If so, return !=0 and set *preg to which register it is.
