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

Changeset 807

Show
Ignore:
Timestamp:
12/14/10 10:19:40 (14 years ago)
Author:
walter
Message:

cdaddass fix for 64

Files:

Legend:

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

    r805 r807  
    724724                c = gen1(c,0x48 + reg);         // DEC reg 
    725725            else 
    726726            { 
    727727                c = genc2(c,0x81,modregrm(3,0,reg),postinc); 
    728728            } 
    729729        } 
    730730    } 
    731731    freenode(e1); 
    732732    return c; 
    733733} 
    734734 
    735735 
    736736/************************ 
    737737 * Generate code for += -= &= |= ^= negass 
    738738 */ 
    739739 
    740740code *cdaddass(elem *e,regm_t *pretregs) 
    741741{ regm_t retregs,forccs,forregs; 
    742742  tym_t tyml; 
    743743  unsigned reg,op,op1,op2,mode,wantres; 
    744   targ_long val; 
    745744  int byte; 
    746745  code *cl,*cr,*c,*ce,cs; 
    747746  elem *e1; 
    748747  elem *e2; 
    749748  unsigned opsize; 
    750749  unsigned reverse; 
    751750  int sz; 
    752751  regm_t varregm; 
    753752  unsigned varreg; 
    754753  unsigned cflags; 
    755754 
    756755  //printf("cdaddass(e=%p, *pretregs = x%x)\n",e,*pretregs); 
    757756  op = e->Eoper; 
    758757  retregs = 0; 
    759758  reverse = 0; 
    760759  e1 = e->E1; 
    761760  tyml = tybasic(e1->Ety);              // type of lvalue 
    762761  sz = tysize[tyml]; 
    763762  byte = (sz == 1);                     // 1 for byte operation, else 0 
    764763  if (tyfloating(tyml)) 
     
    838837                cs.Iop = 0x81; 
    839838                getlvalue_msw(&cs); 
    840839                cs.IFL2 = FLconst; 
    841840                cs.IEV2.Vuns = 0; 
    842841                gen(c,&cs);                     // SBB EA+2,0 
    843842                break; 
    844843 
    845844            case LLONGSIZE: 
    846845                if (I16) 
    847846                    assert(0);                      // not implemented yet 
    848847                goto neg_2reg; 
    849848 
    850849            default: 
    851850                assert(0); 
    852851        } 
    853852        c = cat3(cl,cr,c); 
    854853        forccs = 0;             // flags already set by NEG 
    855854        *pretregs &= ~mPSW; 
    856855  } 
    857856  else if ((e2 = e->E2)->Eoper == OPconst &&    // if rvalue is a const 
     857      el_signx32(e2) && 
    858858       // Don't evaluate e2 in register if we can use an INC or DEC 
    859859      (((sz <= REGSIZE || tyfv(tyml)) && 
    860860        (op == OPaddass || op == OPminass) && 
    861         ((val = el_tolong(e2)) == 1 || val == -1
     861        (el_allbits(e2, 1) || el_allbits(e2, -1)
    862862       ) || 
    863863       (!evalinregister(e2) && tyml != TYhptr) 
    864864      ) 
    865865     ) 
    866866  { 
    867867        cl = getlvalue(&cs,e1,0); 
    868868        cl = cat(cl,modEA(&cs)); 
    869869        cs.IFL2 = FLconst; 
    870870        cs.IEV2.Vint = e2->EV.Vint; 
    871871        if (sz <= REGSIZE || tyfv(tyml) || opsize) 
    872872        { 
    873             targ_size_t i = cs.IEV2.Vsize_t; 
     873            targ_int i = cs.IEV2.Vint; 
    874874 
    875875            /* Handle shortcuts. Watch out for if result has    */ 
    876876            /* to be in flags.                                  */ 
    877877 
    878878            if (reghasvalue(ALLREGS,i,&reg) && i != 1 && i != -1 && 
    879879                !opsize) 
    880880            { 
    881881                cs.Iop = op1; 
    882882                cs.Irm |= modregrm(0,reg,0); 
    883883            } 
    884884            else 
    885885            { 
    886886                cs.Iop = 0x81; 
    887887                cs.Irm |= modregrm(0,mode,0); 
    888888                switch (op) 
    889889                {   case OPminass:      /* convert to +=        */ 
    890890                        cs.Irm ^= modregrm(0,5,0); 
    891891                        i = -i; 
    892892                        cs.IEV2.Vsize_t = i; 
    893893                        /* FALL-THROUGH */ 
  • branches/dmd-1.x/src/backend/el.c

    r790 r807  
    30113011    value = e->EV.Vullong; 
    30123012    switch (tysize(e->Ety)) 
    30133013    { 
    30143014        case 1: value = (signed char) value; 
    30153015                break; 
    30163016        case 2: value = (short) value; 
    30173017                break; 
    30183018        case 4: value = (int) value; 
    30193019                break; 
    30203020        case 8: break; 
    30213021        default: 
    30223022                assert(0); 
    30233023    } 
    30243024    if (bit == -1) 
    30253025        value++; 
    30263026    else if (bit == 1) 
    30273027        value--; 
    30283028    return value == 0; 
    30293029} 
    30303030 
     3031/******************************************** 
     3032 * Determine if constant e is a 32 bit or less value, or is a 32 bit value sign extended to 64 bits. 
     3033 */ 
     3034 
     3035int el_signx32(elem *e) 
     3036{ 
     3037    elem_debug(e); 
     3038    assert(e->Eoper == OPconst); 
     3039    if (tysize(e->Ety) == 8) 
     3040    { 
     3041        if (e->EV.Vullong != (int)e->EV.Vullong) 
     3042            return FALSE; 
     3043    } 
     3044    return TRUE; 
     3045} 
     3046 
    30313047/****************************** 
    30323048 * Extract long double value from constant elem. 
    30333049 * Silently ignore types which are not floating point values. 
    30343050 */ 
    30353051 
    30363052targ_ldouble el_toldouble(elem *e) 
    30373053{   targ_ldouble result; 
    30383054 
    30393055    elem_debug(e); 
    30403056    assert(cnst(e)); 
    30413057#if TX86 
    30423058    switch (tybasic(typemask(e))) 
    30433059    { 
    30443060        case TYfloat: 
    30453061        case TYifloat: 
    30463062            result = e->EV.Vfloat; 
    30473063            break; 
    30483064        case TYdouble: 
    30493065        case TYidouble: 
    30503066        case TYdouble_alias: 
  • branches/dmd-1.x/src/backend/el.h

    r792 r807  
    166166#define el_copy(to,from) {*(to) = *(from);} 
    167167#endif 
    168168elem_p el_alloctmp(tym_t); 
    169169elem_p el_selecte1(elem_p); 
    170170elem_p el_selecte2(elem_p); 
    171171elem_p el_copytree(elem_p); 
    172172void   el_replace_sym(elem *e,symbol *s1,symbol *s2); 
    173173elem_p el_scancommas(elem_p); 
    174174int el_sideeffect(elem_p); 
    175175#if TX86 
    176176int el_depends(elem *ea,elem *eb); 
    177177#endif 
    178178#if LONGLONG 
    179179targ_llong el_tolongt(elem_p); 
    180180targ_llong el_tolong(elem_p); 
    181181#else 
    182182targ_long el_tolongt(elem_p); 
    183183targ_long el_tolong(elem_p); 
    184184#endif 
    185185int el_allbits(elem_p,int); 
     186int el_signx32(elem_p); 
    186187targ_ldouble el_toldouble(elem_p); 
    187188void el_toconst(elem_p); 
    188189elem_p el_same(elem_p *); 
    189190int el_match(elem_p ,elem_p); 
    190191int el_match2(elem_p ,elem_p); 
    191192int el_match3(elem_p ,elem_p); 
    192193int el_match4(elem_p ,elem_p); 
    193194 
    194195int el_appears(elem *e,symbol *s); 
    195196Symbol *el_basesym(elem *e); 
    196197int el_anydef(elem *ed, elem *e); 
    197198elem_p el_bint(unsigned,type *,elem_p ,elem_p); 
    198199elem_p el_unat(unsigned,type *,elem_p); 
    199200elem_p el_bin(unsigned,tym_t,elem_p ,elem_p); 
    200201elem_p el_una(unsigned,tym_t,elem_p); 
    201202#if LONGLONG    // DJB 
    202203elem_p el_longt(type *,targ_llong); 
    203204#else 
    204205elem_p el_longt(type *,targ_long); 
    205206#endif 
  • trunk/src/backend/cod4.c

    r805 r807  
    724724                c = gen1(c,0x48 + reg);         // DEC reg 
    725725            else 
    726726            { 
    727727                c = genc2(c,0x81,modregrm(3,0,reg),postinc); 
    728728            } 
    729729        } 
    730730    } 
    731731    freenode(e1); 
    732732    return c; 
    733733} 
    734734 
    735735 
    736736/************************ 
    737737 * Generate code for += -= &= |= ^= negass 
    738738 */ 
    739739 
    740740code *cdaddass(elem *e,regm_t *pretregs) 
    741741{ regm_t retregs,forccs,forregs; 
    742742  tym_t tyml; 
    743743  unsigned reg,op,op1,op2,mode,wantres; 
    744   targ_long val; 
    745744  int byte; 
    746745  code *cl,*cr,*c,*ce,cs; 
    747746  elem *e1; 
    748747  elem *e2; 
    749748  unsigned opsize; 
    750749  unsigned reverse; 
    751750  int sz; 
    752751  regm_t varregm; 
    753752  unsigned varreg; 
    754753  unsigned cflags; 
    755754 
    756755  //printf("cdaddass(e=%p, *pretregs = x%x)\n",e,*pretregs); 
    757756  op = e->Eoper; 
    758757  retregs = 0; 
    759758  reverse = 0; 
    760759  e1 = e->E1; 
    761760  tyml = tybasic(e1->Ety);              // type of lvalue 
    762761  sz = tysize[tyml]; 
    763762  byte = (sz == 1);                     // 1 for byte operation, else 0 
    764763  if (tyfloating(tyml)) 
     
    838837                cs.Iop = 0x81; 
    839838                getlvalue_msw(&cs); 
    840839                cs.IFL2 = FLconst; 
    841840                cs.IEV2.Vuns = 0; 
    842841                gen(c,&cs);                     // SBB EA+2,0 
    843842                break; 
    844843 
    845844            case LLONGSIZE: 
    846845                if (I16) 
    847846                    assert(0);                      // not implemented yet 
    848847                goto neg_2reg; 
    849848 
    850849            default: 
    851850                assert(0); 
    852851        } 
    853852        c = cat3(cl,cr,c); 
    854853        forccs = 0;             // flags already set by NEG 
    855854        *pretregs &= ~mPSW; 
    856855  } 
    857856  else if ((e2 = e->E2)->Eoper == OPconst &&    // if rvalue is a const 
     857      el_signx32(e2) && 
    858858       // Don't evaluate e2 in register if we can use an INC or DEC 
    859859      (((sz <= REGSIZE || tyfv(tyml)) && 
    860860        (op == OPaddass || op == OPminass) && 
    861         ((val = el_tolong(e2)) == 1 || val == -1
     861        (el_allbits(e2, 1) || el_allbits(e2, -1)
    862862       ) || 
    863863       (!evalinregister(e2) && tyml != TYhptr) 
    864864      ) 
    865865     ) 
    866866  { 
    867867        cl = getlvalue(&cs,e1,0); 
    868868        cl = cat(cl,modEA(&cs)); 
    869869        cs.IFL2 = FLconst; 
    870870        cs.IEV2.Vint = e2->EV.Vint; 
    871871        if (sz <= REGSIZE || tyfv(tyml) || opsize) 
    872872        { 
    873             targ_size_t i = cs.IEV2.Vsize_t; 
     873            targ_int i = cs.IEV2.Vint; 
    874874 
    875875            /* Handle shortcuts. Watch out for if result has    */ 
    876876            /* to be in flags.                                  */ 
    877877 
    878878            if (reghasvalue(ALLREGS,i,&reg) && i != 1 && i != -1 && 
    879879                !opsize) 
    880880            { 
    881881                cs.Iop = op1; 
    882882                cs.Irm |= modregrm(0,reg,0); 
    883883            } 
    884884            else 
    885885            { 
    886886                cs.Iop = 0x81; 
    887887                cs.Irm |= modregrm(0,mode,0); 
    888888                switch (op) 
    889889                {   case OPminass:      /* convert to +=        */ 
    890890                        cs.Irm ^= modregrm(0,5,0); 
    891891                        i = -i; 
    892892                        cs.IEV2.Vsize_t = i; 
    893893                        /* FALL-THROUGH */ 
  • trunk/src/backend/el.c

    r790 r807  
    30113011    value = e->EV.Vullong; 
    30123012    switch (tysize(e->Ety)) 
    30133013    { 
    30143014        case 1: value = (signed char) value; 
    30153015                break; 
    30163016        case 2: value = (short) value; 
    30173017                break; 
    30183018        case 4: value = (int) value; 
    30193019                break; 
    30203020        case 8: break; 
    30213021        default: 
    30223022                assert(0); 
    30233023    } 
    30243024    if (bit == -1) 
    30253025        value++; 
    30263026    else if (bit == 1) 
    30273027        value--; 
    30283028    return value == 0; 
    30293029} 
    30303030 
     3031/******************************************** 
     3032 * Determine if constant e is a 32 bit or less value, or is a 32 bit value sign extended to 64 bits. 
     3033 */ 
     3034 
     3035int el_signx32(elem *e) 
     3036{ 
     3037    elem_debug(e); 
     3038    assert(e->Eoper == OPconst); 
     3039    if (tysize(e->Ety) == 8) 
     3040    { 
     3041        if (e->EV.Vullong != (int)e->EV.Vullong) 
     3042            return FALSE; 
     3043    } 
     3044    return TRUE; 
     3045} 
     3046 
    30313047/****************************** 
    30323048 * Extract long double value from constant elem. 
    30333049 * Silently ignore types which are not floating point values. 
    30343050 */ 
    30353051 
    30363052targ_ldouble el_toldouble(elem *e) 
    30373053{   targ_ldouble result; 
    30383054 
    30393055    elem_debug(e); 
    30403056    assert(cnst(e)); 
    30413057#if TX86 
    30423058    switch (tybasic(typemask(e))) 
    30433059    { 
    30443060        case TYfloat: 
    30453061        case TYifloat: 
    30463062            result = e->EV.Vfloat; 
    30473063            break; 
    30483064        case TYdouble: 
    30493065        case TYidouble: 
    30503066        case TYdouble_alias: 
  • trunk/src/backend/el.h

    r792 r807  
    166166#define el_copy(to,from) {*(to) = *(from);} 
    167167#endif 
    168168elem_p el_alloctmp(tym_t); 
    169169elem_p el_selecte1(elem_p); 
    170170elem_p el_selecte2(elem_p); 
    171171elem_p el_copytree(elem_p); 
    172172void   el_replace_sym(elem *e,symbol *s1,symbol *s2); 
    173173elem_p el_scancommas(elem_p); 
    174174int el_sideeffect(elem_p); 
    175175#if TX86 
    176176int el_depends(elem *ea,elem *eb); 
    177177#endif 
    178178#if LONGLONG 
    179179targ_llong el_tolongt(elem_p); 
    180180targ_llong el_tolong(elem_p); 
    181181#else 
    182182targ_long el_tolongt(elem_p); 
    183183targ_long el_tolong(elem_p); 
    184184#endif 
    185185int el_allbits(elem_p,int); 
     186int el_signx32(elem_p); 
    186187targ_ldouble el_toldouble(elem_p); 
    187188void el_toconst(elem_p); 
    188189elem_p el_same(elem_p *); 
    189190int el_match(elem_p ,elem_p); 
    190191int el_match2(elem_p ,elem_p); 
    191192int el_match3(elem_p ,elem_p); 
    192193int el_match4(elem_p ,elem_p); 
    193194 
    194195int el_appears(elem *e,symbol *s); 
    195196Symbol *el_basesym(elem *e); 
    196197int el_anydef(elem *ed, elem *e); 
    197198elem_p el_bint(unsigned,type *,elem_p ,elem_p); 
    198199elem_p el_unat(unsigned,type *,elem_p); 
    199200elem_p el_bin(unsigned,tym_t,elem_p ,elem_p); 
    200201elem_p el_una(unsigned,tym_t,elem_p); 
    201202#if LONGLONG    // DJB 
    202203elem_p el_longt(type *,targ_llong); 
    203204#else 
    204205elem_p el_longt(type *,targ_long); 
    205206#endif