Title: [287311] trunk/Source/_javascript_Core
Revision
287311
Author
commit-qu...@webkit.org
Date
2021-12-21 04:54:37 -0800 (Tue, 21 Dec 2021)

Log Message

[RISCV64] Add or enable missing CPU(RISCV64) codepaths in baseline JIT
https://bugs.webkit.org/show_bug.cgi?id=234551

Patch by Zan Dobersek <zdober...@igalia.com> on 2021-12-21
Reviewed by Yusuke Suzuki.

Sprinkle the necessary CPU(RISCV64) build guards as well as additional
RISCV64-specific codepaths encapsualted by those build guards in the
baseline JIT code. In many cases we can align with the code that ARM64
is already using.

In InlineAccess, the byte-sizes for access and replacement operations
are based on a mix of educated guessing and aggressive testing.

In baseline JIT, we can usually adopt what ARM64 already does since the
similarities are big enough.

* bytecode/InlineAccess.h: The sizes here are based on the estimated
count of necessary instructions for access or replacement, and were
tested with the enabled crash-inducing fallback in linkCodeInline().
(JSC::InlineAccess::sizeForPropertyAccess):
(JSC::InlineAccess::sizeForPropertyReplace):
(JSC::InlineAccess::sizeForLengthAccess):
* jit/AssemblyHelpers.cpp:
(JSC::AssemblyHelpers::emitLoadStructure):
(JSC::AssemblyHelpers::debugCall):
* jit/AssemblyHelpers.h:
(JSC::AssemblyHelpers::emitSaveThenMaterializeTagRegisters):
(JSC::AssemblyHelpers::emitRestoreSavedTagRegisters):
(JSC::AssemblyHelpers::prologueStackPointerDelta):
(JSC::AssemblyHelpers::emitFunctionPrologue):
(JSC::AssemblyHelpers::emitFunctionEpilogueWithEmptyFrame):
(JSC::AssemblyHelpers::emitFunctionEpilogue):
(JSC::AssemblyHelpers::preserveReturnAddressAfterCall):
(JSC::AssemblyHelpers::restoreReturnAddressBeforeReturn):
* jit/CCallHelpers.h:
(JSC::CCallHelpers::prepareForTailCallSlow):
* jit/CallFrameShuffler.cpp:
(JSC::CallFrameShuffler::prepareForTailCall):
* jit/JITPropertyAccess.cpp:
(JSC::JIT::slow_op_resolve_scopeGenerator):
(JSC::JIT::slow_op_get_from_scopeGenerator):
* jit/RegisterSet.cpp:
(JSC::RegisterSet::macroScratchRegisters):
(JSC::RegisterSet::dfgCalleeSaveRegisters):
(JSC::RegisterSet::ftlCalleeSaveRegisters):
* jit/ThunkGenerators.cpp:
(JSC::popThunkStackPreservesAndHandleExceptionGenerator):

Modified Paths

Diff

Modified: trunk/Source/_javascript_Core/ChangeLog (287310 => 287311)


--- trunk/Source/_javascript_Core/ChangeLog	2021-12-21 12:42:19 UTC (rev 287310)
+++ trunk/Source/_javascript_Core/ChangeLog	2021-12-21 12:54:37 UTC (rev 287311)
@@ -1,5 +1,55 @@
 2021-12-21  Zan Dobersek  <zdober...@igalia.com>
 
