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);