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