Enable DFG on ARM/Linux again
authordinfuehr@igalia.com <dinfuehr@igalia.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 10 Jan 2019 11:55:51 +0000 (11:55 +0000)
committerdinfuehr@igalia.com <dinfuehr@igalia.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 10 Jan 2019 11:55:51 +0000 (11:55 +0000)
https://bugs.webkit.org/show_bug.cgi?id=192496

Reviewed by Yusuke Suzuki.

JSTests:

Test wasn't really skipped before moving the line with skip
to the top.

* stress/regress-192717.js:

Source/JavaScriptCore:

After changing the bytecode format DFG was disabled on all 32-bit
architectures. Enable DFG now again on ARM/Linux. Do not use register
r11 in compiled DFG mode since it is already used in LLInt as metadataTable
register. Also clean up code since ARM traditional isn't supported anymore.

* dfg/DFGOSRExit.cpp:
(JSC::DFG::restoreCalleeSavesFromVMEntryFrameCalleeSavesBuffer):
(JSC::DFG::copyCalleeSavesToVMEntryFrameCalleeSavesBuffer):
* jit/CallFrameShuffler.cpp:
(JSC::CallFrameShuffler::CallFrameShuffler):
* jit/GPRInfo.h:
(JSC::GPRInfo::toIndex):
* llint/LowLevelInterpreter32_64.asm:
* offlineasm/arm.rb:

Source/WTF:

After changing the bytecode format DFG was disabled on all 32-bit
architectures. Enable DFG now again on ARM/Linux.

* wtf/Platform.h:

Tools:

After changing the bytecode format DFG was disabled on all 32-bit
architectures. Enable DFG now again on ARM/Linux. Run again JIT-tests
on ARM by default.

* Scripts/run-jsc-stress-tests:

LayoutTests:

After changing the bytecode format DFG was disabled on all 32-bit
architectures. Enable DFG now again on ARM/Linux. Disable tests that
run out of executable memory with LLInt disabled.

* js/script-tests/dfg-float32array.js:
* js/script-tests/dfg-float64array.js:
* js/script-tests/dfg-int16array.js:
* js/script-tests/dfg-int32array-overflow-values.js:
* js/script-tests/dfg-int32array.js:
* js/script-tests/dfg-int8array.js:
* js/script-tests/dfg-uint16array.js:
* js/script-tests/dfg-uint32array.js:
* js/script-tests/dfg-uint8array.js:

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

23 files changed:
JSTests/ChangeLog
JSTests/stress/regress-192717.js
LayoutTests/ChangeLog
LayoutTests/js/script-tests/dfg-float32array.js
LayoutTests/js/script-tests/dfg-float64array.js
LayoutTests/js/script-tests/dfg-int16array.js
LayoutTests/js/script-tests/dfg-int32array-overflow-values.js
LayoutTests/js/script-tests/dfg-int32array.js
LayoutTests/js/script-tests/dfg-int8array.js
LayoutTests/js/script-tests/dfg-uint16array.js
LayoutTests/js/script-tests/dfg-uint32array.js
LayoutTests/js/script-tests/dfg-uint8array.js
Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/assembler/AbstractMacroAssembler.h
Source/JavaScriptCore/dfg/DFGOSRExit.cpp
Source/JavaScriptCore/jit/CallFrameShuffler.cpp
Source/JavaScriptCore/jit/GPRInfo.h
Source/JavaScriptCore/llint/LowLevelInterpreter32_64.asm
Source/JavaScriptCore/offlineasm/arm.rb
Source/WTF/ChangeLog
Source/WTF/wtf/Platform.h
Tools/ChangeLog
Tools/Scripts/run-jsc-stress-tests

index e5a3171..851e546 100644 (file)
@@ -1,3 +1,15 @@
+2019-01-10  Dominik Infuehr  <dinfuehr@igalia.com>
+
+        Enable DFG on ARM/Linux again
+        https://bugs.webkit.org/show_bug.cgi?id=192496
+
+        Reviewed by Yusuke Suzuki.
+
+        Test wasn't really skipped before moving the line with skip
+        to the top.
+
+        * stress/regress-192717.js:
+
 2019-01-08  Yusuke Suzuki  <yusukesuzuki@slowstart.org>
 
         Array.prototype.flat/flatMap have a minor bug in ArraySpeciesCreate
