Changeset 37406 in webkit for trunk/JavaScriptCore/VM/CTI.cpp


Ignore:
Timestamp:
Oct 7, 2008, 9:56:38 PM (17 years ago)
Author:
[email protected]
Message:

Switch CTI runtime calls to the fastcall calling convention

Reviewed by Cameron Zwarich

Basically this means that we get to store the argument for CTI
calls in the ECX register, which saves a register->memory write
and subsequent memory->register read.

This is a 1.7% progression in SunSpider and 2.4% on commandline
v8 tests on Windows

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/VM/CTI.cpp

    r37405 r37406  
    113113            sub esp, 0x24;
    114114            mov esi, 512;
    115             mov [esp], esp;
     115            mov ecx, esp;
    116116            mov edi, [esp + 0x38];
    117117            call [esp + 0x30];
     
    126126    {
    127127        __asm {
    128             mov [esp], esp;
     128            mov ecx, esp;
    129129            call JSC::Machine::cti_vm_throw;
    130130            add esp, 0x24;
     
    27962796extern "C" {
    27972797
    2798 static JSValue* SFX_CALL transitionObject(StructureID* newStructureID, size_t cachedOffset, JSObject* baseObject, JSValue* value)
     2798static JSValue* transitionObject(StructureID* newStructureID, size_t cachedOffset, JSObject* baseObject, JSValue* value)
    27992799{
    28002800    baseObject->transitionTo(newStructureID);
     
    28722872    }
    28732873    m_jit.ret();
     2874   
     2875    X86Assembler::JmpSrc failureJump;
     2876    if (failureCases.size()) {
     2877        for (unsigned i = 0; i < failureCases.size(); ++i)
     2878            m_jit.link(failureCases[i], m_jit.label());
     2879        m_jit.emitRestoreArgumentReferenceForTrampoline();
     2880        failureJump = m_jit.emitUnlinkedJmp();
     2881    }
     2882
    28742883    void* code = m_jit.copy();
    28752884    ASSERT(code);
    2876    
    2877     for (unsigned i = 0; i < failureCases.size(); ++i)
    2878         X86Assembler::link(code, failureCases[i], reinterpret_cast<void*>(Machine::cti_op_put_by_id_fail));
     2885
     2886    if (failureCases.size())
     2887        X86Assembler::link(code, failureJump, reinterpret_cast<void*>(Machine::cti_op_put_by_id_fail));
    28792888
    28802889    if (transitionWillNeedStorageRealloc(oldStructureID, newStructureID))
     
    29862995
    29872996    m_jit.addl_rr(X86::ecx, X86::ecx);
    2988     X86Assembler::JmpSrc failureCases3 = m_jit.emitUnlinkedJo();
     2997    X86Assembler::JmpSrc failureClobberedECX = m_jit.emitUnlinkedJo();
    29892998    m_jit.addl_i8r(1, X86::ecx);
    29902999
    29913000    X86Assembler::JmpSrc success = m_jit.emitUnlinkedJmp();
     3001
     3002    m_jit.link(failureClobberedECX, m_jit.label());
     3003    m_jit.emitRestoreArgumentReference();
     3004    X86Assembler::JmpSrc failureCases3 = m_jit.emitUnlinkedJmp();
    29923005
    29933006    void* code = m_jit.copy();
Note: See TracChangeset for help on using the changeset viewer.