Diff
Modified: trunk/Source/_javascript_Core/ChangeLog (172428 => 172429)
--- trunk/Source/_javascript_Core/ChangeLog 2014-08-12 03:01:52 UTC (rev 172428)
+++ trunk/Source/_javascript_Core/ChangeLog 2014-08-12 03:20:04 UTC (rev 172429)
@@ -1,3 +1,29 @@
+2014-08-11 Michael Saboff <msab...@apple.com>
+
+ Eliminate {push,pop}CalleeSaves in favor of individual pushes & pops
+ https://bugs.webkit.org/show_bug.cgi?id=127155
+
+ Reviewed by Geoffrey Garen.
+
+ Eliminated the offline assembler instructions {push,pop}CalleeSaves as well as the
+ ARM64 specific {push,pop}LRAndFP and replaced them with individual push and pop
+ instructions. Where the registers referenced by the added push and pop instructions
+ are not part of the offline assembler register aliases, used a newly added "emit"
+ offline assembler instruction which takes a string literal and outputs that
+ string as a native instruction.
+
+ * llint/LowLevelInterpreter.asm:
+ * offlineasm/arm.rb:
+ * offlineasm/arm64.rb:
+ * offlineasm/ast.rb:
+ * offlineasm/cloop.rb:
+ * offlineasm/instructions.rb:
+ * offlineasm/mips.rb:
+ * offlineasm/parser.rb:
+ * offlineasm/sh4.rb:
+ * offlineasm/transform.rb:
+ * offlineasm/x86.rb:
+
2014-08-11 Mark Lam <mark....@apple.com>
Re-landing r172401 with fixed test.
Modified: trunk/Source/_javascript_Core/llint/LowLevelInterpreter.asm (172428 => 172429)
--- trunk/Source/_javascript_Core/llint/LowLevelInterpreter.asm 2014-08-12 03:01:52 UTC (rev 172428)
+++ trunk/Source/_javascript_Core/llint/LowLevelInterpreter.asm 2014-08-12 03:20:04 UTC (rev 172429)
@@ -246,6 +246,106 @@
end
end
+macro pushCalleeSaves()
+ if C_LOOP
+ elsif ARM or ARMv7_TRADITIONAL
+ emit "push {r4-r10}"
+ elsif ARMv7
+ emit "push {r4-r6, r8-r11}"
+ elsif ARM64
+ emit "stp x20, x19, [sp, #-16]!"
+ emit "stp x22, x21, [sp, #-16]!"
+ emit "stp x24, x23, [sp, #-16]!"
+ emit "stp x26, x25, [sp, #-16]!"
+ emit "stp x28, x27, [sp, #-16]!"
+ elsif MIPS
+ emit "addiu $sp, $sp, -20"
+ emit "sw $20, 16($sp)"
+ emit "sw $19, 12($sp)"
+ emit "sw $18, 8($sp)"
+ emit "sw $17, 4($sp)"
+ emit "sw $16, 0($sp)"
+ elsif SH4
+ emit "mov.l r13, @-r15"
+ emit "mov.l r11, @-r15"
+ emit "mov.l r10, @-r15"
+ emit "mov.l r9, @-r15"
+ emit "mov.l r8, @-r15"
+ elsif X86
+ emit "push %esi"
+ emit "push %edi"
+ emit "push %ebx"
+ elsif X86_WIN
+ emit "push esi"
+ emit "push edi"
+ emit "push ebx"
+ elsif X86_64
+ emit "push %r12"
+ emit "push %r13"
+ emit "push %r14"
+ emit "push %r15"
+ emit "push %rbx"
+ elsif X86_64_WIN
+ emit "push r12"
+ emit "push r13"
+ emit "push r14"
+ emit "push r15"
+ emit "push rbx"
+ emit "push rdi"
+ emit "push rsi"
+ end
+end
+
+macro popCalleeSaves()
+ if C_LOOP
+ elsif ARM or ARMv7_TRADITIONAL
+ emit "pop {r4-r10}"
+ elsif ARMv7
+ emit "pop {r4-r6, r8-r11}"
+ elsif ARM64
+ emit "ldp x28, x27, [sp], #16"
+ emit "ldp x26, x25, [sp], #16"
+ emit "ldp x24, x23, [sp], #16"
+ emit "ldp x22, x21, [sp], #16"
+ emit "ldp x20, x19, [sp], #16"
+ elsif MIPS
+ emit "lw $16, 0($sp)"
+ emit "lw $17, 4($sp)"
+ emit "lw $18, 8($sp)"
+ emit "lw $19, 12($sp)"
+ emit "lw $20, 16($sp)"
+ emit "addiu $sp, $sp, 20"
+ elsif SH4
+ emit "mov.l @r15+, r8"
+ emit "mov.l @r15+, r9"
+ emit "mov.l @r15+, r10"
+ emit "mov.l @r15+, r11"
+ emit "mov.l @r15+, r13"
+ elsif X86
+ emit "pop %ebx"
+ emit "pop %edi"
+ emit "pop %esi"
+ elsif X86_WIN
+ emit "pop ebx"
+ emit "pop edi"
+ emit "pop esi"
+ elsif X86_64
+ emit "pop %rbx"
+ emit "pop %r15"
+ emit "pop %r14"
+ emit "pop %r13"
+ emit "pop %r12"
+ elsif X86_64_WIN
+ emit "pop rsi"
+ emit "pop rdi"
+ emit "pop rbx"
+ emit "pop r15"
+ emit "pop r14"
+ emit "pop r13"
+ emit "pop r12"
+ end
+end
+
macro preserveCallerPCAndCFR()
if C_LOOP or ARM or ARMv7 or ARMv7_TRADITIONAL or MIPS or SH4
push lr
@@ -253,7 +353,7 @@
elsif X86 or X86_WIN or X86_64 or X86_64_WIN
push cfr
elsif ARM64
- pushLRAndFP
+ push cfr, lr
else
error
end
@@ -268,7 +368,7 @@
elsif X86 or X86_WIN or X86_64 or X86_64_WIN
pop cfr
elsif ARM64
- popLRAndFP
+ pop lr, cfr
end
end
@@ -298,7 +398,7 @@
if X86 or X86_WIN or X86_64 or X86_64_WIN
push cfr
elsif ARM64
- pushLRAndFP
+ push cfr, lr
elsif C_LOOP or ARM or ARMv7 or ARMv7_TRADITIONAL or MIPS or SH4
push lr
push cfr
@@ -310,7 +410,7 @@
if X86 or X86_WIN or X86_64 or X86_64_WIN
pop cfr
elsif ARM64
- popLRAndFP
+ pop lr, cfr
elsif C_LOOP or ARM or ARMv7 or ARMv7_TRADITIONAL or MIPS or SH4
pop cfr
pop lr
@@ -324,12 +424,12 @@
elsif X86 or X86_WIN
push cfr
elsif ARM64
- pushLRAndFP
+ push cfr, lr
elsif C_LOOP or ARM or ARMv7 or ARMv7_TRADITIONAL or MIPS or SH4
push lr
push cfr
end
- pushCalleeSaves
+ pushCalleeSaves()
if X86
subp 12, sp
elsif X86_WIN
@@ -372,14 +472,14 @@
addp 4, sp
end
- popCalleeSaves
+ popCalleeSaves()
if X86_64 or X86_64_WIN
pop t2
pop cfr
elsif X86 or X86_WIN
pop cfr
elsif ARM64
- popLRAndFP
+ pop lr, cfr
elsif C_LOOP or ARM or ARMv7 or ARMv7_TRADITIONAL or MIPS or SH4
pop cfr
pop lr
@@ -526,7 +626,7 @@
move cfr, sp # restore the previous sp
# pop the callerFrame since we will jump to a function that wants to save it
if ARM64
- popLRAndFP
+ pop lr, cfr
elsif ARM or ARMv7 or ARMv7_TRADITIONAL or MIPS or SH4
pop cfr
pop lr
@@ -763,13 +863,13 @@
# Entry point for the llint to initialize.
_llint_entry:
functionPrologue()
- pushCalleeSaves
+ pushCalleeSaves()
initPCRelative(t1)
# Include generated bytecode initialization file.
include InitBytecodes
- popCalleeSaves
+ popCalleeSaves()
functionEpilogue()
ret
end
Modified: trunk/Source/_javascript_Core/offlineasm/arm.rb (172428 => 172429)
--- trunk/Source/_javascript_Core/offlineasm/arm.rb 2014-08-12 03:01:52 UTC (rev 172428)
+++ trunk/Source/_javascript_Core/offlineasm/arm.rb 2014-08-12 03:20:04 UTC (rev 172429)
@@ -466,18 +466,6 @@
| op |
$asm.puts "push { #{op.armOperand} }"
}
- when "popCalleeSaves"
- if isARMv7
- $asm.puts "pop {r4-r6, r8-r11}"
- else
- $asm.puts "pop {r4-r10}"
- end
- when "pushCalleeSaves"
- if isARMv7
- $asm.puts "push {r4-r6, r8-r11}"
- else
- $asm.puts "push {r4-r10}"
- end
when "move"
if operands[0].immediate?
armMoveImmediate(operands[0].value, operands[1])
Modified: trunk/Source/_javascript_Core/offlineasm/arm64.rb (172428 => 172429)
--- trunk/Source/_javascript_Core/offlineasm/arm64.rb 2014-08-12 03:01:52 UTC (rev 172428)
+++ trunk/Source/_javascript_Core/offlineasm/arm64.rb 2014-08-12 03:20:04 UTC (rev 172429)
@@ -586,22 +586,6 @@
| ops |
$asm.puts "stp #{ops[0].arm64Operand(:ptr)}, #{ops[1].arm64Operand(:ptr)}, [sp, #-16]!"
}
- when "popLRAndFP"
- $asm.puts "ldp x29, x30, [sp], #16"
- when "pushLRAndFP"
- $asm.puts "stp x29, x30, [sp, #-16]!"
- when "popCalleeSaves"
- $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"
- $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/ast.rb (172428 => 172429)
--- trunk/Source/_javascript_Core/offlineasm/ast.rb 2014-08-12 03:01:52 UTC (rev 172428)
+++ trunk/Source/_javascript_Core/offlineasm/ast.rb 2014-08-12 03:20:04 UTC (rev 172429)
@@ -580,6 +580,44 @@
end
end
+class StringLiteral < NoChildren
+ attr_reader :value
+
+ def initialize(codeOrigin, value)
+ super(codeOrigin)
+ @value = value[1..-2]
+ raise "Bad string literal #{value.inspect} at #{codeOriginString}" unless value.is_a? String
+ end
+
+ def dump
+ "#{value}"
+ end
+
+ def ==(other)
+ other.is_a? StringLiteral and other.value == @value
+ end
+
+ def address?
+ false
+ end
+
+ def label?
+ false
+ end
+
+ def immediate?
+ false
+ end
+
+ def immediateOperand?
+ false
+ end
+
+ def register?
+ false
+ end
+end
+
class RegisterID < NoChildren
attr_reader :name
@@ -889,6 +927,8 @@
$asm.putLocalAnnotation
when "globalAnnotation"
$asm.putGlobalAnnotation
+ when "emit"
+ $asm.puts "#{operands[0].dump}"
else
raise "Unhandled opcode #{opcode} at #{codeOriginString}"
end
Modified: trunk/Source/_javascript_Core/offlineasm/cloop.rb (172428 => 172429)
--- trunk/Source/_javascript_Core/offlineasm/cloop.rb 2014-08-12 03:01:52 UTC (rev 172428)
+++ trunk/Source/_javascript_Core/offlineasm/cloop.rb 2014-08-12 03:20:04 UTC (rev 172429)
@@ -1104,10 +1104,7 @@
$asm.putc "POP(#{op.clDump});"
}
- when "pushCalleeSaves"
- when "popCalleeSaves"
-
# A convenience and compact call to crash because we don't want to use
# the generic llint crash mechanism which relies on the availability
# of the call instruction (which cannot be implemented in a generic
Modified: trunk/Source/_javascript_Core/offlineasm/instructions.rb (172428 => 172429)
--- trunk/Source/_javascript_Core/offlineasm/instructions.rb 2014-08-12 03:01:52 UTC (rev 172428)
+++ trunk/Source/_javascript_Core/offlineasm/instructions.rb 2014-08-12 03:20:04 UTC (rev 172429)
@@ -30,6 +30,7 @@
MACRO_INSTRUCTIONS =
[
+ "emit",
"addi",
"andi",
"lshifti",
@@ -248,8 +249,6 @@
"bnz",
"leai",
"leap",
- "pushCalleeSaves",
- "popCalleeSaves",
"memfence"
]
@@ -267,9 +266,7 @@
ARM64_INSTRUCTIONS =
[
- "pcrtoaddr", # Address from PC relative offset - adr instruction
- "popLRAndFP", # ARM64 requires registers to be pushed and popped in pairs,
- "pushLRAndFP" # therefore we do LR (link register) and FP (frame pointer) together.
+ "pcrtoaddr" # Address from PC relative offset - adr instruction
]
RISC_INSTRUCTIONS =
Modified: trunk/Source/_javascript_Core/offlineasm/mips.rb (172428 => 172429)
--- trunk/Source/_javascript_Core/offlineasm/mips.rb 2014-08-12 03:01:52 UTC (rev 172428)
+++ trunk/Source/_javascript_Core/offlineasm/mips.rb 2014-08-12 03:20:04 UTC (rev 172429)
@@ -850,20 +850,6 @@
$asm.puts "addiu $sp, $sp, -4"
$asm.puts "sw #{op.mipsOperand}, 0($sp)"
}
- when "popCalleeSaves"
- $asm.puts "lw $16, 0($sp)"
- $asm.puts "lw $17, 4($sp)"
- $asm.puts "lw $18, 8($sp)"
- $asm.puts "lw $19, 12($sp)"
- $asm.puts "lw $20, 16($sp)"
- $asm.puts "addiu $sp, $sp, 20"
- when "pushCalleeSaves"
- $asm.puts "addiu $sp, $sp, -20"
- $asm.puts "sw $20, 16($sp)"
- $asm.puts "sw $19, 12($sp)"
- $asm.puts "sw $18, 8($sp)"
- $asm.puts "sw $17, 4($sp)"
- $asm.puts "sw $16, 0($sp)"
when "move", "sxi2p", "zxi2p"
if operands[0].is_a? Immediate
mipsMoveImmediate(operands[0].value, operands[1])
Modified: trunk/Source/_javascript_Core/offlineasm/parser.rb (172428 => 172429)
--- trunk/Source/_javascript_Core/offlineasm/parser.rb 2014-08-12 03:01:52 UTC (rev 172428)
+++ trunk/Source/_javascript_Core/offlineasm/parser.rb 2014-08-12 03:20:04 UTC (rev 172429)
@@ -165,6 +165,8 @@
result << Token.new(CodeOrigin.new(fileName, lineNumber), $&)
when /\A[:,\(\)\[\]=\+\-~\|&^*]/
result << Token.new(CodeOrigin.new(fileName, lineNumber), $&)
+ when /\A".*"/
+ result << Token.new(CodeOrigin.new(fileName, lineNumber), $&)
else
raise "Lexer error at #{CodeOrigin.new(fileName, lineNumber).to_s}, unexpected sequence #{str[0..20].inspect}"
end
@@ -212,6 +214,10 @@
token =~ /\A[0-9]/
end
+def isString(token)
+ token =~ /\A".*"/
+end
+
#
# The parser. Takes an array of tokens and returns an AST. Methods
# other than parse(tokens) are not for public consumption.
@@ -397,6 +403,10 @@
result = Immediate.new(@tokens[@idx].codeOrigin, @tokens[@idx].string.to_i)
@idx += 1
result
+ elsif isString @tokens[@idx]
+ result = StringLiteral.new(@tokens[@idx].codeOrigin, @tokens[@idx].string)
+ @idx += 1
+ result
elsif isIdentifier @tokens[@idx]
codeOrigin, names = parseColonColon
if names.size > 1
@@ -438,7 +448,7 @@
end
def couldBeExpression
- @tokens[@idx] == "-" or @tokens[@idx] == "~" or @tokens[@idx] == "sizeof" or isInteger(@tokens[@idx]) or isVariable(@tokens[@idx]) or @tokens[@idx] == "("
+ @tokens[@idx] == "-" or @tokens[@idx] == "~" or @tokens[@idx] == "sizeof" or isInteger(@tokens[@idx]) or isString(@tokens[@idx]) or isVariable(@tokens[@idx]) or @tokens[@idx] == "("
end
def parseExpressionAdd
Modified: trunk/Source/_javascript_Core/offlineasm/sh4.rb (172428 => 172429)
--- trunk/Source/_javascript_Core/offlineasm/sh4.rb 2014-08-12 03:01:52 UTC (rev 172428)
+++ trunk/Source/_javascript_Core/offlineasm/sh4.rb 2014-08-12 03:20:04 UTC (rev 172429)
@@ -1091,18 +1091,6 @@
else
$asm.puts "mov.l #{sh4Operands(operands)}, @-r15"
end
- when "popCalleeSaves"
- $asm.puts "mov.l @r15+, r8"
- $asm.puts "mov.l @r15+, r9"
- $asm.puts "mov.l @r15+, r10"
- $asm.puts "mov.l @r15+, r11"
- $asm.puts "mov.l @r15+, r13"
- when "pushCalleeSaves"
- $asm.puts "mov.l r13, @-r15"
- $asm.puts "mov.l r11, @-r15"
- $asm.puts "mov.l r10, @-r15"
- $asm.puts "mov.l r9, @-r15"
- $asm.puts "mov.l r8, @-r15"
when "break"
# This special opcode always generates an illegal instruction exception.
$asm.puts ".word 0xfffd"
Modified: trunk/Source/_javascript_Core/offlineasm/transform.rb (172428 => 172429)
--- trunk/Source/_javascript_Core/offlineasm/transform.rb 2014-08-12 03:01:52 UTC (rev 172428)
+++ trunk/Source/_javascript_Core/offlineasm/transform.rb 2014-08-12 03:20:04 UTC (rev 172429)
@@ -423,6 +423,11 @@
end
end
+class StringLiteral
+ def validate
+ end
+end
+
class RegisterID
def validate
end
Modified: trunk/Source/_javascript_Core/offlineasm/x86.rb (172428 => 172429)
--- trunk/Source/_javascript_Core/offlineasm/x86.rb 2014-08-12 03:01:52 UTC (rev 172428)
+++ trunk/Source/_javascript_Core/offlineasm/x86.rb 2014-08-12 03:20:04 UTC (rev 172429)
@@ -1146,38 +1146,6 @@
| op |
$asm.puts "push #{op.x86Operand(:ptr)}"
}
- when "popCalleeSaves"
- if isX64
- if isMSVC
- $asm.puts "pop " + register("rsi")
- $asm.puts "pop " + register("rdi")
- end
- $asm.puts "pop " + register("rbx")
- $asm.puts "pop " + register("r15")
- $asm.puts "pop " + register("r14")
- $asm.puts "pop " + register("r13")
- $asm.puts "pop " + register("r12")
- else
- $asm.puts "pop " + register("ebx")
- $asm.puts "pop " + register("edi")
- $asm.puts "pop " + register("esi")
- end
- when "pushCalleeSaves"
- if isX64
- $asm.puts "push " + register("r12")
- $asm.puts "push " + register("r13")
- $asm.puts "push " + register("r14")
- $asm.puts "push " + register("r15")
- $asm.puts "push " + register("rbx")
- if isMSVC
- $asm.puts "push " + register("rdi")
- $asm.puts "push " + register("rsi")
- end
- else
- $asm.puts "push " + register("esi")
- $asm.puts "push " + register("edi")
- $asm.puts "push " + register("ebx")
- end
when "move"
handleMove
when "sxi2q"