Changeset 805
- Timestamp:
- 12/14/10 00:06:52 (14 years ago)
- Files:
-
- branches/dmd-1.x/src/backend/cg87.c (modified) (1 diff)
- branches/dmd-1.x/src/backend/cod1.c (modified) (1 diff)
- branches/dmd-1.x/src/backend/cod4.c (modified) (1 diff)
- trunk/src/backend/cg87.c (modified) (1 diff)
- trunk/src/backend/cod1.c (modified) (1 diff)
- trunk/src/backend/cod4.c (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
branches/dmd-1.x/src/backend/cg87.c
r798 r805 2713 2713 unsigned op; 2714 2714 targ_long val; 2715 2715 code *cl,*cr,*c,cs; 2716 2716 elem *e1; 2717 2717 int sz; 2718 2718 2719 2719 //printf("cdnegass87(e = %p, *pretregs = x%x)\n", e, *pretregs); 2720 2720 e1 = e->E1; 2721 2721 tyml = tybasic(e1->Ety); // type of lvalue 2722 2722 sz = tysize[tyml]; 2723 2723 2724 2724 cl = getlvalue(&cs,e1,0); 2725 2725 cr = modEA(&cs); 2726 2726 cs.Irm |= modregrm(0,6,0); 2727 2727 cs.Iop = 0x80; 2728 2728 cs.Irex = 0; 2729 2729 #if LNGDBLSIZE > 10 2730 2730 if (tyml == TYldouble || tyml == TYildouble) 2731 2731 cs.IEVoffset1 += 10 - 1; 2732 2732 else if (tyml == TYcldouble) 2733 cs.IEVoffset1 += LNGDBLSIZE+ 10 - 1;2733 cs.IEVoffset1 += tysize[TYldouble] + 10 - 1; 2734 2734 else 2735 2735 #endif 2736 2736 cs.IEVoffset1 += sz - 1; 2737 2737 cs.IFL2 = FLconst; 2738 2738 cs.IEV2.Vuns = 0x80; 2739 2739 c = gen(NULL,&cs); // XOR 7[EA],0x80 2740 2740 if (tycomplex(tyml)) 2741 2741 { 2742 2742 cs.IEVoffset1 -= sz / 2; 2743 2743 gen(c,&cs); // XOR 7[EA],0x80 2744 2744 } 2745 2745 c = cat3(cl,cr,c); 2746 2746 2747 2747 if (*pretregs) 2748 2748 { 2749 2749 switch (tyml) 2750 2750 { 2751 2751 case TYifloat: 2752 2752 case TYfloat: cs.Iop = 0xD9; op = 0; break; 2753 2753 case TYidouble: branches/dmd-1.x/src/backend/cod1.c
r798 r805 1331 1331 else 1332 1332 regcon.params &= ~mask[s->Spreg]; 1333 1333 } 1334 1334 case FLtmp: 1335 1335 case FLbprel: 1336 1336 reflocal = TRUE; 1337 1337 pcs->Irm = modregrm(2,0,BPRM); 1338 1338 goto L2; 1339 1339 case FLextern: 1340 1340 if (s->Sident[0] == '_' && memcmp(s->Sident + 1,"tls_array",10) == 0) 1341 1341 { 1342 1342 #if TARGET_LINUX || TARGET_FREEBSD || TARGET_SOLARIS 1343 1343 // Rewrite as GS:[0000], or FS:[0000] for 64 bit 1344 1344 if (I64) 1345 1345 { 1346 1346 pcs->Irm = modregrm(0, 0, 4); 1347 1347 pcs->Isib = modregrm(0, 4, 5); // don't use [RIP] addressing 1348 1348 pcs->IFL1 = FLconst; 1349 1349 pcs->IEV1.Vuns = 0; 1350 1350 pcs->Iflags = CFfs; 1351 pcs->Irex |= REX_W; 1351 1352 } 1352 1353 else 1353 1354 { 1354 1355 pcs->Irm = modregrm(0, 0, BPRM); 1355 1356 pcs->IFL1 = FLconst; 1356 1357 pcs->IEV1.Vuns = 0; 1357 1358 pcs->Iflags = CFgs; 1358 1359 } 1359 1360 break; 1360 1361 #else 1361 1362 pcs->Iflags |= CFfs; // add FS: override 1362 1363 #endif 1363 1364 } 1364 1365 if (s->ty() & mTYcs && LARGECODE) 1365 1366 goto Lfardata; 1366 1367 goto L3; 1367 1368 case FLdata: 1368 1369 case FLudata: 1369 1370 case FLcsdata: 1370 1371 #if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_SOLARIS branches/dmd-1.x/src/backend/cod4.c
r798 r805 2492 2492 break; 2493 2493 case OPd_s16: 2494 2494 case OPd_s32: 2495 2495 case OPd_u16: 2496 2496 case OPd_s64: 2497 2497 return cnvt87(e,pretregs); 2498 2498 case OPd_u32: // use subroutine, not 8087 2499 2499 #if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_SOLARIS 2500 2500 retregs = mST0; 2501 2501 #else 2502 2502 retregs = DOUBLEREGS; 2503 2503 #endif 2504 2504 goto L1; 2505 2505 2506 2506 case OPd_u64: 2507 2507 retregs = DOUBLEREGS; 2508 2508 goto L1; 2509 2509 case OPu64_d: 2510 2510 if (*pretregs & mST0) 2511 2511 { 2512 retregs = mAX|mDX;2512 retregs = I64 ? mAX : mAX|mDX; 2513 2513 c1 = codelem(e->E1,&retregs,FALSE); 2514 2514 c2 = callclib(e,CLIBu64_ldbl,pretregs,0); 2515 2515 return cat(c1,c2); 2516 2516 } 2517 2517 break; 2518 2518 case OPld_u64: 2519 2519 retregs = mST0; 2520 2520 c1 = codelem(e->E1,&retregs,FALSE); 2521 2521 c2 = callclib(e,CLIBld_u64,pretregs,0); 2522 2522 return cat(c1,c2); 2523 2523 } 2524 2524 } 2525 2525 retregs = regmask(e->E1->Ety, TYnfunc); 2526 2526 L1: 2527 2527 c1 = codelem(e->E1,&retregs,FALSE); 2528 2528 for (i = 0; 1; i++) 2529 2529 { assert(i < arraysize(clib)); 2530 2530 if (clib[i][0] == e->Eoper) 2531 2531 { c2 = callclib(e,clib[i][1],pretregs,0); 2532 2532 break; trunk/src/backend/cg87.c
r798 r805 2713 2713 unsigned op; 2714 2714 targ_long val; 2715 2715 code *cl,*cr,*c,cs; 2716 2716 elem *e1; 2717 2717 int sz; 2718 2718 2719 2719 //printf("cdnegass87(e = %p, *pretregs = x%x)\n", e, *pretregs); 2720 2720 e1 = e->E1; 2721 2721 tyml = tybasic(e1->Ety); // type of lvalue 2722 2722 sz = tysize[tyml]; 2723 2723 2724 2724 cl = getlvalue(&cs,e1,0); 2725 2725 cr = modEA(&cs); 2726 2726 cs.Irm |= modregrm(0,6,0); 2727 2727 cs.Iop = 0x80; 2728 2728 cs.Irex = 0; 2729 2729 #if LNGDBLSIZE > 10 2730 2730 if (tyml == TYldouble || tyml == TYildouble) 2731 2731 cs.IEVoffset1 += 10 - 1; 2732 2732 else if (tyml == TYcldouble) 2733 cs.IEVoffset1 += LNGDBLSIZE+ 10 - 1;2733 cs.IEVoffset1 += tysize[TYldouble] + 10 - 1; 2734 2734 else 2735 2735 #endif 2736 2736 cs.IEVoffset1 += sz - 1; 2737 2737 cs.IFL2 = FLconst; 2738 2738 cs.IEV2.Vuns = 0x80; 2739 2739 c = gen(NULL,&cs); // XOR 7[EA],0x80 2740 2740 if (tycomplex(tyml)) 2741 2741 { 2742 2742 cs.IEVoffset1 -= sz / 2; 2743 2743 gen(c,&cs); // XOR 7[EA],0x80 2744 2744 } 2745 2745 c = cat3(cl,cr,c); 2746 2746 2747 2747 if (*pretregs) 2748 2748 { 2749 2749 switch (tyml) 2750 2750 { 2751 2751 case TYifloat: 2752 2752 case TYfloat: cs.Iop = 0xD9; op = 0; break; 2753 2753 case TYidouble: trunk/src/backend/cod1.c
r798 r805 1331 1331 else 1332 1332 regcon.params &= ~mask[s->Spreg]; 1333 1333 } 1334 1334 case FLtmp: 1335 1335 case FLbprel: 1336 1336 reflocal = TRUE; 1337 1337 pcs->Irm = modregrm(2,0,BPRM); 1338 1338 goto L2; 1339 1339 case FLextern: 1340 1340 if (s->Sident[0] == '_' && memcmp(s->Sident + 1,"tls_array",10) == 0) 1341 1341 { 1342 1342 #if TARGET_LINUX || TARGET_FREEBSD || TARGET_SOLARIS 1343 1343 // Rewrite as GS:[0000], or FS:[0000] for 64 bit 1344 1344 if (I64) 1345 1345 { 1346 1346 pcs->Irm = modregrm(0, 0, 4); 1347 1347 pcs->Isib = modregrm(0, 4, 5); // don't use [RIP] addressing 1348 1348 pcs->IFL1 = FLconst; 1349 1349 pcs->IEV1.Vuns = 0; 1350 1350 pcs->Iflags = CFfs; 1351 pcs->Irex |= REX_W; 1351 1352 } 1352 1353 else 1353 1354 { 1354 1355 pcs->Irm = modregrm(0, 0, BPRM); 1355 1356 pcs->IFL1 = FLconst; 1356 1357 pcs->IEV1.Vuns = 0; 1357 1358 pcs->Iflags = CFgs; 1358 1359 } 1359 1360 break; 1360 1361 #else 1361 1362 pcs->Iflags |= CFfs; // add FS: override 1362 1363 #endif 1363 1364 } 1364 1365 if (s->ty() & mTYcs && LARGECODE) 1365 1366 goto Lfardata; 1366 1367 goto L3; 1367 1368 case FLdata: 1368 1369 case FLudata: 1369 1370 case FLcsdata: 1370 1371 #if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_SOLARIS trunk/src/backend/cod4.c
r798 r805 2492 2492 break; 2493 2493 case OPd_s16: 2494 2494 case OPd_s32: 2495 2495 case OPd_u16: 2496 2496 case OPd_s64: 2497 2497 return cnvt87(e,pretregs); 2498 2498 case OPd_u32: // use subroutine, not 8087 2499 2499 #if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_SOLARIS 2500 2500 retregs = mST0; 2501 2501 #else 2502 2502 retregs = DOUBLEREGS; 2503 2503 #endif 2504 2504 goto L1; 2505 2505 2506 2506 case OPd_u64: 2507 2507 retregs = DOUBLEREGS; 2508 2508 goto L1; 2509 2509 case OPu64_d: 2510 2510 if (*pretregs & mST0) 2511 2511 { 2512 retregs = mAX|mDX;2512 retregs = I64 ? mAX : mAX|mDX; 2513 2513 c1 = codelem(e->E1,&retregs,FALSE); 2514 2514 c2 = callclib(e,CLIBu64_ldbl,pretregs,0); 2515 2515 return cat(c1,c2); 2516 2516 } 2517 2517 break; 2518 2518 case OPld_u64: 2519 2519 retregs = mST0; 2520 2520 c1 = codelem(e->E1,&retregs,FALSE); 2521 2521 c2 = callclib(e,CLIBld_u64,pretregs,0); 2522 2522 return cat(c1,c2); 2523 2523 } 2524 2524 } 2525 2525 retregs = regmask(e->E1->Ety, TYnfunc); 2526 2526 L1: 2527 2527 c1 = codelem(e->E1,&retregs,FALSE); 2528 2528 for (i = 0; 1; i++) 2529 2529 { assert(i < arraysize(clib)); 2530 2530 if (clib[i][0] == e->Eoper) 2531 2531 { c2 = callclib(e,clib[i][1],pretregs,0); 2532 2532 break;
