Changeset 103292 in webkit for trunk/Source/JavaScriptCore


Ignore:
Timestamp:
Dec 19, 2011, 6:42:06 PM (13 years ago)
Author:
[email protected]
Message:

If we detect that we can use the JIT, don't use computed opcode lookups
https://bugs.webkit.org/show_bug.cgi?id=74899
<rdar://problem/10604551>

Reviewed by Gavin Barraclough.

  • interpreter/Interpreter.cpp:

(JSC::Interpreter::Interpreter):
(JSC::Interpreter::initialize):
(JSC::Interpreter::privateExecute):

  • interpreter/Interpreter.h:

(JSC::Interpreter::getOpcode):
(JSC::Interpreter::getOpcodeID):

  • runtime/JSGlobalData.cpp:

(JSC::JSGlobalData::JSGlobalData):

Location:
trunk/Source/JavaScriptCore
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/ChangeLog

    r103287 r103292  
     12011-12-19  Filip Pizlo  <[email protected]>
     2
     3        If we detect that we can use the JIT, don't use computed opcode lookups
     4        https://bugs.webkit.org/show_bug.cgi?id=74899
     5        <rdar://problem/10604551>
     6
     7        Reviewed by Gavin Barraclough.
     8
     9        * interpreter/Interpreter.cpp:
     10        (JSC::Interpreter::Interpreter):
     11        (JSC::Interpreter::initialize):
     12        (JSC::Interpreter::privateExecute):
     13        * interpreter/Interpreter.h:
     14        (JSC::Interpreter::getOpcode):
     15        (JSC::Interpreter::getOpcodeID):
     16        * runtime/JSGlobalData.cpp:
     17        (JSC::JSGlobalData::JSGlobalData):
     18
    1192011-12-19  Geoffrey Garen  <[email protected]>
    220
  • trunk/Source/JavaScriptCore/interpreter/Interpreter.cpp

    r103083 r103292  
    541541    : m_sampleEntryDepth(0)
    542542    , m_reentryDepth(0)
     543#if !ASSERT_DISABLED
     544    , m_initialized(false)
     545#endif
     546    , m_enabled(false)
     547{
     548}
     549
     550void Interpreter::initialize(bool canUseJIT)
    543551{
    544552#if ENABLE(COMPUTED_GOTO_INTERPRETER)
    545     privateExecute(InitializeAndReturn, 0, 0);
    546 
    547     for (int i = 0; i < numOpcodeIDs; ++i)
    548         m_opcodeIDTable.add(m_opcodeTable[i], static_cast<OpcodeID>(i));
     553    if (canUseJIT) {
     554        // If the JIT is present, don't use jump destinations for opcodes.
     555       
     556        for (int i = 0; i < numOpcodeIDs; ++i) {
     557            Opcode opcode = bitwise_cast<void*>(static_cast<uintptr_t>(i));
     558            m_opcodeTable[i] = opcode;
     559            m_opcodeIDTable.add(opcode, static_cast<OpcodeID>(i));
     560        }
     561    } else {
     562        privateExecute(InitializeAndReturn, 0, 0);
     563       
     564        for (int i = 0; i < numOpcodeIDs; ++i)
     565            m_opcodeIDTable.add(m_opcodeTable[i], static_cast<OpcodeID>(i));
     566       
     567        m_enabled = true;
     568    }
     569#else
     570    UNUSED_PARAM(canUseJIT);
     571#if ENABLE(INTERPRETER)
     572    m_enabled = true;
     573#else
     574    m_enabled = false;
     575#endif
    549576#endif // ENABLE(COMPUTED_GOTO_INTERPRETER)
     577#if !ASSERT_DISABLED
     578    m_initialized = true;
     579#endif
    550580
    551581#if ENABLE(OPCODE_SAMPLING)
     
    16541684    }
    16551685   
     1686    ASSERT(m_initialized);
     1687    ASSERT(m_enabled);
     1688   
    16561689#if ENABLE(JIT)
    16571690#if ENABLE(INTERPRETER)
  • trunk/Source/JavaScriptCore/interpreter/Interpreter.h

    r102545 r103292  
    9595    public:
    9696        Interpreter();
     97       
     98        void initialize(bool canUseJIT);
    9799
    98100        RegisterFile& registerFile() { return m_registerFile; }
     
    100102        Opcode getOpcode(OpcodeID id)
    101103        {
    102             #if ENABLE(COMPUTED_GOTO_INTERPRETER)
    103                 return m_opcodeTable[id];
    104             #else
    105                 return id;
    106             #endif
     104            ASSERT(m_initialized);
     105#if ENABLE(COMPUTED_GOTO_INTERPRETER)
     106            return m_opcodeTable[id];
     107#else
     108            return id;
     109#endif
    107110        }
    108111
    109112        OpcodeID getOpcodeID(Opcode opcode)
    110113        {
    111             #if ENABLE(COMPUTED_GOTO_INTERPRETER)
    112                 ASSERT(isOpcode(opcode));
    113                 return m_opcodeIDTable.get(opcode);
    114             #else
    115                 return opcode;
    116             #endif
     114            ASSERT(m_initialized);
     115#if ENABLE(COMPUTED_GOTO_INTERPRETER)
     116            ASSERT(isOpcode(opcode));
     117            if (!m_enabled) {
     118                OpcodeID result = static_cast<OpcodeID>(bitwise_cast<uintptr_t>(opcode));
     119                ASSERT(result == m_opcodeIDTable.get(opcode));
     120                return result;
     121            }
     122            return m_opcodeIDTable.get(opcode);
     123#else
     124            return opcode;
     125#endif
    117126        }
    118127
     
    187196        HashMap<Opcode, OpcodeID> m_opcodeIDTable; // Maps Opcode => OpcodeID for decompiling
    188197#endif
     198
     199#if !ASSERT_DISABLED
     200        bool m_initialized;
     201#endif
     202        bool m_enabled;
    189203    };
    190204
  • trunk/Source/JavaScriptCore/runtime/JSGlobalData.cpp

    r103083 r103292  
    228228#endif
    229229
     230    interpreter->initialize(this->canUseJIT());
     231
    230232    heap.notifyIsSafeToCollect();
    231233}
Note: See TracChangeset for help on using the changeset viewer.