Log Message
[RISCV64] Add RISCV64 support in YARR https://bugs.webkit.org/show_bug.cgi?id=234547
Patch by Zan Dobersek <[email protected]> on 2021-12-22 Reviewed by Yusuke Suzuki. Source/_javascript_Core: Add RISCV64 support to YARR. This covers providing the required register and immediate defitinitions, as well as also enabling codepaths shared with other 64-bit architectures. * assembler/MacroAssemblerRISCV64.h: (JSC::MacroAssemblerRISCV64::load16): YARR JIT also requires a load16() overload that loads from an ExtendedAddress. * yarr/YarrJIT.cpp: * yarr/YarrJITRegisters.h: Source/WTF: * wtf/PlatformEnable.h: Also enable different YARR-related flags for RISCV64.
Modified Paths
Diff
Modified: trunk/Source/_javascript_Core/ChangeLog (287366 => 287367)
--- trunk/Source/_javascript_Core/ChangeLog 2021-12-22 19:12:30 UTC (rev 287366)
+++ trunk/Source/_javascript_Core/ChangeLog 2021-12-22 19:20:14 UTC (rev 287367)
@@ -1,5 +1,22 @@
2021-12-22 Zan Dobersek <[email protected]>
+ [RISCV64] Add RISCV64 support in YARR
+ https://bugs.webkit.org/show_bug.cgi?id=234547
+
+ Reviewed by Yusuke Suzuki.
+
+ Add RISCV64 support to YARR. This covers providing the required register
+ and immediate defitinitions, as well as also enabling codepaths shared
+ with other 64-bit architectures.
+
+ * assembler/MacroAssemblerRISCV64.h:
+ (JSC::MacroAssemblerRISCV64::load16): YARR JIT also requires a load16()
+ overload that loads from an ExtendedAddress.
+ * yarr/YarrJIT.cpp:
+ * yarr/YarrJITRegisters.h:
+
+2021-12-22 Zan Dobersek <[email protected]>
+
[RISCV64] Fix RISCV64Assembler::ImmediateDecomposition in debug builds
https://bugs.webkit.org/show_bug.cgi?id=234594
Modified: trunk/Source/_javascript_Core/assembler/MacroAssemblerRISCV64.h (287366 => 287367)
--- trunk/Source/_javascript_Core/assembler/MacroAssemblerRISCV64.h 2021-12-22 19:12:30 UTC (rev 287366)
+++ trunk/Source/_javascript_Core/assembler/MacroAssemblerRISCV64.h 2021-12-22 19:20:14 UTC (rev 287367)
@@ -669,6 +669,15 @@
m_assembler.lhuInsn(dest, temp.memory(), Imm::I<0>());
}
+ void load16(ExtendedAddress address, RegisterID dest)
+ {
+ auto temp = temps<Data, Memory>();
+ loadImmediate(TrustedImm64(int64_t(address.offset)), temp.memory());
+ m_assembler.slliInsn<1>(temp.data(), address.base);
+ m_assembler.addInsn(temp.memory(), temp.memory(), temp.data());
+ m_assembler.lhuInsn(dest, temp.memory(), Imm::I<0>());
+ }
+
void load16Unaligned(Address address, RegisterID dest)
{
load16(address, dest);
Modified: trunk/Source/_javascript_Core/yarr/YarrJIT.cpp (287366 => 287367)
--- trunk/Source/_javascript_Core/yarr/YarrJIT.cpp 2021-12-22 19:12:30 UTC (rev 287366)
+++ trunk/Source/_javascript_Core/yarr/YarrJIT.cpp 2021-12-22 19:20:14 UTC (rev 287367)
@@ -678,7 +678,7 @@
m_jit.poke(imm, frameLocation);
}
-#if CPU(ARM64) || CPU(X86_64)
+#if CPU(ARM64) || CPU(X86_64) || CPU(RISCV64)
void storeToFrame(MacroAssembler::TrustedImmPtr imm, unsigned frameLocation)
{
m_jit.poke(imm, frameLocation);
@@ -1426,7 +1426,7 @@
}
const MacroAssembler::RegisterID character = m_regs.regT0;
-#if CPU(X86_64) || CPU(ARM64)
+#if CPU(X86_64) || CPU(ARM64) || CPU(RISCV64)
unsigned maxCharactersAtOnce = m_charSize == CharSize::Char8 ? 8 : 4;
#else
unsigned maxCharactersAtOnce = m_charSize == CharSize::Char8 ? 4 : 2;
@@ -1516,7 +1516,7 @@
op.m_jumps.append(m_jit.branch32WithUnalignedHalfWords(MacroAssembler::NotEqual, negativeOffsetIndexedAddress(offset, character), MacroAssembler::TrustedImm32(characters)));
};
-#if CPU(X86_64) || CPU(ARM64)
+#if CPU(X86_64) || CPU(ARM64) || CPU(RISCV64)
auto check8 = [&] (Checked<unsigned> offset, uint64_t characters, uint64_t mask) {
m_jit.load64(negativeOffsetIndexedAddress(offset, character), character);
if (mask)
@@ -1543,7 +1543,7 @@
check4(m_checkedOffset - startTermPosition, allCharacters & 0xffffffff, ignoreCaseMask & 0xffffffff);
return;
}
-#if CPU(X86_64) || CPU(ARM64)
+#if CPU(X86_64) || CPU(ARM64) || CPU(RISCV64)
case 5: {
check4(m_checkedOffset - startTermPosition, allCharacters & 0xffffffff, ignoreCaseMask & 0xffffffff);
check1(m_checkedOffset - startTermPosition - 4, (allCharacters >> 32) & 0xff);
@@ -1582,7 +1582,7 @@
op.m_jumps.append(m_jit.branch32WithUnalignedHalfWords(MacroAssembler::NotEqual, negativeOffsetIndexedAddress(offset, character), MacroAssembler::TrustedImm32(characters)));
};
-#if CPU(X86_64) || CPU(ARM64)
+#if CPU(X86_64) || CPU(ARM64) || CPU(RISCV64)
auto check4 = [&] (Checked<unsigned> offset, uint64_t characters, uint64_t mask) {
m_jit.load64(negativeOffsetIndexedAddress(offset, character), character);
if (mask)
@@ -1599,7 +1599,7 @@
case 2:
check2(m_checkedOffset - startTermPosition, allCharacters & 0xffffffff, ignoreCaseMask & 0xffffffff);
return;
-#if CPU(X86_64) || CPU(ARM64)
+#if CPU(X86_64) || CPU(ARM64) || CPU(RISCV64)
case 3:
check2(m_checkedOffset - startTermPosition, allCharacters & 0xffffffff, ignoreCaseMask & 0xffffffff);
check1(m_checkedOffset - startTermPosition - 2, (allCharacters >> 32) & 0xffff);
@@ -2368,7 +2368,7 @@
m_jit.move(MacroAssembler::TrustedImmPtr(pointer), m_regs.regT1);
auto loopHead = m_jit.label();
readCharacter(m_checkedOffset - endIndex + 1, m_regs.regT0);
-#if CPU(ARM64)
+#if CPU(ARM64) || CPU(RISCV64)
static_assert(sizeof(BoyerMooreBitmap::Map::WordType) == sizeof(uint64_t));
static_assert(1 << 6 == 64);
static_assert(1 << (6 + 1) == BoyerMooreBitmap::Map::size());
@@ -4007,6 +4007,9 @@
m_jit.push(ARMRegisters::r6);
m_jit.push(ARMRegisters::r8);
m_jit.push(ARMRegisters::r10);
+#elif CPU(RISCV64)
+ if (m_decodeSurrogatePairs)
+ m_jit.pushPair(MacroAssembler::framePointerRegister, MacroAssembler::linkRegister);
#elif CPU(MIPS)
// Do nothing.
#endif
@@ -4061,6 +4064,9 @@
m_jit.pop(ARMRegisters::r6);
m_jit.pop(ARMRegisters::r5);
m_jit.pop(ARMRegisters::r4);
+#elif CPU(RISCV64)
+ if (m_decodeSurrogatePairs)
+ m_jit.popPair(MacroAssembler::framePointerRegister, MacroAssembler::linkRegister);
#elif CPU(MIPS)
// Do nothing
#endif
@@ -4717,7 +4723,7 @@
}
#if ENABLE(YARR_JIT_REGEXP_TEST_INLINE)
-#if !CPU(ARM64) && !CPU(X86_64) || OS(WINDOWS)
+#if !(CPU(ARM64) || (CPU(X86_64) && !OS(WINDOWS)) || CPU(RISCV64))
#error "No support for inlined JIT'ing of RegExp.test for this CPU / OS combination."
#endif
Modified: trunk/Source/_javascript_Core/yarr/YarrJITRegisters.h (287366 => 287367)
--- trunk/Source/_javascript_Core/yarr/YarrJITRegisters.h 2021-12-22 19:12:30 UTC (rev 287366)
+++ trunk/Source/_javascript_Core/yarr/YarrJITRegisters.h 2021-12-22 19:20:14 UTC (rev 287367)
@@ -142,6 +142,33 @@
static constexpr MacroAssembler::TrustedImm32 leadingSurrogateTag = MacroAssembler::TrustedImm32(0xd800);
static constexpr MacroAssembler::TrustedImm32 trailingSurrogateTag = MacroAssembler::TrustedImm32(0xdc00);
static constexpr MacroAssembler::TrustedImm32 surrogateTagMask = MacroAssembler::TrustedImm32(0xfffffc00);
+#elif CPU(RISCV64)
+ // Argument registers
+ static constexpr GPRReg input = RISCV64Registers::x10;
+ static constexpr GPRReg index = RISCV64Registers::x11;
+ static constexpr GPRReg length = RISCV64Registers::x12;
+ static constexpr GPRReg output = RISCV64Registers::x13;
+ static constexpr GPRReg matchingContext = RISCV64Registers::x14;
+ static constexpr GPRReg freelistRegister = RISCV64Registers::x14; // Loaded from the MatchingContextHolder in the prologue.
+ static constexpr GPRReg freelistSizeRegister = RISCV64Registers::x15; // Only used during initialization.
+
+ // Scratch registers
+ static constexpr GPRReg regT0 = RISCV64Registers::x16;
+ static constexpr GPRReg regT1 = RISCV64Registers::x17;
+ static constexpr GPRReg regT2 = RISCV64Registers::x5;
+ static constexpr GPRReg remainingMatchCount = RISCV64Registers::x6;
+ static constexpr GPRReg regUnicodeInputAndTrail = RISCV64Registers::x7;
+ static constexpr GPRReg unicodeTemp = RISCV64Registers::x15;
+ static constexpr GPRReg initialStart = RISCV64Registers::x28;
+ static constexpr GPRReg endOfStringAddress = RISCV64Registers::x29;
+
+ static constexpr GPRReg returnRegister = RISCV64Registers::x10;
+ static constexpr GPRReg returnRegister2 = RISCV64Registers::x11;
+
+ static constexpr MacroAssembler::TrustedImm32 supplementaryPlanesBase = MacroAssembler::TrustedImm32(0x10000);
+ static constexpr MacroAssembler::TrustedImm32 leadingSurrogateTag = MacroAssembler::TrustedImm32(0xd800);
+ static constexpr MacroAssembler::TrustedImm32 trailingSurrogateTag = MacroAssembler::TrustedImm32(0xdc00);
+ static constexpr MacroAssembler::TrustedImm32 surrogateTagMask = MacroAssembler::TrustedImm32(0xfffffc00);
#endif
};
Modified: trunk/Source/WTF/ChangeLog (287366 => 287367)
--- trunk/Source/WTF/ChangeLog 2021-12-22 19:12:30 UTC (rev 287366)
+++ trunk/Source/WTF/ChangeLog 2021-12-22 19:20:14 UTC (rev 287367)
@@ -1,3 +1,12 @@
+2021-12-22 Zan Dobersek <[email protected]>
+
+ [RISCV64] Add RISCV64 support in YARR
+ https://bugs.webkit.org/show_bug.cgi?id=234547
+
+ Reviewed by Yusuke Suzuki.
+
+ * wtf/PlatformEnable.h: Also enable different YARR-related flags for RISCV64.
+
2021-12-22 Simon Fraser <[email protected]>
Preferences that read from NSUserDefaults need to be initialied from platformInitializeStore()
Modified: trunk/Source/WTF/wtf/PlatformEnable.h (287366 => 287367)
--- trunk/Source/WTF/wtf/PlatformEnable.h 2021-12-22 19:12:30 UTC (rev 287366)
+++ trunk/Source/WTF/wtf/PlatformEnable.h 2021-12-22 19:20:14 UTC (rev 287367)
@@ -749,17 +749,17 @@
#endif
/* Enable JIT'ing Regular Expressions that have nested parenthesis . */
-#if ENABLE(YARR_JIT) && (CPU(ARM64) || (CPU(X86_64) && !OS(WINDOWS)))
+#if ENABLE(YARR_JIT) && (CPU(ARM64) || (CPU(X86_64) && !OS(WINDOWS)) || CPU(RISCV64))
#define ENABLE_YARR_JIT_ALL_PARENS_EXPRESSIONS 1
#define ENABLE_YARR_JIT_REGEXP_TEST_INLINE 1
#endif
/* Enable JIT'ing Regular Expressions that have nested back references. */
-#if ENABLE(YARR_JIT) && (CPU(ARM64) || (CPU(X86_64) && !OS(WINDOWS)))
+#if ENABLE(YARR_JIT) && (CPU(ARM64) || (CPU(X86_64) && !OS(WINDOWS)) || CPU(RISCV64))
#define ENABLE_YARR_JIT_BACKREFERENCES 1
#endif
-#if CPU(ARM64) || CPU(X86_64)
+#if ENABLE(YARR_JIT) && (CPU(ARM64) || CPU(X86_64) || CPU(RISCV64))
#define ENABLE_YARR_JIT_UNICODE_EXPRESSIONS 1
#endif
_______________________________________________ webkit-changes mailing list [email protected] https://lists.webkit.org/mailman/listinfo/webkit-changes
