diff options
Diffstat (limited to 'JavaScriptCore/assembler')
-rw-r--r-- | JavaScriptCore/assembler/ARMAssembler.h | 31 | ||||
-rw-r--r-- | JavaScriptCore/assembler/ARMv7Assembler.h | 8 | ||||
-rw-r--r-- | JavaScriptCore/assembler/MacroAssemblerARM.h | 24 | ||||
-rw-r--r-- | JavaScriptCore/assembler/MacroAssemblerARMv7.h | 17 |
4 files changed, 62 insertions, 18 deletions
diff --git a/JavaScriptCore/assembler/ARMAssembler.h b/JavaScriptCore/assembler/ARMAssembler.h index 900f655..1d24dd3 100644 --- a/JavaScriptCore/assembler/ARMAssembler.h +++ b/JavaScriptCore/assembler/ARMAssembler.h @@ -624,16 +624,14 @@ namespace JSC { JmpSrc blx(int rm, Condition cc = AL) { #if WTF_ARM_ARCH_AT_LEAST(5) - int s = m_buffer.uncheckedSize(); emitInst(static_cast<ARMWord>(cc) | BLX, 0, 0, RM(rm)); #else ASSERT(rm != 14); ensureSpace(2 * sizeof(ARMWord), 0); mov_r(ARMRegisters::lr, ARMRegisters::pc, cc); - int s = m_buffer.uncheckedSize(); bx(rm, cc); #endif - return JmpSrc(s); + return JmpSrc(m_buffer.uncheckedSize()); } static ARMWord lsl(int reg, ARMWord value) @@ -711,10 +709,9 @@ namespace JSC { JmpSrc loadBranchTarget(int rd, Condition cc = AL, int useConstantPool = 0) { ensureSpace(sizeof(ARMWord), sizeof(ARMWord)); - int s = m_buffer.uncheckedSize(); + m_jumps.append(m_buffer.uncheckedSize() | (useConstantPool & 0x1)); ldr_un_imm(rd, InvalidBranchTarget, cc); - m_jumps.append(s | (useConstantPool & 0x1)); - return JmpSrc(s); + return JmpSrc(m_buffer.uncheckedSize()); } JmpSrc jmp(Condition cc = AL, int useConstantPool = 0) @@ -800,51 +797,55 @@ namespace JSC { } // Linkers + static intptr_t getAbsoluteJumpAddress(void* base, int offset = 0) + { + return reinterpret_cast<intptr_t>(base) + offset - sizeof(ARMWord); + } void linkJump(JmpSrc from, JmpDst to) { - ARMWord* insn = reinterpret_cast<ARMWord*>(m_buffer.data()) + (from.m_offset / sizeof(ARMWord)); + ARMWord* insn = reinterpret_cast<ARMWord*>(getAbsoluteJumpAddress(m_buffer.data(), from.m_offset)); ARMWord* addr = getLdrImmAddressOnPool(insn, m_buffer.poolAddress()); *addr = static_cast<ARMWord>(to.m_offset); } static void linkJump(void* code, JmpSrc from, void* to) { - patchPointerInternal(reinterpret_cast<intptr_t>(code) + from.m_offset, to); + patchPointerInternal(getAbsoluteJumpAddress(code, from.m_offset), to); } static void relinkJump(void* from, void* to) { - patchPointerInternal(reinterpret_cast<intptr_t>(from) - sizeof(ARMWord), to); + patchPointerInternal(getAbsoluteJumpAddress(from), to); } static void linkCall(void* code, JmpSrc from, void* to) { - patchPointerInternal(reinterpret_cast<intptr_t>(code) + from.m_offset, to); + patchPointerInternal(getAbsoluteJumpAddress(code, from.m_offset), to); } static void relinkCall(void* from, void* to) { - patchPointerInternal(reinterpret_cast<intptr_t>(from) - sizeof(ARMWord), to); + patchPointerInternal(getAbsoluteJumpAddress(from), to); } // Address operations static void* getRelocatedAddress(void* code, JmpSrc jump) { - return reinterpret_cast<void*>(reinterpret_cast<ARMWord*>(code) + jump.m_offset / sizeof(ARMWord) + 1); + return reinterpret_cast<void*>(reinterpret_cast<char*>(code) + jump.m_offset); } static void* getRelocatedAddress(void* code, JmpDst label) { - return reinterpret_cast<void*>(reinterpret_cast<ARMWord*>(code) + label.m_offset / sizeof(ARMWord)); + return reinterpret_cast<void*>(reinterpret_cast<char*>(code) + label.m_offset); } // Address differences static int getDifferenceBetweenLabels(JmpDst from, JmpSrc to) { - return (to.m_offset + sizeof(ARMWord)) - from.m_offset; + return to.m_offset - from.m_offset; } static int getDifferenceBetweenLabels(JmpDst from, JmpDst to) @@ -854,7 +855,7 @@ namespace JSC { static unsigned getCallReturnOffset(JmpSrc call) { - return call.m_offset + sizeof(ARMWord); + return call.m_offset; } // Handle immediates diff --git a/JavaScriptCore/assembler/ARMv7Assembler.h b/JavaScriptCore/assembler/ARMv7Assembler.h index 37b650b..a40208a 100644 --- a/JavaScriptCore/assembler/ARMv7Assembler.h +++ b/JavaScriptCore/assembler/ARMv7Assembler.h @@ -694,6 +694,7 @@ private: OP_LSR_reg_T2 = 0xFA20, OP_ASR_reg_T2 = 0xFA40, OP_ROR_reg_T2 = 0xFA60, + OP_CLZ = 0xFAB0, OP_SMULL_T1 = 0xFB80, } OpcodeID1; @@ -947,6 +948,13 @@ public: m_formatter.oneWordOp8Imm8(OP_BKPT, imm); } + void clz(RegisterID rd, RegisterID rm) + { + ASSERT(!BadReg(rd)); + ASSERT(!BadReg(rm)); + m_formatter.twoWordOp12Reg4FourFours(OP_CLZ, rm, FourFours(0xf, rd, 8, rm)); + } + void cmn(RegisterID rn, ARMThumbImmediate imm) { ASSERT(rn != ARMRegisters::pc); diff --git a/JavaScriptCore/assembler/MacroAssemblerARM.h b/JavaScriptCore/assembler/MacroAssemblerARM.h index 49c87c0..c51686a 100644 --- a/JavaScriptCore/assembler/MacroAssemblerARM.h +++ b/JavaScriptCore/assembler/MacroAssemblerARM.h @@ -228,6 +228,17 @@ public: m_assembler.eors_r(dest, dest, m_assembler.getImm(imm.m_value, ARMRegisters::S0)); } + void countLeadingZeros32(RegisterID src, RegisterID dest) + { +#if WTF_ARM_ARCH_AT_LEAST(5) + m_assembler.clz_r(dest, src); +#else + UNUSED_PARAM(src); + UNUSED_PARAM(dest); + ASSERT_NOT_REACHED(); +#endif + } + void load8(ImplicitAddress address, RegisterID dest) { m_assembler.dataTransfer32(true, dest, address.base, address.offset, true); @@ -604,9 +615,7 @@ public: Call call(RegisterID target) { - m_assembler.blx(target); - JmpSrc jmpSrc; - return Call(jmpSrc, Call::None); + return Call(m_assembler.blx(target), Call::None); } void call(Address address) @@ -710,6 +719,15 @@ public: return branch32(cond, ARMRegisters::S1, right); } + void relativeTableJump(RegisterID index, int scale) + { + ASSERT(scale >= 0 && scale <= 31); + m_assembler.add_r(ARMRegisters::pc, ARMRegisters::pc, m_assembler.lsl(index, scale)); + + // NOP the default prefetching + m_assembler.mov_r(ARMRegisters::r0, ARMRegisters::r0); + } + Call call() { #if WTF_ARM_ARCH_AT_LEAST(5) diff --git a/JavaScriptCore/assembler/MacroAssemblerARMv7.h b/JavaScriptCore/assembler/MacroAssemblerARMv7.h index fe5d052..d5b4ce7 100644 --- a/JavaScriptCore/assembler/MacroAssemblerARMv7.h +++ b/JavaScriptCore/assembler/MacroAssemblerARMv7.h @@ -220,6 +220,11 @@ public: } } + void countLeadingZeros32(RegisterID src, RegisterID dest) + { + m_assembler.clz(dest, src); + } + void lshift32(RegisterID shift_amount, RegisterID dest) { // Clamp the shift to the range 0..31 @@ -1074,6 +1079,18 @@ public: return Jump(makeBranch(cond)); } + void relativeTableJump(RegisterID index, int scale) + { + ASSERT(scale >= 0 && scale <= 31); + + // dataTempRegister will point after the jump if index register contains zero + move(ARMRegisters::pc, dataTempRegister); + m_assembler.add(dataTempRegister, dataTempRegister, ARMThumbImmediate::makeEncodedImm(9)); + + ShiftTypeAndAmount shift(SRType_LSL, scale); + m_assembler.add(dataTempRegister, dataTempRegister, index, shift); + jump(dataTempRegister); + } // Miscellaneous operations: |