Title: [172429] trunk/Source/_javascript_Core
Revision
172429
Author
msab...@apple.com
Date
2014-08-11 20:20:04 -0700 (Mon, 11 Aug 2014)

Log Message

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:

Modified Paths

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"
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to