Changeset 627
- Timestamp:
- 08/25/10 17:37:50 (1 year ago)
- Files:
-
- branches/dmd-1.x/src/backend/cg87.c (modified) (7 diffs)
- branches/dmd-1.x/src/backend/cgcod.c (modified) (1 diff)
- branches/dmd-1.x/src/backend/cgelem.c (modified) (1 diff)
- branches/dmd-1.x/src/backend/cgen.c (modified) (5 diffs)
- branches/dmd-1.x/src/backend/cod1.c (modified) (8 diffs)
- branches/dmd-1.x/src/backend/cod2.c (modified) (9 diffs)
- branches/dmd-1.x/src/backend/cod3.c (modified) (4 diffs)
- branches/dmd-1.x/src/backend/cod4.c (modified) (1 diff)
- branches/dmd-1.x/src/backend/debug.c (modified) (1 diff)
- branches/dmd-1.x/src/backend/el.c (modified) (1 diff)
- branches/dmd-1.x/src/backend/evalu8.c (modified) (1 diff)
- branches/dmd-1.x/src/todt.c (modified) (6 diffs)
- trunk/src/backend/cg87.c (modified) (7 diffs)
- trunk/src/backend/cgcod.c (modified) (1 diff)
- trunk/src/backend/cgelem.c (modified) (1 diff)
- trunk/src/backend/cgen.c (modified) (5 diffs)
- trunk/src/backend/cod1.c (modified) (8 diffs)
- trunk/src/backend/cod2.c (modified) (9 diffs)
- trunk/src/backend/cod3.c (modified) (4 diffs)
- trunk/src/backend/cod4.c (modified) (1 diff)
- trunk/src/backend/debug.c (modified) (1 diff)
- trunk/src/backend/el.c (modified) (1 diff)
- trunk/src/backend/evalu8.c (modified) (1 diff)
- trunk/src/todt.c (modified) (8 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
branches/dmd-1.x/src/backend/cg87.c
r622 r627 211 211 */ 212 212 213 code *push87() 213 #undef push87 214 215 #ifdef DEBUG 216 code *push87(int line, const char *file); 217 code *push87() { return push87(__LINE__,__FILE__); } 218 #endif 219 220 code *push87( 221 #ifdef DEBUG 222 int line, const char *file 223 #endif 224 ) 225 #ifdef DEBUG 226 #define push87() push87(__LINE__,__FILE__) 227 #endif 214 228 { 215 229 code *c; … … 230 244 else 231 245 { 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 233 249 stackused++; 234 250 assert(stackused <= 8); … … 490 506 floatreg = TRUE; 491 507 reflocal = TRUE; 492 if ((opcode & 0xF8) == 0xD8)508 if ((opcode & ~7) == 0xD8) 493 509 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); 496 511 } 497 512 … … 842 857 } 843 858 } 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,®,(sz == FLOATSIZE) ? TYfloat : TYdouble); 880 c2 = genfltreg(c2,0xF20F10,reg -XMM0,0); 881 } 882 else 883 assert(!(*pretregs & mST0) || (retregs & mST0)); 845 884 } 846 885 if (*pretregs & mST0) … … 1717 1756 c = codelem(e->E1,&retregs,FALSE); 1718 1757 L3: 1719 if ( !I32&& e->Eoper != OPs16_d)1758 if (I16 && e->Eoper != OPs16_d) 1720 1759 { 1721 1760 /* MOV floatreg+2,reg */ … … 3322 3361 c2 = genctst(c2,e,0); // FTST 3323 3362 } 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 } 3324 3393 else 3325 3394 { if (*pretregs & mPSW) … … 3399 3468 int i; 3400 3469 3470 //printf("cload87(e = %p, *pretregs = %s)\n", e, regm_str(*pretregs)); 3401 3471 sz = tysize[ty] / 2; 3402 3472 memset(&cs, 0, sizeof(cs)); branches/dmd-1.x/src/backend/cgcod.c
r619 r627 394 394 } 395 395 } 396 if ( I32&& !(config.flags4 & CFG4optimized))396 if (!I16 && !(config.flags4 & CFG4optimized)) 397 397 break; // use the long conditional jmps 398 398 } while (flag); // loop till no more bytes saved branches/dmd-1.x/src/backend/cgelem.c
r618 r627 2073 2073 2074 2074 // 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 2076 2076 { 2077 2077 // Don't do it if there are special code sequences in the branches/dmd-1.x/src/backend/cgen.c
r606 r627 161 161 ce = code_calloc(); 162 162 *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; 163 165 if (config.flags4 & CFG4optimized && 164 166 ce->IFL2 == FLconst && … … 171 173 { 0x00,0x08,0x10,0x18,0x20,0x28,0x30,0x38 }; 172 174 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); 174 176 ce->Iop = regop[(ce->Irm & modregrm(0,7,0)) >> 3] | (ce->Iop & 1); 175 177 code_newreg(ce, reg); … … 190 192 ce = code_calloc(); 191 193 ce->Iop = op; 194 assert(op != LEA); 192 195 if (c) 193 196 { cstart = c; … … 219 222 cstart = ce = code_calloc(); 220 223 /*cxcalloc++;*/ 224 if (op == LEA && (rm & 0xFF) == 4 && (sib & 0xFF) == 0x6D) *(char*)0=0; 221 225 ce->Iop = op; 222 226 ce->Irm = rm; … … 387 391 cs.IFL1 = FL1; 388 392 cs.IEV1.Vsize_t = EV1; 393 if (cs.Iop == LEA && cs.IFL1 == FLunde) *(char*)0=0; 389 394 return gen(c,&cs); 390 395 } branches/dmd-1.x/src/backend/cod1.c
r621 r627 1873 1873 c = allocreg(pretregs,&rreg,tym); /* allocate return regs */ 1874 1874 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); 1882 1880 1883 1881 ce = genmovreg(ce,msrreg,msreg); /* MOV msrreg,msreg */ 1884 1882 ce = genmovreg(ce,lsrreg,lsreg); /* MOV lsrreg,lsreg */ 1885 1883 } 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 } 1886 1894 else 1887 { reg = findreg(retregs & (mBP | ALLREGS)); 1895 { 1896 reg = findreg(retregs & (mBP | ALLREGS)); 1888 1897 ce = genmovreg(ce,rreg,reg); /* MOV rreg,reg */ 1889 1898 } … … 1913 1922 code *callclib(elem *e,unsigned clib,regm_t *pretregs,regm_t keepmask) 1914 1923 { 1924 //printf("callclib(e = %p, clib = %d, *pretregs = %s, keepmask = %s\n", e, clib, regm_str(*pretregs), regm_str(keepmask)); 1925 //elem_print(e); 1915 1926 #if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_SOLARIS 1916 1927 static symbol lib[] = … … 2099 2110 #define INFfloat 2 // if this is floating point 2100 2111 #define INFwkdone 4 // if weak extern is already done 2112 #define INF64 8 // if 64 bit only 2101 2113 char push87; // # of pushes onto the 8087 stack 2102 2114 char pop87; // # of pops off of the 8087 stack … … 2176 2188 {mPSW, mPSW, 0,INF32|INFfloat,0,4}, // _Ccmp 2177 2189 2178 {mST0,mST0,0,INF32|INF float,2,1}, // _U64_LDBL2179 {0,mDX|mAX,0,INF32|INF float,1,2}, // __LDBLULLNG2190 {mST0,mST0,0,INF32|INF64|INFfloat,2,1}, // _U64_LDBL 2191 {0,mDX|mAX,0,INF32|INF64|INFfloat,1,2}, // __LDBLULLNG 2180 2192 }; 2181 2193 … … 2220 2232 assert(clib < CLIBMAX); 2221 2233 symbol *s = &lib[clib]; 2222 assert(I32 || !(info[clib].flags & INF32)); 2234 if (I16) 2235 assert(!(info[clib].flags & (INF32 | INF64))); 2223 2236 code *cpop = CNIL; 2224 2237 code *c = getregs((~s->Sregsaved & (mES | mBP | ALLREGS)) & ~keepmask); // mask of regs destroyed … … 3611 3624 c = cat(c,ce); 3612 3625 } 3613 else if (sz == 8) 3614 { code *c1; 3615 int i; 3616 3626 else if (sz == 8 || (I64 && sz == 2 * REGSIZE && !tyfloating(tym))) 3627 { 3617 3628 c = allocreg(®m,®,TYoffset); /* get a register */ 3618 i = sz - REGSIZE;3629 int i = sz - REGSIZE; 3619 3630 ce = loadea(e,&cs,0x8B,reg,i,0,0); /* MOV reg,data+6 */ 3620 3631 if (tyfloating(tym)) // TYdouble or TYdouble_alias … … 3624 3635 while ((i -= REGSIZE) >= 0) 3625 3636 { 3626 c 1 = loadea(e,&cs,0x0B,reg,i,regm,0); // OR reg,data+i3637 code *c1 = loadea(e,&cs,0x0B,reg,i,regm,0); // OR reg,data+i 3627 3638 if (i == 0) 3628 3639 c1->Iflags |= CFpsw; // need the flags on last OR … … 3630 3641 } 3631 3642 } 3632 else if (sz == LNGDBLSIZE)// TYldouble3643 else if (sz == tysize[TYldouble]) // TYldouble 3633 3644 return load87(e,0,pretregs,NULL,-1); 3634 3645 else 3646 { 3647 #ifdef DEBUG 3648 elem_print(e); 3649 #endif 3635 3650 assert(0); 3651 } 3636 3652 return c; 3637 3653 } branches/dmd-1.x/src/backend/cod2.c
r601 r627 228 228 if (reghasvalue(byte ? BYTEREGS : ALLREGS,value,®)) 229 229 goto L11; 230 if (sz == 8 )230 if (sz == 8 && !I64) 231 231 { 232 232 assert(value == (int)value); // sign extend imm32 … … 410 410 cs.Irm = modregrm(2,reg & 7,4); 411 411 cs.Isib = modregrm(ss,reg1 & 7,reg2 & 7); 412 assert(reg2 != BP); 412 413 cs.Iflags = CFoff; 413 414 cs.Irex = 0; … … 777 778 } 778 779 780 //printf("cdmul(e = %p, *pretregs = %s)\n", e, regm_str(*pretregs)); 779 781 keepregs = 0; 780 782 cs.Iflags = 0; … … 1028 1030 { 1029 1031 #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 1031 1034 cl = codelem(e->E1,®m,TRUE); 1032 1035 unsigned r = findreg(regm); … … 1034 1037 if (ss2) 1035 1038 { // Don't use EBP 1036 resreg &= ~ mBP;1039 resreg &= ~(mBP | mR13); 1037 1040 if (!resreg) 1038 1041 resreg = retregs; … … 1042 1045 c = gen2sib(CNIL,0x8D,grex | modregxrm(0,reg,4), 1043 1046 modregxrmx(ss,r,r)); 1047 assert((r & 7) != BP); 1044 1048 if (ss2) 1045 1049 { … … 1089 1093 { 1090 1094 // Don't use EBP 1091 resreg &= ~ mBP;1095 resreg &= ~(mBP | mR13); 1092 1096 if (!resreg) 1093 1097 resreg = retregs; 1094 1098 cl = allocreg(&resreg,®,TYint); 1095 1099 1096 regm_t sregm = ALLREGS& ~resreg;1100 regm_t sregm = (ALLREGS & ~mR13) & ~resreg; 1097 1101 cl = cat(cl,codelem(e->E1,&sregm,FALSE)); 1098 1102 unsigned sreg = findreg(sregm); … … 1101 1105 // SHL sreg,shift 1102 1106 // LEA reg,[sreg * 8][reg] 1107 assert((sreg & 7) != BP); 1108 assert((reg & 7) != BP); 1103 1109 c = gen2sib(CNIL,0x8D,grex | modregxrm(0,reg,4), 1104 1110 modregxrmx(2,sreg,sreg)); … … 1209 1215 default: /* OPconst and operators */ 1210 1216 L2: 1217 //printf("test2 %p, retregs = %s rretregs = %s resreg = %s\n", e, regm_str(retregs), regm_str(rretregs), regm_str(resreg)); 1211 1218 cl = codelem(e1,&retregs,FALSE); /* eval left leaf */ 1212 1219 cr = scodelem(e2,&rretregs,retregs,TRUE); /* get rvalue */ branches/dmd-1.x/src/backend/cod3.c
r619 r627 3495 3495 if (!ci) 3496 3496 goto Lbackjmp; // couldn't find it 3497 if ( I32|| op == JMP || op == JMPS || op == JCXZ)3497 if (!I16 || op == JMP || op == JMPS || op == JCXZ) 3498 3498 c->IEVpointer2 = ad; 3499 3499 else /* else conditional */ … … 3506 3506 c->Iop = op ^ 1; /* converse jmp */ 3507 3507 c->Iflags &= ~CFjmp16; 3508 c->IEVpointer2 = I 32 ? 5 : 3;3508 c->IEVpointer2 = I16 ? 3 : 5; 3509 3509 cn = code_next(c); 3510 3510 cn->Iop = JMP; /* long jump */ … … 3543 3543 3544 3544 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 } 3546 3550 //printf("calcblksize(c = x%x) = %d\n", c, size); 3547 3551 return size; … … 5040 5044 { unsigned rm = c->Irm; 5041 5045 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)) 5043 5047 { unsigned char sib = c->Isib; 5044 5048 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 2879 2879 if (!(!*pretregs || retregs)) 2880 2880 { 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); 2882 2883 } 2883 2884 #endif branches/dmd-1.x/src/backend/debug.c
r618 r627 209 209 case TYdouble: 210 210 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); 211 215 break; 212 216 default: branches/dmd-1.x/src/backend/el.c
r618 r627 2564 2564 goto nomatch; 2565 2565 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; 2566 2572 case TYenum: 2567 2573 if (PARSER) branches/dmd-1.x/src/backend/evalu8.c
r618 r627 193 193 b = 0; 194 194 break; 195 196 case TYcent: 197 case TYucent: 198 b = e->EV.Vcent.lsw || e->EV.Vcent.msw; 199 break; 200 195 201 default: 196 202 #ifdef DEBUG branches/dmd-1.x/src/todt.c
r602 r627 287 287 d = NULL; 288 288 if (tb->ty == Tarray) 289 dt dword(&d, dim);289 dtsize_t(&d, dim); 290 290 dtxoff(&d, s, 0, TYnptr); 291 291 break; … … 402 402 d = NULL; 403 403 if (tb->ty == Tarray) 404 dt dword(&d, dim);404 dtsize_t(&d, dim); 405 405 dtxoff(&d, s, 0, TYnptr); 406 406 break; … … 544 544 { 545 545 case Tarray: 546 dt dword(pdt, len);546 dtsize_t(pdt, len); 547 547 pdt = dtabytes(pdt, TYnptr, 0, (len + 1) * sz, (char *)string); 548 548 break; … … 600 600 case Tarray: 601 601 if (t->ty == Tarray) 602 dt dword(pdt, elements->dim);602 dtsize_t(pdt, elements->dim); 603 603 if (d) 604 604 { … … 612 612 } 613 613 else 614 dt dword(pdt, 0);614 dtsize_t(pdt, 0); 615 615 616 616 break; … … 790 790 // Put in first two members, the vtbl[] and the monitor 791 791 dtxoff(pdt, toVtblSymbol(), 0, TYnptr); 792 dt dword(pdt, 0); // monitor792 dtsize_t(pdt, 0); // monitor 793 793 794 794 // Put in the rest trunk/src/backend/cg87.c
r622 r627 211 211 */ 212 212 213 code *push87() 213 #undef push87 214 215 #ifdef DEBUG 216 code *push87(int line, const char *file); 217 code *push87() { return push87(__LINE__,__FILE__); } 218 #endif 219 220 code *push87( 221 #ifdef DEBUG 222 int line, const char *file 223 #endif 224 ) 225 #ifdef DEBUG 226 #define push87() push87(__LINE__,__FILE__) 227 #endif 214 228 { 215 229 code *c; … … 230 244 else 231 245 { 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 233 249 stackused++; 234 250 assert(stackused <= 8); … … 490 506 floatreg = TRUE; 491 507 reflocal = TRUE; 492 if ((opcode & 0xF8) == 0xD8)508 if ((opcode & ~7) == 0xD8) 493 509 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); 496 511 } 497 512 … … 842 857 } 843 858 } 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,®,(sz == FLOATSIZE) ? TYfloat : TYdouble); 880 c2 = genfltreg(c2,0xF20F10,reg -XMM0,0); 881 } 882 else 883 assert(!(*pretregs & mST0) || (retregs & mST0)); 845 884 } 846 885 if (*pretregs & mST0) … … 1717 1756 c = codelem(e->E1,&retregs,FALSE); 1718 1757 L3: 1719 if ( !I32&& e->Eoper != OPs16_d)1758 if (I16 && e->Eoper != OPs16_d) 1720 1759 { 1721 1760 /* MOV floatreg+2,reg */ … … 3322 3361 c2 = genctst(c2,e,0); // FTST 3323 3362 } 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 } 3324 3393 else 3325 3394 { if (*pretregs & mPSW) … … 3399 3468 int i; 3400 3469 3470 //printf("cload87(e = %p, *pretregs = %s)\n", e, regm_str(*pretregs)); 3401 3471 sz = tysize[ty] / 2; 3402 3472 memset(&cs, 0, sizeof(cs)); trunk/src/backend/cgcod.c
r619 r627 394 394 } 395 395 } 396 if ( I32&& !(config.flags4 & CFG4optimized))396 if (!I16 && !(config.flags4 & CFG4optimized)) 397 397 break; // use the long conditional jmps 398 398 } while (flag); // loop till no more bytes saved trunk/src/backend/cgelem.c
r618 r627 2073 2073 2074 2074 // 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 2076 2076 { 2077 2077 // Don't do it if there are special code sequences in the trunk/src/backend/cgen.c
r605 r627 161 161 ce = code_calloc(); 162 162 *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; 163 165 if (config.flags4 & CFG4optimized && 164 166 ce->IFL2 == FLconst && … … 171 173 { 0x00,0x08,0x10,0x18,0x20,0x28,0x30,0x38 }; 172 174 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); 174 176 ce->Iop = regop[(ce->Irm & modregrm(0,7,0)) >> 3] | (ce->Iop & 1); 175 177 code_newreg(ce, reg); … … 190 192 ce = code_calloc(); 191 193 ce->Iop = op; 194 assert(op != LEA); 192 195 if (c) 193 196 { cstart = c; … … 219 222 cstart = ce = code_calloc(); 220 223 /*cxcalloc++;*/ 224 if (op == LEA && (rm & 0xFF) == 4 && (sib & 0xFF) == 0x6D) *(char*)0=0; 221 225 ce->Iop = op; 222 226 ce->Irm = rm; … … 387 391 cs.IFL1 = FL1; 388 392 cs.IEV1.Vsize_t = EV1; 393 if (cs.Iop == LEA && cs.IFL1 == FLunde) *(char*)0=0; 389 394 return gen(c,&cs); 390 395 } trunk/src/backend/cod1.c
r621 r627 1873 1873 c = allocreg(pretregs,&rreg,tym); /* allocate return regs */ 1874 1874 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); 1882 1880 1883 1881 ce = genmovreg(ce,msrreg,msreg); /* MOV msrreg,msreg */ 1884 1882 ce = genmovreg(ce,lsrreg,lsreg); /* MOV lsrreg,lsreg */ 1885 1883 } 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 } 1886 1894 else 1887 { reg = findreg(retregs & (mBP | ALLREGS)); 1895 { 1896 reg = findreg(retregs & (mBP | ALLREGS)); 1888 1897 ce = genmovreg(ce,rreg,reg); /* MOV rreg,reg */ 1889 1898 } … … 1913 1922 code *callclib(elem *e,unsigned clib,regm_t *pretregs,regm_t keepmask) 1914 1923 { 1924 //printf("callclib(e = %p, clib = %d, *pretregs = %s, keepmask = %s\n", e, clib, regm_str(*pretregs), regm_str(keepmask)); 1925 //elem_print(e); 1915 1926 #if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_SOLARIS 1916 1927 static symbol lib[] = … … 2099 2110 #define INFfloat 2 // if this is floating point 2100 2111 #define INFwkdone 4 // if weak extern is already done 2112 #define INF64 8 // if 64 bit only 2101 2113 char push87; // # of pushes onto the 8087 stack 2102 2114 char pop87; // # of pops off of the 8087 stack … … 2176 2188 {mPSW, mPSW, 0,INF32|INFfloat,0,4}, // _Ccmp 2177 2189 2178 {mST0,mST0,0,INF32|INF float,2,1}, // _U64_LDBL2179 {0,mDX|mAX,0,INF32|INF float,1,2}, // __LDBLULLNG2190 {mST0,mST0,0,INF32|INF64|INFfloat,2,1}, // _U64_LDBL 2191 {0,mDX|mAX,0,INF32|INF64|INFfloat,1,2}, // __LDBLULLNG 2180 2192 }; 2181 2193 … … 2220 2232 assert(clib < CLIBMAX); 2221 2233 symbol *s = &lib[clib]; 2222 assert(I32 || !(info[clib].flags & INF32)); 2234 if (I16) 2235 assert(!(info[clib].flags & (INF32 | INF64))); 2223 2236 code *cpop = CNIL; 2224 2237 code *c = getregs((~s->Sregsaved & (mES | mBP | ALLREGS)) & ~keepmask); // mask of regs destroyed … … 3611 3624 c = cat(c,ce); 3612 3625 } 3613 else if (sz == 8) 3614 { code *c1; 3615 int i; 3616 3626 else if (sz == 8 || (I64 && sz == 2 * REGSIZE && !tyfloating(tym))) 3627 { 3617 3628 c = allocreg(®m,®,TYoffset); /* get a register */ 3618 i = sz - REGSIZE;3629 int i = sz - REGSIZE; 3619 3630 ce = loadea(e,&cs,0x8B,reg,i,0,0); /* MOV reg,data+6 */ 3620 3631 if (tyfloating(tym)) // TYdouble or TYdouble_alias … … 3624 3635 while ((i -= REGSIZE) >= 0) 3625 3636 { 3626 c 1 = loadea(e,&cs,0x0B,reg,i,regm,0); // OR reg,data+i3637 code *c1 = loadea(e,&cs,0x0B,reg,i,regm,0); // OR reg,data+i 3627 3638 if (i == 0) 3628 3639 c1->Iflags |= CFpsw; // need the flags on last OR … … 3630 3641 } 3631 3642 } 3632 else if (sz == LNGDBLSIZE)// TYldouble3643 else if (sz == tysize[TYldouble]) // TYldouble 3633 3644 return load87(e,0,pretregs,NULL,-1); 3634 3645 else 3646 { 3647 #ifdef DEBUG 3648 elem_print(e); 3649 #endif 3635 3650 assert(0); 3651 } 3636 3652 return c; 3637 3653 } trunk/src/backend/cod2.c
r601 r627 228 228 if (reghasvalue(byte ? BYTEREGS : ALLREGS,value,®)) 229 229 goto L11; 230 if (sz == 8 )230 if (sz == 8 && !I64) 231 231 { 232 232 assert(value == (int)value); // sign extend imm32 … … 410 410 cs.Irm = modregrm(2,reg & 7,4); 411 411 cs.Isib = modregrm(ss,reg1 & 7,reg2 & 7); 412 assert(reg2 != BP); 412 413 cs.Iflags = CFoff; 413 414 cs.Irex = 0; … … 777 778 } 778 779 780 //printf("cdmul(e = %p, *pretregs = %s)\n", e, regm_str(*pretregs)); 779 781 keepregs = 0; 780 782 cs.Iflags = 0; … … 1028 1030 { 1029 1031 #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 1031 1034 cl = codelem(e->E1,®m,TRUE); 1032 1035 unsigned r = findreg(regm); … … 1034 1037 if (ss2) 1035 1038 { // Don't use EBP 1036 resreg &= ~ mBP;1039 resreg &= ~(mBP | mR13); 1037 1040 if (!resreg) 1038 1041 resreg = retregs; … … 1042 1045 c = gen2sib(CNIL,0x8D,grex | modregxrm(0,reg,4), 1043 1046 modregxrmx(ss,r,r)); 1047 assert((r & 7) != BP); 1044 1048 if (ss2) 1045 1049 { … … 1089 1093 { 1090 1094 // Don't use EBP 1091 resreg &= ~ mBP;1095 resreg &= ~(mBP | mR13); 1092 1096 if (!resreg) 1093 1097 resreg = retregs; 1094 1098 cl = allocreg(&resreg,®,TYint); 1095 1099 1096 regm_t sregm = ALLREGS& ~resreg;1100 regm_t sregm = (ALLREGS & ~mR13) & ~resreg; 1097 1101 cl = cat(cl,codelem(e->E1,&sregm,FALSE)); 1098 1102 unsigned sreg = findreg(sregm); … … 1101 1105 // SHL sreg,shift 1102 1106 // LEA reg,[sreg * 8][reg] 1107 assert((sreg & 7) != BP); 1108 assert((reg & 7) != BP); 1103 1109 c = gen2sib(CNIL,0x8D,grex | modregxrm(0,reg,4), 1104 1110 modregxrmx(2,sreg,sreg)); … … 1209 1215 default: /* OPconst and operators */ 1210 1216 L2: 1217 //printf("test2 %p, retregs = %s rretregs = %s resreg = %s\n", e, regm_str(retregs), regm_str(rretregs), regm_str(resreg)); 1211 1218 cl = codelem(e1,&retregs,FALSE); /* eval left leaf */ 1212 1219 cr = scodelem(e2,&rretregs,retregs,TRUE); /* get rvalue */ trunk/src/backend/cod3.c
r619 r627 3495 3495 if (!ci) 3496 3496 goto Lbackjmp; // couldn't find it 3497 if ( I32|| op == JMP || op == JMPS || op == JCXZ)3497 if (!I16 || op == JMP || op == JMPS || op == JCXZ) 3498 3498 c->IEVpointer2 = ad; 3499 3499 else /* else conditional */ … … 3506 3506 c->Iop = op ^ 1; /* converse jmp */ 3507 3507 c->Iflags &= ~CFjmp16; 3508 c->IEVpointer2 = I 32 ? 5 : 3;3508 c->IEVpointer2 = I16 ? 3 : 5; 3509 3509 cn = code_next(c); 3510 3510 cn->Iop = JMP; /* long jump */ … … 3543 3543 3544 3544 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 } 3546 3550 //printf("calcblksize(c = x%x) = %d\n", c, size); 3547 3551 return size; … … 5040 5044 { unsigned rm = c->Irm; 5041 5045 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)) 5043 5047 { unsigned char sib = c->Isib; 5044 5048 printf(" sib=%02x=%d,%d,%d",sib,(sib>>6)&3,(sib>>3)&7,sib&7); trunk/src/backend/cod4.c
r618 r627 2879 2879 if (!(!*pretregs || retregs)) 2880 2880 { 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); 2882 2883 } 2883 2884 #endif trunk/src/backend/debug.c
r618 r627 209 209 case TYdouble: 210 210 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); 211 215 break; 212 216 default: trunk/src/backend/el.c
r618 r627 2564 2564 goto nomatch; 2565 2565 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; 2566 2572 case TYenum: 2567 2573 if (PARSER) trunk/src/backend/evalu8.c
r618 r627 193 193 b = 0; 194 194 break; 195 196 case TYcent: 197 case TYucent: 198 b = e->EV.Vcent.lsw || e->EV.Vcent.msw; 199 break; 200 195 201 default: 196 202 #ifdef DEBUG trunk/src/todt.c
r602 r627 152 152 dim *= tsa->dim->toInteger(); 153 153 } 154 //printf("sz = %d, dim = %d, vsz = %d\n", sz, dim, vsz); 154 155 assert(sz == vsz || sz * dim <= vsz); 155 156 … … 283 284 d = NULL; 284 285 if (tb->ty == Tarray) 285 dt dword(&d, dim);286 dtsize_t(&d, dim); 286 287 dtxoff(&d, s, 0, TYnptr); 287 288 break; … … 398 399 d = NULL; 399 400 if (tb->ty == Tarray) 400 dt dword(&d, dim);401 dtsize_t(&d, dim); 401 402 dtxoff(&d, s, 0, TYnptr); 402 403 break; … … 540 541 { 541 542 case Tarray: 542 dt dword(pdt, len);543 dtsize_t(pdt, len); 543 544 pdt = dtabytes(pdt, TYnptr, 0, (len + 1) * sz, (char *)string); 544 545 break; … … 596 597 case Tarray: 597 598 if (t->ty == Tarray) 598 dt dword(pdt, elements->dim);599 dtsize_t(pdt, elements->dim); 599 600 if (d) 600 601 { … … 608 609 } 609 610 else 610 dt dword(pdt, 0);611 dtsize_t(pdt, 0); 611 612 612 613 break; … … 696 697 dim *= tsa->dim->toInteger(); 697 698 } 699 698 700 for (size_t i = 0; i < dim; i++) 699 701 { … … 788 790 // Put in first two members, the vtbl[] and the monitor 789 791 dtxoff(pdt, toVtblSymbol(), 0, TYnptr); 790 dt dword(pdt, 0); // monitor792 dtsize_t(pdt, 0); // monitor 791 793 792 794 // Put in the rest
