Changeset 95147 in webkit
- Timestamp:
- Sep 14, 2011 6:24:39 PM (13 years ago)
- Location:
- trunk/Source/JavaScriptCore
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/ChangeLog
r95145 r95147 1 2011-09-12 Filip Pizlo <fpizlo@apple.com> 2 3 DFG JIT always speculates that ValueAdd is a numeric addition 4 https://bugs.webkit.org/show_bug.cgi?id=67956 5 6 Reviewed by Geoffrey Garen. 7 8 * dfg/DFGJITCodeGenerator.cpp: 9 (JSC::DFG::JITCodeGenerator::isKnownNotNumber): 10 * dfg/DFGJITCodeGenerator.h: 11 * dfg/DFGNonSpeculativeJIT.cpp: 12 (JSC::DFG::NonSpeculativeJIT::knownConstantArithOp): 13 (JSC::DFG::NonSpeculativeJIT::basicArithOp): 14 * dfg/DFGOperations.cpp: 15 * dfg/DFGOperations.h: 16 * dfg/DFGSpeculativeJIT.cpp: 17 (JSC::DFG::SpeculativeJIT::compile): 18 * dfg/DFGSpeculativeJIT.h: 19 (JSC::DFG::SpeculativeJIT::shouldSpeculateNumber): 20 1 21 2011-09-14 Anders Carlsson <andersca@apple.com> 2 22 -
trunk/Source/JavaScriptCore/dfg/DFGJITCodeGenerator.cpp
r95127 r95147 396 396 } 397 397 398 bool JITCodeGenerator::isKnownNotNumber(NodeIndex nodeIndex) 399 { 400 Node& node = m_jit.graph()[nodeIndex]; 401 VirtualRegister virtualRegister = node.virtualRegister(); 402 GenerationInfo& info = m_generationInfo[virtualRegister]; 403 404 return (!info.isJSDouble() && !info.isJSInteger()) 405 || (node.isConstant() && !isNumberConstant(nodeIndex)); 406 } 407 398 408 bool JITCodeGenerator::isKnownBoolean(NodeIndex nodeIndex) 399 409 { -
trunk/Source/JavaScriptCore/dfg/DFGJITCodeGenerator.h
r95127 r95147 414 414 415 415 bool isKnownNotInteger(NodeIndex); 416 bool isKnownNotNumber(NodeIndex); 416 417 417 418 bool isKnownBoolean(NodeIndex); -
trunk/Source/JavaScriptCore/dfg/DFGNonSpeculativeJIT.cpp
r95136 r95147 241 241 } 242 242 m_jit.move(GPRInfo::callFrameRegister, GPRInfo::argumentGPR0); 243 appendCallWithExceptionCheck(operationValueAdd );243 appendCallWithExceptionCheck(operationValueAddNotNumber); 244 244 m_jit.move(GPRInfo::returnValueGPR, resultGPR); 245 245 silentFillAllRegisters(resultGPR); … … 419 419 setupStubArguments(arg1GPR, arg2GPR); 420 420 m_jit.move(GPRInfo::callFrameRegister, GPRInfo::argumentGPR0); 421 appendCallWithExceptionCheck(operationValueAdd );421 appendCallWithExceptionCheck(operationValueAddNotNumber); 422 422 m_jit.move(GPRInfo::returnValueGPR, resultGPR); 423 423 silentFillAllRegisters(resultGPR); -
trunk/Source/JavaScriptCore/dfg/DFGOperations.cpp
r94942 r95147 125 125 JSValue op2 = JSValue::decode(encodedOp2); 126 126 127 return JSValue::encode(jsAdd(exec, op1, op2)); 128 } 129 130 EncodedJSValue operationValueAddNotNumber(ExecState* exec, EncodedJSValue encodedOp1, EncodedJSValue encodedOp2) 131 { 132 JSValue op1 = JSValue::decode(encodedOp1); 133 JSValue op2 = JSValue::decode(encodedOp2); 134 127 135 ASSERT(!op1.isNumber() || !op2.isNumber()); 136 137 if (op1.isString()) { 138 if (op2.isString()) 139 return JSValue::encode(jsString(exec, asString(op1), asString(op2))); 140 return JSValue::encode(jsString(exec, asString(op1), op2.toPrimitiveString(exec))); 141 } 128 142 129 143 return JSValue::encode(jsAddSlowCase(exec, op1, op2)); -
trunk/Source/JavaScriptCore/dfg/DFGOperations.h
r94942 r95147 58 58 EncodedJSValue operationConvertThis(ExecState*, EncodedJSValue encodedOp1); 59 59 EncodedJSValue operationValueAdd(ExecState*, EncodedJSValue encodedOp1, EncodedJSValue encodedOp2); 60 EncodedJSValue operationValueAddNotNumber(ExecState*, EncodedJSValue encodedOp1, EncodedJSValue encodedOp2); 60 61 EncodedJSValue operationArithAdd(EncodedJSValue encodedOp1, EncodedJSValue encodedOp2); 61 62 EncodedJSValue operationArithSub(EncodedJSValue encodedOp1, EncodedJSValue encodedOp2); -
trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp
r95136 r95147 924 924 } 925 925 926 SpeculateDoubleOperand op1(this, node.child1()); 927 SpeculateDoubleOperand op2(this, node.child2()); 928 FPRTemporary result(this, op1, op2); 929 930 FPRReg reg1 = op1.fpr(); 931 FPRReg reg2 = op2.fpr(); 932 m_jit.addDouble(reg1, reg2, result.fpr()); 933 934 doubleResult(result.fpr(), m_compileIndex); 926 if (shouldSpeculateNumber(node.child1(), node.child2())) { 927 SpeculateDoubleOperand op1(this, node.child1()); 928 SpeculateDoubleOperand op2(this, node.child2()); 929 FPRTemporary result(this, op1, op2); 930 931 FPRReg reg1 = op1.fpr(); 932 FPRReg reg2 = op2.fpr(); 933 m_jit.addDouble(reg1, reg2, result.fpr()); 934 935 doubleResult(result.fpr(), m_compileIndex); 936 break; 937 } 938 939 ASSERT(op == ValueAdd); 940 941 JSValueOperand op1(this, node.child1()); 942 JSValueOperand op2(this, node.child2()); 943 944 GPRReg op1GPR = op1.gpr(); 945 GPRReg op2GPR = op2.gpr(); 946 947 flushRegisters(); 948 949 GPRResult result(this); 950 if (isKnownNotNumber(node.child1()) || isKnownNotNumber(node.child2())) 951 callOperation(operationValueAddNotNumber, result.gpr(), op1GPR, op2GPR); 952 else 953 callOperation(operationValueAdd, result.gpr(), op1GPR, op2GPR); 954 955 jsValueResult(result.gpr(), m_compileIndex); 935 956 break; 936 957 } -
trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.h
r95060 r95147 385 385 } 386 386 387 bool shouldNotSpeculateInteger(NodeIndex nodeIndex) 388 { 389 if (isDoubleConstant(nodeIndex)) 390 return true; 391 387 bool shouldSpeculateNumber(NodeIndex nodeIndex) 388 { 392 389 Node& node = m_jit.graph()[nodeIndex]; 393 390 391 if (node.hasNumberResult()) 392 return true; 393 394 if (isNumberConstant(nodeIndex)) 395 return true; 396 394 397 VirtualRegister virtualRegister = node.virtualRegister(); 395 398 GenerationInfo& info = m_generationInfo[virtualRegister]; 396 399 400 if (info.isJSInteger() || info.isJSDouble()) 401 return true; 402 403 PredictedType prediction = m_jit.graph().getPrediction(node); 404 405 if (isNumberPrediction(prediction) || prediction == PredictNone) 406 return true; 407 408 return false; 409 } 410 411 bool shouldNotSpeculateInteger(NodeIndex nodeIndex) 412 { 413 if (isDoubleConstant(nodeIndex)) 414 return true; 415 416 Node& node = m_jit.graph()[nodeIndex]; 417 418 VirtualRegister virtualRegister = node.virtualRegister(); 419 GenerationInfo& info = m_generationInfo[virtualRegister]; 420 397 421 if (info.isJSDouble()) 398 422 return true; … … 407 431 { 408 432 return !(shouldNotSpeculateInteger(op1) || shouldNotSpeculateInteger(op2)) && (shouldSpeculateInteger(op1) || shouldSpeculateInteger(op2)); 433 } 434 435 bool shouldSpeculateNumber(NodeIndex op1, NodeIndex op2) 436 { 437 return shouldSpeculateNumber(op1) && shouldSpeculateNumber(op2); 409 438 } 410 439
Note: See TracChangeset
for help on using the changeset viewer.