Diff
Modified: trunk/Source/_javascript_Core/ChangeLog (225270 => 225271)
--- trunk/Source/_javascript_Core/ChangeLog 2017-11-29 17:31:54 UTC (rev 225270)
+++ trunk/Source/_javascript_Core/ChangeLog 2017-11-29 17:37:36 UTC (rev 225271)
@@ -1,3 +1,38 @@
+2017-11-29 Yusuke Suzuki <utatane....@gmail.com>
+
+ [JSC] Add MacroAssembler::getEffectiveAddress in all platforms
+ https://bugs.webkit.org/show_bug.cgi?id=180070
+
+ Reviewed by Saam Barati.
+
+ This patch adds getEffectiveAddress in all JIT platforms.
+ This is abstracted version of x86 lea.
+
+ We also fix a bug in Yarr that uses branch32 instead of branchPtr for addresses.
+
+ * assembler/MacroAssemblerARM.h:
+ (JSC::MacroAssemblerARM::getEffectiveAddress):
+ * assembler/MacroAssemblerARM64.h:
+ (JSC::MacroAssemblerARM64::getEffectiveAddress):
+ (JSC::MacroAssemblerARM64::getEffectiveAddress64): Deleted.
+ * assembler/MacroAssemblerARMv7.h:
+ (JSC::MacroAssemblerARMv7::getEffectiveAddress):
+ * assembler/MacroAssemblerMIPS.h:
+ (JSC::MacroAssemblerMIPS::getEffectiveAddress):
+ * assembler/MacroAssemblerX86.h:
+ (JSC::MacroAssemblerX86::getEffectiveAddress):
+ * assembler/MacroAssemblerX86_64.h:
+ (JSC::MacroAssemblerX86_64::getEffectiveAddress):
+ (JSC::MacroAssemblerX86_64::getEffectiveAddress64): Deleted.
+ * assembler/testmasm.cpp:
+ (JSC::testGetEffectiveAddress):
+ (JSC::run):
+ * dfg/DFGSpeculativeJIT.cpp:
+ (JSC::DFG::SpeculativeJIT::compileArrayPush):
+ * yarr/YarrJIT.cpp:
+ (JSC::Yarr::YarrGenerator::tryReadUnicodeCharImpl):
+ (JSC::Yarr::YarrGenerator::tryReadUnicodeChar):
+
2017-11-29 Robin Morisset <rmoris...@apple.com>
The recursive tail call optimisation is wrong on closures
Modified: trunk/Source/_javascript_Core/assembler/MacroAssemblerARM.h (225270 => 225271)
--- trunk/Source/_javascript_Core/assembler/MacroAssemblerARM.h 2017-11-29 17:31:54 UTC (rev 225270)
+++ trunk/Source/_javascript_Core/assembler/MacroAssemblerARM.h 2017-11-29 17:37:36 UTC (rev 225271)
@@ -128,6 +128,13 @@
m_assembler.adds(dest, src, m_assembler.getImm(imm.m_value, ARMRegisters::S0));
}
+ void getEffectiveAddress(BaseIndex address, RegisterID dest)
+ {
+ m_assembler.add(dest, address.base, m_assembler.lsl(address.index, static_cast<int>(address.scale)));
+ if (address.offset)
+ add32(TrustedImm32(address.offset), dest);
+ }
+
void and32(RegisterID src, RegisterID dest)
{
m_assembler.bitAnds(dest, dest, src);
Modified: trunk/Source/_javascript_Core/assembler/MacroAssemblerARM64.h (225270 => 225271)
--- trunk/Source/_javascript_Core/assembler/MacroAssemblerARM64.h 2017-11-29 17:31:54 UTC (rev 225270)
+++ trunk/Source/_javascript_Core/assembler/MacroAssemblerARM64.h 2017-11-29 17:37:36 UTC (rev 225271)
@@ -1540,7 +1540,7 @@
m_assembler.strb(src, dest, simm);
}
- void getEffectiveAddress64(BaseIndex address, RegisterID dest)
+ void getEffectiveAddress(BaseIndex address, RegisterID dest)
{
m_assembler.add<64>(dest, address.base, address.index, ARM64Assembler::LSL, address.scale);
if (address.offset)
Modified: trunk/Source/_javascript_Core/assembler/MacroAssemblerARMv7.h (225270 => 225271)
--- trunk/Source/_javascript_Core/assembler/MacroAssemblerARMv7.h 2017-11-29 17:31:54 UTC (rev 225270)
+++ trunk/Source/_javascript_Core/assembler/MacroAssemblerARMv7.h 2017-11-29 17:37:36 UTC (rev 225271)
@@ -232,6 +232,14 @@
store32(dataTempRegister, address.m_ptr);
}
+ void getEffectiveAddress(BaseIndex address, RegisterID dest)
+ {
+ m_assembler.lsl(addressTempRegister, address.index, static_cast<int>(address.scale));
+ m_assembler.add(dest, address.base, addressTempRegister);
+ if (address.offset)
+ add32(TrustedImm32(address.offset), dest);
+ }
+
void addPtrNoFlags(TrustedImm32 imm, RegisterID srcDest)
{
add32(imm, srcDest);
Modified: trunk/Source/_javascript_Core/assembler/MacroAssemblerMIPS.h (225270 => 225271)
--- trunk/Source/_javascript_Core/assembler/MacroAssemblerMIPS.h 2017-11-29 17:31:54 UTC (rev 225270)
+++ trunk/Source/_javascript_Core/assembler/MacroAssemblerMIPS.h 2017-11-29 17:37:36 UTC (rev 225271)
@@ -270,6 +270,14 @@
m_assembler.sw(dataTempRegister, addrTempRegister, 4);
}
+ void getEffectiveAddress(BaseIndex address, RegisterID dest)
+ {
+ m_assembler.sll(addrTempRegister, address.index, address.scale);
+ m_assembler.addu(dest, addrTempRegister, address.base);
+ if (address.offset)
+ add32(TrustedImm32(address.offset), dest);
+ }
+
void and32(Address src, RegisterID dest)
{
load32(src, dataTempRegister);
Modified: trunk/Source/_javascript_Core/assembler/MacroAssemblerX86.h (225270 => 225271)
--- trunk/Source/_javascript_Core/assembler/MacroAssemblerX86.h 2017-11-29 17:31:54 UTC (rev 225270)
+++ trunk/Source/_javascript_Core/assembler/MacroAssemblerX86.h 2017-11-29 17:37:36 UTC (rev 225271)
@@ -79,6 +79,11 @@
m_assembler.adcl_im(imm.m_value >> 31, reinterpret_cast<const char*>(address.m_ptr) + sizeof(int32_t));
}
+ void getEffectiveAddress(BaseIndex address, RegisterID dest)
+ {
+ return x86Lea32(address, dest);
+ }
+
void and32(TrustedImm32 imm, AbsoluteAddress address)
{
m_assembler.andl_im(imm.m_value, address.m_ptr);
Modified: trunk/Source/_javascript_Core/assembler/MacroAssemblerX86_64.h (225270 => 225271)
--- trunk/Source/_javascript_Core/assembler/MacroAssemblerX86_64.h 2017-11-29 17:31:54 UTC (rev 225270)
+++ trunk/Source/_javascript_Core/assembler/MacroAssemblerX86_64.h 2017-11-29 17:37:36 UTC (rev 225271)
@@ -364,7 +364,7 @@
m_assembler.leaq_mr(index.offset, index.base, index.index, index.scale, dest);
}
- void getEffectiveAddress64(BaseIndex address, RegisterID dest)
+ void getEffectiveAddress(BaseIndex address, RegisterID dest)
{
return x86Lea64(address, dest);
}
Modified: trunk/Source/_javascript_Core/assembler/testmasm.cpp (225270 => 225271)
--- trunk/Source/_javascript_Core/assembler/testmasm.cpp 2017-11-29 17:31:54 UTC (rev 225270)
+++ trunk/Source/_javascript_Core/assembler/testmasm.cpp 2017-11-29 17:37:36 UTC (rev 225271)
@@ -171,6 +171,18 @@
}), 42);
}
+void testGetEffectiveAddress(size_t pointer, ptrdiff_t length, int32_t offset, CCallHelpers::Scale scale)
+{
+ CHECK_EQ(compileAndRun<size_t>([=] (CCallHelpers& jit) {
+ jit.emitFunctionPrologue();
+ jit.move(CCallHelpers::TrustedImmPtr(bitwise_cast<void*>(pointer)), GPRInfo::regT0);
+ jit.move(CCallHelpers::TrustedImmPtr(bitwise_cast<void*>(length)), GPRInfo::regT1);
+ jit.getEffectiveAddress(CCallHelpers::BaseIndex(GPRInfo::regT0, GPRInfo::regT1, scale, offset), GPRInfo::returnValueGPR);
+ jit.emitFunctionEpilogue();
+ jit.ret();
+ }), pointer + offset + (1 << static_cast<int>(scale)) * length);
+}
+
// branchTruncateDoubleToInt32(), when encountering Infinity, -Infinity or a
// Nan, should either yield 0 in dest or fail.
void testBranchTruncateDoubleToInt32(double val, int32_t expected)
@@ -730,6 +742,8 @@
};
RUN(testSimple());
+ RUN(testGetEffectiveAddress(0xff00, 42, 8, CCallHelpers::TimesEight));
+ RUN(testGetEffectiveAddress(0xff00, -200, -300, CCallHelpers::TimesEight));
RUN(testBranchTruncateDoubleToInt32(0, 0));
RUN(testBranchTruncateDoubleToInt32(42, 42));
RUN(testBranchTruncateDoubleToInt32(42.7, 42));
Modified: trunk/Source/_javascript_Core/dfg/DFGSpeculativeJIT.cpp (225270 => 225271)
--- trunk/Source/_javascript_Core/dfg/DFGSpeculativeJIT.cpp 2017-11-29 17:31:54 UTC (rev 225270)
+++ trunk/Source/_javascript_Core/dfg/DFGSpeculativeJIT.cpp 2017-11-29 17:37:36 UTC (rev 225271)
@@ -7973,16 +7973,8 @@
#endif
auto getStorageBufferAddress = [&] (GPRReg storageGPR, GPRReg indexGPR, int32_t offset, GPRReg bufferGPR) {
-#if USE(JSVALUE32_64)
static_assert(sizeof(JSValue) == 8 && 1 << 3 == 8, "This is strongly assumed in the code below.");
- m_jit.move(indexGPR, bufferGPR);
- m_jit.lshift32(TrustedImm32(3), bufferGPR);
- m_jit.add32(storageGPR, bufferGPR);
- if (offset)
- m_jit.add32(TrustedImm32(offset), bufferGPR);
-#else
- m_jit.getEffectiveAddress64(MacroAssembler::BaseIndex(storageGPR, indexGPR, MacroAssembler::TimesEight, offset), bufferGPR);
-#endif
+ m_jit.getEffectiveAddress(MacroAssembler::BaseIndex(storageGPR, indexGPR, MacroAssembler::TimesEight, offset), bufferGPR);
};
switch (node->arrayMode().type()) {
Modified: trunk/Source/_javascript_Core/yarr/YarrJIT.cpp (225270 => 225271)
--- trunk/Source/_javascript_Core/yarr/YarrJIT.cpp 2017-11-29 17:31:54 UTC (rev 225270)
+++ trunk/Source/_javascript_Core/yarr/YarrJIT.cpp 2017-11-29 17:37:36 UTC (rev 225271)
@@ -357,8 +357,8 @@
and32(surrogateTagMask, resultReg, regUnicodeTemp);
notUnicode.append(branch32(NotEqual, regUnicodeTemp, leadingSurrogateTag));
addPtr(TrustedImm32(2), regUnicodeInputAndTrail);
- getEffectiveAddress64(BaseIndex(input, length, TimesTwo), regUnicodeTemp);
- notUnicode.append(branch32(AboveOrEqual, regUnicodeInputAndTrail, regUnicodeTemp));
+ getEffectiveAddress(BaseIndex(input, length, TimesTwo), regUnicodeTemp);
+ notUnicode.append(branchPtr(AboveOrEqual, regUnicodeInputAndTrail, regUnicodeTemp));
load16Unaligned(Address(regUnicodeInputAndTrail), regUnicodeInputAndTrail);
and32(surrogateTagMask, regUnicodeInputAndTrail, regUnicodeTemp);
notUnicode.append(branch32(NotEqual, regUnicodeTemp, trailingSurrogateTag));
@@ -374,7 +374,7 @@
{
ASSERT(m_charSize == Char16);
- getEffectiveAddress64(address, regUnicodeInputAndTrail);
+ getEffectiveAddress(address, regUnicodeInputAndTrail);
if (resultReg == regT0)
m_tryReadUnicodeCharacterCalls.append(nearCall());