Changeset 552

Show
Ignore:
Timestamp:
06/21/10 05:05:31 (2 years ago)
Author:
walter
Message:

64 bit start

Files:

Legend:

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

    r501 r552  
    478478#define REGMASK         0xFFFF 
    479479 
     480#if TARGET_LINUX 
     481typedef targ_llong      targ_ptrdiff_t; /* ptrdiff_t for target machine  */ 
     482typedef targ_ullong     targ_size_t;    /* size_t for the target machine */ 
     483#else 
    480484typedef targ_int        targ_ptrdiff_t; /* ptrdiff_t for target machine  */ 
    481485typedef targ_uns        targ_size_t;    /* size_t for the target machine */ 
     486#endif 
    482487 
    483488/* Enable/disable various features 
     
    561566#endif 
    562567 
    563 #define REGMAX  10      // registers are numbered 0..10 
     568#define REGMAX  17      // registers are numbered 0..10 
    564569 
    565570typedef unsigned long   tym_t;          // data type big enough for type masks 
     
    860865struct elem; 
    861866 
    862 typedef unsigned short regm_t;  // Register mask type 
     867typedef unsigned regm_t;        // Register mask type 
    863868struct immed_t 
    864869{   targ_int value[REGMAX];     // immediate values in registers 
  • branches/dmd-1.x/src/backend/cg87.c

    r428 r552  
    15311531        else 
    15321532            cs.Iflags = 0; 
    1533         cs.Ijty = 0; 
     1533        cs.Irex = 0; 
    15341534        opr = oprev[op + 1]; 
    15351535        ty = tybasic(e->Ety); 
     
    18881888        c2 = loadea(e->E1,&cs,op1,op2,0,0,0); 
    18891889#else 
    1890         cs.Ijty = 0; 
     1890        cs.Irex = 0; 
    18911891        cs.Iflags = 0; 
    18921892        cs.Iop = op1; 
     
    19681968        assert(e->Eoper == OPeq); 
    19691969        cs.Iflags = ADDFWAIT() ? CFwait : 0; 
    1970         cs.Ijty = 0; 
     1970        cs.Irex = 0; 
    19711971        retregs = mST01 | (*pretregs & mPSW); 
    19721972        c1 = codelem(e->E2,&retregs,FALSE); 
     
    20052005        { 
    20062006            cs.Iflags = 0; 
    2007             cs.Ijty = 0; 
     2007            cs.Irex = 0; 
    20082008            cs.Iop = op1; 
    20092009            c2 = getlvalue(&cs, e->E1, 0); 
     
    31803180        cs.Iop = 0xD9; 
    31813181        cs.Iflags = CFoff; 
    3182         cs.Ijty = 0; 
     3182        cs.Irex = 0; 
    31833183        cs.IEVsym1 = rnddir; 
    31843184        cs.IFL1 = rnddir->Sfl; 
  • branches/dmd-1.x/src/backend/cgcod.c

    r493 r552  
    15321532        case TYllong: 
    15331533        case TYullong: 
    1534             return I32 ? mDX | mAX : DOUBLEREGS
     1534            return I64 ? mAX : (I32 ? mDX | mAX : DOUBLEREGS)
    15351535        case TYldouble: 
    15361536        case TYildouble: 
     
    16071607 
    16081608void freenode(elem *e) 
    1609 { register unsigned i; 
     1609{ unsigned i; 
    16101610 
    16111611  elem_debug(e); 
     
    19461946 
    19471947STATIC code * cse_save(regm_t ms) 
    1948 {   register unsigned reg,i,op; 
     1948{   unsigned reg,i,op; 
    19491949    code *c = NULL; 
    19501950    regm_t regm; 
     
    26692669{ 
    26702670    #define NUM 4 
    2671     #define SMAX 30 
     2671    #define SMAX 64 
    26722672    static char str[NUM][SMAX + 1]; 
    26732673    static int i; 
     
    26892689    s = p; 
    26902690    *p = 0; 
    2691     for (j = 0; j < 16; j++) 
     2691    for (j = 0; j < 23; j++) 
    26922692    { 
    26932693        if (mask[j] & rm) 
  • branches/dmd-1.x/src/backend/cgen.c

    r487 r552  
    274274    cs.Iop = op; 
    275275    cs.Iflags = 0; 
    276     cs.Ijty = 0; 
     276    cs.Irex = 0; 
    277277    if (op != JMP)                      /* if not already long branch   */ 
    278278          cs.Iflags = CFjmp16;          /* assume long branch for op = 0x7x */ 
     
    317317    cs.Irm = rm; 
    318318    cs.Iflags = 0; 
    319     cs.Ijty = 0; 
     319    cs.Irex = 0; 
    320320    cs.IFL2 = FL2; 
    321321    cs.IEVsym2 = s; 
     
    336336    cs.Irm = rm; 
    337337    cs.Iflags = CFoff; 
    338     cs.Ijty = 0; 
     338    cs.Irex = 0; 
    339339    cs.IFL2 = FLconst; 
    340340    cs.IEV2.Vuns = EV2; 
     
    355355    cs.Isib = rm >> 8; 
    356356    cs.Iflags = CFoff; 
    357     cs.Ijty = 0; 
     357    cs.Irex = 0; 
    358358    cs.IFL1 = FL1; 
    359359    cs.IEV1.Vuns = EV1; 
     
    374374    cs.Isib = rm >> 8; 
    375375    cs.Iflags = CFoff; 
    376     cs.Ijty = 0; 
     376    cs.Irex = 0; 
    377377    cs.IFL1 = FL1; 
    378378    cs.IEV1.Vuns = EV1; 
     
    399399            cs.Iop = LEA; 
    400400            cs.Iflags = 0; 
    401             cs.Ijty = 0; 
     401            cs.Irex = 0; 
    402402            buildEA(&cs,r2,r2,4,0); 
    403403            cs.Irm |= modregrm(0,r1,0); 
     
    428428    cs.Iop2 = ESClinnum; 
    429429    cs.Iflags = 0; 
    430     cs.Ijty = 0; 
     430    cs.Irex = 0; 
    431431    cs.IFL1 = 0; 
    432432    cs.IFL2 = 0; 
     
    466466        cs.Iop2 = ESCadjesp; 
    467467        cs.Iflags = 0; 
    468         cs.Ijty = 0; 
     468        cs.Irex = 0; 
    469469        cs.IEV2.Vint = offset; 
    470470        return gen(c,&cs); 
  • branches/dmd-1.x/src/backend/cgsched.c

    r487 r552  
    9191    if (config.target_scheduler >= TARGET_80486) 
    9292    { 
    93         *pc = peephole(*pc,0); 
     93        if (!I64) 
     94            *pc = peephole(*pc,0); 
    9495        if (I32)                        // forget about 16 bit code 
    9596        { 
     
    154155 
    155156#define F       mPSW            // flags 
    156 #define EA      0x10000 
    157 #define R       0x20000         // register (reg of modregrm field) 
    158 #define N       0x40000         // other things modified, not swappable 
    159 #define B       0x80000         // it's a byte operation 
    160 #define C       0x100000        // floating point flags 
     157#define EA      0x100000 
     158#define R       0x200000        // register (reg of modregrm field) 
     159#define N       0x400000        // other things modified, not swappable 
     160#define B       0x800000        // it's a byte operation 
     161#define C       0x1000000       // floating point flags 
    161162#define S       mST0            // floating point stack 
    162163 
     
    18751876 
    18761877        // If referring to distinct types, then no dependency 
    1877         if (c1->Ijty && c2->Ijty && c1->Ijty != c2->Ijty
     1878        if (c1->Irex && c2->Irex && c1->Irex != c2->Irex
    18781879            goto Lswap; 
    18791880 
  • branches/dmd-1.x/src/backend/cod1.c

    r493 r552  
    536536  assert(e); 
    537537  cs->Iflags = 0; 
    538   cs->Ijty = 0; 
     538  cs->Irex = 0; 
    539539  cs->Iop = op; 
    540540  if (I32 && op >= 0x100)               /* if 2 byte opcode             */ 
     
    724724  pcs->IFL1 = fl; 
    725725  pcs->Iflags = CFoff;                  /* only want offsets            */ 
    726   pcs->Ijty = 0; 
     726  pcs->Irex = 0; 
    727727  pcs->IEVoffset1 = 0; 
    728728  ty = e->Ety; 
     
    27072707  c = CNIL; 
    27082708  cs.Iflags = 0; 
    2709   cs.Ijty = 0; 
     2709  cs.Irex = 0; 
    27102710  switch (e->Eoper) 
    27112711  { 
     
    33013301  sz = tysize[tym]; 
    33023302  cs.Iflags = 0; 
    3303   cs.Ijty = 0; 
     3303  cs.Irex = 0; 
    33043304  if (*pretregs == mPSW) 
    33053305  { 
  • branches/dmd-1.x/src/backend/cod2.c

    r428 r552  
    149149  word = (I32 && sz == SHORTSIZE) ? CFopsize : 0; 
    150150  cs.Iflags = 0; 
    151   cs.Ijty = 0; 
     151  cs.Irex = 0; 
    152152  test = FALSE;                         /* assume we destroyed lvalue   */ 
    153153  cr = CNIL;                            /* initialize                   */ 
     
    383383            cs.Isib = modregrm(ss,reg1,reg2); 
    384384            cs.Iflags = CFoff; 
    385             cs.Ijty = 0; 
     385            cs.Irex = 0; 
    386386            cs.IFL1 = FLconst; 
    387387            cs.IEV1.Vuns = edisp->EV.Vuns; 
     
    740740    keepregs = 0; 
    741741    cs.Iflags = 0; 
    742     cs.Ijty = 0; 
     742    cs.Irex = 0; 
    743743    c = cg = cr = CNIL;                         // initialize 
    744744    e2 = e->E2; 
     
    16531653        cs.Iop2 = ESCmark2; 
    16541654        cs.Iflags = 0; 
    1655         cs.Ijty = 0; 
     1655        cs.Irex = 0; 
    16561656        c1 = cat(gen(CNIL,&cs),c1); 
    16571657        cs.Iop2 = ESCrelease2; 
     
    36293629 
    36303630  cs.Iflags = 0; 
    3631   cs.Ijty = 0; 
     3631  cs.Irex = 0; 
    36323632  assert(e->Eoper == OPvar || e->Eoper == OPrelconst); 
    36333633  fl = el_fl(e); 
     
    36673667        css.Irm = modregrm(0, reg, BPRM); 
    36683668        css.Iflags = CFgs; 
    3669         css.Ijty = 0; 
     3669        css.Irex = 0; 
    36703670        css.IFL1 = FLconst; 
    36713671        css.IEV1.Vuns = 0; 
     
    36773677            cs.Irm = modregrm(3,0,reg); 
    36783678            cs.Iflags = CFoff; 
    3679             css.Ijty = 0; 
     3679            css.Irex = 0; 
    36803680            cs.IFL2 = fl; 
    36813681            cs.IEVsym2 = e->EV.sp.Vsym; 
     
    36873687            cs.Irm = modregrm(0,reg,BPRM); 
    36883688            cs.Iflags = CFoff; 
    3689             css.Ijty = 0; 
     3689            css.Irex = 0; 
    36903690            cs.IFL1 = fl; 
    36913691            cs.IEVsym1 = e->EV.sp.Vsym; 
     
    43764376                cs.Iop2 = ESCmark; 
    43774377                cs.Iflags = 0; 
    4378                 cs.Ijty = 0; 
     4378                cs.Irex = 0; 
    43794379                c = gen(CNIL,&cs); 
    43804380                c = cat(c,codelem(e->E2,pretregs,FALSE)); 
     
    44144414    cs.Iop2 = ESCctor; 
    44154415    cs.Iflags = 0; 
    4416     cs.Ijty = 0; 
     4416    cs.Irex = 0; 
    44174417    cs.IFL1 = FLctor; 
    44184418    cs.IEV1.Vtor = e; 
     
    44464446    cs.Iop2 = ESCdtor; 
    44474447    cs.Iflags = 0; 
    4448     cs.Ijty = 0; 
     4448    cs.Irex = 0; 
    44494449    cs.IFL1 = FLdtor; 
    44504450    cs.IEV1.Vtor = e; 
  • branches/dmd-1.x/src/backend/cod3.c

    r487 r552  
    10321032    cs.Iop2 = ESCframeptr; 
    10331033    cs.Iflags = 0; 
    1034     cs.Ijty = 0; 
     1034    cs.Irex = 0; 
    10351035    cs.Irm = reg; 
    10361036    c1 = gen(cg,&cs); 
     
    39503950  { 
    39513951    case FLconst: 
    3952         assert(sizeof(targ_size_t) == 4); 
     3952        assert(sizeof(targ_size_t) == 4 || sizeof(targ_size_t) == 8); 
    39533953        ad = * (targ_size_t *) uev; 
    39543954    L1: 
  • branches/dmd-1.x/src/backend/cod4.c

    r487 r552  
    16851685  ce = CNIL; 
    16861686  cs.Iflags = (I32 && sz == SHORTSIZE) ? CFopsize : 0; 
    1687   cs.Ijty = 0; 
     1687  cs.Irex = 0; 
    16881688  if (sz > REGSIZE) 
    16891689        ce = gennop(ce); 
     
    20952095 
    20962096  cs.Iflags = 0; 
    2097   cs.Ijty = 0; 
     2097  cs.Irex = 0; 
    20982098 
    20992099  ce = gennop(CNIL); 
     
    28302830    cs.Irm = modregrm(3,0,reg); 
    28312831    cs.Iflags = 0; 
    2832     cs.Ijty = 0; 
     2832    cs.Irex = 0; 
    28332833    cs.IFL2 = FLconst; 
    28342834    cs.IEV2.Vuns = 16; 
  • branches/dmd-1.x/src/backend/code.h

    r487 r552  
    3333#define DI      7 
    3434 
    35 #define ES      9 
    36 #define PSW     10 
    37 #define STACK   11      // top of stack 
    38 #define MEM     12      // memory 
    39 #define OTHER   13      // other things 
    40 #define ST0     14      // 8087 top of stack register 
    41 #define ST01    15      // top two 8087 registers; for complex types 
     35#define R8      8 
     36#define R9      9 
     37#define R10     10 
     38#define R11     11 
     39#define R12     12 
     40#define R13     13 
     41#define R14     14 
     42#define R15     15 
     43 
     44#define ES      16 
     45#define PSW     17 
     46#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 
    4251 
    4352#define NOREG   100     // no register 
     
    6069#define mSI     0x40 
    6170#define mDI     0x80 
    62 #define mES     (1 << ES)       // 0x200 
    63 #define mPSW    (1 << PSW)      // 0x400 
    64  
    65 #define mSTACK  (1 << STACK)    // 0x800 
    66 #define mMEM    (1 << MEM)      // 0x1000 
    67 #define mOTHER  (1 << OTHER)    // 0x2000 
    68  
    69 #define mST0    (1 << ST0)      // 0x4000 
    70 #define mST01   (1 << ST01)     // 0x8000 
     71#define mR8     (1 << R8) 
     72#define mR9     (1 << R9) 
     73#define mR10    (1 << R10) 
     74#define mR11    (1 << R11) 
     75#define mR12    (1 << R12) 
     76#define mR13    (1 << R13) 
     77#define mR14    (1 << R14) 
     78#define mR15    (1 << R15) 
     79 
     80#define mES     (1 << ES)       // 0x10000 
     81#define mPSW    (1 << PSW)      // 0x20000 
     82 
     83#define mSTACK  (1 << STACK)    // 0x40000 
     84#define mMEM    (1 << MEM)      // 0x80000 
     85#define mOTHER  (1 << OTHER)    // 0x100000 
     86 
     87#define mST0    (1 << ST0)      // 0x200000 
     88#define mST01   (1 << ST01)     // 0x400000 
    7189 
    7290// Flags for getlvalue (must fit in regm_t) 
     
    213231#define NEWREG(x,r)             ((x)=((x)&~(7<<3))|((r)<<3)) 
    214232#define genorreg(c,t,f)         genregs((c),0x09,(f),(t)) 
     233 
     234#define REX     0x40            // REX prefix byte, OR'd with the following bits: 
     235#define REX_W   8               // 0 = default operand size, 1 = 64 bit operand size 
     236#define REX_R   4               // high bit of reg field of modregrm 
     237#define REX_X   2               // high bit of sib index reg 
     238#define REX_B   1               // high bit of rm field, sib base reg, or opcode reg 
    215239 
    216240/********************** 
     
    302326#endif 
    303327    struct 
    304     {   unsigned len; 
     328    {   size_t len; 
    305329        char *bytes; 
    306330    } as;                       // asm node (FLasm) 
     
    336360#define CFSEG   (CFes | CFss | CFds | CFcs | CFfs | CFgs) 
    337361 
    338     unsigned char Ijty;         // type of operand, 0 if unknown 
     362    unsigned char Irex;         // REX prefix 
    339363 
    340364    unsigned char Iop; 
     
    365389    void print();               // pretty-printer 
    366390 
    367     code() { Ijty = 0; Isib = 0; }      // constructor 
     391    code() { Irex = 0; Isib = 0; }      // constructor 
    368392}; 
    369393 
  • branches/dmd-1.x/src/backend/elfobj.c

    r428 r552  
    18211821 */ 
    18221822 
    1823 int elf_data_start(Symbol *sdata,int datasize,int seg) 
     1823int elf_data_start(Symbol *sdata, targ_size_t datasize, int seg) 
    18241824{ 
    18251825    targ_size_t alignbytes; 
     
    19731973    IDXSTR namidx; 
    19741974    int symtype,sectype; 
    1975     int size; 
     1975    targ_size_t size; 
    19761976 
    19771977    //dbg_printf("objextern('%s') %x\n",s->Sident,s->Svalue); 
  • branches/dmd-1.x/src/backend/global.h

    r457 r552  
    5252 */ 
    5353 
    54 CEXTERN const unsigned mask[16]; 
     54CEXTERN const unsigned mask[32]; 
    5555CEXTERN const unsigned long maskl[32]; 
    5656 
     
    448448 
    449449/* debug.c */ 
    450 CEXTERN const char __near *regstring[]; 
     450CEXTERN const char *regstring[]; 
    451451 
    452452void WRclass(enum SC c); 
     
    537537#endif 
    538538void elf_func_start(Symbol *sfunc); 
    539 int elf_data_start(Symbol *sdata,int datasize,int seg); 
     539int elf_data_start(Symbol *sdata, targ_size_t datasize, int seg); 
    540540void elf_func_term(Symbol *sfunc); 
    541541unsigned elf_addstr(Outbuffer *strtab, const char *); 
  • branches/dmd-1.x/src/backend/nteh.c

    r428 r552  
    419419        cs.Iop = 0x68; 
    420420        cs.Iflags = 0; 
    421         cs.Ijty = 0; 
     421        cs.Irex = 0; 
    422422        cs.IFL2 = FLconst; 
    423423        cs.IEV2.Vint = -2; 
     
    440440    cs.Iop = 0x68; 
    441441    cs.Iflags = 0; 
    442     cs.Ijty = 0; 
     442    cs.Irex = 0; 
    443443    cs.IFL2 = FLconst; 
    444444    cs.IEV2.Vint = -1; 
     
    475475        cs.Irm = modregrm(0,6,BPRM); 
    476476        cs.Iflags = CFfs; 
    477         cs.Ijty = 0; 
     477        cs.Irex = 0; 
    478478        cs.IFL1 = FLextern; 
    479479        cs.IEVsym1 = rtlsym[RTLSYM_EXCEPT_LIST]; 
     
    485485        cs.Irm = modregrm(0,DX,BPRM); 
    486486        cs.Iflags = CFfs; 
    487         cs.Ijty = 0; 
     487        cs.Irex = 0; 
    488488        cs.IFL1 = FLextern; 
    489489        cs.IEVsym1 = rtlsym[RTLSYM_EXCEPT_LIST]; 
     
    530530    cs.Irm = modregrm(2,reg,BPRM); 
    531531    cs.Iflags = 0; 
    532     cs.Ijty = 0; 
     532    cs.Irex = 0; 
    533533    cs.IFL1 = FLconst; 
    534534    // EBP offset of __context.prev 
     
    555555    cs.Irm = modregrm(2,SP,BPRM); 
    556556    cs.Iflags = 0; 
    557     cs.Ijty = 0; 
     557    cs.Irex = 0; 
    558558    cs.IFL1 = FLconst; 
    559559    // EBP offset of __context.esp 
     
    586586        cs.Irm = modregrm(2,AX,BPRM); 
    587587        cs.Iflags = 0; 
    588         cs.Ijty = 0; 
     588        cs.Irex = 0; 
    589589        cs.IFL1 = FLconst; 
    590590        // EBP offset of __context.info 
     
    693693        cs.Iop = 0x68; 
    694694        cs.Iflags = CFoff; 
    695         cs.Ijty = 0; 
     695        cs.Irex = 0; 
    696696        cs.IFL2 = FLextern; 
    697697        cs.IEVsym2 = rtlsym[RTLSYM_CPP_LONGJMP]; 
     
    724724        cs.Irm = modregrm(2,6,BPRM); 
    725725        cs.Iflags = 0; 
    726         cs.Ijty = 0; 
     726        cs.Irex = 0; 
    727727        cs.IFL1 = FLbprel; 
    728728        cs.IEVsym1 = nteh_contextsym(); 
     
    734734        cs.Iop = 0x68; 
    735735        cs.Iflags = CFoff; 
    736         cs.Ijty = 0; 
     736        cs.Irex = 0; 
    737737        cs.IFL2 = FLextern; 
    738738        cs.IEVsym2 = rtlsym[RTLSYM_LONGJMP]; 
     
    756756    cs.Iop = 0x68; 
    757757    cs.Iflags = 0; 
    758     cs.Ijty = 0; 
     758    cs.Irex = 0; 
    759759    cs.IFL2 = FLconst; 
    760760    cs.IEV2.Vint = flag; 
     
    811811    cs.Irm = modregrm(2,reg,BPRM); 
    812812    cs.Iflags = 0; 
    813     cs.Ijty = 0; 
     813    cs.Irex = 0; 
    814814    cs.IFL1 = FLconst; 
    815815    // EBP offset of __context.prev 
     
    935935    cs.Irm = modregrm(0,6,BPRM); 
    936936    cs.Iflags = CFfs; 
    937     cs.Ijty = 0; 
     937    cs.Irex = 0; 
    938938    cs.IFL1 = FLextern; 
    939939    cs.IEVsym1 = rtlsym[RTLSYM_EXCEPT_LIST]; 
     
    945945    cs.Irm = modregrm(0,DX,BPRM); 
    946946    cs.Iflags = CFfs; 
    947     cs.Ijty = 0; 
     947    cs.Irex = 0; 
    948948    cs.IFL1 = FLextern; 
    949949    cs.IEVsym1 = rtlsym[RTLSYM_EXCEPT_LIST]; 
     
    10041004    cs.Irm = modregrm(0,0,BPRM); 
    10051005    cs.Iflags = CFfs; 
    1006     cs.Ijty = 0; 
     1006    cs.Irex = 0; 
    10071007    cs.IFL1 = FLextern; 
    10081008    cs.IEVsym1 = rtlsym[RTLSYM_EXCEPT_LIST]; 
  • branches/dmd-1.x/src/backend/var.c

    r428 r552  
    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 
     
    174174 */ 
    175175 
    176 const unsigned mask[16] = 
    177         {1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,0x8000}; 
     176const unsigned mask[32] = 
     177        {1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,0x8000, 
     178         0x10000,0x20000,0x40000,0x80000,0x100000,0x200000,0x400000,0x800000, 
     179         0x1000000,0x2000000,0x4000000,0x8000000, 
     180         0x10000000,0x20000000,0x40000000,0x80000000}; 
    178181 
    179182#if 0 
     
    233236/* From debug.c */ 
    234237#if DEBUG 
    235 const char *regstring[16] = {"AX","CX","DX","BX","SP","BP","SI","DI", 
    236                             "8","ES","PSW","STACK","MEM","OTHER", 
     238const char *regstring[23] = {"AX","CX","DX","BX","SP","BP","SI","DI", 
     239                             "R8","R9","R10","R11","R12","R13","R14","R15", 
     240                             "ES","PSW","STACK","MEM","OTHER", 
    237241                                "ST0", "ST01"}; 
    238242#endif 
  • trunk/src/backend/cdef.h

    r501 r552  
    478478#define REGMASK         0xFFFF 
    479479 
     480#if TARGET_LINUX 
     481typedef targ_llong      targ_ptrdiff_t; /* ptrdiff_t for target machine  */ 
     482typedef targ_ullong     targ_size_t;    /* size_t for the target machine */ 
     483#else 
    480484typedef targ_int        targ_ptrdiff_t; /* ptrdiff_t for target machine  */ 
    481485typedef targ_uns        targ_size_t;    /* size_t for the target machine */ 
     486#endif 
    482487 
    483488/* Enable/disable various features 
     
    561566#endif 
    562567 
    563 #define REGMAX  10      // registers are numbered 0..10 
     568#define REGMAX  17      // registers are numbered 0..10 
    564569 
    565570typedef unsigned long   tym_t;          // data type big enough for type masks 
     
    860865struct elem; 
    861866 
    862 typedef unsigned short regm_t;  // Register mask type 
     867typedef unsigned regm_t;        // Register mask type 
    863868struct immed_t 
    864869{   targ_int value[REGMAX];     // immediate values in registers 
  • trunk/src/backend/cg87.c

    r428 r552  
    15311531        else 
    15321532            cs.Iflags = 0; 
    1533         cs.Ijty = 0; 
     1533        cs.Irex = 0; 
    15341534        opr = oprev[op + 1]; 
    15351535        ty = tybasic(e->Ety); 
     
    18881888        c2 = loadea(e->E1,&cs,op1,op2,0,0,0); 
    18891889#else 
    1890         cs.Ijty = 0; 
     1890        cs.Irex = 0; 
    18911891        cs.Iflags = 0; 
    18921892        cs.Iop = op1; 
     
    19681968        assert(e->Eoper == OPeq); 
    19691969        cs.Iflags = ADDFWAIT() ? CFwait : 0; 
    1970         cs.Ijty = 0; 
     1970        cs.Irex = 0; 
    19711971        retregs = mST01 | (*pretregs & mPSW); 
    19721972        c1 = codelem(e->E2,&retregs,FALSE); 
     
    20052005        { 
    20062006            cs.Iflags = 0; 
    2007             cs.Ijty = 0; 
     2007            cs.Irex = 0; 
    20082008            cs.Iop = op1; 
    20092009            c2 = getlvalue(&cs, e->E1, 0); 
     
    31803180        cs.Iop = 0xD9; 
    31813181        cs.Iflags = CFoff; 
    3182         cs.Ijty = 0; 
     3182        cs.Irex = 0; 
    31833183        cs.IEVsym1 = rnddir; 
    31843184        cs.IFL1 = rnddir->Sfl; 
  • trunk/src/backend/cgcod.c

    r490 r552  
    15321532        case TYllong: 
    15331533        case TYullong: 
    1534             return I32 ? mDX | mAX : DOUBLEREGS
     1534            return I64 ? mAX : (I32 ? mDX | mAX : DOUBLEREGS)
    15351535        case TYldouble: 
    15361536        case TYildouble: 
     
    16071607 
    16081608void freenode(elem *e) 
    1609 { register unsigned i; 
     1609{ unsigned i; 
    16101610 
    16111611  elem_debug(e); 
     
    19461946 
    19471947STATIC code * cse_save(regm_t ms) 
    1948 {   register unsigned reg,i,op; 
     1948{   unsigned reg,i,op; 
    19491949    code *c = NULL; 
    19501950    regm_t regm; 
     
    26692669{ 
    26702670    #define NUM 4 
    2671     #define SMAX 30 
     2671    #define SMAX 64 
    26722672    static char str[NUM][SMAX + 1]; 
    26732673    static int i; 
     
    26892689    s = p; 
    26902690    *p = 0; 
    2691     for (j = 0; j < 16; j++) 
     2691    for (j = 0; j < 23; j++) 
    26922692    { 
    26932693        if (mask[j] & rm) 
  • trunk/src/backend/cgen.c

    r487 r552  
    274274    cs.Iop = op; 
    275275    cs.Iflags = 0; 
    276     cs.Ijty = 0; 
     276    cs.Irex = 0; 
    277277    if (op != JMP)                      /* if not already long branch   */ 
    278278          cs.Iflags = CFjmp16;          /* assume long branch for op = 0x7x */ 
     
    317317    cs.Irm = rm; 
    318318    cs.Iflags = 0; 
    319     cs.Ijty = 0; 
     319    cs.Irex = 0; 
    320320    cs.IFL2 = FL2; 
    321321    cs.IEVsym2 = s; 
     
    336336    cs.Irm = rm; 
    337337    cs.Iflags = CFoff; 
    338     cs.Ijty = 0; 
     338    cs.Irex = 0; 
    339339    cs.IFL2 = FLconst; 
    340340    cs.IEV2.Vuns = EV2; 
     
    355355    cs.Isib = rm >> 8; 
    356356    cs.Iflags = CFoff; 
    357     cs.Ijty = 0; 
     357    cs.Irex = 0; 
    358358    cs.IFL1 = FL1; 
    359359    cs.IEV1.Vuns = EV1; 
     
    374374    cs.Isib = rm >> 8; 
    375375    cs.Iflags = CFoff; 
    376     cs.Ijty = 0; 
     376    cs.Irex = 0; 
    377377    cs.IFL1 = FL1; 
    378378    cs.IEV1.Vuns = EV1; 
     
    399399            cs.Iop = LEA; 
    400400            cs.Iflags = 0; 
    401             cs.Ijty = 0; 
     401            cs.Irex = 0; 
    402402            buildEA(&cs,r2,r2,4,0); 
    403403            cs.Irm |= modregrm(0,r1,0); 
     
    428428    cs.Iop2 = ESClinnum; 
    429429    cs.Iflags = 0; 
    430     cs.Ijty = 0; 
     430    cs.Irex = 0; 
    431431    cs.IFL1 = 0; 
    432432    cs.IFL2 = 0; 
     
    466466        cs.Iop2 = ESCadjesp; 
    467467        cs.Iflags = 0; 
    468         cs.Ijty = 0; 
     468        cs.Irex = 0; 
    469469        cs.IEV2.Vint = offset; 
    470470        return gen(c,&cs); 
  • trunk/src/backend/cgsched.c

    r487 r552  
    9191    if (config.target_scheduler >= TARGET_80486) 
    9292    { 
    93         *pc = peephole(*pc,0); 
     93        if (!I64) 
     94            *pc = peephole(*pc,0); 
    9495        if (I32)                        // forget about 16 bit code 
    9596        { 
     
    154155 
    155156#define F       mPSW            // flags 
    156 #define EA      0x10000 
    157 #define R       0x20000         // register (reg of modregrm field) 
    158 #define N       0x40000         // other things modified, not swappable 
    159 #define B       0x80000         // it's a byte operation 
    160 #define C       0x100000        // floating point flags 
     157#define EA      0x100000 
     158#define R       0x200000        // register (reg of modregrm field) 
     159#define N       0x400000        // other things modified, not swappable 
     160#define B       0x800000        // it's a byte operation 
     161#define C       0x1000000       // floating point flags 
    161162#define S       mST0            // floating point stack 
    162163 
     
    18751876 
    18761877        // If referring to distinct types, then no dependency 
    1877         if (c1->Ijty && c2->Ijty && c1->Ijty != c2->Ijty
     1878        if (c1->Irex && c2->Irex && c1->Irex != c2->Irex
    18781879            goto Lswap; 
    18791880 
  • trunk/src/backend/cod1.c

    r490 r552  
    536536  assert(e); 
    537537  cs->Iflags = 0; 
    538   cs->Ijty = 0; 
     538  cs->Irex = 0; 
    539539  cs->Iop = op; 
    540540  if (I32 && op >= 0x100)               /* if 2 byte opcode             */ 
     
    724724  pcs->IFL1 = fl; 
    725725  pcs->Iflags = CFoff;                  /* only want offsets            */ 
    726   pcs->Ijty = 0; 
     726  pcs->Irex = 0; 
    727727  pcs->IEVoffset1 = 0; 
    728728  ty = e->Ety; 
     
    27072707  c = CNIL; 
    27082708  cs.Iflags = 0; 
    2709   cs.Ijty = 0; 
     2709  cs.Irex = 0; 
    27102710  switch (e->Eoper) 
    27112711  { 
     
    33013301  sz = tysize[tym]; 
    33023302  cs.Iflags = 0; 
    3303   cs.Ijty = 0; 
     3303  cs.Irex = 0; 
    33043304  if (*pretregs == mPSW) 
    33053305  { 
  • trunk/src/backend/cod2.c

    r428 r552  
    149149  word = (I32 && sz == SHORTSIZE) ? CFopsize : 0; 
    150150  cs.Iflags = 0; 
    151   cs.Ijty = 0; 
     151  cs.Irex = 0; 
    152152  test = FALSE;                         /* assume we destroyed lvalue   */ 
    153153  cr = CNIL;                            /* initialize                   */ 
     
    383383            cs.Isib = modregrm(ss,reg1,reg2); 
    384384            cs.Iflags = CFoff; 
    385             cs.Ijty = 0; 
     385            cs.Irex = 0; 
    386386            cs.IFL1 = FLconst; 
    387387            cs.IEV1.Vuns = edisp->EV.Vuns; 
     
    740740    keepregs = 0; 
    741741    cs.Iflags = 0; 
    742     cs.Ijty = 0; 
     742    cs.Irex = 0; 
    743743    c = cg = cr = CNIL;                         // initialize 
    744744    e2 = e->E2; 
     
    16531653        cs.Iop2 = ESCmark2; 
    16541654        cs.Iflags = 0; 
    1655         cs.Ijty = 0; 
     1655        cs.Irex = 0; 
    16561656        c1 = cat(gen(CNIL,&cs),c1); 
    16571657        cs.Iop2 = ESCrelease2; 
     
    36293629 
    36303630  cs.Iflags = 0; 
    3631   cs.Ijty = 0; 
     3631  cs.Irex = 0; 
    36323632  assert(e->Eoper == OPvar || e->Eoper == OPrelconst); 
    36333633  fl = el_fl(e); 
     
    36673667        css.Irm = modregrm(0, reg, BPRM); 
    36683668        css.Iflags = CFgs; 
    3669         css.Ijty = 0; 
     3669        css.Irex = 0; 
    36703670        css.IFL1 = FLconst; 
    36713671        css.IEV1.Vuns = 0; 
     
    36773677            cs.Irm = modregrm(3,0,reg); 
    36783678            cs.Iflags = CFoff; 
    3679             css.Ijty = 0; 
     3679            css.Irex = 0; 
    36803680            cs.IFL2 = fl; 
    36813681            cs.IEVsym2 = e->EV.sp.Vsym; 
     
    36873687            cs.Irm = modregrm(0,reg,BPRM); 
    36883688            cs.Iflags = CFoff; 
    3689             css.Ijty = 0; 
     3689            css.Irex = 0; 
    36903690            cs.IFL1 = fl; 
    36913691            cs.IEVsym1 = e->EV.sp.Vsym; 
     
    43764376                cs.Iop2 = ESCmark; 
    43774377                cs.Iflags = 0; 
    4378                 cs.Ijty = 0; 
     4378                cs.Irex = 0; 
    43794379                c = gen(CNIL,&cs); 
    43804380                c = cat(c,codelem(e->E2,pretregs,FALSE)); 
     
    44144414    cs.Iop2 = ESCctor; 
    44154415    cs.Iflags = 0; 
    4416     cs.Ijty = 0; 
     4416    cs.Irex = 0; 
    44174417    cs.IFL1 = FLctor; 
    44184418    cs.IEV1.Vtor = e; 
     
    44464446    cs.Iop2 = ESCdtor; 
    44474447    cs.Iflags = 0; 
    4448     cs.Ijty = 0; 
     4448    cs.Irex = 0; 
    44494449    cs.IFL1 = FLdtor; 
    44504450    cs.IEV1.Vtor = e; 
  • trunk/src/backend/cod3.c

    r487 r552  
    10321032    cs.Iop2 = ESCframeptr; 
    10331033    cs.Iflags = 0; 
    1034     cs.Ijty = 0; 
     1034    cs.Irex = 0; 
    10351035    cs.Irm = reg; 
    10361036    c1 = gen(cg,&cs); 
     
    39503950  { 
    39513951    case FLconst: 
    3952         assert(sizeof(targ_size_t) == 4); 
     3952        assert(sizeof(targ_size_t) == 4 || sizeof(targ_size_t) == 8); 
    39533953        ad = * (targ_size_t *) uev; 
    39543954    L1: 
  • trunk/src/backend/cod4.c

    r487 r552  
    16851685  ce = CNIL; 
    16861686  cs.Iflags = (I32 && sz == SHORTSIZE) ? CFopsize : 0; 
    1687   cs.Ijty = 0; 
     1687  cs.Irex = 0; 
    16881688  if (sz > REGSIZE) 
    16891689        ce = gennop(ce); 
     
    20952095 
    20962096  cs.Iflags = 0; 
    2097   cs.Ijty = 0; 
     2097  cs.Irex = 0; 
    20982098 
    20992099  ce = gennop(CNIL); 
     
    28302830    cs.Irm = modregrm(3,0,reg); 
    28312831    cs.Iflags = 0; 
    2832     cs.Ijty = 0; 
     2832    cs.Irex = 0; 
    28332833    cs.IFL2 = FLconst; 
    28342834    cs.IEV2.Vuns = 16; 
  • trunk/src/backend/code.h

    r487 r552  
    3333#define DI      7 
    3434 
    35 #define ES      9 
    36 #define PSW     10 
    37 #define STACK   11      // top of stack 
    38 #define MEM     12      // memory 
    39 #define OTHER   13      // other things 
    40 #define ST0     14      // 8087 top of stack register 
    41 #define ST01    15      // top two 8087 registers; for complex types 
     35#define R8      8 
     36#define R9      9 
     37#define R10     10 
     38#define R11     11 
     39#define R12     12 
     40#define R13     13 
     41#define R14     14 
     42#define R15     15 
     43 
     44#define ES      16 
     45#define PSW     17 
     46#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 
    4251 
    4352#define NOREG   100     // no register 
     
    6069#define mSI     0x40 
    6170#define mDI     0x80 
    62 #define mES     (1 << ES)       // 0x200 
    63 #define mPSW    (1 << PSW)      // 0x400 
    64  
    65 #define mSTACK  (1 << STACK)    // 0x800 
    66 #define mMEM    (1 << MEM)      // 0x1000 
    67 #define mOTHER  (1 << OTHER)    // 0x2000 
    68  
    69 #define mST0    (1 << ST0)      // 0x4000 
    70 #define mST01   (1 << ST01)     // 0x8000 
     71#define mR8     (1 << R8) 
     72#define mR9     (1 << R9) 
     73#define mR10    (1 << R10) 
     74#define mR11    (1 << R11) 
     75#define mR12    (1 << R12) 
     76#define mR13    (1 << R13) 
     77#define mR14    (1 << R14) 
     78#define mR15    (1 << R15) 
     79 
     80#define mES     (1 << ES)       // 0x10000 
     81#define mPSW    (1 << PSW)      // 0x20000 
     82 
     83#define mSTACK  (1 << STACK)    // 0x40000 
     84#define mMEM    (1 << MEM)      // 0x80000 
     85#define mOTHER  (1 << OTHER)    // 0x100000 
     86 
     87#define mST0    (1 << ST0)      // 0x200000 
     88#define mST01   (1 << ST01)     // 0x400000 
    7189 
    7290// Flags for getlvalue (must fit in regm_t) 
     
    213231#define NEWREG(x,r)             ((x)=((x)&~(7<<3))|((r)<<3)) 
    214232#define genorreg(c,t,f)         genregs((c),0x09,(f),(t)) 
     233 
     234#define REX     0x40            // REX prefix byte, OR'd with the following bits: 
     235#define REX_W   8               // 0 = default operand size, 1 = 64 bit operand size 
     236#define REX_R   4               // high bit of reg field of modregrm 
     237#define REX_X   2               // high bit of sib index reg 
     238#define REX_B   1               // high bit of rm field, sib base reg, or opcode reg 
    215239 
    216240/********************** 
     
    302326#endif 
    303327    struct 
    304     {   unsigned len; 
     328    {   size_t len; 
    305329        char *bytes; 
    306330    } as;                       // asm node (FLasm) 
     
    336360#define CFSEG   (CFes | CFss | CFds | CFcs | CFfs | CFgs) 
    337361 
    338     unsigned char Ijty;         // type of operand, 0 if unknown 
     362    unsigned char Irex;         // REX prefix 
    339363 
    340364    unsigned char Iop; 
     
    365389    void print();               // pretty-printer 
    366390 
    367     code() { Ijty = 0; Isib = 0; }      // constructor 
     391    code() { Irex = 0; Isib = 0; }      // constructor 
    368392}; 
    369393 
  • trunk/src/backend/elfobj.c

    r428 r552  
    18211821 */ 
    18221822 
    1823 int elf_data_start(Symbol *sdata,int datasize,int seg) 
     1823int elf_data_start(Symbol *sdata, targ_size_t datasize, int seg) 
    18241824{ 
    18251825    targ_size_t alignbytes; 
     
    19731973    IDXSTR namidx; 
    19741974    int symtype,sectype; 
    1975     int size; 
     1975    targ_size_t size; 
    19761976 
    19771977    //dbg_printf("objextern('%s') %x\n",s->Sident,s->Svalue); 
  • trunk/src/backend/global.h

    r454 r552  
    5252 */ 
    5353 
    54 CEXTERN const unsigned mask[16]; 
     54CEXTERN const unsigned mask[32]; 
    5555CEXTERN const unsigned long maskl[32]; 
    5656 
     
    448448 
    449449/* debug.c */ 
    450 CEXTERN const char __near *regstring[]; 
     450CEXTERN const char *regstring[]; 
    451451 
    452452void WRclass(enum SC c); 
     
    537537#endif 
    538538void elf_func_start(Symbol *sfunc); 
    539 int elf_data_start(Symbol *sdata,int datasize,int seg); 
     539int elf_data_start(Symbol *sdata, targ_size_t datasize, int seg); 
    540540void elf_func_term(Symbol *sfunc); 
    541541unsigned elf_addstr(Outbuffer *strtab, const char *); 
  • trunk/src/backend/nteh.c

    r428 r552  
    419419        cs.Iop = 0x68; 
    420420        cs.Iflags = 0; 
    421         cs.Ijty = 0; 
     421        cs.Irex = 0; 
    422422        cs.IFL2 = FLconst; 
    423423        cs.IEV2.Vint = -2; 
     
    440440    cs.Iop = 0x68; 
    441441    cs.Iflags = 0; 
    442     cs.Ijty = 0; 
     442    cs.Irex = 0; 
    443443    cs.IFL2 = FLconst; 
    444444    cs.IEV2.Vint = -1; 
     
    475475        cs.Irm = modregrm(0,6,BPRM); 
    476476        cs.Iflags = CFfs; 
    477         cs.Ijty = 0; 
     477        cs.Irex = 0; 
    478478        cs.IFL1 = FLextern; 
    479479        cs.IEVsym1 = rtlsym[RTLSYM_EXCEPT_LIST]; 
     
    485485        cs.Irm = modregrm(0,DX,BPRM); 
    486486        cs.Iflags = CFfs; 
    487         cs.Ijty = 0; 
     487        cs.Irex = 0; 
    488488        cs.IFL1 = FLextern; 
    489489        cs.IEVsym1 = rtlsym[RTLSYM_EXCEPT_LIST]; 
     
    530530    cs.Irm = modregrm(2,reg,BPRM); 
    531531    cs.Iflags = 0; 
    532     cs.Ijty = 0; 
     532    cs.Irex = 0; 
    533533    cs.IFL1 = FLconst; 
    534534    // EBP offset of __context.prev 
     
    555555    cs.Irm = modregrm(2,SP,BPRM); 
    556556    cs.Iflags = 0; 
    557     cs.Ijty = 0; 
     557    cs.Irex = 0; 
    558558    cs.IFL1 = FLconst; 
    559559    // EBP offset of __context.esp 
     
    586586        cs.Irm = modregrm(2,AX,BPRM); 
    587587        cs.Iflags = 0; 
    588         cs.Ijty = 0; 
     588        cs.Irex = 0; 
    589589        cs.IFL1 = FLconst; 
    590590        // EBP offset of __context.info 
     
    693693        cs.Iop = 0x68; 
    694694        cs.Iflags = CFoff; 
    695         cs.Ijty = 0; 
     695        cs.Irex = 0; 
    696696        cs.IFL2 = FLextern; 
    697697        cs.IEVsym2 = rtlsym[RTLSYM_CPP_LONGJMP]; 
     
    724724        cs.Irm = modregrm(2,6,BPRM); 
    725725        cs.Iflags = 0; 
    726         cs.Ijty = 0; 
     726        cs.Irex = 0; 
    727727        cs.IFL1 = FLbprel; 
    728728        cs.IEVsym1 = nteh_contextsym(); 
     
    734734        cs.Iop = 0x68; 
    735735        cs.Iflags = CFoff; 
    736         cs.Ijty = 0; 
     736        cs.Irex = 0; 
    737737        cs.IFL2 = FLextern; 
    738738        cs.IEVsym2 = rtlsym[RTLSYM_LONGJMP]; 
     
    756756    cs.Iop = 0x68; 
    757757    cs.Iflags = 0; 
    758     cs.Ijty = 0; 
     758    cs.Irex = 0; 
    759759    cs.IFL2 = FLconst; 
    760760    cs.IEV2.Vint = flag; 
     
    811811    cs.Irm = modregrm(2,reg,BPRM); 
    812812    cs.Iflags = 0; 
    813     cs.Ijty = 0; 
     813    cs.Irex = 0; 
    814814    cs.IFL1 = FLconst; 
    815815    // EBP offset of __context.prev 
     
    935935    cs.Irm = modregrm(0,6,BPRM); 
    936936    cs.Iflags = CFfs; 
    937     cs.Ijty = 0; 
     937    cs.Irex = 0; 
    938938    cs.IFL1 = FLextern; 
    939939    cs.IEVsym1 = rtlsym[RTLSYM_EXCEPT_LIST]; 
     
    945945    cs.Irm = modregrm(0,DX,BPRM); 
    946946    cs.Iflags = CFfs; 
    947     cs.Ijty = 0; 
     947    cs.Irex = 0; 
    948948    cs.IFL1 = FLextern; 
    949949    cs.IEVsym1 = rtlsym[RTLSYM_EXCEPT_LIST]; 
     
    10041004    cs.Irm = modregrm(0,0,BPRM); 
    10051005    cs.Iflags = CFfs; 
    1006     cs.Ijty = 0; 
     1006    cs.Irex = 0; 
    10071007    cs.IFL1 = FLextern; 
    10081008    cs.IEVsym1 = rtlsym[RTLSYM_EXCEPT_LIST]; 
  • trunk/src/backend/var.c

    r428 r552  
    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 
     
    174174 */ 
    175175 
    176 const unsigned mask[16] = 
    177         {1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,0x8000}; 
     176const unsigned mask[32] = 
     177        {1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,0x8000, 
     178         0x10000,0x20000,0x40000,0x80000,0x100000,0x200000,0x400000,0x800000, 
     179         0x1000000,0x2000000,0x4000000,0x8000000, 
     180         0x10000000,0x20000000,0x40000000,0x80000000}; 
    178181 
    179182#if 0 
     
    233236/* From debug.c */ 
    234237#if DEBUG 
    235 const char *regstring[16] = {"AX","CX","DX","BX","SP","BP","SI","DI", 
    236                             "8","ES","PSW","STACK","MEM","OTHER", 
     238const char *regstring[23] = {"AX","CX","DX","BX","SP","BP","SI","DI", 
     239                             "R8","R9","R10","R11","R12","R13","R14","R15", 
     240                             "ES","PSW","STACK","MEM","OTHER", 
    237241                                "ST0", "ST01"}; 
    238242#endif