Ignore:
Timestamp:
Dec 1, 2008, 1:18:36 AM (16 years ago)
Author:
[email protected]
Message:

2008-11-29 Gavin Barraclough <[email protected]>

Reviewed by Camron Zwarich.

Enable WREC on PLATFORM(X86_64). This change predominantly requires changes to the
WREC::Generator::generateEnter method to support the x86-64 ABI, and addition of
support for a limited number of quadword operations in the X86Assembler.

This patch will cause the JS heap to be allocated with RWX permissions on 64-bit Mac
platforms. This is a regression with respect to previous 64-bit behaviour, but is no
more permissive than on 32-bit builds. This issue should be addressed at some point.
(This is tracked by bug #21783.)

https://bugs.webkit.org/show_bug.cgi?id=22554
Greater than 4x speedup on regexp-dna, on x86-64.

  • assembler/MacroAssembler.h: (JSC::MacroAssembler::addPtr): (JSC::MacroAssembler::loadPtr): (JSC::MacroAssembler::storePtr): (JSC::MacroAssembler::pop): (JSC::MacroAssembler::push): (JSC::MacroAssembler::move):
  • assembler/X86Assembler.h: (JSC::X86Assembler::): (JSC::X86Assembler::movq_rr): (JSC::X86Assembler::addl_i8m): (JSC::X86Assembler::addl_i32r): (JSC::X86Assembler::addq_i8r): (JSC::X86Assembler::addq_i32r): (JSC::X86Assembler::movq_mr): (JSC::X86Assembler::movq_rm):
  • wrec/WREC.h:
  • wrec/WRECGenerator.cpp: (JSC::WREC::Generator::generateEnter): (JSC::WREC::Generator::generateReturnSuccess): (JSC::WREC::Generator::generateReturnFailure):
  • wtf/Platform.h:
  • wtf/TCSystemAlloc.cpp:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/assembler/MacroAssembler.h

    r38854 r38857  
    255255    // object).
    256256
     257    void addPtr(Imm32 imm, RegisterID dest)
     258    {
     259#if PLATFORM(X86_64)
     260        if (CAN_SIGN_EXTEND_8_32(imm.m_value))
     261            m_assembler.addq_i8r(imm.m_value, dest);
     262        else
     263            m_assembler.addq_i32r(imm.m_value, dest);
     264#else
     265        if (CAN_SIGN_EXTEND_8_32(imm.m_value))
     266            m_assembler.addl_i8r(imm.m_value, dest);
     267        else
     268            m_assembler.addl_i32r(imm.m_value, dest);
     269#endif
     270    }
     271
    257272    void add32(Imm32 imm, RegisterID dest)
    258273    {
     
    296311    void loadPtr(ImplicitAddress address, RegisterID dest)
    297312    {
     313#if PLATFORM(X86_64)
     314        if (address.offset)
     315            m_assembler.movq_mr(address.offset, address.base, dest);
     316        else
     317            m_assembler.movq_mr(address.base, dest);
     318#else
    298319        if (address.offset)
    299320            m_assembler.movl_mr(address.offset, address.base, dest);
    300321        else
    301322            m_assembler.movl_mr(address.base, dest);
     323#endif
    302324    }
    303325
     
    320342    void storePtr(RegisterID src, ImplicitAddress address)
    321343    {
     344#if PLATFORM(X86_64)
     345        if (address.offset)
     346            m_assembler.movq_rm(src, address.offset, address.base);
     347        else
     348            m_assembler.movq_rm(src, address.base);
     349#else
    322350        if (address.offset)
    323351            m_assembler.movl_rm(src, address.offset, address.base);
    324352        else
    325353            m_assembler.movl_rm(src, address.base);
     354#endif
    326355    }
    327356   
     
    351380    void pop(RegisterID dest)
    352381    {
     382#if PLATFORM(X86_64)
     383        m_assembler.popq_r(dest);
     384#else
    353385        m_assembler.popl_r(dest);
     386#endif
    354387    }
    355388
    356389    void push(RegisterID src)
    357390    {
     391#if PLATFORM(X86_64)
     392        m_assembler.pushq_r(src);
     393#else
    358394        m_assembler.pushl_r(src);
     395#endif
    359396    }
    360397
    361398    void pop()
    362399    {
    363         m_assembler.addl_i8r(sizeof(void*), X86::esp);
     400        addPtr(Imm32(sizeof(void*)), X86::esp);
    364401    }
    365402   
     
    381418    void move(Imm32 imm, RegisterID dest)
    382419    {
     420        // Note: on 64-bit the Imm32 value is zero extended into the register, it
     421        // may be useful to have a separate version that sign extends the value?
    383422        if (!imm.m_value)
    384423            m_assembler.xorl_rr(dest, dest);
    385424        else
    386425            m_assembler.movl_i32r(imm.m_value, dest);
     426    }
     427
     428    void move(RegisterID src, RegisterID dest)
     429    {
     430        // Note: on 64-bit this is is a full register move; perhaps it would be
     431        // useful to have separate move32 & movePtr, with move32 zero extending?
     432#if PLATFORM(X86_64)
     433        m_assembler.movq_rr(src, dest);
     434#else
     435        m_assembler.movl_rr(src, dest);
     436#endif
    387437    }
    388438
Note: See TracChangeset for help on using the changeset viewer.