Changeset 95840 in webkit
- Timestamp:
- Sep 23, 2011 11:52:19 AM (13 years ago)
- Location:
- trunk/Source/JavaScriptCore
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/ChangeLog
r95833 r95840 1 2011-09-23 Gavin Barraclough <barraclough@apple.com> 2 3 Implement op_resolve_global in the DFG JIT 4 https://bugs.webkit.org/show_bug.cgi?id=68704 5 6 Reviewed by Oliver Hunt. 7 8 This is performance neutral, but increases coverage. 9 10 * dfg/DFGByteCodeParser.cpp: 11 (JSC::DFG::ByteCodeParser::ByteCodeParser): 12 (JSC::DFG::ByteCodeParser::parseBlock): 13 * dfg/DFGNode.h: 14 (JSC::DFG::Node::hasIdentifier): 15 (JSC::DFG::Node::resolveInfoIndex): 16 * dfg/DFGOperations.cpp: 17 * dfg/DFGOperations.h: 18 * dfg/DFGSpeculativeJIT.cpp: 19 (JSC::DFG::SpeculativeJIT::compile): 20 1 21 2011-09-23 Mark Rowe <mrowe@apple.com> 2 22 -
trunk/Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp
r95786 r95840 57 57 , m_parameterSlots(0) 58 58 , m_numPassedVarArgs(0) 59 , m_globalResolveNumber(0) 59 60 { 60 61 ASSERT(m_profiledBlock); … … 616 617 // The number of var args passed to the next var arg node. 617 618 unsigned m_numPassedVarArgs; 619 // The index in the global resolve info. 620 unsigned m_globalResolveNumber; 618 621 619 622 struct PhiStackEntry { … … 1428 1431 } 1429 1432 1433 case op_resolve_global: { 1434 unsigned identifier = currentInstruction[2].u.operand; 1435 1436 NodeIndex resolve = addToGraph(ResolveGlobal, OpInfo(identifier), OpInfo(m_globalResolveNumber++)); 1437 set(currentInstruction[1].u.operand, resolve); 1438 1439 NEXT_OPCODE(op_resolve_global); 1440 } 1441 1430 1442 case op_loop_hint: { 1431 1443 // Baseline->DFG OSR jumps between loop hints. The DFG assumes that Baseline->DFG -
trunk/Source/JavaScriptCore/dfg/DFGNode.h
r95786 r95840 291 291 macro(ResolveBase, NodeResultJS | NodeMustGenerate | NodeClobbersWorld) \ 292 292 macro(ResolveBaseStrictPut, NodeResultJS | NodeMustGenerate | NodeClobbersWorld) \ 293 macro(ResolveGlobal, NodeResultJS | NodeMustGenerate | NodeClobbersWorld) \ 293 294 \ 294 295 /* Nodes for misc operations. */\ … … 467 468 case ResolveBase: 468 469 case ResolveBaseStrictPut: 470 case ResolveGlobal: 469 471 return true; 470 472 default: … … 480 482 } 481 483 484 unsigned resolveInfoIndex() 485 { 486 ASSERT(op == ResolveGlobal); 487 return m_opInfo2; 488 } 489 482 490 bool hasArithNodeFlags() 483 491 { -
trunk/Source/JavaScriptCore/dfg/DFGOperations.cpp
r95758 r95840 675 675 } 676 676 677 EncodedJSValue operationResolveGlobal(ExecState* exec, GlobalResolveInfo* resolveInfo, Identifier* propertyName) 678 { 679 JSGlobalObject* globalObject = exec->lexicalGlobalObject(); 680 681 PropertySlot slot(globalObject); 682 if (globalObject->getPropertySlot(exec, *propertyName, slot)) { 683 JSValue result = slot.getValue(exec, *propertyName); 684 685 if (slot.isCacheableValue() && !globalObject->structure()->isUncacheableDictionary() && slot.slotBase() == globalObject) { 686 resolveInfo->structure.set(exec->globalData(), exec->codeBlock()->ownerExecutable(), globalObject->structure()); 687 resolveInfo->offset = slot.cachedOffset(); 688 } 689 690 return JSValue::encode(result); 691 } 692 693 return throwVMError(exec, createUndefinedVariableError(exec, *propertyName)); 694 } 695 677 696 EncodedJSValue operationToPrimitive(ExecState* exec, EncodedJSValue value) 678 697 { -
trunk/Source/JavaScriptCore/dfg/DFGOperations.h
r95758 r95840 31 31 #include <dfg/DFGJITCompiler.h> 32 32 33 namespace JSC { namespace DFG { 33 namespace JSC { 34 35 struct GlobalResolveInfo; 36 37 namespace DFG { 34 38 35 39 enum PutKind { Direct, NotDirect }; … … 76 80 EncodedJSValue operationResolveBase(ExecState*, Identifier*); 77 81 EncodedJSValue operationResolveBaseStrictPut(ExecState*, Identifier*); 82 EncodedJSValue operationResolveGlobal(ExecState*, GlobalResolveInfo*, Identifier*); 78 83 EncodedJSValue operationToPrimitive(ExecState*, EncodedJSValue); 79 84 EncodedJSValue operationStrCat(ExecState*, void* start, size_t); -
trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp
r95758 r95840 2044 2044 break; 2045 2045 } 2046 2046 2047 case ResolveGlobal: { 2048 GPRTemporary globalObject(this); 2049 GPRTemporary resolveInfo(this); 2050 GPRTemporary result(this); 2051 2052 GPRReg globalObjectGPR = globalObject.gpr(); 2053 GPRReg resolveInfoGPR = resolveInfo.gpr(); 2054 GPRReg resultGPR = result.gpr(); 2055 2056 GlobalResolveInfo* resolveInfoAddress = &(m_jit.codeBlock()->globalResolveInfo(node.resolveInfoIndex())); 2057 2058 // Check Structure of global object 2059 m_jit.move(JITCompiler::TrustedImmPtr(m_jit.codeBlock()->globalObject()), globalObjectGPR); 2060 m_jit.move(JITCompiler::TrustedImmPtr(resolveInfoAddress), resolveInfoGPR); 2061 m_jit.loadPtr(JITCompiler::Address(resolveInfoGPR, OBJECT_OFFSETOF(GlobalResolveInfo, structure)), resultGPR); 2062 JITCompiler::Jump structuresMatch = m_jit.branchPtr(JITCompiler::Equal, resultGPR, JITCompiler::Address(globalObjectGPR, JSCell::structureOffset())); 2063 2064 silentSpillAllRegisters(resultGPR); 2065 m_jit.move(resolveInfoGPR, GPRInfo::argumentGPR1); 2066 m_jit.move(JITCompiler::TrustedImmPtr(&m_jit.codeBlock()->identifier(node.identifierNumber())), GPRInfo::argumentGPR2); 2067 m_jit.move(GPRInfo::callFrameRegister, GPRInfo::argumentGPR0); 2068 JITCompiler::Call functionCall = appendCallWithExceptionCheck(operationResolveGlobal); 2069 m_jit.move(GPRInfo::returnValueGPR, resultGPR); 2070 silentFillAllRegisters(resultGPR); 2071 2072 JITCompiler::Jump wasSlow = m_jit.jump(); 2073 2074 // Fast case 2075 structuresMatch.link(&m_jit); 2076 m_jit.loadPtr(JITCompiler::Address(globalObjectGPR, JSObject::offsetOfPropertyStorage()), resultGPR); 2077 m_jit.load32(JITCompiler::Address(resolveInfoGPR, OBJECT_OFFSETOF(GlobalResolveInfo, offset)), resolveInfoGPR); 2078 m_jit.loadPtr(JITCompiler::BaseIndex(resultGPR, resolveInfoGPR, JITCompiler::ScalePtr), resultGPR); 2079 2080 wasSlow.link(&m_jit); 2081 2082 jsValueResult(resultGPR, m_compileIndex); 2083 break; 2084 } 2085 2047 2086 case Phantom: 2048 2087 // This is a no-op.
Note: See TracChangeset
for help on using the changeset viewer.