Changeset 39316 in webkit for trunk/JavaScriptCore/jit/JIT.cpp


Ignore:
Timestamp:
Dec 15, 2008, 3:38:19 PM (16 years ago)
Author:
[email protected]
Message:

2008-12-15 Gavin Barraclough <[email protected]>

Reviewed by Geoff Garen.

Add support to X86Assembler emitting instructions that access all 16 registers on x86-64.
Add a new formating class, that is reponsible for both emitting the opcode bytes and the
ModRm bytes of an instruction in a single call; this can insert the REX byte as necessary
before the opcode, but has access to the register numbers to build the REX.

  • assembler/AssemblerBuffer.h: (JSC::AssemblerBuffer::isAligned): (JSC::AssemblerBuffer::data):
  • assembler/MacroAssembler.h: (JSC::MacroAssembler::addPtr): (JSC::MacroAssembler::add32): (JSC::MacroAssembler::and32): (JSC::MacroAssembler::or32): (JSC::MacroAssembler::sub32): (JSC::MacroAssembler::xor32): (JSC::MacroAssembler::loadPtr): (JSC::MacroAssembler::load32): (JSC::MacroAssembler::load16): (JSC::MacroAssembler::storePtr): (JSC::MacroAssembler::storePtrWithRepatch): (JSC::MacroAssembler::store32): (JSC::MacroAssembler::pop): (JSC::MacroAssembler::push): (JSC::MacroAssembler::compareImm32ForBranch): (JSC::MacroAssembler::compareImm32ForBranchEquality): (JSC::MacroAssembler::testImm32): (JSC::MacroAssembler::jae32): (JSC::MacroAssembler::jb32): (JSC::MacroAssembler::je16): (JSC::MacroAssembler::jg32): (JSC::MacroAssembler::jnePtr): (JSC::MacroAssembler::jne32): (JSC::MacroAssembler::jump):
  • assembler/X86Assembler.h: (JSC::X86::): (JSC::X86Assembler::): (JSC::X86Assembler::size): (JSC::X86Assembler::push_r): (JSC::X86Assembler::pop_r): (JSC::X86Assembler::push_i32): (JSC::X86Assembler::push_m): (JSC::X86Assembler::pop_m): (JSC::X86Assembler::addl_rr): (JSC::X86Assembler::addl_mr): (JSC::X86Assembler::addl_ir): (JSC::X86Assembler::addq_ir): (JSC::X86Assembler::addl_im): (JSC::X86Assembler::andl_rr): (JSC::X86Assembler::andl_ir): (JSC::X86Assembler::orl_rr): (JSC::X86Assembler::orl_mr): (JSC::X86Assembler::orl_ir): (JSC::X86Assembler::subl_rr): (JSC::X86Assembler::subl_mr): (JSC::X86Assembler::subl_ir): (JSC::X86Assembler::subl_im): (JSC::X86Assembler::xorl_rr): (JSC::X86Assembler::xorl_ir): (JSC::X86Assembler::sarl_i8r): (JSC::X86Assembler::sarl_CLr): (JSC::X86Assembler::shll_i8r): (JSC::X86Assembler::shll_CLr): (JSC::X86Assembler::imull_rr): (JSC::X86Assembler::imull_i32r): (JSC::X86Assembler::idivl_r): (JSC::X86Assembler::cmpl_rr): (JSC::X86Assembler::cmpl_rm): (JSC::X86Assembler::cmpl_mr): (JSC::X86Assembler::cmpl_ir): (JSC::X86Assembler::cmpl_ir_force32): (JSC::X86Assembler::cmpl_im): (JSC::X86Assembler::cmpl_im_force32): (JSC::X86Assembler::cmpw_rm): (JSC::X86Assembler::testl_rr): (JSC::X86Assembler::testl_i32r): (JSC::X86Assembler::testl_i32m): (JSC::X86Assembler::testq_rr): (JSC::X86Assembler::testq_i32r): (JSC::X86Assembler::testb_i8r): (JSC::X86Assembler::sete_r): (JSC::X86Assembler::setz_r): (JSC::X86Assembler::setne_r): (JSC::X86Assembler::setnz_r): (JSC::X86Assembler::cdq): (JSC::X86Assembler::xchgl_rr): (JSC::X86Assembler::movl_rr): (JSC::X86Assembler::movl_rm): (JSC::X86Assembler::movl_mr): (JSC::X86Assembler::movl_i32r): (JSC::X86Assembler::movl_i32m): (JSC::X86Assembler::movq_rr): (JSC::X86Assembler::movq_rm): (JSC::X86Assembler::movq_mr): (JSC::X86Assembler::movzwl_mr): (JSC::X86Assembler::movzbl_rr): (JSC::X86Assembler::leal_mr): (JSC::X86Assembler::call): (JSC::X86Assembler::jmp): (JSC::X86Assembler::jmp_r): (JSC::X86Assembler::jmp_m): (JSC::X86Assembler::jne): (JSC::X86Assembler::jnz): (JSC::X86Assembler::je): (JSC::X86Assembler::jl): (JSC::X86Assembler::jb): (JSC::X86Assembler::jle): (JSC::X86Assembler::jbe): (JSC::X86Assembler::jge): (JSC::X86Assembler::jg): (JSC::X86Assembler::ja): (JSC::X86Assembler::jae): (JSC::X86Assembler::jo): (JSC::X86Assembler::jp): (JSC::X86Assembler::js): (JSC::X86Assembler::addsd_rr): (JSC::X86Assembler::addsd_mr): (JSC::X86Assembler::cvtsi2sd_rr): (JSC::X86Assembler::cvttsd2si_rr): (JSC::X86Assembler::movd_rr): (JSC::X86Assembler::movsd_rm): (JSC::X86Assembler::movsd_mr): (JSC::X86Assembler::mulsd_rr): (JSC::X86Assembler::mulsd_mr): (JSC::X86Assembler::pextrw_irr): (JSC::X86Assembler::subsd_rr): (JSC::X86Assembler::subsd_mr): (JSC::X86Assembler::ucomis_rr): (JSC::X86Assembler::int3): (JSC::X86Assembler::ret): (JSC::X86Assembler::predictNotTaken): (JSC::X86Assembler::label): (JSC::X86Assembler::align): (JSC::X86Assembler::link): (JSC::X86Assembler::executableCopy): (JSC::X86Assembler::X86InstructionFormater::prefix): (JSC::X86Assembler::X86InstructionFormater::oneByteOp): (JSC::X86Assembler::X86InstructionFormater::twoByteOp): (JSC::X86Assembler::X86InstructionFormater::oneByteOp64): (JSC::X86Assembler::X86InstructionFormater::oneByteOp8): (JSC::X86Assembler::X86InstructionFormater::twoByteOp8): (JSC::X86Assembler::X86InstructionFormater::instructionImmediate8): (JSC::X86Assembler::X86InstructionFormater::instructionImmediate32): (JSC::X86Assembler::X86InstructionFormater::instructionRel32): (JSC::X86Assembler::X86InstructionFormater::size): (JSC::X86Assembler::X86InstructionFormater::isAligned): (JSC::X86Assembler::X86InstructionFormater::data): (JSC::X86Assembler::X86InstructionFormater::executableCopy): (JSC::X86Assembler::X86InstructionFormater::registerModRM): (JSC::X86Assembler::X86InstructionFormater::memoryModRM):
  • jit/JIT.cpp: (JSC::JIT::privateCompileMainPass): (JSC::JIT::privateCompile): (JSC::JIT::privateCompileCTIMachineTrampolines):
  • jit/JITArithmetic.cpp: (JSC::JIT::putDoubleResultToJSNumberCellOrJSImmediate): (JSC::JIT::compileBinaryArithOp):
  • jit/JITCall.cpp: (JSC::JIT::compileOpCall): (JSC::JIT::compileOpCallSlowCase):
  • jit/JITPropertyAccess.cpp: (JSC::JIT::compileGetByIdHotPath): (JSC::JIT::compilePutByIdHotPath): (JSC::JIT::privateCompilePutByIdTransition): (JSC::JIT::privateCompilePatchGetArrayLength): (JSC::JIT::privateCompileGetByIdProto): (JSC::JIT::privateCompileGetByIdProtoList): (JSC::JIT::privateCompileGetByIdChainList): (JSC::JIT::privateCompileGetByIdChain):
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/jit/JIT.cpp

    r39284 r39316  
    280280                emitCTICall(Interpreter::cti_op_end);
    281281            emitGetVirtualRegister(currentInstruction[1].u.operand, X86::eax);
    282             __ pushl_m(RegisterFile::ReturnPC * static_cast<int>(sizeof(Register)), callFrameRegister);
     282            __ push_m(RegisterFile::ReturnPC * static_cast<int>(sizeof(Register)), callFrameRegister);
    283283            __ ret();
    284284            NEXT_OPCODE(op_end);
     
    519519
    520520            // Return.
    521             __ pushl_r(X86::edx);
     521            __ push_r(X86::edx);
    522522            __ ret();
    523523
     
    933933            emitPutJITStubArgFromVirtualRegister(currentInstruction[1].u.operand, 1, X86::ecx);
    934934            emitCTICall(Interpreter::cti_op_throw);
    935             __ addl_i8r(0x20, X86::esp);
    936             __ popl_r(X86::ebx);
    937             __ popl_r(X86::edi);
    938             __ popl_r(X86::esi);
     935            __ addl_ir(0x20, X86::esp);
     936            __ pop_r(X86::ebx);
     937            __ pop_r(X86::edi);
     938            __ pop_r(X86::esi);
    939939            __ ret();
    940940            NEXT_OPCODE(op_throw);
     
    17241724#endif
    17251725
    1726     // Could use a popl_m, but would need to offset the following instruction if so.
    1727     __ popl_r(X86::ecx);
     1726    // Could use a pop_m, but would need to offset the following instruction if so.
     1727    __ pop_r(X86::ecx);
    17281728    emitPutToCallFrameHeader(X86::ecx, RegisterFile::ReturnPC);
    17291729
     
    18301830    // Check eax is an array
    18311831    X86Assembler::JmpSrc array_failureCases1 = emitJumpIfNotJSCell(X86::eax);
    1832     __ cmpl_i32m(reinterpret_cast<unsigned>(m_interpreter->m_jsArrayVptr), X86::eax);
     1832    __ cmpl_im(reinterpret_cast<unsigned>(m_interpreter->m_jsArrayVptr), 0, X86::eax);
    18331833    X86Assembler::JmpSrc array_failureCases2 = __ jne();
    18341834
     
    18371837    __ movl_mr(FIELD_OFFSET(ArrayStorage, m_length), X86::eax, X86::eax);
    18381838
    1839     __ cmpl_i32r(JSImmediate::maxImmediateInt, X86::eax);
     1839    __ cmpl_ir(JSImmediate::maxImmediateInt, X86::eax);
    18401840    X86Assembler::JmpSrc array_failureCases3 = __ ja();
    18411841
    18421842    __ addl_rr(X86::eax, X86::eax);
    1843     __ addl_i8r(1, X86::eax);
     1843    __ addl_ir(1, X86::eax);
    18441844   
    18451845    __ ret();
     
    18511851    // Check eax is a string
    18521852    X86Assembler::JmpSrc string_failureCases1 = emitJumpIfNotJSCell(X86::eax);
    1853     __ cmpl_i32m(reinterpret_cast<unsigned>(m_interpreter->m_jsStringVptr), X86::eax);
     1853    __ cmpl_im(reinterpret_cast<unsigned>(m_interpreter->m_jsStringVptr), 0, X86::eax);
    18541854    X86Assembler::JmpSrc string_failureCases2 = __ jne();
    18551855
     
    18581858    __ movl_mr(FIELD_OFFSET(UString::Rep, len), X86::eax, X86::eax);
    18591859
    1860     __ cmpl_i32r(JSImmediate::maxImmediateInt, X86::eax);
     1860    __ cmpl_ir(JSImmediate::maxImmediateInt, X86::eax);
    18611861    X86Assembler::JmpSrc string_failureCases3 = __ ja();
    18621862
    18631863    __ addl_rr(X86::eax, X86::eax);
    1864     __ addl_i8r(1, X86::eax);
     1864    __ addl_ir(1, X86::eax);
    18651865   
    18661866    __ ret();
     
    18751875    __ testl_rr(X86::eax, X86::eax);
    18761876    X86Assembler::JmpSrc hasCodeBlock1 = __ jne();
    1877     __ popl_r(X86::ebx);
     1877    __ pop_r(X86::ebx);
    18781878    emitPutCTIParam(callFrameRegister, CTI_ARGS_callFrame);
    18791879    X86Assembler::JmpSrc callJSFunction1 = __ call();
    18801880    emitGetJITStubArg(1, X86::ecx);
    18811881    emitGetJITStubArg(3, X86::edx);
    1882     __ pushl_r(X86::ebx);
     1882    __ push_r(X86::ebx);
    18831883    __ link(hasCodeBlock1, __ label());
    18841884
     
    18861886    __ cmpl_rm(X86::edx, FIELD_OFFSET(CodeBlock, m_numParameters), X86::eax);
    18871887    X86Assembler::JmpSrc arityCheckOkay1 = __ je();
    1888     __ popl_r(X86::ebx);
     1888    __ pop_r(X86::ebx);
    18891889    emitPutJITStubArg(X86::ebx, 2);
    18901890    emitPutJITStubArg(X86::eax, 4);
     
    18941894    emitGetJITStubArg(1, X86::ecx);
    18951895    emitGetJITStubArg(3, X86::edx);
    1896     __ pushl_r(X86::ebx);
     1896    __ push_r(X86::ebx);
    18971897    __ link(arityCheckOkay1, __ label());
    18981898
    18991899    compileOpCallInitializeCallFrame();
    19001900
    1901     __ popl_r(X86::ebx);
     1901    __ pop_r(X86::ebx);
    19021902    emitPutJITStubArg(X86::ebx, 2);
    19031903    emitPutCTIParam(callFrameRegister, CTI_ARGS_callFrame);
    19041904    X86Assembler::JmpSrc callDontLazyLinkCall = __ call();
    1905     __ pushl_r(X86::ebx);
     1905    __ push_r(X86::ebx);
    19061906
    19071907    __ jmp_r(X86::eax);
     
    19141914    __ testl_rr(X86::eax, X86::eax);
    19151915    X86Assembler::JmpSrc hasCodeBlock2 = __ jne();
    1916     __ popl_r(X86::ebx);
     1916    __ pop_r(X86::ebx);
    19171917    emitPutCTIParam(callFrameRegister, CTI_ARGS_callFrame);
    19181918    X86Assembler::JmpSrc callJSFunction2 = __ call();
    19191919    emitGetJITStubArg(1, X86::ecx);
    19201920    emitGetJITStubArg(3, X86::edx);
    1921     __ pushl_r(X86::ebx);
     1921    __ push_r(X86::ebx);
    19221922    __ link(hasCodeBlock2, __ label());
    19231923
     
    19251925    __ cmpl_rm(X86::edx, FIELD_OFFSET(CodeBlock, m_numParameters), X86::eax);
    19261926    X86Assembler::JmpSrc arityCheckOkay2 = __ je();
    1927     __ popl_r(X86::ebx);
     1927    __ pop_r(X86::ebx);
    19281928    emitPutJITStubArg(X86::ebx, 2);
    19291929    emitPutJITStubArg(X86::eax, 4);
     
    19331933    emitGetJITStubArg(1, X86::ecx);
    19341934    emitGetJITStubArg(3, X86::edx);
    1935     __ pushl_r(X86::ebx);
     1935    __ push_r(X86::ebx);
    19361936    __ link(arityCheckOkay2, __ label());
    19371937
    19381938    compileOpCallInitializeCallFrame();
    19391939
    1940     __ popl_r(X86::ebx);
     1940    __ pop_r(X86::ebx);
    19411941    emitPutJITStubArg(X86::ebx, 2);
    19421942    emitPutCTIParam(callFrameRegister, CTI_ARGS_callFrame);
    19431943    X86Assembler::JmpSrc callLazyLinkCall = __ call();
    1944     __ pushl_r(X86::ebx);
     1944    __ push_r(X86::ebx);
    19451945
    19461946    __ jmp_r(X86::eax);
     
    19531953    __ testl_rr(X86::eax, X86::eax);
    19541954    X86Assembler::JmpSrc hasCodeBlock3 = __ jne();
    1955     __ popl_r(X86::ebx);
     1955    __ pop_r(X86::ebx);
    19561956    emitPutCTIParam(callFrameRegister, CTI_ARGS_callFrame);
    19571957    X86Assembler::JmpSrc callJSFunction3 = __ call();
    19581958    emitGetJITStubArg(1, X86::ecx);
    19591959    emitGetJITStubArg(3, X86::edx);
    1960     __ pushl_r(X86::ebx);
     1960    __ push_r(X86::ebx);
    19611961    __ link(hasCodeBlock3, __ label());
    19621962
     
    19641964    __ cmpl_rm(X86::edx, FIELD_OFFSET(CodeBlock, m_numParameters), X86::eax);
    19651965    X86Assembler::JmpSrc arityCheckOkay3 = __ je();
    1966     __ popl_r(X86::ebx);
     1966    __ pop_r(X86::ebx);
    19671967    emitPutJITStubArg(X86::ebx, 2);
    19681968    emitPutJITStubArg(X86::eax, 4);
     
    19721972    emitGetJITStubArg(1, X86::ecx);
    19731973    emitGetJITStubArg(3, X86::edx);
    1974     __ pushl_r(X86::ebx);
     1974    __ push_r(X86::ebx);
    19751975    __ link(arityCheckOkay3, __ label());
    19761976
Note: See TracChangeset for help on using the changeset viewer.