Enable LLInt on ARMv7/Linux
authordinfuehr@igalia.com <dinfuehr@igalia.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 5 Nov 2018 16:07:40 +0000 (16:07 +0000)
committerdinfuehr@igalia.com <dinfuehr@igalia.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 5 Nov 2018 16:07:40 +0000 (16:07 +0000)
https://bugs.webkit.org/show_bug.cgi?id=191190

Reviewed by Yusuke Suzuki.

After enabling the new bytecode format in r237547, C_LOOP was
forced on all 32-bit platforms. Now enable LLInt again on
.:

ARMv7-Thumb2/Linux by default.

* Source/cmake/WebKitFeatures.cmake:

Source/JavaScriptCore:

ARMv7-Thumb2/Linux.

This adds a callee-saved register in ARMv7/Linux for the metadataTable and
stores/restores it on LLInt function calls. It also introduces the globaladdr-
instruction for the ARM-offlineasm to access the opcode-table.

* jit/GPRInfo.h:
* jit/RegisterSet.cpp:
(JSC::RegisterSet::llintBaselineCalleeSaveRegisters):
* llint/LowLevelInterpreter.asm:
* llint/LowLevelInterpreter32_64.asm:
* offlineasm/arm.rb:
* offlineasm/asm.rb:
* offlineasm/instructions.rb:

Source/WTF:

ARMv7-Thumb2/Linux by default.

* wtf/Platform.h:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@237803 268f45cc-cd09-0410-ab3c-d52691b4dbfc

12 files changed:
ChangeLog
Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/jit/GPRInfo.h
Source/JavaScriptCore/jit/RegisterSet.cpp
Source/JavaScriptCore/llint/LowLevelInterpreter.asm
Source/JavaScriptCore/llint/LowLevelInterpreter32_64.asm
Source/JavaScriptCore/offlineasm/arm.rb
Source/JavaScriptCore/offlineasm/asm.rb
Source/JavaScriptCore/offlineasm/instructions.rb
Source/WTF/ChangeLog
Source/WTF/wtf/Platform.h
Source/cmake/WebKitFeatures.cmake

index 6162ce2..cb4efb2 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,16 @@
+2018-11-05  Dominik Infuehr  <dinfuehr@igalia.com>
+
+        Enable LLInt on ARMv7/Linux
+        https://bugs.webkit.org/show_bug.cgi?id=191190
+
+        Reviewed by Yusuke Suzuki.
+
+        After enabling the new bytecode format in r237547, C_LOOP was
+        forced on all 32-bit platforms. Now enable LLInt again on
+        ARMv7-Thumb2/Linux by default.
+
+        * Source/cmake/WebKitFeatures.cmake:
+
 2018-11-05  Michael Catanzaro  <mcatanzaro@igalia.com>
 
         [WPE][GTK] Expose ENABLE_MEDIA_SOURCE as public option
index 74ce2ba..ac49085 100644 (file)
@@ -1,3 +1,27 @@
+2018-11-05  Dominik Infuehr  <dinfuehr@igalia.com>
+
+        Enable LLInt on ARMv7/Linux
+        https://bugs.webkit.org/show_bug.cgi?id=191190
+
+        Reviewed by Yusuke Suzuki.
+
+        After enabling the new bytecode format in r237547, C_LOOP was
+        forced on all 32-bit platforms. Now enable LLInt again on
+        ARMv7-Thumb2/Linux.
+
+        This adds a callee-saved register in ARMv7/Linux for the metadataTable and
+        stores/restores it on LLInt function calls. It also introduces the globaladdr-
+        instruction for the ARM-offlineasm to access the opcode-table.
+
+        * jit/GPRInfo.h:
+        * jit/RegisterSet.cpp:
+        (JSC::RegisterSet::llintBaselineCalleeSaveRegisters):
+        * llint/LowLevelInterpreter.asm:
+        * llint/LowLevelInterpreter32_64.asm:
+        * offlineasm/arm.rb:
+        * offlineasm/asm.rb:
+        * offlineasm/instructions.rb:
+
 2018-11-05  Fujii Hironori  <Hironori.Fujii@sony.com>
 
         [Win][Clang][JSC] JIT::is64BitType reports "warning: explicit specialization cannot have a storage class"
index 805449f..f15ae83 100644 (file)
@@ -550,6 +550,7 @@ public:
     static const GPRReg regT7 = ARMRegisters::r7;
 #endif
     static const GPRReg regT8 = ARMRegisters::r4;
