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

Changeset 832

Show
Ignore:
Timestamp:
01/01/11 07:15:25 (14 years ago)
Author:
walter
Message:

more 64

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • branches/dmd-1.x/src/backend/cod2.c

    r831 r832  
    574574            rretregs &= BYTEREGS; 
    575575 
    576576        cr = scodelem(e2,&rretregs,retregs,TRUE);       /* get rvalue   */ 
    577577        rreg = (tysize[ty2] > REGSIZE) ? findreglsw(rretregs) : findreg(rretregs); 
    578578        c = CNIL; 
    579579        if (numwords == 1)                              /* ADD reg,rreg */ 
    580580        { 
    581581                /* reverse operands to avoid moving around the segment value */ 
    582582                if (tysize[ty2] > REGSIZE) 
    583583                {       c = cat(c,getregs(rretregs)); 
    584584                        c = genregs(c,op1,rreg,reg); 
    585585                        retregs = rretregs;     /* reverse operands     */ 
    586586                } 
    587587                else 
    588588                {   c = genregs(c,op1,reg,rreg); 
    589589                    if (!I16 && *pretregs & mPSW) 
    590590                        c->Iflags |= word; 
    591591                } 
    592592                if (I64 && sz == 8) 
    593593                    code_orrex(c, REX_W); 
    594                 if (I64 && byte && reg >= 4
     594                if (I64 && byte && (reg >= 4 || rreg >= 4)
    595595                    code_orrex(c, REX); 
    596596        } 
    597597        else /* numwords == 2 */                /* ADD lsreg,lsrreg     */ 
    598598        { 
    599599            reg = findreglsw(retregs); 
    600600            rreg = findreglsw(rretregs); 
    601601            c = genregs(c,op1,reg,rreg); 
    602602            if (e->Eoper == OPadd || e->Eoper == OPmin) 
    603603                code_orflag(c,CFpsw); 
    604604            reg = findregmsw(retregs); 
    605605            rreg = findregmsw(rretregs); 
    606606            if (!(e2oper == OPu16_32 && // if second operand is 0 
    607607                  (op2 == 0x0B || op2 == 0x33)) // and OR or XOR 
    608608               ) 
    609609                genregs(c,op2,reg,rreg);        // ADC msreg,msrreg 
    610610        } 
    611611        break; 
    612612 
    613613    case OPrelconst: 
    614614        if (sz != REGSIZE) 
  • trunk/src/backend/cod2.c

    r831 r832  
    574574            rretregs &= BYTEREGS; 
    575575 
    576576        cr = scodelem(e2,&rretregs,retregs,TRUE);       /* get rvalue   */ 
    577577        rreg = (tysize[ty2] > REGSIZE) ? findreglsw(rretregs) : findreg(rretregs); 
    578578        c = CNIL; 
    579579        if (numwords == 1)                              /* ADD reg,rreg */ 
    580580        { 
    581581                /* reverse operands to avoid moving around the segment value */ 
    582582                if (tysize[ty2] > REGSIZE) 
    583583                {       c = cat(c,getregs(rretregs)); 
    584584                        c = genregs(c,op1,rreg,reg); 
    585585                        retregs = rretregs;     /* reverse operands     */ 
    586586                } 
    587587                else 
    588588                {   c = genregs(c,op1,reg,rreg); 
    589589                    if (!I16 && *pretregs & mPSW) 
    590590                        c->Iflags |= word; 
    591591                } 
    592592                if (I64 && sz == 8) 
    593593                    code_orrex(c, REX_W); 
    594                 if (I64 && byte && reg >= 4
     594                if (I64 && byte && (reg >= 4 || rreg >= 4)
    595595                    code_orrex(c, REX); 
    596596        } 
    597597        else /* numwords == 2 */                /* ADD lsreg,lsrreg     */ 
    598598        { 
    599599            reg = findreglsw(retregs); 
    600600            rreg = findreglsw(rretregs); 
    601601            c = genregs(c,op1,reg,rreg); 
    602602            if (e->Eoper == OPadd || e->Eoper == OPmin) 
    603603                code_orflag(c,CFpsw); 
    604604            reg = findregmsw(retregs); 
    605605            rreg = findregmsw(rretregs); 
    606606            if (!(e2oper == OPu16_32 && // if second operand is 0 
    607607                  (op2 == 0x0B || op2 == 0x33)) // and OR or XOR 
    608608               ) 
    609609                genregs(c,op2,reg,rreg);        // ADC msreg,msrreg 
    610610        } 
    611611        break; 
    612612 
    613613    case OPrelconst: 
    614614        if (sz != REGSIZE)