Changeset 95840 in webkit


Ignore:
Timestamp:
Sep 23, 2011 11:52:19 AM (13 years ago)
Author:
barraclough@apple.com
Message:

Implement op_resolve_global in the DFG JIT
https://bugs.webkit.org/show_bug.cgi?id=68704

Reviewed by Oliver Hunt.

This is performance neutral, but increases coverage.

  • dfg/DFGByteCodeParser.cpp:

(JSC::DFG::ByteCodeParser::ByteCodeParser):
(JSC::DFG::ByteCodeParser::parseBlock):

  • dfg/DFGNode.h:

(JSC::DFG::Node::hasIdentifier):
(JSC::DFG::Node::resolveInfoIndex):

  • dfg/DFGOperations.cpp:
  • dfg/DFGOperations.h:
  • dfg/DFGSpeculativeJIT.cpp:

(JSC::DFG::SpeculativeJIT::compile):

Location:
trunk/Source/JavaScriptCore
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/ChangeLog

    r95833 r95840  
     12011-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
    1212011-09-23  Mark Rowe  <mrowe@apple.com>
    222
  • trunk/Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp

    r95786 r95840  
    5757        , m_parameterSlots(0)
    5858        , m_numPassedVarArgs(0)
     59        , m_globalResolveNumber(0)
    5960    {
    6061        ASSERT(m_profiledBlock);
     
    616617    // The number of var args passed to the next var arg node.
    617618    unsigned m_numPassedVarArgs;
     619    // The index in the global resolve info.
     620    unsigned m_globalResolveNumber;
    618621
    619622    struct PhiStackEntry {
     
    14281431        }
    14291432           
     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
    14301442        case op_loop_hint: {
    14311443            // Baseline->DFG OSR jumps between loop hints. The DFG assumes that Baseline->DFG
  • trunk/Source/JavaScriptCore/dfg/DFGNode.h

    r95786 r95840  
    291291    macro(ResolveBase, NodeResultJS | NodeMustGenerate | NodeClobbersWorld) \
    292292    macro(ResolveBaseStrictPut, NodeResultJS | NodeMustGenerate | NodeClobbersWorld) \
     293    macro(ResolveGlobal, NodeResultJS | NodeMustGenerate | NodeClobbersWorld) \
    293294    \
    294295    /* Nodes for misc operations. */\
     
    467468        case ResolveBase:
    468469        case ResolveBaseStrictPut:
     470        case ResolveGlobal:
    469471            return true;
    470472        default:
     
    480482    }
    481483   
     484    unsigned resolveInfoIndex()
     485    {
     486        ASSERT(op == ResolveGlobal);
     487        return m_opInfo2;
     488    }
     489
    482490    bool hasArithNodeFlags()
    483491    {
  • trunk/Source/JavaScriptCore/dfg/DFGOperations.cpp

    r95758 r95840  
    675675}
    676676
     677EncodedJSValue 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
    677696EncodedJSValue operationToPrimitive(ExecState* exec, EncodedJSValue value)
    678697{
  • trunk/Source/JavaScriptCore/dfg/DFGOperations.h

    r95758 r95840  
    3131#include <dfg/DFGJITCompiler.h>
    3232
    33 namespace JSC { namespace DFG {
     33namespace JSC {
     34
     35struct GlobalResolveInfo;
     36
     37namespace DFG {
    3438
    3539enum PutKind { Direct, NotDirect };
     
    7680EncodedJSValue operationResolveBase(ExecState*, Identifier*);
    7781EncodedJSValue operationResolveBaseStrictPut(ExecState*, Identifier*);
     82EncodedJSValue operationResolveGlobal(ExecState*, GlobalResolveInfo*, Identifier*);
    7883EncodedJSValue operationToPrimitive(ExecState*, EncodedJSValue);
    7984EncodedJSValue operationStrCat(ExecState*, void* start, size_t);
  • trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp

    r95758 r95840  
    20442044        break;
    20452045    }
    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
    20472086    case Phantom:
    20482087        // This is a no-op.
Note: See TracChangeset for help on using the changeset viewer.