index 91a1ed8..f941a85 100644 (file)
@@ -1,5 +1,5 @@
-//@ runDefault("--useLLInt=false", "--forceCodeBlockToJettisonDueToOldAge=true", "--maxPerThreadStackUsage=200000", "--exceptionStackTraceLimit=1", "--defaultErrorStackTraceLimit=1")
 //@ skip if $memoryLimited or $buildType == "debug"
+//@ runDefault("--useLLInt=false", "--forceCodeBlockToJettisonDueToOldAge=true", "--maxPerThreadStackUsage=200000", "--exceptionStackTraceLimit=1", "--defaultErrorStackTraceLimit=1")
 
 let foo = 'let a';
 for (let i = 0; i < 400000; i++)
index 3d014cf..243cd5a 100644 (file)
@@ -1,3 +1,24 @@
+2019-01-10  Dominik Infuehr  <dinfuehr@igalia.com>
+
+        Enable DFG on ARM/Linux again
+        https://bugs.webkit.org/show_bug.cgi?id=192496
+
+        Reviewed by Yusuke Suzuki.
+
+        After changing the bytecode format DFG was disabled on all 32-bit
+        architectures. Enable DFG now again on ARM/Linux. Disable tests that
+        run out of executable memory with LLInt disabled.
+
+        * js/script-tests/dfg-float32array.js:
+        * js/script-tests/dfg-float64array.js:
+        * js/script-tests/dfg-int16array.js:
+        * js/script-tests/dfg-int32array-overflow-values.js:
+        * js/script-tests/dfg-int32array.js:
+        * js/script-tests/dfg-int8array.js:
+        * js/script-tests/dfg-uint16array.js:
+        * js/script-tests/dfg-uint32array.js:
+        * js/script-tests/dfg-uint8array.js:
+
 2019-01-10  Carlos Garcia Campos  <cgarcia@igalia.com>
 
         Unreviewed GTK+ gardening. Rebaseline two css tests.
