summaryrefslogtreecommitdiff
path: root/Source/JavaScriptCore/assembler/MacroAssemblerMIPS.h
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@lorry>2017-06-27 06:07:23 +0000
committerLorry Tar Creator <lorry-tar-importer@lorry>2017-06-27 06:07:23 +0000
commit1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c (patch)
tree46dcd36c86e7fbc6e5df36deb463b33e9967a6f7 /Source/JavaScriptCore/assembler/MacroAssemblerMIPS.h
parent32761a6cee1d0dee366b885b7b9c777e67885688 (diff)
downloadWebKitGtk-tarball-master.tar.gz
Diffstat (limited to 'Source/JavaScriptCore/assembler/MacroAssemblerMIPS.h')
-rw-r--r--Source/JavaScriptCore/assembler/MacroAssemblerMIPS.h390
1 files changed, 316 insertions, 74 deletions
diff --git a/Source/JavaScriptCore/assembler/MacroAssemblerMIPS.h b/Source/JavaScriptCore/assembler/MacroAssemblerMIPS.h
index a30247d33..8d0ac915a 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
@@ -24,8 +24,7 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-#ifndef MacroAssemblerMIPS_h
-#define MacroAssemblerMIPS_h
+#pragma once
#if ENABLE(ASSEMBLER) && CPU(MIPS)
@@ -34,7 +33,7 @@
namespace JSC {
-class MacroAssemblerMIPS : public AbstractMacroAssembler<MIPSAssembler> {
+class MacroAssemblerMIPS : public AbstractMacroAssembler<MIPSAssembler, MacroAssemblerMIPS> {
public:
typedef MIPSRegisters::FPRegisterID FPRegisterID;
@@ -55,9 +54,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 +288,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 +304,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 +312,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 +384,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 +416,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;
}
@@ -619,10 +640,28 @@ public:
{
m_assembler.sqrtd(dst, src);
}
-
- void absDouble(FPRegisterID, FPRegisterID)
+
+ void absDouble(FPRegisterID src, FPRegisterID dst)
+ {
+ m_assembler.absd(dst, src);
+ }
+
+ NO_RETURN_DUE_TO_CRASH void ceilDouble(FPRegisterID, FPRegisterID)
+ {
+ ASSERT(!supportsFloatingPointRounding());
+ CRASH();
+ }
+
+ NO_RETURN_DUE_TO_CRASH void floorDouble(FPRegisterID, FPRegisterID)
+ {
+ ASSERT(!supportsFloatingPointRounding());
+ CRASH();
+ }
+
+ NO_RETURN_DUE_TO_CRASH void roundTowardZeroDouble(FPRegisterID, FPRegisterID)
{
- RELEASE_ASSERT_NOT_REACHED();
+ ASSERT(!supportsFloatingPointRounding());
+ CRASH();
}
ConvertibleLoadLabel convertibleLoadPtr(Address address, RegisterID dest)
@@ -707,7 +746,24 @@ public:
m_assembler.lbu(dest, addrTempRegister, 0);
}
- void load8Signed(BaseIndex address, RegisterID dest)
+ void load8SignedExtendTo32(ImplicitAddress address, RegisterID dest)
+ {
+ if (address.offset >= -32768 && address.offset <= 32767
+ && !m_fixedWidth)
+ m_assembler.lb(dest, address.base, address.offset);
+ else {
+ /*
+ lui addrTemp, (offset + 0x8000) >> 16
+ addu addrTemp, addrTemp, base
+ lb dest, (offset & 0xffff)(addrTemp)
+ */
+ m_assembler.lui(addrTempRegister, (address.offset + 0x8000) >> 16);
+ m_assembler.addu(addrTempRegister, addrTempRegister, address.base);
+ m_assembler.lb(dest, addrTempRegister, address.offset);
+ }
+ }
+
+ void load8SignedExtendTo32(BaseIndex address, RegisterID dest)
{
if (address.offset >= -32768 && address.offset <= 32767
&& !m_fixedWidth) {
@@ -735,6 +791,22 @@ public:
}
}
+ ALWAYS_INLINE void load8SignedExtendTo32(AbsoluteAddress address, RegisterID dest)
+ {
+ load8SignedExtendTo32(address.m_ptr, dest);
+ }
+
+ void load8SignedExtendTo32(const void* address, RegisterID dest)
+ {
+ /*
+ li addrTemp, address
+ lb dest, 0(addrTemp)
+ */
+ move(TrustedImmPtr(address), addrTempRegister);
+ m_assembler.lb(dest, addrTempRegister, 0);
+ }
+
+
void load32(ImplicitAddress address, RegisterID dest)
{
if (address.offset >= -32768 && address.offset <= 32767
@@ -782,7 +854,53 @@ public:
void load16Unaligned(BaseIndex address, RegisterID dest)
{
- load16(address, dest);
+ if (address.offset >= -32768 && address.offset <= 32767 && !m_fixedWidth) {
+ /*
+ sll addrtemp, address.index, address.scale
+ addu addrtemp, addrtemp, address.base
+ lbu immTemp, address.offset+x(addrtemp) (x=0 for LE, x=1 for BE)
+ lbu dest, address.offset+x(addrtemp) (x=1 for LE, x=0 for BE)
+ sll dest, dest, 8
+ or dest, dest, immTemp
+ */
+ m_assembler.sll(addrTempRegister, address.index, address.scale);
+ m_assembler.addu(addrTempRegister, addrTempRegister, address.base);
+#if CPU(BIG_ENDIAN)
+ m_assembler.lbu(immTempRegister, addrTempRegister, address.offset + 1);
+ m_assembler.lbu(dest, addrTempRegister, address.offset);
+#else
+ m_assembler.lbu(immTempRegister, addrTempRegister, address.offset);
+ m_assembler.lbu(dest, addrTempRegister, address.offset + 1);
+#endif
+ m_assembler.sll(dest, dest, 8);
+ m_assembler.orInsn(dest, dest, immTempRegister);
+ } else {
+ /*
+ sll addrTemp, address.index, address.scale
+ addu addrTemp, addrTemp, address.base
+ lui immTemp, address.offset >> 16
+ ori immTemp, immTemp, address.offset & 0xffff
+ addu addrTemp, addrTemp, immTemp
+ lbu immTemp, x(addrtemp) (x=0 for LE, x=1 for BE)
+ lbu dest, x(addrtemp) (x=1 for LE, x=0 for BE)
+ sll dest, dest, 8
+ or dest, dest, immTemp
+ */
+ m_assembler.sll(addrTempRegister, address.index, address.scale);
+ m_assembler.addu(addrTempRegister, addrTempRegister, address.base);
+ m_assembler.lui(immTempRegister, address.offset >> 16);
+ m_assembler.ori(immTempRegister, immTempRegister, address.offset);
+ m_assembler.addu(addrTempRegister, addrTempRegister, immTempRegister);
+#if CPU(BIG_ENDIAN)
+ m_assembler.lbu(immTempRegister, addrTempRegister, 1);
+ m_assembler.lbu(dest, addrTempRegister, 0);
+#else
+ m_assembler.lbu(immTempRegister, addrTempRegister, 0);
+ m_assembler.lbu(dest, addrTempRegister, 1);
+#endif
+ m_assembler.sll(dest, dest, 8);
+ m_assembler.orInsn(dest, dest, immTempRegister);
+ }
}
void load32WithUnalignedHalfWords(BaseIndex address, RegisterID dest)
@@ -919,7 +1037,7 @@ public:
}
}
- void load16Signed(BaseIndex address, RegisterID dest)
+ void load16SignedExtendTo32(BaseIndex address, RegisterID dest)
{
if (address.offset >= -32768 && address.offset <= 32767
&& !m_fixedWidth) {
@@ -1005,16 +1123,45 @@ public:
li addrTemp, address
sb src, 0(addrTemp)
*/
- if (!imm.m_value && !m_fixedWidth) {
+ TrustedImm32 imm8(static_cast<int8_t>(imm.m_value));
+ if (!imm8.m_value && !m_fixedWidth) {
move(TrustedImmPtr(address), addrTempRegister);
m_assembler.sb(MIPSRegisters::zero, addrTempRegister, 0);
} else {
- move(imm, immTempRegister);
+ move(imm8, immTempRegister);
move(TrustedImmPtr(address), addrTempRegister);
m_assembler.sb(immTempRegister, addrTempRegister, 0);
}
}
+ void store8(TrustedImm32 imm, ImplicitAddress address)
+ {
+ TrustedImm32 imm8(static_cast<int8_t>(imm.m_value));
+ if (address.offset >= -32768 && address.offset <= 32767
+ && !m_fixedWidth) {
+ if (!imm8.m_value)
+ m_assembler.sb(MIPSRegisters::zero, address.base, address.offset);
+ else {
+ move(imm8, immTempRegister);
+ m_assembler.sb(immTempRegister, address.base, address.offset);
+ }
+ } else {
+ /*
+ lui addrTemp, (offset + 0x8000) >> 16
+ addu addrTemp, addrTemp, base
+ sb immTemp, (offset & 0xffff)(addrTemp)
+ */
+ m_assembler.lui(addrTempRegister, (address.offset + 0x8000) >> 16);
+ m_assembler.addu(addrTempRegister, addrTempRegister, address.base);
+ if (!imm8.m_value && !m_fixedWidth)
+ m_assembler.sb(MIPSRegisters::zero, addrTempRegister, address.offset);
+ else {
+ move(imm8, immTempRegister);
+ m_assembler.sb(immTempRegister, addrTempRegister, address.offset);
+ }
+ }
+ }
+
void store16(RegisterID src, BaseIndex address)
{
if (address.offset >= -32768 && address.offset <= 32767
@@ -1208,7 +1355,17 @@ public:
return false;
#endif
}
- static bool supportsFloatingPointAbs() { return false; }
+
+ static bool supportsFloatingPointAbs()
+ {
+#if WTF_MIPS_DOUBLE_FLOAT && WTF_MIPS_ISA_AT_LEAST(2)
+ return true;
+#else
+ return false;
+#endif
+ }
+
+ static bool supportsFloatingPointRounding() { return false; }
// Stack manipulation operations:
//
@@ -1224,6 +1381,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 +1406,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.
@@ -1307,38 +1478,35 @@ public:
Jump branch8(RelationalCondition cond, Address left, TrustedImm32 right)
{
- // Make sure the immediate value is unsigned 8 bits.
- ASSERT(!(right.m_value & 0xFFFFFF00));
- load8(left, dataTempRegister);
- move(right, immTempRegister);
+ TrustedImm32 right8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, right);
+ MacroAssemblerHelpers::load8OnCondition(*this, cond, left, dataTempRegister);
+ move(right8, immTempRegister);
return branch32(cond, dataTempRegister, immTempRegister);
}
Jump branch8(RelationalCondition cond, AbsoluteAddress left, TrustedImm32 right)
{
- // Make sure the immediate value is unsigned 8 bits.
- ASSERT(!(right.m_value & 0xFFFFFF00));
- load8(left, dataTempRegister);
- move(right, immTempRegister);
+ TrustedImm32 right8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, right);
+ MacroAssemblerHelpers::load8OnCondition(*this, cond, left, dataTempRegister);
+ move(right8, immTempRegister);
return branch32(cond, dataTempRegister, immTempRegister);
}
void compare8(RelationalCondition cond, Address left, TrustedImm32 right, RegisterID dest)
{
- // Make sure the immediate value is unsigned 8 bits.
- ASSERT(!(right.m_value & 0xFFFFFF00));
- load8(left, dataTempRegister);
- move(right, immTempRegister);
+ TrustedImm32 right8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, right);
+ MacroAssemblerHelpers::load8OnCondition(*this, cond, left, dataTempRegister);
+ move(right8, immTempRegister);
compare32(cond, dataTempRegister, immTempRegister, dest);
}
Jump branch8(RelationalCondition cond, BaseIndex left, TrustedImm32 right)
{
- ASSERT(!(right.m_value & 0xFFFFFF00));
- load8(left, dataTempRegister);
+ TrustedImm32 right8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, right);
+ MacroAssemblerHelpers::load8OnCondition(*this, cond, left, dataTempRegister);
// Be careful that the previous load8() uses immTempRegister.
// So, we need to put move() after load8().
- move(right, immTempRegister);
+ move(right8, immTempRegister);
return branch32(cond, dataTempRegister, immTempRegister);
}
@@ -1444,20 +1612,36 @@ public:
Jump branchTest32(ResultCondition cond, RegisterID reg, RegisterID mask)
{
- ASSERT((cond == Zero) || (cond == NonZero));
+ ASSERT((cond == Zero) || (cond == NonZero) || (cond == Signed));
m_assembler.andInsn(cmpTempRegister, reg, mask);
- if (cond == Zero)
+ switch (cond) {
+ case Zero:
return branchEqual(cmpTempRegister, MIPSRegisters::zero);
- return branchNotEqual(cmpTempRegister, MIPSRegisters::zero);
+ case NonZero:
+ return branchNotEqual(cmpTempRegister, MIPSRegisters::zero);
+ case Signed:
+ m_assembler.slt(cmpTempRegister, cmpTempRegister, MIPSRegisters::zero);
+ return branchNotEqual(cmpTempRegister, MIPSRegisters::zero);
+ default:
+ RELEASE_ASSERT_NOT_REACHED();
+ }
}
Jump branchTest32(ResultCondition cond, RegisterID reg, TrustedImm32 mask = TrustedImm32(-1))
{
- ASSERT((cond == Zero) || (cond == NonZero));
+ ASSERT((cond == Zero) || (cond == NonZero) || (cond == Signed));
if (mask.m_value == -1 && !m_fixedWidth) {
- if (cond == Zero)
+ switch (cond) {
+ case Zero:
return branchEqual(reg, MIPSRegisters::zero);
- return branchNotEqual(reg, MIPSRegisters::zero);
+ case NonZero:
+ return branchNotEqual(reg, MIPSRegisters::zero);
+ case Signed:
+ m_assembler.slt(cmpTempRegister, reg, MIPSRegisters::zero);
+ return branchNotEqual(cmpTempRegister, MIPSRegisters::zero);
+ default:
+ RELEASE_ASSERT_NOT_REACHED();
+ }
}
move(mask, immTempRegister);
return branchTest32(cond, reg, immTempRegister);
@@ -1477,21 +1661,24 @@ public:
Jump branchTest8(ResultCondition cond, BaseIndex address, TrustedImm32 mask = TrustedImm32(-1))
{
- load8(address, dataTempRegister);
- return branchTest32(cond, dataTempRegister, mask);
+ TrustedImm32 mask8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, mask);
+ MacroAssemblerHelpers::load8OnCondition(*this, cond, address, dataTempRegister);
+ return branchTest32(cond, dataTempRegister, mask8);
}
Jump branchTest8(ResultCondition cond, Address address, TrustedImm32 mask = TrustedImm32(-1))
{
- load8(address, dataTempRegister);
- return branchTest32(cond, dataTempRegister, mask);
+ TrustedImm32 mask8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, mask);
+ MacroAssemblerHelpers::load8OnCondition(*this, cond, address, dataTempRegister);
+ return branchTest32(cond, dataTempRegister, mask8);
}
Jump branchTest8(ResultCondition cond, AbsoluteAddress address, TrustedImm32 mask = TrustedImm32(-1))
{
+ TrustedImm32 mask8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, mask);
move(TrustedImmPtr(address.m_ptr), dataTempRegister);
- load8(Address(dataTempRegister), dataTempRegister);
- return branchTest32(cond, dataTempRegister, mask);
+ MacroAssemblerHelpers::load8OnCondition(*this, cond, Address(dataTempRegister), dataTempRegister);
+ return branchTest32(cond, dataTempRegister, mask8);
}
Jump jump()
@@ -1657,6 +1844,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 +2012,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 +2168,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);
@@ -2048,14 +2251,15 @@ public:
void test8(ResultCondition cond, Address address, TrustedImm32 mask, RegisterID dest)
{
ASSERT((cond == Zero) || (cond == NonZero));
- load8(address, dataTempRegister);
- if (mask.m_value == -1 && !m_fixedWidth) {
+ TrustedImm32 mask8 = MacroAssemblerHelpers::mask8OnCondition(*this, cond, mask);
+ MacroAssemblerHelpers::load8OnCondition(*this, cond, address, dataTempRegister);
+ if ((mask8.m_value & 0xff) == 0xff && !m_fixedWidth) {
if (cond == Zero)
m_assembler.sltiu(dest, dataTempRegister, 1);
else
m_assembler.sltu(dest, MIPSRegisters::zero, dataTempRegister);
} else {
- move(mask, immTempRegister);
+ move(mask8, immTempRegister);
m_assembler.andInsn(cmpTempRegister, dataTempRegister, immTempRegister);
if (cond == Zero)
m_assembler.sltiu(dest, cmpTempRegister, 1);
@@ -2120,6 +2324,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 +2482,7 @@ public:
#endif
}
- void loadDouble(const void* address, FPRegisterID dest)
+ void loadDouble(TrustedImmPtr address, FPRegisterID dest)
{
#if WTF_MIPS_ISA(1)
/*
@@ -2276,7 +2490,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 +2498,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 +2620,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
}
@@ -2424,6 +2638,11 @@ public:
m_assembler.movd(dest, src);
}
+ void moveZeroToDouble(FPRegisterID reg)
+ {
+ convertInt32ToDouble(MIPSRegisters::zero, reg);
+ }
+
void swapDouble(FPRegisterID fr1, FPRegisterID fr2)
{
moveDouble(fr1, fpTempRegister);
@@ -2449,7 +2668,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 +2875,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 +2959,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 +2988,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 +3012,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,10 +3032,23 @@ 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());
+ }
+
};
-}
+} // namespace JSC
#endif // ENABLE(ASSEMBLER) && CPU(MIPS)
-
-#endif // MacroAssemblerMIPS_h