diff options
author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2016-04-10 09:28:39 +0000 |
---|---|---|
committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2016-04-10 09:28:39 +0000 |
commit | 32761a6cee1d0dee366b885b7b9c777e67885688 (patch) | |
tree | d6bec92bebfb216f4126356e55518842c2f476a1 /Source/JavaScriptCore/assembler/MacroAssemblerMIPS.h | |
parent | a4e969f4965059196ca948db781e52f7cfebf19e (diff) | |
download | WebKitGtk-tarball-32761a6cee1d0dee366b885b7b9c777e67885688.tar.gz |
webkitgtk-2.4.11webkitgtk-2.4.11
Diffstat (limited to 'Source/JavaScriptCore/assembler/MacroAssemblerMIPS.h')
-rw-r--r-- | Source/JavaScriptCore/assembler/MacroAssemblerMIPS.h | 164 |
1 files changed, 32 insertions, 132 deletions
diff --git a/Source/JavaScriptCore/assembler/MacroAssemblerMIPS.h b/Source/JavaScriptCore/assembler/MacroAssemblerMIPS.h index 7c4bd080d..a30247d33 100644 --- a/Source/JavaScriptCore/assembler/MacroAssemblerMIPS.h +++ b/Source/JavaScriptCore/assembler/MacroAssemblerMIPS.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2008, 2014 Apple Inc. All rights reserved. + * Copyright (C) 2008 Apple Inc. All rights reserved. * Copyright (C) 2010 MIPS Technologies, Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -34,7 +34,7 @@ namespace JSC { -class MacroAssemblerMIPS : public AbstractMacroAssembler<MIPSAssembler, MacroAssemblerMIPS> { +class MacroAssemblerMIPS : public AbstractMacroAssembler<MIPSAssembler> { public: typedef MIPSRegisters::FPRegisterID FPRegisterID; @@ -55,9 +55,9 @@ public: // For storing data loaded from the memory static const RegisterID dataTempRegister = MIPSRegisters::t1; // For storing address base - static const RegisterID addrTempRegister = MIPSRegisters::t7; + static const RegisterID addrTempRegister = MIPSRegisters::t2; // For storing compare result - static const RegisterID cmpTempRegister = MIPSRegisters::t8; + static const RegisterID cmpTempRegister = MIPSRegisters::t3; // FP temp register static const FPRegisterID fpTempRegister = MIPSRegisters::f16; @@ -289,7 +289,7 @@ public: { if (!imm.m_value && !m_fixedWidth) move(MIPSRegisters::zero, dest); - else if (imm.m_value > 0 && imm.m_value <= 65535 && !m_fixedWidth) + else if (imm.m_value > 0 && imm.m_value < 65535 && !m_fixedWidth) m_assembler.andi(dest, dest, imm.m_value); else { /* @@ -305,7 +305,7 @@ public: { if (!imm.m_value && !m_fixedWidth) move(MIPSRegisters::zero, dest); - else if (imm.m_value > 0 && imm.m_value <= 65535 && !m_fixedWidth) + else if (imm.m_value > 0 && imm.m_value < 65535 && !m_fixedWidth) m_assembler.andi(dest, src, imm.m_value); else { move(imm, immTempRegister); @@ -313,15 +313,6 @@ public: } } - void countLeadingZeros32(RegisterID src, RegisterID dest) - { -#if WTF_MIPS_ISA_AT_LEAST(32) - m_assembler.clz(dest, src); -#else - static_assert(false, "CLZ opcode is not available for this ISA"); -#endif - } - void lshift32(RegisterID shiftAmount, RegisterID dest) { m_assembler.sllv(dest, dest, shiftAmount); @@ -385,23 +376,12 @@ public: m_assembler.orInsn(dest, op1, op2); } - void or32(TrustedImm32 imm, AbsoluteAddress dest) - { - if (!imm.m_value && !m_fixedWidth) - return; - - // TODO: Swap dataTempRegister and immTempRegister usage - load32(dest.m_ptr, immTempRegister); - or32(imm, immTempRegister); - store32(immTempRegister, dest.m_ptr); - } - void or32(TrustedImm32 imm, RegisterID dest) { if (!imm.m_value && !m_fixedWidth) return; - if (imm.m_value > 0 && imm.m_value <= 65535 + if (imm.m_value > 0 && imm.m_value < 65535 && !m_fixedWidth) { m_assembler.ori(dest, dest, imm.m_value); return; @@ -417,12 +397,10 @@ public: void or32(TrustedImm32 imm, RegisterID src, RegisterID dest) { - if (!imm.m_value && !m_fixedWidth) { - move(src, dest); + if (!imm.m_value && !m_fixedWidth) return; - } - if (imm.m_value > 0 && imm.m_value <= 65535 && !m_fixedWidth) { + if (imm.m_value > 0 && imm.m_value < 65535 && !m_fixedWidth) { m_assembler.ori(dest, src, imm.m_value); return; } @@ -647,18 +625,6 @@ public: RELEASE_ASSERT_NOT_REACHED(); } - NO_RETURN_DUE_TO_CRASH void ceilDouble(FPRegisterID, FPRegisterID) - { - ASSERT(!supportsFloatingPointRounding()); - CRASH(); - } - - NO_RETURN_DUE_TO_CRASH void floorDouble(FPRegisterID, FPRegisterID) - { - ASSERT(!supportsFloatingPointRounding()); - CRASH(); - } - ConvertibleLoadLabel convertibleLoadPtr(Address address, RegisterID dest) { ConvertibleLoadLabel result(this); @@ -741,7 +707,7 @@ public: m_assembler.lbu(dest, addrTempRegister, 0); } - void load8SignedExtendTo32(BaseIndex address, RegisterID dest) + void load8Signed(BaseIndex address, RegisterID dest) { if (address.offset >= -32768 && address.offset <= 32767 && !m_fixedWidth) { @@ -953,7 +919,7 @@ public: } } - void load16SignedExtendTo32(BaseIndex address, RegisterID dest) + void load16Signed(BaseIndex address, RegisterID dest) { if (address.offset >= -32768 && address.offset <= 32767 && !m_fixedWidth) { @@ -1243,7 +1209,6 @@ public: #endif } static bool supportsFloatingPointAbs() { return false; } - static bool supportsFloatingPointRounding() { return false; } // Stack manipulation operations: // @@ -1259,13 +1224,6 @@ public: m_assembler.addiu(MIPSRegisters::sp, MIPSRegisters::sp, 4); } - void popPair(RegisterID dest1, RegisterID dest2) - { - m_assembler.lw(dest1, MIPSRegisters::sp, 0); - m_assembler.lw(dest2, MIPSRegisters::sp, 4); - m_assembler.addiu(MIPSRegisters::sp, MIPSRegisters::sp, 8); - } - void push(RegisterID src) { m_assembler.addiu(MIPSRegisters::sp, MIPSRegisters::sp, -4); @@ -1284,13 +1242,6 @@ public: push(immTempRegister); } - void pushPair(RegisterID src1, RegisterID src2) - { - m_assembler.addiu(MIPSRegisters::sp, MIPSRegisters::sp, -8); - m_assembler.sw(src2, MIPSRegisters::sp, 4); - m_assembler.sw(src1, MIPSRegisters::sp, 0); - } - // Register move operations: // // Move values in registers. @@ -1706,12 +1657,6 @@ public: return branchAdd32(cond, immTempRegister, dest); } - Jump branchAdd32(ResultCondition cond, Address address, RegisterID dest) - { - load32(address, immTempRegister); - return branchAdd32(cond, immTempRegister, dest); - } - Jump branchAdd32(ResultCondition cond, RegisterID src, TrustedImm32 imm, RegisterID dest) { move(imm, immTempRegister); @@ -1874,7 +1819,7 @@ public: return Jump(); } - Jump branchMul32(ResultCondition cond, RegisterID src, TrustedImm32 imm, RegisterID dest) + Jump branchMul32(ResultCondition cond, TrustedImm32 imm, RegisterID src, RegisterID dest) { move(imm, immTempRegister); return branchMul32(cond, immTempRegister, src, dest); @@ -2030,16 +1975,6 @@ public: return Call(m_assembler.label(), Call::LinkableNear); } - Call nearTailCall() - { - m_assembler.nop(); - m_assembler.nop(); - m_assembler.beq(MIPSRegisters::zero, MIPSRegisters::zero, 0); - m_assembler.nop(); - insertRelaxationWords(); - return Call(m_assembler.label(), Call::LinkableNearTail); - } - Call call() { m_assembler.lui(MIPSRegisters::t9, 0); @@ -2185,16 +2120,6 @@ public: return temp; } - Jump branch32WithPatch(RelationalCondition cond, Address left, DataLabel32& dataLabel, TrustedImm32 initialRightValue = TrustedImm32(0)) - { - m_fixedWidth = true; - load32(left, dataTempRegister); - dataLabel = moveWithPatch(initialRightValue, immTempRegister); - Jump temp = branch32(cond, dataTempRegister, immTempRegister); - m_fixedWidth = false; - return temp; - } - DataLabelPtr storePtrWithPatch(TrustedImmPtr initialValue, ImplicitAddress address) { m_fixedWidth = true; @@ -2343,7 +2268,7 @@ public: #endif } - void loadDouble(TrustedImmPtr address, FPRegisterID dest) + void loadDouble(const void* address, FPRegisterID dest) { #if WTF_MIPS_ISA(1) /* @@ -2351,7 +2276,7 @@ public: lwc1 dest, 0(addrTemp) lwc1 dest+1, 4(addrTemp) */ - move(address, addrTempRegister); + move(TrustedImmPtr(address), addrTempRegister); m_assembler.lwc1(dest, addrTempRegister, 0); m_assembler.lwc1(FPRegisterID(dest + 1), addrTempRegister, 4); #else @@ -2359,7 +2284,7 @@ public: li addrTemp, address ldc1 dest, 0(addrTemp) */ - move(address, addrTempRegister); + move(TrustedImmPtr(address), addrTempRegister); m_assembler.ldc1(dest, addrTempRegister, 0); #endif } @@ -2481,14 +2406,14 @@ public: #endif } - void storeDouble(FPRegisterID src, TrustedImmPtr address) + void storeDouble(FPRegisterID src, const void* address) { #if WTF_MIPS_ISA(1) - move(address, addrTempRegister); + move(TrustedImmPtr(address), addrTempRegister); m_assembler.swc1(src, addrTempRegister, 0); m_assembler.swc1(FPRegisterID(src + 1), addrTempRegister, 4); #else - move(address, addrTempRegister); + move(TrustedImmPtr(address), addrTempRegister); m_assembler.sdc1(src, addrTempRegister, 0); #endif } @@ -2524,7 +2449,7 @@ public: void addDouble(AbsoluteAddress address, FPRegisterID dest) { - loadDouble(TrustedImmPtr(address.m_ptr), fpTempRegister); + loadDouble(address.m_ptr, fpTempRegister); m_assembler.addd(dest, dest, fpTempRegister); } @@ -2731,7 +2656,7 @@ public: { m_assembler.truncwd(fpTempRegister, src); m_assembler.mfc1(dest, fpTempRegister); - return branch32(branchType == BranchIfTruncateFailed ? Equal : NotEqual, dest, TrustedImm32(0x7fffffff)); + return branch32(branchType == BranchIfTruncateFailed ? Equal : NotEqual, dest, TrustedImm32(0)); } // Result is undefined if the value is outside of the integer range. @@ -2815,18 +2740,6 @@ public: m_assembler.sync(); } - void abortWithReason(AbortReason reason) - { - move(TrustedImm32(reason), dataTempRegister); - breakpoint(); - } - - void abortWithReason(AbortReason reason, intptr_t misc) - { - move(TrustedImm32(misc), immTempRegister); - abortWithReason(reason); - } - static FunctionPtr readCallTarget(CodeLocationCall call) { return FunctionPtr(reinterpret_cast<void(*)()>(MIPSAssembler::readCallTarget(call.dataLocation()))); @@ -2844,13 +2757,6 @@ public: } static bool canJumpReplacePatchableBranchPtrWithPatch() { return false; } - static bool canJumpReplacePatchableBranch32WithPatch() { return false; } - - static CodeLocationLabel startOfPatchableBranch32WithPatchOnAddress(CodeLocationDataLabel32) - { - UNREACHABLE_FOR_PLATFORM(); - return CodeLocationLabel(); - } static CodeLocationLabel startOfBranchPtrWithPatchOnRegister(CodeLocationDataLabelPtr label) { @@ -2868,25 +2774,11 @@ public: return CodeLocationLabel(); } - static void revertJumpReplacementToPatchableBranch32WithPatch(CodeLocationLabel, Address, int32_t) - { - UNREACHABLE_FOR_PLATFORM(); - } - static void revertJumpReplacementToPatchableBranchPtrWithPatch(CodeLocationLabel, Address, void*) { UNREACHABLE_FOR_PLATFORM(); } - static void repatchCall(CodeLocationCall call, CodeLocationLabel destination) - { - MIPSAssembler::relinkCall(call.dataLocation(), destination.executableAddress()); - } - - static void repatchCall(CodeLocationCall call, FunctionPtr destination) - { - MIPSAssembler::relinkCall(call.dataLocation(), destination.executableAddress()); - } private: // If m_fixedWidth is true, we will generate a fixed number of instructions. @@ -2894,13 +2786,21 @@ private: bool m_fixedWidth; friend class LinkBuffer; + friend class RepatchBuffer; static void linkCall(void* code, Call call, FunctionPtr function) { - if (call.isFlagSet(Call::Tail)) - MIPSAssembler::linkJump(code, call.m_label, function.value()); - else - MIPSAssembler::linkCall(code, call.m_label, function.value()); + MIPSAssembler::linkCall(code, call.m_label, function.value()); + } + + static void repatchCall(CodeLocationCall call, CodeLocationLabel destination) + { + MIPSAssembler::relinkCall(call.dataLocation(), destination.executableAddress()); + } + + static void repatchCall(CodeLocationCall call, FunctionPtr destination) + { + MIPSAssembler::relinkCall(call.dataLocation(), destination.executableAddress()); } }; |