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

Changeset 831

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

64 bits

Files:

Legend:

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

    r828 r831  
    643643                    } 
    644644                } 
    645645                rval = reghasvalue(byte ? BYTEREGS : ALLREGS,i,&rreg); 
    646646                cs.IEV2.Vint = i; 
    647647        L3: 
    648648                op1 ^= byte; 
    649649                cs.Iflags |= word; 
    650650                if (rval) 
    651651                {   cs.Iop = op1 ^ 2; 
    652652                    mode = rreg; 
    653653                } 
    654654                else 
    655655                    cs.Iop = 0x81; 
    656656                cs.Irm = modregrm(3,mode&7,reg&7); 
    657657                if (mode & 8) 
    658658                    cs.Irex |= REX_R; 
    659659                if (reg & 8) 
    660660                    cs.Irex |= REX_B; 
    661661                if (I64 && sz == 8) 
    662662                    cs.Irex |= REX_W; 
    663                 if (I64 && byte && reg >= 4
     663                if (I64 && byte && (reg >= 4 || (rval && rreg >= 4))
    664664                    cs.Irex |= REX; 
    665665                cs.IFL2 = (e2->Eoper == OPconst) ? FLconst : el_fl(e2); 
    666666                /* Modify instruction for special cases */ 
    667667                switch (e->Eoper) 
    668668                {   case OPadd: 
    669669                    {   int iop; 
    670670 
    671671                        if (i == 1) 
    672672                            iop = 0;                    /* INC reg      */ 
    673673                        else if (i == -1) 
    674674                            iop = 8;                    /* DEC reg      */ 
    675675                        else 
    676676                            break; 
    677677                        cs.Iop = (0x40 | iop | reg) ^ byte; 
    678678                        if ((byte && *pretregs & mPSW) || I64) 
    679679                        {   cs.Irm = modregrm(3,0,reg & 7) | iop; 
    680680                            cs.Iop = 0xFF; 
    681681                        } 
    682682                        break; 
    683683                    } 
  • trunk/src/backend/cod2.c

    r828 r831  
    643643                    } 
    644644                } 
    645645                rval = reghasvalue(byte ? BYTEREGS : ALLREGS,i,&rreg); 
    646646                cs.IEV2.Vint = i; 
    647647        L3: 
    648648                op1 ^= byte; 
    649649                cs.Iflags |= word; 
    650650                if (rval) 
    651651                {   cs.Iop = op1 ^ 2; 
    652652                    mode = rreg; 
    653653                } 
    654654                else 
    655655                    cs.Iop = 0x81; 
    656656                cs.Irm = modregrm(3,mode&7,reg&7); 
    657657                if (mode & 8) 
    658658                    cs.Irex |= REX_R; 
    659659                if (reg & 8) 
    660660                    cs.Irex |= REX_B; 
    661661                if (I64 && sz == 8) 
    662662                    cs.Irex |= REX_W; 
    663                 if (I64 && byte && reg >= 4
     663                if (I64 && byte && (reg >= 4 || (rval && rreg >= 4))
    664664                    cs.Irex |= REX; 
    665665                cs.IFL2 = (e2->Eoper == OPconst) ? FLconst : el_fl(e2); 
    666666                /* Modify instruction for special cases */ 
    667667                switch (e->Eoper) 
    668668                {   case OPadd: 
    669669                    {   int iop; 
    670670 
    671671                        if (i == 1) 
    672672                            iop = 0;                    /* INC reg      */ 
    673673                        else if (i == -1) 
    674674                            iop = 8;                    /* DEC reg      */ 
    675675                        else 
    676676                            break; 
    677677                        cs.Iop = (0x40 | iop | reg) ^ byte; 
    678678                        if ((byte && *pretregs & mPSW) || I64) 
    679679                        {   cs.Irm = modregrm(3,0,reg & 7) | iop; 
    680680                            cs.Iop = 0xFF; 
    681681                        } 
    682682                        break; 
    683683                    }