summaryrefslogtreecommitdiff
path: root/Source/JavaScriptCore/assembler/MacroAssemblerMIPS.h
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@lorry>2016-05-24 08:28:08 +0000
committerLorry Tar Creator <lorry-tar-importer@lorry>2016-05-24 08:28:08 +0000
commita4e969f4965059196ca948db781e52f7cfebf19e (patch)
tree6ca352808c8fdc52006a0f33f6ae3c593b23867d /Source/JavaScriptCore/assembler/MacroAssemblerMIPS.h
parent41386e9cb918eed93b3f13648cbef387e371e451 (diff)
downloadWebKitGtk-tarball-a4e969f4965059196ca948db781e52f7cfebf19e.tar.gz
webkitgtk-2.12.3webkitgtk-2.12.3
Diffstat (limited to 'Source/JavaScriptCore/assembler/MacroAssemblerMIPS.h')
-rw-r--r--Source/JavaScriptCore/assembler/MacroAssemblerMIPS.h164
1 files changed, 132 insertions, 32 deletions
diff --git a/Source/JavaScriptCore/assembler/MacroAssemblerMIPS.h b/Source/JavaScriptCore/assembler/MacroAssemblerMIPS.h
index a30247d33..7c4bd080d 100644
--- a/Source/JavaScriptCore/assembler/MacroAssemblerMIPS.h
+++ b/Source/JavaScriptCore/assembler/MacroAssemblerMIPS.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2008 Apple Inc. All rights reserved.
+ * Copyright (C) 2008, 2014 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> {
+class MacroAssemblerMIPS : public AbstractMacroAssembler<MIPSAssembler, MacroAssemblerMIPS> {
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::t2;
+ static const RegisterID addrTempRegister = MIPSRegisters::t7;
// For storing compare result
- static const RegisterID cmpTempRegister = MIPSRegisters::t3;
+ static const RegisterID cmpTempRegister = MIPSRegisters::t8;
// 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,6 +313,15 @@ 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);
@@ -376,12 +385,23 @@ 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;
@@ -397,10 +417,12 @@ public:
void or32(TrustedImm32 imm, RegisterID src, RegisterID dest)
{
- if (!imm.m_value && !m_fixedWidth)
+ if (!imm.m_value && !m_fixedWidth) {
+ move(src, dest);
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;
}
@@ -625,6 +647,18 @@ 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);
@@ -707,7 +741,7 @@ public:
m_assembler.lbu(dest, addrTempRegister, 0);
}
- void load8Signed(BaseIndex address, RegisterID dest)
+ void load8SignedExtendTo32(BaseIndex address, RegisterID dest)
{
if (address.offset >= -32768 && address.offset <= 32767
&& !m_fixedWidth) {
@@ -919,7 +953,7 @@ public:
}
}
- void load16Signed(BaseIndex address, RegisterID dest)
+ void load16SignedExtendTo32(BaseIndex address, RegisterID dest)
{
if (address.offset >= -32768 && address.offset <= 32767
&& !m_fixedWidth) {
@@ -1209,6 +1243,7 @@ public:
#endif
}
static bool supportsFloatingPointAbs() { return false; }
+ static bool supportsFloatingPointRounding() { return false; }
// Stack manipulation operations:
//
@@ -1224,6 +1259,13 @@ 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);
@@ -1242,6 +1284,13 @@ 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.
@@ -1657,6 +1706,12 @@ 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);
@@ -1819,7 +1874,7 @@ public:
return Jump();
}
- Jump branchMul32(ResultCondition cond, TrustedImm32 imm, RegisterID src, RegisterID dest)
+ Jump branchMul32(ResultCondition cond, RegisterID src, TrustedImm32 imm, RegisterID dest)
{
move(imm, immTempRegister);
return branchMul32(cond, immTempRegister, src, dest);
@@ -1975,6 +2030,16 @@ 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);
@@ -2120,6 +2185,16 @@ 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;
@@ -2268,7 +2343,7 @@ public:
#endif
}
- void loadDouble(const void* address, FPRegisterID dest)
+ void loadDouble(TrustedImmPtr address, FPRegisterID dest)
{
#if WTF_MIPS_ISA(1)
/*
@@ -2276,7 +2351,7 @@ public:
lwc1 dest, 0(addrTemp)
lwc1 dest+1, 4(addrTemp)
*/
- move(TrustedImmPtr(address), addrTempRegister);
+ move(address, addrTempRegister);
m_assembler.lwc1(dest, addrTempRegister, 0);
m_assembler.lwc1(FPRegisterID(dest + 1), addrTempRegister, 4);
#else
@@ -2284,7 +2359,7 @@ public:
li addrTemp, address
ldc1 dest, 0(addrTemp)
*/
- move(TrustedImmPtr(address), addrTempRegister);
+ move(address, addrTempRegister);
m_assembler.ldc1(dest, addrTempRegister, 0);
#endif
}
@@ -2406,14 +2481,14 @@ public:
#endif
}
- void storeDouble(FPRegisterID src, const void* address)
+ void storeDouble(FPRegisterID src, TrustedImmPtr address)
{
#if WTF_MIPS_ISA(1)
- move(TrustedImmPtr(address), addrTempRegister);
+ move(address, addrTempRegister);
m_assembler.swc1(src, addrTempRegister, 0);
m_assembler.swc1(FPRegisterID(src + 1), addrTempRegister, 4);
#else
- move(TrustedImmPtr(address), addrTempRegister);
+ move(address, addrTempRegister);
m_assembler.sdc1(src, addrTempRegister, 0);
#endif
}
@@ -2449,7 +2524,7 @@ public:
void addDouble(AbsoluteAddress address, FPRegisterID dest)
{
- loadDouble(address.m_ptr, fpTempRegister);
+ loadDouble(TrustedImmPtr(address.m_ptr), fpTempRegister);
m_assembler.addd(dest, dest, fpTempRegister);
}
@@ -2656,7 +2731,7 @@ public:
{
m_assembler.truncwd(fpTempRegister, src);
m_assembler.mfc1(dest, fpTempRegister);
- return branch32(branchType == BranchIfTruncateFailed ? Equal : NotEqual, dest, TrustedImm32(0));
+ return branch32(branchType == BranchIfTruncateFailed ? Equal : NotEqual, dest, TrustedImm32(0x7fffffff));
}
// Result is undefined if the value is outside of the integer range.
@@ -2740,6 +2815,18 @@ 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())));
@@ -2757,6 +2844,13 @@ 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)
{
@@ -2774,23 +2868,14 @@ public:
return CodeLocationLabel();
}
- static void revertJumpReplacementToPatchableBranchPtrWithPatch(CodeLocationLabel, Address, void*)
+ static void revertJumpReplacementToPatchableBranch32WithPatch(CodeLocationLabel, Address, int32_t)
{
UNREACHABLE_FOR_PLATFORM();
}
-
-private:
- // If m_fixedWidth is true, we will generate a fixed number of instructions.
- // Otherwise, we can emit any number of instructions.
- bool m_fixedWidth;
-
- friend class LinkBuffer;
- friend class RepatchBuffer;
-
- static void linkCall(void* code, Call call, FunctionPtr function)
+ static void revertJumpReplacementToPatchableBranchPtrWithPatch(CodeLocationLabel, Address, void*)
{
- MIPSAssembler::linkCall(code, call.m_label, function.value());
+ UNREACHABLE_FOR_PLATFORM();
}
static void repatchCall(CodeLocationCall call, CodeLocationLabel destination)
@@ -2803,6 +2888,21 @@ private:
MIPSAssembler::relinkCall(call.dataLocation(), destination.executableAddress());
}
+private:
+ // If m_fixedWidth is true, we will generate a fixed number of instructions.
+ // Otherwise, we can emit any number of instructions.
+ bool m_fixedWidth;
+
+ friend class LinkBuffer;
+
+ 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());
+ }
+
};
}