Changeset 627

Show
Ignore:
Timestamp:
08/25/10 17:37:50 (1 year ago)
Author:
walter
Message:

64 bit stuff

Files:

Legend:

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

    r622 r627  
    211211 */ 
    212212 
    213 code *push87() 
     213#undef push87 
     214 
     215#ifdef DEBUG 
     216code *push87(int line, const char *file); 
     217code *push87() { return push87(__LINE__,__FILE__); } 
     218#endif 
     219 
     220code *push87( 
     221#ifdef DEBUG 
     222        int line, const char *file 
     223#endif 
     224        ) 
     225#ifdef DEBUG 
     226#define push87() push87(__LINE__,__FILE__) 
     227#endif 
    214228{ 
    215229        code *c; 
     
    230244        else 
    231245        { 
    232                 if (NDPP) dbg_printf("push87(%d)\n",stackused); 
     246#ifdef DEBUG 
     247                if (NDPP) dbg_printf("push87(%s(%d): %d)\n", file, line, stackused); 
     248#endif 
    233249                stackused++; 
    234250                assert(stackused <= 8); 
     
    490506        floatreg = TRUE; 
    491507        reflocal = TRUE; 
    492         if ((opcode & 0xF8) == 0xD8) 
     508        if ((opcode & ~7) == 0xD8) 
    493509            c = genfwait(c); 
    494         unsigned grex = I64 ? (REX_W << 16) : 0; 
    495         return genc1(c,opcode,grex | modregxrm(2,reg,BPRM),FLfltreg,offset); 
     510        return genc1(c,opcode,modregxrm(2,reg,BPRM),FLfltreg,offset); 
    496511} 
    497512 
     
    842857            } 
    843858        } 
    844         assert(!(*pretregs & mST0) || (retregs & mST0)); 
     859        if (*pretregs & mST0 && retregs & XMMREGS) 
     860        { 
     861            assert(sz <= DOUBLESIZE); 
     862            unsigned mf = (sz == FLOATSIZE) ? MFfloat : MFdouble; 
     863            // MOVD floatreg,XMM? 
     864            unsigned reg = findreg(retregs); 
     865            c1 = genfltreg(c1,0xF20F11,reg - XMM0,0); 
     866            c2 = push87(); 
     867            c2 = genfltreg(c2,ESC(mf,1),0,0);                 // FLD float/double ptr fltreg 
     868        } 
     869        else if (retregs & mST0 && *pretregs & XMMREGS) 
     870        { 
     871            assert(sz <= DOUBLESIZE); 
     872            unsigned mf = (sz == FLOATSIZE) ? MFfloat : MFdouble; 
     873            // FSTP floatreg 
     874            pop87(); 
     875            c1 = genfltreg(c1,ESC(mf,1),3,0); 
     876            genfwait(c1); 
     877            // MOVD XMM?,floatreg 
     878            unsigned reg; 
     879            c2 = allocreg(pretregs,&reg,(sz == FLOATSIZE) ? TYfloat : TYdouble); 
     880            c2 = genfltreg(c2,0xF20F10,reg -XMM0,0); 
     881        } 
     882        else 
     883            assert(!(*pretregs & mST0) || (retregs & mST0)); 
    845884    } 
    846885    if (*pretregs & mST0) 
     
    17171756                    c = codelem(e->E1,&retregs,FALSE); 
    17181757                L3: 
    1719                     if (!I32 && e->Eoper != OPs16_d) 
     1758                    if (I16 && e->Eoper != OPs16_d) 
    17201759                    { 
    17211760                        /* MOV floatreg+2,reg   */ 
     
    33223361            c2 = genctst(c2,e,0);               // FTST 
    33233362    } 
     3363    else if ((tym == TYcfloat || tym == TYcdouble) && 
     3364             *pretregs & (mXMM0|mXMM1) && retregs & mST01) 
     3365    { 
     3366        if (*pretregs & mPSW && !(retregs & mPSW)) 
     3367            c1 = genctst(c1,e,0);               // FTST 
     3368        pop87(); 
     3369        c1 = genfltreg(c1, ESC(MFdouble,1),3,0); // FSTP floatreg 
     3370        genfwait(c1); 
     3371        c2 = getregs(mXMM0|mXMM1); 
     3372        c2 = genfltreg(c2, 0xF20F10, XMM1 - XMM0, 0);    // MOVD XMM1,floatreg 
     3373 
     3374        pop87(); 
     3375        c2 = genfltreg(c2, ESC(MFdouble,1),3,0); // FSTP floatreg 
     3376        genfwait(c2); 
     3377        c2 = genfltreg(c2, 0xF20F10, XMM0 - XMM0, 0);    // MOVD XMM0,floatreg 
     3378    } 
     3379    else if ((tym == TYcfloat || tym == TYcdouble) && 
     3380             retregs & (mXMM0|mXMM1) && *pretregs & mST01) 
     3381    { 
     3382        c1 = push87(); 
     3383        c1 = genfltreg(c1, 0xF20F11, XMM0-XMM0, 0);        // MOVD floatreg, XMM0 
     3384        genfltreg(c1, 0xDD, 0, 0);              // FLD double ptr floatreg 
     3385 
     3386        c2 = push87(); 
     3387        c2 = genfltreg(c2, 0xF20F11, XMM1-XMM0, 0);        // MOV floatreg, XMM1 
     3388        genfltreg(c2, 0xDD, 0, 0);              // FLD double ptr floatreg 
     3389 
     3390        if (*pretregs & mPSW) 
     3391            c2 = genctst(c2,e,0);               // FTST 
     3392    } 
    33243393    else 
    33253394    {   if (*pretregs & mPSW) 
     
    33993468    int i; 
    34003469 
     3470    //printf("cload87(e = %p, *pretregs = %s)\n", e, regm_str(*pretregs)); 
    34013471    sz = tysize[ty] / 2; 
    34023472    memset(&cs, 0, sizeof(cs)); 
  • branches/dmd-1.x/src/backend/cgcod.c

    r619 r627  
    394394            } 
    395395        } 
    396         if (I32 && !(config.flags4 & CFG4optimized)) 
     396        if (!I16 && !(config.flags4 & CFG4optimized)) 
    397397            break;                      // use the long conditional jmps 
    398398    } while (flag);                     // loop till no more bytes saved 
  • branches/dmd-1.x/src/backend/cgelem.c

    r618 r627  
    20732073 
    20742074            // See if we can replace with OPremquo 
    2075             if (sz == intsize) 
     2075            if (sz == REGSIZE && !I64)  // need cent and ucent working for I64 to work 
    20762076            { 
    20772077                // Don't do it if there are special code sequences in the 
  • branches/dmd-1.x/src/backend/cgen.c

    r606 r627  
    161161    ce = code_calloc(); 
    162162    *ce = *cs; 
     163    //printf("ce = %p %02x\n", ce, ce->Iop); 
     164    if (ce->Iop == LEA && ce->Irm == 4 && ce->Isib == 0x6D && ce->IFL1 == FLunde) *(char*)0=0; 
    163165    if (config.flags4 & CFG4optimized && 
    164166        ce->IFL2 == FLconst && 
     
    171173                { 0x00,0x08,0x10,0x18,0x20,0x28,0x30,0x38 }; 
    172174 
    173 //printf("replacing 0x%02x, val = x%lx\n",ce->Iop,ce->IEV2.Vlong); 
     175        //printf("replacing 0x%02x, val = x%lx\n",ce->Iop,ce->IEV2.Vlong); 
    174176        ce->Iop = regop[(ce->Irm & modregrm(0,7,0)) >> 3] | (ce->Iop & 1); 
    175177        code_newreg(ce, reg); 
     
    190192  ce = code_calloc(); 
    191193  ce->Iop = op; 
     194  assert(op != LEA); 
    192195  if (c) 
    193196  {     cstart = c; 
     
    219222  cstart = ce = code_calloc(); 
    220223  /*cxcalloc++;*/ 
     224  if (op == LEA && (rm & 0xFF) == 4 && (sib & 0xFF) == 0x6D) *(char*)0=0; 
    221225  ce->Iop = op; 
    222226  ce->Irm = rm; 
     
    387391    cs.IFL1 = FL1; 
    388392    cs.IEV1.Vsize_t = EV1; 
     393if (cs.Iop == LEA && cs.IFL1 == FLunde) *(char*)0=0; 
    389394    return gen(c,&cs); 
    390395} 
  • branches/dmd-1.x/src/backend/cod1.c

    r621 r627  
    18731873            c = allocreg(pretregs,&rreg,tym); /* allocate return regs   */ 
    18741874            if (sz > REGSIZE) 
    1875             {   unsigned msreg,lsreg; 
    1876                 unsigned msrreg,lsrreg; 
    1877  
    1878                 msreg = findregmsw(retregs); 
    1879                 lsreg = findreglsw(retregs); 
    1880                 msrreg = findregmsw(*pretregs); 
    1881                 lsrreg = findreglsw(*pretregs); 
     1875            { 
     1876                unsigned msreg = findregmsw(retregs); 
     1877                unsigned lsreg = findreglsw(retregs); 
     1878                unsigned msrreg = findregmsw(*pretregs); 
     1879                unsigned lsrreg = findreglsw(*pretregs); 
    18821880 
    18831881                ce = genmovreg(ce,msrreg,msreg); /* MOV msrreg,msreg    */ 
    18841882                ce = genmovreg(ce,lsrreg,lsreg); /* MOV lsrreg,lsreg    */ 
    18851883            } 
     1884            else if (retregs & XMMREGS) 
     1885            { 
     1886                reg = findreg(retregs & XMMREGS); 
     1887                // MOVD floatreg, XMM? 
     1888                ce = genfltreg(ce,0xF20F11,reg - XMM0,0); 
     1889                // MOV rreg,floatreg 
     1890                ce = genfltreg(ce,0x8B,rreg,0); 
     1891                if (sz == 8) 
     1892                    code_orrex(ce,REX_W); 
     1893            } 
    18861894            else 
    1887             {   reg = findreg(retregs & (mBP | ALLREGS)); 
     1895            { 
     1896                reg = findreg(retregs & (mBP | ALLREGS)); 
    18881897                ce = genmovreg(ce,rreg,reg);    /* MOV rreg,reg         */ 
    18891898            } 
     
    19131922code *callclib(elem *e,unsigned clib,regm_t *pretregs,regm_t keepmask) 
    19141923{ 
     1924    //printf("callclib(e = %p, clib = %d, *pretregs = %s, keepmask = %s\n", e, clib, regm_str(*pretregs), regm_str(keepmask)); 
     1925    //elem_print(e); 
    19151926#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_SOLARIS 
    19161927  static symbol lib[] = 
     
    20992110        #define INFfloat        2       // if this is floating point 
    21002111        #define INFwkdone       4       // if weak extern is already done 
     2112        #define INF64           8       // if 64 bit only 
    21012113    char push87;                        // # of pushes onto the 8087 stack 
    21022114    char pop87;                         // # of pops off of the 8087 stack 
     
    21762188    {mPSW, mPSW, 0,INF32|INFfloat,0,4}, // _Ccmp 
    21772189 
    2178     {mST0,mST0,0,INF32|INFfloat,2,1},   // _U64_LDBL 
    2179     {0,mDX|mAX,0,INF32|INFfloat,1,2},   // __LDBLULLNG 
     2190    {mST0,mST0,0,INF32|INF64|INFfloat,2,1},   // _U64_LDBL 
     2191    {0,mDX|mAX,0,INF32|INF64|INFfloat,1,2},   // __LDBLULLNG 
    21802192  }; 
    21812193 
     
    22202232  assert(clib < CLIBMAX); 
    22212233  symbol *s = &lib[clib]; 
    2222   assert(I32 || !(info[clib].flags & INF32)); 
     2234  if (I16) 
     2235        assert(!(info[clib].flags & (INF32 | INF64))); 
    22232236  code *cpop = CNIL; 
    22242237  code *c = getregs((~s->Sregsaved & (mES | mBP | ALLREGS)) & ~keepmask); // mask of regs destroyed 
     
    36113624            c = cat(c,ce); 
    36123625        } 
    3613         else if (sz == 8) 
    3614         {   code *c1; 
    3615             int i; 
    3616  
     3626        else if (sz == 8 || (I64 && sz == 2 * REGSIZE && !tyfloating(tym))) 
     3627        { 
    36173628            c = allocreg(&regm,&reg,TYoffset);  /* get a register */ 
    3618             i = sz - REGSIZE; 
     3629            int i = sz - REGSIZE; 
    36193630            ce = loadea(e,&cs,0x8B,reg,i,0,0);  /* MOV reg,data+6 */ 
    36203631            if (tyfloating(tym))                // TYdouble or TYdouble_alias 
     
    36243635            while ((i -= REGSIZE) >= 0) 
    36253636            { 
    3626                 c1 = loadea(e,&cs,0x0B,reg,i,regm,0);   // OR reg,data+i 
     3637                code *c1 = loadea(e,&cs,0x0B,reg,i,regm,0);   // OR reg,data+i 
    36273638                if (i == 0) 
    36283639                    c1->Iflags |= CFpsw;                // need the flags on last OR 
     
    36303641            } 
    36313642        } 
    3632         else if (sz == LNGDBLSIZE)                      // TYldouble 
     3643        else if (sz == tysize[TYldouble])               // TYldouble 
    36333644            return load87(e,0,pretregs,NULL,-1); 
    36343645        else 
     3646        { 
     3647#ifdef DEBUG 
     3648            elem_print(e); 
     3649#endif 
    36353650            assert(0); 
     3651        } 
    36363652        return c; 
    36373653  } 
  • branches/dmd-1.x/src/backend/cod2.c

    r601 r627  
    228228            if (reghasvalue(byte ? BYTEREGS : ALLREGS,value,&reg)) 
    229229                goto L11; 
    230             if (sz == 8
     230            if (sz == 8 && !I64
    231231            { 
    232232                assert(value == (int)value);    // sign extend imm32 
     
    410410            cs.Irm = modregrm(2,reg & 7,4); 
    411411            cs.Isib = modregrm(ss,reg1 & 7,reg2 & 7); 
     412            assert(reg2 != BP); 
    412413            cs.Iflags = CFoff; 
    413414            cs.Irex = 0; 
     
    777778    } 
    778779 
     780    //printf("cdmul(e = %p, *pretregs = %s)\n", e, regm_str(*pretregs)); 
    779781    keepregs = 0; 
    780782    cs.Iflags = 0; 
     
    10281030                    { 
    10291031#if 1 
    1030                         regm_t regm = byte ? BYTEREGS : ALLREGS;        // don't use EBP 
     1032                        regm_t regm = byte ? BYTEREGS : ALLREGS; 
     1033                        regm &= ~(mBP | mR13);                  // don't use EBP 
    10311034                        cl = codelem(e->E1,&regm,TRUE); 
    10321035                        unsigned r = findreg(regm); 
     
    10341037                        if (ss2) 
    10351038                        {   // Don't use EBP 
    1036                             resreg &= ~mBP
     1039                            resreg &= ~(mBP | mR13)
    10371040                            if (!resreg) 
    10381041                                resreg = retregs; 
     
    10421045                        c = gen2sib(CNIL,0x8D,grex | modregxrm(0,reg,4), 
    10431046                                              modregxrmx(ss,r,r)); 
     1047                        assert((r & 7) != BP); 
    10441048                        if (ss2) 
    10451049                        { 
     
    10891093                    { 
    10901094                                // Don't use EBP 
    1091                                 resreg &= ~mBP
     1095                                resreg &= ~(mBP | mR13)
    10921096                                if (!resreg) 
    10931097                                    resreg = retregs; 
    10941098                                cl = allocreg(&resreg,&reg,TYint); 
    10951099 
    1096                                 regm_t sregm = ALLREGS & ~resreg; 
     1100                                regm_t sregm = (ALLREGS & ~mR13) & ~resreg; 
    10971101                                cl = cat(cl,codelem(e->E1,&sregm,FALSE)); 
    10981102                                unsigned sreg = findreg(sregm); 
     
    11011105                                // SHL sreg,shift 
    11021106                                // LEA reg,[sreg * 8][reg] 
     1107                                assert((sreg & 7) != BP); 
     1108                                assert((reg & 7) != BP); 
    11031109                                c = gen2sib(CNIL,0x8D,grex | modregxrm(0,reg,4), 
    11041110                                                      modregxrmx(2,sreg,sreg)); 
     
    12091215    default:                                    /* OPconst and operators */ 
    12101216    L2: 
     1217        //printf("test2 %p, retregs = %s rretregs = %s resreg = %s\n", e, regm_str(retregs), regm_str(rretregs), regm_str(resreg)); 
    12111218        cl = codelem(e1,&retregs,FALSE);        /* eval left leaf       */ 
    12121219        cr = scodelem(e2,&rretregs,retregs,TRUE);       /* get rvalue   */ 
  • branches/dmd-1.x/src/backend/cod3.c

    r619 r627  
    34953495                if (!ci) 
    34963496                    goto Lbackjmp;      // couldn't find it 
    3497                 if (I32 || op == JMP || op == JMPS || op == JCXZ) 
     3497                if (!I16 || op == JMP || op == JMPS || op == JCXZ) 
    34983498                        c->IEVpointer2 = ad; 
    34993499                else                    /* else conditional             */ 
     
    35063506                                c->Iop = op ^ 1;        /* converse jmp */ 
    35073507                                c->Iflags &= ~CFjmp16; 
    3508                                 c->IEVpointer2 = I32 ? 5 : 3
     3508                                c->IEVpointer2 = I16 ? 3 : 5
    35093509                                cn = code_next(c); 
    35103510                                cn->Iop = JMP;          /* long jump    */ 
     
    35433543 
    35443544    for (size = 0; c; c = code_next(c)) 
    3545         size += calccodsize(c); 
     3545    { 
     3546        unsigned sz = calccodsize(c); 
     3547        //printf("off=%02x, sz = %d, code %p: op=%02x\n", size, sz, c, c->Iop); 
     3548        size += sz; 
     3549    } 
    35463550//printf("calcblksize(c = x%x) = %d\n", c, size); 
    35473551    return size; 
     
    50405044  {     unsigned rm = c->Irm; 
    50415045        printf(" rm=%02x=%d,%d,%d",rm,(rm>>6)&3,(rm>>3)&7,rm&7); 
    5042         if (I32 && issib(rm)) 
     5046        if (!I16 && issib(rm)) 
    50435047        {   unsigned char sib = c->Isib; 
    50445048            printf(" sib=%02x=%d,%d,%d",sib,(sib>>6)&3,(sib>>3)&7,sib&7); 
  • branches/dmd-1.x/src/backend/cod4.c

    r618 r627  
    28792879    if (!(!*pretregs || retregs)) 
    28802880    {   WROP(e->Eoper); 
    2881         printf(" *pretregs = x%x, retregs = x%x\n",*pretregs,retregs); 
     2881        printf(" *pretregs = %s, retregs = %s\n",regm_str(*pretregs),regm_str(retregs)); 
     2882        elem_print(e); 
    28822883    } 
    28832884#endif 
  • branches/dmd-1.x/src/backend/debug.c

    r618 r627  
    209209                    case TYdouble: 
    210210                        dbg_printf("%g ",e->EV.Vdouble); 
     211                        break; 
     212                    case TYcent: 
     213                    case TYucent: 
     214                        dbg_printf("%lld+%lld ", e->EV.Vcent.msw, e->EV.Vcent.lsw); 
    211215                        break; 
    212216                    default: 
  • branches/dmd-1.x/src/backend/el.c

    r618 r627  
    25642564                                goto nomatch; 
    25652565                        break; 
     2566                    case TYcent: 
     2567                    case TYucent: 
     2568                        if (n1->EV.Vcent.lsw != n2->EV.Vcent.lsw || 
     2569                            n1->EV.Vcent.msw != n2->EV.Vcent.msw) 
     2570                                goto nomatch; 
     2571                        break; 
    25662572                    case TYenum: 
    25672573                        if (PARSER) 
  • branches/dmd-1.x/src/backend/evalu8.c

    r618 r627  
    193193                    b = 0; 
    194194                    break; 
     195 
     196                case TYcent: 
     197                case TYucent: 
     198                    b = e->EV.Vcent.lsw || e->EV.Vcent.msw; 
     199                    break; 
     200 
    195201                default: 
    196202#ifdef DEBUG 
  • branches/dmd-1.x/src/todt.c

    r602 r627  
    287287            d = NULL; 
    288288            if (tb->ty == Tarray) 
    289                 dtdword(&d, dim); 
     289                dtsize_t(&d, dim); 
    290290            dtxoff(&d, s, 0, TYnptr); 
    291291            break; 
     
    402402            d = NULL; 
    403403            if (tb->ty == Tarray) 
    404                 dtdword(&d, dim); 
     404                dtsize_t(&d, dim); 
    405405            dtxoff(&d, s, 0, TYnptr); 
    406406            break; 
     
    544544    { 
    545545        case Tarray: 
    546             dtdword(pdt, len); 
     546            dtsize_t(pdt, len); 
    547547            pdt = dtabytes(pdt, TYnptr, 0, (len + 1) * sz, (char *)string); 
    548548            break; 
     
    600600        case Tarray: 
    601601            if (t->ty == Tarray) 
    602                 dtdword(pdt, elements->dim); 
     602                dtsize_t(pdt, elements->dim); 
    603603            if (d) 
    604604            { 
     
    612612            } 
    613613            else 
    614                 dtdword(pdt, 0); 
     614                dtsize_t(pdt, 0); 
    615615 
    616616            break; 
     
    790790    // Put in first two members, the vtbl[] and the monitor 
    791791    dtxoff(pdt, toVtblSymbol(), 0, TYnptr); 
    792     dtdword(pdt, 0);                    // monitor 
     792    dtsize_t(pdt, 0);                    // monitor 
    793793 
    794794    // Put in the rest 
  • trunk/src/backend/cg87.c

    r622 r627  
    211211 */ 
    212212 
    213 code *push87() 
     213#undef push87 
     214 
     215#ifdef DEBUG 
     216code *push87(int line, const char *file); 
     217code *push87() { return push87(__LINE__,__FILE__); } 
     218#endif 
     219 
     220code *push87( 
     221#ifdef DEBUG 
     222        int line, const char *file 
     223#endif 
     224        ) 
     225#ifdef DEBUG 
     226#define push87() push87(__LINE__,__FILE__) 
     227#endif 
    214228{ 
    215229        code *c; 
     
    230244        else 
    231245        { 
    232                 if (NDPP) dbg_printf("push87(%d)\n",stackused); 
     246#ifdef DEBUG 
     247                if (NDPP) dbg_printf("push87(%s(%d): %d)\n", file, line, stackused); 
     248#endif 
    233249                stackused++; 
    234250                assert(stackused <= 8); 
     
    490506        floatreg = TRUE; 
    491507        reflocal = TRUE; 
    492         if ((opcode & 0xF8) == 0xD8) 
     508        if ((opcode & ~7) == 0xD8) 
    493509            c = genfwait(c); 
    494         unsigned grex = I64 ? (REX_W << 16) : 0; 
    495         return genc1(c,opcode,grex | modregxrm(2,reg,BPRM),FLfltreg,offset); 
     510        return genc1(c,opcode,modregxrm(2,reg,BPRM),FLfltreg,offset); 
    496511} 
    497512 
     
    842857            } 
    843858        } 
    844         assert(!(*pretregs & mST0) || (retregs & mST0)); 
     859        if (*pretregs & mST0 && retregs & XMMREGS) 
     860        { 
     861            assert(sz <= DOUBLESIZE); 
     862            unsigned mf = (sz == FLOATSIZE) ? MFfloat : MFdouble; 
     863            // MOVD floatreg,XMM? 
     864            unsigned reg = findreg(retregs); 
     865            c1 = genfltreg(c1,0xF20F11,reg - XMM0,0); 
     866            c2 = push87(); 
     867            c2 = genfltreg(c2,ESC(mf,1),0,0);                 // FLD float/double ptr fltreg 
     868        } 
     869        else if (retregs & mST0 && *pretregs & XMMREGS) 
     870        { 
     871            assert(sz <= DOUBLESIZE); 
     872            unsigned mf = (sz == FLOATSIZE) ? MFfloat : MFdouble; 
     873            // FSTP floatreg 
     874            pop87(); 
     875            c1 = genfltreg(c1,ESC(mf,1),3,0); 
     876            genfwait(c1); 
     877            // MOVD XMM?,floatreg 
     878            unsigned reg; 
     879            c2 = allocreg(pretregs,&reg,(sz == FLOATSIZE) ? TYfloat : TYdouble); 
     880            c2 = genfltreg(c2,0xF20F10,reg -XMM0,0); 
     881        } 
     882        else 
     883            assert(!(*pretregs & mST0) || (retregs & mST0)); 
    845884    } 
    846885    if (*pretregs & mST0) 
     
    17171756                    c = codelem(e->E1,&retregs,FALSE); 
    17181757                L3: 
    1719                     if (!I32 && e->Eoper != OPs16_d) 
     1758                    if (I16 && e->Eoper != OPs16_d) 
    17201759                    { 
    17211760                        /* MOV floatreg+2,reg   */ 
     
    33223361            c2 = genctst(c2,e,0);               // FTST 
    33233362    } 
     3363    else if ((tym == TYcfloat || tym == TYcdouble) && 
     3364             *pretregs & (mXMM0|mXMM1) && retregs & mST01) 
     3365    { 
     3366        if (*pretregs & mPSW && !(retregs & mPSW)) 
     3367            c1 = genctst(c1,e,0);               // FTST 
     3368        pop87(); 
     3369        c1 = genfltreg(c1, ESC(MFdouble,1),3,0); // FSTP floatreg 
     3370        genfwait(c1); 
     3371        c2 = getregs(mXMM0|mXMM1); 
     3372        c2 = genfltreg(c2, 0xF20F10, XMM1 - XMM0, 0);    // MOVD XMM1,floatreg 
     3373 
     3374        pop87(); 
     3375        c2 = genfltreg(c2, ESC(MFdouble,1),3,0); // FSTP floatreg 
     3376        genfwait(c2); 
     3377        c2 = genfltreg(c2, 0xF20F10, XMM0 - XMM0, 0);    // MOVD XMM0,floatreg 
     3378    } 
     3379    else if ((tym == TYcfloat || tym == TYcdouble) && 
     3380             retregs & (mXMM0|mXMM1) && *pretregs & mST01) 
     3381    { 
     3382        c1 = push87(); 
     3383        c1 = genfltreg(c1, 0xF20F11, XMM0-XMM0, 0);        // MOVD floatreg, XMM0 
     3384        genfltreg(c1, 0xDD, 0, 0);              // FLD double ptr floatreg 
     3385 
     3386        c2 = push87(); 
     3387        c2 = genfltreg(c2, 0xF20F11, XMM1-XMM0, 0);        // MOV floatreg, XMM1 
     3388        genfltreg(c2, 0xDD, 0, 0);              // FLD double ptr floatreg 
     3389 
     3390        if (*pretregs & mPSW) 
     3391            c2 = genctst(c2,e,0);               // FTST 
     3392    } 
    33243393    else 
    33253394    {   if (*pretregs & mPSW) 
     
    33993468    int i; 
    34003469 
     3470    //printf("cload87(e = %p, *pretregs = %s)\n", e, regm_str(*pretregs)); 
    34013471    sz = tysize[ty] / 2; 
    34023472    memset(&cs, 0, sizeof(cs)); 
  • trunk/src/backend/cgcod.c

    r619 r627  
    394394            } 
    395395        } 
    396         if (I32 && !(config.flags4 & CFG4optimized)) 
     396        if (!I16 && !(config.flags4 & CFG4optimized)) 
    397397            break;                      // use the long conditional jmps 
    398398    } while (flag);                     // loop till no more bytes saved 
  • trunk/src/backend/cgelem.c

    r618 r627  
    20732073 
    20742074            // See if we can replace with OPremquo 
    2075             if (sz == intsize) 
     2075            if (sz == REGSIZE && !I64)  // need cent and ucent working for I64 to work 
    20762076            { 
    20772077                // Don't do it if there are special code sequences in the 
  • trunk/src/backend/cgen.c

    r605 r627  
    161161    ce = code_calloc(); 
    162162    *ce = *cs; 
     163    //printf("ce = %p %02x\n", ce, ce->Iop); 
     164    if (ce->Iop == LEA && ce->Irm == 4 && ce->Isib == 0x6D && ce->IFL1 == FLunde) *(char*)0=0; 
    163165    if (config.flags4 & CFG4optimized && 
    164166        ce->IFL2 == FLconst && 
     
    171173                { 0x00,0x08,0x10,0x18,0x20,0x28,0x30,0x38 }; 
    172174 
    173 //printf("replacing 0x%02x, val = x%lx\n",ce->Iop,ce->IEV2.Vlong); 
     175        //printf("replacing 0x%02x, val = x%lx\n",ce->Iop,ce->IEV2.Vlong); 
    174176        ce->Iop = regop[(ce->Irm & modregrm(0,7,0)) >> 3] | (ce->Iop & 1); 
    175177        code_newreg(ce, reg); 
     
    190192  ce = code_calloc(); 
    191193  ce->Iop = op; 
     194  assert(op != LEA); 
    192195  if (c) 
    193196  {     cstart = c; 
     
    219222  cstart = ce = code_calloc(); 
    220223  /*cxcalloc++;*/ 
     224  if (op == LEA && (rm & 0xFF) == 4 && (sib & 0xFF) == 0x6D) *(char*)0=0; 
    221225  ce->Iop = op; 
    222226  ce->Irm = rm; 
     
    387391    cs.IFL1 = FL1; 
    388392    cs.IEV1.Vsize_t = EV1; 
     393if (cs.Iop == LEA && cs.IFL1 == FLunde) *(char*)0=0; 
    389394    return gen(c,&cs); 
    390395} 
  • trunk/src/backend/cod1.c

    r621 r627  
    18731873            c = allocreg(pretregs,&rreg,tym); /* allocate return regs   */ 
    18741874            if (sz > REGSIZE) 
    1875             {   unsigned msreg,lsreg; 
    1876                 unsigned msrreg,lsrreg; 
    1877  
    1878                 msreg = findregmsw(retregs); 
    1879                 lsreg = findreglsw(retregs); 
    1880                 msrreg = findregmsw(*pretregs); 
    1881                 lsrreg = findreglsw(*pretregs); 
     1875            { 
     1876                unsigned msreg = findregmsw(retregs); 
     1877                unsigned lsreg = findreglsw(retregs); 
     1878                unsigned msrreg = findregmsw(*pretregs); 
     1879                unsigned lsrreg = findreglsw(*pretregs); 
    18821880 
    18831881                ce = genmovreg(ce,msrreg,msreg); /* MOV msrreg,msreg    */ 
    18841882                ce = genmovreg(ce,lsrreg,lsreg); /* MOV lsrreg,lsreg    */ 
    18851883            } 
     1884            else if (retregs & XMMREGS) 
     1885            { 
     1886                reg = findreg(retregs & XMMREGS); 
     1887                // MOVD floatreg, XMM? 
     1888                ce = genfltreg(ce,0xF20F11,reg - XMM0,0); 
     1889                // MOV rreg,floatreg 
     1890                ce = genfltreg(ce,0x8B,rreg,0); 
     1891                if (sz == 8) 
     1892                    code_orrex(ce,REX_W); 
     1893            } 
    18861894            else 
    1887             {   reg = findreg(retregs & (mBP | ALLREGS)); 
     1895            { 
     1896                reg = findreg(retregs & (mBP | ALLREGS)); 
    18881897                ce = genmovreg(ce,rreg,reg);    /* MOV rreg,reg         */ 
    18891898            } 
     
    19131922code *callclib(elem *e,unsigned clib,regm_t *pretregs,regm_t keepmask) 
    19141923{ 
     1924    //printf("callclib(e = %p, clib = %d, *pretregs = %s, keepmask = %s\n", e, clib, regm_str(*pretregs), regm_str(keepmask)); 
     1925    //elem_print(e); 
    19151926#if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_SOLARIS 
    19161927  static symbol lib[] = 
     
    20992110        #define INFfloat        2       // if this is floating point 
    21002111        #define INFwkdone       4       // if weak extern is already done 
     2112        #define INF64           8       // if 64 bit only 
    21012113    char push87;                        // # of pushes onto the 8087 stack 
    21022114    char pop87;                         // # of pops off of the 8087 stack 
     
    21762188    {mPSW, mPSW, 0,INF32|INFfloat,0,4}, // _Ccmp 
    21772189 
    2178     {mST0,mST0,0,INF32|INFfloat,2,1},   // _U64_LDBL 
    2179     {0,mDX|mAX,0,INF32|INFfloat,1,2},   // __LDBLULLNG 
     2190    {mST0,mST0,0,INF32|INF64|INFfloat,2,1},   // _U64_LDBL 
     2191    {0,mDX|mAX,0,INF32|INF64|INFfloat,1,2},   // __LDBLULLNG 
    21802192  }; 
    21812193 
     
    22202232  assert(clib < CLIBMAX); 
    22212233  symbol *s = &lib[clib]; 
    2222   assert(I32 || !(info[clib].flags & INF32)); 
     2234  if (I16) 
     2235        assert(!(info[clib].flags & (INF32 | INF64))); 
    22232236  code *cpop = CNIL; 
    22242237  code *c = getregs((~s->Sregsaved & (mES | mBP | ALLREGS)) & ~keepmask); // mask of regs destroyed 
     
    36113624            c = cat(c,ce); 
    36123625        } 
    3613         else if (sz == 8) 
    3614         {   code *c1; 
    3615             int i; 
    3616  
     3626        else if (sz == 8 || (I64 && sz == 2 * REGSIZE && !tyfloating(tym))) 
     3627        { 
    36173628            c = allocreg(&regm,&reg,TYoffset);  /* get a register */ 
    3618             i = sz - REGSIZE; 
     3629            int i = sz - REGSIZE; 
    36193630            ce = loadea(e,&cs,0x8B,reg,i,0,0);  /* MOV reg,data+6 */ 
    36203631            if (tyfloating(tym))                // TYdouble or TYdouble_alias 
     
    36243635            while ((i -= REGSIZE) >= 0) 
    36253636            { 
    3626                 c1 = loadea(e,&cs,0x0B,reg,i,regm,0);   // OR reg,data+i 
     3637                code *c1 = loadea(e,&cs,0x0B,reg,i,regm,0);   // OR reg,data+i 
    36273638                if (i == 0) 
    36283639                    c1->Iflags |= CFpsw;                // need the flags on last OR 
     
    36303641            } 
    36313642        } 
    3632         else if (sz == LNGDBLSIZE)                      // TYldouble 
     3643        else if (sz == tysize[TYldouble])               // TYldouble 
    36333644            return load87(e,0,pretregs,NULL,-1); 
    36343645        else 
     3646        { 
     3647#ifdef DEBUG 
     3648            elem_print(e); 
     3649#endif 
    36353650            assert(0); 
     3651        } 
    36363652        return c; 
    36373653  } 
  • trunk/src/backend/cod2.c

    r601 r627  
    228228            if (reghasvalue(byte ? BYTEREGS : ALLREGS,value,&reg)) 
    229229                goto L11; 
    230             if (sz == 8
     230            if (sz == 8 && !I64
    231231            { 
    232232                assert(value == (int)value);    // sign extend imm32 
     
    410410            cs.Irm = modregrm(2,reg & 7,4); 
    411411            cs.Isib = modregrm(ss,reg1 & 7,reg2 & 7); 
     412            assert(reg2 != BP); 
    412413            cs.Iflags = CFoff; 
    413414            cs.Irex = 0; 
     
    777778    } 
    778779 
     780    //printf("cdmul(e = %p, *pretregs = %s)\n", e, regm_str(*pretregs)); 
    779781    keepregs = 0; 
    780782    cs.Iflags = 0; 
     
    10281030                    { 
    10291031#if 1 
    1030                         regm_t regm = byte ? BYTEREGS : ALLREGS;        // don't use EBP 
     1032                        regm_t regm = byte ? BYTEREGS : ALLREGS; 
     1033                        regm &= ~(mBP | mR13);                  // don't use EBP 
    10311034                        cl = codelem(e->E1,&regm,TRUE); 
    10321035                        unsigned r = findreg(regm); 
     
    10341037                        if (ss2) 
    10351038                        {   // Don't use EBP 
    1036                             resreg &= ~mBP
     1039                            resreg &= ~(mBP | mR13)
    10371040                            if (!resreg) 
    10381041                                resreg = retregs; 
     
    10421045                        c = gen2sib(CNIL,0x8D,grex | modregxrm(0,reg,4), 
    10431046                                              modregxrmx(ss,r,r)); 
     1047                        assert((r & 7) != BP); 
    10441048                        if (ss2) 
    10451049                        { 
     
    10891093                    { 
    10901094                                // Don't use EBP 
    1091                                 resreg &= ~mBP
     1095                                resreg &= ~(mBP | mR13)
    10921096                                if (!resreg) 
    10931097                                    resreg = retregs; 
    10941098                                cl = allocreg(&resreg,&reg,TYint); 
    10951099 
    1096                                 regm_t sregm = ALLREGS & ~resreg; 
     1100                                regm_t sregm = (ALLREGS & ~mR13) & ~resreg; 
    10971101                                cl = cat(cl,codelem(e->E1,&sregm,FALSE)); 
    10981102                                unsigned sreg = findreg(sregm); 
     
    11011105                                // SHL sreg,shift 
    11021106                                // LEA reg,[sreg * 8][reg] 
     1107                                assert((sreg & 7) != BP); 
     1108                                assert((reg & 7) != BP); 
    11031109                                c = gen2sib(CNIL,0x8D,grex | modregxrm(0,reg,4), 
    11041110                                                      modregxrmx(2,sreg,sreg)); 
     
    12091215    default:                                    /* OPconst and operators */ 
    12101216    L2: 
     1217        //printf("test2 %p, retregs = %s rretregs = %s resreg = %s\n", e, regm_str(retregs), regm_str(rretregs), regm_str(resreg)); 
    12111218        cl = codelem(e1,&retregs,FALSE);        /* eval left leaf       */ 
    12121219        cr = scodelem(e2,&rretregs,retregs,TRUE);       /* get rvalue   */ 
  • trunk/src/backend/cod3.c

    r619 r627  
    34953495                if (!ci) 
    34963496                    goto Lbackjmp;      // couldn't find it 
    3497                 if (I32 || op == JMP || op == JMPS || op == JCXZ) 
     3497                if (!I16 || op == JMP || op == JMPS || op == JCXZ) 
    34983498                        c->IEVpointer2 = ad; 
    34993499                else                    /* else conditional             */ 
     
    35063506                                c->Iop = op ^ 1;        /* converse jmp */ 
    35073507                                c->Iflags &= ~CFjmp16; 
    3508                                 c->IEVpointer2 = I32 ? 5 : 3
     3508                                c->IEVpointer2 = I16 ? 3 : 5
    35093509                                cn = code_next(c); 
    35103510                                cn->Iop = JMP;          /* long jump    */ 
     
    35433543 
    35443544    for (size = 0; c; c = code_next(c)) 
    3545         size += calccodsize(c); 
     3545    { 
     3546        unsigned sz = calccodsize(c); 
     3547        //printf("off=%02x, sz = %d, code %p: op=%02x\n", size, sz, c, c->Iop); 
     3548        size += sz; 
     3549    } 
    35463550//printf("calcblksize(c = x%x) = %d\n", c, size); 
    35473551    return size; 
     
    50405044  {     unsigned rm = c->Irm; 
    50415045        printf(" rm=%02x=%d,%d,%d",rm,(rm>>6)&3,(rm>>3)&7,rm&7); 
    5042         if (I32 && issib(rm)) 
     5046        if (!I16 && issib(rm)) 
    50435047        {   unsigned char sib = c->Isib; 
    50445048            printf(" sib=%02x=%d,%d,%d",sib,(sib>>6)&3,(sib>>3)&7,sib&7); 
  • trunk/src/backend/cod4.c

    r618 r627  
    28792879    if (!(!*pretregs || retregs)) 
    28802880    {   WROP(e->Eoper); 
    2881         printf(" *pretregs = x%x, retregs = x%x\n",*pretregs,retregs); 
     2881        printf(" *pretregs = %s, retregs = %s\n",regm_str(*pretregs),regm_str(retregs)); 
     2882        elem_print(e); 
    28822883    } 
    28832884#endif 
  • trunk/src/backend/debug.c

    r618 r627  
    209209                    case TYdouble: 
    210210                        dbg_printf("%g ",e->EV.Vdouble); 
     211                        break; 
     212                    case TYcent: 
     213                    case TYucent: 
     214                        dbg_printf("%lld+%lld ", e->EV.Vcent.msw, e->EV.Vcent.lsw); 
    211215                        break; 
    212216                    default: 
  • trunk/src/backend/el.c

    r618 r627  
    25642564                                goto nomatch; 
    25652565                        break; 
     2566                    case TYcent: 
     2567                    case TYucent: 
     2568                        if (n1->EV.Vcent.lsw != n2->EV.Vcent.lsw || 
     2569                            n1->EV.Vcent.msw != n2->EV.Vcent.msw) 
     2570                                goto nomatch; 
     2571                        break; 
    25662572                    case TYenum: 
    25672573                        if (PARSER) 
  • trunk/src/backend/evalu8.c

    r618 r627  
    193193                    b = 0; 
    194194                    break; 
     195 
     196                case TYcent: 
     197                case TYucent: 
     198                    b = e->EV.Vcent.lsw || e->EV.Vcent.msw; 
     199                    break; 
     200 
    195201                default: 
    196202#ifdef DEBUG 
  • trunk/src/todt.c

    r602 r627  
    152152                    dim *= tsa->dim->toInteger(); 
    153153                } 
     154                //printf("sz = %d, dim = %d, vsz = %d\n", sz, dim, vsz); 
    154155                assert(sz == vsz || sz * dim <= vsz); 
    155156 
     
    283284            d = NULL; 
    284285            if (tb->ty == Tarray) 
    285                 dtdword(&d, dim); 
     286                dtsize_t(&d, dim); 
    286287            dtxoff(&d, s, 0, TYnptr); 
    287288            break; 
     
    398399            d = NULL; 
    399400            if (tb->ty == Tarray) 
    400                 dtdword(&d, dim); 
     401                dtsize_t(&d, dim); 
    401402            dtxoff(&d, s, 0, TYnptr); 
    402403            break; 
     
    540541    { 
    541542        case Tarray: 
    542             dtdword(pdt, len); 
     543            dtsize_t(pdt, len); 
    543544            pdt = dtabytes(pdt, TYnptr, 0, (len + 1) * sz, (char *)string); 
    544545            break; 
     
    596597        case Tarray: 
    597598            if (t->ty == Tarray) 
    598                 dtdword(pdt, elements->dim); 
     599                dtsize_t(pdt, elements->dim); 
    599600            if (d) 
    600601            { 
     
    608609            } 
    609610            else 
    610                 dtdword(pdt, 0); 
     611                dtsize_t(pdt, 0); 
    611612 
    612613            break; 
     
    696697                    dim *= tsa->dim->toInteger(); 
    697698                } 
     699 
    698700                for (size_t i = 0; i < dim; i++) 
    699701                { 
     
    788790    // Put in first two members, the vtbl[] and the monitor 
    789791    dtxoff(pdt, toVtblSymbol(), 0, TYnptr); 
    790     dtdword(pdt, 0);                    // monitor 
     792    dtsize_t(pdt, 0);                    // monitor 
    791793 
    792794    // Put in the rest