index 4211465..1fef877 100644 (file)
@@ -1,4 +1,4 @@
-//@ noNoLLIntRunLayoutTest if $architecture == "arm" and $hostOS == "darwin"
+//@ noNoLLIntRunLayoutTest if $architecture == "arm"
 
 description(
 "This tests that float32 arrays work in the DFG."
index d58990e..b712bd2 100644 (file)
@@ -1,4 +1,4 @@
-//@ noNoLLIntRunLayoutTest if $architecture == "arm" and $hostOS == "darwin"
+//@ noNoLLIntRunLayoutTest if $architecture == "arm"
 
 description(
 "This tests that float64 arrays work in the DFG."
index 3e1efc3..19ad96f 100644 (file)
@@ -1,4 +1,4 @@
-//@ noNoLLIntRunLayoutTest if $architecture == "arm" and $hostOS == "darwin"
+//@ noNoLLIntRunLayoutTest if $architecture == "arm"
 
 description(
 "This tests that int16 arrays work in the DFG."
index 2edd518..bf551c3 100644 (file)
@@ -1,4 +1,4 @@
-//@ noNoLLIntRunLayoutTest if $architecture == "arm" and $hostOS == "darwin"
+//@ noNoLLIntRunLayoutTest if $architecture == "arm"
 
 description(
 "This tests that int32 arrays work in the DFG."
index 490c6a3..6627129 100644 (file)
@@ -1,4 +1,4 @@
-//@ noNoLLIntRunLayoutTest if $architecture == "arm" and $hostOS == "darwin"
+//@ noNoLLIntRunLayoutTest if $architecture == "arm"
 
 description(
 "This tests that int32 arrays work in the DFG."
index feb83e3..05f69e3 100644 (file)
@@ -1,4 +1,4 @@
-//@ noNoLLIntRunLayoutTest if $architecture == "arm" and $hostOS == "darwin"
+//@ noNoLLIntRunLayoutTest if $architecture == "arm"
 
 description(
 "This tests that int8 arrays work in the DFG."
index ba53b7b..234e897 100644 (file)
@@ -1,4 +1,4 @@
-//@ noNoLLIntRunLayoutTest if $architecture == "arm" and $hostOS == "darwin"
+//@ noNoLLIntRunLayoutTest if $architecture == "arm"
 
 description(
 "This tests that uint16 arrays work in the DFG."
index f1c48ab..bea38e0 100644 (file)
@@ -1,4 +1,4 @@
-//@ noNoLLIntRunLayoutTest if $architecture == "arm" and $hostOS == "darwin"
+//@ noNoLLIntRunLayoutTest if $architecture == "arm"
 
 description(
 "This tests that uint32 arrays work in the DFG."
index 95e8bcb..339d855 100644 (file)
@@ -1,4 +1,4 @@
-//@ noNoLLIntRunLayoutTest if $architecture == "arm" and $hostOS == "darwin"
+//@ noNoLLIntRunLayoutTest if $architecture == "arm"
 
 description(
 "This tests that uint8 arrays work in the DFG."
index d01619c..65a5e57 100644 (file)
@@ -1,3 +1,25 @@
+2019-01-10  Dominik Infuehr  <dinfuehr@igalia.com>
+
+        Enable DFG on ARM/Linux again
+        https://bugs.webkit.org/show_bug.cgi?id=192496
+
+        Reviewed by Yusuke Suzuki.
+
+        After changing the bytecode format DFG was disabled on all 32-bit
+        architectures. Enable DFG now again on ARM/Linux. Do not use register
+        r11 in compiled DFG mode since it is already used in LLInt as metadataTable
+        register. Also clean up code since ARM traditional isn't supported anymore.
+
+        * dfg/DFGOSRExit.cpp:
+        (JSC::DFG::restoreCalleeSavesFromVMEntryFrameCalleeSavesBuffer):
+        (JSC::DFG::copyCalleeSavesToVMEntryFrameCalleeSavesBuffer):
+        * jit/CallFrameShuffler.cpp:
+        (JSC::CallFrameShuffler::CallFrameShuffler):
+        * jit/GPRInfo.h:
+        (JSC::GPRInfo::toIndex):
+        * llint/LowLevelInterpreter32_64.asm:
+        * offlineasm/arm.rb:
+
 2019-01-09  Mark Lam  <mark.lam@apple.com>
 
         Restore bytecode dumper's ability to dump jump target as offset#(->targetBytecodeIndex#).
index 1378540..f9d0030 100644 (file)
@@ -749,7 +749,7 @@ public:
             m_jumps.append(other.m_jumps.begin(), other.m_jumps.size());
         }
 
-        bool empty()
+        bool empty() const
         {
             return !m_jumps.size();
         }
index 069cf85..6d464f3 100644 (file)
@@ -75,8 +75,6 @@ static JSValue jsValueFor(CPUState& cpu, JSValueSource source)
 
 #if NUMBER_OF_CALLEE_SAVES_REGISTERS > 0
 
-static_assert(is64Bit(), "we only support callee save registers on 64-bit");
-
 // Based on AssemblyHelpers::emitRestoreCalleeSavesFor().
 static void restoreCalleeSavesFor(Context& context, CodeBlock* codeBlock)
 {
@@ -137,8 +135,14 @@ static void restoreCalleeSavesFromVMEntryFrameCalleeSavesBuffer(Context& context
         size_t uintptrOffset = entry.offset() / sizeof(UCPURegister);
         if (entry.reg().isGPR())
             context.gpr(entry.reg().gpr()) = calleeSaveBuffer[uintptrOffset];
-        else
+        else {
+#if USE(JSVALUE64)
             context.fpr(entry.reg().fpr()) = bitwise_cast<double>(calleeSaveBuffer[uintptrOffset]);
+#else
+            // FIXME: <https://webkit.org/b/193275> support callee-saved floating point registers on 32-bit architectures
+            RELEASE_ASSERT_NOT_REACHED();
+#endif
+        }
     }
 }
 
@@ -161,8 +165,14 @@ static void copyCalleeSavesToVMEntryFrameCalleeSavesBuffer(Context& context)
             continue;
         if (entry.reg().isGPR())
             stack.set(calleeSaveBuffer, entry.offset(), context.gpr<UCPURegister>(entry.reg().gpr()));
-        else
+        else {
+#if USE(JSVALUE64)
             stack.set(calleeSaveBuffer, entry.offset(), context.fpr<UCPURegister>(entry.reg().fpr()));
+#else
+            // FIXME: <https://webkit.org/b/193275> support callee-saved floating point registers on 32-bit architectures
+            RELEASE_ASSERT_NOT_REACHED();
+#endif
+        }
     }
 }
 
index 6df81e1..81c3e2d 100644 (file)
@@ -51,8 +51,14 @@ CallFrameShuffler::CallFrameShuffler(CCallHelpers& jit, const CallFrameShuffleDa
         m_lockedRegisters.clear(GPRInfo::toRegister(i));
     for (unsigned i = FPRInfo::numberOfRegisters; i--; )
         m_lockedRegisters.clear(FPRInfo::toRegister(i));
-    // ... as well as the runtime registers.
+
+#if USE(JSVALUE64)
+    // ... as well as the runtime registers on 64-bit architectures.
+    // However do not use these registers on 32-bit architectures since
+    // saving and restoring callee-saved registers in CallFrameShuffler isn't supported
+    // on 32-bit architectures yet.
     m_lockedRegisters.exclude(RegisterSet::vmCalleeSaveRegisters());
+#endif
 
     ASSERT(!data.callee.isInJSStack() || data.callee.virtualRegister().isLocal());
     addNew(VirtualRegister(CallFrameSlot::callee), data.callee);
index 1a0a5c9..175d530 100644 (file)
@@ -526,13 +526,9 @@ public:
 
 #endif // CPU(X86_64)
 
-#if CPU(ARM)
-#define NUMBER_OF_ARGUMENT_REGISTERS 4u
 #if CPU(ARM_THUMB2)
+#define NUMBER_OF_ARGUMENT_REGISTERS 4u
 #define NUMBER_OF_CALLEE_SAVES_REGISTERS 1u
-#else
-#define NUMBER_OF_CALLEE_SAVES_REGISTERS 0u
-#endif
 
 class GPRInfo {
 public:
@@ -548,11 +544,7 @@ public:
     static const GPRReg regT4 = ARMRegisters::r8;
     static const GPRReg regT5 = ARMRegisters::r9;
     static const GPRReg regT6 = ARMRegisters::r10;
-#if CPU(ARM_THUMB2)
-    static const GPRReg regT7 = ARMRegisters::r11;
-#else 
-    static const GPRReg regT7 = ARMRegisters::r7;
-#endif
+    static const GPRReg regT7 = ARMRegisters::r5;
     static const GPRReg regT8 = ARMRegisters::r4;
     static const GPRReg regCS0 = ARMRegisters::r11;
     // These registers match the baseline JIT.
@@ -587,11 +579,7 @@ public:
         ASSERT(reg != InvalidGPRReg);
         ASSERT(static_cast<int>(reg) < 16);
         static const unsigned indexForRegister[16] =
-#if CPU(ARM_THUMB2)
-            { 0, 1, 2, 3, 8, InvalidIndex, InvalidIndex, InvalidIndex, 4, 5, 6, 7, InvalidIndex, InvalidIndex, InvalidIndex, InvalidIndex };
-#else
-            { 0, 1, 2, 3, 8, InvalidIndex, InvalidIndex, 7, 4, 5, 6, InvalidIndex, InvalidIndex, InvalidIndex, InvalidIndex, InvalidIndex };
-#endif
+            { 0, 1, 2, 3, 8, 7, InvalidIndex, InvalidIndex, 4, 5, 6, InvalidIndex, InvalidIndex, InvalidIndex, InvalidIndex, InvalidIndex };
         unsigned result = indexForRegister[reg];
         return result;
     }
index 05b3a69..a505a55 100644 (file)
@@ -2012,6 +2012,11 @@ end)
 
 
 op(llint_throw_from_slow_path_trampoline, macro()
+    loadp Callee[cfr], t1
+    andp MarkedBlockMask, t1
+    loadp MarkedBlockFooterOffset + MarkedBlock::Footer::m_vm[t1], t1
+    copyCalleeSavesToVMEntryFrameCalleeSavesBuffer(t1, t2)
+
     callSlowPath(_llint_slow_path_handle_exception)
 
     # When throwing from the interpreter (i.e. throwing from LLIntSlowPaths), so
@@ -2020,7 +2025,6 @@ op(llint_throw_from_slow_path_trampoline, macro()
     loadp Callee[cfr], t1
     andp MarkedBlockMask, t1
     loadp MarkedBlockFooterOffset + MarkedBlock::Footer::m_vm[t1], t1
-    copyCalleeSavesToVMEntryFrameCalleeSavesBuffer(t1, t2)
     jmp VM::targetMachinePCForThrow[t1]
 end)
 
index d78b82e..85e0b8e 100644 (file)
@@ -34,7 +34,7 @@ require "risc"
 #  x2 => t2, a2, r2
 #  x3 => t3, a3, r3
 #  x6 =>            (callee-save scratch)
-#  x7 => cfr        (ARMv7 only)
+#  x7 => cfr
 #  x8 => t4         (callee-save)
 #  x9 => t5         (callee-save)
 # x10 =>            (callee-save scratch)
@@ -55,15 +55,6 @@ require "risc"
 # d6 =>              (scratch)
 # d7 =>              (scratch)
 
-def isARMv7
-    case $activeBackend
-    when "ARMv7"
-        true
-    else
-        raise "bad value for $activeBackend: #{$activeBackend}"
-    end
-end
-
 class Node
     def armSingle
         doubleOperand = armOperand
@@ -91,13 +82,11 @@ def armMoveImmediate(value, register)
         $asm.puts "mov #{register.armOperand}, \##{value}"
     elsif (~value) >= 0 && (~value) < 256
         $asm.puts "mvn #{register.armOperand}, \##{~value}"
-    elsif isARMv7
+    else
         $asm.puts "movw #{register.armOperand}, \##{value & 0xffff}"
         if (value & 0xffff0000) != 0
             $asm.puts "movt #{register.armOperand}, \##{(value >> 16) & 0xffff}"
         end
-    else
-        $asm.puts "ldr #{register.armOperand}, =#{value}"
     end
 end
 
@@ -119,7 +108,7 @@ class RegisterID
         when "t5"
             "r9"
         when "cfr"
-            isARMv7 ?  "r7" : "r11"
+            "r7"
         when "csr0"
             "r11"
         when "lr"
@@ -609,9 +598,6 @@ class Instruction
             else
                 $asm.puts "mov pc, #{operands[0].armOperand}"
             end
-            if not isARMv7 and not isARMv7Traditional
-                $asm.puts ".ltorg"
-            end
         when "call"
             if operands[0].label?
                 if OS_DARWIN
@@ -692,7 +678,7 @@ class Instruction
             $asm.puts "add #{dest.armOperand}, pc, #{dest.armOperand}"
             $asm.puts "ldr #{dest.armOperand}, [#{dest.armOperand}, #{temp.armOperand}]"
 
-            offset = $activeBackend == "ARMv7" ? 4 : 8
+            offset = 4
 
             $asm.deferNextLabelAction {
                 $asm.puts "#{gotLabel}:"
index 8201e75..8423843 100644 (file)
@@ -1,3 +1,15 @@
+2019-01-10  Dominik Infuehr  <dinfuehr@igalia.com>
+
+        Enable DFG on ARM/Linux again
+        https://bugs.webkit.org/show_bug.cgi?id=192496
+
+        Reviewed by Yusuke Suzuki.
+
+        After changing the bytecode format DFG was disabled on all 32-bit
+        architectures. Enable DFG now again on ARM/Linux.
+
+        * wtf/Platform.h:
+
 2019-01-10  Carlos Garcia Campos  <cgarcia@igalia.com>
 
         [FreeType] Color emoji not properly supported
index 52b7d2e..4fdfb3d 100644 (file)
 #if !defined(ENABLE_JIT)
 #define ENABLE_JIT 1
 #endif
-/* But still disable DFG for now. */
-#undef ENABLE_DFG_JIT
-#define ENABLE_DFG_JIT 0
 #else
 /* Disable JIT and force C_LOOP on all 32bit-architectures but ARMv7-Thumb2/Linux. */
 #undef ENABLE_JIT
index 291b276..0d9f64d 100644 (file)
@@ -1,3 +1,16 @@
+2019-01-10  Dominik Infuehr  <dinfuehr@igalia.com>
+
+        Enable DFG on ARM/Linux again
+        https://bugs.webkit.org/show_bug.cgi?id=192496
+
+        Reviewed by Yusuke Suzuki.
+
+        After changing the bytecode format DFG was disabled on all 32-bit
+        architectures. Enable DFG now again on ARM/Linux. Run again JIT-tests
+        on ARM by default.
+
+        * Scripts/run-jsc-stress-tests:
+
 2019-01-09  Fujii Hironori  <Hironori.Fujii@sony.com>
 
         [Win][MiniBrowser] wchar_t strings shouldn't be treated as BSTR
index 35a9eb1..62fa70f 100755 (executable)
@@ -449,7 +449,7 @@ $hostOS = determineOS unless $hostOS
 $architecture = determineArchitecture unless $architecture
 $isFTLPlatform = !($architecture == "x86" || $architecture == "arm" || $architecture == "mips" || $hostOS == "windows")
 
-if ["arm", "mips", "x86"].include?($architecture)
+if ["mips", "x86"].include?($architecture)
     # The JIT is temporarily disabled on these platforms since
     # https://trac.webkit.org/changeset/237547
     $jitTests = false