Changeset 90502 in webkit
- Timestamp:
- Jul 6, 2011 2:40:11 PM (13 years ago)
- Location:
- trunk/Source/JavaScriptCore
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/ChangeLog
r90487 r90502 1 2011-07-06 Filip Pizlo <fpizlo@apple.com> 2 3 DFG JIT op_call implementation will flush registers even when those registers are dead 4 https://bugs.webkit.org/show_bug.cgi?id=64023 5 6 Reviewed by Gavin Barraclough. 7 8 * dfg/DFGJITCodeGenerator.cpp: 9 (JSC::DFG::JITCodeGenerator::emitCall): 10 * dfg/DFGJITCodeGenerator.h: 11 (JSC::DFG::JITCodeGenerator::integerResult): 12 (JSC::DFG::JITCodeGenerator::noResult): 13 (JSC::DFG::JITCodeGenerator::cellResult): 14 (JSC::DFG::JITCodeGenerator::jsValueResult): 15 (JSC::DFG::JITCodeGenerator::doubleResult): 16 * dfg/DFGNonSpeculativeJIT.cpp: 17 (JSC::DFG::NonSpeculativeJIT::compile): 18 * dfg/DFGSpeculativeJIT.cpp: 19 (JSC::DFG::SpeculativeJIT::compile): 20 1 21 2011-07-06 Filip Pizlo <fpizlo@apple.com> 2 22 -
trunk/Source/JavaScriptCore/dfg/DFGJITCodeGenerator.cpp
r90423 r90502 431 431 } 432 432 433 void JITCodeGenerator::emitCall(Node& node, GPRReg targetGPR) 434 { 433 void JITCodeGenerator::emitCall(Node& node) 434 { 435 NodeIndex calleeNodeIndex = m_jit.graph().m_varArgChildren[node.firstChild()]; 436 JSValueOperand callee(this, calleeNodeIndex); 437 GPRReg calleeGPR = callee.gpr(); 438 use(calleeNodeIndex); 439 435 440 // the call instruction's first child is either the function (normal call) or the 436 441 // receiver (method call). subsequent children are the arguments. … … 451 456 452 457 for (int argIdx = 0; argIdx < numArgs; argIdx++) { 453 JSValueOperand arg(this, m_jit.graph().m_varArgChildren[node.firstChild() + 1 + argIdx]); 458 NodeIndex argNodeIndex = m_jit.graph().m_varArgChildren[node.firstChild() + 1 + argIdx]; 459 JSValueOperand arg(this, argNodeIndex); 454 460 GPRReg argGPR = arg.gpr(); 461 use(argNodeIndex); 455 462 456 463 m_jit.storePtr(argGPR, addressOfCallData(-callDataSize + argIdx)); … … 459 466 switch (node.op) { 460 467 case Call: 461 m_jit.storePtr( targetGPR, addressOfCallData(RegisterFile::Callee));468 m_jit.storePtr(calleeGPR, addressOfCallData(RegisterFile::Callee)); 462 469 break; 463 470 … … 476 483 switch (node.op) { 477 484 case Call: 478 slowPath = m_jit.branchPtrWithPatch(MacroAssembler::NotEqual, targetGPR, targetToCheck, MacroAssembler::TrustedImmPtr(JSValue::encode(JSValue())));479 m_jit.loadPtr(MacroAssembler::Address( targetGPR, OBJECT_OFFSETOF(JSFunction, m_scopeChain)), resultGPR);485 slowPath = m_jit.branchPtrWithPatch(MacroAssembler::NotEqual, calleeGPR, targetToCheck, MacroAssembler::TrustedImmPtr(JSValue::encode(JSValue()))); 486 m_jit.loadPtr(MacroAssembler::Address(calleeGPR, OBJECT_OFFSETOF(JSFunction, m_scopeChain)), resultGPR); 480 487 m_jit.storePtr(resultGPR, addressOfCallData(RegisterFile::ScopeChain)); 481 488 break; … … 504 511 m_jit.move(GPRInfo::returnValueGPR, resultGPR); 505 512 506 jsValueResult(resultGPR, m_compileIndex );513 jsValueResult(resultGPR, m_compileIndex, DataFormatJS, UseChildrenCalledExplicitly); 507 514 508 515 m_jit.addJSCall(fastCall, slowCall, targetToCheck, true, m_jit.graph()[m_compileIndex].exceptionInfo); -
trunk/Source/JavaScriptCore/dfg/DFGJITCodeGenerator.h
r90423 r90502 65 65 SpillOrderDouble = 6, // needs spill and convert 66 66 }; 67 68 enum UseChildrenMode { CallUseChildren, UseChildrenCalledExplicitly }; 67 69 68 70 … … 529 531 } 530 532 531 void emitCall(Node& , GPRReg targetGPR);533 void emitCall(Node&); 532 534 533 535 // Called once a node has completed code generation but prior to setting … … 539 541 // These method called to initialize the the GenerationInfo 540 542 // to describe the result of an operation. 541 void integerResult(GPRReg reg, NodeIndex nodeIndex, DataFormat format = DataFormatInteger )543 void integerResult(GPRReg reg, NodeIndex nodeIndex, DataFormat format = DataFormatInteger, UseChildrenMode mode = CallUseChildren) 542 544 { 543 545 Node& node = m_jit.graph()[nodeIndex]; 544 useChildren(node); 546 if (mode == CallUseChildren) 547 useChildren(node); 545 548 546 549 VirtualRegister virtualRegister = node.virtualRegister(); … … 558 561 } 559 562 } 560 void noResult(NodeIndex nodeIndex) 561 { 563 void noResult(NodeIndex nodeIndex, UseChildrenMode mode = CallUseChildren) 564 { 565 if (mode == UseChildrenCalledExplicitly) 566 return; 562 567 Node& node = m_jit.graph()[nodeIndex]; 563 568 useChildren(node); 564 569 } 565 void cellResult(GPRReg reg, NodeIndex nodeIndex )570 void cellResult(GPRReg reg, NodeIndex nodeIndex, UseChildrenMode mode = CallUseChildren) 566 571 { 567 572 Node& node = m_jit.graph()[nodeIndex]; 568 useChildren(node); 573 if (mode == CallUseChildren) 574 useChildren(node); 569 575 570 576 VirtualRegister virtualRegister = node.virtualRegister(); … … 573 579 info.initCell(nodeIndex, node.refCount(), reg); 574 580 } 575 void jsValueResult(GPRReg reg, NodeIndex nodeIndex, DataFormat format = DataFormatJS )581 void jsValueResult(GPRReg reg, NodeIndex nodeIndex, DataFormat format = DataFormatJS, UseChildrenMode mode = CallUseChildren) 576 582 { 577 583 if (format == DataFormatJSInteger) … … 579 585 580 586 Node& node = m_jit.graph()[nodeIndex]; 581 useChildren(node); 587 if (mode == CallUseChildren) 588 useChildren(node); 582 589 583 590 VirtualRegister virtualRegister = node.virtualRegister(); … … 586 593 info.initJSValue(nodeIndex, node.refCount(), reg, format); 587 594 } 588 void doubleResult(FPRReg reg, NodeIndex nodeIndex )595 void doubleResult(FPRReg reg, NodeIndex nodeIndex, UseChildrenMode mode = CallUseChildren) 589 596 { 590 597 Node& node = m_jit.graph()[nodeIndex]; 591 useChildren(node); 598 if (mode == CallUseChildren) 599 useChildren(node); 592 600 593 601 VirtualRegister virtualRegister = node.virtualRegister(); -
trunk/Source/JavaScriptCore/dfg/DFGNonSpeculativeJIT.cpp
r90423 r90502 1055 1055 1056 1056 case Call: 1057 JSValueOperand callee(this, m_jit.graph().m_varArgChildren[node.firstChild()]); 1058 GPRReg calleeGPR = callee.gpr(); 1059 emitCall(node, calleeGPR); 1057 emitCall(node); 1060 1058 break; 1061 1059 } -
trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp
r90487 r90502 1134 1134 1135 1135 case Call: 1136 JSValueOperand callee(this, m_jit.graph().m_varArgChildren[node.firstChild()]); 1137 GPRReg calleeGPR = callee.gpr(); 1138 emitCall(node, calleeGPR); 1136 emitCall(node); 1139 1137 break; 1140 1138 }
Note: See TracChangeset
for help on using the changeset viewer.