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

Changeset 827

Show
Ignore:
Timestamp:
12/29/10 05:32:48 (14 years ago)
Author:
walter
Message:

more 64

Files:

Legend:

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

    r790 r827  
    796796                } 
    797797                r++; 
    798798            } 
    799799 
    800800            if (value == 0 && !(flags & 8)) 
    801801            {   c = genclrreg(c,reg);           // CLR reg 
    802802                if (flags & 64) 
    803803                    code_orrex(c, REX_W); 
    804804            } 
    805805            else 
    806806            {   /* See if we can just load a byte       */ 
    807807                if (regm & BYTEREGS && 
    808808                    !(config.flags4 & CFG4speed && config.target_cpu >= TARGET_PentiumPro) 
    809809                   ) 
    810810                { 
    811811                    if ((regv & 0xFFFFFF00) == (value & 0xFFFFFF00)) 
    812812                    {   c = movregconst(c,reg,value,(flags & 8) |4|1);  // load regL 
    813813                        return c; 
    814814                    } 
    815815                    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) 
    817818                    {   c = movregconst(c,4|reg,value >> 8,(flags & 8) |4|1|16); // load regH 
    818819                        return c; 
    819820                    } 
    820821                } 
    821822                if (flags & 64) 
    822823                    c = genc2(c,0xC7,(REX_W << 16) | modregrmx(3,0,reg),value); // MOV reg,value64 
    823824                else 
    824825                    c = genc2(c,0xC7,modregrmx(3,0,reg),value); // MOV reg,value 
    825826            } 
    826827        } 
    827828    done: 
    828829        regimmed_set(reg,value); 
    829830    } 
    830831    return c; 
    831832} 
    832833 
    833834 
    834835/********************************** 
    835836 * Determine if one of the registers in regm has value in it. 
    836837 * If so, return !=0 and set *preg to which register it is. 
  • branches/dmd-1.x/src/iasm.c

    r771 r827  
    13131313                        (uSizemaskTable1 & _32 && aoptyTable1 == _mnoi) || 
    13141314                        (ptb.pptb1->usFlags & _16_bit_addr))) || 
    13151315                     (I16 && 
    13161316                      (amod1 == _addr32 || 
    13171317                        (uSizemaskTable1 & _32 && aoptyTable1 == _rel) || 
    13181318                        (uSizemaskTable1 & _48 && aoptyTable1 == _mnoi) || 
    13191319                         (ptb.pptb1->usFlags & _32_bit_addr)))) 
    13201320                { 
    13211321                        emit(0x67);     // address size prefix 
    13221322                        pc->Iflags |= CFaddrsize; 
    13231323                        if (I32) 
    13241324                            amod1 = _addr16; 
    13251325                        else 
    13261326                            amod1 = _addr32; 
    13271327                        popnd1->usFlags &= ~CONSTRUCT_FLAGS(0,0,7,0); 
    13281328                        popnd1->usFlags |= CONSTRUCT_FLAGS(0,0,amod1,0); 
    13291329                } 
    13301330 
    13311331                // If the size of the operand is unknown, assume that it is 
    13321332                // the default size 
    1333                 if ((I32 && (ptb.pptb0->usFlags & _16_bit)) || 
     1333                if (((I64 || I32) && (ptb.pptb0->usFlags & _16_bit)) || 
    13341334                    (I16 && (ptb.pptb0->usFlags & _32_bit))) 
    13351335                { 
    13361336                    //if (asmstate.ucItype != ITjump) 
    13371337                    {   emit(0x66); 
    13381338                        pc->Iflags |= CFopsize; 
    13391339                    } 
    13401340                } 
    13411341                if (((pregSegment = (popndTmp = popnd1)->segreg) != NULL) || 
    13421342                        ((popndTmp = popnd2) != NULL && 
    13431343                        (pregSegment = popndTmp->segreg) != NULL) 
    13441344                  ) 
    13451345                { 
    13461346                    if ((popndTmp->pregDisp1 && 
    13471347                            popndTmp->pregDisp1->val == _BP) || 
    13481348                            popndTmp->pregDisp2 && 
    13491349                            popndTmp->pregDisp2->val == _BP) 
    13501350                            usDefaultseg = _SS; 
    13511351                    else 
    13521352                            usDefaultseg = _DS; 
    13531353                    if (pregSegment->val != usDefaultseg) 
  • trunk/src/backend/cgen.c

    r790 r827  
    796796                } 
    797797                r++; 
    798798            } 
    799799 
    800800            if (value == 0 && !(flags & 8)) 
    801801            {   c = genclrreg(c,reg);           // CLR reg 
    802802                if (flags & 64) 
    803803                    code_orrex(c, REX_W); 
    804804            } 
    805805            else 
    806806            {   /* See if we can just load a byte       */ 
    807807                if (regm & BYTEREGS && 
    808808                    !(config.flags4 & CFG4speed && config.target_cpu >= TARGET_PentiumPro) 
    809809                   ) 
    810810                { 
    811811                    if ((regv & 0xFFFFFF00) == (value & 0xFFFFFF00)) 
    812812                    {   c = movregconst(c,reg,value,(flags & 8) |4|1);  // load regL 
    813813                        return c; 
    814814                    } 
    815815                    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) 
    817818                    {   c = movregconst(c,4|reg,value >> 8,(flags & 8) |4|1|16); // load regH 
    818819                        return c; 
    819820                    } 
    820821                } 
    821822                if (flags & 64) 
    822823                    c = genc2(c,0xC7,(REX_W << 16) | modregrmx(3,0,reg),value); // MOV reg,value64 
    823824                else 
    824825                    c = genc2(c,0xC7,modregrmx(3,0,reg),value); // MOV reg,value 
    825826            } 
    826827        } 
    827828    done: 
    828829        regimmed_set(reg,value); 
    829830    } 
    830831    return c; 
    831832} 
    832833 
    833834 
    834835/********************************** 
    835836 * Determine if one of the registers in regm has value in it. 
    836837 * If so, return !=0 and set *preg to which register it is.