+        [RISCV64] Add or enable missing CPU(RISCV64) codepaths in baseline JIT
+        https://bugs.webkit.org/show_bug.cgi?id=234551
+
+        Reviewed by Yusuke Suzuki.
+
+        Sprinkle the necessary CPU(RISCV64) build guards as well as additional
+        RISCV64-specific codepaths encapsualted by those build guards in the
+        baseline JIT code. In many cases we can align with the code that ARM64
+        is already using.
+
+        In InlineAccess, the byte-sizes for access and replacement operations
+        are based on a mix of educated guessing and aggressive testing.
+
+        In baseline JIT, we can usually adopt what ARM64 already does since the
+        similarities are big enough.
+
+        * bytecode/InlineAccess.h: The sizes here are based on the estimated
+        count of necessary instructions for access or replacement, and were
+        tested with the enabled crash-inducing fallback in linkCodeInline().
+        (JSC::InlineAccess::sizeForPropertyAccess):
+        (JSC::InlineAccess::sizeForPropertyReplace):
+        (JSC::InlineAccess::sizeForLengthAccess):
+        * jit/AssemblyHelpers.cpp:
+        (JSC::AssemblyHelpers::emitLoadStructure):
+        (JSC::AssemblyHelpers::debugCall):
+        * jit/AssemblyHelpers.h:
+        (JSC::AssemblyHelpers::emitSaveThenMaterializeTagRegisters):
+        (JSC::AssemblyHelpers::emitRestoreSavedTagRegisters):
+        (JSC::AssemblyHelpers::prologueStackPointerDelta):
+        (JSC::AssemblyHelpers::emitFunctionPrologue):
+        (JSC::AssemblyHelpers::emitFunctionEpilogueWithEmptyFrame):
+        (JSC::AssemblyHelpers::emitFunctionEpilogue):
+        (JSC::AssemblyHelpers::preserveReturnAddressAfterCall):
+        (JSC::AssemblyHelpers::restoreReturnAddressBeforeReturn):
+        * jit/CCallHelpers.h:
+        (JSC::CCallHelpers::prepareForTailCallSlow):
+        * jit/CallFrameShuffler.cpp:
+        (JSC::CallFrameShuffler::prepareForTailCall):
+        * jit/JITPropertyAccess.cpp:
+        (JSC::JIT::slow_op_resolve_scopeGenerator):
+        (JSC::JIT::slow_op_get_from_scopeGenerator):
+        * jit/RegisterSet.cpp:
+        (JSC::RegisterSet::macroScratchRegisters):
+        (JSC::RegisterSet::dfgCalleeSaveRegisters):
+        (JSC::RegisterSet::ftlCalleeSaveRegisters):
+        * jit/ThunkGenerators.cpp:
+        (JSC::popThunkStackPreservesAndHandleExceptionGenerator):
+
+2021-12-21  Zan Dobersek  <zdober...@igalia.com>
+
         [RISCV64] Add missing MacroAssemblerRISCV64 floating-point rounding, comparison methods
         https://bugs.webkit.org/show_bug.cgi?id=234475
 

Modified: trunk/Source/_javascript_Core/bytecode/InlineAccess.h (287310 => 287311)


--- trunk/Source/_javascript_Core/bytecode/InlineAccess.h	2021-12-21 12:42:19 UTC (rev 287310)
+++ trunk/Source/_javascript_Core/bytecode/InlineAccess.h	2021-12-21 12:54:37 UTC (rev 287311)
@@ -54,6 +54,8 @@
         return 48;
 #elif CPU(MIPS)
         return 72;
+#elif CPU(RISCV64)
+        return 44;
 #else
 #error "unsupported platform"
 #endif
@@ -72,6 +74,8 @@
         return 48;
 #elif CPU(MIPS)
         return 72;
+#elif CPU(RISCV64)
+        return 52;
 #else
 #error "unsupported platform"
 #endif
@@ -93,6 +97,8 @@
         size_t size = 30;
 #elif CPU(MIPS)
         size_t size = 56;
+#elif CPU(RISCV64)
+        size_t size = 60;
 #else
 #error "unsupported platform"
 #endif

Modified: trunk/Source/_javascript_Core/jit/AssemblyHelpers.cpp (287310 => 287311)


--- trunk/Source/_javascript_Core/jit/AssemblyHelpers.cpp	2021-12-21 12:42:19 UTC (rev 287310)
+++ trunk/Source/_javascript_Core/jit/AssemblyHelpers.cpp	2021-12-21 12:54:37 UTC (rev 287311)
@@ -392,7 +392,7 @@
 void AssemblyHelpers::emitLoadStructure(VM& vm, RegisterID source, RegisterID dest, RegisterID scratch)
 {
 #if USE(JSVALUE64)
-#if CPU(ARM64)
+#if CPU(ARM64) || CPU(RISCV64)
     RegisterID scratch2 = dataTempRegister;
 #elif CPU(X86_64)
     RegisterID scratch2 = scratchRegister();
@@ -1069,7 +1069,7 @@
         storeDouble(FPRInfo::toRegister(i), Address(GPRInfo::regT0));
     }
 
