Changeset 40562 in webkit for trunk/JavaScriptCore
- Timestamp:
- Feb 3, 2009, 6:02:32 PM (16 years ago)
- Location:
- trunk/JavaScriptCore
- Files:
-
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/ChangeLog
r40561 r40562 1 2009-02-03 Gavin Barraclough <[email protected]> 2 3 Reviewed by Geoff Garen. 4 5 https://bugs.webkit.org/show_bug.cgi?id=23715 6 7 Simplify MacroAssembler interface, by combining comparison methods. 8 Seprate operations are combined as follows: 9 jz32/jnz32/jzPtr/jnzPtr -> branchTest32/branchTestPtr, 10 j*(Add|Mul|Sub)32/j*(Add|Mul|Sub)Ptr -> branch(Add|Mul|Sub)32/branch(Add|Mul|Sub)Ptr 11 j*32/j*Ptr (all other two op combparisons) -> branch32/brnachPtr 12 set*32 -> set32 13 14 Also, represent the Scale of BaseIndex addresses as a plain enum (0,1,2,3), 15 instead of as multiplicands (1,2,4,8). 16 17 This patch singificantly reduces replication of code, and increases functionality supported 18 by the MacroAssembler. No performance impact. 19 20 * assembler/MacroAssembler.h: 21 (JSC::MacroAssembler::): 22 (JSC::MacroAssembler::branchPtr): 23 (JSC::MacroAssembler::branchPtrWithPatch): 24 (JSC::MacroAssembler::branch32): 25 (JSC::MacroAssembler::branch16): 26 (JSC::MacroAssembler::branchTestPtr): 27 (JSC::MacroAssembler::branchTest32): 28 (JSC::MacroAssembler::branchAddPtr): 29 (JSC::MacroAssembler::branchAdd32): 30 (JSC::MacroAssembler::branchMul32): 31 (JSC::MacroAssembler::branchSubPtr): 32 (JSC::MacroAssembler::branchSub32): 33 (JSC::MacroAssembler::set32): 34 (JSC::MacroAssembler::setTest32): 35 * assembler/X86Assembler.h: 36 (JSC::X86Assembler::): 37 (JSC::X86Assembler::jccRel32): 38 (JSC::X86Assembler::setccOpcode): 39 (JSC::X86Assembler::cmpq_mr): 40 (JSC::X86Assembler::setcc_r): 41 (JSC::X86Assembler::sete_r): 42 (JSC::X86Assembler::setne_r): 43 (JSC::X86Assembler::jne): 44 (JSC::X86Assembler::je): 45 (JSC::X86Assembler::jl): 46 (JSC::X86Assembler::jb): 47 (JSC::X86Assembler::jle): 48 (JSC::X86Assembler::jbe): 49 (JSC::X86Assembler::jge): 50 (JSC::X86Assembler::jg): 51 (JSC::X86Assembler::ja): 52 (JSC::X86Assembler::jae): 53 (JSC::X86Assembler::jo): 54 (JSC::X86Assembler::jp): 55 (JSC::X86Assembler::js): 56 (JSC::X86Assembler::jcc): 57 (JSC::X86Assembler::X86InstructionFormatter::putModRmSib): 58 * jit/JIT.cpp: 59 (JSC::JIT::compileOpStrictEq): 60 (JSC::JIT::emitSlowScriptCheck): 61 (JSC::JIT::privateCompileMainPass): 62 (JSC::JIT::privateCompileSlowCases): 63 (JSC::JIT::privateCompile): 64 (JSC::JIT::privateCompileCTIMachineTrampolines): 65 * jit/JITArithmetic.cpp: 66 (JSC::JIT::compileFastArith_op_lshift): 67 (JSC::JIT::compileFastArith_op_mod): 68 (JSC::JIT::compileFastArith_op_post_inc): 69 (JSC::JIT::compileFastArith_op_post_dec): 70 (JSC::JIT::compileFastArith_op_pre_inc): 71 (JSC::JIT::compileFastArith_op_pre_dec): 72 (JSC::JIT::compileBinaryArithOp): 73 (JSC::JIT::compileFastArith_op_add): 74 (JSC::JIT::compileFastArith_op_mul): 75 * jit/JITCall.cpp: 76 (JSC::JIT::compileOpCall): 77 (JSC::JIT::compileOpCallSlowCase): 78 * jit/JITInlineMethods.h: 79 (JSC::JIT::checkStructure): 80 (JSC::JIT::emitJumpIfJSCell): 81 (JSC::JIT::emitJumpIfNotJSCell): 82 (JSC::JIT::emitJumpIfImmediateNumber): 83 (JSC::JIT::emitJumpIfNotImmediateNumber): 84 (JSC::JIT::emitJumpIfImmediateInteger): 85 (JSC::JIT::emitJumpIfNotImmediateInteger): 86 (JSC::JIT::emitFastArithDeTagImmediateJumpIfZero): 87 * jit/JITPropertyAccess.cpp: 88 (JSC::JIT::compileGetByIdHotPath): 89 (JSC::JIT::compilePutByIdHotPath): 90 (JSC::JIT::privateCompilePutByIdTransition): 91 (JSC::JIT::privateCompilePatchGetArrayLength): 92 (JSC::JIT::privateCompileGetByIdProto): 93 (JSC::JIT::privateCompileGetByIdProtoList): 94 (JSC::JIT::privateCompileGetByIdChainList): 95 (JSC::JIT::privateCompileGetByIdChain): 96 * runtime/RegExp.cpp: 97 (JSC::RegExp::match): 98 * wrec/WRECGenerator.cpp: 99 (JSC::WREC::Generator::generateEnter): 100 (JSC::WREC::Generator::generateIncrementIndex): 101 (JSC::WREC::Generator::generateLoadCharacter): 102 (JSC::WREC::Generator::generateJumpIfNotEndOfInput): 103 (JSC::WREC::Generator::generateBackreferenceQuantifier): 104 (JSC::WREC::Generator::generateNonGreedyQuantifier): 105 (JSC::WREC::Generator::generateGreedyQuantifier): 106 (JSC::WREC::Generator::generatePatternCharacterPair): 107 (JSC::WREC::Generator::generatePatternCharacter): 108 (JSC::WREC::Generator::generateCharacterClassInvertedRange): 109 (JSC::WREC::Generator::generateCharacterClassInverted): 110 (JSC::WREC::Generator::generateAssertionBOL): 111 (JSC::WREC::Generator::generateAssertionEOL): 112 (JSC::WREC::Generator::generateAssertionWordBoundary): 113 (JSC::WREC::Generator::generateBackreference): 114 1 115 2009-02-03 David Hyatt <[email protected]> 2 116 -
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 -
trunk/JavaScriptCore/assembler/X86Assembler.h
r39998 r40562 84 84 typedef X86::XMMRegisterID XMMRegisterID; 85 85 86 typedef enum { 87 ConditionO, 88 ConditionNO, 89 ConditionB, 90 ConditionAE, 91 ConditionE, 92 ConditionNE, 93 ConditionBE, 94 ConditionA, 95 ConditionS, 96 ConditionNS, 97 ConditionP, 98 ConditionNP, 99 ConditionL, 100 ConditionGE, 101 ConditionLE, 102 ConditionG, 103 104 ConditionC = ConditionB, 105 ConditionNC = ConditionAE, 106 } Condition; 107 108 private: 86 109 typedef enum { 87 110 OP_ADD_EvGv = 0x01, … … 148 171 OP2_MOVD_VdEd = 0x6E, 149 172 OP2_MOVD_EdVd = 0x7E, 150 OP2_JO_rel32 = 0x80, 151 OP2_JB_rel32 = 0x82, 152 OP2_JAE_rel32 = 0x83, 153 OP2_JE_rel32 = 0x84, 154 OP2_JNE_rel32 = 0x85, 155 OP2_JBE_rel32 = 0x86, 156 OP2_JA_rel32 = 0x87, 157 OP2_JS_rel32 = 0x88, 158 OP2_JP_rel32 = 0x8A, 159 OP2_JL_rel32 = 0x8C, 160 OP2_JGE_rel32 = 0x8D, 161 OP2_JLE_rel32 = 0x8E, 162 OP2_JG_rel32 = 0x8F, 163 OP_SETE = 0x94, 164 OP_SETNE = 0x95, 173 OP2_JCC_rel32 = 0x80, 174 OP_SETCC = 0x90, 165 175 OP2_IMUL_GvEv = 0xAF, 166 176 OP2_MOVZX_GvEb = 0xB6, … … 168 178 OP2_PEXTRW_GdUdIb = 0xC5, 169 179 } TwoByteOpcodeID; 180 181 TwoByteOpcodeID jccRel32(Condition cond) 182 { 183 return (TwoByteOpcodeID)(OP2_JCC_rel32 + cond); 184 } 185 186 TwoByteOpcodeID setccOpcode(Condition cond) 187 { 188 return (TwoByteOpcodeID)(OP_SETCC + cond); 189 } 170 190 171 191 typedef enum { … … 193 213 } GroupOpcodeID; 194 214 195 // Opaque label types196 197 private:198 215 class X86InstructionFormatter; 199 216 public: … … 641 658 } 642 659 660 void cmpq_mr(int offset, RegisterID base, RegisterID src) 661 { 662 m_formatter.oneByteOp64(OP_CMP_GvEv, src, base, offset); 663 } 664 643 665 void cmpq_ir(int imm, RegisterID dst) 644 666 { … … 751 773 } 752 774 775 void setCC_r(Condition cond, RegisterID dst) 776 { 777 m_formatter.twoByteOp8(setccOpcode(cond), (GroupOpcodeID)0, dst); 778 } 779 753 780 void sete_r(RegisterID dst) 754 781 { 755 m_formatter.twoByteOp8( OP_SETE, (GroupOpcodeID)0, dst);782 m_formatter.twoByteOp8(setccOpcode(ConditionE), (GroupOpcodeID)0, dst); 756 783 } 757 784 … … 763 790 void setne_r(RegisterID dst) 764 791 { 765 m_formatter.twoByteOp8( OP_SETNE, (GroupOpcodeID)0, dst);792 m_formatter.twoByteOp8(setccOpcode(ConditionNE), (GroupOpcodeID)0, dst); 766 793 } 767 794 … … 982 1009 JmpSrc jne() 983 1010 { 984 m_formatter.twoByteOp( OP2_JNE_rel32);1011 m_formatter.twoByteOp(jccRel32(ConditionNE)); 985 1012 return m_formatter.immediateRel32(); 986 1013 } … … 993 1020 JmpSrc je() 994 1021 { 995 m_formatter.twoByteOp( OP2_JE_rel32);1022 m_formatter.twoByteOp(jccRel32(ConditionE)); 996 1023 return m_formatter.immediateRel32(); 997 1024 } … … 999 1026 JmpSrc jl() 1000 1027 { 1001 m_formatter.twoByteOp( OP2_JL_rel32);1028 m_formatter.twoByteOp(jccRel32(ConditionL)); 1002 1029 return m_formatter.immediateRel32(); 1003 1030 } … … 1005 1032 JmpSrc jb() 1006 1033 { 1007 m_formatter.twoByteOp( OP2_JB_rel32);1034 m_formatter.twoByteOp(jccRel32(ConditionB)); 1008 1035 return m_formatter.immediateRel32(); 1009 1036 } … … 1011 1038 JmpSrc jle() 1012 1039 { 1013 m_formatter.twoByteOp( OP2_JLE_rel32);1040 m_formatter.twoByteOp(jccRel32(ConditionLE)); 1014 1041 return m_formatter.immediateRel32(); 1015 1042 } … … 1017 1044 JmpSrc jbe() 1018 1045 { 1019 m_formatter.twoByteOp( OP2_JBE_rel32);1046 m_formatter.twoByteOp(jccRel32(ConditionBE)); 1020 1047 return m_formatter.immediateRel32(); 1021 1048 } … … 1023 1050 JmpSrc jge() 1024 1051 { 1025 m_formatter.twoByteOp( OP2_JGE_rel32);1052 m_formatter.twoByteOp(jccRel32(ConditionGE)); 1026 1053 return m_formatter.immediateRel32(); 1027 1054 } … … 1029 1056 JmpSrc jg() 1030 1057 { 1031 m_formatter.twoByteOp( OP2_JG_rel32);1058 m_formatter.twoByteOp(jccRel32(ConditionG)); 1032 1059 return m_formatter.immediateRel32(); 1033 1060 } … … 1035 1062 JmpSrc ja() 1036 1063 { 1037 m_formatter.twoByteOp( OP2_JA_rel32);1064 m_formatter.twoByteOp(jccRel32(ConditionA)); 1038 1065 return m_formatter.immediateRel32(); 1039 1066 } … … 1041 1068 JmpSrc jae() 1042 1069 { 1043 m_formatter.twoByteOp( OP2_JAE_rel32);1070 m_formatter.twoByteOp(jccRel32(ConditionAE)); 1044 1071 return m_formatter.immediateRel32(); 1045 1072 } … … 1047 1074 JmpSrc jo() 1048 1075 { 1049 m_formatter.twoByteOp( OP2_JO_rel32);1076 m_formatter.twoByteOp(jccRel32(ConditionO)); 1050 1077 return m_formatter.immediateRel32(); 1051 1078 } … … 1053 1080 JmpSrc jp() 1054 1081 { 1055 m_formatter.twoByteOp( OP2_JP_rel32);1082 m_formatter.twoByteOp(jccRel32(ConditionP)); 1056 1083 return m_formatter.immediateRel32(); 1057 1084 } … … 1059 1086 JmpSrc js() 1060 1087 { 1061 m_formatter.twoByteOp(OP2_JS_rel32); 1088 m_formatter.twoByteOp(jccRel32(ConditionS)); 1089 return m_formatter.immediateRel32(); 1090 } 1091 1092 JmpSrc jCC(Condition cond) 1093 { 1094 m_formatter.twoByteOp(jccRel32(cond)); 1062 1095 return m_formatter.immediateRel32(); 1063 1096 } … … 1602 1635 ASSERT(mode != ModRmRegister); 1603 1636 1604 // Encode sacle of (1,2,4,8) -> (0,1,2,3)1605 int shift = 0;1606 while (scale >>= 1)1607 shift++;1608 1609 1637 putModRm(mode, reg, hasSib); 1610 m_buffer.putByteUnchecked((s hift<< 6) | ((index & 7) << 3) | (base & 7));1638 m_buffer.putByteUnchecked((scale << 6) | ((index & 7) << 3) | (base & 7)); 1611 1639 } 1612 1640 -
trunk/JavaScriptCore/jit/JIT.cpp
r40279 r40562 239 239 240 240 if (type == OpStrictEq) 241 set e32(X86::edx, X86::eax);241 set32(Equal, X86::edx, X86::eax, X86::eax); 242 242 else 243 set ne32(X86::edx, X86::eax);243 set32(NotEqual, X86::edx, X86::eax, X86::eax); 244 244 emitTagAsBoolImmediate(X86::eax); 245 245 #else … … 249 249 Jump firstNotImmediate = emitJumpIfJSCell(X86::eax); 250 250 Jump secondNotImmediate = emitJumpIfJSCell(X86::edx); 251 Jump bothWereImmediatesButNotEqual = jnePtr(X86::edx, X86::eax);251 Jump bothWereImmediatesButNotEqual = branchPtr(NotEqual, X86::edx, X86::eax); 252 252 253 253 // They are equal - set the result to true. (Or false, if negated). … … 260 260 firstNotImmediate.link(this); 261 261 emitJumpSlowCaseIfJSCell(X86::edx); 262 addSlowCase( jePtr(X86::edx, ImmPtr(JSValuePtr::encode(js0()))));262 addSlowCase(branchPtr(Equal, X86::edx, ImmPtr(JSValuePtr::encode(js0())))); 263 263 Jump firstWasNotImmediate = jump(); 264 264 … … 266 266 // If eax is 0 jump to a slow case, otherwise these values are not equal. 267 267 secondNotImmediate.link(this); 268 addSlowCase( jePtr(X86::eax, ImmPtr(JSValuePtr::encode(js0()))));268 addSlowCase(branchPtr(Equal, X86::eax, ImmPtr(JSValuePtr::encode(js0())))); 269 269 270 270 // We get here if the two values are different immediates, or one is 0 and the other is a JSCell. … … 282 282 void JIT::emitSlowScriptCheck() 283 283 { 284 Jump skipTimeout = jnzSub32(Imm32(1), timeoutCheckRegister);284 Jump skipTimeout = branchSub32(NonZero, Imm32(1), timeoutCheckRegister); 285 285 emitCTICall(Interpreter::cti_timeout_check); 286 286 move(X86::eax, timeoutCheckRegister); … … 380 380 int32_t op2imm = static_cast<int32_t>(JSImmediate::rawValue(getConstantOperand(op2))); 381 381 #endif 382 addJump( jl32(X86::eax, Imm32(op2imm)), target + 3);382 addJump(branch32(LessThan, X86::eax, Imm32(op2imm)), target + 3); 383 383 } else { 384 384 emitGetVirtualRegisters(op1, X86::eax, op2, X86::edx); 385 385 emitJumpSlowCaseIfNotImmediateInteger(X86::eax); 386 386 emitJumpSlowCaseIfNotImmediateInteger(X86::edx); 387 addJump( jl32(X86::eax, X86::edx), target + 3);387 addJump(branch32(LessThan, X86::eax, X86::edx), target + 3); 388 388 } 389 389 NEXT_OPCODE(op_loop_if_less); … … 403 403 int32_t op2imm = static_cast<int32_t>(JSImmediate::rawValue(getConstantOperand(op2))); 404 404 #endif 405 addJump( jle32(X86::eax, Imm32(op2imm)), target + 3);405 addJump(branch32(LessThanOrEqual, X86::eax, Imm32(op2imm)), target + 3); 406 406 } else { 407 407 emitGetVirtualRegisters(op1, X86::eax, op2, X86::edx); 408 408 emitJumpSlowCaseIfNotImmediateInteger(X86::eax); 409 409 emitJumpSlowCaseIfNotImmediateInteger(X86::edx); 410 addJump( jle32(X86::eax, X86::edx), target + 3);410 addJump(branch32(LessThanOrEqual, X86::eax, X86::edx), target + 3); 411 411 } 412 412 NEXT_OPCODE(op_loop_if_less); … … 445 445 sub32(Address(X86::eax, FIELD_OFFSET(Structure, m_typeInfo.m_type)), X86::ebx); 446 446 sub32(Address(X86::ecx, FIELD_OFFSET(Structure, m_typeInfo.m_type)), X86::ebx); 447 addSlowCase( jne32(Address(X86::edx, FIELD_OFFSET(Structure, m_typeInfo.m_type)), X86::ebx));447 addSlowCase(branch32(NotEqual, Address(X86::edx, FIELD_OFFSET(Structure, m_typeInfo.m_type)), X86::ebx)); 448 448 449 449 // check that baseVal's flags include ImplementsHasInstance but not OverridesHasInstance 450 450 load32(Address(X86::ecx, FIELD_OFFSET(Structure, m_typeInfo.m_flags)), X86::ecx); 451 451 and32(Imm32(ImplementsHasInstance | OverridesHasInstance), X86::ecx); 452 addSlowCase( jne32(X86::ecx, Imm32(ImplementsHasInstance)));452 addSlowCase(branch32(NotEqual, X86::ecx, Imm32(ImplementsHasInstance))); 453 453 454 454 emitGetVirtualRegister(currentInstruction[2].u.operand, X86::ecx); // reload value … … 464 464 loadPtr(Address(X86::ecx, FIELD_OFFSET(Structure, m_prototype)), X86::ecx); 465 465 466 Jump exit = jePtr(X86::ecx, X86::edx);467 468 jnePtr(X86::ecx, ImmPtr(JSValuePtr::encode(jsNull())), loop);466 Jump exit = branchPtr(Equal, X86::ecx, X86::edx); 467 468 branchPtr(NotEqual, X86::ecx, ImmPtr(JSValuePtr::encode(jsNull())), loop); 469 469 470 470 move(ImmPtr(JSValuePtr::encode(jsBoolean(false))), X86::eax); … … 593 593 emitJumpSlowCaseIfNotJSCell(X86::eax); 594 594 loadPtr(Address(X86::eax, FIELD_OFFSET(JSCell, m_structure)), X86::ecx); 595 addSlowCase( jne32(Address(X86::ecx, FIELD_OFFSET(Structure, m_typeInfo) + FIELD_OFFSET(TypeInfo, m_type)), Imm32(ObjectType)));595 addSlowCase(branch32(NotEqual, Address(X86::ecx, FIELD_OFFSET(Structure, m_typeInfo) + FIELD_OFFSET(TypeInfo, m_type)), Imm32(ObjectType))); 596 596 597 597 NEXT_OPCODE(op_construct_verify); … … 612 612 #endif 613 613 emitJumpSlowCaseIfNotJSCell(X86::eax); 614 addSlowCase( jnePtr(Address(X86::eax), ImmPtr(m_interpreter->m_jsArrayVptr)));614 addSlowCase(branchPtr(NotEqual, Address(X86::eax), ImmPtr(m_interpreter->m_jsArrayVptr))); 615 615 616 616 // This is an array; get the m_storage pointer into ecx, then check if the index is below the fast cutoff 617 617 loadPtr(Address(X86::eax, FIELD_OFFSET(JSArray, m_storage)), X86::ecx); 618 addSlowCase( jae32(X86::edx, Address(X86::eax, FIELD_OFFSET(JSArray, m_fastAccessCutoff))));618 addSlowCase(branch32(AboveOrEqual, X86::edx, Address(X86::eax, FIELD_OFFSET(JSArray, m_fastAccessCutoff)))); 619 619 620 620 // Get the value from the vector … … 645 645 #endif 646 646 emitJumpSlowCaseIfNotJSCell(X86::eax); 647 addSlowCase( jnePtr(Address(X86::eax), ImmPtr(m_interpreter->m_jsArrayVptr)));647 addSlowCase(branchPtr(NotEqual, Address(X86::eax), ImmPtr(m_interpreter->m_jsArrayVptr))); 648 648 649 649 // This is an array; get the m_storage pointer into ecx, then check if the index is below the fast cutoff 650 650 loadPtr(Address(X86::eax, FIELD_OFFSET(JSArray, m_storage)), X86::ecx); 651 Jump inFastVector = jb32(X86::edx, Address(X86::eax, FIELD_OFFSET(JSArray, m_fastAccessCutoff)));651 Jump inFastVector = branch32(Below, X86::edx, Address(X86::eax, FIELD_OFFSET(JSArray, m_fastAccessCutoff))); 652 652 // No; oh well, check if the access if within the vector - if so, we may still be okay. 653 addSlowCase( jae32(X86::edx, Address(X86::ecx, FIELD_OFFSET(ArrayStorage, m_vectorLength))));653 addSlowCase(branch32(AboveOrEqual, X86::edx, Address(X86::ecx, FIELD_OFFSET(ArrayStorage, m_vectorLength)))); 654 654 655 655 // This is a write to the slow part of the vector; first, we have to check if this would be the first write to this location. 656 656 // FIXME: should be able to handle initial write to array; increment the the number of items in the array, and potentially update fast access cutoff. 657 addSlowCase( jzPtr(BaseIndex(X86::ecx, X86::edx, ScalePtr, FIELD_OFFSET(ArrayStorage, m_vector[0]))));657 addSlowCase(branchTestPtr(Zero, BaseIndex(X86::ecx, X86::edx, ScalePtr, FIELD_OFFSET(ArrayStorage, m_vector[0])))); 658 658 659 659 // All good - put the value into the array. … … 670 670 emitGetVirtualRegister(currentInstruction[1].u.operand, X86::eax); 671 671 672 Jump isZero = jePtr(X86::eax, ImmPtr(JSValuePtr::encode(js0())));672 Jump isZero = branchPtr(Equal, X86::eax, ImmPtr(JSValuePtr::encode(js0()))); 673 673 addJump(emitJumpIfImmediateInteger(X86::eax), target + 2); 674 674 675 addJump( jePtr(X86::eax, ImmPtr(JSValuePtr::encode(jsBoolean(true)))), target + 2);676 addSlowCase( jnePtr(X86::eax, ImmPtr(JSValuePtr::encode(jsBoolean(false)))));675 addJump(branchPtr(Equal, X86::eax, ImmPtr(JSValuePtr::encode(jsBoolean(true)))), target + 2); 676 addSlowCase(branchPtr(NotEqual, X86::eax, ImmPtr(JSValuePtr::encode(jsBoolean(false))))); 677 677 678 678 isZero.link(this); … … 712 712 move(ImmPtr(globalObject), X86::eax); 713 713 loadPtr(structureAddress, X86::edx); 714 Jump noMatch = jnePtr(X86::edx, Address(X86::eax, FIELD_OFFSET(JSCell, m_structure))); // Structures don't match714 Jump noMatch = branchPtr(NotEqual, X86::edx, Address(X86::eax, FIELD_OFFSET(JSCell, m_structure))); // Structures don't match 715 715 716 716 // Load cached property … … 748 748 int32_t op2imm = static_cast<int32_t>(JSImmediate::rawValue(getConstantOperand(op2))); 749 749 #endif 750 addJump( jge32(X86::eax, Imm32(op2imm)), target + 3);750 addJump(branch32(GreaterThanOrEqual, X86::eax, Imm32(op2imm)), target + 3); 751 751 } else { 752 752 emitGetVirtualRegisters(op1, X86::eax, op2, X86::edx); 753 753 emitJumpSlowCaseIfNotImmediateInteger(X86::eax); 754 754 emitJumpSlowCaseIfNotImmediateInteger(X86::edx); 755 addJump( jge32(X86::eax, X86::edx), target + 3);755 addJump(branch32(GreaterThanOrEqual, X86::eax, X86::edx), target + 3); 756 756 } 757 757 NEXT_OPCODE(op_jnless); … … 760 760 emitGetVirtualRegister(currentInstruction[2].u.operand, X86::eax); 761 761 xorPtr(Imm32(static_cast<int32_t>(JSImmediate::FullTagTypeBool)), X86::eax); 762 addSlowCase( jnzPtr(X86::eax, Imm32(static_cast<int32_t>(~JSImmediate::ExtendedPayloadBitBoolValue))));762 addSlowCase(branchTestPtr(NonZero, X86::eax, Imm32(static_cast<int32_t>(~JSImmediate::ExtendedPayloadBitBoolValue)))); 763 763 xorPtr(Imm32(static_cast<int32_t>(JSImmediate::FullTagTypeBool | JSImmediate::ExtendedPayloadBitBoolValue)), X86::eax); 764 764 emitPutVirtualRegister(currentInstruction[1].u.operand); … … 769 769 emitGetVirtualRegister(currentInstruction[1].u.operand, X86::eax); 770 770 771 addJump( jePtr(X86::eax, ImmPtr(JSValuePtr::encode(js0()))), target + 2);771 addJump(branchPtr(Equal, X86::eax, ImmPtr(JSValuePtr::encode(js0()))), target + 2); 772 772 Jump isNonZero = emitJumpIfImmediateInteger(X86::eax); 773 773 774 addJump( jePtr(X86::eax, ImmPtr(JSValuePtr::encode(jsBoolean(false)))), target + 2);775 addSlowCase( jnePtr(X86::eax, ImmPtr(JSValuePtr::encode(jsBoolean(true)))));774 addJump(branchPtr(Equal, X86::eax, ImmPtr(JSValuePtr::encode(jsBoolean(false)))), target + 2); 775 addSlowCase(branchPtr(NotEqual, X86::eax, ImmPtr(JSValuePtr::encode(jsBoolean(true))))); 776 776 777 777 isNonZero.link(this); … … 787 787 // First, handle JSCell cases - check MasqueradesAsUndefined bit on the structure. 788 788 loadPtr(Address(X86::eax, FIELD_OFFSET(JSCell, m_structure)), X86::ecx); 789 addJump( jnz32(Address(X86::ecx, FIELD_OFFSET(Structure, m_typeInfo.m_flags)), Imm32(MasqueradesAsUndefined)), target + 2);789 addJump(branchTest32(NonZero, Address(X86::ecx, FIELD_OFFSET(Structure, m_typeInfo.m_flags)), Imm32(MasqueradesAsUndefined)), target + 2); 790 790 Jump wasNotImmediate = jump(); 791 791 … … 793 793 isImmediate.link(this); 794 794 andPtr(Imm32(~JSImmediate::ExtendedTagBitUndefined), X86::eax); 795 addJump( jePtr(X86::eax, ImmPtr(JSValuePtr::encode(jsNull()))), target + 2);795 addJump(branchPtr(Equal, X86::eax, ImmPtr(JSValuePtr::encode(jsNull()))), target + 2); 796 796 797 797 wasNotImmediate.link(this); … … 807 807 // First, handle JSCell cases - check MasqueradesAsUndefined bit on the structure. 808 808 loadPtr(Address(X86::eax, FIELD_OFFSET(JSCell, m_structure)), X86::ecx); 809 addJump( jz32(Address(X86::ecx, FIELD_OFFSET(Structure, m_typeInfo.m_flags)), Imm32(MasqueradesAsUndefined)), target + 2);809 addJump(branchTest32(Zero, Address(X86::ecx, FIELD_OFFSET(Structure, m_typeInfo.m_flags)), Imm32(MasqueradesAsUndefined)), target + 2); 810 810 Jump wasNotImmediate = jump(); 811 811 … … 813 813 isImmediate.link(this); 814 814 andPtr(Imm32(~JSImmediate::ExtendedTagBitUndefined), X86::eax); 815 addJump( jnePtr(X86::eax, ImmPtr(JSValuePtr::encode(jsNull()))), target + 2);815 addJump(branchPtr(NotEqual, X86::eax, ImmPtr(JSValuePtr::encode(jsNull()))), target + 2); 816 816 817 817 wasNotImmediate.link(this); … … 843 843 emitGetVirtualRegisters(currentInstruction[2].u.operand, X86::eax, currentInstruction[3].u.operand, X86::edx); 844 844 emitJumpSlowCaseIfNotImmediateIntegers(X86::eax, X86::edx, X86::ecx); 845 set e32(X86::edx, X86::eax);845 set32(Equal, X86::edx, X86::eax, X86::eax); 846 846 emitTagAsBoolImmediate(X86::eax); 847 847 emitPutVirtualRegister(currentInstruction[1].u.operand); … … 895 895 emitGetVirtualRegister(currentInstruction[1].u.operand, X86::eax); 896 896 897 Jump isZero = jePtr(X86::eax, ImmPtr(JSValuePtr::encode(js0())));897 Jump isZero = branchPtr(Equal, X86::eax, ImmPtr(JSValuePtr::encode(js0()))); 898 898 addJump(emitJumpIfImmediateInteger(X86::eax), target + 2); 899 899 900 addJump( jePtr(X86::eax, ImmPtr(JSValuePtr::encode(jsBoolean(true)))), target + 2);901 addSlowCase( jnePtr(X86::eax, ImmPtr(JSValuePtr::encode(jsBoolean(false)))));900 addJump(branchPtr(Equal, X86::eax, ImmPtr(JSValuePtr::encode(jsBoolean(true)))), target + 2); 901 addSlowCase(branchPtr(NotEqual, X86::eax, ImmPtr(JSValuePtr::encode(jsBoolean(false))))); 902 902 903 903 isZero.link(this); … … 908 908 emitGetVirtualRegisters(currentInstruction[2].u.operand, X86::eax, currentInstruction[3].u.operand, X86::edx); 909 909 emitJumpSlowCaseIfNotImmediateIntegers(X86::eax, X86::edx, X86::ecx); 910 set ne32(X86::edx, X86::eax);910 set32(NotEqual, X86::edx, X86::eax, X86::eax); 911 911 emitTagAsBoolImmediate(X86::eax); 912 912 … … 974 974 unsigned target = currentInstruction[3].u.operand; 975 975 emitCTICall(Interpreter::cti_op_next_pname); 976 Jump endOfIter = jzPtr(X86::eax);976 Jump endOfIter = branchTestPtr(Zero, X86::eax); 977 977 emitPutVirtualRegister(currentInstruction[1].u.operand); 978 978 addJump(jump(), target + 3); … … 1013 1013 emitJumpSlowCaseIfNotJSCell(X86::eax, srcVReg); 1014 1014 loadPtr(Address(X86::eax, FIELD_OFFSET(JSCell, m_structure)), X86::ecx); 1015 addSlowCase( jne32(Address(X86::ecx, FIELD_OFFSET(Structure, m_typeInfo.m_type)), Imm32(NumberType)));1015 addSlowCase(branch32(NotEqual, Address(X86::ecx, FIELD_OFFSET(Structure, m_typeInfo.m_type)), Imm32(NumberType))); 1016 1016 1017 1017 wasImmediate.link(this); … … 1143 1143 1144 1144 loadPtr(Address(X86::eax, FIELD_OFFSET(JSCell, m_structure)), X86::ecx); 1145 set nz32(Address(X86::ecx, FIELD_OFFSET(Structure, m_typeInfo.m_flags)), Imm32(MasqueradesAsUndefined), X86::eax);1145 setTest32(NonZero, Address(X86::ecx, FIELD_OFFSET(Structure, m_typeInfo.m_flags)), Imm32(MasqueradesAsUndefined), X86::eax); 1146 1146 1147 1147 Jump wasNotImmediate = jump(); … … 1150 1150 1151 1151 andPtr(Imm32(~JSImmediate::ExtendedTagBitUndefined), X86::eax); 1152 set e32(Imm32(JSImmediate::FullTagTypeNull), X86::eax);1152 set32(Equal, X86::eax, Imm32(JSImmediate::FullTagTypeNull), X86::eax); 1153 1153 1154 1154 wasNotImmediate.link(this); … … 1167 1167 1168 1168 loadPtr(Address(X86::eax, FIELD_OFFSET(JSCell, m_structure)), X86::ecx); 1169 set z32(Address(X86::ecx, FIELD_OFFSET(Structure, m_typeInfo.m_flags)), Imm32(MasqueradesAsUndefined), X86::eax);1169 setTest32(Zero, Address(X86::ecx, FIELD_OFFSET(Structure, m_typeInfo.m_flags)), Imm32(MasqueradesAsUndefined), X86::eax); 1170 1170 1171 1171 Jump wasNotImmediate = jump(); … … 1174 1174 1175 1175 andPtr(Imm32(~JSImmediate::ExtendedTagBitUndefined), X86::eax); 1176 set ne32(Imm32(JSImmediate::FullTagTypeNull), X86::eax);1176 set32(NotEqual, X86::eax, Imm32(JSImmediate::FullTagTypeNull), X86::eax); 1177 1177 1178 1178 wasNotImmediate.link(this); … … 1218 1218 emitJumpSlowCaseIfNotJSCell(X86::eax); 1219 1219 loadPtr(Address(X86::eax, FIELD_OFFSET(JSCell, m_structure)), X86::edx); 1220 addSlowCase( jnz32(Address(X86::edx, FIELD_OFFSET(Structure, m_typeInfo.m_flags)), Imm32(NeedsThisConversion)));1220 addSlowCase(branchTest32(NonZero, Address(X86::edx, FIELD_OFFSET(Structure, m_typeInfo.m_flags)), Imm32(NeedsThisConversion))); 1221 1221 1222 1222 NEXT_OPCODE(op_convert_this); … … 1224 1224 case op_profile_will_call: { 1225 1225 emitGetCTIParam(STUB_ARGS_profilerReference, X86::eax); 1226 Jump noProfiler = jzPtr(Address(X86::eax));1226 Jump noProfiler = branchTestPtr(Zero, Address(X86::eax)); 1227 1227 emitPutJITStubArgFromVirtualRegister(currentInstruction[1].u.operand, 1, X86::eax); 1228 1228 emitCTICall(Interpreter::cti_op_profile_will_call); … … 1233 1233 case op_profile_did_call: { 1234 1234 emitGetCTIParam(STUB_ARGS_profilerReference, X86::eax); 1235 Jump noProfiler = jzPtr(Address(X86::eax));1235 Jump noProfiler = branchTestPtr(Zero, Address(X86::eax)); 1236 1236 emitPutJITStubArgFromVirtualRegister(currentInstruction[1].u.operand, 1, X86::eax); 1237 1237 emitCTICall(Interpreter::cti_op_profile_did_call); … … 1328 1328 // First, check if this is an access to the vector 1329 1329 linkSlowCase(iter); 1330 jae32(X86::edx, Address(X86::ecx, FIELD_OFFSET(ArrayStorage, m_vectorLength)), beginGetByValSlow);1330 branch32(AboveOrEqual, X86::edx, Address(X86::ecx, FIELD_OFFSET(ArrayStorage, m_vectorLength)), beginGetByValSlow); 1331 1331 1332 1332 // okay, missed the fast region, but it is still in the vector. Get the value. 1333 1333 loadPtr(BaseIndex(X86::ecx, X86::edx, ScalePtr, FIELD_OFFSET(ArrayStorage, m_vector[0])), X86::ecx); 1334 1334 // Check whether the value loaded is zero; if so we need to return undefined. 1335 jzPtr(X86::ecx, beginGetByValSlow);1335 branchTestPtr(Zero, X86::ecx, beginGetByValSlow); 1336 1336 move(X86::ecx, X86::eax); 1337 1337 emitPutVirtualRegister(currentInstruction[1].u.operand, X86::eax); … … 1359 1359 emitPutJITStubArgFromVirtualRegister(op2, 2, X86::ecx); 1360 1360 emitCTICall(Interpreter::cti_op_loop_if_less); 1361 emitJumpSlowToHot( jnz32(X86::eax), target + 3);1361 emitJumpSlowToHot(branchTest32(NonZero, X86::eax), target + 3); 1362 1362 } else { 1363 1363 linkSlowCase(iter); … … 1366 1366 emitPutJITStubArg(X86::edx, 2); 1367 1367 emitCTICall(Interpreter::cti_op_loop_if_less); 1368 emitJumpSlowToHot( jnz32(X86::eax), target + 3);1368 emitJumpSlowToHot(branchTest32(NonZero, X86::eax), target + 3); 1369 1369 } 1370 1370 NEXT_OPCODE(op_loop_if_less); … … 1386 1386 emitPutJITStubArgFromVirtualRegister(currentInstruction[2].u.operand, 2, X86::ecx); 1387 1387 emitCTICall(Interpreter::cti_op_loop_if_lesseq); 1388 emitJumpSlowToHot( jnz32(X86::eax), target + 3);1388 emitJumpSlowToHot(branchTest32(NonZero, X86::eax), target + 3); 1389 1389 } else { 1390 1390 linkSlowCase(iter); … … 1393 1393 emitPutJITStubArg(X86::edx, 2); 1394 1394 emitCTICall(Interpreter::cti_op_loop_if_lesseq); 1395 emitJumpSlowToHot( jnz32(X86::eax), target + 3);1395 emitJumpSlowToHot(branchTest32(NonZero, X86::eax), target + 3); 1396 1396 } 1397 1397 NEXT_OPCODE(op_loop_if_lesseq); … … 1431 1431 emitCTICall(Interpreter::cti_op_jtrue); 1432 1432 unsigned target = currentInstruction[2].u.operand; 1433 emitJumpSlowToHot( jnz32(X86::eax), target + 2);1433 emitJumpSlowToHot(branchTest32(NonZero, X86::eax), target + 2); 1434 1434 NEXT_OPCODE(op_loop_if_true); 1435 1435 } … … 1446 1446 emitPutJITStubArgFromVirtualRegister(currentInstruction[2].u.operand, 2, X86::ecx); 1447 1447 emitCTICall(Interpreter::cti_op_jless); 1448 emitJumpSlowToHot( jz32(X86::eax), target + 3);1448 emitJumpSlowToHot(branchTest32(Zero, X86::eax), target + 3); 1449 1449 } else { 1450 1450 linkSlowCase(iter); … … 1453 1453 emitPutJITStubArg(X86::edx, 2); 1454 1454 emitCTICall(Interpreter::cti_op_jless); 1455 emitJumpSlowToHot( jz32(X86::eax), target + 3);1455 emitJumpSlowToHot(branchTest32(Zero, X86::eax), target + 3); 1456 1456 } 1457 1457 NEXT_OPCODE(op_jnless); … … 1470 1470 emitCTICall(Interpreter::cti_op_jtrue); 1471 1471 unsigned target = currentInstruction[2].u.operand; 1472 emitJumpSlowToHot( jz32(X86::eax), target + 2); // inverted!1472 emitJumpSlowToHot(branchTest32(Zero, X86::eax), target + 2); // inverted! 1473 1473 NEXT_OPCODE(op_jfalse); 1474 1474 } … … 1493 1493 emitCTICall(Interpreter::cti_op_jtrue); 1494 1494 unsigned target = currentInstruction[2].u.operand; 1495 emitJumpSlowToHot( jnz32(X86::eax), target + 2);1495 emitJumpSlowToHot(branchTest32(NonZero, X86::eax), target + 2); 1496 1496 NEXT_OPCODE(op_jtrue); 1497 1497 } … … 1640 1640 addPtr(Imm32(m_codeBlock->m_numCalleeRegisters * sizeof(Register)), callFrameRegister, X86::edx); 1641 1641 1642 slowRegisterFileCheck = jg32(X86::edx, Address(X86::eax, FIELD_OFFSET(RegisterFile, m_end)));1642 slowRegisterFileCheck = branch32(GreaterThan, X86::edx, Address(X86::eax, FIELD_OFFSET(RegisterFile, m_end))); 1643 1643 afterRegisterFileCheck = label(); 1644 1644 } … … 1754 1754 // Check eax is an array 1755 1755 Jump array_failureCases1 = emitJumpIfNotJSCell(X86::eax); 1756 Jump array_failureCases2 = jnePtr(Address(X86::eax), ImmPtr(m_interpreter->m_jsArrayVptr));1756 Jump array_failureCases2 = branchPtr(NotEqual, Address(X86::eax), ImmPtr(m_interpreter->m_jsArrayVptr)); 1757 1757 1758 1758 // Checks out okay! - get the length from the storage … … 1760 1760 load32(Address(X86::eax, FIELD_OFFSET(ArrayStorage, m_length)), X86::eax); 1761 1761 1762 Jump array_failureCases3 = ja32(X86::eax, Imm32(JSImmediate::maxImmediateInt));1762 Jump array_failureCases3 = branch32(Above, X86::eax, Imm32(JSImmediate::maxImmediateInt)); 1763 1763 1764 1764 // X86::eax contains a 64 bit value (is positive, is zero extended) so we don't need sign extend here. … … 1772 1772 // Check eax is a string 1773 1773 Jump string_failureCases1 = emitJumpIfNotJSCell(X86::eax); 1774 Jump string_failureCases2 = jnePtr(Address(X86::eax), ImmPtr(m_interpreter->m_jsStringVptr));1774 Jump string_failureCases2 = branchPtr(NotEqual, Address(X86::eax), ImmPtr(m_interpreter->m_jsStringVptr)); 1775 1775 1776 1776 // Checks out okay! - get the length from the Ustring. … … 1778 1778 load32(Address(X86::eax, FIELD_OFFSET(UString::Rep, len)), X86::eax); 1779 1779 1780 Jump string_failureCases3 = ja32(X86::eax, Imm32(JSImmediate::maxImmediateInt));1780 Jump string_failureCases3 = branch32(Above, X86::eax, Imm32(JSImmediate::maxImmediateInt)); 1781 1781 1782 1782 // X86::eax contains a 64 bit value (is positive, is zero extended) so we don't need sign extend here. … … 1793 1793 loadPtr(Address(X86::ecx, FIELD_OFFSET(JSFunction, m_body)), X86::eax); 1794 1794 loadPtr(Address(X86::eax, FIELD_OFFSET(FunctionBodyNode, m_code)), X86::eax); 1795 Jump hasCodeBlock1 = jnzPtr(X86::eax);1795 Jump hasCodeBlock1 = branchTestPtr(NonZero, X86::eax); 1796 1796 pop(X86::ebx); 1797 1797 restoreArgumentReference(); … … 1803 1803 1804 1804 // Check argCount matches callee arity. 1805 Jump arityCheckOkay1 = je32(Address(X86::eax, FIELD_OFFSET(CodeBlock, m_numParameters)), X86::edx);1805 Jump arityCheckOkay1 = branch32(Equal, Address(X86::eax, FIELD_OFFSET(CodeBlock, m_numParameters)), X86::edx); 1806 1806 pop(X86::ebx); 1807 1807 emitPutJITStubArg(X86::ebx, 2); … … 1830 1830 loadPtr(Address(X86::ecx, FIELD_OFFSET(JSFunction, m_body)), X86::eax); 1831 1831 loadPtr(Address(X86::eax, FIELD_OFFSET(FunctionBodyNode, m_code)), X86::eax); 1832 Jump hasCodeBlock2 = jnzPtr(X86::eax);1832 Jump hasCodeBlock2 = branchTestPtr(NonZero, X86::eax); 1833 1833 pop(X86::ebx); 1834 1834 restoreArgumentReference(); … … 1840 1840 1841 1841 // Check argCount matches callee arity. 1842 Jump arityCheckOkay2 = je32(Address(X86::eax, FIELD_OFFSET(CodeBlock, m_numParameters)), X86::edx);1842 Jump arityCheckOkay2 = branch32(Equal, Address(X86::eax, FIELD_OFFSET(CodeBlock, m_numParameters)), X86::edx); 1843 1843 pop(X86::ebx); 1844 1844 emitPutJITStubArg(X86::ebx, 2); … … 1867 1867 loadPtr(Address(X86::ecx, FIELD_OFFSET(JSFunction, m_body)), X86::eax); 1868 1868 loadPtr(Address(X86::eax, FIELD_OFFSET(FunctionBodyNode, m_code)), X86::eax); 1869 Jump hasCodeBlock3 = jnzPtr(X86::eax);1869 Jump hasCodeBlock3 = branchTestPtr(NonZero, X86::eax); 1870 1870 pop(X86::ebx); 1871 1871 restoreArgumentReference(); … … 1877 1877 1878 1878 // Check argCount matches callee arity. 1879 Jump arityCheckOkay3 = je32(Address(X86::eax, FIELD_OFFSET(CodeBlock, m_numParameters)), X86::edx);1879 Jump arityCheckOkay3 = branch32(Equal, Address(X86::eax, FIELD_OFFSET(CodeBlock, m_numParameters)), X86::edx); 1880 1880 pop(X86::ebx); 1881 1881 emitPutJITStubArg(X86::ebx, 2); -
trunk/JavaScriptCore/jit/JITArithmetic.cpp
r40004 r40562 62 62 lshift32(X86::ecx, X86::eax); 63 63 #if !USE(ALTERNATE_JSIMMEDIATE) 64 addSlowCase( joAdd32(X86::eax, X86::eax));64 addSlowCase(branchAdd32(Overflow, X86::eax, X86::eax)); 65 65 signExtend32ToPtr(X86::eax, X86::eax); 66 66 #endif … … 193 193 emitJumpSlowCaseIfNotImmediateInteger(X86::ecx); 194 194 #if USE(ALTERNATE_JSIMMEDIATE) 195 addSlowCase( jePtr(X86::ecx, ImmPtr(JSValuePtr::encode(js0()))));195 addSlowCase(branchPtr(Equal, X86::ecx, ImmPtr(JSValuePtr::encode(js0())))); 196 196 mod32(X86::ecx, X86::eax, X86::edx); 197 197 #else … … 231 231 emitJumpSlowCaseIfNotImmediateInteger(X86::eax); 232 232 #if USE(ALTERNATE_JSIMMEDIATE) 233 addSlowCase( joAdd32(Imm32(1), X86::edx));233 addSlowCase(branchAdd32(Overflow, Imm32(1), X86::edx)); 234 234 emitFastArithIntToImmNoCheck(X86::edx, X86::edx); 235 235 #else 236 addSlowCase( joAdd32(Imm32(1 << JSImmediate::IntegerPayloadShift), X86::edx));236 addSlowCase(branchAdd32(Overflow, Imm32(1 << JSImmediate::IntegerPayloadShift), X86::edx)); 237 237 signExtend32ToPtr(X86::edx, X86::edx); 238 238 #endif … … 256 256 emitJumpSlowCaseIfNotImmediateInteger(X86::eax); 257 257 #if USE(ALTERNATE_JSIMMEDIATE) 258 addSlowCase( joSub32(Imm32(1), X86::edx));258 addSlowCase(branchSub32(Zero, Imm32(1), X86::edx)); 259 259 emitFastArithIntToImmNoCheck(X86::edx, X86::edx); 260 260 #else 261 addSlowCase( joSub32(Imm32(1 << JSImmediate::IntegerPayloadShift), X86::edx));261 addSlowCase(branchSub32(Zero, Imm32(1 << JSImmediate::IntegerPayloadShift), X86::edx)); 262 262 signExtend32ToPtr(X86::edx, X86::edx); 263 263 #endif … … 280 280 emitJumpSlowCaseIfNotImmediateInteger(X86::eax); 281 281 #if USE(ALTERNATE_JSIMMEDIATE) 282 addSlowCase( joAdd32(Imm32(1), X86::eax));282 addSlowCase(branchAdd32(Overflow, Imm32(1), X86::eax)); 283 283 emitFastArithIntToImmNoCheck(X86::eax, X86::eax); 284 284 #else 285 addSlowCase( joAdd32(Imm32(1 << JSImmediate::IntegerPayloadShift), X86::eax));285 addSlowCase(branchAdd32(Overflow, Imm32(1 << JSImmediate::IntegerPayloadShift), X86::eax)); 286 286 signExtend32ToPtr(X86::eax, X86::eax); 287 287 #endif … … 304 304 emitJumpSlowCaseIfNotImmediateInteger(X86::eax); 305 305 #if USE(ALTERNATE_JSIMMEDIATE) 306 addSlowCase( joSub32(Imm32(1), X86::eax));306 addSlowCase(branchSub32(Zero, Imm32(1), X86::eax)); 307 307 emitFastArithIntToImmNoCheck(X86::eax, X86::eax); 308 308 #else 309 addSlowCase( joSub32(Imm32(1 << JSImmediate::IntegerPayloadShift), X86::eax));309 addSlowCase(branchSub32(Zero, Imm32(1 << JSImmediate::IntegerPayloadShift), X86::eax)); 310 310 signExtend32ToPtr(X86::eax, X86::eax); 311 311 #endif … … 382 382 emitJumpSlowCaseIfNotImmediateInteger(X86::edx); 383 383 if (opcodeID == op_add) 384 addSlowCase( joAdd32(X86::edx, X86::eax));384 addSlowCase(branchAdd32(Overflow, X86::edx, X86::eax)); 385 385 else if (opcodeID == op_sub) 386 addSlowCase( joSub32(X86::edx, X86::eax));386 addSlowCase(branchSub32(Zero, X86::edx, X86::eax)); 387 387 else { 388 388 ASSERT(opcodeID == op_mul); 389 addSlowCase( joMul32(X86::edx, X86::eax));390 addSlowCase( jz32(X86::eax));389 addSlowCase(branchMul32(Overflow, X86::edx, X86::eax)); 390 addSlowCase(branchTest32(Zero, X86::eax)); 391 391 } 392 392 emitFastArithIntToImmNoCheck(X86::eax, X86::eax); … … 473 473 emitGetVirtualRegister(op2, X86::eax); 474 474 emitJumpSlowCaseIfNotImmediateInteger(X86::eax); 475 addSlowCase( joAdd32(Imm32(getConstantOperandImmediateInt(op1)), X86::eax));475 addSlowCase(branchAdd32(Overflow, Imm32(getConstantOperandImmediateInt(op1)), X86::eax)); 476 476 emitFastArithIntToImmNoCheck(X86::eax, X86::eax); 477 477 } else if (isOperandConstantImmediateInt(op2)) { 478 478 emitGetVirtualRegister(op1, X86::eax); 479 479 emitJumpSlowCaseIfNotImmediateInteger(X86::eax); 480 addSlowCase( joAdd32(Imm32(getConstantOperandImmediateInt(op2)), X86::eax));480 addSlowCase(branchAdd32(Overflow, Imm32(getConstantOperandImmediateInt(op2)), X86::eax)); 481 481 emitFastArithIntToImmNoCheck(X86::eax, X86::eax); 482 482 } else … … 522 522 emitGetVirtualRegister(op2, X86::eax); 523 523 emitJumpSlowCaseIfNotImmediateInteger(X86::eax); 524 addSlowCase( joMul32(Imm32(value), X86::eax, X86::eax));524 addSlowCase(branchMul32(Overflow, Imm32(value), X86::eax, X86::eax)); 525 525 emitFastArithReTagImmediate(X86::eax, X86::eax); 526 526 } else if (isOperandConstantImmediateInt(op2) && ((value = getConstantOperandImmediateInt(op2)) > 0)) { 527 527 emitGetVirtualRegister(op1, X86::eax); 528 528 emitJumpSlowCaseIfNotImmediateInteger(X86::eax); 529 addSlowCase( joMul32(Imm32(value), X86::eax, X86::eax));529 addSlowCase(branchMul32(Overflow, Imm32(value), X86::eax, X86::eax)); 530 530 emitFastArithReTagImmediate(X86::eax, X86::eax); 531 531 } else … … 861 861 emitGetVirtualRegister(op2, X86::eax); 862 862 emitJumpSlowCaseIfNotImmediateInteger(X86::eax); 863 addSlowCase( joAdd32(Imm32(getConstantOperandImmediateInt(op1) << JSImmediate::IntegerPayloadShift), X86::eax));863 addSlowCase(branchAdd32(Overflow, Imm32(getConstantOperandImmediateInt(op1) << JSImmediate::IntegerPayloadShift), X86::eax)); 864 864 signExtend32ToPtr(X86::eax, X86::eax); 865 865 emitPutVirtualRegister(result); … … 867 867 emitGetVirtualRegister(op1, X86::eax); 868 868 emitJumpSlowCaseIfNotImmediateInteger(X86::eax); 869 addSlowCase( joAdd32(Imm32(getConstantOperandImmediateInt(op2) << JSImmediate::IntegerPayloadShift), X86::eax));869 addSlowCase(branchAdd32(Overflow, Imm32(getConstantOperandImmediateInt(op2) << JSImmediate::IntegerPayloadShift), X86::eax)); 870 870 signExtend32ToPtr(X86::eax, X86::eax); 871 871 emitPutVirtualRegister(result); … … 925 925 emitJumpSlowCaseIfNotImmediateInteger(X86::eax); 926 926 emitFastArithDeTagImmediate(X86::eax); 927 addSlowCase( joMul32(Imm32(value), X86::eax, X86::eax));927 addSlowCase(branchMul32(Overflow, Imm32(value), X86::eax, X86::eax)); 928 928 signExtend32ToPtr(X86::eax, X86::eax); 929 929 emitFastArithReTagImmediate(X86::eax, X86::eax); … … 933 933 emitJumpSlowCaseIfNotImmediateInteger(X86::eax); 934 934 emitFastArithDeTagImmediate(X86::eax); 935 addSlowCase( joMul32(Imm32(value), X86::eax, X86::eax));935 addSlowCase(branchMul32(Overflow, Imm32(value), X86::eax, X86::eax)); 936 936 signExtend32ToPtr(X86::eax, X86::eax); 937 937 emitFastArithReTagImmediate(X86::eax, X86::eax); -
trunk/JavaScriptCore/jit/JITCall.cpp
r40232 r40562 134 134 135 135 emitCTICall(Interpreter::cti_op_call_eval); 136 wasEval = jnePtr(X86::eax, ImmPtr(JSValuePtr::encode(jsImpossibleValue())));136 wasEval = branchPtr(NotEqual, X86::eax, ImmPtr(JSValuePtr::encode(jsImpossibleValue()))); 137 137 } 138 138 … … 146 146 // Check for JSFunctions. 147 147 emitJumpSlowCaseIfNotJSCell(X86::ecx); 148 addSlowCase( jnePtr(Address(X86::ecx), ImmPtr(m_interpreter->m_jsFunctionVptr)));148 addSlowCase(branchPtr(NotEqual, Address(X86::ecx), ImmPtr(m_interpreter->m_jsFunctionVptr))); 149 149 150 150 // First, in the case of a construct, allocate the new object. … … 208 208 209 209 emitCTICall(Interpreter::cti_op_call_eval); 210 wasEval = jnePtr(X86::eax, ImmPtr(JSValuePtr::encode(jsImpossibleValue())));210 wasEval = branchPtr(NotEqual, X86::eax, ImmPtr(JSValuePtr::encode(jsImpossibleValue()))); 211 211 } 212 212 … … 215 215 emitGetVirtualRegister(callee, X86::ecx); 216 216 DataLabelPtr addressOfLinkedFunctionCheck; 217 Jump jumpToSlow = jnePtrWithPatch(X86::ecx, addressOfLinkedFunctionCheck, ImmPtr(JSValuePtr::encode(jsImpossibleValue())));217 Jump jumpToSlow = branchPtrWithPatch(NotEqual, X86::ecx, addressOfLinkedFunctionCheck, ImmPtr(JSValuePtr::encode(jsImpossibleValue()))); 218 218 addSlowCase(jumpToSlow); 219 219 ASSERT(differenceBetween(addressOfLinkedFunctionCheck, jumpToSlow) == patchOffsetOpCallCompareToJump); … … 273 273 // Fast check for JS function. 274 274 Jump callLinkFailNotObject = emitJumpIfNotJSCell(X86::ecx); 275 Jump callLinkFailNotJSFunction = jnePtr(Address(X86::ecx), ImmPtr(m_interpreter->m_jsFunctionVptr));275 Jump callLinkFailNotJSFunction = branchPtr(NotEqual, Address(X86::ecx), ImmPtr(m_interpreter->m_jsFunctionVptr)); 276 276 277 277 // First, in the case of a construct, allocate the new object. … … 305 305 // Check for JSFunctions. 306 306 Jump isNotObject = emitJumpIfNotJSCell(X86::ecx); 307 Jump isJSFunction = jePtr(Address(X86::ecx), ImmPtr(m_interpreter->m_jsFunctionVptr));307 Jump isJSFunction = branchPtr(Equal, Address(X86::ecx), ImmPtr(m_interpreter->m_jsFunctionVptr)); 308 308 309 309 // This handles host functions -
trunk/JavaScriptCore/jit/JITInlineMethods.h
r40046 r40562 259 259 ALWAYS_INLINE JIT::Jump JIT::checkStructure(RegisterID reg, Structure* structure) 260 260 { 261 return jnePtr(Address(reg, FIELD_OFFSET(JSCell, m_structure)), ImmPtr(structure));261 return branchPtr(NotEqual, Address(reg, FIELD_OFFSET(JSCell, m_structure)), ImmPtr(structure)); 262 262 } 263 263 … … 265 265 { 266 266 #if USE(ALTERNATE_JSIMMEDIATE) 267 return jzPtr(reg, tagMaskRegister);268 #else 269 return jz32(reg, Imm32(JSImmediate::TagMask));267 return branchTestPtr(Zero, reg, tagMaskRegister); 268 #else 269 return branchTest32(Zero, reg, Imm32(JSImmediate::TagMask)); 270 270 #endif 271 271 } … … 286 286 { 287 287 #if USE(ALTERNATE_JSIMMEDIATE) 288 return jnzPtr(reg, tagMaskRegister);289 #else 290 return jnz32(reg, Imm32(JSImmediate::TagMask));288 return branchTestPtr(NonZero, reg, tagMaskRegister); 289 #else 290 return branchTest32(NonZero, reg, Imm32(JSImmediate::TagMask)); 291 291 #endif 292 292 } … … 312 312 ALWAYS_INLINE JIT::Jump JIT::emitJumpIfImmediateNumber(RegisterID reg) 313 313 { 314 return jnzPtr(reg, tagTypeNumberRegister);314 return branchTestPtr(NonZero, reg, tagTypeNumberRegister); 315 315 } 316 316 ALWAYS_INLINE JIT::Jump JIT::emitJumpIfNotImmediateNumber(RegisterID reg) 317 317 { 318 return jzPtr(reg, tagTypeNumberRegister);318 return branchTestPtr(Zero, reg, tagTypeNumberRegister); 319 319 } 320 320 #endif … … 323 323 { 324 324 #if USE(ALTERNATE_JSIMMEDIATE) 325 return jaePtr(reg, tagTypeNumberRegister);326 #else 327 return jnz32(reg, Imm32(JSImmediate::TagTypeNumber));325 return branchPtr(AboveOrEqual, reg, tagTypeNumberRegister); 326 #else 327 return branchTest32(NonZero, reg, Imm32(JSImmediate::TagTypeNumber)); 328 328 #endif 329 329 } … … 332 332 { 333 333 #if USE(ALTERNATE_JSIMMEDIATE) 334 return jbPtr(reg, tagTypeNumberRegister);335 #else 336 return jz32(reg, Imm32(JSImmediate::TagTypeNumber));334 return branchPtr(Below, reg, tagTypeNumberRegister); 335 #else 336 return branchTest32(Zero, reg, Imm32(JSImmediate::TagTypeNumber)); 337 337 #endif 338 338 } … … 363 363 ALWAYS_INLINE JIT::Jump JIT::emitFastArithDeTagImmediateJumpIfZero(RegisterID reg) 364 364 { 365 return jzSubPtr(Imm32(JSImmediate::TagTypeNumber), reg);365 return branchSubPtr(Zero, Imm32(JSImmediate::TagTypeNumber), reg); 366 366 } 367 367 #endif -
trunk/JavaScriptCore/jit/JITPropertyAccess.cpp
r39738 r40562 104 104 105 105 DataLabelPtr structureToCompare; 106 Jump structureCheck = jnePtrWithPatch(Address(X86::eax, FIELD_OFFSET(JSCell, m_structure)), structureToCompare, ImmPtr(reinterpret_cast<void*>(patchGetByIdDefaultStructure)));106 Jump structureCheck = branchPtrWithPatch(NotEqual, Address(X86::eax, FIELD_OFFSET(JSCell, m_structure)), structureToCompare, ImmPtr(reinterpret_cast<void*>(patchGetByIdDefaultStructure))); 107 107 addSlowCase(structureCheck); 108 108 ASSERT(differenceBetween(hotPathBegin, structureToCompare) == patchOffsetGetByIdStructure); … … 160 160 // It is important that the following instruction plants a 32bit immediate, in order that it can be patched over. 161 161 DataLabelPtr structureToCompare; 162 addSlowCase( jnePtrWithPatch(Address(X86::eax, FIELD_OFFSET(JSCell, m_structure)), structureToCompare, ImmPtr(reinterpret_cast<void*>(patchGetByIdDefaultStructure))));162 addSlowCase(branchPtrWithPatch(NotEqual, Address(X86::eax, FIELD_OFFSET(JSCell, m_structure)), structureToCompare, ImmPtr(reinterpret_cast<void*>(patchGetByIdDefaultStructure)))); 163 163 ASSERT(differenceBetween(hotPathBegin, structureToCompare) == patchOffsetPutByIdStructure); 164 164 … … 199 199 // Check eax is an object of the right Structure. 200 200 failureCases.append(emitJumpIfNotJSCell(X86::eax)); 201 failureCases.append( jnePtr(Address(X86::eax, FIELD_OFFSET(JSCell, m_structure)), ImmPtr(oldStructure)));201 failureCases.append(branchPtr(NotEqual, Address(X86::eax, FIELD_OFFSET(JSCell, m_structure)), ImmPtr(oldStructure))); 202 202 JumpList successCases; 203 203 … … 205 205 loadPtr(Address(X86::eax, FIELD_OFFSET(JSCell, m_structure)), X86::ecx); 206 206 // proto(ecx) = baseObject->structure()->prototype() 207 failureCases.append( jne32(Address(X86::ecx, FIELD_OFFSET(Structure, m_typeInfo) + FIELD_OFFSET(TypeInfo, m_type)), Imm32(ObjectType)));207 failureCases.append(branch32(NotEqual, Address(X86::ecx, FIELD_OFFSET(Structure, m_typeInfo) + FIELD_OFFSET(TypeInfo, m_type)), Imm32(ObjectType))); 208 208 209 209 loadPtr(Address(X86::ecx, FIELD_OFFSET(Structure, m_prototype)), X86::ecx); … … 212 212 for (RefPtr<Structure>* it = chain->head(); *it; ++it) { 213 213 // null check the prototype 214 successCases.append( jePtr(X86::ecx, ImmPtr(JSValuePtr::encode(jsNull()))));214 successCases.append(branchPtr(Equal, X86::ecx, ImmPtr(JSValuePtr::encode(jsNull())))); 215 215 216 216 // Check the structure id 217 failureCases.append( jnePtr(Address(X86::ecx, FIELD_OFFSET(JSCell, m_structure)), ImmPtr(it->get())));217 failureCases.append(branchPtr(NotEqual, Address(X86::ecx, FIELD_OFFSET(JSCell, m_structure)), ImmPtr(it->get()))); 218 218 219 219 loadPtr(Address(X86::ecx, FIELD_OFFSET(JSCell, m_structure)), X86::ecx); 220 failureCases.append( jne32(Address(X86::ecx, FIELD_OFFSET(Structure, m_typeInfo) + FIELD_OFFSET(TypeInfo, m_type)), Imm32(ObjectType)));220 failureCases.append(branch32(NotEqual, Address(X86::ecx, FIELD_OFFSET(Structure, m_typeInfo) + FIELD_OFFSET(TypeInfo, m_type)), Imm32(ObjectType))); 221 221 loadPtr(Address(X86::ecx, FIELD_OFFSET(Structure, m_prototype)), X86::ecx); 222 222 } … … 314 314 315 315 // Check eax is an array 316 Jump failureCases1 = jnePtr(Address(X86::eax), ImmPtr(m_interpreter->m_jsArrayVptr));316 Jump failureCases1 = branchPtr(NotEqual, Address(X86::eax), ImmPtr(m_interpreter->m_jsArrayVptr)); 317 317 318 318 // Checks out okay! - get the length from the storage … … 320 320 load32(Address(X86::ecx, FIELD_OFFSET(ArrayStorage, m_length)), X86::ecx); 321 321 322 Jump failureCases2 = ja32(X86::ecx, Imm32(JSImmediate::maxImmediateInt));322 Jump failureCases2 = branch32(Above, X86::ecx, Imm32(JSImmediate::maxImmediateInt)); 323 323 324 324 emitFastArithIntToImmNoCheck(X86::ecx, X86::eax); … … 386 386 #if PLATFORM(X86_64) 387 387 move(ImmPtr(prototypeStructure), X86::ebx); 388 Jump failureCases2 = jnePtr(X86::ebx, AbsoluteAddress(prototypeStructureAddress));389 #else 390 Jump failureCases2 = jnePtr(AbsoluteAddress(prototypeStructureAddress), ImmPtr(prototypeStructure));388 Jump failureCases2 = branchPtr(NotEqual, AbsoluteAddress(prototypeStructureAddress), X86::ebx); 389 #else 390 Jump failureCases2 = branchPtr(NotEqual, AbsoluteAddress(prototypeStructureAddress), ImmPtr(prototypeStructure)); 391 391 #endif 392 392 … … 427 427 // Check the prototype object's Structure had not changed. 428 428 Structure** prototypeStructureAddress = &(protoObject->m_structure); 429 Jump failureCases3 = jnePtr(AbsoluteAddress(prototypeStructureAddress), ImmPtr(prototypeStructure));429 Jump failureCases3 = branchPtr(NotEqual, AbsoluteAddress(prototypeStructureAddress), ImmPtr(prototypeStructure)); 430 430 431 431 // Checks out okay! - getDirectOffset … … 493 493 #if PLATFORM(X86_64) 494 494 move(ImmPtr(prototypeStructure), X86::ebx); 495 Jump failureCases2 = jnePtr(X86::ebx, AbsoluteAddress(prototypeStructureAddress));496 #else 497 Jump failureCases2 = jnePtr(AbsoluteAddress(prototypeStructureAddress), ImmPtr(prototypeStructure));495 Jump failureCases2 = branchPtr(NotEqual, AbsoluteAddress(prototypeStructureAddress), X86::ebx); 496 #else 497 Jump failureCases2 = branchPtr(NotEqual, AbsoluteAddress(prototypeStructureAddress), ImmPtr(prototypeStructure)); 498 498 #endif 499 499 … … 545 545 #if PLATFORM(X86_64) 546 546 move(ImmPtr(currStructure), X86::ebx); 547 bucketsOfFail.append( jnePtr(X86::ebx, AbsoluteAddress(prototypeStructureAddress)));548 #else 549 bucketsOfFail.append( jnePtr(AbsoluteAddress(prototypeStructureAddress), ImmPtr(currStructure)));547 bucketsOfFail.append(branchPtr(NotEqual, AbsoluteAddress(prototypeStructureAddress), X86::ebx)); 548 #else 549 bucketsOfFail.append(branchPtr(NotEqual, AbsoluteAddress(prototypeStructureAddress), ImmPtr(currStructure))); 550 550 #endif 551 551 } … … 604 604 #if PLATFORM(X86_64) 605 605 move(ImmPtr(currStructure), X86::ebx); 606 bucketsOfFail.append( jnePtr(X86::ebx, AbsoluteAddress(prototypeStructureAddress)));607 #else 608 bucketsOfFail.append( jnePtr(AbsoluteAddress(prototypeStructureAddress), ImmPtr(currStructure)));606 bucketsOfFail.append(branchPtr(NotEqual, AbsoluteAddress(prototypeStructureAddress), X86::ebx)); 607 #else 608 bucketsOfFail.append(branchPtr(NotEqual, AbsoluteAddress(prototypeStructureAddress), ImmPtr(currStructure))); 609 609 #endif 610 610 } … … 654 654 #if PLATFORM(X86_64) 655 655 move(ImmPtr(currStructure), X86::ebx); 656 bucketsOfFail.append( jnePtr(X86::ebx, AbsoluteAddress(prototypeStructureAddress)));657 #else 658 bucketsOfFail.append( jnePtr(AbsoluteAddress(prototypeStructureAddress), ImmPtr(currStructure)));656 bucketsOfFail.append(branchPtr(NotEqual, X86::ebx, AbsoluteAddress(prototypeStructureAddress))); 657 #else 658 bucketsOfFail.append(branchPtr(NotEqual, AbsoluteAddress(prototypeStructureAddress), ImmPtr(currStructure))); 659 659 #endif 660 660 } -
trunk/JavaScriptCore/runtime/RegExp.cpp
r39809 r40562 124 124 int offsetVectorSize = (m_numSubpatterns + 1) * 2; 125 125 int* offsetVector = new int [offsetVectorSize]; 126 ASSERT(offsetVector); 126 127 for (int j = 0; j < offsetVectorSize; ++j) 127 128 offsetVector[j] = -1; -
trunk/JavaScriptCore/wrec/WRECGenerator.cpp
r40522 r40562 68 68 #endif 69 69 #endif 70 71 #ifndef NDEBUG72 // ASSERT that the output register is not null.73 Jump outputNotNull = jnzPtr(output);74 breakpoint();75 outputNotNull.link(this);76 #endif77 70 } 78 71 … … 101 94 peek(index); 102 95 if (failure) 103 *failure = je32(length, index);96 *failure = branch32(Equal, length, index); 104 97 add32(Imm32(1), index); 105 98 poke(index); … … 108 101 void Generator::generateLoadCharacter(JumpList& failures) 109 102 { 110 failures.append( je32(length, index));103 failures.append(branch32(Equal, length, index)); 111 104 load16(BaseIndex(input, index, TimesTwo), character); 112 105 } … … 116 109 void Generator::generateJumpIfNotEndOfInput(Label target) 117 110 { 118 jle32(index, length, target);111 branch32(LessThanOrEqual, index, length, target); 119 112 } 120 113 … … 146 139 147 140 load32(Address(output, (2 * subpatternId) * sizeof(int)), character); 148 Jump skipIfEmpty = je32(Address(output, ((2 * subpatternId) + 1) * sizeof(int)), character);141 Jump skipIfEmpty = branch32(Equal, Address(output, ((2 * subpatternId) + 1) * sizeof(int)), character); 149 142 150 143 ASSERT(quantifierType == Quantifier::Greedy || quantifierType == Quantifier::NonGreedy); … … 176 169 pop(index); 177 170 if (max != Quantifier::Infinity) 178 je32(repeatCount, Imm32(max), quantifierFailed);171 branch32(Equal, repeatCount, Imm32(max), quantifierFailed); 179 172 180 173 // (1) Read an atom. … … 188 181 // (2) Keep reading if we're under the minimum. 189 182 if (min > 1) 190 jl32(repeatCount, Imm32(min), readAtom);183 branch32(LessThan, repeatCount, Imm32(min), readAtom); 191 184 192 185 // (3) Test the rest of the alternative. … … 222 215 doneReadingAtomsList.append(jump()); 223 216 else { 224 jne32(repeatCount, Imm32(max), readAtom);217 branch32(NotEqual, repeatCount, Imm32(max), readAtom); 225 218 doneReadingAtomsList.append(jump()); 226 219 } … … 239 232 // (2) Verify that we have enough atoms. 240 233 doneReadingAtomsList.link(this); 241 jl32(repeatCount, Imm32(min), quantifierFailed);234 branch32(LessThan, repeatCount, Imm32(min), quantifierFailed); 242 235 243 236 // (3) Test the rest of the alternative. … … 278 271 // Optimistically consume 2 characters. 279 272 add32(Imm32(2), index); 280 failures.append( jg32(index, length));273 failures.append(branch32(GreaterThan, index, length)); 281 274 282 275 // Load the characters we just consumed, offset -2 characters from index. … … 307 300 int pair = ch1 | (ch2 << 16); 308 301 309 failures.append( jne32(character, Imm32(pair)));302 failures.append(branch32(NotEqual, character, Imm32(pair))); 310 303 return true; 311 304 } … … 329 322 } else if (!isASCII(ch) && ((lower = Unicode::toLower(ch)) != (upper = Unicode::toUpper(ch)))) { 330 323 // handle unicode case sentitive characters - branch to success on upper 331 isUpper = je32(character, Imm32(upper));324 isUpper = branch32(Equal, character, Imm32(upper)); 332 325 hasUpper = true; 333 326 ch = lower; … … 336 329 337 330 // checks for ch, or lower case version of ch, if insensitive 338 failures.append( jne32(character, Imm32((unsigned short)ch)));331 failures.append(branch32(NotEqual, character, Imm32((unsigned short)ch))); 339 332 340 333 if (m_parser.ignoreCase() && hasUpper) { … … 358 351 // if there is anything else to check, check that first, if it falls through jmp to failure. 359 352 if ((*matchIndex < matchCount) && (matches[*matchIndex] < lo)) { 360 Jump loOrAbove = jge32(character, Imm32((unsigned short)lo));353 Jump loOrAbove = branch32(GreaterThanOrEqual, character, Imm32((unsigned short)lo)); 361 354 362 355 // generate code for all ranges before this one … … 365 358 366 359 while ((*matchIndex < matchCount) && (matches[*matchIndex] < lo)) { 367 matchDest.append( je32(character, Imm32((unsigned short)matches[*matchIndex])));360 matchDest.append(branch32(Equal, character, Imm32((unsigned short)matches[*matchIndex]))); 368 361 ++*matchIndex; 369 362 } … … 372 365 loOrAbove.link(this); 373 366 } else if (which) { 374 Jump loOrAbove = jge32(character, Imm32((unsigned short)lo));367 Jump loOrAbove = branch32(GreaterThanOrEqual, character, Imm32((unsigned short)lo)); 375 368 376 369 generateCharacterClassInvertedRange(failures, matchDest, ranges, which, matchIndex, matches, matchCount); … … 379 372 loOrAbove.link(this); 380 373 } else 381 failures.append( jl32(character, Imm32((unsigned short)lo)));374 failures.append(branch32(LessThan, character, Imm32((unsigned short)lo))); 382 375 383 376 while ((*matchIndex < matchCount) && (matches[*matchIndex] <= hi)) 384 377 ++*matchIndex; 385 378 386 matchDest.append( jle32(character, Imm32((unsigned short)hi)));379 matchDest.append(branch32(LessThanOrEqual, character, Imm32((unsigned short)hi))); 387 380 // fall through to here, the value is above hi. 388 381 … … 398 391 Jump unicodeFail; 399 392 if (charClass.numMatchesUnicode || charClass.numRangesUnicode) { 400 Jump isAscii = jle32(character, Imm32(0x7f));393 Jump isAscii = branch32(LessThanOrEqual, character, Imm32(0x7f)); 401 394 402 395 if (charClass.numMatchesUnicode) { 403 396 for (unsigned i = 0; i < charClass.numMatchesUnicode; ++i) { 404 397 UChar ch = charClass.matchesUnicode[i]; 405 matchDest.append( je32(character, Imm32(ch)));398 matchDest.append(branch32(Equal, character, Imm32(ch))); 406 399 } 407 400 } … … 412 405 UChar hi = charClass.rangesUnicode[i].end; 413 406 414 Jump below = jl32(character, Imm32(lo));415 matchDest.append( jle32(character, Imm32(hi)));407 Jump below = branch32(LessThan, character, Imm32(lo)); 408 matchDest.append(branch32(LessThanOrEqual, character, Imm32(hi))); 416 409 below.link(this); 417 410 } … … 427 420 generateCharacterClassInvertedRange(failures, matchDest, charClass.ranges, charClass.numRanges, &matchIndex, charClass.matches, charClass.numMatches); 428 421 while (matchIndex < charClass.numMatches) 429 matchDest.append( je32(character, Imm32((unsigned short)charClass.matches[matchIndex++])));422 matchDest.append(branch32(Equal, character, Imm32((unsigned short)charClass.matches[matchIndex++]))); 430 423 431 424 failures.link(this); … … 444 437 continue; 445 438 } 446 matchDest.append( je32(character, Imm32((unsigned short)ch)));439 matchDest.append(branch32(Equal, character, Imm32((unsigned short)ch))); 447 440 } 448 441 … … 450 443 or32(Imm32(32), character); 451 444 for (unsigned i = 0; i < countAZaz; ++i) 452 matchDest.append( je32(character, Imm32(matchesAZaz[i])));445 matchDest.append(branch32(Equal, character, Imm32(matchesAZaz[i]))); 453 446 } 454 447 } … … 534 527 535 528 // begin of input == success 536 previousIsNewline.append( je32(index, Imm32(0)));529 previousIsNewline.append(branch32(Equal, index, Imm32(0))); 537 530 538 531 // now check prev char against newline characters. … … 544 537 previousIsNewline.link(this); 545 538 } else 546 failures.append( jne32(index, Imm32(0)));539 failures.append(branch32(NotEqual, index, Imm32(0))); 547 540 } 548 541 … … 557 550 nextIsNewline.link(this); 558 551 } else { 559 failures.append( jne32(length, index));552 failures.append(branch32(NotEqual, length, index)); 560 553 } 561 554 } … … 569 562 570 563 // (1.1) check for begin of input 571 Jump atBegin = je32(index, Imm32(0));564 Jump atBegin = branch32(Equal, index, Imm32(0)); 572 565 // (1.2) load the last char, and chck if is word character 573 566 load16(BaseIndex(input, index, TimesTwo, -2), character); … … 626 619 627 620 // check if we're at the end of backref (if we are, success!) 628 Jump endOfBackRef = je32(Address(output, ((2 * subpatternId) + 1) * sizeof(int)), repeatCount);621 Jump endOfBackRef = branch32(Equal, Address(output, ((2 * subpatternId) + 1) * sizeof(int)), repeatCount); 629 622 630 623 load16(BaseIndex(input, repeatCount, MacroAssembler::TimesTwo), character); 631 624 632 625 // check if we've run out of input (this would be a can o'fail) 633 Jump endOfInput = je32(length, index);634 635 je16(character, BaseIndex(input, index, TimesTwo), topOfLoop);626 Jump endOfInput = branch32(Equal, length, index); 627 628 branch16(Equal, BaseIndex(input, index, TimesTwo), character, topOfLoop); 636 629 637 630 endOfInput.link(this);
Note:
See TracChangeset
for help on using the changeset viewer.