Changeset 557
- Timestamp:
- 06/22/10 19:53:13 (3 years ago)
- Files:
-
- branches/dmd-1.x/src/backend/cdef.h (modified) (1 diff)
- branches/dmd-1.x/src/backend/cgcod.c (modified) (3 diffs)
- branches/dmd-1.x/src/backend/cgreg.c (modified) (9 diffs)
- branches/dmd-1.x/src/backend/cgsched.c (modified) (3 diffs)
- branches/dmd-1.x/src/backend/code.h (modified) (3 diffs)
- branches/dmd-1.x/src/backend/machobj.c (modified) (1 diff)
- branches/dmd-1.x/src/backend/optabgen.c (modified) (3 diffs)
- branches/dmd-1.x/src/backend/rtlsym.c (modified) (1 diff)
- branches/dmd-1.x/src/backend/ty.h (modified) (1 diff)
- branches/dmd-1.x/src/tocsym.c (modified) (1 diff)
- trunk/src/backend/cgcod.c (modified) (3 diffs)
- trunk/src/backend/cgreg.c (modified) (9 diffs)
- trunk/src/backend/cgsched.c (modified) (3 diffs)
- trunk/src/backend/code.h (modified) (3 diffs)
- trunk/src/backend/machobj.c (modified) (1 diff)
- trunk/src/backend/optabgen.c (modified) (3 diffs)
- trunk/src/backend/ty.h (modified) (1 diff)
- trunk/src/tocsym.c (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
branches/dmd-1.x/src/backend/cdef.h
r552 r557 985 985 typedef unsigned long SYMFLGS; 986 986 #if MARS 987 #define SYM_PREDEF_SZ 35987 #define SYM_PREDEF_SZ 40 988 988 #else 989 989 #define SYM_PREDEF_SZ 22 branches/dmd-1.x/src/backend/cgcod.c
r552 r557 1510 1510 case TYcptr: 1511 1511 return mAX; 1512 1512 1513 case TYfloat: 1513 1514 case TYifloat: … … 1522 1523 case TYhptr: 1523 1524 return mDX | mAX; 1525 1526 case TYcent: 1527 case TYucent: 1528 assert(I64); 1529 return mDX | mAX; 1530 1524 1531 case TYvptr: 1525 1532 return mDX | mBX; 1533 1526 1534 case TYdouble: 1527 1535 case TYdouble_alias: … … 1530 1538 return mST0; 1531 1539 return DOUBLEREGS; 1540 1532 1541 case TYllong: 1533 1542 case TYullong: 1534 1543 return I64 ? mAX : (I32 ? mDX | mAX : DOUBLEREGS); 1544 1535 1545 case TYldouble: 1536 1546 case TYildouble: branches/dmd-1.x/src/backend/cgreg.c
r487 r557 1 1 // Copyright (C) 1985-1998 by Symantec 2 // Copyright (C) 2000-20 09by Digital Mars2 // Copyright (C) 2000-2010 by Digital Mars 3 3 // All Rights Reserved 4 4 // http://www.digitalmars.com … … 69 69 for (int i = 0; i < globsym.top; i++) 70 70 { unsigned sz; 71 symbol *s; 72 73 s = globsym.tab[i]; 71 symbol *s = globsym.tab[i]; 74 72 75 73 if (s->Srange) … … 81 79 (sz = type_size(s->Stype)) == 0 || 82 80 (tysize(s->ty()) == -1) || 83 ( !I32&& sz > REGSIZE) ||84 ( I32&& tyfloating(s->ty()))81 (I16 && sz > REGSIZE) || 82 ((I32 || I64) && tyfloating(s->ty())) 85 83 ) 86 84 { … … 564 562 cs.Iop ^= (sz == 1); 565 563 c = getlvalue(&cs,e,keepmsk); 566 cs. Irm |= modregrm(0,s->Sreglsw,0);564 cs.orReg(s->Sreglsw); 567 565 c = gen(c,&cs); 568 566 if (sz > REGSIZE) 569 567 { 570 NEWREG(cs.Irm,s->Sregmsw);568 cs.setReg(s->Sregmsw); 571 569 getlvalue_msw(&cs); 572 570 c = gen(c,&cs); … … 662 660 cs.Iop ^= (sz == 1); 663 661 c = getlvalue(&cs,e,keepmsk); 664 cs. Irm |= modregrm(0,s->Sreglsw,0);662 cs.orReg(s->Sreglsw); 665 663 c = gen(c,&cs); 666 664 if (sz > REGSIZE) 667 665 { 668 NEWREG(cs.Irm,s->Sregmsw);666 cs.setReg(s->Sregmsw); 669 667 getlvalue_msw(&cs); 670 668 c = gen(c,&cs); … … 903 901 } 904 902 905 // For pointer types, try to pick index register first906 static char seqidx[] = {BX,SI,DI,AX,CX,DX,BP,NOREG};907 // Otherwise, try to pick index registers last908 static char sequence[] = {AX,CX,DX,BX,SI,DI,BP,NOREG};909 #if 0910 static char seqlsw[] = {AX,BX,SI,NOREG};911 static char seqmsw[] = {CX,DX,DI};912 #else913 static char seqlsw[] = {AX,BX,SI,DI,NOREG};914 static char seqmsw[] = {CX,DX};915 #endif916 903 char *pseq; 904 char *pseqmsw = NULL; 917 905 918 906 ty = s->ty(); … … 927 915 #endif 928 916 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 } 931 947 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 } 933 962 934 963 u.benefit = 0; … … 971 1000 972 1001 for (regj = 0; 1; regj++) 973 { if (regj == arraysize(seqmsw)) 1002 { 1003 regmsw = pseqmsw[regj]; 1004 if (regmsw == NOREG) 974 1005 goto Ltried; 975 regmsw = seqmsw[regj];976 1006 if (regmsw == reg) 977 1007 continue; … … 1007 1037 1008 1038 // 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 && 1010 1040 !(funcsym_p->Sflags & SFLexit)) 1011 1041 { branches/dmd-1.x/src/backend/cgsched.c
r552 r557 154 154 */ 155 155 156 #define F mPSW // flags157 156 #define EA 0x100000 158 157 #define R 0x200000 // register (reg of modregrm field) … … 160 159 #define B 0x800000 // it's a byte operation 161 160 #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 163 164 164 165 static unsigned long oprw[256][2] = … … 1315 1316 if ((op2 & 0xF0) == 0x80) // if Jxx instructions 1316 1317 { 1317 ci->r = mPSW| N;1318 ci->r = F | N; 1318 1319 ci->w = N; 1319 1320 goto Lret; branches/dmd-1.x/src/backend/code.h
r552 r557 45 45 #define PSW 17 46 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 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 53 51 54 52 #define AL 0 … … 82 80 83 81 #define mSTACK (1 << STACK) // 0x40000 84 #define mMEM (1 << MEM) // 0x8000085 #define mOTHER (1 << OTHER) // 0x10000086 82 87 83 #define mST0 (1 << ST0) // 0x200000 … … 390 386 391 387 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 } 392 401 }; 393 402 branches/dmd-1.x/src/backend/machobj.c
r428 r557 1686 1686 */ 1687 1687 1688 int elf_data_start(Symbol *sdata, int datasize,int seg)1688 int elf_data_start(Symbol *sdata, targ_size_t datasize, int seg) 1689 1689 { 1690 1690 targ_size_t alignbytes; branches/dmd-1.x/src/backend/optabgen.c
r442 r557 764 764 TYwchar_t,TYushort,TYenum,TYint,TYuint, 765 765 TYlong,TYulong,TYllong,TYullong,TYdchar, 766 TYchar16 };766 TYchar16, TYcent, TYucent }; 767 767 static tym_t _ref[] = { TYnref,TYfref,TYref }; 768 768 #if TARGET_MAC … … 778 778 TYwchar_t, 779 779 #endif 780 TYdchar,TYullong,TY char16 };780 TYdchar,TYullong,TYucent,TYchar16 }; 781 781 static tym_t _mptr[] = { TYmemptr }; 782 782 static tym_t _nullptr[] = { TYnullptr }; … … 827 827 "long long", TYllong, TYullong, TYllong, LLONGSIZE, 0x82,0x13, 828 828 "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, 829 831 "float", TYfloat, TYfloat, TYfloat, FLOATSIZE, 0x88,0x40, 830 832 "double", TYdouble, TYdouble, TYdouble, DOUBLESIZE,0x89,0x41, branches/dmd-1.x/src/backend/rtlsym.c
r428 r557 48 48 { inited++; 49 49 50 //printf("rtlsym_init()\n"); 50 51 #if MARS 51 52 fregsaved = FREGSAVED; branches/dmd-1.x/src/backend/ty.h
r442 r557 100 100 TYnref = 0x3A, // near reference 101 101 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, 103 107 104 108 #if MARS branches/dmd-1.x/src/tocsym.c
r428 r557 142 142 if (sym->Stype->Tmangle == mTYman_std && tyfunc(sym->Stype->Tty)) 143 143 { 144 sprintf(id,"_imp__%s@%lu",n, type_paramsize(sym->Stype));144 sprintf(id,"_imp__%s@%lu",n,(unsigned long)type_paramsize(sym->Stype)); 145 145 } 146 146 else if (sym->Stype->Tmangle == mTYman_d) trunk/src/backend/cgcod.c
r552 r557 1510 1510 case TYcptr: 1511 1511 return mAX; 1512 1512 1513 case TYfloat: 1513 1514 case TYifloat: … … 1522 1523 case TYhptr: 1523 1524 return mDX | mAX; 1525 1526 case TYcent: 1527 case TYucent: 1528 assert(I64); 1529 return mDX | mAX; 1530 1524 1531 case TYvptr: 1525 1532 return mDX | mBX; 1533 1526 1534 case TYdouble: 1527 1535 case TYdouble_alias: … … 1530 1538 return mST0; 1531 1539 return DOUBLEREGS; 1540 1532 1541 case TYllong: 1533 1542 case TYullong: 1534 1543 return I64 ? mAX : (I32 ? mDX | mAX : DOUBLEREGS); 1544 1535 1545 case TYldouble: 1536 1546 case TYildouble: trunk/src/backend/cgreg.c
r487 r557 1 1 // Copyright (C) 1985-1998 by Symantec 2 // Copyright (C) 2000-20 09by Digital Mars2 // Copyright (C) 2000-2010 by Digital Mars 3 3 // All Rights Reserved 4 4 // http://www.digitalmars.com … … 69 69 for (int i = 0; i < globsym.top; i++) 70 70 { unsigned sz; 71 symbol *s; 72 73 s = globsym.tab[i]; 71 symbol *s = globsym.tab[i]; 74 72 75 73 if (s->Srange) … … 81 79 (sz = type_size(s->Stype)) == 0 || 82 80 (tysize(s->ty()) == -1) || 83 ( !I32&& sz > REGSIZE) ||84 ( I32&& tyfloating(s->ty()))81 (I16 && sz > REGSIZE) || 82 ((I32 || I64) && tyfloating(s->ty())) 85 83 ) 86 84 { … … 564 562 cs.Iop ^= (sz == 1); 565 563 c = getlvalue(&cs,e,keepmsk); 566 cs. Irm |= modregrm(0,s->Sreglsw,0);564 cs.orReg(s->Sreglsw); 567 565 c = gen(c,&cs); 568 566 if (sz > REGSIZE) 569 567 { 570 NEWREG(cs.Irm,s->Sregmsw);568 cs.setReg(s->Sregmsw); 571 569 getlvalue_msw(&cs); 572 570 c = gen(c,&cs); … … 662 660 cs.Iop ^= (sz == 1); 663 661 c = getlvalue(&cs,e,keepmsk); 664 cs. Irm |= modregrm(0,s->Sreglsw,0);662 cs.orReg(s->Sreglsw); 665 663 c = gen(c,&cs); 666 664 if (sz > REGSIZE) 667 665 { 668 NEWREG(cs.Irm,s->Sregmsw);666 cs.setReg(s->Sregmsw); 669 667 getlvalue_msw(&cs); 670 668 c = gen(c,&cs); … … 903 901 } 904 902 905 // For pointer types, try to pick index register first906 static char seqidx[] = {BX,SI,DI,AX,CX,DX,BP,NOREG};907 // Otherwise, try to pick index registers last908 static char sequence[] = {AX,CX,DX,BX,SI,DI,BP,NOREG};909 #if 0910 static char seqlsw[] = {AX,BX,SI,NOREG};911 static char seqmsw[] = {CX,DX,DI};912 #else913 static char seqlsw[] = {AX,BX,SI,DI,NOREG};914 static char seqmsw[] = {CX,DX};915 #endif916 903 char *pseq; 904 char *pseqmsw = NULL; 917 905 918 906 ty = s->ty(); … … 927 915 #endif 928 916 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 } 931 947 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 } 933 962 934 963 u.benefit = 0; … … 971 1000 972 1001 for (regj = 0; 1; regj++) 973 { if (regj == arraysize(seqmsw)) 1002 { 1003 regmsw = pseqmsw[regj]; 1004 if (regmsw == NOREG) 974 1005 goto Ltried; 975 regmsw = seqmsw[regj];976 1006 if (regmsw == reg) 977 1007 continue; … … 1007 1037 1008 1038 // 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 && 1010 1040 !(funcsym_p->Sflags & SFLexit)) 1011 1041 { trunk/src/backend/cgsched.c
r552 r557 154 154 */ 155 155 156 #define F mPSW // flags157 156 #define EA 0x100000 158 157 #define R 0x200000 // register (reg of modregrm field) … … 160 159 #define B 0x800000 // it's a byte operation 161 160 #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 163 164 164 165 static unsigned long oprw[256][2] = … … 1315 1316 if ((op2 & 0xF0) == 0x80) // if Jxx instructions 1316 1317 { 1317 ci->r = mPSW| N;1318 ci->r = F | N; 1318 1319 ci->w = N; 1319 1320 goto Lret; trunk/src/backend/code.h
r552 r557 45 45 #define PSW 17 46 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 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 53 51 54 52 #define AL 0 … … 82 80 83 81 #define mSTACK (1 << STACK) // 0x40000 84 #define mMEM (1 << MEM) // 0x8000085 #define mOTHER (1 << OTHER) // 0x10000086 82 87 83 #define mST0 (1 << ST0) // 0x200000 … … 390 386 391 387 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 } 392 401 }; 393 402 trunk/src/backend/machobj.c
r428 r557 1686 1686 */ 1687 1687 1688 int elf_data_start(Symbol *sdata, int datasize,int seg)1688 int elf_data_start(Symbol *sdata, targ_size_t datasize, int seg) 1689 1689 { 1690 1690 targ_size_t alignbytes; trunk/src/backend/optabgen.c
r442 r557 764 764 TYwchar_t,TYushort,TYenum,TYint,TYuint, 765 765 TYlong,TYulong,TYllong,TYullong,TYdchar, 766 TYchar16 };766 TYchar16, TYcent, TYucent }; 767 767 static tym_t _ref[] = { TYnref,TYfref,TYref }; 768 768 #if TARGET_MAC … … 778 778 TYwchar_t, 779 779 #endif 780 TYdchar,TYullong,TY char16 };780 TYdchar,TYullong,TYucent,TYchar16 }; 781 781 static tym_t _mptr[] = { TYmemptr }; 782 782 static tym_t _nullptr[] = { TYnullptr }; … … 827 827 "long long", TYllong, TYullong, TYllong, LLONGSIZE, 0x82,0x13, 828 828 "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, 829 831 "float", TYfloat, TYfloat, TYfloat, FLOATSIZE, 0x88,0x40, 830 832 "double", TYdouble, TYdouble, TYdouble, DOUBLESIZE,0x89,0x41, trunk/src/backend/ty.h
r442 r557 100 100 TYnref = 0x3A, // near reference 101 101 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, 103 107 104 108 #if MARS trunk/src/tocsym.c
r455 r557 142 142 if (sym->Stype->Tmangle == mTYman_std && tyfunc(sym->Stype->Tty)) 143 143 { 144 sprintf(id,"_imp__%s@%lu",n, type_paramsize(sym->Stype));144 sprintf(id,"_imp__%s@%lu",n,(unsigned long)type_paramsize(sym->Stype)); 145 145 } 146 146 else if (sym->Stype->Tmangle == mTYman_d)
