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/JITPropertyAccess.cpp

    r39284 r39316  
    108108    m_propertyAccessCompilationInfo[propertyAccessInstructionIndex].hotPathBegin = hotPathBegin;
    109109
    110     __ cmpl_i32m(repatchGetByIdDefaultStructure, FIELD_OFFSET(JSCell, m_structure), X86::eax);
     110    __ cmpl_im_force32(repatchGetByIdDefaultStructure, FIELD_OFFSET(JSCell, m_structure), X86::eax);
    111111    ASSERT(X86Assembler::getDifferenceBetweenLabels(hotPathBegin, __ label()) == repatchOffsetGetByIdStructure);
    112112    addSlowCase(__ jne());
     
    159159
    160160    // It is important that the following instruction plants a 32bit immediate, in order that it can be patched over.
    161     __ cmpl_i32m(repatchGetByIdDefaultStructure, FIELD_OFFSET(JSCell, m_structure), X86::eax);
     161    __ cmpl_im_force32(repatchGetByIdDefaultStructure, FIELD_OFFSET(JSCell, m_structure), X86::eax);
    162162    ASSERT(X86Assembler::getDifferenceBetweenLabels(hotPathBegin, __ label()) == repatchOffsetPutByIdStructure);
    163163    addSlowCase(__ jne());
     
    202202    __ testl_i32r(JSImmediate::TagMask, X86::eax);
    203203    failureCases.append(__ jne());
    204     __ cmpl_i32m(reinterpret_cast<uint32_t>(oldStructure), FIELD_OFFSET(JSCell, m_structure), X86::eax);
     204    __ cmpl_im(reinterpret_cast<uint32_t>(oldStructure), FIELD_OFFSET(JSCell, m_structure), X86::eax);
    205205    failureCases.append(__ jne());
    206206    Vector<JmpSrc> successCases;
     
    209209    __ movl_mr(FIELD_OFFSET(JSCell, m_structure), X86::eax, X86::ecx);
    210210    // proto(ecx) = baseObject->structure()->prototype()
    211     __ cmpl_i32m(ObjectType, FIELD_OFFSET(Structure, m_typeInfo) + FIELD_OFFSET(TypeInfo, m_type), X86::ecx);
     211    __ cmpl_im(ObjectType, FIELD_OFFSET(Structure, m_typeInfo) + FIELD_OFFSET(TypeInfo, m_type), X86::ecx);
    212212    failureCases.append(__ jne());
    213213    __ movl_mr(FIELD_OFFSET(Structure, m_prototype), X86::ecx, X86::ecx);
     
    216216    for (RefPtr<Structure>* it = chain->head(); *it; ++it) {
    217217        // null check the prototype
    218         __ cmpl_i32r(asInteger(jsNull()), X86::ecx);
     218        __ cmpl_ir(asInteger(jsNull()), X86::ecx);
    219219        successCases.append(__ je());
    220220
    221221        // Check the structure id
    222         __ cmpl_i32m(reinterpret_cast<uint32_t>(it->get()), FIELD_OFFSET(JSCell, m_structure), X86::ecx);
     222        __ cmpl_im(reinterpret_cast<uint32_t>(it->get()), FIELD_OFFSET(JSCell, m_structure), X86::ecx);
    223223        failureCases.append(__ jne());
    224224       
    225225        __ movl_mr(FIELD_OFFSET(JSCell, m_structure), X86::ecx, X86::ecx);
    226         __ cmpl_i32m(ObjectType, FIELD_OFFSET(Structure, m_typeInfo) + FIELD_OFFSET(TypeInfo, m_type), X86::ecx);
     226        __ cmpl_im(ObjectType, FIELD_OFFSET(Structure, m_typeInfo) + FIELD_OFFSET(TypeInfo, m_type), X86::ecx);
    227227        failureCases.append(__ jne());
    228228        __ movl_mr(FIELD_OFFSET(Structure, m_prototype), X86::ecx, X86::ecx);
     
    237237    // emit a call only if storage realloc is needed
    238238    if (transitionWillNeedStorageRealloc(oldStructure, newStructure)) {
    239         __ pushl_r(X86::edx);
    240         __ pushl_i32(newStructure->propertyStorageCapacity());
    241         __ pushl_i32(oldStructure->propertyStorageCapacity());
    242         __ pushl_r(X86::eax);
     239        __ push_r(X86::edx);
     240        __ push_i32(newStructure->propertyStorageCapacity());
     241        __ push_i32(oldStructure->propertyStorageCapacity());
     242        __ push_r(X86::eax);
    243243        callTarget = __ call();
    244         __ addl_i32r(3 * sizeof(void*), X86::esp);
    245         __ popl_r(X86::edx);
     244        __ addl_ir(3 * sizeof(void*), X86::esp);
     245        __ pop_r(X86::edx);
    246246    }
    247247
    248248    // Assumes m_refCount can be decremented easily, refcount decrement is safe as
    249249    // codeblock should ensure oldStructure->m_refCount > 0
    250     __ subl_i8m(1, reinterpret_cast<void*>(oldStructure));
    251     __ addl_i8m(1, reinterpret_cast<void*>(newStructure));
     250    __ subl_im(1, reinterpret_cast<void*>(oldStructure));
     251    __ addl_im(1, reinterpret_cast<void*>(newStructure));
    252252    __ movl_i32m(reinterpret_cast<uint32_t>(newStructure), FIELD_OFFSET(JSCell, m_structure), X86::eax);
    253253
     
    308308
    309309    // Check eax is an array
    310     __ cmpl_i32m(reinterpret_cast<unsigned>(m_interpreter->m_jsArrayVptr), X86::eax);
     310    __ cmpl_im(reinterpret_cast<unsigned>(m_interpreter->m_jsArrayVptr), 0, X86::eax);
    311311    JmpSrc failureCases1 = __ jne();
    312312
     
    315315    __ movl_mr(FIELD_OFFSET(ArrayStorage, m_length), X86::ecx, X86::ecx);
    316316
    317     __ cmpl_i32r(JSImmediate::maxImmediateInt, X86::ecx);
     317    __ cmpl_ir(JSImmediate::maxImmediateInt, X86::ecx);
    318318    JmpSrc failureCases2 = __ ja();
    319319
    320320    __ addl_rr(X86::ecx, X86::ecx);
    321     __ addl_i8r(1, X86::ecx);
     321    __ addl_ir(1, X86::ecx);
    322322    __ movl_rr(X86::ecx, X86::eax);
    323323    JmpSrc success = __ jmp();
     
    381381    // Check the prototype object's Structure had not changed.
    382382    Structure** prototypeStructureAddress = &(protoObject->m_structure);
    383     __ cmpl_i32m(reinterpret_cast<uint32_t>(prototypeStructure), prototypeStructureAddress);
     383    __ cmpl_im(reinterpret_cast<uint32_t>(prototypeStructure), prototypeStructureAddress);
    384384    JmpSrc failureCases2 = __ jne();
    385385
     
    420420    // Check the prototype object's Structure had not changed.
    421421    Structure** prototypeStructureAddress = &(protoObject->m_structure);
    422     __ cmpl_i32m(reinterpret_cast<uint32_t>(prototypeStructure), prototypeStructureAddress);
     422    __ cmpl_im(reinterpret_cast<uint32_t>(prototypeStructure), prototypeStructureAddress);
    423423    JmpSrc failureCases3 = __ jne();
    424424
     
    483483    // Check the prototype object's Structure had not changed.
    484484    Structure** prototypeStructureAddress = &(protoObject->m_structure);
    485     __ cmpl_i32m(reinterpret_cast<uint32_t>(prototypeStructure), prototypeStructureAddress);
     485    __ cmpl_im(reinterpret_cast<uint32_t>(prototypeStructure), prototypeStructureAddress);
    486486    JmpSrc failureCases2 = __ jne();
    487487
     
    530530        // Check the prototype object's Structure had not changed.
    531531        Structure** prototypeStructureAddress = &(protoObject->m_structure);
    532         __ cmpl_i32m(reinterpret_cast<uint32_t>(currStructure), prototypeStructureAddress);
     532        __ cmpl_im(reinterpret_cast<uint32_t>(currStructure), prototypeStructureAddress);
    533533        bucketsOfFail.append(__ jne());
    534534    }
     
    586586        // Check the prototype object's Structure had not changed.
    587587        Structure** prototypeStructureAddress = &(protoObject->m_structure);
    588         __ cmpl_i32m(reinterpret_cast<uint32_t>(currStructure), prototypeStructureAddress);
     588        __ cmpl_im(reinterpret_cast<uint32_t>(currStructure), prototypeStructureAddress);
    589589        bucketsOfFail.append(__ jne());
    590590    }
     
    633633        // Check the prototype object's Structure had not changed.
    634634        Structure** prototypeStructureAddress = &(protoObject->m_structure);
    635         __ cmpl_i32m(reinterpret_cast<uint32_t>(currStructure), prototypeStructureAddress);
     635        __ cmpl_im(reinterpret_cast<uint32_t>(currStructure), prototypeStructureAddress);
    636636        bucketsOfFail.append(__ jne());
    637637    }
Note: See TracChangeset for help on using the changeset viewer.