Title: [159655] trunk/Source/_javascript_Core
Revision
159655
Author
msab...@apple.com
Date
2013-11-21 17:11:54 -0800 (Thu, 21 Nov 2013)

Log Message

ARM64: Implement push/pop equivalents in LLInt
https://bugs.webkit.org/show_bug.cgi?id=124721

Reviewed by Filip Pizlo.

Added pushLRAndFP and popLRAndFP that push and pop the link register and frame pointer register.
These ops emit code just like what the compiler emits in the prologue and epilogue.  Also changed
pushCalleeSaves and popCalleeSaves to use the same store pair and load pair instructions to do
the actually pushing and popping.  Finally changed the implementation of push and pop to raise
an exception since we don't have (or need) a single register push or pop.

* llint/LowLevelInterpreter64.asm:
* offlineasm/arm64.rb:
* offlineasm/instructions.rb:

Modified Paths

Diff

Modified: trunk/Source/_javascript_Core/ChangeLog (159654 => 159655)


--- trunk/Source/_javascript_Core/ChangeLog	2013-11-22 00:46:09 UTC (rev 159654)
+++ trunk/Source/_javascript_Core/ChangeLog	2013-11-22 01:11:54 UTC (rev 159655)
@@ -1,5 +1,22 @@
 2013-11-21  Michael Saboff  <msab...@apple.com>
 
+        ARM64: Implement push/pop equivalents in LLInt
+        https://bugs.webkit.org/show_bug.cgi?id=124721
+
+        Reviewed by Filip Pizlo.
+
+        Added pushLRAndFP and popLRAndFP that push and pop the link register and frame pointer register.
+        These ops emit code just like what the compiler emits in the prologue and epilogue.  Also changed
+        pushCalleeSaves and popCalleeSaves to use the same store pair and load pair instructions to do
+        the actually pushing and popping.  Finally changed the implementation of push and pop to raise
+        an exception since we don't have (or need) a single register push or pop.
+
+        * llint/LowLevelInterpreter64.asm:
+        * offlineasm/arm64.rb:
+        * offlineasm/instructions.rb:
+
+2013-11-21  Michael Saboff  <msab...@apple.com>
+
         JSC: Removed unused opcodes from offline assembler
         https://bugs.webkit.org/show_bug.cgi?id=124749
 

Modified: trunk/Source/_javascript_Core/llint/LowLevelInterpreter64.asm (159654 => 159655)


--- trunk/Source/_javascript_Core/llint/LowLevelInterpreter64.asm	2013-11-22 00:46:09 UTC (rev 159654)
+++ trunk/Source/_javascript_Core/llint/LowLevelInterpreter64.asm	2013-11-22 01:11:54 UTC (rev 159655)
@@ -93,13 +93,11 @@
         push cfr
         move sp, cfr
     elsif ARM64
-        push lr
+        pushLRAndFP
     end
     pushCalleeSaves
     if X86_64
         subp extraStackSpace, sp
-    elsif ARM64
-        push cfr
     end
 end
 
@@ -111,7 +109,7 @@
     if X86_64
         pop cfr
     elsif ARM64
-        pop lr
+        popLRAndFP
     end
 end
 

Modified: trunk/Source/_javascript_Core/offlineasm/arm64.rb (159654 => 159655)


--- trunk/Source/_javascript_Core/offlineasm/arm64.rb	2013-11-22 00:46:09 UTC (rev 159654)
+++ trunk/Source/_javascript_Core/offlineasm/arm64.rb	2013-11-22 01:11:54 UTC (rev 159655)
@@ -566,31 +566,27 @@
             # FIXME: Remove it or support it.
             raise "ARM64 does not support this opcode yet, #{codeOriginString}"
         when "pop"
-            emitARM64Unflipped("pop", operands, :ptr)
+            # FIXME: Remove it or support it.
+            raise "ARM64 does not support this opcode yet, #{codeOriginString}"
         when "push"
