<!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>[161300] branches/jsCStack/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/161300">161300</a></dd>
<dt>Author</dt> <dd>msaboff@apple.com</dd>
<dt>Date</dt> <dd>2014-01-03 17:27:01 -0800 (Fri, 03 Jan 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>cstack Branch: ARM64 LLInt fails to compile due to instructions limitations with sp
https://bugs.webkit.org/show_bug.cgi?id=126423

Reviewed by Filip Pizlo.

Disabled the checkStackPointerAlignment macro for ARM64 since it will fault on any
improper changes to the stack pointer that result in bad alignment.

Changed uses of sp to either move into a temp register for certain operations, or
changed the order of subtract operands.  The operand ordering includes branch
compare pseudo ops.  In the process discovered that sanitizeStackForVM was plain
wrong and never executed the clear loop, so I fixed that while changing the operand
ordering of the compares.

The ARM64 build also complains that we are doing a compare and branch to a
non-local label so I changed branchIfException to branch around a jmp to
a possible global label.

Tested on X86-64.

* llint/LowLevelInterpreter.asm:
* llint/LowLevelInterpreter64.asm:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#branchesjsCStackSourceJavaScriptCoreChangeLog">branches/jsCStack/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#branchesjsCStackSourceJavaScriptCorellintLowLevelInterpreterasm">branches/jsCStack/Source/JavaScriptCore/llint/LowLevelInterpreter.asm</a></li>
<li><a href="#branchesjsCStackSourceJavaScriptCorellintLowLevelInterpreter64asm">branches/jsCStack/Source/JavaScriptCore/llint/LowLevelInterpreter64.asm</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="branchesjsCStackSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: branches/jsCStack/Source/JavaScriptCore/ChangeLog (161299 => 161300)</h4>
<pre class="diff"><span>
<span class="info">--- branches/jsCStack/Source/JavaScriptCore/ChangeLog        2014-01-04 01:20:12 UTC (rev 161299)
+++ branches/jsCStack/Source/JavaScriptCore/ChangeLog        2014-01-04 01:27:01 UTC (rev 161300)
</span><span class="lines">@@ -1,5 +1,30 @@
</span><span class="cx"> 2014-01-03  Michael Saboff  &lt;msaboff@apple.com&gt;
</span><span class="cx"> 
</span><ins>+        cstack Branch: ARM64 LLInt fails to compile due to instructions limitations with sp
+        https://bugs.webkit.org/show_bug.cgi?id=126423
+
+        Reviewed by Filip Pizlo.
+
+        Disabled the checkStackPointerAlignment macro for ARM64 since it will fault on any
+        improper changes to the stack pointer that result in bad alignment.
+
+        Changed uses of sp to either move into a temp register for certain operations, or
+        changed the order of subtract operands.  The operand ordering includes branch
+        compare pseudo ops.  In the process discovered that sanitizeStackForVM was plain
+        wrong and never executed the clear loop, so I fixed that while changing the operand
+        ordering of the compares.
+
+        The ARM64 build also complains that we are doing a compare and branch to a
+        non-local label so I changed branchIfException to branch around a jmp to
+        a possible global label.
+
+        Tested on X86-64.
+
+        * llint/LowLevelInterpreter.asm:
+        * llint/LowLevelInterpreter64.asm:
+
+2014-01-03  Michael Saboff  &lt;msaboff@apple.com&gt;
+
</ins><span class="cx">         CStack Branch: Make emitPutToCallFrameHeaderBeforePrologue and friends work for all platforms
</span><span class="cx">         https://bugs.webkit.org/show_bug.cgi?id=126421
</span><span class="cx"> 
</span></span></pre></div>
<a id="branchesjsCStackSourceJavaScriptCorellintLowLevelInterpreterasm"></a>
<div class="modfile"><h4>Modified: branches/jsCStack/Source/JavaScriptCore/llint/LowLevelInterpreter.asm (161299 => 161300)</h4>
<pre class="diff"><span>
<span class="info">--- branches/jsCStack/Source/JavaScriptCore/llint/LowLevelInterpreter.asm        2014-01-04 01:20:12 UTC (rev 161299)
+++ branches/jsCStack/Source/JavaScriptCore/llint/LowLevelInterpreter.asm        2014-01-04 01:27:01 UTC (rev 161300)
</span><span class="lines">@@ -217,11 +217,15 @@
</span><span class="cx"> end
</span><span class="cx"> 
</span><span class="cx"> macro checkStackPointerAlignment(tempReg, location)
</span><del>-    andp sp, 0xf, tempReg
-    btpz tempReg, .stackPointerOkay
-    move location, tempReg
-    break
-.stackPointerOkay:
</del><ins>+    if ARM64
+        # ARM64 will check for us!
+    else
+        andp sp, 0xf, tempReg
+        btpz tempReg, .stackPointerOkay
+        move location, tempReg
+        break
+    .stackPointerOkay:
+    end
</ins><span class="cx"> end
</span><span class="cx"> 
</span><span class="cx"> macro preserveCallerPCAndCFR()
</span><span class="lines">@@ -433,7 +437,12 @@
</span><span class="cx">         cCall2(osrSlowPath, cfr, PC)
</span><span class="cx">         btpz t0, .recover
</span><span class="cx">         move cfr, sp # restore the previous sp
</span><del>-        pop cfr # pop the callerFrame since we will jump to a function that wants to save it
</del><ins>+        # pop the callerFrame since we will jump to a function that wants to save it
+        if ARM64
+            popLRAndFP
+        else
+            pop cfr
+        end
</ins><span class="cx">         jmp t0
</span><span class="cx">     .recover:
</span><span class="cx">         codeBlockGetter(t1)
</span><span class="lines">@@ -568,16 +577,17 @@
</span><span class="cx">     end
</span><span class="cx"> 
</span><span class="cx">     loadp VM::m_lastStackTop[vm], address
</span><del>-    bpaeq address, sp, .zeroFillDone
</del><ins>+    bpbeq sp, address, .zeroFillDone
</ins><span class="cx"> 
</span><span class="cx">     move 0, zeroValue
</span><span class="cx"> .zeroFillLoop:
</span><span class="cx">     storep zeroValue, [address]
</span><del>-    subp PtrSize, address
-    bpb address, sp, .zeroFillDone
</del><ins>+    addp PtrSize, address
+    bpa sp, address, .zeroFillLoop
</ins><span class="cx"> 
</span><span class="cx"> .zeroFillDone:
</span><del>-    storep sp, VM::m_lastStackTop[vm]
</del><ins>+    move sp, address
+    storep address, VM::m_lastStackTop[vm]
</ins><span class="cx">     ret
</span><span class="cx"> 
</span><span class="cx"> 
</span></span></pre></div>
<a id="branchesjsCStackSourceJavaScriptCorellintLowLevelInterpreter64asm"></a>
<div class="modfile"><h4>Modified: branches/jsCStack/Source/JavaScriptCore/llint/LowLevelInterpreter64.asm (161299 => 161300)</h4>
<pre class="diff"><span>
<span class="info">--- branches/jsCStack/Source/JavaScriptCore/llint/LowLevelInterpreter64.asm        2014-01-04 01:20:12 UTC (rev 161299)
+++ branches/jsCStack/Source/JavaScriptCore/llint/LowLevelInterpreter64.asm        2014-01-04 01:27:01 UTC (rev 161300)
</span><span class="lines">@@ -125,10 +125,12 @@
</span><span class="cx">     # estimated stackPointerAtVMEntry value. Adjust the jsStackLimit by
</span><span class="cx">     # the delta between the actual stackPointerAtVMEntry and the estimate
</span><span class="cx">     # that we used previously.
</span><del>-    subp VM::stackPointerAtVMEntry[vm], sp, temp2
</del><ins>+    move sp, temp2
+    subp VM::stackPointerAtVMEntry[vm], temp2, temp2
</ins><span class="cx">     subp VM::m_jsStackLimit[vm], temp2, temp2
</span><span class="cx">     storep temp2, VM::m_jsStackLimit[vm]
</span><del>-    storep sp, VM::stackPointerAtVMEntry[vm]
</del><ins>+    move sp, temp2
+    storep temp2, VM::stackPointerAtVMEntry[vm]
</ins><span class="cx"> 
</span><span class="cx">     # The stack host zone ensures that we have adequate space for the
</span><span class="cx">     # VMEntrySentinelFrame. Proceed with allocating and initializing the
</span><span class="lines">@@ -199,7 +201,8 @@
</span><span class="cx">     jmp .copyArgsLoop
</span><span class="cx"> 
</span><span class="cx"> .copyArgsDone:
</span><del>-    storep sp, VM::topCallFrame[vm]
</del><ins>+    move sp, temp2
+    storep temp2, VM::topCallFrame[vm]
</ins><span class="cx"> 
</span><span class="cx">     move 0xffff000000000000, csr1
</span><span class="cx">     addp 2, csr1, csr2
</span><span class="lines">@@ -433,7 +436,9 @@
</span><span class="cx">     loadp ScopeChain[cfr], t3
</span><span class="cx">     andp MarkedBlockMask, t3
</span><span class="cx">     loadp MarkedBlock::m_weakSet + WeakSet::m_vm[t3], t3
</span><del>-    btqnz VM::m_exception[t3], label
</del><ins>+    btqz VM::m_exception[t3], .noException
+    jmp label
+.noException:
</ins><span class="cx"> end
</span><span class="cx"> 
</span><span class="cx"> 
</span></span></pre>
</div>
</div>

</body>
</html>