summaryrefslogtreecommitdiff
path: root/Source/JavaScriptCore/assembler/MacroAssemblerMIPS.h
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@lorry>2016-04-10 09:28:39 +0000
committerLorry Tar Creator <lorry-tar-importer@lorry>2016-04-10 09:28:39 +0000
commit32761a6cee1d0dee366b885b7b9c777e67885688 (patch)
treed6bec92bebfb216f4126356e55518842c2f476a1 /Source/JavaScriptCore/assembler/MacroAssemblerMIPS.h
parenta4e969f4965059196ca948db781e52f7cfebf19e (diff)
downloadWebKitGtk-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.h164
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());
}
};