-            emitARM64Unflipped("push", operands, :ptr)
+            # FIXME: Remove it or support it.
+            raise "ARM64 does not support this opcode yet, #{codeOriginString}"
+        when "popLRAndFP"
+            $asm.puts "ldp fp, lr, [sp], #16"
+        when "pushLRAndFP"
+            $asm.puts "stp fp, lr, [sp, #-16]!"
         when "popCalleeSaves"
-            emitARM64Unflipped("pop", "x28", :ptr)
-            emitARM64Unflipped("pop", "x27", :ptr)
-            emitARM64Unflipped("pop", "x26", :ptr)
-            emitARM64Unflipped("pop", "x25", :ptr)
-            emitARM64Unflipped("pop", "x24", :ptr)
-            emitARM64Unflipped("pop", "x23", :ptr)
-            emitARM64Unflipped("pop", "x22", :ptr)
-            emitARM64Unflipped("pop", "x21", :ptr)
-            emitARM64Unflipped("pop", "x20", :ptr)
-            emitARM64Unflipped("pop", "x19", :ptr)
+            $asm.puts "ldp x28, x27, [sp], #16"
+            $asm.puts "ldp x26, x25, [sp], #16"
+            $asm.puts "ldp x24, x23, [sp], #16"
+            $asm.puts "ldp x22, x21, [sp], #16"
+            $asm.puts "ldp x20, x19, [sp], #16"
         when "pushCalleeSaves"
-            emitARM64Unflipped("push", "x19", :ptr)
-            emitARM64Unflipped("push", "x20", :ptr)
-            emitARM64Unflipped("push", "x21", :ptr)
-            emitARM64Unflipped("push", "x22", :ptr)
-            emitARM64Unflipped("push", "x23", :ptr)
-            emitARM64Unflipped("push", "x24", :ptr)
-            emitARM64Unflipped("push", "x25", :ptr)
-            emitARM64Unflipped("push", "x26", :ptr)
-            emitARM64Unflipped("push", "x27", :ptr)
-            emitARM64Unflipped("push", "x28", :ptr)
+            $asm.puts "stp x20, x19, [sp, #-16]!"
+            $asm.puts "stp x22, x21, [sp, #-16]!"
+            $asm.puts "stp x24, x23, [sp, #-16]!"
+            $asm.puts "stp x26, x25, [sp, #-16]!"
+            $asm.puts "stp x28, x27, [sp, #-16]!"
         when "move"
             if operands[0].immediate?
                 emitARM64MoveImmediate(operands[0].value, operands[1])

Modified: trunk/Source/_javascript_Core/offlineasm/instructions.rb (159654 => 159655)


--- trunk/Source/_javascript_Core/offlineasm/instructions.rb	2013-11-22 00:46:09 UTC (rev 159654)
+++ trunk/Source/_javascript_Core/offlineasm/instructions.rb	2013-11-22 01:11:54 UTC (rev 159655)
@@ -258,6 +258,12 @@
      "idivi"
     ]
 
+ARM64_INSTRUCTIONS =
+    [
+     "popLRAndFP",   # ARM64 requires registers to be pushed and popped in pairs,
+     "pushLRAndFP"   # therefore we do LR (link register) and FP (frame pointer) together.
+    ]
+
 RISC_INSTRUCTIONS =
     [
      "smulli",  # Multiply two 32-bit words and produce a 64-bit word
@@ -307,7 +313,7 @@
      "cloopDo",              # no operands
     ]
 
-INSTRUCTIONS = MACRO_INSTRUCTIONS + X86_INSTRUCTIONS + RISC_INSTRUCTIONS + MIPS_INSTRUCTIONS + SH4_INSTRUCTIONS + CXX_INSTRUCTIONS
+INSTRUCTIONS = MACRO_INSTRUCTIONS + X86_INSTRUCTIONS + ARM64_INSTRUCTIONS + RISC_INSTRUCTIONS + MIPS_INSTRUCTIONS + SH4_INSTRUCTIONS + CXX_INSTRUCTIONS
 
 INSTRUCTION_PATTERN = Regexp.new('\\A((' + INSTRUCTIONS.join(')|(') + '))\\Z')
 
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to