+    static const GPRReg regCS0 = ARMRegisters::r11;
     // These registers match the baseline JIT.
     static const GPRReg callFrameRegister = ARMRegisters::fp;
     // These constants provide the names for the general purpose argument & return value registers.
index bc361e8..a3ee747 100644 (file)
@@ -236,6 +236,7 @@ RegisterSet RegisterSet::llintBaselineCalleeSaveRegisters()
     result.set(GPRInfo::regCS6);
 #endif
 #elif CPU(ARM_THUMB2)
+    result.set(GPRInfo::regCS0);
 #elif CPU(ARM_TRADITIONAL)
 #elif CPU(ARM64)
     result.set(GPRInfo::regCS6);
index 6ad2aa7..892e0a8 100644 (file)
@@ -230,6 +230,8 @@ if X86_64 or X86_64_WIN or ARM64 or ARM64E
     const CalleeSaveSpaceAsVirtualRegisters = 4
 elsif C_LOOP
     const CalleeSaveSpaceAsVirtualRegisters = 1
+elsif ARMv7
+    const CalleeSaveSpaceAsVirtualRegisters = 1
 else
     const CalleeSaveSpaceAsVirtualRegisters = 0
 end
@@ -294,6 +296,10 @@ else
     const PC = t4 # When changing this, make sure LLIntPC is up to date in LLIntPCRanges.h
     if C_LOOP
         const metadataTable = csr3
+    elsif ARMv7
+        const metadataTable = csr0
+    else
+        error
     end
 end
 
@@ -712,6 +718,7 @@ macro preserveCalleeSavesUsedByLLInt()
         storep metadataTable, -PtrSize[cfr]
     elsif ARM or ARMv7_TRADITIONAL
     elsif ARMv7
+        storep metadataTable, -4[cfr]
     elsif ARM64 or ARM64E
         emit "stp x27, x28, [x29, #-16]"
         emit "stp x25, x26, [x29, #-32]"
@@ -736,6 +743,7 @@ macro restoreCalleeSavesUsedByLLInt()
         loadp -PtrSize[cfr], metadataTable
     elsif ARM or ARMv7_TRADITIONAL
     elsif ARMv7
+        loadp -4[cfr], metadataTable
     elsif ARM64 or ARM64E
         emit "ldp x25, x26, [x29, #-32]"
         emit "ldp x27, x28, [x29, #-16]"
@@ -1186,12 +1194,11 @@ macro prologue(codeBlockGetter, codeBlockSetter, osrSlowPath, traceSlowPath)
         move t0, sp
     end
 
-    if JSVALUE64 or C_LOOP
-        # FIXME: cleanup double load
-        # https://bugs.webkit.org/show_bug.cgi?id=190933
-        loadp CodeBlock::m_metadata[t1], metadataTable
-        loadp MetadataTable::m_buffer[metadataTable], metadataTable
-    end
+    # FIXME: cleanup double load
+    # https://bugs.webkit.org/show_bug.cgi?id=190933
+    loadp CodeBlock::m_metadata[t1], metadataTable
+    loadp MetadataTable::m_buffer[metadataTable], metadataTable
+
     if JSVALUE64
         move TagTypeNumber, tagTypeNumber
         addq TagBitTypeOther, tagTypeNumber, tagMask
index 31f8a0f..e3d7269 100644 (file)
@@ -343,7 +343,7 @@ macro makeHostFunctionCall(entry, temp1, temp2)
     end
 end
 
-_handleUncaughtException:
+op(handleUncaughtException, macro()
     loadp Callee + PayloadOffset[cfr], t3
     andp MarkedBlockMask, t3
     loadp MarkedBlockFooterOffset + MarkedBlock::Footer::m_vm[t3], t3
@@ -374,6 +374,7 @@ _handleUncaughtException:
     popCalleeSaves()
     functionEpilogue()
     ret
+end)
 
 macro doReturnFromHostFunction(extraStackSpace)
     functionEpilogue(extraStackSpace)
