Note: This website is archived. For up-to-date information about D projects and development, please visit wiki.dlang.org.

Changeset 813

Show
Ignore:
Timestamp:
12/23/10 06:50:12 (14 years ago)
Author:
walter
Message:

Brad's backend 64 bit changes

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/src/backend/cod2.c

    r810 r813  
    16951695 
    16961696  if (op1 != OPcond && op1 != OPandand && op1 != OPoror && 
    16971697      op1 != OPnot && op1 != OPbool && 
    16981698      e21->Eoper == OPconst && 
    16991699      sz1 <= REGSIZE && 
    17001700      *pretregs & (mBP | ALLREGS) && 
    17011701      tysize(e21->Ety) <= REGSIZE && !tyfloating(e21->Ety)) 
    17021702  {     // Recognize (e ? c : f) 
    17031703        unsigned reg; 
    17041704        regm_t retregs; 
    17051705 
    17061706        cnop1 = gennop(CNIL); 
    17071707        retregs = mPSW; 
    17081708        jop = jmpopcode(e1);            // get jmp condition 
    17091709        c = codelem(e1,&retregs,FALSE); 
    17101710 
    17111711        // Set the register with e21 without affecting the flags 
    17121712        retregs = *pretregs & (ALLREGS | mBP); 
    17131713        if (retregs & ~regcon.mvar) 
    17141714            retregs &= ~regcon.mvar;    // don't disturb register variables 
    1715         c = regwithvalue(c,retregs,e21->EV.Vint,&reg,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,&reg,tysize(e21->Ety) == 8 ? 64|8 : 8); 
    17161717        retregs = mask[reg]; 
    17171718 
    17181719        c = cat(c,cse_flush(1));                // flush CSE's to memory 
    17191720        c = genjmp(c,jop,FLcode,(block *)cnop1); 
    17201721        freenode(e21); 
    17211722 
    17221723        regconsave = regcon; 
    17231724        stackpushsave = stackpush; 
    17241725 
    17251726        c2 = codelem(e22,&retregs,FALSE); 
    17261727 
    17271728        andregcon(&regconsave); 
    17281729        assert(stackpushsave == stackpush); 
    17291730 
    17301731        freenode(e2); 
    17311732        c = cat6(cc,c,c2,cnop1,fixresult(e,retregs,pretregs),NULL); 
    17321733        goto Lret; 
    17331734  } 
    17341735 
    17351736  cnop1 = gennop(CNIL); 
  • trunk/src/backend/cod4.c

    r807 r813  
    32163216 
    32173217/************************************* 
    32183218 * Generate code for OPbsf and OPbsr. 
    32193219 */ 
    32203220 
    32213221code *cdbscan(elem *e, regm_t *pretregs) 
    32223222{ 
    32233223    regm_t retregs; 
    32243224    unsigned reg; 
    32253225    int sz; 
    32263226    tym_t tyml; 
    32273227    code *cl,*cg; 
    32283228    code cs; 
    32293229 
    32303230    //printf("cdbscan()\n"); 
    32313231    //elem_print(e); 
    32323232    if (*pretregs == 0) 
    32333233        return codelem(e->E1,pretregs,FALSE); 
    32343234    tyml = tybasic(e->E1->Ety); 
    32353235    sz = tysize[tyml]; 
    3236     assert(sz == 2 || sz == 4); 
     3236    assert(sz == 2 || sz == 4 || sz == 8); 
    32373237 
    32383238    if ((e->E1->Eoper == OPind && !e->E1->Ecount) || e->E1->Eoper == OPvar) 
    32393239    { 
    32403240        cl = getlvalue(&cs, e->E1, RMload);     // get addressing mode 
    32413241    } 
    32423242    else 
    32433243    { 
    32443244        retregs = allregs; 
    32453245        cl = codelem(e->E1, &retregs, FALSE); 
    32463246        reg = findreg(retregs); 
    32473247        cs.Irm = modregrm(3,0,reg & 7); 
    32483248        cs.Iflags = 0; 
    32493249        cs.Irex = 0; 
    32503250        if (reg & 8) 
    32513251            cs.Irex |= REX_B; 
    32523252    } 
    32533253 
    32543254    retregs = *pretregs & allregs; 
    32553255    if  (!retregs) 
    32563256        retregs = allregs; 
    32573257    cg = allocreg(&retregs, &reg, e->Ety); 
    32583258 
    32593259    cs.Iop = (e->Eoper == OPbsf) ? 0x0FBC : 0x0FBD;        // BSF/BSR reg,EA 
    32603260    code_newreg(&cs, reg); 
    32613261    if (!I16 && sz == SHORTSIZE) 
    32623262        cs.Iflags |= CFopsize; 
    32633263    cg = gen(cg,&cs); 
     3264    if (sz == 8) 
     3265        code_orrex(cg, REX_W); 
    32643266 
    32653267    return cat3(cl,cg,fixresult(e,retregs,pretregs)); 
    32663268} 
    32673269 
    32683270/******************************************* 
    32693271 * Generate code for OPpair, OPrpair. 
    32703272 */ 
    32713273 
    32723274code *cdpair(elem *e, regm_t *pretregs) 
    32733275{ 
    32743276    regm_t retregs; 
    32753277    regm_t regs1; 
    32763278    regm_t regs2; 
    32773279    unsigned reg; 
    32783280    code *cg; 
    32793281    code *c1; 
    32803282    code *c2; 
    32813283 
    32823284    if (*pretregs == 0)                         // if don't want result 
    32833285    {   c1 = codelem(e->E1,pretregs,FALSE);     // eval left leaf