-#if CPU(X86_64) || CPU(ARM_THUMB2) || CPU(ARM64) || CPU(MIPS)
+#if CPU(X86_64) || CPU(ARM_THUMB2) || CPU(ARM64) || CPU(MIPS) || CPU(RISCV64)
     move(TrustedImmPtr(buffer), GPRInfo::argumentGPR2);
     move(TrustedImmPtr(argument), GPRInfo::argumentGPR1);
     move(GPRInfo::callFrameRegister, GPRInfo::argumentGPR0);

Modified: trunk/Source/_javascript_Core/jit/AssemblyHelpers.h (287310 => 287311)


--- trunk/Source/_javascript_Core/jit/AssemblyHelpers.h	2021-12-21 12:42:19 UTC (rev 287310)
+++ trunk/Source/_javascript_Core/jit/AssemblyHelpers.h	2021-12-21 12:54:37 UTC (rev 287311)
@@ -348,7 +348,7 @@
     void emitSaveThenMaterializeTagRegisters()
     {
 #if USE(JSVALUE64)
-#if CPU(ARM64)
+#if CPU(ARM64) || CPU(RISCV64)
         pushPair(GPRInfo::numberTagRegister, GPRInfo::notCellMaskRegister);
 #else
         push(GPRInfo::numberTagRegister);
@@ -366,7 +366,7 @@
     void emitRestoreSavedTagRegisters()
     {
 #if USE(JSVALUE64)
-#if CPU(ARM64)
+#if CPU(ARM64) || CPU(RISCV64)
         popPair(GPRInfo::numberTagRegister, GPRInfo::notCellMaskRegister);
 #else
         pop(GPRInfo::notCellMaskRegister);
@@ -594,6 +594,46 @@
     }
 #endif
 
+#if CPU(RISCV64)
+    static constexpr size_t prologueStackPointerDelta()
+    {
+        // Prologue saves the framePointerRegister and returnAddressRegister
+        return 2 * sizeof(void*);
+    }
+
+    void emitFunctionPrologue()
+    {
+        pushPair(framePointerRegister, linkRegister);
+        move(stackPointerRegister, framePointerRegister);
+    }
+
+    void emitFunctionEpilogueWithEmptyFrame()
+    {
+        popPair(framePointerRegister, linkRegister);
+    }
+
+    void emitFunctionEpilogue()
+    {
+        move(framePointerRegister, stackPointerRegister);
+        emitFunctionEpilogueWithEmptyFrame();
+    }
+
+    ALWAYS_INLINE void preserveReturnAddressAfterCall(RegisterID reg)
+    {
+        move(linkRegister, reg);
+    }
+
+    ALWAYS_INLINE void restoreReturnAddressBeforeReturn(RegisterID reg)
+    {
+        move(reg, linkRegister);
+    }
+
+    ALWAYS_INLINE void restoreReturnAddressBeforeReturn(Address address)
+    {
+        loadPtr(address, linkRegister);
+    }
+#endif
+
     void emitGetFromCallFrameHeaderPtr(VirtualRegister entry, GPRReg to, GPRReg from = GPRInfo::callFrameRegister)
     {
         ASSERT(entry.isHeader());

Modified: trunk/Source/_javascript_Core/jit/CCallHelpers.h (287310 => 287311)


--- trunk/Source/_javascript_Core/jit/CCallHelpers.h	2021-12-21 12:42:19 UTC (rev 287310)
+++ trunk/Source/_javascript_Core/jit/CCallHelpers.h	2021-12-21 12:54:37 UTC (rev 287311)
@@ -801,7 +801,7 @@
 
         // We don't need the current frame beyond this point. Masquerade as our
         // caller.
-#if CPU(ARM_THUMB2) || CPU(ARM64)
+#if CPU(ARM_THUMB2) || CPU(ARM64) || CPU(RISCV64)
         loadPtr(Address(framePointerRegister, CallFrame::returnPCOffset()), linkRegister);
         subPtr(TrustedImm32(2 * sizeof(void*)), newFrameSizeGPR);
 #if CPU(ARM64E)

Modified: trunk/Source/_javascript_Core/jit/CallFrameShuffler.cpp (287310 => 287311)


--- trunk/Source/_javascript_Core/jit/CallFrameShuffler.cpp	2021-12-21 12:42:19 UTC (rev 287310)
+++ trunk/Source/_javascript_Core/jit/CallFrameShuffler.cpp	2021-12-21 12:54:37 UTC (rev 287311)
@@ -387,7 +387,7 @@
     // sp will point to head1 since the callee's prologue pushes
     // the call frame and link register.
     m_newFrameOffset = -1;
-#elif CPU(ARM64)
+#elif CPU(ARM64) || CPU(RISCV64)
     // We load the frame pointer and link register manually. We
     // could ask the algorithm to load the link register for us
     // (which would allow for its use as an extra temporary), but
@@ -438,7 +438,7 @@
         m_newFrameBase);
 
     // We load the link register manually for architectures that have one
-#if CPU(ARM_THUMB2) || CPU(ARM64)
+#if CPU(ARM_THUMB2) || CPU(ARM64) || CPU(RISCV64)
     m_jit.loadPtr(MacroAssembler::Address(MacroAssembler::framePointerRegister, CallFrame::returnPCOffset()),
         MacroAssembler::linkRegister);
 #if CPU(ARM64E)

Modified: trunk/Source/_javascript_Core/jit/JITPropertyAccess.cpp (287310 => 287311)


--- trunk/Source/_javascript_Core/jit/JITPropertyAccess.cpp	2021-12-21 12:42:19 UTC (rev 287310)
+++ trunk/Source/_javascript_Core/jit/JITPropertyAccess.cpp	2021-12-21 12:54:37 UTC (rev 287311)
@@ -2139,7 +2139,7 @@
     // The fast path already pushed the return address.
 #if CPU(X86_64)
     jit.push(X86Registers::ebp);
-#elif CPU(ARM64) || CPU(ARM_THUMB2)
+#elif CPU(ARM64) || CPU(ARM_THUMB2) || CPU(RISCV64)
     jit.pushPair(framePointerRegister, linkRegister);
 #elif CPU(MIPS)
     jit.pushPair(framePointerRegister, returnAddressRegister);
@@ -2167,7 +2167,7 @@
 
 #if CPU(X86_64)
     jit.pop(X86Registers::ebp);
-#elif CPU(ARM64) || CPU(ARM_THUMB2)
+#elif CPU(ARM64) || CPU(ARM_THUMB2) || CPU(RISCV64)
     jit.popPair(framePointerRegister, linkRegister);
 #elif CPU(MIPS)
     jit.popPair(framePointerRegister, returnAddressRegister);
@@ -2373,7 +2373,7 @@
 
 #if CPU(X86_64)
     jit.push(X86Registers::ebp);
-#elif CPU(ARM64) || CPU(ARM_THUMB2)
+#elif CPU(ARM64) || CPU(ARM_THUMB2) || CPU(RISCV64)
     jit.pushPair(framePointerRegister, linkRegister);
 #elif CPU(MIPS)
     jit.pushPair(framePointerRegister, returnAddressRegister);
@@ -2422,7 +2422,7 @@
 
 #if CPU(X86_64)
     jit.pop(X86Registers::ebp);
-#elif CPU(ARM64) || CPU(ARM_THUMB2)
+#elif CPU(ARM64) || CPU(ARM_THUMB2) || CPU(RISCV64)
     jit.popPair(framePointerRegister, linkRegister);
 #elif CPU(MIPS)
     jit.popPair(framePointerRegister, returnAddressRegister);

Modified: trunk/Source/_javascript_Core/jit/RegisterSet.cpp (287310 => 287311)


--- trunk/Source/_javascript_Core/jit/RegisterSet.cpp	2021-12-21 12:42:19 UTC (rev 287310)
+++ trunk/Source/_javascript_Core/jit/RegisterSet.cpp	2021-12-21 12:54:37 UTC (rev 287311)
@@ -92,7 +92,7 @@
 {
 #if CPU(X86_64)
     return RegisterSet(MacroAssembler::s_scratchRegister);
-#elif CPU(ARM64)
+#elif CPU(ARM64) || CPU(RISCV64)
     return RegisterSet(MacroAssembler::dataTempRegister, MacroAssembler::memoryTempRegister);
 #elif CPU(MIPS)
     RegisterSet result;
@@ -253,7 +253,7 @@
 #elif CPU(ARM_THUMB2) || CPU(MIPS)
     result.set(GPRInfo::regCS0);
     result.set(GPRInfo::regCS1);
-#elif CPU(ARM64)
+#elif CPU(ARM64) || CPU(RISCV64)
     static_assert(GPRInfo::regCS8 == GPRInfo::numberTagRegister, "");
     static_assert(GPRInfo::regCS9 == GPRInfo::notCellMaskRegister, "");
     result.set(GPRInfo::regCS8);
@@ -298,6 +298,32 @@
     result.set(FPRInfo::fpRegCS5);
     result.set(FPRInfo::fpRegCS6);
     result.set(FPRInfo::fpRegCS7);
+#elif CPU(RISCV64)
+    result.set(GPRInfo::regCS0);
+    result.set(GPRInfo::regCS1);
+    result.set(GPRInfo::regCS2);
+    result.set(GPRInfo::regCS3);
+    result.set(GPRInfo::regCS4);
+    result.set(GPRInfo::regCS5);
+    result.set(GPRInfo::regCS6);
+    result.set(GPRInfo::regCS7);
+    static_assert(GPRInfo::regCS8 == GPRInfo::numberTagRegister, "");
+    static_assert(GPRInfo::regCS9 == GPRInfo::notCellMaskRegister, "");
+    result.set(GPRInfo::regCS8);
+    result.set(GPRInfo::regCS9);
+    result.set(GPRInfo::regCS10);
+    result.set(FPRInfo::fpRegCS0);
+    result.set(FPRInfo::fpRegCS1);
+    result.set(FPRInfo::fpRegCS2);
+    result.set(FPRInfo::fpRegCS3);
+    result.set(FPRInfo::fpRegCS4);
+    result.set(FPRInfo::fpRegCS5);
+    result.set(FPRInfo::fpRegCS6);
+    result.set(FPRInfo::fpRegCS7);
+    result.set(FPRInfo::fpRegCS8);
+    result.set(FPRInfo::fpRegCS9);
+    result.set(FPRInfo::fpRegCS10);
+    result.set(FPRInfo::fpRegCS11);
 #else
     UNREACHABLE_FOR_PLATFORM();
 #endif

Modified: trunk/Source/_javascript_Core/jit/ThunkGenerators.cpp (287310 => 287311)


--- trunk/Source/_javascript_Core/jit/ThunkGenerators.cpp	2021-12-21 12:42:19 UTC (rev 287310)
+++ trunk/Source/_javascript_Core/jit/ThunkGenerators.cpp	2021-12-21 12:54:37 UTC (rev 287311)
@@ -85,7 +85,7 @@
 
 #if CPU(X86_64)
     jit.addPtr(CCallHelpers::TrustedImm32(2 * sizeof(CPURegister)), X86Registers::esp);
-#elif CPU(ARM64) || CPU(ARM_THUMB2)
+#elif CPU(ARM64) || CPU(ARM_THUMB2) || CPU(RISCV64)
     jit.popPair(CCallHelpers::framePointerRegister, CCallHelpers::linkRegister);
 #elif CPU(MIPS)
     jit.popPair(CCallHelpers::framePointerRegister, CCallHelpers::returnAddressRegister);
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to