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

Changeset 805

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

finally passes test23 in 64 bits

Files:

Legend:

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

    r798 r805  
    27132713    unsigned op; 
    27142714    targ_long val; 
    27152715    code *cl,*cr,*c,cs; 
    27162716    elem *e1; 
    27172717    int sz; 
    27182718 
    27192719    //printf("cdnegass87(e = %p, *pretregs = x%x)\n", e, *pretregs); 
    27202720    e1 = e->E1; 
    27212721    tyml = tybasic(e1->Ety);            // type of lvalue 
    27222722    sz = tysize[tyml]; 
    27232723 
    27242724    cl = getlvalue(&cs,e1,0); 
    27252725    cr = modEA(&cs); 
    27262726    cs.Irm |= modregrm(0,6,0); 
    27272727    cs.Iop = 0x80; 
    27282728    cs.Irex = 0; 
    27292729#if LNGDBLSIZE > 10 
    27302730    if (tyml == TYldouble || tyml == TYildouble) 
    27312731        cs.IEVoffset1 += 10 - 1; 
    27322732    else if (tyml == TYcldouble) 
    2733         cs.IEVoffset1 += LNGDBLSIZE + 10 - 1; 
     2733        cs.IEVoffset1 += tysize[TYldouble] + 10 - 1; 
    27342734    else 
    27352735#endif 
    27362736        cs.IEVoffset1 += sz - 1; 
    27372737    cs.IFL2 = FLconst; 
    27382738    cs.IEV2.Vuns = 0x80; 
    27392739    c = gen(NULL,&cs);                  // XOR 7[EA],0x80 
    27402740    if (tycomplex(tyml)) 
    27412741    { 
    27422742        cs.IEVoffset1 -= sz / 2; 
    27432743        gen(c,&cs);                     // XOR 7[EA],0x80 
    27442744    } 
    27452745    c = cat3(cl,cr,c); 
    27462746 
    27472747    if (*pretregs) 
    27482748    { 
    27492749        switch (tyml) 
    27502750        { 
    27512751            case TYifloat: 
    27522752            case TYfloat:               cs.Iop = 0xD9;  op = 0; break; 
    27532753            case TYidouble: 
  • branches/dmd-1.x/src/backend/cod1.c

    r798 r805  
    13311331            else 
    13321332                regcon.params &= ~mask[s->Spreg]; 
    13331333        } 
    13341334    case FLtmp: 
    13351335    case FLbprel: 
    13361336        reflocal = TRUE; 
    13371337        pcs->Irm = modregrm(2,0,BPRM); 
    13381338        goto L2; 
    13391339    case FLextern: 
    13401340        if (s->Sident[0] == '_' && memcmp(s->Sident + 1,"tls_array",10) == 0) 
    13411341        { 
    13421342#if TARGET_LINUX || TARGET_FREEBSD || TARGET_SOLARIS 
    13431343            // Rewrite as GS:[0000], or FS:[0000] for 64 bit 
    13441344            if (I64) 
    13451345            { 
    13461346                pcs->Irm = modregrm(0, 0, 4); 
    13471347                pcs->Isib = modregrm(0, 4, 5);  // don't use [RIP] addressing 
    13481348                pcs->IFL1 = FLconst; 
    13491349                pcs->IEV1.Vuns = 0; 
    13501350                pcs->Iflags = CFfs; 
     1351                pcs->Irex |= REX_W; 
    13511352            } 
    13521353            else 
    13531354            { 
    13541355                pcs->Irm = modregrm(0, 0, BPRM); 
    13551356                pcs->IFL1 = FLconst; 
    13561357                pcs->IEV1.Vuns = 0; 
    13571358                pcs->Iflags = CFgs; 
    13581359            } 
    13591360            break; 
    13601361#else 
    13611362            pcs->Iflags |= CFfs;                // add FS: override 
    13621363#endif 
    13631364        } 
    13641365        if (s->ty() & mTYcs && LARGECODE) 
    13651366            goto Lfardata; 
    13661367        goto L3; 
    13671368    case FLdata: 
    13681369    case FLudata: 
    13691370    case FLcsdata: 
    13701371#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_SOLARIS 
  • branches/dmd-1.x/src/backend/cod4.c

    r798 r805  
    24922492                break; 
    24932493            case OPd_s16: 
    24942494            case OPd_s32: 
    24952495            case OPd_u16: 
    24962496            case OPd_s64: 
    24972497                return cnvt87(e,pretregs); 
    24982498            case OPd_u32:               // use subroutine, not 8087 
    24992499#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_SOLARIS 
    25002500                retregs = mST0; 
    25012501#else 
    25022502                retregs = DOUBLEREGS; 
    25032503#endif 
    25042504                goto L1; 
    25052505 
    25062506            case OPd_u64: 
    25072507                retregs = DOUBLEREGS; 
    25082508                goto L1; 
    25092509            case OPu64_d: 
    25102510                if (*pretregs & mST0) 
    25112511                { 
    2512                     retregs = mAX|mDX; 
     2512                    retregs = I64 ? mAX : mAX|mDX; 
    25132513                    c1 = codelem(e->E1,&retregs,FALSE); 
    25142514                    c2 = callclib(e,CLIBu64_ldbl,pretregs,0); 
    25152515                    return cat(c1,c2); 
    25162516                } 
    25172517                break; 
    25182518            case OPld_u64: 
    25192519                retregs = mST0; 
    25202520                c1 = codelem(e->E1,&retregs,FALSE); 
    25212521                c2 = callclib(e,CLIBld_u64,pretregs,0); 
    25222522                return cat(c1,c2); 
    25232523        } 
    25242524  } 
    25252525  retregs = regmask(e->E1->Ety, TYnfunc); 
    25262526L1: 
    25272527  c1 = codelem(e->E1,&retregs,FALSE); 
    25282528  for (i = 0; 1; i++) 
    25292529  {     assert(i < arraysize(clib)); 
    25302530        if (clib[i][0] == e->Eoper) 
    25312531        {   c2 = callclib(e,clib[i][1],pretregs,0); 
    25322532            break; 
  • trunk/src/backend/cg87.c

    r798 r805  
    27132713    unsigned op; 
    27142714    targ_long val; 
    27152715    code *cl,*cr,*c,cs; 
    27162716    elem *e1; 
    27172717    int sz; 
    27182718 
    27192719    //printf("cdnegass87(e = %p, *pretregs = x%x)\n", e, *pretregs); 
    27202720    e1 = e->E1; 
    27212721    tyml = tybasic(e1->Ety);            // type of lvalue 
    27222722    sz = tysize[tyml]; 
    27232723 
    27242724    cl = getlvalue(&cs,e1,0); 
    27252725    cr = modEA(&cs); 
    27262726    cs.Irm |= modregrm(0,6,0); 
    27272727    cs.Iop = 0x80; 
    27282728    cs.Irex = 0; 
    27292729#if LNGDBLSIZE > 10 
    27302730    if (tyml == TYldouble || tyml == TYildouble) 
    27312731        cs.IEVoffset1 += 10 - 1; 
    27322732    else if (tyml == TYcldouble) 
    2733         cs.IEVoffset1 += LNGDBLSIZE + 10 - 1; 
     2733        cs.IEVoffset1 += tysize[TYldouble] + 10 - 1; 
    27342734    else 
    27352735#endif 
    27362736        cs.IEVoffset1 += sz - 1; 
    27372737    cs.IFL2 = FLconst; 
    27382738    cs.IEV2.Vuns = 0x80; 
    27392739    c = gen(NULL,&cs);                  // XOR 7[EA],0x80 
    27402740    if (tycomplex(tyml)) 
    27412741    { 
    27422742        cs.IEVoffset1 -= sz / 2; 
    27432743        gen(c,&cs);                     // XOR 7[EA],0x80 
    27442744    } 
    27452745    c = cat3(cl,cr,c); 
    27462746 
    27472747    if (*pretregs) 
    27482748    { 
    27492749        switch (tyml) 
    27502750        { 
    27512751            case TYifloat: 
    27522752            case TYfloat:               cs.Iop = 0xD9;  op = 0; break; 
    27532753            case TYidouble: 
  • trunk/src/backend/cod1.c

    r798 r805  
    13311331            else 
    13321332                regcon.params &= ~mask[s->Spreg]; 
    13331333        } 
    13341334    case FLtmp: 
    13351335    case FLbprel: 
    13361336        reflocal = TRUE; 
    13371337        pcs->Irm = modregrm(2,0,BPRM); 
    13381338        goto L2; 
    13391339    case FLextern: 
    13401340        if (s->Sident[0] == '_' && memcmp(s->Sident + 1,"tls_array",10) == 0) 
    13411341        { 
    13421342#if TARGET_LINUX || TARGET_FREEBSD || TARGET_SOLARIS 
    13431343            // Rewrite as GS:[0000], or FS:[0000] for 64 bit 
    13441344            if (I64) 
    13451345            { 
    13461346                pcs->Irm = modregrm(0, 0, 4); 
    13471347                pcs->Isib = modregrm(0, 4, 5);  // don't use [RIP] addressing 
    13481348                pcs->IFL1 = FLconst; 
    13491349                pcs->IEV1.Vuns = 0; 
    13501350                pcs->Iflags = CFfs; 
     1351                pcs->Irex |= REX_W; 
    13511352            } 
    13521353            else 
    13531354            { 
    13541355                pcs->Irm = modregrm(0, 0, BPRM); 
    13551356                pcs->IFL1 = FLconst; 
    13561357                pcs->IEV1.Vuns = 0; 
    13571358                pcs->Iflags = CFgs; 
    13581359            } 
    13591360            break; 
    13601361#else 
    13611362            pcs->Iflags |= CFfs;                // add FS: override 
    13621363#endif 
    13631364        } 
    13641365        if (s->ty() & mTYcs && LARGECODE) 
    13651366            goto Lfardata; 
    13661367        goto L3; 
    13671368    case FLdata: 
    13681369    case FLudata: 
    13691370    case FLcsdata: 
    13701371#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_SOLARIS 
  • trunk/src/backend/cod4.c

    r798 r805  
    24922492                break; 
    24932493            case OPd_s16: 
    24942494            case OPd_s32: 
    24952495            case OPd_u16: 
    24962496            case OPd_s64: 
    24972497                return cnvt87(e,pretregs); 
    24982498            case OPd_u32:               // use subroutine, not 8087 
    24992499#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_SOLARIS 
    25002500                retregs = mST0; 
    25012501#else 
    25022502                retregs = DOUBLEREGS; 
    25032503#endif 
    25042504                goto L1; 
    25052505 
    25062506            case OPd_u64: 
    25072507                retregs = DOUBLEREGS; 
    25082508                goto L1; 
    25092509            case OPu64_d: 
    25102510                if (*pretregs & mST0) 
    25112511                { 
    2512                     retregs = mAX|mDX; 
     2512                    retregs = I64 ? mAX : mAX|mDX; 
    25132513                    c1 = codelem(e->E1,&retregs,FALSE); 
    25142514                    c2 = callclib(e,CLIBu64_ldbl,pretregs,0); 
    25152515                    return cat(c1,c2); 
    25162516                } 
    25172517                break; 
    25182518            case OPld_u64: 
    25192519                retregs = mST0; 
    25202520                c1 = codelem(e->E1,&retregs,FALSE); 
    25212521                c2 = callclib(e,CLIBld_u64,pretregs,0); 
    25222522                return cat(c1,c2); 
    25232523        } 
    25242524  } 
    25252525  retregs = regmask(e->E1->Ety, TYnfunc); 
    25262526L1: 
    25272527  c1 = codelem(e->E1,&retregs,FALSE); 
    25282528  for (i = 0; 1; i++) 
    25292529  {     assert(i < arraysize(clib)); 
    25302530        if (clib[i][0] == e->Eoper) 
    25312531        {   c2 = callclib(e,clib[i][1],pretregs,0); 
    25322532            break;