ARM64: Implement push/pop equivalents in LLInt
authormsaboff@apple.com <msaboff@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 22 Nov 2013 01:11:54 +0000 (01:11 +0000)
committermsaboff@apple.com <msaboff@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 22 Nov 2013 01:11:54 +0000 (01:11 +0000)
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:

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

Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/llint/LowLevelInterpreter64.asm
Source/JavaScriptCore/offlineasm/arm64.rb
Source/JavaScriptCore/offlineasm/instructions.rb

index e17c008..e2c74fb 100644 (file)
@@ -1,5 +1,22 @@
 2013-11-21  Michael Saboff  <msaboff@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  <msaboff@apple.com>
+
         JSC: Removed unused opcodes from offline assembler
         https://bugs.webkit.org/show_bug.cgi?id=124749
 
index 4d45ad4..0b5c649 100644 (file)
@@ -93,13 +93,11 @@ macro functionPrologue(extraStackSpace)
         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 @@ macro functionEpilogue(extraStackSpace)
     if X86_64
         pop cfr
     elsif ARM64
-        pop lr
+        popLRAndFP
     end
 end
 
index fa0b2dd..1cc3666 100644 (file)
@@ -566,31 +566,27 @@ class Instruction
             # 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])
index 1cf335c..5a3463f 100644 (file)
@@ -258,6 +258,12 @@ X86_INSTRUCTIONS =
      "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 @@ CXX_INSTRUCTIONS =
      "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')