Changeset 813
- Timestamp:
- 12/23/10 06:50:12 (14 years ago)
- Files:
-
- trunk/src/backend/cod2.c (modified) (1 diff)
- trunk/src/backend/cod4.c (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/src/backend/cod2.c
r810 r813 1695 1695 1696 1696 if (op1 != OPcond && op1 != OPandand && op1 != OPoror && 1697 1697 op1 != OPnot && op1 != OPbool && 1698 1698 e21->Eoper == OPconst && 1699 1699 sz1 <= REGSIZE && 1700 1700 *pretregs & (mBP | ALLREGS) && 1701 1701 tysize(e21->Ety) <= REGSIZE && !tyfloating(e21->Ety)) 1702 1702 { // Recognize (e ? c : f) 1703 1703 unsigned reg; 1704 1704 regm_t retregs; 1705 1705 1706 1706 cnop1 = gennop(CNIL); 1707 1707 retregs = mPSW; 1708 1708 jop = jmpopcode(e1); // get jmp condition 1709 1709 c = codelem(e1,&retregs,FALSE); 1710 1710 1711 1711 // Set the register with e21 without affecting the flags 1712 1712 retregs = *pretregs & (ALLREGS | mBP); 1713 1713 if (retregs & ~regcon.mvar) 1714 1714 retregs &= ~regcon.mvar; // don't disturb register variables 1715 c = regwithvalue(c,retregs,e21->EV.Vint,®,sz1 == 8 ? 64|8 : 8); 1715 // NOTE: see my email (sign extension bug? possible fix, some questions 1716 c = regwithvalue(c,retregs,e21->EV.Vint,®,tysize(e21->Ety) == 8 ? 64|8 : 8); 1716 1717 retregs = mask[reg]; 1717 1718 1718 1719 c = cat(c,cse_flush(1)); // flush CSE's to memory 1719 1720 c = genjmp(c,jop,FLcode,(block *)cnop1); 1720 1721 freenode(e21); 1721 1722 1722 1723 regconsave = regcon; 1723 1724 stackpushsave = stackpush; 1724 1725 1725 1726 c2 = codelem(e22,&retregs,FALSE); 1726 1727 1727 1728 andregcon(®consave); 1728 1729 assert(stackpushsave == stackpush); 1729 1730 1730 1731 freenode(e2); 1731 1732 c = cat6(cc,c,c2,cnop1,fixresult(e,retregs,pretregs),NULL); 1732 1733 goto Lret; 1733 1734 } 1734 1735 1735 1736 cnop1 = gennop(CNIL); trunk/src/backend/cod4.c
r807 r813 3216 3216 3217 3217 /************************************* 3218 3218 * Generate code for OPbsf and OPbsr. 3219 3219 */ 3220 3220 3221 3221 code *cdbscan(elem *e, regm_t *pretregs) 3222 3222 { 3223 3223 regm_t retregs; 3224 3224 unsigned reg; 3225 3225 int sz; 3226 3226 tym_t tyml; 3227 3227 code *cl,*cg; 3228 3228 code cs; 3229 3229 3230 3230 //printf("cdbscan()\n"); 3231 3231 //elem_print(e); 3232 3232 if (*pretregs == 0) 3233 3233 return codelem(e->E1,pretregs,FALSE); 3234 3234 tyml = tybasic(e->E1->Ety); 3235 3235 sz = tysize[tyml]; 3236 assert(sz == 2 || sz == 4 );3236 assert(sz == 2 || sz == 4 || sz == 8); 3237 3237 3238 3238 if ((e->E1->Eoper == OPind && !e->E1->Ecount) || e->E1->Eoper == OPvar) 3239 3239 { 3240 3240 cl = getlvalue(&cs, e->E1, RMload); // get addressing mode 3241 3241 } 3242 3242 else 3243 3243 { 3244 3244 retregs = allregs; 3245 3245 cl = codelem(e->E1, &retregs, FALSE); 3246 3246 reg = findreg(retregs); 3247 3247 cs.Irm = modregrm(3,0,reg & 7); 3248 3248 cs.Iflags = 0; 3249 3249 cs.Irex = 0; 3250 3250 if (reg & 8) 3251 3251 cs.Irex |= REX_B; 3252 3252 } 3253 3253 3254 3254 retregs = *pretregs & allregs; 3255 3255 if (!retregs) 3256 3256 retregs = allregs; 3257 3257 cg = allocreg(&retregs, ®, e->Ety); 3258 3258 3259 3259 cs.Iop = (e->Eoper == OPbsf) ? 0x0FBC : 0x0FBD; // BSF/BSR reg,EA 3260 3260 code_newreg(&cs, reg); 3261 3261 if (!I16 && sz == SHORTSIZE) 3262 3262 cs.Iflags |= CFopsize; 3263 3263 cg = gen(cg,&cs); 3264 if (sz == 8) 3265 code_orrex(cg, REX_W); 3264 3266 3265 3267 return cat3(cl,cg,fixresult(e,retregs,pretregs)); 3266 3268 } 3267 3269 3268 3270 /******************************************* 3269 3271 * Generate code for OPpair, OPrpair. 3270 3272 */ 3271 3273 3272 3274 code *cdpair(elem *e, regm_t *pretregs) 3273 3275 { 3274 3276 regm_t retregs; 3275 3277 regm_t regs1; 3276 3278 regm_t regs2; 3277 3279 unsigned reg; 3278 3280 code *cg; 3279 3281 code *c1; 3280 3282 code *c2; 3281 3283 3282 3284 if (*pretregs == 0) // if don't want result 3283 3285 { c1 = codelem(e->E1,pretregs,FALSE); // eval left leaf
