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/X86Assembler.h

    r38839 r38857  
    2929#include <wtf/Platform.h>
    3030
    31 #if ENABLE(ASSEMBLER) && PLATFORM(X86)
     31#if ENABLE(ASSEMBLER) && (PLATFORM(X86) || PLATFORM(X86_64))
    3232
    3333#include "AssemblerBuffer.h"
     
    8888        OP_CMP_EvGv                     = 0x39,
    8989        OP_CMP_GvEv                     = 0x3B,
     90        REX_W                           = 0x48,
    9091        OP_PUSH_EAX                     = 0x50,
    9192        OP_POP_EAX                      = 0x58,
     
    218219    }
    219220   
     221#if PLATFORM(X86_64)
     222    void pushq_r(RegisterID reg)
     223    {
     224        m_buffer->putByte(OP_PUSH_EAX + reg);
     225    }
     226
     227    void popq_r(RegisterID reg)
     228    {
     229        m_buffer->putByte(OP_POP_EAX + reg);
     230    }
     231#else
    220232    void pushl_r(RegisterID reg)
    221233    {
     
    245257        modRm_opm(GROUP1A_OP_POP, base, offset);
    246258    }
     259#endif
    247260   
    248261    void movl_rr(RegisterID src, RegisterID dst)
     
    252265    }
    253266   
     267#if PLATFORM(X86_64)
     268    void movq_rr(RegisterID src, RegisterID dst)
     269    {
     270        m_buffer->putByte(REX_W);
     271        m_buffer->putByte(OP_MOV_EvGv);
     272        modRm_rr(src, dst);
     273    }
     274#endif
     275
    254276    void addl_rr(RegisterID src, RegisterID dst)
    255277    {
     
    257279        modRm_rr(src, dst);
    258280    }
     281
     282#if !PLATFORM(X86_64)
     283    void addl_i8m(int imm, void* addr)
     284    {
     285        m_buffer->putByte(OP_GROUP1_EvIb);
     286        modRm_opm(GROUP1_OP_ADD, addr);
     287        m_buffer->putByte(imm);
     288    }
     289#endif
    259290
    260291    void addl_i8r(int imm, RegisterID dst)
     
    265296    }
    266297
    267     void addl_i8m(int imm, void* addr)
    268     {
    269         m_buffer->putByte(OP_GROUP1_EvIb);
    270         modRm_opm(GROUP1_OP_ADD, addr);
    271         m_buffer->putByte(imm);
    272     }
    273 
    274298    void addl_i32r(int imm, RegisterID dst)
    275299    {
     
    279303    }
    280304
     305#if PLATFORM(X86_64)
     306    void addq_i8r(int imm, RegisterID dst)
     307    {
     308        m_buffer->putByte(REX_W);
     309        m_buffer->putByte(OP_GROUP1_EvIb);
     310        modRm_opr(GROUP1_OP_ADD, dst);
     311        m_buffer->putByte(imm);
     312    }
     313
     314    void addq_i32r(int imm, RegisterID dst)
     315    {
     316        m_buffer->putByte(REX_W);
     317        m_buffer->putByte(OP_GROUP1_EvIz);
     318        modRm_opr(GROUP1_OP_ADD, dst);
     319        m_buffer->putInt(imm);
     320    }
     321#endif
     322
    281323    void addl_mr(int offset, RegisterID base, RegisterID dst)
    282324    {
     
    344386    }
    345387
     388#if !PLATFORM(X86_64)
    346389    void cmpl_i32m(int imm, void* addr)
    347390    {
     
    350393        m_buffer->putInt(imm);
    351394    }
     395#endif
    352396
    353397    void cmpl_i8m(int imm, int offset, RegisterID base, RegisterID index, int scale)
     
    428472    }
    429473   
     474#if !PLATFORM(X86_64)
    430475    void subl_i8m(int imm, void* addr)
    431476    {
     
    434479        m_buffer->putByte(imm);
    435480    }
     481#endif
    436482
    437483    void subl_i32r(int imm, RegisterID dst)
     
    569615    }
    570616
     617#if PLATFORM(X86_64)
     618    void movq_mr(RegisterID base, RegisterID dst)
     619    {
     620        m_buffer->putByte(REX_W);
     621        m_buffer->putByte(OP_MOV_GvEv);
     622        modRm_rm(dst, base);
     623    }
     624
     625    void movq_mr(int offset, RegisterID base, RegisterID dst)
     626    {
     627        m_buffer->ensureSpace(maxInstructionSize);
     628        m_buffer->putByteUnchecked(REX_W);
     629        m_buffer->putByteUnchecked(OP_MOV_GvEv);
     630        modRm_rm_Unchecked(dst, base, offset);
     631    }
     632#endif
     633
     634#if !PLATFORM(X86_64)
    571635    void movl_mr(void* addr, RegisterID dst)
    572636    {
     
    574638        modRm_rm(dst, addr);
    575639    }
     640#endif
    576641
    577642    void movl_mr(int offset, RegisterID base, RegisterID index, int scale, RegisterID dst)
     
    621686        modRm_rm_Unchecked(src, base, offset);
    622687    }
    623    
     688
     689#if PLATFORM(X86_64)
     690    void movq_rm(RegisterID src, RegisterID base)
     691    {
     692        m_buffer->putByte(REX_W);
     693        m_buffer->putByte(OP_MOV_EvGv);
     694        modRm_rm(src, base);
     695    }
     696
     697    void movq_rm(RegisterID src, int offset, RegisterID base)
     698    {
     699        m_buffer->ensureSpace(maxInstructionSize);
     700        m_buffer->putByteUnchecked(REX_W);
     701        m_buffer->putByteUnchecked(OP_MOV_EvGv);
     702        modRm_rm_Unchecked(src, base, offset);
     703    }
     704#endif
     705
    624706    void movl_rm(RegisterID src, int offset, RegisterID base, RegisterID index, int scale)
    625707    {
     
    643725    }
    644726
     727#if !PLATFORM(X86_64)
    645728    void movl_i32m(int imm, void* addr)
    646729    {
     
    649732        m_buffer->putInt(imm);
    650733    }
     734#endif
    651735
    652736    void leal_mr(int offset, RegisterID base, RegisterID dst)
     
    687771    }
    688772
     773#if !PLATFORM(X86_64)
    689774    void xorpd_mr(void* addr, XMMRegisterID dst)
    690775    {
     
    694779        modRm_rm((RegisterID)dst, addr);
    695780    }
     781#endif
    696782
    697783    void movsd_rm(XMMRegisterID src, int offset, RegisterID base)
     
    10451131    }
    10461132
     1133#if !PLATFORM(X86_64)
    10471134    void modRm_rm(RegisterID reg, void* addr)
    10481135    {
     
    10501137        m_buffer->putInt((int)addr);
    10511138    }
     1139#endif
    10521140
    10531141    void modRm_rm(RegisterID reg, RegisterID base)
     
    11421230    }
    11431231
     1232#if !PLATFORM(X86_64)
    11441233    void modRm_opm(OpcodeID opcodeID, void* addr)
    11451234    {
    11461235        modRm_rm(static_cast<RegisterID>(opcodeID), addr);
    11471236    }
     1237#endif
    11481238
    11491239    void modRm_opmsib(OpcodeID opcodeID, RegisterID base, RegisterID index, int scale, int offset)
Note: See TracChangeset for help on using the changeset viewer.