Title: [287367] trunk/Source
Revision
287367
Author
[email protected]
Date
2021-12-22 11:20:14 -0800 (Wed, 22 Dec 2021)

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

Reply via email to