Changeset 557

Show
Ignore:
Timestamp:
06/22/10 19:53:13 (4 years ago)
Author:
walter
Message:

64

Files:

Legend:

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

    r552 r557  
    985985typedef unsigned long SYMFLGS; 
    986986#if MARS 
    987 #define SYM_PREDEF_SZ 35 
     987#define SYM_PREDEF_SZ 40 
    988988#else 
    989989#define SYM_PREDEF_SZ 22 
  • branches/dmd-1.x/src/backend/cgcod.c

    r552 r557  
    15101510        case TYcptr: 
    15111511            return mAX; 
     1512 
    15121513        case TYfloat: 
    15131514        case TYifloat: 
     
    15221523        case TYhptr: 
    15231524            return mDX | mAX; 
     1525 
     1526        case TYcent: 
     1527        case TYucent: 
     1528            assert(I64); 
     1529            return mDX | mAX; 
     1530 
    15241531        case TYvptr: 
    15251532            return mDX | mBX; 
     1533 
    15261534        case TYdouble: 
    15271535        case TYdouble_alias: 
     
    15301538                return mST0; 
    15311539            return DOUBLEREGS; 
     1540 
    15321541        case TYllong: 
    15331542        case TYullong: 
    15341543            return I64 ? mAX : (I32 ? mDX | mAX : DOUBLEREGS); 
     1544 
    15351545        case TYldouble: 
    15361546        case TYildouble: 
  • branches/dmd-1.x/src/backend/cgreg.c

    r487 r557  
    11// Copyright (C) 1985-1998 by Symantec 
    2 // Copyright (C) 2000-2009 by Digital Mars 
     2// Copyright (C) 2000-2010 by Digital Mars 
    33// All Rights Reserved 
    44// http://www.digitalmars.com 
     
    6969    for (int i = 0; i < globsym.top; i++) 
    7070    {   unsigned sz; 
    71         symbol *s; 
    72  
    73         s = globsym.tab[i]; 
     71        symbol *s = globsym.tab[i]; 
    7472 
    7573        if (s->Srange) 
     
    8179            (sz = type_size(s->Stype)) == 0 || 
    8280            (tysize(s->ty()) == -1) || 
    83             (!I32 && sz > REGSIZE) || 
    84             (I32 && tyfloating(s->ty())) 
     81            (I16 && sz > REGSIZE) || 
     82            ((I32 || I64) && tyfloating(s->ty())) 
    8583           ) 
    8684        { 
     
    564562        cs.Iop ^= (sz == 1); 
    565563        c = getlvalue(&cs,e,keepmsk); 
    566         cs.Irm |= modregrm(0,s->Sreglsw,0); 
     564        cs.orReg(s->Sreglsw); 
    567565        c = gen(c,&cs); 
    568566        if (sz > REGSIZE) 
    569567        { 
    570             NEWREG(cs.Irm,s->Sregmsw); 
     568            cs.setReg(s->Sregmsw); 
    571569            getlvalue_msw(&cs); 
    572570            c = gen(c,&cs); 
     
    662660        cs.Iop ^= (sz == 1); 
    663661        c = getlvalue(&cs,e,keepmsk); 
    664         cs.Irm |= modregrm(0,s->Sreglsw,0); 
     662        cs.orReg(s->Sreglsw); 
    665663        c = gen(c,&cs); 
    666664        if (sz > REGSIZE) 
    667665        { 
    668             NEWREG(cs.Irm,s->Sregmsw); 
     666            cs.setReg(s->Sregmsw); 
    669667            getlvalue_msw(&cs); 
    670668            c = gen(c,&cs); 
     
    903901        } 
    904902 
    905         // For pointer types, try to pick index register first 
    906         static char seqidx[] = {BX,SI,DI,AX,CX,DX,BP,NOREG}; 
    907         // Otherwise, try to pick index registers last 
    908         static char sequence[] = {AX,CX,DX,BX,SI,DI,BP,NOREG}; 
    909 #if 0 
    910         static char seqlsw[] = {AX,BX,SI,NOREG}; 
    911         static char seqmsw[] = {CX,DX,DI}; 
    912 #else 
    913         static char seqlsw[] = {AX,BX,SI,DI,NOREG}; 
    914         static char seqmsw[] = {CX,DX}; 
    915 #endif 
    916903        char *pseq; 
     904        char *pseqmsw = NULL; 
    917905 
    918906        ty = s->ty(); 
     
    927915        #endif 
    928916 
    929         if (I32) 
    930             pseq = (sz == REGSIZE * 2) ? seqlsw : sequence; 
     917        if (I64) 
     918        { 
     919            if (sz == REGSIZE * 2) 
     920            { 
     921                static char seqmsw[] = {CX,DX,NOREG}; 
     922                static char seqlsw[] = {AX,BX,SI,DI,NOREG}; 
     923                pseq = seqlsw; 
     924                pseqmsw = seqmsw; 
     925            } 
     926            else 
     927            {   // R10 is reserved for the static link 
     928                static char sequence[] = {AX,CX,DX,SI,DI,R8,R9,R11,BX,R12,R13,R14,R15,BP,NOREG}; 
     929                pseq = sequence; 
     930            } 
     931        } 
     932        else if (I32) 
     933        { 
     934            if (sz == REGSIZE * 2) 
     935            { 
     936                static char seqlsw[] = {AX,BX,SI,DI,NOREG}; 
     937                static char seqmsw[] = {CX,DX,NOREG}; 
     938                pseq = seqlsw; 
     939                pseqmsw = seqmsw; 
     940            } 
     941            else 
     942            { 
     943                static char sequence[] = {AX,CX,DX,BX,SI,DI,BP,NOREG}; 
     944                pseq = sequence; 
     945            } 
     946        } 
    931947        else 
    932             pseq = typtr(ty) ? seqidx : sequence; 
     948        {   assert(I16); 
     949            if (typtr(ty)) 
     950            { 
     951                // For pointer types, try to pick index register first 
     952                static char seqidx[] = {BX,SI,DI,AX,CX,DX,BP,NOREG}; 
     953                pseq = seqidx; 
     954            } 
     955            else 
     956            { 
     957                // Otherwise, try to pick index registers last 
     958                static char sequence[] = {AX,CX,DX,BX,SI,DI,BP,NOREG}; 
     959                pseq = sequence; 
     960            } 
     961        } 
    933962 
    934963        u.benefit = 0; 
     
    9711000 
    9721001                    for (regj = 0; 1; regj++) 
    973                     {   if (regj == arraysize(seqmsw)) 
     1002                    { 
     1003                        regmsw = pseqmsw[regj]; 
     1004                        if (regmsw == NOREG) 
    9741005                            goto Ltried; 
    975                         regmsw = seqmsw[regj]; 
    9761006                        if (regmsw == reg) 
    9771007                            continue; 
     
    10071037 
    10081038    // See if any registers have become available that we can use. 
    1009     if (I32 && !flag && (mfuncreg & ~fregsaved) & ALLREGS && 
     1039    if ((I32 || I64) && !flag && (mfuncreg & ~fregsaved) & ALLREGS && 
    10101040        !(funcsym_p->Sflags & SFLexit)) 
    10111041    { 
  • branches/dmd-1.x/src/backend/cgsched.c

    r552 r557  
    154154 */ 
    155155 
    156 #define F       mPSW            // flags 
    157156#define EA      0x100000 
    158157#define R       0x200000        // register (reg of modregrm field) 
     
    160159#define B       0x800000        // it's a byte operation 
    161160#define C       0x1000000       // floating point flags 
    162 #define S       mST0            // floating point stack 
     161#define mMEM    0x2000000       // memory 
     162#define S       0x4000000       // floating point stack 
     163#define F       0x8000000       // flags 
    163164 
    164165static unsigned long oprw[256][2] = 
     
    13151316            if ((op2 & 0xF0) == 0x80)           // if Jxx instructions 
    13161317            { 
    1317                 ci->r = mPSW | N; 
     1318                ci->r = F | N; 
    13181319                ci->w = N; 
    13191320                goto Lret; 
  • branches/dmd-1.x/src/backend/code.h

    r552 r557  
    4545#define PSW     17 
    4646#define STACK   18      // top of stack 
    47 #define MEM     19      // memory 
    48 #define OTHER   20      // other things 
    49 #define ST0     21      // 8087 top of stack register 
    50 #define ST01    22      // top two 8087 registers; for complex types 
    51  
    52 #define NOREG   100     // no register 
     47#define ST0     19      // 8087 top of stack register 
     48#define ST01    20      // top two 8087 registers; for complex types 
     49 
     50#define NOREG   21     // no register 
    5351 
    5452#define AL      0 
     
    8280 
    8381#define mSTACK  (1 << STACK)    // 0x40000 
    84 #define mMEM    (1 << MEM)      // 0x80000 
    85 #define mOTHER  (1 << OTHER)    // 0x100000 
    8682 
    8783#define mST0    (1 << ST0)      // 0x200000 
     
    390386 
    391387    code() { Irex = 0; Isib = 0; }      // constructor 
     388 
     389    void orReg(unsigned reg) 
     390    {   if (reg & 8) 
     391            Irex |= REX_R; 
     392        Irm |= modregrm(0, reg & 7, 0); 
     393    } 
     394 
     395    void setReg(unsigned reg) 
     396    { 
     397        Irex &= ~REX_R; 
     398        Irm &= ~modregrm(0, 7, 0); 
     399        orReg(reg); 
     400    } 
    392401}; 
    393402 
  • branches/dmd-1.x/src/backend/machobj.c

    r428 r557  
    16861686 */ 
    16871687 
    1688 int elf_data_start(Symbol *sdata,int datasize,int seg) 
     1688int elf_data_start(Symbol *sdata, targ_size_t datasize, int seg) 
    16891689{ 
    16901690    targ_size_t alignbytes; 
  • branches/dmd-1.x/src/backend/optabgen.c

    r442 r557  
    764764                                 TYwchar_t,TYushort,TYenum,TYint,TYuint, 
    765765                                 TYlong,TYulong,TYllong,TYullong,TYdchar, 
    766                                  TYchar16 }; 
     766                                 TYchar16, TYcent, TYucent }; 
    767767    static tym_t _ref[]      = { TYnref,TYfref,TYref }; 
    768768#if TARGET_MAC 
     
    778778                                TYwchar_t, 
    779779#endif 
    780                                 TYdchar,TYullong,TYchar16 }; 
     780                                TYdchar,TYullong,TYucent,TYchar16 }; 
    781781    static tym_t _mptr[]    = { TYmemptr }; 
    782782    static tym_t _nullptr[] = { TYnullptr }; 
     
    827827"long long",    TYllong,        TYullong,  TYllong,     LLONGSIZE, 0x82,0x13, 
    828828"uns long long",TYullong,       TYullong,  TYllong,     LLONGSIZE, 0x86,0x23, 
     829"cent",         TYcent,         TYucent,   TYcent,      16,        0x82,0x13, 
     830"ucent",        TYucent,        TYucent,   TYcent,      16,        0x86,0x23, 
    829831"float",        TYfloat,        TYfloat,   TYfloat,     FLOATSIZE, 0x88,0x40, 
    830832"double",       TYdouble,       TYdouble,  TYdouble,    DOUBLESIZE,0x89,0x41, 
  • branches/dmd-1.x/src/backend/rtlsym.c

    r428 r557  
    4848    {   inited++; 
    4949 
     50        //printf("rtlsym_init()\n"); 
    5051#if MARS 
    5152        fregsaved = FREGSAVED; 
  • branches/dmd-1.x/src/backend/ty.h

    r442 r557  
    100100    TYnref              = 0x3A, // near reference 
    101101    TYfref              = 0x3B, // far reference 
    102     TYMAX               = 0x3C, 
     102 
     103    TYcent              = 0x3C, // 128 bit signed integer 
     104    TYucent             = 0x3D, // 128 bit unsigned integer 
     105 
     106    TYMAX               = 0x3E, 
    103107 
    104108#if MARS 
  • branches/dmd-1.x/src/tocsym.c

    r428 r557  
    142142    if (sym->Stype->Tmangle == mTYman_std && tyfunc(sym->Stype->Tty)) 
    143143    { 
    144         sprintf(id,"_imp__%s@%lu",n,type_paramsize(sym->Stype)); 
     144        sprintf(id,"_imp__%s@%lu",n,(unsigned long)type_paramsize(sym->Stype)); 
    145145    } 
    146146    else if (sym->Stype->Tmangle == mTYman_d) 
  • trunk/src/backend/cgcod.c

    r552 r557  
    15101510        case TYcptr: 
    15111511            return mAX; 
     1512 
    15121513        case TYfloat: 
    15131514        case TYifloat: 
     
    15221523        case TYhptr: 
    15231524            return mDX | mAX; 
     1525 
     1526        case TYcent: 
     1527        case TYucent: 
     1528            assert(I64); 
     1529            return mDX | mAX; 
     1530 
    15241531        case TYvptr: 
    15251532            return mDX | mBX; 
     1533 
    15261534        case TYdouble: 
    15271535        case TYdouble_alias: 
     
    15301538                return mST0; 
    15311539            return DOUBLEREGS; 
     1540 
    15321541        case TYllong: 
    15331542        case TYullong: 
    15341543            return I64 ? mAX : (I32 ? mDX | mAX : DOUBLEREGS); 
     1544 
    15351545        case TYldouble: 
    15361546        case TYildouble: 
  • trunk/src/backend/cgreg.c

    r487 r557  
    11// Copyright (C) 1985-1998 by Symantec 
    2 // Copyright (C) 2000-2009 by Digital Mars 
     2// Copyright (C) 2000-2010 by Digital Mars 
    33// All Rights Reserved 
    44// http://www.digitalmars.com 
     
    6969    for (int i = 0; i < globsym.top; i++) 
    7070    {   unsigned sz; 
    71         symbol *s; 
    72  
    73         s = globsym.tab[i]; 
     71        symbol *s = globsym.tab[i]; 
    7472 
    7573        if (s->Srange) 
     
    8179            (sz = type_size(s->Stype)) == 0 || 
    8280            (tysize(s->ty()) == -1) || 
    83             (!I32 && sz > REGSIZE) || 
    84             (I32 && tyfloating(s->ty())) 
     81            (I16 && sz > REGSIZE) || 
     82            ((I32 || I64) && tyfloating(s->ty())) 
    8583           ) 
    8684        { 
     
    564562        cs.Iop ^= (sz == 1); 
    565563        c = getlvalue(&cs,e,keepmsk); 
    566         cs.Irm |= modregrm(0,s->Sreglsw,0); 
     564        cs.orReg(s->Sreglsw); 
    567565        c = gen(c,&cs); 
    568566        if (sz > REGSIZE) 
    569567        { 
    570             NEWREG(cs.Irm,s->Sregmsw); 
     568            cs.setReg(s->Sregmsw); 
    571569            getlvalue_msw(&cs); 
    572570            c = gen(c,&cs); 
     
    662660        cs.Iop ^= (sz == 1); 
    663661        c = getlvalue(&cs,e,keepmsk); 
    664         cs.Irm |= modregrm(0,s->Sreglsw,0); 
     662        cs.orReg(s->Sreglsw); 
    665663        c = gen(c,&cs); 
    666664        if (sz > REGSIZE) 
    667665        { 
    668             NEWREG(cs.Irm,s->Sregmsw); 
     666            cs.setReg(s->Sregmsw); 
    669667            getlvalue_msw(&cs); 
    670668            c = gen(c,&cs); 
     
    903901        } 
    904902 
    905         // For pointer types, try to pick index register first 
    906         static char seqidx[] = {BX,SI,DI,AX,CX,DX,BP,NOREG}; 
    907         // Otherwise, try to pick index registers last 
    908         static char sequence[] = {AX,CX,DX,BX,SI,DI,BP,NOREG}; 
    909 #if 0 
    910         static char seqlsw[] = {AX,BX,SI,NOREG}; 
    911         static char seqmsw[] = {CX,DX,DI}; 
    912 #else 
    913         static char seqlsw[] = {AX,BX,SI,DI,NOREG}; 
    914         static char seqmsw[] = {CX,DX}; 
    915 #endif 
    916903        char *pseq; 
     904        char *pseqmsw = NULL; 
    917905 
    918906        ty = s->ty(); 
     
    927915        #endif 
    928916 
    929         if (I32) 
    930             pseq = (sz == REGSIZE * 2) ? seqlsw : sequence; 
     917        if (I64) 
     918        { 
     919            if (sz == REGSIZE * 2) 
     920            { 
     921                static char seqmsw[] = {CX,DX,NOREG}; 
     922                static char seqlsw[] = {AX,BX,SI,DI,NOREG}; 
     923                pseq = seqlsw; 
     924                pseqmsw = seqmsw; 
     925            } 
     926            else 
     927            {   // R10 is reserved for the static link 
     928                static char sequence[] = {AX,CX,DX,SI,DI,R8,R9,R11,BX,R12,R13,R14,R15,BP,NOREG}; 
     929                pseq = sequence; 
     930            } 
     931        } 
     932        else if (I32) 
     933        { 
     934            if (sz == REGSIZE * 2) 
     935            { 
     936                static char seqlsw[] = {AX,BX,SI,DI,NOREG}; 
     937                static char seqmsw[] = {CX,DX,NOREG}; 
     938                pseq = seqlsw; 
     939                pseqmsw = seqmsw; 
     940            } 
     941            else 
     942            { 
     943                static char sequence[] = {AX,CX,DX,BX,SI,DI,BP,NOREG}; 
     944                pseq = sequence; 
     945            } 
     946        } 
    931947        else 
    932             pseq = typtr(ty) ? seqidx : sequence; 
     948        {   assert(I16); 
     949            if (typtr(ty)) 
     950            { 
     951                // For pointer types, try to pick index register first 
     952                static char seqidx[] = {BX,SI,DI,AX,CX,DX,BP,NOREG}; 
     953                pseq = seqidx; 
     954            } 
     955            else 
     956            { 
     957                // Otherwise, try to pick index registers last 
     958                static char sequence[] = {AX,CX,DX,BX,SI,DI,BP,NOREG}; 
     959                pseq = sequence; 
     960            } 
     961        } 
    933962 
    934963        u.benefit = 0; 
     
    9711000 
    9721001                    for (regj = 0; 1; regj++) 
    973                     {   if (regj == arraysize(seqmsw)) 
     1002                    { 
     1003                        regmsw = pseqmsw[regj]; 
     1004                        if (regmsw == NOREG) 
    9741005                            goto Ltried; 
    975                         regmsw = seqmsw[regj]; 
    9761006                        if (regmsw == reg) 
    9771007                            continue; 
     
    10071037 
    10081038    // See if any registers have become available that we can use. 
    1009     if (I32 && !flag && (mfuncreg & ~fregsaved) & ALLREGS && 
     1039    if ((I32 || I64) && !flag && (mfuncreg & ~fregsaved) & ALLREGS && 
    10101040        !(funcsym_p->Sflags & SFLexit)) 
    10111041    { 
  • trunk/src/backend/cgsched.c

    r552 r557  
    154154 */ 
    155155 
    156 #define F       mPSW            // flags 
    157156#define EA      0x100000 
    158157#define R       0x200000        // register (reg of modregrm field) 
     
    160159#define B       0x800000        // it's a byte operation 
    161160#define C       0x1000000       // floating point flags 
    162 #define S       mST0            // floating point stack 
     161#define mMEM    0x2000000       // memory 
     162#define S       0x4000000       // floating point stack 
     163#define F       0x8000000       // flags 
    163164 
    164165static unsigned long oprw[256][2] = 
     
    13151316            if ((op2 & 0xF0) == 0x80)           // if Jxx instructions 
    13161317            { 
    1317                 ci->r = mPSW | N; 
     1318                ci->r = F | N; 
    13181319                ci->w = N; 
    13191320                goto Lret; 
  • trunk/src/backend/code.h

    r552 r557  
    4545#define PSW     17 
    4646#define STACK   18      // top of stack 
    47 #define MEM     19      // memory 
    48 #define OTHER   20      // other things 
    49 #define ST0     21      // 8087 top of stack register 
    50 #define ST01    22      // top two 8087 registers; for complex types 
    51  
    52 #define NOREG   100     // no register 
     47#define ST0     19      // 8087 top of stack register 
     48#define ST01    20      // top two 8087 registers; for complex types 
     49 
     50#define NOREG   21     // no register 
    5351 
    5452#define AL      0 
     
    8280 
    8381#define mSTACK  (1 << STACK)    // 0x40000 
    84 #define mMEM    (1 << MEM)      // 0x80000 
    85 #define mOTHER  (1 << OTHER)    // 0x100000 
    8682 
    8783#define mST0    (1 << ST0)      // 0x200000 
     
    390386 
    391387    code() { Irex = 0; Isib = 0; }      // constructor 
     388 
     389    void orReg(unsigned reg) 
     390    {   if (reg & 8) 
     391            Irex |= REX_R; 
     392        Irm |= modregrm(0, reg & 7, 0); 
     393    } 
     394 
     395    void setReg(unsigned reg) 
     396    { 
     397        Irex &= ~REX_R; 
     398        Irm &= ~modregrm(0, 7, 0); 
     399        orReg(reg); 
     400    } 
    392401}; 
    393402 
  • trunk/src/backend/machobj.c

    r428 r557  
    16861686 */ 
    16871687 
    1688 int elf_data_start(Symbol *sdata,int datasize,int seg) 
     1688int elf_data_start(Symbol *sdata, targ_size_t datasize, int seg) 
    16891689{ 
    16901690    targ_size_t alignbytes; 
  • trunk/src/backend/optabgen.c

    r442 r557  
    764764                                 TYwchar_t,TYushort,TYenum,TYint,TYuint, 
    765765                                 TYlong,TYulong,TYllong,TYullong,TYdchar, 
    766                                  TYchar16 }; 
     766                                 TYchar16, TYcent, TYucent }; 
    767767    static tym_t _ref[]      = { TYnref,TYfref,TYref }; 
    768768#if TARGET_MAC 
     
    778778                                TYwchar_t, 
    779779#endif 
    780                                 TYdchar,TYullong,TYchar16 }; 
     780                                TYdchar,TYullong,TYucent,TYchar16 }; 
    781781    static tym_t _mptr[]    = { TYmemptr }; 
    782782    static tym_t _nullptr[] = { TYnullptr }; 
     
    827827"long long",    TYllong,        TYullong,  TYllong,     LLONGSIZE, 0x82,0x13, 
    828828"uns long long",TYullong,       TYullong,  TYllong,     LLONGSIZE, 0x86,0x23, 
     829"cent",         TYcent,         TYucent,   TYcent,      16,        0x82,0x13, 
     830"ucent",        TYucent,        TYucent,   TYcent,      16,        0x86,0x23, 
    829831"float",        TYfloat,        TYfloat,   TYfloat,     FLOATSIZE, 0x88,0x40, 
    830832"double",       TYdouble,       TYdouble,  TYdouble,    DOUBLESIZE,0x89,0x41, 
  • trunk/src/backend/ty.h

    r442 r557  
    100100    TYnref              = 0x3A, // near reference 
    101101    TYfref              = 0x3B, // far reference 
    102     TYMAX               = 0x3C, 
     102 
     103    TYcent              = 0x3C, // 128 bit signed integer 
     104    TYucent             = 0x3D, // 128 bit unsigned integer 
     105 
     106    TYMAX               = 0x3E, 
    103107 
    104108#if MARS 
  • trunk/src/tocsym.c

    r455 r557  
    142142    if (sym->Stype->Tmangle == mTYman_std && tyfunc(sym->Stype->Tty)) 
    143143    { 
    144         sprintf(id,"_imp__%s@%lu",n,type_paramsize(sym->Stype)); 
     144        sprintf(id,"_imp__%s@%lu",n,(unsigned long)type_paramsize(sym->Stype)); 
    145145    } 
    146146    else if (sym->Stype->Tmangle == mTYman_d)