<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[172429] trunk/Source/JavaScriptCore</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/172429">172429</a></dd>
<dt>Author</dt> <dd>msaboff@apple.com</dd>
<dt>Date</dt> <dd>2014-08-11 20:20:04 -0700 (Mon, 11 Aug 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>Eliminate {push,pop}CalleeSaves in favor of individual pushes &amp; 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 &quot;emit&quot;
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:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceJavaScriptCoreChangeLog">trunk/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#trunkSourceJavaScriptCorellintLowLevelInterpreterasm">trunk/Source/JavaScriptCore/llint/LowLevelInterpreter.asm</a></li>
<li><a href="#trunkSourceJavaScriptCoreofflineasmarmrb">trunk/Source/JavaScriptCore/offlineasm/arm.rb</a></li>
<li><a href="#trunkSourceJavaScriptCoreofflineasmarm64rb">trunk/Source/JavaScriptCore/offlineasm/arm64.rb</a></li>
<li><a href="#trunkSourceJavaScriptCoreofflineasmastrb">trunk/Source/JavaScriptCore/offlineasm/ast.rb</a></li>
<li><a href="#trunkSourceJavaScriptCoreofflineasmclooprb">trunk/Source/JavaScriptCore/offlineasm/cloop.rb</a></li>
<li><a href="#trunkSourceJavaScriptCoreofflineasminstructionsrb">trunk/Source/JavaScriptCore/offlineasm/instructions.rb</a></li>
<li><a href="#trunkSourceJavaScriptCoreofflineasmmipsrb">trunk/Source/JavaScriptCore/offlineasm/mips.rb</a></li>
<li><a href="#trunkSourceJavaScriptCoreofflineasmparserrb">trunk/Source/JavaScriptCore/offlineasm/parser.rb</a></li>
<li><a href="#trunkSourceJavaScriptCoreofflineasmsh4rb">trunk/Source/JavaScriptCore/offlineasm/sh4.rb</a></li>
<li><a href="#trunkSourceJavaScriptCoreofflineasmtransformrb">trunk/Source/JavaScriptCore/offlineasm/transform.rb</a></li>
<li><a href="#trunkSourceJavaScriptCoreofflineasmx86rb">trunk/Source/JavaScriptCore/offlineasm/x86.rb</a></li>
</ul>

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

</body>
</html>