@@ -1938,7 +1939,7 @@ llintOpWithReturn(op_to_primitive, OpToPrimitive, macro (size, get, dispatch, re
 end)
 
 
-commonOp(op_catch, macro() end, macro (size)
+commonOp(llint_op_catch, macro() end, macro (size)
     # This is where we end up from the JIT's throw trampoline (because the
     # machine code return address will be set to _llint_op_catch), and from
     # the interpreter's throw trampoline (see _llint_throw_trampoline).
@@ -1952,14 +1953,12 @@ commonOp(op_catch, macro() end, macro (size)
     storep 0, VM::callFrameForCatch[t3]
     restoreStackPointerAfterCall()
 
-    if C_LOOP
-        # restore metadataTable since we don't restore callee saves for CLoop during unwinding
-        loadp CodeBlock[cfr], t1
-        # FIXME: cleanup double load
-        # https://bugs.webkit.org/show_bug.cgi?id=190933
-        loadp CodeBlock::m_metadata[t1], metadataTable
-        loadp MetadataTable::m_buffer[metadataTable], metadataTable
-    end
+    # restore metadataTable since we don't restore callee saves for CLoop during unwinding
+    loadp CodeBlock[cfr], t1
+    # FIXME: cleanup double load
+    # https://bugs.webkit.org/show_bug.cgi?id=190933
+    loadp CodeBlock::m_metadata[t1], metadataTable
+    loadp MetadataTable::m_buffer[metadataTable], metadataTable
 
     loadi VM::targetInterpreterPCForThrow[t3], PC
 
index d514a0a..8244bba 100644 (file)
@@ -38,7 +38,7 @@ require "risc"
 #  x8 => t4         (callee-save)
 #  x9 => t5         (callee-save)
 # x10 =>            (callee-save scratch)
-# x11 => cfr        (ARM and ARMv7 traditional)
+# x11 => cfr, csr0  (callee-save, metadataTable)
 # x12 =>            (callee-save scratch)
 #  lr => lr
 #  sp => sp
@@ -133,6 +133,8 @@ class RegisterID
             "r9"
         when "cfr"
             isARMv7 ?  "r7" : "r11"
+        when "csr0"
+            "r11"
         when "lr"
             "lr"
         when "sp"
@@ -273,6 +275,31 @@ def armLowerStackPointerInComparison(list)
     newList
 end
 
+def armLowerLabelReferences(list)
+    newList = []
+    list.each {
+        | node |
+        if node.is_a? Instruction
+            case node.opcode
+            when "leai", "leap", "leaq"
+                labelRef = node.operands[0]
+                if labelRef.is_a? LabelReference
+                    raise unless labelRef.offset == 0
+                    tmp = Tmp.new(node.codeOrigin, :gpr)
+                    newList << Instruction.new(codeOrigin, "globaladdr", [LabelReference.new(node.codeOrigin, labelRef.label), node.operands[1], tmp])
+                else
+                    newList << node
+                end
+            else
+                newList << node
+            end
+        else
+            newList << node
+        end
+    }
+    newList
+end
+
 class Sequence
     def getModifiedListARM
         raise unless $activeBackend == "ARM"
@@ -294,6 +321,7 @@ class Sequence
         result = riscLowerSimpleBranchOps(result)
         result = riscLowerHardBranchOps(result)
         result = riscLowerShiftOps(result)
+        result = armLowerLabelReferences(result)
         result = riscLowerMalformedAddresses(result) {
             | node, address |
             if address.is_a? BaseIndex
@@ -460,7 +488,7 @@ class Instruction
             $asm.puts "str #{armOperands(operands)}"
         when "loadb"
             $asm.puts "ldrb #{armFlippedOperands(operands)}"
-        when "loadbs"
+        when "loadbs", "loadbsp"
             $asm.puts "ldrsb.w #{armFlippedOperands(operands)}"
         when "storeb"
             $asm.puts "strb #{armOperands(operands)}"
@@ -682,6 +710,28 @@ class Instruction
             $asm.puts "dmb sy"
         when "clrbp"
             $asm.puts "bic #{operands[2].armOperand}, #{operands[0].armOperand}, #{operands[1].armOperand}"
+        when "globaladdr"
+            labelRef = operands[0]
+            dest = operands[1]
+            temp = operands[2]
+
+            uid = $asm.newUID
+            gotLabel = "L_offlineasm_arm_got_#{uid}"
+            offsetLabel = "L_offlineasm_arm_got_offset_#{uid}"
+
+            $asm.puts "ldr #{dest.armOperand}, #{gotLabel}"
+            $asm.puts "ldr #{temp.armOperand}, #{gotLabel}+4"
+            $asm.puts "#{offsetLabel}:"
+            $asm.puts "add #{dest.armOperand}, pc, #{dest.armOperand}"
+            $asm.puts "ldr #{dest.armOperand}, [#{dest.armOperand}, #{temp.armOperand}]"
+
+            offset = $activeBackend == "ARMv7" ? 4 : 8
+
+            $asm.deferNextLabelAction {
+                $asm.puts "#{gotLabel}:"
+                $asm.puts ".word _GLOBAL_OFFSET_TABLE_-(#{offsetLabel}+#{offset})"
+                $asm.puts ".word #{labelRef.asmLabel}(GOT)"
+            }
         else
             lowerDefault
         end
index d1b4413..ecf14cb 100644 (file)
@@ -51,6 +51,7 @@ class Assembler
         @numLocalLabels = 0
         @numGlobalLabels = 0
         @deferredActions = []
+        @deferredNextLabelActions = []
         @count = 0
 
         @newlineSpacerState = :none
@@ -79,7 +80,7 @@ class Assembler
             putsProcEndIfNeeded
         end
         putsLastComment
-        @deferredActions.each {
+        (@deferredNextLabelActions + @deferredActions).each {
             | action |
             action.call()
         }
@@ -90,6 +91,10 @@ class Assembler
     def deferAction(&proc)
         @deferredActions << proc
     end
+
+    def deferNextLabelAction(&proc)
+        @deferredNextLabelActions << proc
+    end
     
     def newUID
         @count += 1
@@ -209,6 +214,11 @@ class Assembler
 
     def putsLabel(labelName, isGlobal)
         raise unless @state == :asm
+        @deferredNextLabelActions.each {
+            | action |
+            action.call()
+        }
+        @deferredNextLabelActions = []
         @numGlobalLabels += 1
         putsProcEndIfNeeded if $emitWinAsm and isGlobal
         putsNewlineSpacerIfAppropriate(:global)
index 9e0c914..c658b9b 100644 (file)
@@ -265,7 +265,8 @@ X86_INSTRUCTIONS =
 ARM_INSTRUCTIONS =
     [
      "clrbp",
-     "mvlbl"
+     "mvlbl",
+     "globaladdr"
     ]
 
 ARM64_INSTRUCTIONS =
index f2d9e16..774ee6e 100644 (file)
@@ -1,3 +1,16 @@
+2018-11-05  Dominik Infuehr  <dinfuehr@igalia.com>
+
+        Enable LLInt on ARMv7/Linux
+        https://bugs.webkit.org/show_bug.cgi?id=191190
+
+        Reviewed by Yusuke Suzuki.
+
+        After enabling the new bytecode format in r237547, C_LOOP was
+        forced on all 32-bit platforms. Now enable LLInt again on
+        ARMv7-Thumb2/Linux by default.
+
+        * wtf/Platform.h:
+
 2018-11-04  Fujii Hironori  <Hironori.Fujii@sony.com>
 
         [Win] Use C++14, not C++17
index bfbf79c..6e2837a 100644 (file)
 #define ENABLE_JIT 1
 #endif
 
-/* Force C_LOOP for 32-bit builds. */
+/* Disable JIT for 32-bit builds. */
 #if USE(JSVALUE32_64)
 #undef ENABLE_JIT
 #define ENABLE_JIT 0
+/* Force C_LOOP on all architectures but ARMv7-Thumb2/Linux. */
+#if !(CPU(ARM_THUMB2) && OS(LINUX))
 #undef ENABLE_C_LOOP
 #define ENABLE_C_LOOP 1
 #endif
+#endif
 
 #if !defined(ENABLE_C_LOOP)
 #if ENABLE(JIT) \
index a0f844b..2d55f95 100644 (file)
@@ -68,6 +68,12 @@ macro(WEBKIT_OPTION_BEGIN)
         set(USE_SYSTEM_MALLOC_DEFAULT OFF)
         set(ENABLE_C_LOOP_DEFAULT OFF)
         set(ENABLE_SAMPLING_PROFILER_DEFAULT ON)
+    elseif (WTF_CPU_ARM AND WTF_OS_UNIX)
+        set(ENABLE_JIT_DEFAULT OFF)
+        set(ENABLE_FTL_DEFAULT OFF)
+        set(USE_SYSTEM_MALLOC_DEFAULT OFF)
+        set(ENABLE_C_LOOP_DEFAULT OFF)
+        set(ENABLE_SAMPLING_PROFILER_DEFAULT OFF)
     else ()
         set(ENABLE_JIT_DEFAULT OFF)
         set(ENABLE_FTL_DEFAULT OFF)