Title: [225271] trunk/Source/_javascript_Core
Revision
225271
Author
utatane....@gmail.com
Date
2017-11-29 09:37:36 -0800 (Wed, 29 Nov 2017)

Log Message

[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):

Modified Paths

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());
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to