Changeset 40562 in webkit for trunk/JavaScriptCore/assembler/MacroAssembler.h
- Timestamp:
- Feb 3, 2009, 6:02:32 PM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/assembler/MacroAssembler.h
r40004 r40562 48 48 // Note: do not rely on values in this enum, these will change (to 0..3). 49 49 enum Scale { 50 TimesOne = 1,51 TimesTwo = 2,52 TimesFour = 4,53 TimesEight = 8,50 TimesOne, 51 TimesTwo, 52 TimesFour, 53 TimesEight, 54 54 #if PLATFORM(X86) 55 55 ScalePtr = TimesFour … … 59 59 #endif 60 60 }; 61 62 typedef X86Assembler::Condition Condition; 63 static const Condition Equal = X86Assembler::ConditionE; 64 static const Condition NotEqual = X86Assembler::ConditionNE; 65 static const Condition Above = X86Assembler::ConditionA; 66 static const Condition AboveOrEqual = X86Assembler::ConditionAE; 67 static const Condition Below = X86Assembler::ConditionB; 68 static const Condition BelowOrEqual = X86Assembler::ConditionBE; 69 static const Condition GreaterThan = X86Assembler::ConditionG; 70 static const Condition GreaterThanOrEqual = X86Assembler::ConditionGE; 71 static const Condition LessThan = X86Assembler::ConditionL; 72 static const Condition LessThanOrEqual = X86Assembler::ConditionLE; 73 static const Condition Overflow = X86Assembler::ConditionO; 74 static const Condition Zero = X86Assembler::ConditionE; 75 static const Condition NonZero = X86Assembler::ConditionNE; 61 76 62 77 MacroAssembler() … … 1093 1108 // an optional second operand of a mask under which to perform the test. 1094 1109 1095 private: 1096 void compareImm32ForBranch(RegisterID left, int32_t right) 1097 { 1098 m_assembler.cmpl_ir(right, left); 1099 } 1100 1101 void compareImm32ForBranchEquality(RegisterID reg, int32_t imm) 1102 { 1103 if (!imm) 1104 m_assembler.testl_rr(reg, reg); 1110 public: 1111 Jump branchPtr(Condition cond, RegisterID left, RegisterID right) 1112 { 1113 #if PLATFORM(X86_64) 1114 m_assembler.cmpq_rr(right, left); 1115 return Jump(m_assembler.jCC(cond)); 1116 #else 1117 return branch32(cond, left, right); 1118 #endif 1119 } 1120 1121 Jump branchPtr(Condition cond, RegisterID left, ImmPtr right) 1122 { 1123 #if PLATFORM(X86_64) 1124 intptr_t imm = right.asIntptr(); 1125 if (CAN_SIGN_EXTEND_32_64(imm)) { 1126 if (!imm) 1127 m_assembler.testq_rr(left, left); 1128 else 1129 m_assembler.cmpq_ir(imm, left); 1130 return Jump(m_assembler.jCC(cond)); 1131 } else { 1132 move(right, scratchRegister); 1133 return branchPtr(cond, left, scratchRegister); 1134 } 1135 #else 1136 return branch32(cond, left, Imm32(right)); 1137 #endif 1138 } 1139 1140 Jump branchPtr(Condition cond, RegisterID left, Address right) 1141 { 1142 #if PLATFORM(X86_64) 1143 m_assembler.cmpq_mr(right.offset, right.base, left); 1144 return Jump(m_assembler.jCC(cond)); 1145 #else 1146 return branch32(cond, left, right); 1147 #endif 1148 } 1149 1150 Jump branchPtr(Condition cond, AbsoluteAddress left, RegisterID right) 1151 { 1152 #if PLATFORM(X86_64) 1153 move(ImmPtr(left.m_ptr), scratchRegister); 1154 return branchPtr(cond, Address(scratchRegister), right); 1155 #else 1156 m_assembler.cmpl_rm(right, left.m_ptr); 1157 return Jump(m_assembler.jCC(cond)); 1158 #endif 1159 } 1160 1161 Jump branchPtr(Condition cond, Address left, RegisterID right) 1162 { 1163 #if PLATFORM(X86_64) 1164 m_assembler.cmpq_rm(right, left.offset, left.base); 1165 return Jump(m_assembler.jCC(cond)); 1166 #else 1167 return branch32(cond, left, right); 1168 #endif 1169 } 1170 1171 Jump branchPtr(Condition cond, Address left, ImmPtr right) 1172 { 1173 #if PLATFORM(X86_64) 1174 move(right, scratchRegister); 1175 return branchPtr(cond, left, scratchRegister); 1176 #else 1177 return branch32(cond, left, Imm32(right)); 1178 #endif 1179 } 1180 1181 #if !PLATFORM(X86_64) 1182 Jump branchPtr(Condition cond, AbsoluteAddress left, ImmPtr right) 1183 { 1184 m_assembler.cmpl_im(right.asIntptr(), left.m_ptr); 1185 return Jump(m_assembler.jCC(cond)); 1186 } 1187 #endif 1188 1189 Jump branchPtrWithPatch(Condition cond, RegisterID left, DataLabelPtr& dataLabel, ImmPtr initialRightValue = ImmPtr(0)) 1190 { 1191 #if PLATFORM(X86_64) 1192 m_assembler.movq_i64r(initialRightValue.asIntptr(), scratchRegister); 1193 dataLabel = DataLabelPtr(this); 1194 return branchPtr(cond, left, scratchRegister); 1195 #else 1196 m_assembler.cmpl_ir_force32(initialRightValue.asIntptr(), left); 1197 dataLabel = DataLabelPtr(this); 1198 return Jump(m_assembler.jCC(cond)); 1199 #endif 1200 } 1201 1202 Jump branchPtrWithPatch(Condition cond, Address left, DataLabelPtr& dataLabel, ImmPtr initialRightValue = ImmPtr(0)) 1203 { 1204 #if PLATFORM(X86_64) 1205 m_assembler.movq_i64r(initialRightValue.asIntptr(), scratchRegister); 1206 dataLabel = DataLabelPtr(this); 1207 return branchPtr(cond, left, scratchRegister); 1208 #else 1209 m_assembler.cmpl_im_force32(initialRightValue.asIntptr(), left.offset, left.base); 1210 dataLabel = DataLabelPtr(this); 1211 return Jump(m_assembler.jCC(cond)); 1212 #endif 1213 } 1214 1215 Jump branch32(Condition cond, RegisterID left, RegisterID right) 1216 { 1217 m_assembler.cmpl_rr(right, left); 1218 return Jump(m_assembler.jCC(cond)); 1219 } 1220 1221 Jump branch32(Condition cond, RegisterID left, Imm32 right) 1222 { 1223 if (((cond == Equal) || (cond == NotEqual)) && !right.m_value) 1224 m_assembler.testl_rr(left, left); 1105 1225 else 1106 m_assembler.cmpl_ir(imm, reg); 1107 } 1108 1109 void compareImm32ForBranchEquality(Address address, int32_t imm) 1110 { 1111 m_assembler.cmpl_im(imm, address.offset, address.base); 1112 } 1113 1114 void testImm32(RegisterID reg, Imm32 mask) 1115 { 1226 m_assembler.cmpl_ir(right.m_value, left); 1227 return Jump(m_assembler.jCC(cond)); 1228 } 1229 1230 Jump branch32(Condition cond, RegisterID left, Address right) 1231 { 1232 m_assembler.cmpl_mr(right.offset, right.base, left); 1233 return Jump(m_assembler.jCC(cond)); 1234 } 1235 1236 Jump branch32(Condition cond, Address left, RegisterID right) 1237 { 1238 m_assembler.cmpl_rm(right, left.offset, left.base); 1239 return Jump(m_assembler.jCC(cond)); 1240 } 1241 1242 Jump branch32(Condition cond, Address left, Imm32 right) 1243 { 1244 m_assembler.cmpl_im(right.m_value, left.offset, left.base); 1245 return Jump(m_assembler.jCC(cond)); 1246 } 1247 1248 Jump branch16(Condition cond, BaseIndex left, RegisterID right) 1249 { 1250 m_assembler.cmpw_rm(right, left.offset, left.base, left.index, left.scale); 1251 return Jump(m_assembler.jCC(cond)); 1252 } 1253 1254 Jump branchTestPtr(Condition cond, RegisterID reg, RegisterID mask) 1255 { 1256 #if PLATFORM(X86_64) 1257 m_assembler.testq_rr(reg, mask); 1258 return Jump(m_assembler.jCC(cond)); 1259 #else 1260 return branchTest32(cond, reg, mask); 1261 #endif 1262 } 1263 1264 Jump branchTestPtr(Condition cond, RegisterID reg, Imm32 mask = Imm32(-1)) 1265 { 1266 #if PLATFORM(X86_64) 1267 // if we are only interested in the low seven bits, this can be tested with a testb 1268 if (mask.m_value == -1) 1269 m_assembler.testq_rr(reg, reg); 1270 else if ((mask.m_value & ~0x7f) == 0) 1271 m_assembler.testb_i8r(mask.m_value, reg); 1272 else 1273 m_assembler.testq_i32r(mask.m_value, reg); 1274 return Jump(m_assembler.jCC(cond)); 1275 #else 1276 return branchTest32(cond, reg, mask); 1277 #endif 1278 } 1279 1280 Jump branchTestPtr(Condition cond, Address address, Imm32 mask = Imm32(-1)) 1281 { 1282 #if PLATFORM(X86_64) 1283 if (mask.m_value == -1) 1284 m_assembler.cmpq_im(0, address.offset, address.base); 1285 else 1286 m_assembler.testq_i32m(mask.m_value, address.offset, address.base); 1287 return Jump(m_assembler.jCC(cond)); 1288 #else 1289 return branchTest32(cond, address, mask); 1290 #endif 1291 } 1292 1293 Jump branchTestPtr(Condition cond, BaseIndex address, Imm32 mask = Imm32(-1)) 1294 { 1295 #if PLATFORM(X86_64) 1296 if (mask.m_value == -1) 1297 m_assembler.cmpq_im(0, address.offset, address.base, address.index, address.scale); 1298 else 1299 m_assembler.testq_i32m(mask.m_value, address.offset, address.base, address.index, address.scale); 1300 return Jump(m_assembler.jCC(cond)); 1301 #else 1302 return branchTest32(cond, address, mask); 1303 #endif 1304 } 1305 1306 Jump branchTest32(Condition cond, RegisterID reg, RegisterID mask) 1307 { 1308 ASSERT((cond == Zero) || (cond == NonZero)); 1309 m_assembler.testl_rr(reg, mask); 1310 return Jump(m_assembler.jCC(cond)); 1311 } 1312 1313 Jump branchTest32(Condition cond, RegisterID reg, Imm32 mask = Imm32(-1)) 1314 { 1315 ASSERT((cond == Zero) || (cond == NonZero)); 1116 1316 // if we are only interested in the low seven bits, this can be tested with a testb 1117 1317 if (mask.m_value == -1) … … 1121 1321 else 1122 1322 m_assembler.testl_i32r(mask.m_value, reg); 1123 } 1124 1125 void testImm32(Address address, Imm32 mask) 1126 { 1323 return Jump(m_assembler.jCC(cond)); 1324 } 1325 1326 Jump branchTest32(Condition cond, Address address, Imm32 mask = Imm32(-1)) 1327 { 1328 ASSERT((cond == Zero) || (cond == NonZero)); 1127 1329 if (mask.m_value == -1) 1128 1330 m_assembler.cmpl_im(0, address.offset, address.base); 1129 1331 else 1130 1332 m_assembler.testl_i32m(mask.m_value, address.offset, address.base); 1131 } 1132 1133 void testImm32(BaseIndex address, Imm32 mask) 1134 { 1333 return Jump(m_assembler.jCC(cond)); 1334 } 1335 1336 Jump branchTest32(Condition cond, BaseIndex address, Imm32 mask = Imm32(-1)) 1337 { 1338 ASSERT((cond == Zero) || (cond == NonZero)); 1135 1339 if (mask.m_value == -1) 1136 1340 m_assembler.cmpl_im(0, address.offset, address.base, address.index, address.scale); 1137 1341 else 1138 1342 m_assembler.testl_i32m(mask.m_value, address.offset, address.base, address.index, address.scale); 1139 } 1140 1141 #if PLATFORM(X86_64) 1142 void compareImm64ForBranch(RegisterID left, int32_t right) 1143 { 1144 m_assembler.cmpq_ir(right, left); 1145 } 1146 1147 void compareImm64ForBranchEquality(RegisterID reg, int32_t imm) 1148 { 1149 if (!imm) 1150 m_assembler.testq_rr(reg, reg); 1151 else 1152 m_assembler.cmpq_ir(imm, reg); 1153 } 1154 1155 void testImm64(RegisterID reg, Imm32 mask) 1156 { 1157 // if we are only interested in the low seven bits, this can be tested with a testb 1158 if (mask.m_value == -1) 1159 m_assembler.testq_rr(reg, reg); 1160 else if ((mask.m_value & ~0x7f) == 0) 1161 m_assembler.testb_i8r(mask.m_value, reg); 1162 else 1163 m_assembler.testq_i32r(mask.m_value, reg); 1164 } 1165 1166 void testImm64(Address address, Imm32 mask) 1167 { 1168 if (mask.m_value == -1) 1169 m_assembler.cmpq_im(0, address.offset, address.base); 1170 else 1171 m_assembler.testq_i32m(mask.m_value, address.offset, address.base); 1172 } 1173 1174 void testImm64(BaseIndex address, Imm32 mask) 1175 { 1176 if (mask.m_value == -1) 1177 m_assembler.cmpq_im(0, address.offset, address.base, address.index, address.scale); 1178 else 1179 m_assembler.testq_i32m(mask.m_value, address.offset, address.base, address.index, address.scale); 1180 } 1181 #endif 1182 1183 public: 1184 Jump ja32(RegisterID left, Imm32 right) 1185 { 1186 compareImm32ForBranch(left, right.m_value); 1187 return Jump(m_assembler.ja()); 1188 } 1189 1190 Jump jaePtr(RegisterID left, RegisterID right) 1191 { 1192 #if PLATFORM(X86_64) 1193 m_assembler.cmpq_rr(right, left); 1194 return Jump(m_assembler.jae()); 1195 #else 1196 return jae32(left, right); 1197 #endif 1198 } 1199 1200 Jump jaePtr(RegisterID reg, ImmPtr ptr) 1201 { 1202 #if PLATFORM(X86_64) 1203 intptr_t imm = ptr.asIntptr(); 1204 if (CAN_SIGN_EXTEND_32_64(imm)) { 1205 compareImm64ForBranch(reg, imm); 1206 return Jump(m_assembler.jae()); 1207 } else { 1208 move(ptr, scratchRegister); 1209 return jaePtr(reg, scratchRegister); 1210 } 1211 #else 1212 return jae32(reg, Imm32(ptr)); 1213 #endif 1214 } 1215 1216 Jump jae32(RegisterID left, RegisterID right) 1217 { 1218 m_assembler.cmpl_rr(right, left); 1219 return Jump(m_assembler.jae()); 1220 } 1221 1222 Jump jae32(RegisterID left, Imm32 right) 1223 { 1224 compareImm32ForBranch(left, right.m_value); 1225 return Jump(m_assembler.jae()); 1226 } 1227 1228 Jump jae32(RegisterID left, Address right) 1229 { 1230 m_assembler.cmpl_mr(right.offset, right.base, left); 1231 return Jump(m_assembler.jae()); 1232 } 1233 1234 Jump jae32(Address left, RegisterID right) 1235 { 1236 m_assembler.cmpl_rm(right, left.offset, left.base); 1237 return Jump(m_assembler.jae()); 1238 } 1239 1240 Jump jbPtr(RegisterID left, RegisterID right) 1241 { 1242 #if PLATFORM(X86_64) 1243 m_assembler.cmpq_rr(right, left); 1244 return Jump(m_assembler.jb()); 1245 #else 1246 return jb32(left, right); 1247 #endif 1248 } 1249 1250 Jump jbPtr(RegisterID reg, ImmPtr ptr) 1251 { 1252 #if PLATFORM(X86_64) 1253 intptr_t imm = ptr.asIntptr(); 1254 if (CAN_SIGN_EXTEND_32_64(imm)) { 1255 compareImm64ForBranch(reg, imm); 1256 return Jump(m_assembler.jb()); 1257 } else { 1258 move(ptr, scratchRegister); 1259 return jbPtr(reg, scratchRegister); 1260 } 1261 #else 1262 return jb32(reg, Imm32(ptr)); 1263 #endif 1264 } 1265 1266 Jump jb32(RegisterID left, RegisterID right) 1267 { 1268 m_assembler.cmpl_rr(right, left); 1269 return Jump(m_assembler.jb()); 1270 } 1271 1272 Jump jb32(RegisterID left, Imm32 right) 1273 { 1274 compareImm32ForBranch(left, right.m_value); 1275 return Jump(m_assembler.jb()); 1276 } 1277 1278 Jump jb32(RegisterID left, Address right) 1279 { 1280 m_assembler.cmpl_mr(right.offset, right.base, left); 1281 return Jump(m_assembler.jb()); 1282 } 1283 1284 Jump jePtr(RegisterID op1, RegisterID op2) 1285 { 1286 #if PLATFORM(X86_64) 1287 m_assembler.cmpq_rr(op1, op2); 1288 return Jump(m_assembler.je()); 1289 #else 1290 return je32(op1, op2); 1291 #endif 1292 } 1293 1294 Jump jePtr(RegisterID reg, Address address) 1295 { 1296 #if PLATFORM(X86_64) 1297 m_assembler.cmpq_rm(reg, address.offset, address.base); 1298 #else 1299 m_assembler.cmpl_rm(reg, address.offset, address.base); 1300 #endif 1301 return Jump(m_assembler.je()); 1302 } 1303 1304 Jump jePtr(RegisterID reg, ImmPtr ptr) 1305 { 1306 #if PLATFORM(X86_64) 1307 intptr_t imm = ptr.asIntptr(); 1308 if (CAN_SIGN_EXTEND_32_64(imm)) { 1309 compareImm64ForBranchEquality(reg, imm); 1310 return Jump(m_assembler.je()); 1311 } else { 1312 move(ptr, scratchRegister); 1313 return jePtr(scratchRegister, reg); 1314 } 1315 #else 1316 return je32(reg, Imm32(ptr)); 1317 #endif 1318 } 1319 1320 Jump jePtr(Address address, ImmPtr imm) 1321 { 1322 #if PLATFORM(X86_64) 1323 move(imm, scratchRegister); 1324 return jePtr(scratchRegister, address); 1325 #else 1326 return je32(address, Imm32(imm)); 1327 #endif 1328 } 1329 1330 Jump je32(RegisterID op1, RegisterID op2) 1331 { 1332 m_assembler.cmpl_rr(op1, op2); 1333 return Jump(m_assembler.je()); 1334 } 1335 1336 Jump je32(Address op1, RegisterID op2) 1337 { 1338 m_assembler.cmpl_mr(op1.offset, op1.base, op2); 1339 return Jump(m_assembler.je()); 1340 } 1341 1342 Jump je32(RegisterID reg, Imm32 imm) 1343 { 1344 compareImm32ForBranchEquality(reg, imm.m_value); 1345 return Jump(m_assembler.je()); 1346 } 1347 1348 Jump je32(Address address, Imm32 imm) 1349 { 1350 compareImm32ForBranchEquality(address, imm.m_value); 1351 return Jump(m_assembler.je()); 1352 } 1353 1354 Jump je16(RegisterID op1, BaseIndex op2) 1355 { 1356 m_assembler.cmpw_rm(op1, op2.offset, op2.base, op2.index, op2.scale); 1357 return Jump(m_assembler.je()); 1358 } 1359 1360 Jump jg32(RegisterID left, RegisterID right) 1361 { 1362 m_assembler.cmpl_rr(right, left); 1363 return Jump(m_assembler.jg()); 1364 } 1365 1366 Jump jg32(RegisterID reg, Address address) 1367 { 1368 m_assembler.cmpl_mr(address.offset, address.base, reg); 1369 return Jump(m_assembler.jg()); 1370 } 1371 1372 Jump jgePtr(RegisterID left, RegisterID right) 1373 { 1374 #if PLATFORM(X86_64) 1375 m_assembler.cmpq_rr(right, left); 1376 return Jump(m_assembler.jge()); 1377 #else 1378 return jge32(left, right); 1379 #endif 1380 } 1381 1382 Jump jgePtr(RegisterID reg, ImmPtr ptr) 1383 { 1384 #if PLATFORM(X86_64) 1385 intptr_t imm = ptr.asIntptr(); 1386 if (CAN_SIGN_EXTEND_32_64(imm)) { 1387 compareImm64ForBranch(reg, imm); 1388 return Jump(m_assembler.jge()); 1389 } else { 1390 move(ptr, scratchRegister); 1391 return jgePtr(reg, scratchRegister); 1392 } 1393 #else 1394 return jge32(reg, Imm32(ptr)); 1395 #endif 1396 } 1397 1398 Jump jge32(RegisterID left, RegisterID right) 1399 { 1400 m_assembler.cmpl_rr(right, left); 1401 return Jump(m_assembler.jge()); 1402 } 1403 1404 Jump jge32(RegisterID left, Imm32 right) 1405 { 1406 compareImm32ForBranch(left, right.m_value); 1407 return Jump(m_assembler.jge()); 1408 } 1409 1410 Jump jlPtr(RegisterID left, RegisterID right) 1411 { 1412 #if PLATFORM(X86_64) 1413 m_assembler.cmpq_rr(right, left); 1414 return Jump(m_assembler.jl()); 1415 #else 1416 return jl32(left, right); 1417 #endif 1418 } 1419 1420 Jump jlPtr(RegisterID reg, ImmPtr ptr) 1421 { 1422 #if PLATFORM(X86_64) 1423 intptr_t imm = ptr.asIntptr(); 1424 if (CAN_SIGN_EXTEND_32_64(imm)) { 1425 compareImm64ForBranch(reg, imm); 1426 return Jump(m_assembler.jl()); 1427 } else { 1428 move(ptr, scratchRegister); 1429 return jlPtr(reg, scratchRegister); 1430 } 1431 #else 1432 return jl32(reg, Imm32(ptr)); 1433 #endif 1434 } 1435 1436 Jump jl32(RegisterID left, RegisterID right) 1437 { 1438 m_assembler.cmpl_rr(right, left); 1439 return Jump(m_assembler.jl()); 1440 } 1441 1442 Jump jl32(RegisterID left, Imm32 right) 1443 { 1444 compareImm32ForBranch(left, right.m_value); 1445 return Jump(m_assembler.jl()); 1446 } 1447 1448 Jump jlePtr(RegisterID left, RegisterID right) 1449 { 1450 #if PLATFORM(X86_64) 1451 m_assembler.cmpq_rr(right, left); 1452 return Jump(m_assembler.jle()); 1453 #else 1454 return jle32(left, right); 1455 #endif 1456 } 1457 1458 Jump jlePtr(RegisterID reg, ImmPtr ptr) 1459 { 1460 #if PLATFORM(X86_64) 1461 intptr_t imm = ptr.asIntptr(); 1462 if (CAN_SIGN_EXTEND_32_64(imm)) { 1463 compareImm64ForBranch(reg, imm); 1464 return Jump(m_assembler.jle()); 1465 } else { 1466 move(ptr, scratchRegister); 1467 return jlePtr(reg, scratchRegister); 1468 } 1469 #else 1470 return jle32(reg, Imm32(ptr)); 1471 #endif 1472 } 1473 1474 Jump jle32(RegisterID left, RegisterID right) 1475 { 1476 m_assembler.cmpl_rr(right, left); 1477 return Jump(m_assembler.jle()); 1478 } 1479 1480 Jump jle32(RegisterID left, Imm32 right) 1481 { 1482 compareImm32ForBranch(left, right.m_value); 1483 return Jump(m_assembler.jle()); 1484 } 1485 1486 Jump jnePtr(RegisterID op1, RegisterID op2) 1487 { 1488 #if PLATFORM(X86_64) 1489 m_assembler.cmpq_rr(op1, op2); 1490 return Jump(m_assembler.jne()); 1491 #else 1492 return jne32(op1, op2); 1493 #endif 1494 } 1495 1496 Jump jnePtr(RegisterID reg, Address address) 1497 { 1498 #if PLATFORM(X86_64) 1499 m_assembler.cmpq_rm(reg, address.offset, address.base); 1500 #else 1501 m_assembler.cmpl_rm(reg, address.offset, address.base); 1502 #endif 1503 return Jump(m_assembler.jne()); 1504 } 1505 1506 Jump jnePtr(RegisterID reg, AbsoluteAddress address) 1507 { 1508 #if PLATFORM(X86_64) 1509 move(ImmPtr(address.m_ptr), scratchRegister); 1510 return jnePtr(reg, Address(scratchRegister)); 1511 #else 1512 m_assembler.cmpl_rm(reg, address.m_ptr); 1513 return Jump(m_assembler.jne()); 1514 #endif 1515 } 1516 1517 Jump jnePtr(RegisterID reg, ImmPtr ptr) 1518 { 1519 #if PLATFORM(X86_64) 1520 intptr_t imm = ptr.asIntptr(); 1521 if (CAN_SIGN_EXTEND_32_64(imm)) { 1522 compareImm64ForBranchEquality(reg, imm); 1523 return Jump(m_assembler.jne()); 1524 } else { 1525 move(ptr, scratchRegister); 1526 return jnePtr(scratchRegister, reg); 1527 } 1528 #else 1529 return jne32(reg, Imm32(ptr)); 1530 #endif 1531 } 1532 1533 Jump jnePtr(Address address, ImmPtr imm) 1534 { 1535 #if PLATFORM(X86_64) 1536 move(imm, scratchRegister); 1537 return jnePtr(scratchRegister, address); 1538 #else 1539 return jne32(address, Imm32(imm)); 1540 #endif 1541 } 1542 1543 #if !PLATFORM(X86_64) 1544 Jump jnePtr(AbsoluteAddress address, ImmPtr imm) 1545 { 1546 m_assembler.cmpl_im(imm.asIntptr(), address.m_ptr); 1547 return Jump(m_assembler.jne()); 1548 } 1549 #endif 1550 1551 Jump jnePtrWithPatch(RegisterID reg, DataLabelPtr& dataLabel, ImmPtr initialValue = ImmPtr(0)) 1552 { 1553 #if PLATFORM(X86_64) 1554 m_assembler.movq_i64r(initialValue.asIntptr(), scratchRegister); 1555 dataLabel = DataLabelPtr(this); 1556 return jnePtr(scratchRegister, reg); 1557 #else 1558 m_assembler.cmpl_ir_force32(initialValue.asIntptr(), reg); 1559 dataLabel = DataLabelPtr(this); 1560 return Jump(m_assembler.jne()); 1561 #endif 1562 } 1563 1564 Jump jnePtrWithPatch(Address address, DataLabelPtr& dataLabel, ImmPtr initialValue = ImmPtr(0)) 1565 { 1566 #if PLATFORM(X86_64) 1567 m_assembler.movq_i64r(initialValue.asIntptr(), scratchRegister); 1568 dataLabel = DataLabelPtr(this); 1569 return jnePtr(scratchRegister, address); 1570 #else 1571 m_assembler.cmpl_im_force32(initialValue.asIntptr(), address.offset, address.base); 1572 dataLabel = DataLabelPtr(this); 1573 return Jump(m_assembler.jne()); 1574 #endif 1575 } 1576 1577 Jump jne32(RegisterID op1, RegisterID op2) 1578 { 1579 m_assembler.cmpl_rr(op1, op2); 1580 return Jump(m_assembler.jne()); 1581 } 1582 1583 Jump jne32(RegisterID reg, Imm32 imm) 1584 { 1585 compareImm32ForBranchEquality(reg, imm.m_value); 1586 return Jump(m_assembler.jne()); 1587 } 1588 1589 Jump jne32(Address address, Imm32 imm) 1590 { 1591 compareImm32ForBranchEquality(address, imm.m_value); 1592 return Jump(m_assembler.jne()); 1593 } 1594 1595 Jump jne32(Address address, RegisterID reg) 1596 { 1597 m_assembler.cmpl_rm(reg, address.offset, address.base); 1598 return Jump(m_assembler.jne()); 1599 } 1600 1601 Jump jnzPtr(RegisterID reg, RegisterID mask) 1602 { 1603 #if PLATFORM(X86_64) 1604 m_assembler.testq_rr(reg, mask); 1605 return Jump(m_assembler.jne()); 1606 #else 1607 return jnz32(reg, mask); 1608 #endif 1609 } 1610 1611 Jump jnzPtr(RegisterID reg, Imm32 mask = Imm32(-1)) 1612 { 1613 #if PLATFORM(X86_64) 1614 testImm64(reg, mask); 1615 return Jump(m_assembler.jne()); 1616 #else 1617 return jnz32(reg, mask); 1618 #endif 1619 } 1620 1621 Jump jnzPtr(RegisterID reg, ImmPtr mask) 1622 { 1623 #if PLATFORM(X86_64) 1624 move(mask, scratchRegister); 1625 m_assembler.testq_rr(scratchRegister, reg); 1626 return Jump(m_assembler.jne()); 1627 #else 1628 return jnz32(reg, Imm32(mask)); 1629 #endif 1630 } 1631 1632 Jump jnzPtr(Address address, Imm32 mask = Imm32(-1)) 1633 { 1634 #if PLATFORM(X86_64) 1635 testImm64(address, mask); 1636 return Jump(m_assembler.jne()); 1637 #else 1638 return jnz32(address, mask); 1639 #endif 1640 } 1641 1642 Jump jnz32(RegisterID reg, RegisterID mask) 1643 { 1644 m_assembler.testl_rr(reg, mask); 1645 return Jump(m_assembler.jne()); 1646 } 1647 1648 Jump jnz32(RegisterID reg, Imm32 mask = Imm32(-1)) 1649 { 1650 testImm32(reg, mask); 1651 return Jump(m_assembler.jne()); 1652 } 1653 1654 Jump jnz32(Address address, Imm32 mask = Imm32(-1)) 1655 { 1656 testImm32(address, mask); 1657 return Jump(m_assembler.jne()); 1658 } 1659 1660 Jump jzPtr(RegisterID reg, RegisterID mask) 1661 { 1662 #if PLATFORM(X86_64) 1663 m_assembler.testq_rr(reg, mask); 1664 return Jump(m_assembler.je()); 1665 #else 1666 return jz32(reg, mask); 1667 #endif 1668 } 1669 1670 Jump jzPtr(RegisterID reg, Imm32 mask = Imm32(-1)) 1671 { 1672 #if PLATFORM(X86_64) 1673 testImm64(reg, mask); 1674 return Jump(m_assembler.je()); 1675 #else 1676 return jz32(reg, mask); 1677 #endif 1678 } 1679 1680 Jump jzPtr(RegisterID reg, ImmPtr mask) 1681 { 1682 #if PLATFORM(X86_64) 1683 move(mask, scratchRegister); 1684 m_assembler.testq_rr(scratchRegister, reg); 1685 return Jump(m_assembler.je()); 1686 #else 1687 return jz32(reg, Imm32(mask)); 1688 #endif 1689 } 1690 1691 Jump jzPtr(Address address, Imm32 mask = Imm32(-1)) 1692 { 1693 #if PLATFORM(X86_64) 1694 testImm64(address, mask); 1695 return Jump(m_assembler.je()); 1696 #else 1697 return jz32(address, mask); 1698 #endif 1699 } 1700 1701 Jump jzPtr(BaseIndex address, Imm32 mask = Imm32(-1)) 1702 { 1703 #if PLATFORM(X86_64) 1704 testImm64(address, mask); 1705 return Jump(m_assembler.je()); 1706 #else 1707 return jz32(address, mask); 1708 #endif 1709 } 1710 1711 Jump jz32(RegisterID reg, RegisterID mask) 1712 { 1713 m_assembler.testl_rr(reg, mask); 1714 return Jump(m_assembler.je()); 1715 } 1716 1717 Jump jz32(RegisterID reg, Imm32 mask = Imm32(-1)) 1718 { 1719 testImm32(reg, mask); 1720 return Jump(m_assembler.je()); 1721 } 1722 1723 Jump jz32(Address address, Imm32 mask = Imm32(-1)) 1724 { 1725 testImm32(address, mask); 1726 return Jump(m_assembler.je()); 1727 } 1728 1729 Jump jz32(BaseIndex address, Imm32 mask = Imm32(-1)) 1730 { 1731 testImm32(address, mask); 1732 return Jump(m_assembler.je()); 1343 return Jump(m_assembler.jCC(cond)); 1733 1344 } 1734 1345 … … 1759 1370 // jne32(reg1, reg2).linkTo(topOfLoop); 1760 1371 1761 void jae32(RegisterID left, Address right, Label target) 1762 { 1763 jae32(left, right).linkTo(target, this); 1764 } 1765 1766 void je32(RegisterID op1, Imm32 imm, Label target) 1767 { 1768 je32(op1, imm).linkTo(target, this); 1769 } 1770 1771 void je16(RegisterID op1, BaseIndex op2, Label target) 1772 { 1773 je16(op1, op2).linkTo(target, this); 1774 } 1775 1776 void jl32(RegisterID left, Imm32 right, Label target) 1777 { 1778 jl32(left, right).linkTo(target, this); 1779 } 1780 1781 void jle32(RegisterID left, RegisterID right, Label target) 1782 { 1783 jle32(left, right).linkTo(target, this); 1784 } 1785 1786 void jnePtr(RegisterID op1, ImmPtr imm, Label target) 1787 { 1788 jnePtr(op1, imm).linkTo(target, this); 1789 } 1790 1791 void jne32(RegisterID op1, RegisterID op2, Label target) 1792 { 1793 jne32(op1, op2).linkTo(target, this); 1794 } 1795 1796 void jne32(RegisterID op1, Imm32 imm, Label target) 1797 { 1798 jne32(op1, imm).linkTo(target, this); 1799 } 1800 1801 void jzPtr(RegisterID reg, Label target) 1802 { 1803 jzPtr(reg).linkTo(target, this); 1372 void branchPtr(Condition cond, RegisterID op1, ImmPtr imm, Label target) 1373 { 1374 branchPtr(cond, op1, imm).linkTo(target, this); 1375 } 1376 1377 void branch32(Condition cond, RegisterID op1, RegisterID op2, Label target) 1378 { 1379 branch32(cond, op1, op2).linkTo(target, this); 1380 } 1381 1382 void branch32(Condition cond, RegisterID op1, Imm32 imm, Label target) 1383 { 1384 branch32(cond, op1, imm).linkTo(target, this); 1385 } 1386 1387 void branch32(Condition cond, RegisterID left, Address right, Label target) 1388 { 1389 branch32(cond, left, right).linkTo(target, this); 1390 } 1391 1392 void branch16(Condition cond, BaseIndex left, RegisterID right, Label target) 1393 { 1394 branch16(cond, left, right).linkTo(target, this); 1395 } 1396 1397 void branchTestPtr(Condition cond, RegisterID reg, Label target) 1398 { 1399 branchTestPtr(cond, reg).linkTo(target, this); 1804 1400 } 1805 1401 … … 1831 1427 // operation caused an overflow to occur. 1832 1428 1833 Jump jnzSubPtr(Imm32 imm, RegisterID dest) 1834 { 1429 Jump branchAddPtr(Condition cond, RegisterID src, RegisterID dest) 1430 { 1431 ASSERT((cond == Overflow) || (cond == Zero) || (cond == NonZero)); 1432 addPtr(src, dest); 1433 return Jump(m_assembler.jCC(cond)); 1434 } 1435 1436 Jump branchAdd32(Condition cond, RegisterID src, RegisterID dest) 1437 { 1438 ASSERT((cond == Overflow) || (cond == Zero) || (cond == NonZero)); 1439 add32(src, dest); 1440 return Jump(m_assembler.jCC(cond)); 1441 } 1442 1443 Jump branchAdd32(Condition cond, Imm32 imm, RegisterID dest) 1444 { 1445 ASSERT((cond == Overflow) || (cond == Zero) || (cond == NonZero)); 1446 add32(imm, dest); 1447 return Jump(m_assembler.jCC(cond)); 1448 } 1449 1450 Jump branchMul32(Condition cond, RegisterID src, RegisterID dest) 1451 { 1452 ASSERT((cond == Overflow) || (cond == Zero) || (cond == NonZero)); 1453 mul32(src, dest); 1454 return Jump(m_assembler.jCC(cond)); 1455 } 1456 1457 Jump branchMul32(Condition cond, Imm32 imm, RegisterID src, RegisterID dest) 1458 { 1459 ASSERT((cond == Overflow) || (cond == Zero) || (cond == NonZero)); 1460 mul32(imm, src, dest); 1461 return Jump(m_assembler.jCC(cond)); 1462 } 1463 1464 Jump branchSubPtr(Condition cond, Imm32 imm, RegisterID dest) 1465 { 1466 ASSERT((cond == Overflow) || (cond == Zero) || (cond == NonZero)); 1835 1467 subPtr(imm, dest); 1836 return Jump(m_assembler.jne()); 1837 } 1838 1839 Jump jnzSub32(Imm32 imm, RegisterID dest) 1840 { 1468 return Jump(m_assembler.jCC(cond)); 1469 } 1470 1471 Jump branchSub32(Condition cond, RegisterID src, RegisterID dest) 1472 { 1473 ASSERT((cond == Overflow) || (cond == Zero) || (cond == NonZero)); 1474 sub32(src, dest); 1475 return Jump(m_assembler.jCC(cond)); 1476 } 1477 1478 Jump branchSub32(Condition cond, Imm32 imm, RegisterID dest) 1479 { 1480 ASSERT((cond == Overflow) || (cond == Zero) || (cond == NonZero)); 1841 1481 sub32(imm, dest); 1842 return Jump(m_assembler.jne()); 1843 } 1844 1845 Jump joAddPtr(RegisterID src, RegisterID dest) 1846 { 1847 addPtr(src, dest); 1848 return Jump(m_assembler.jo()); 1849 } 1850 1851 Jump joAdd32(RegisterID src, RegisterID dest) 1852 { 1853 add32(src, dest); 1854 return Jump(m_assembler.jo()); 1855 } 1856 1857 Jump joAdd32(Imm32 imm, RegisterID dest) 1858 { 1859 add32(imm, dest); 1860 return Jump(m_assembler.jo()); 1861 } 1862 1863 Jump joMul32(RegisterID src, RegisterID dest) 1864 { 1865 mul32(src, dest); 1866 return Jump(m_assembler.jo()); 1867 } 1868 1869 Jump joMul32(Imm32 imm, RegisterID src, RegisterID dest) 1870 { 1871 mul32(imm, src, dest); 1872 return Jump(m_assembler.jo()); 1873 } 1874 1875 Jump joSub32(RegisterID src, RegisterID dest) 1876 { 1877 sub32(src, dest); 1878 return Jump(m_assembler.jo()); 1879 } 1880 1881 Jump joSub32(Imm32 imm, RegisterID dest) 1882 { 1883 sub32(imm, dest); 1884 return Jump(m_assembler.jo()); 1885 } 1886 1887 Jump jzSubPtr(Imm32 imm, RegisterID dest) 1888 { 1889 subPtr(imm, dest); 1890 return Jump(m_assembler.je()); 1891 } 1892 1893 Jump jzSub32(Imm32 imm, RegisterID dest) 1894 { 1895 sub32(imm, dest); 1896 return Jump(m_assembler.je()); 1482 return Jump(m_assembler.jCC(cond)); 1897 1483 } 1898 1484 … … 1966 1552 } 1967 1553 1968 void sete32(RegisterID src, RegisterID srcDest) 1969 { 1970 m_assembler.cmpl_rr(srcDest, src); 1971 m_assembler.sete_r(srcDest); 1972 m_assembler.movzbl_rr(srcDest, srcDest); 1973 } 1974 1975 void sete32(Imm32 imm, RegisterID srcDest) 1976 { 1977 compareImm32ForBranchEquality(srcDest, imm.m_value); 1978 m_assembler.sete_r(srcDest); 1979 m_assembler.movzbl_rr(srcDest, srcDest); 1980 } 1981 1982 void setne32(RegisterID src, RegisterID srcDest) 1983 { 1984 m_assembler.cmpl_rr(srcDest, src); 1985 m_assembler.setne_r(srcDest); 1986 m_assembler.movzbl_rr(srcDest, srcDest); 1987 } 1988 1989 void setne32(Imm32 imm, RegisterID srcDest) 1990 { 1991 compareImm32ForBranchEquality(srcDest, imm.m_value); 1992 m_assembler.setne_r(srcDest); 1993 m_assembler.movzbl_rr(srcDest, srcDest); 1554 void set32(Condition cond, RegisterID left, RegisterID right, RegisterID dest) 1555 { 1556 m_assembler.cmpl_rr(right, left); 1557 m_assembler.setCC_r(cond, dest); 1558 m_assembler.movzbl_rr(dest, dest); 1559 } 1560 1561 void set32(Condition cond, RegisterID left, Imm32 right, RegisterID dest) 1562 { 1563 if (((cond == Equal) || (cond == NotEqual)) && !right.m_value) 1564 m_assembler.testl_rr(left, left); 1565 else 1566 m_assembler.cmpl_ir(right.m_value, left); 1567 m_assembler.setCC_r(cond, dest); 1568 m_assembler.movzbl_rr(dest, dest); 1994 1569 } 1995 1570 … … 1998 1573 // dest-src, operations always have a dest? ... possibly not true, considering 1999 1574 // asm ops like test, or pseudo ops like pop(). 2000 void setnz32(Address address, Imm32 mask, RegisterID dest) 2001 { 2002 testImm32(address, mask); 2003 m_assembler.setnz_r(dest); 1575 void setTest32(Condition cond, Address address, Imm32 mask, RegisterID dest) 1576 { 1577 if (mask.m_value == -1) 1578 m_assembler.cmpl_im(0, address.offset, address.base); 1579 else 1580 m_assembler.testl_i32m(mask.m_value, address.offset, address.base); 1581 m_assembler.setCC_r(cond, dest); 2004 1582 m_assembler.movzbl_rr(dest, dest); 2005 1583 } 2006 2007 void setz32(Address address, Imm32 mask, RegisterID dest)2008 {2009 testImm32(address, mask);2010 m_assembler.setz_r(dest);2011 m_assembler.movzbl_rr(dest, dest);2012 }2013 1584 }; 2014 1585
Note:
See TracChangeset
for help on using the changeset viewer.