Changeset 836
- Timestamp:
- 01/02/11 06:06:20 (14 years ago)
- Files:
-
- branches/dmd-1.x/src/backend/cod2.c (modified) (2 diffs)
- branches/dmd-1.x/src/backend/cod4.c (modified) (4 diffs)
- trunk/src/backend/cod2.c (modified) (2 diffs)
- trunk/src/backend/cod4.c (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
branches/dmd-1.x/src/backend/cod2.c
r832 r836 1512 1512 retregs = *pretregs & possregs; 1513 1513 if (retregs == 0) 1514 1514 retregs = possregs; 1515 1515 c1 = codelem(e->E1,&retregs,FALSE); 1516 1516 cg = getregs(retregs); /* retregs will be destroyed */ 1517 1517 #if 0 1518 1518 if (sz == 4 * REGSIZE) 1519 1519 { 1520 1520 c = gen2(CNIL,0xF7,modregrm(3,2,AX)); // NOT AX 1521 1521 gen2(c,0xF7,modregrm(3,2,BX)); // NOT BX 1522 1522 gen2(c,0xF7,modregrm(3,2,CX)); // NOT CX 1523 1523 gen2(c,0xF7,modregrm(3,2,DX)); // NOT DX 1524 1524 } 1525 1525 else 1526 1526 #endif 1527 1527 { 1528 1528 reg = (sz <= REGSIZE) ? findreg(retregs) : findregmsw(retregs); 1529 1529 op = (sz == 1) ? 0xF6 : 0xF7; 1530 1530 c = genregs(CNIL,op,2,reg); // NOT reg 1531 1531 code_orrex(c, rex); 1532 if (I64 && sz == 1 && reg >= 4) 1533 code_orrex(c, REX); 1532 1534 if (sz == 2 * REGSIZE) 1533 1535 { reg = findreglsw(retregs); 1534 1536 genregs(c,op,2,reg); // NOT reg+1 1535 1537 } 1536 1538 } 1537 1539 return cat4(c1,cg,c,fixresult(e,retregs,pretregs)); 1538 1540 } 1539 1541 1540 1542 /************************ 1541 1543 * Bswap operator 1542 1544 */ 1543 1545 1544 1546 code *cdbswap(elem *e,regm_t *pretregs) 1545 1547 { unsigned reg,op; 1546 1548 regm_t retregs; 1547 1549 code *c,*c1,*cg; 1548 1550 tym_t tym; 1549 1551 int sz; 1550 1552 1551 1553 if (*pretregs == 0) … … 4038 4040 c1 = genc2(c1,0x81,modregrm(3,6,reg),0x80000000); /* XOR EDX,sign bit */ 4039 4041 } 4040 4042 else 4041 4043 { reg = (sz == 8) ? AX : findregmsw(retregs); 4042 4044 c1 = genc2(c1,0x81,modregrm(3,6,reg),0x8000); /* XOR AX,0x8000 */ 4043 4045 } 4044 4046 return cat(c1,fixresult(e,retregs,pretregs)); 4045 4047 } 4046 4048 4047 4049 byte = sz == 1; 4048 4050 possregs = (byte) ? BYTEREGS : allregs; 4049 4051 retregs = *pretregs & possregs; 4050 4052 if (retregs == 0) 4051 4053 retregs = possregs; 4052 4054 c1 = codelem(e->E1,&retregs,FALSE); 4053 4055 cg = getregs(retregs); /* retregs will be destroyed */ 4054 4056 if (sz <= REGSIZE) 4055 4057 { 4056 4058 unsigned reg = findreg(retregs); 4057 4059 unsigned rex = (I64 && sz == 8) ? REX_W : 0; 4060 if (I64 && sz == 1 && reg >= 4) 4061 rex |= REX; 4058 4062 c = gen2(CNIL,0xF7 ^ byte,(rex << 16) | modregrmx(3,3,reg)); // NEG reg 4059 4063 if (!I16 && tysize[tyml] == SHORTSIZE && *pretregs & mPSW) 4060 4064 c->Iflags |= CFopsize | CFpsw; 4061 4065 *pretregs &= mBP | ALLREGS; // flags already set 4062 4066 } 4063 4067 else if (sz == 2 * REGSIZE) 4064 4068 { unsigned msreg,lsreg; 4065 4069 4066 4070 msreg = findregmsw(retregs); 4067 4071 c = gen2(CNIL,0xF7,modregrm(3,3,msreg)); /* NEG msreg */ 4068 4072 lsreg = findreglsw(retregs); 4069 4073 gen2(c,0xF7,modregrm(3,3,lsreg)); /* NEG lsreg */ 4070 4074 genc2(c,0x81,modregrm(3,3,msreg),0); /* SBB msreg,0 */ 4071 4075 } 4072 4076 else 4073 4077 assert(0); 4074 4078 return cat4(c1,cg,c,fixresult(e,retregs,pretregs)); 4075 4079 } 4076 4080 4077 4081 branches/dmd-1.x/src/backend/cod4.c
r834 r836 1177 1177 } 1178 1178 freenode(e1); 1179 1179 if (sz <= REGSIZE) 1180 1180 *pretregs &= ~mPSW; // flags are already set 1181 1181 return cat(c,fixresult(e,retregs,pretregs)); 1182 1182 } 1183 1183 1184 1184 /******************************** 1185 1185 * Generate code for *= /= %= 1186 1186 */ 1187 1187 1188 1188 code *cdmulass(elem *e,regm_t *pretregs) 1189 1189 { elem *e1,*e2; 1190 1190 code *cr,*cl,*cg,*c,cs; 1191 1191 tym_t tym,tyml; 1192 1192 regm_t retregs; 1193 1193 char uns; 1194 1194 unsigned op,resreg,reg,opr,lib,byte; 1195 1195 unsigned sz; 1196 1196 1197 //printf("cdmulass(e=%p, *pretregs = %s)\n",e,regm_str(*pretregs)); 1197 1198 e1 = e->E1; 1198 1199 e2 = e->E2; 1199 1200 op = e->Eoper; /* OPxxxx */ 1200 1201 1201 1202 tyml = tybasic(e1->Ety); /* type of lvalue */ 1202 1203 uns = tyuns(tyml) || tyuns(e2->Ety); 1203 1204 tym = tybasic(e->Ety); /* type of result */ 1204 1205 sz = tysize[tyml]; 1205 1206 1206 1207 unsigned rex = (I64 && sz == 8) ? REX_W : 0; 1207 1208 unsigned grex = rex << 16; // 64 bit operands 1208 1209 1209 1210 1210 1211 if (tyfloating(tyml)) 1211 1212 #if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_SOLARIS 1212 1213 return opass87(e,pretregs); 1213 1214 #else 1214 1215 return opassdbl(e,pretregs,op); 1215 1216 #endif 1216 1217 … … 1251 1252 { 1252 1253 L1: 1253 1254 retregs = *pretregs & (ALLREGS | mBP); 1254 1255 if (!retregs) 1255 1256 retregs = ALLREGS; 1256 1257 cr = codelem(e2,&retregs,FALSE); /* load rvalue in reg */ 1257 1258 cl = getlvalue(&cs,e1,retregs); /* get EA */ 1258 1259 cg = getregs(retregs); /* destroy these regs */ 1259 1260 cs.Iop = 0x0FAF; // IMUL resreg,EA 1260 1261 resreg = findreg(retregs); 1261 1262 opr = resreg; 1262 1263 } 1263 1264 else 1264 1265 { 1265 1266 retregs = mAX; 1266 1267 cr = codelem(e2,&retregs,FALSE); // load rvalue in AX 1267 1268 cl = getlvalue(&cs,e1,mAX); // get EA 1268 1269 cg = getregs(byte ? mAX : mAX | mDX); // destroy these regs 1269 1270 cs.Iop = 0xF7 ^ byte; // [I]MUL EA 1270 1271 } 1271 c s.Irm |= modregrm(0,opr,0);1272 code_newreg(&cs,opr); 1272 1273 c = gen(CNIL,&cs); 1273 1274 } 1274 1275 else // /= or %= 1275 1276 { targ_size_t e2factor; 1276 1277 int pow2; 1277 1278 targ_ulong m; 1278 1279 1279 1280 assert(!byte); // should never happen 1280 1281 assert(I16 || sz != SHORTSIZE); 1281 1282 if (config.flags4 & CFG4speed && 1282 1283 e2->Eoper == OPconst && !uns && 1283 1284 (sz == REGSIZE || (I64 && sz == 4)) && 1284 1285 (pow2 = ispow2(e2factor = el_tolong(e2))) != -1 && 1285 1286 e2factor == (int)e2factor && 1286 1287 !(config.target_cpu < TARGET_80286 && pow2 != 1 && op == OPdivass) 1287 1288 ) 1288 1289 { 1289 1290 // Signed divide or modulo by power of 2 1290 1291 cr = NULL; 1291 1292 c = NULL; … … 1338 1339 retregs = ALLREGS & ~(mAX|mDX); // DX gets sign extension 1339 1340 cr = codelem(e2,&retregs,FALSE); // load rvalue in retregs 1340 1341 reg = findreg(retregs); 1341 1342 cl = getlvalue(&cs,e1,mAX | mDX | retregs); // get EA 1342 1343 cg = getregs(mAX | mDX); // destroy these regs 1343 1344 cs.Irm |= modregrm(0,AX,0); 1344 1345 cs.Iop = 0x8B; 1345 1346 c = gen(CNIL,&cs); // MOV AX,EA 1346 1347 if (uns) // if unsigned 1347 1348 movregconst(c,DX,0,0); // CLR DX 1348 1349 else // else signed 1349 1350 { gen1(c,0x99); // CWD 1350 1351 code_orrex(c,rex); 1351 1352 } 1352 1353 c = cat(c,getregs(mDX | mAX)); // DX and AX will be destroyed 1353 1354 genregs(c,0xF7,opr,reg); // OPR reg 1354 1355 code_orrex(c,rex); 1355 1356 } 1356 1357 } 1357 1358 cs.Iop = 0x89 ^ byte; 1358 NEWREG(cs.Irm,resreg);1359 code_newreg(&cs,resreg); 1359 1360 c = gen(c,&cs); // MOV EA,resreg 1360 1361 if (e1->Ecount) // if we gen a CSE 1361 1362 cssave(e1,mask[resreg],EOP(e1)); 1362 1363 freenode(e1); 1363 1364 c = cat(c,fixresult(e,mask[resreg],pretregs)); 1364 1365 return cat4(cr,cl,cg,c); 1365 1366 } 1366 1367 else if (sz == 2 * REGSIZE) 1367 1368 { 1368 1369 lib = CLIBlmul; 1369 1370 if (op == OPdivass || op == OPmodass) 1370 1371 { lib = (uns) ? CLIBuldiv : CLIBldiv; 1371 1372 if (op == OPmodass) 1372 1373 lib++; 1373 1374 } 1374 1375 retregs = mCX | mBX; 1375 1376 cr = codelem(e2,&retregs,FALSE); 1376 1377 cl = getlvalue(&cs,e1,mDX|mAX | mCX|mBX); 1377 1378 cl = cat(cl,getregs(mDX | mAX)); 1378 1379 cs.Iop = 0x8B; … … 2824 2825 L1: 2825 2826 if (!I16) 2826 2827 { 2827 2828 if (op == OPs8int && reg == AX && size == 2) 2828 2829 { c3 = gen1(c3,0x98); /* CBW */ 2829 2830 c3->Iflags |= CFopsize; /* don't do a CWDE */ 2830 2831 } 2831 2832 else 2832 2833 { 2833 2834 /* We could do better by not forcing the src and dst */ 2834 2835 /* registers to be the same. */ 2835 2836 2836 2837 if (config.flags4 & CFG4speed && op == OPu8_16) 2837 2838 { // AND reg,0xFF 2838 2839 c3 = genc2(c3,0x81,modregrmx(3,4,reg),0xFF); 2839 2840 } 2840 2841 else 2841 2842 { 2842 2843 unsigned iop = (op == OPu8int) ? 0x0FB6 : 0x0FBE; // MOVZX/MOVSX reg,reg 2843 2844 c3 = genregs(c3,iop,reg,reg); 2845 if (I64 && reg >= 4) 2846 code_orrex(c3, REX); 2844 2847 } 2845 2848 } 2846 2849 } 2847 2850 else 2848 2851 { 2849 2852 if (op == OPu8int) 2850 2853 c3 = genregs(c3,0x30,reg+4,reg+4); // XOR regH,regH 2851 2854 else 2852 2855 { 2853 2856 c3 = gen1(c3,0x98); /* CBW */ 2854 2857 *pretregs &= ~mPSW; /* flags already set */ 2855 2858 } 2856 2859 } 2857 2860 } 2858 2861 c2 = getregs(retregs); 2859 2862 L2: 2860 2863 c4 = fixresult(e,retregs,pretregs); 2861 2864 return cat6(c0,c1,c2,c3,c4,NULL); 2862 2865 } 2863 2866 trunk/src/backend/cod2.c
r832 r836 1512 1512 retregs = *pretregs & possregs; 1513 1513 if (retregs == 0) 1514 1514 retregs = possregs; 1515 1515 c1 = codelem(e->E1,&retregs,FALSE); 1516 1516 cg = getregs(retregs); /* retregs will be destroyed */ 1517 1517 #if 0 1518 1518 if (sz == 4 * REGSIZE) 1519 1519 { 1520 1520 c = gen2(CNIL,0xF7,modregrm(3,2,AX)); // NOT AX 1521 1521 gen2(c,0xF7,modregrm(3,2,BX)); // NOT BX 1522 1522 gen2(c,0xF7,modregrm(3,2,CX)); // NOT CX 1523 1523 gen2(c,0xF7,modregrm(3,2,DX)); // NOT DX 1524 1524 } 1525 1525 else 1526 1526 #endif 1527 1527 { 1528 1528 reg = (sz <= REGSIZE) ? findreg(retregs) : findregmsw(retregs); 1529 1529 op = (sz == 1) ? 0xF6 : 0xF7; 1530 1530 c = genregs(CNIL,op,2,reg); // NOT reg 1531 1531 code_orrex(c, rex); 1532 if (I64 && sz == 1 && reg >= 4) 1533 code_orrex(c, REX); 1532 1534 if (sz == 2 * REGSIZE) 1533 1535 { reg = findreglsw(retregs); 1534 1536 genregs(c,op,2,reg); // NOT reg+1 1535 1537 } 1536 1538 } 1537 1539 return cat4(c1,cg,c,fixresult(e,retregs,pretregs)); 1538 1540 } 1539 1541 1540 1542 /************************ 1541 1543 * Bswap operator 1542 1544 */ 1543 1545 1544 1546 code *cdbswap(elem *e,regm_t *pretregs) 1545 1547 { unsigned reg,op; 1546 1548 regm_t retregs; 1547 1549 code *c,*c1,*cg; 1548 1550 tym_t tym; 1549 1551 int sz; 1550 1552 1551 1553 if (*pretregs == 0) … … 4038 4040 c1 = genc2(c1,0x81,modregrm(3,6,reg),0x80000000); /* XOR EDX,sign bit */ 4039 4041 } 4040 4042 else 4041 4043 { reg = (sz == 8) ? AX : findregmsw(retregs); 4042 4044 c1 = genc2(c1,0x81,modregrm(3,6,reg),0x8000); /* XOR AX,0x8000 */ 4043 4045 } 4044 4046 return cat(c1,fixresult(e,retregs,pretregs)); 4045 4047 } 4046 4048 4047 4049 byte = sz == 1; 4048 4050 possregs = (byte) ? BYTEREGS : allregs; 4049 4051 retregs = *pretregs & possregs; 4050 4052 if (retregs == 0) 4051 4053 retregs = possregs; 4052 4054 c1 = codelem(e->E1,&retregs,FALSE); 4053 4055 cg = getregs(retregs); /* retregs will be destroyed */ 4054 4056 if (sz <= REGSIZE) 4055 4057 { 4056 4058 unsigned reg = findreg(retregs); 4057 4059 unsigned rex = (I64 && sz == 8) ? REX_W : 0; 4060 if (I64 && sz == 1 && reg >= 4) 4061 rex |= REX; 4058 4062 c = gen2(CNIL,0xF7 ^ byte,(rex << 16) | modregrmx(3,3,reg)); // NEG reg 4059 4063 if (!I16 && tysize[tyml] == SHORTSIZE && *pretregs & mPSW) 4060 4064 c->Iflags |= CFopsize | CFpsw; 4061 4065 *pretregs &= mBP | ALLREGS; // flags already set 4062 4066 } 4063 4067 else if (sz == 2 * REGSIZE) 4064 4068 { unsigned msreg,lsreg; 4065 4069 4066 4070 msreg = findregmsw(retregs); 4067 4071 c = gen2(CNIL,0xF7,modregrm(3,3,msreg)); /* NEG msreg */ 4068 4072 lsreg = findreglsw(retregs); 4069 4073 gen2(c,0xF7,modregrm(3,3,lsreg)); /* NEG lsreg */ 4070 4074 genc2(c,0x81,modregrm(3,3,msreg),0); /* SBB msreg,0 */ 4071 4075 } 4072 4076 else 4073 4077 assert(0); 4074 4078 return cat4(c1,cg,c,fixresult(e,retregs,pretregs)); 4075 4079 } 4076 4080 4077 4081 trunk/src/backend/cod4.c
r834 r836 1177 1177 } 1178 1178 freenode(e1); 1179 1179 if (sz <= REGSIZE) 1180 1180 *pretregs &= ~mPSW; // flags are already set 1181 1181 return cat(c,fixresult(e,retregs,pretregs)); 1182 1182 } 1183 1183 1184 1184 /******************************** 1185 1185 * Generate code for *= /= %= 1186 1186 */ 1187 1187 1188 1188 code *cdmulass(elem *e,regm_t *pretregs) 1189 1189 { elem *e1,*e2; 1190 1190 code *cr,*cl,*cg,*c,cs; 1191 1191 tym_t tym,tyml; 1192 1192 regm_t retregs; 1193 1193 char uns; 1194 1194 unsigned op,resreg,reg,opr,lib,byte; 1195 1195 unsigned sz; 1196 1196 1197 //printf("cdmulass(e=%p, *pretregs = %s)\n",e,regm_str(*pretregs)); 1197 1198 e1 = e->E1; 1198 1199 e2 = e->E2; 1199 1200 op = e->Eoper; /* OPxxxx */ 1200 1201 1201 1202 tyml = tybasic(e1->Ety); /* type of lvalue */ 1202 1203 uns = tyuns(tyml) || tyuns(e2->Ety); 1203 1204 tym = tybasic(e->Ety); /* type of result */ 1204 1205 sz = tysize[tyml]; 1205 1206 1206 1207 unsigned rex = (I64 && sz == 8) ? REX_W : 0; 1207 1208 unsigned grex = rex << 16; // 64 bit operands 1208 1209 1209 1210 1210 1211 if (tyfloating(tyml)) 1211 1212 #if TARGET_LINUX || TARGET_OSX || TARGET_FREEBSD || TARGET_SOLARIS 1212 1213 return opass87(e,pretregs); 1213 1214 #else 1214 1215 return opassdbl(e,pretregs,op); 1215 1216 #endif 1216 1217 … … 1251 1252 { 1252 1253 L1: 1253 1254 retregs = *pretregs & (ALLREGS | mBP); 1254 1255 if (!retregs) 1255 1256 retregs = ALLREGS; 1256 1257 cr = codelem(e2,&retregs,FALSE); /* load rvalue in reg */ 1257 1258 cl = getlvalue(&cs,e1,retregs); /* get EA */ 1258 1259 cg = getregs(retregs); /* destroy these regs */ 1259 1260 cs.Iop = 0x0FAF; // IMUL resreg,EA 1260 1261 resreg = findreg(retregs); 1261 1262 opr = resreg; 1262 1263 } 1263 1264 else 1264 1265 { 1265 1266 retregs = mAX; 1266 1267 cr = codelem(e2,&retregs,FALSE); // load rvalue in AX 1267 1268 cl = getlvalue(&cs,e1,mAX); // get EA 1268 1269 cg = getregs(byte ? mAX : mAX | mDX); // destroy these regs 1269 1270 cs.Iop = 0xF7 ^ byte; // [I]MUL EA 1270 1271 } 1271 c s.Irm |= modregrm(0,opr,0);1272 code_newreg(&cs,opr); 1272 1273 c = gen(CNIL,&cs); 1273 1274 } 1274 1275 else // /= or %= 1275 1276 { targ_size_t e2factor; 1276 1277 int pow2; 1277 1278 targ_ulong m; 1278 1279 1279 1280 assert(!byte); // should never happen 1280 1281 assert(I16 || sz != SHORTSIZE); 1281 1282 if (config.flags4 & CFG4speed && 1282 1283 e2->Eoper == OPconst && !uns && 1283 1284 (sz == REGSIZE || (I64 && sz == 4)) && 1284 1285 (pow2 = ispow2(e2factor = el_tolong(e2))) != -1 && 1285 1286 e2factor == (int)e2factor && 1286 1287 !(config.target_cpu < TARGET_80286 && pow2 != 1 && op == OPdivass) 1287 1288 ) 1288 1289 { 1289 1290 // Signed divide or modulo by power of 2 1290 1291 cr = NULL; 1291 1292 c = NULL; … … 1338 1339 retregs = ALLREGS & ~(mAX|mDX); // DX gets sign extension 1339 1340 cr = codelem(e2,&retregs,FALSE); // load rvalue in retregs 1340 1341 reg = findreg(retregs); 1341 1342 cl = getlvalue(&cs,e1,mAX | mDX | retregs); // get EA 1342 1343 cg = getregs(mAX | mDX); // destroy these regs 1343 1344 cs.Irm |= modregrm(0,AX,0); 1344 1345 cs.Iop = 0x8B; 1345 1346 c = gen(CNIL,&cs); // MOV AX,EA 1346 1347 if (uns) // if unsigned 1347 1348 movregconst(c,DX,0,0); // CLR DX 1348 1349 else // else signed 1349 1350 { gen1(c,0x99); // CWD 1350 1351 code_orrex(c,rex); 1351 1352 } 1352 1353 c = cat(c,getregs(mDX | mAX)); // DX and AX will be destroyed 1353 1354 genregs(c,0xF7,opr,reg); // OPR reg 1354 1355 code_orrex(c,rex); 1355 1356 } 1356 1357 } 1357 1358 cs.Iop = 0x89 ^ byte; 1358 NEWREG(cs.Irm,resreg);1359 code_newreg(&cs,resreg); 1359 1360 c = gen(c,&cs); // MOV EA,resreg 1360 1361 if (e1->Ecount) // if we gen a CSE 1361 1362 cssave(e1,mask[resreg],EOP(e1)); 1362 1363 freenode(e1); 1363 1364 c = cat(c,fixresult(e,mask[resreg],pretregs)); 1364 1365 return cat4(cr,cl,cg,c); 1365 1366 } 1366 1367 else if (sz == 2 * REGSIZE) 1367 1368 { 1368 1369 lib = CLIBlmul; 1369 1370 if (op == OPdivass || op == OPmodass) 1370 1371 { lib = (uns) ? CLIBuldiv : CLIBldiv; 1371 1372 if (op == OPmodass) 1372 1373 lib++; 1373 1374 } 1374 1375 retregs = mCX | mBX; 1375 1376 cr = codelem(e2,&retregs,FALSE); 1376 1377 cl = getlvalue(&cs,e1,mDX|mAX | mCX|mBX); 1377 1378 cl = cat(cl,getregs(mDX | mAX)); 1378 1379 cs.Iop = 0x8B; … … 2824 2825 L1: 2825 2826 if (!I16) 2826 2827 { 2827 2828 if (op == OPs8int && reg == AX && size == 2) 2828 2829 { c3 = gen1(c3,0x98); /* CBW */ 2829 2830 c3->Iflags |= CFopsize; /* don't do a CWDE */ 2830 2831 } 2831 2832 else 2832 2833 { 2833 2834 /* We could do better by not forcing the src and dst */ 2834 2835 /* registers to be the same. */ 2835 2836 2836 2837 if (config.flags4 & CFG4speed && op == OPu8_16) 2837 2838 { // AND reg,0xFF 2838 2839 c3 = genc2(c3,0x81,modregrmx(3,4,reg),0xFF); 2839 2840 } 2840 2841 else 2841 2842 { 2842 2843 unsigned iop = (op == OPu8int) ? 0x0FB6 : 0x0FBE; // MOVZX/MOVSX reg,reg 2843 2844 c3 = genregs(c3,iop,reg,reg); 2845 if (I64 && reg >= 4) 2846 code_orrex(c3, REX); 2844 2847 } 2845 2848 } 2846 2849 } 2847 2850 else 2848 2851 { 2849 2852 if (op == OPu8int) 2850 2853 c3 = genregs(c3,0x30,reg+4,reg+4); // XOR regH,regH 2851 2854 else 2852 2855 { 2853 2856 c3 = gen1(c3,0x98); /* CBW */ 2854 2857 *pretregs &= ~mPSW; /* flags already set */ 2855 2858 } 2856 2859 } 2857 2860 } 2858 2861 c2 = getregs(retregs); 2859 2862 L2: 2860 2863 c4 = fixresult(e,retregs,pretregs); 2861 2864 return cat6(c0,c1,c2,c3,c4,NULL); 2862 2865 } 2863 2866
