<!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>[160468] 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/160468">160468</a></dd>
<dt>Author</dt> <dd>msaboff@apple.com</dd>
<dt>Date</dt> <dd>2013-12-11 17:57:43 -0800 (Wed, 11 Dec 2013)</dd>
</dl>

<h3>Log Message</h3>
<pre>CStack Branch: enable use of DFG for simple JavaScript
https://bugs.webkit.org/show_bug.cgi?id=125599

Not yet reviewed.

Added code to set up the stack pointer on entry and for call for the DFG.  Changed the
SpeculativeJIT::calleeFrame*() helpers to use the stack pointer instead of the call frame
register to build the callee frame relative to the stack.

Disabled JSStack::sanitizeStack().  Removed some calls to checkStackPointerAlignment() used
for earlier debugging.

* dfg/DFGGraph.cpp:
(JSC::DFG::Graph::frameRegisterCount):
* dfg/DFGJITCompiler.cpp:
(JSC::DFG::JITCompiler::compileEntry):
(JSC::DFG::JITCompiler::compile):
(JSC::DFG::JITCompiler::compileFunction):
* dfg/DFGOSREntry.cpp:
(JSC::DFG::prepareOSREntry):
* dfg/DFGSpeculativeJIT.h:
(JSC::DFG::SpeculativeJIT::calleeFrameOffset):
(JSC::DFG::SpeculativeJIT::calleeFrameSlot):
(JSC::DFG::SpeculativeJIT::calleeArgumentSlot):
(JSC::DFG::SpeculativeJIT::calleeFrameTagSlot):
(JSC::DFG::SpeculativeJIT::calleeFramePayloadSlot):
(JSC::DFG::SpeculativeJIT::calleeArgumentTagSlot):
(JSC::DFG::SpeculativeJIT::calleeArgumentPayloadSlot):
(JSC::DFG::SpeculativeJIT::calleeFrameCallerFrame):
* dfg/DFGSpeculativeJIT32_64.cpp:
(JSC::DFG::SpeculativeJIT::emitCall):
* dfg/DFGSpeculativeJIT64.cpp:
(JSC::DFG::SpeculativeJIT::emitCall):
* ftl/FTLThunks.cpp:
(JSC::FTL::osrExitGenerationThunkGenerator):
(JSC::FTL::slowPathCallThunkGenerator):
* interpreter/JSStack.cpp:
(JSC::JSStack::sanitizeStack):
* interpreter/JSStack.h:
* interpreter/ProtoCallFrame.cpp:
(JSC::ProtoCallFrame::init):
* jit/JIT.cpp:
(JSC::JIT::emitEnterOptimizationCheck):
(JSC::JIT::privateCompile):
* jit/JITOpcodes.cpp:
(JSC::JIT::emit_op_ret):
(JSC::JIT::emit_op_enter):
(JSC::JIT::emitSlow_op_loop_hint):
* jit/Repatch.cpp:
(JSC::linkClosureCall):
* jit/ThunkGenerators.cpp:
(JSC::slowPathFor):
* 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="#branchesjsCStackSourceJavaScriptCoredfgDFGGraphcpp">branches/jsCStack/Source/JavaScriptCore/dfg/DFGGraph.cpp</a></li>
<li><a href="#branchesjsCStackSourceJavaScriptCoredfgDFGJITCompilercpp">branches/jsCStack/Source/JavaScriptCore/dfg/DFGJITCompiler.cpp</a></li>
<li><a href="#branchesjsCStackSourceJavaScriptCoredfgDFGOSREntrycpp">branches/jsCStack/Source/JavaScriptCore/dfg/DFGOSREntry.cpp</a></li>
<li><a href="#branchesjsCStackSourceJavaScriptCoredfgDFGSpeculativeJITh">branches/jsCStack/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.h</a></li>
<li><a href="#branchesjsCStackSourceJavaScriptCoredfgDFGSpeculativeJIT32_64cpp">branches/jsCStack/Source/JavaScriptCore/dfg/DFGSpeculativeJIT32_64.cpp</a></li>
<li><a href="#branchesjsCStackSourceJavaScriptCoredfgDFGSpeculativeJIT64cpp">branches/jsCStack/Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp</a></li>
<li><a href="#branchesjsCStackSourceJavaScriptCoreftlFTLThunkscpp">branches/jsCStack/Source/JavaScriptCore/ftl/FTLThunks.cpp</a></li>
<li><a href="#branchesjsCStackSourceJavaScriptCoreinterpreterJSStackcpp">branches/jsCStack/Source/JavaScriptCore/interpreter/JSStack.cpp</a></li>
<li><a href="#branchesjsCStackSourceJavaScriptCoreinterpreterJSStackh">branches/jsCStack/Source/JavaScriptCore/interpreter/JSStack.h</a></li>
<li><a href="#branchesjsCStackSourceJavaScriptCoreinterpreterProtoCallFramecpp">branches/jsCStack/Source/JavaScriptCore/interpreter/ProtoCallFrame.cpp</a></li>
<li><a href="#branchesjsCStackSourceJavaScriptCorejitJITcpp">branches/jsCStack/Source/JavaScriptCore/jit/JIT.cpp</a></li>
<li><a href="#branchesjsCStackSourceJavaScriptCorejitJITOpcodescpp">branches/jsCStack/Source/JavaScriptCore/jit/JITOpcodes.cpp</a></li>
<li><a href="#branchesjsCStackSourceJavaScriptCorejitRepatchcpp">branches/jsCStack/Source/JavaScriptCore/jit/Repatch.cpp</a></li>
<li><a href="#branchesjsCStackSourceJavaScriptCorejitThunkGeneratorscpp">branches/jsCStack/Source/JavaScriptCore/jit/ThunkGenerators.cpp</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 (160467 => 160468)</h4>
<pre class="diff"><span>
<span class="info">--- branches/jsCStack/Source/JavaScriptCore/ChangeLog        2013-12-12 01:56:25 UTC (rev 160467)
+++ branches/jsCStack/Source/JavaScriptCore/ChangeLog        2013-12-12 01:57:43 UTC (rev 160468)
</span><span class="lines">@@ -1,3 +1,60 @@
</span><ins>+2013-12-11  Michael Saboff  &lt;msaboff@apple.com&gt;
+
+        CStack Branch: enable use of DFG for simple JavaScript
+        https://bugs.webkit.org/show_bug.cgi?id=125599
+
+        Not yet reviewed.
+
+        Added code to set up the stack pointer on entry and for call for the DFG.  Changed the 
+        SpeculativeJIT::calleeFrame*() helpers to use the stack pointer instead of the call frame
+        register to build the callee frame relative to the stack.
+
+        Disabled JSStack::sanitizeStack().  Removed some calls to checkStackPointerAlignment() used
+        for earlier debugging.
+
+        * dfg/DFGGraph.cpp:
+        (JSC::DFG::Graph::frameRegisterCount):
+        * dfg/DFGJITCompiler.cpp:
+        (JSC::DFG::JITCompiler::compileEntry):
+        (JSC::DFG::JITCompiler::compile):
+        (JSC::DFG::JITCompiler::compileFunction):
+        * dfg/DFGOSREntry.cpp:
+        (JSC::DFG::prepareOSREntry):
+        * dfg/DFGSpeculativeJIT.h:
+        (JSC::DFG::SpeculativeJIT::calleeFrameOffset):
+        (JSC::DFG::SpeculativeJIT::calleeFrameSlot):
+        (JSC::DFG::SpeculativeJIT::calleeArgumentSlot):
+        (JSC::DFG::SpeculativeJIT::calleeFrameTagSlot):
+        (JSC::DFG::SpeculativeJIT::calleeFramePayloadSlot):
+        (JSC::DFG::SpeculativeJIT::calleeArgumentTagSlot):
+        (JSC::DFG::SpeculativeJIT::calleeArgumentPayloadSlot):
+        (JSC::DFG::SpeculativeJIT::calleeFrameCallerFrame):
+        * dfg/DFGSpeculativeJIT32_64.cpp:
+        (JSC::DFG::SpeculativeJIT::emitCall):
+        * dfg/DFGSpeculativeJIT64.cpp:
+        (JSC::DFG::SpeculativeJIT::emitCall):
+        * ftl/FTLThunks.cpp:
+        (JSC::FTL::osrExitGenerationThunkGenerator):
+        (JSC::FTL::slowPathCallThunkGenerator):
+        * interpreter/JSStack.cpp:
+        (JSC::JSStack::sanitizeStack):
+        * interpreter/JSStack.h:
+        * interpreter/ProtoCallFrame.cpp:
+        (JSC::ProtoCallFrame::init):
+        * jit/JIT.cpp:
+        (JSC::JIT::emitEnterOptimizationCheck):
+        (JSC::JIT::privateCompile):
+        * jit/JITOpcodes.cpp:
+        (JSC::JIT::emit_op_ret):
+        (JSC::JIT::emit_op_enter):
+        (JSC::JIT::emitSlow_op_loop_hint):
+        * jit/Repatch.cpp:
+        (JSC::linkClosureCall):
+        * jit/ThunkGenerators.cpp:
+        (JSC::slowPathFor):
+        * llint/LowLevelInterpreter.asm:
+        * llint/LowLevelInterpreter64.asm:
+
</ins><span class="cx"> 2013-12-09  Michael Saboff  &lt;msaboff@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         CStack Branch: ctiNativeCallFallback and friends should renamed ...NativeTailCall
</span></span></pre></div>
<a id="branchesjsCStackSourceJavaScriptCoredfgDFGGraphcpp"></a>
<div class="modfile"><h4>Modified: branches/jsCStack/Source/JavaScriptCore/dfg/DFGGraph.cpp (160467 => 160468)</h4>
<pre class="diff"><span>
<span class="info">--- branches/jsCStack/Source/JavaScriptCore/dfg/DFGGraph.cpp        2013-12-12 01:56:25 UTC (rev 160467)
+++ branches/jsCStack/Source/JavaScriptCore/dfg/DFGGraph.cpp        2013-12-12 01:57:43 UTC (rev 160468)
</span><span class="lines">@@ -703,7 +703,9 @@
</span><span class="cx"> 
</span><span class="cx"> unsigned Graph::frameRegisterCount()
</span><span class="cx"> {
</span><del>-    return m_nextMachineLocal + m_parameterSlots;
</del><ins>+    unsigned result = m_nextMachineLocal + m_parameterSlots;
+    result += result &amp; 1; // Align the register count
+    return result;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> unsigned Graph::requiredRegisterCountForExit()
</span></span></pre></div>
<a id="branchesjsCStackSourceJavaScriptCoredfgDFGJITCompilercpp"></a>
<div class="modfile"><h4>Modified: branches/jsCStack/Source/JavaScriptCore/dfg/DFGJITCompiler.cpp (160467 => 160468)</h4>
<pre class="diff"><span>
<span class="info">--- branches/jsCStack/Source/JavaScriptCore/dfg/DFGJITCompiler.cpp        2013-12-12 01:56:25 UTC (rev 160467)
+++ branches/jsCStack/Source/JavaScriptCore/dfg/DFGJITCompiler.cpp        2013-12-12 01:57:43 UTC (rev 160468)
</span><span class="lines">@@ -92,8 +92,7 @@
</span><span class="cx"> void JITCompiler::compileEntry()
</span><span class="cx"> {
</span><span class="cx">     // This code currently matches the old JIT. In the function header we need to
</span><del>-    // pop the return address (since we do not allow any recursion on the machine
-    // stack), and perform a fast stack check.
</del><ins>+    // save return address and call frame via the prologue and perform a fast stack check.
</ins><span class="cx">     // FIXME: https://bugs.webkit.org/show_bug.cgi?id=56292
</span><span class="cx">     // We'll need to convert the remaining cti_ style calls (specifically the stack
</span><span class="cx">     // check) which will be dependent on stack layout. (We'd need to account for this in
</span><span class="lines">@@ -277,6 +276,9 @@
</span><span class="cx">     setStartOfCode();
</span><span class="cx">     compileEntry();
</span><span class="cx">     m_speculative = adoptPtr(new SpeculativeJIT(*this));
</span><ins>+    checkStackPointerAlignment();
+    addPtr(TrustedImm32(-(m_graph.frameRegisterCount() - JSStack::CallerFrameAndPCSize) * sizeof(Register)), GPRInfo::callFrameRegister, stackPointerRegister);
+    checkStackPointerAlignment();
</ins><span class="cx">     compileBody();
</span><span class="cx">     setEndOfMainPath();
</span><span class="cx"> 
</span><span class="lines">@@ -329,7 +331,12 @@
</span><span class="cx">     // Return here after stack check.
</span><span class="cx">     Label fromStackCheck = label();
</span><span class="cx"> 
</span><ins>+    checkStackPointerAlignment();
</ins><span class="cx"> 
</span><ins>+    // Move the stack pointer down to accommodate locals
+    addPtr(TrustedImm32(-(m_graph.frameRegisterCount() - JSStack::CallerFrameAndPCSize) * sizeof(Register)), GPRInfo::callFrameRegister, stackPointerRegister);
+    checkStackPointerAlignment();
+
</ins><span class="cx">     // === Function body code generation ===
</span><span class="cx">     m_speculative = adoptPtr(new SpeculativeJIT(*this));
</span><span class="cx">     compileBody();
</span></span></pre></div>
<a id="branchesjsCStackSourceJavaScriptCoredfgDFGOSREntrycpp"></a>
<div class="modfile"><h4>Modified: branches/jsCStack/Source/JavaScriptCore/dfg/DFGOSREntry.cpp (160467 => 160468)</h4>
<pre class="diff"><span>
<span class="info">--- branches/jsCStack/Source/JavaScriptCore/dfg/DFGOSREntry.cpp        2013-12-12 01:56:25 UTC (rev 160467)
+++ branches/jsCStack/Source/JavaScriptCore/dfg/DFGOSREntry.cpp        2013-12-12 01:57:43 UTC (rev 160468)
</span><span class="lines">@@ -213,12 +213,14 @@
</span><span class="cx">     
</span><span class="cx">     // 5) Clear those parts of the call frame that the DFG ain't using. This helps GC on some
</span><span class="cx">     //    programs by eliminating some stale pointer pathologies.
</span><del>-    
</del><ins>+
+#if 0 // FIXME: CStack - This needs to be verified before being enabled
</ins><span class="cx">     for (unsigned i = frameSize; i--;) {
</span><span class="cx">         if (entry-&gt;m_machineStackUsed.get(i))
</span><span class="cx">             continue;
</span><span class="cx">         registers[virtualRegisterForLocal(i).offset()] = JSValue::encode(JSValue());
</span><span class="cx">     }
</span><ins>+#endif
</ins><span class="cx">     
</span><span class="cx">     // 6) Fix the call frame.
</span><span class="cx">     
</span></span></pre></div>
<a id="branchesjsCStackSourceJavaScriptCoredfgDFGSpeculativeJITh"></a>
<div class="modfile"><h4>Modified: branches/jsCStack/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.h (160467 => 160468)</h4>
<pre class="diff"><span>
<span class="info">--- branches/jsCStack/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.h        2013-12-12 01:56:25 UTC (rev 160467)
+++ branches/jsCStack/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.h        2013-12-12 01:57:43 UTC (rev 160468)
</span><span class="lines">@@ -727,44 +727,45 @@
</span><span class="cx">     
</span><span class="cx">     ptrdiff_t calleeFrameOffset(int numArgs)
</span><span class="cx">     {
</span><del>-        return virtualRegisterForLocal(m_jit.graph().m_nextMachineLocal + JSStack::CallFrameHeaderSize + numArgs).offset() * sizeof(Register);
</del><ins>+        return virtualRegisterForLocal(m_jit.graph().m_nextMachineLocal - 1 + JSStack::CallFrameHeaderSize + numArgs).offset() * sizeof(Register);
</ins><span class="cx">     }
</span><span class="cx">     
</span><span class="cx">     // Access to our fixed callee CallFrame.
</span><del>-    MacroAssembler::Address calleeFrameSlot(int numArgs, int slot)
</del><ins>+    MacroAssembler::Address calleeFrameSlot(int slot)
</ins><span class="cx">     {
</span><del>-        return MacroAssembler::Address(GPRInfo::callFrameRegister, calleeFrameOffset(numArgs) + sizeof(Register) * slot);
</del><ins>+        ASSERT(slot &gt;= JSStack::CallerFrameAndPCSize);
+        return MacroAssembler::Address(MacroAssembler::stackPointerRegister, sizeof(Register) * (slot - JSStack::CallerFrameAndPCSize));
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // Access to our fixed callee CallFrame.
</span><del>-    MacroAssembler::Address calleeArgumentSlot(int numArgs, int argument)
</del><ins>+    MacroAssembler::Address calleeArgumentSlot(int argument)
</ins><span class="cx">     {
</span><del>-        return calleeFrameSlot(numArgs, virtualRegisterForArgument(argument).offset());
</del><ins>+        return calleeFrameSlot(virtualRegisterForArgument(argument).offset());
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    MacroAssembler::Address calleeFrameTagSlot(int numArgs, int slot)
</del><ins>+    MacroAssembler::Address calleeFrameTagSlot(int slot)
</ins><span class="cx">     {
</span><del>-        return calleeFrameSlot(numArgs, slot).withOffset(OBJECT_OFFSETOF(EncodedValueDescriptor, asBits.tag));
</del><ins>+        return calleeFrameSlot(slot).withOffset(OBJECT_OFFSETOF(EncodedValueDescriptor, asBits.tag));
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    MacroAssembler::Address calleeFramePayloadSlot(int numArgs, int slot)
</del><ins>+    MacroAssembler::Address calleeFramePayloadSlot(int slot)
</ins><span class="cx">     {
</span><del>-        return calleeFrameSlot(numArgs, slot).withOffset(OBJECT_OFFSETOF(EncodedValueDescriptor, asBits.payload));
</del><ins>+        return calleeFrameSlot(slot).withOffset(OBJECT_OFFSETOF(EncodedValueDescriptor, asBits.payload));
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    MacroAssembler::Address calleeArgumentTagSlot(int numArgs, int argument)
</del><ins>+    MacroAssembler::Address calleeArgumentTagSlot(int argument)
</ins><span class="cx">     {
</span><del>-        return calleeArgumentSlot(numArgs, argument).withOffset(OBJECT_OFFSETOF(EncodedValueDescriptor, asBits.tag));
</del><ins>+        return calleeArgumentSlot(argument).withOffset(OBJECT_OFFSETOF(EncodedValueDescriptor, asBits.tag));
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    MacroAssembler::Address calleeArgumentPayloadSlot(int numArgs, int argument)
</del><ins>+    MacroAssembler::Address calleeArgumentPayloadSlot(int argument)
</ins><span class="cx">     {
</span><del>-        return calleeArgumentSlot(numArgs, argument).withOffset(OBJECT_OFFSETOF(EncodedValueDescriptor, asBits.payload));
</del><ins>+        return calleeArgumentSlot(argument).withOffset(OBJECT_OFFSETOF(EncodedValueDescriptor, asBits.payload));
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    MacroAssembler::Address calleeFrameCallerFrame(int numArgs)
</del><ins>+    MacroAssembler::Address calleeFrameCallerFrame()
</ins><span class="cx">     {
</span><del>-        return calleeFrameSlot(numArgs, 0).withOffset(CallFrame::callerFrameOffset());
</del><ins>+        return calleeFrameSlot(0).withOffset(CallFrame::callerFrameOffset());
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     void emitCall(Node*);
</span></span></pre></div>
<a id="branchesjsCStackSourceJavaScriptCoredfgDFGSpeculativeJIT32_64cpp"></a>
<div class="modfile"><h4>Modified: branches/jsCStack/Source/JavaScriptCore/dfg/DFGSpeculativeJIT32_64.cpp (160467 => 160468)</h4>
<pre class="diff"><span>
<span class="info">--- branches/jsCStack/Source/JavaScriptCore/dfg/DFGSpeculativeJIT32_64.cpp        2013-12-12 01:56:25 UTC (rev 160467)
+++ branches/jsCStack/Source/JavaScriptCore/dfg/DFGSpeculativeJIT32_64.cpp        2013-12-12 01:57:43 UTC (rev 160468)
</span><span class="lines">@@ -659,10 +659,10 @@
</span><span class="cx">     
</span><span class="cx">     int numArgs = numPassedArgs + dummyThisArgument;
</span><span class="cx"> 
</span><del>-    m_jit.store32(MacroAssembler::TrustedImm32(numArgs), calleeFramePayloadSlot(numArgs, JSStack::ArgumentCount));
-    m_jit.storePtr(GPRInfo::callFrameRegister, calleeFrameCallerFrame(numArgs));
-    m_jit.store32(calleePayloadGPR, calleeFramePayloadSlot(numArgs, JSStack::Callee));
-    m_jit.store32(calleeTagGPR, calleeFrameTagSlot(numArgs, JSStack::Callee));
</del><ins>+    m_jit.store32(MacroAssembler::TrustedImm32(numArgs), calleeFramePayloadSlot(JSStack::ArgumentCount));
+    m_jit.storePtr(GPRInfo::callFrameRegister, calleeFrameCallerFrame());
+    m_jit.store32(calleePayloadGPR, calleeFramePayloadSlot(JSStack::Callee));
+    m_jit.store32(calleeTagGPR, calleeFrameTagSlot(JSStack::Callee));
</ins><span class="cx"> 
</span><span class="cx">     for (int i = 0; i &lt; numPassedArgs; i++) {
</span><span class="cx">         Edge argEdge = m_jit.graph().m_varArgChildren[node-&gt;firstChild() + 1 + i];
</span><span class="lines">@@ -671,8 +671,8 @@
</span><span class="cx">         GPRReg argPayloadGPR = arg.payloadGPR();
</span><span class="cx">         use(argEdge);
</span><span class="cx"> 
</span><del>-        m_jit.store32(argTagGPR, calleeArgumentTagSlot(numArgs, i + dummyThisArgument));
-        m_jit.store32(argPayloadGPR, calleeArgumentPayloadSlot(numArgs, i + dummyThisArgument));
</del><ins>+        m_jit.store32(argTagGPR, calleeArgumentTagSlot(i + dummyThisArgument));
+        m_jit.store32(argPayloadGPR, calleeArgumentPayloadSlot(i + dummyThisArgument));
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     flushRegisters();
</span></span></pre></div>
<a id="branchesjsCStackSourceJavaScriptCoredfgDFGSpeculativeJIT64cpp"></a>
<div class="modfile"><h4>Modified: branches/jsCStack/Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp (160467 => 160468)</h4>
<pre class="diff"><span>
<span class="info">--- branches/jsCStack/Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp        2013-12-12 01:56:25 UTC (rev 160467)
+++ branches/jsCStack/Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp        2013-12-12 01:57:43 UTC (rev 160468)
</span><span class="lines">@@ -687,9 +687,8 @@
</span><span class="cx">     
</span><span class="cx">     int numArgs = numPassedArgs + dummyThisArgument;
</span><span class="cx">     
</span><del>-    m_jit.store32(MacroAssembler::TrustedImm32(numArgs), calleeFramePayloadSlot(numArgs, JSStack::ArgumentCount));
-    m_jit.store64(GPRInfo::callFrameRegister, calleeFrameCallerFrame(numArgs));
-    m_jit.store64(calleeGPR, calleeFrameSlot(numArgs, JSStack::Callee));
</del><ins>+    m_jit.store32(MacroAssembler::TrustedImm32(numArgs), calleeFramePayloadSlot(JSStack::ArgumentCount));
+    m_jit.store64(calleeGPR, calleeFrameSlot(JSStack::Callee));
</ins><span class="cx">     
</span><span class="cx">     for (int i = 0; i &lt; numPassedArgs; i++) {
</span><span class="cx">         Edge argEdge = m_jit.graph().m_varArgChildren[node-&gt;firstChild() + 1 + i];
</span><span class="lines">@@ -697,7 +696,7 @@
</span><span class="cx">         GPRReg argGPR = arg.gpr();
</span><span class="cx">         use(argEdge);
</span><span class="cx">         
</span><del>-        m_jit.store64(argGPR, calleeArgumentSlot(numArgs, i + dummyThisArgument));
</del><ins>+        m_jit.store64(argGPR, calleeArgumentSlot(i + dummyThisArgument));
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     flushRegisters();
</span><span class="lines">@@ -710,24 +709,29 @@
</span><span class="cx"> 
</span><span class="cx">     m_jit.emitStoreCodeOrigin(node-&gt;codeOrigin);
</span><span class="cx">     
</span><del>-    m_jit.addPtr(TrustedImm32(calleeFrameOffset(numArgs)), GPRInfo::callFrameRegister);
-    
</del><span class="cx">     slowPath.append(m_jit.branchPtrWithPatch(MacroAssembler::NotEqual, calleeGPR, targetToCheck, MacroAssembler::TrustedImmPtr(0)));
</span><span class="cx"> 
</span><span class="cx">     m_jit.loadPtr(MacroAssembler::Address(calleeGPR, OBJECT_OFFSETOF(JSFunction, m_scope)), resultGPR);
</span><del>-    m_jit.store64(resultGPR, MacroAssembler::Address(GPRInfo::callFrameRegister, static_cast&lt;ptrdiff_t&gt;(sizeof(Register)) * JSStack::ScopeChain));
</del><ins>+    m_jit.store64(resultGPR, calleeFrameSlot(JSStack::ScopeChain));
</ins><span class="cx"> 
</span><ins>+    // FIXME: CStack - remove the add/sub 16 before and after call.
+    m_jit.addPtr(TrustedImm32(16), MacroAssembler::stackPointerRegister);
+    
</ins><span class="cx">     JITCompiler::Call fastCall = m_jit.nearCall();
</span><del>-    
</del><ins>+
</ins><span class="cx">     JITCompiler::Jump done = m_jit.jump();
</span><span class="cx">     
</span><span class="cx">     slowPath.link(&amp;m_jit);
</span><span class="cx">     
</span><ins>+    m_jit.addPtr(TrustedImm32(16), MacroAssembler::stackPointerRegister);
+    
</ins><span class="cx">     m_jit.move(calleeGPR, GPRInfo::regT0); // Callee needs to be in regT0
</span><span class="cx">     JITCompiler::Call slowCall = m_jit.nearCall();
</span><span class="cx">     
</span><span class="cx">     done.link(&amp;m_jit);
</span><span class="cx">     
</span><ins>+    m_jit.addPtr(TrustedImm32(-16), MacroAssembler::stackPointerRegister);
+    
</ins><span class="cx">     m_jit.move(GPRInfo::returnValueGPR, resultGPR);
</span><span class="cx">     
</span><span class="cx">     jsValueResult(resultGPR, m_currentNode, DataFormatJS, UseChildrenCalledExplicitly);
</span></span></pre></div>
<a id="branchesjsCStackSourceJavaScriptCoreftlFTLThunkscpp"></a>
<div class="modfile"><h4>Modified: branches/jsCStack/Source/JavaScriptCore/ftl/FTLThunks.cpp (160467 => 160468)</h4>
<pre class="diff"><span>
<span class="info">--- branches/jsCStack/Source/JavaScriptCore/ftl/FTLThunks.cpp        2013-12-12 01:56:25 UTC (rev 160467)
+++ branches/jsCStack/Source/JavaScriptCore/ftl/FTLThunks.cpp        2013-12-12 01:57:43 UTC (rev 160468)
</span><span class="lines">@@ -74,7 +74,7 @@
</span><span class="cx">     // Prepare for tail call.
</span><span class="cx">     jit.pop(GPRInfo::regT1);
</span><span class="cx">     jit.pop(GPRInfo::regT1);
</span><del>-    // &amp;&amp;&amp;&amp;&amp; FIXME: Need to address the right way to adjust CFR and SP
</del><ins>+    // FIXME: CStack - Need to address the right way to adjust CFR and SP
</ins><span class="cx">     jit.pop(MacroAssembler::framePointerRegister);
</span><span class="cx">     
</span><span class="cx">     // At this point we're sitting on the return address - so if we did a jump right now, the
</span><span class="lines">@@ -82,7 +82,7 @@
</span><span class="cx">     // restore all registers.
</span><span class="cx">     
</span><span class="cx">     jit.restoreReturnAddressBeforeReturn(GPRInfo::regT0);
</span><del>-    // &amp;&amp;&amp;&amp; Through here
</del><ins>+    // FIXME: CStack - Through here
</ins><span class="cx"> 
</span><span class="cx">     restoreAllRegisters(jit, buffer);
</span><span class="cx"> 
</span><span class="lines">@@ -121,13 +121,13 @@
</span><span class="cx">         currentOffset += sizeof(double);
</span><span class="cx">     }
</span><span class="cx">     
</span><del>-    // &amp;&amp;&amp;&amp; FIXME: Need to do soemething like jit.emitFunctionPrologue();
</del><ins>+    // FIXME: CStack - Need to do soemething like jit.emitFunctionPrologue();
</ins><span class="cx">     jit.preserveReturnAddressAfterCall(GPRInfo::nonArgGPR0);
</span><span class="cx">     jit.storePtr(GPRInfo::nonArgGPR0, AssemblyHelpers::Address(MacroAssembler::stackPointerRegister, key.offset()));
</span><span class="cx">     
</span><span class="cx">     JITCompiler::Call call = jit.call();
</span><span class="cx"> 
</span><del>-    // &amp;&amp;&amp;&amp; FIXME: Need to do something like jit.emitFunctionEpilogue();
</del><ins>+    // FIXME: CStack - Need to do something like jit.emitFunctionEpilogue();
</ins><span class="cx">     jit.loadPtr(AssemblyHelpers::Address(MacroAssembler::stackPointerRegister, key.offset()), GPRInfo::nonPreservedNonReturnGPR);
</span><span class="cx">     jit.restoreReturnAddressBeforeReturn(GPRInfo::nonPreservedNonReturnGPR);
</span><span class="cx">     
</span></span></pre></div>
<a id="branchesjsCStackSourceJavaScriptCoreinterpreterJSStackcpp"></a>
<div class="modfile"><h4>Modified: branches/jsCStack/Source/JavaScriptCore/interpreter/JSStack.cpp (160467 => 160468)</h4>
<pre class="diff"><span>
<span class="info">--- branches/jsCStack/Source/JavaScriptCore/interpreter/JSStack.cpp        2013-12-12 01:56:25 UTC (rev 160467)
+++ branches/jsCStack/Source/JavaScriptCore/interpreter/JSStack.cpp        2013-12-12 01:57:43 UTC (rev 160468)
</span><span class="lines">@@ -105,6 +105,7 @@
</span><span class="cx"> 
</span><span class="cx"> void JSStack::sanitizeStack()
</span><span class="cx"> {
</span><ins>+#if 0 // FIXME: CStack - To be addressed later
</ins><span class="cx">     ASSERT(getTopOfStack() &lt;= getBaseOfStack());
</span><span class="cx">     
</span><span class="cx">     if (m_lastStackTop &lt; getTopOfStack()) {
</span><span class="lines">@@ -114,6 +115,7 @@
</span><span class="cx">     }
</span><span class="cx">     
</span><span class="cx">     m_lastStackTop = getTopOfStack();
</span><ins>+#endif
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void JSStack::releaseExcessCapacity()
</span></span></pre></div>
<a id="branchesjsCStackSourceJavaScriptCoreinterpreterJSStackh"></a>
<div class="modfile"><h4>Modified: branches/jsCStack/Source/JavaScriptCore/interpreter/JSStack.h (160467 => 160468)</h4>
<pre class="diff"><span>
<span class="info">--- branches/jsCStack/Source/JavaScriptCore/interpreter/JSStack.h        2013-12-12 01:56:25 UTC (rev 160467)
+++ branches/jsCStack/Source/JavaScriptCore/interpreter/JSStack.h        2013-12-12 01:57:43 UTC (rev 160468)
</span><span class="lines">@@ -61,6 +61,7 @@
</span><span class="cx">         WTF_MAKE_NONCOPYABLE(JSStack);
</span><span class="cx">     public:
</span><span class="cx">         enum CallFrameHeaderEntry {
</span><ins>+            CallerFrameAndPCSize = 0,
</ins><span class="cx">             CodeBlock = sizeof(CallerFrameAndPC) / sizeof(Register),
</span><span class="cx">             ScopeChain,
</span><span class="cx">             Callee,
</span></span></pre></div>
<a id="branchesjsCStackSourceJavaScriptCoreinterpreterProtoCallFramecpp"></a>
<div class="modfile"><h4>Modified: branches/jsCStack/Source/JavaScriptCore/interpreter/ProtoCallFrame.cpp (160467 => 160468)</h4>
<pre class="diff"><span>
<span class="info">--- branches/jsCStack/Source/JavaScriptCore/interpreter/ProtoCallFrame.cpp        2013-12-12 01:56:25 UTC (rev 160467)
+++ branches/jsCStack/Source/JavaScriptCore/interpreter/ProtoCallFrame.cpp        2013-12-12 01:57:43 UTC (rev 160468)
</span><span class="lines">@@ -43,7 +43,7 @@
</span><span class="cx">         if (paddedArgsCount &lt; numParameters)
</span><span class="cx">             paddedArgsCount = numParameters;
</span><span class="cx">     }
</span><del>-    // &amp;&amp;&amp;&amp; FIXME: Align the combination of sentinel frame + callee frame
</del><ins>+    // FIXME: CStack - Align the combination of sentinel frame + callee frame
</ins><span class="cx">     // Maybe this should be in callToJavaScript.
</span><span class="cx">     if (!(paddedArgsCount &amp; 1))
</span><span class="cx">         paddedArgsCount++;
</span></span></pre></div>
<a id="branchesjsCStackSourceJavaScriptCorejitJITcpp"></a>
<div class="modfile"><h4>Modified: branches/jsCStack/Source/JavaScriptCore/jit/JIT.cpp (160467 => 160468)</h4>
<pre class="diff"><span>
<span class="info">--- branches/jsCStack/Source/JavaScriptCore/jit/JIT.cpp        2013-12-12 01:56:25 UTC (rev 160467)
+++ branches/jsCStack/Source/JavaScriptCore/jit/JIT.cpp        2013-12-12 01:57:43 UTC (rev 160468)
</span><span class="lines">@@ -99,9 +99,11 @@
</span><span class="cx">     skipOptimize.append(branchAdd32(Signed, TrustedImm32(Options::executionCounterIncrementForEntry()), AbsoluteAddress(m_codeBlock-&gt;addressOfJITExecuteCounter())));
</span><span class="cx">     ASSERT(!m_bytecodeOffset);
</span><span class="cx">     callOperation(operationOptimize, m_bytecodeOffset);
</span><ins>+#if 0 // FIXME: CStack - need to fix OSR entry
</ins><span class="cx">     skipOptimize.append(branchTestPtr(Zero, returnValueGPR));
</span><span class="cx">     jump(returnValueGPR);
</span><span class="cx">     skipOptimize.link(this);
</span><ins>+#endif
</ins><span class="cx"> }
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="lines">@@ -559,7 +561,7 @@
</span><span class="cx">     if (m_codeBlock-&gt;codeType() == FunctionCode) {
</span><span class="cx">         stackCheck.link(this);
</span><span class="cx">         m_bytecodeOffset = 0;
</span><del>-        // &amp;&amp;&amp;&amp; This may need to have some stack space allocated to make the call
</del><ins>+        // FIXME: CStack - This may need to have some stack space allocated to make the call
</ins><span class="cx">         callOperationWithCallFrameRollbackOnException(operationStackCheck, m_codeBlock);
</span><span class="cx"> #ifndef NDEBUG
</span><span class="cx">         m_bytecodeOffset = (unsigned)-1; // Reset this, in order to guard its use with ASSERTs.
</span></span></pre></div>
<a id="branchesjsCStackSourceJavaScriptCorejitJITOpcodescpp"></a>
<div class="modfile"><h4>Modified: branches/jsCStack/Source/JavaScriptCore/jit/JITOpcodes.cpp (160467 => 160468)</h4>
<pre class="diff"><span>
<span class="info">--- branches/jsCStack/Source/JavaScriptCore/jit/JITOpcodes.cpp        2013-12-12 01:56:25 UTC (rev 160467)
+++ branches/jsCStack/Source/JavaScriptCore/jit/JITOpcodes.cpp        2013-12-12 01:57:43 UTC (rev 160468)
</span><span class="lines">@@ -262,7 +262,7 @@
</span><span class="cx">     // Return the result in %eax.
</span><span class="cx">     emitGetVirtualRegister(currentInstruction[1].u.operand, returnValueGPR);
</span><span class="cx"> 
</span><del>-    checkStackPointerAlignment(); // &amp;&amp;&amp;&amp;
</del><ins>+    checkStackPointerAlignment();
</ins><span class="cx">     emitFunctionEpilogue();
</span><span class="cx">     ret();
</span><span class="cx"> }
</span><span class="lines">@@ -778,7 +778,6 @@
</span><span class="cx"> 
</span><span class="cx"> void JIT::emit_op_enter(Instruction*)
</span><span class="cx"> {
</span><del>-    checkStackPointerAlignment(); // &amp;&amp;&amp;&amp;
</del><span class="cx">     emitEnterOptimizationCheck();
</span><span class="cx">     
</span><span class="cx">     // Even though CTI doesn't use them, we initialize our constant
</span><span class="lines">@@ -1123,9 +1122,11 @@
</span><span class="cx">         linkSlowCase(iter);
</span><span class="cx">         
</span><span class="cx">         callOperation(operationOptimize, m_bytecodeOffset);
</span><ins>+#if 0 // FIXME: CStack - need to fix OSR entry
</ins><span class="cx">         Jump noOptimizedEntry = branchTestPtr(Zero, returnValueGPR);
</span><span class="cx">         jump(returnValueGPR);
</span><span class="cx">         noOptimizedEntry.link(this);
</span><ins>+#endif
</ins><span class="cx"> 
</span><span class="cx">         emitJumpSlowToHot(jump(), OPCODE_LENGTH(op_loop_hint));
</span><span class="cx">     }
</span></span></pre></div>
<a id="branchesjsCStackSourceJavaScriptCorejitRepatchcpp"></a>
<div class="modfile"><h4>Modified: branches/jsCStack/Source/JavaScriptCore/jit/Repatch.cpp (160467 => 160468)</h4>
<pre class="diff"><span>
<span class="info">--- branches/jsCStack/Source/JavaScriptCore/jit/Repatch.cpp        2013-12-12 01:56:25 UTC (rev 160467)
+++ branches/jsCStack/Source/JavaScriptCore/jit/Repatch.cpp        2013-12-12 01:57:43 UTC (rev 160468)
</span><span class="lines">@@ -1385,7 +1385,7 @@
</span><span class="cx"> #endif
</span><span class="cx">     stubJit.move(CCallHelpers::TrustedImmPtr(callLinkInfo.callReturnLocation.executableAddress()), GPRInfo::nonArgGPR2);
</span><span class="cx">     
</span><del>-    // &amp;&amp;&amp;&amp; FIXME: Think the following instruction should be a poke
</del><ins>+    // FIXME: CStack - Think the restoreReturnAddressBeforeReturn() instruction should be a poke
</ins><span class="cx">     stubJit.breakpoint();
</span><span class="cx">     stubJit.restoreReturnAddressBeforeReturn(GPRInfo::nonArgGPR2);
</span><span class="cx">     AssemblyHelpers::Jump slow = stubJit.jump();
</span></span></pre></div>
<a id="branchesjsCStackSourceJavaScriptCorejitThunkGeneratorscpp"></a>
<div class="modfile"><h4>Modified: branches/jsCStack/Source/JavaScriptCore/jit/ThunkGenerators.cpp (160467 => 160468)</h4>
<pre class="diff"><span>
<span class="info">--- branches/jsCStack/Source/JavaScriptCore/jit/ThunkGenerators.cpp        2013-12-12 01:56:25 UTC (rev 160467)
+++ branches/jsCStack/Source/JavaScriptCore/jit/ThunkGenerators.cpp        2013-12-12 01:57:43 UTC (rev 160468)
</span><span class="lines">@@ -94,7 +94,7 @@
</span><span class="cx">     // 2) Host call return value returner thingy.
</span><span class="cx">     // 3) The function to call.
</span><span class="cx">     emitPointerValidation(jit, GPRInfo::returnValueGPR);
</span><del>-    jit.emitFunctionEpilogue();
</del><ins>+    jit.pop(GPRInfo::callFrameRegister);
</ins><span class="cx">     jit.jump(GPRInfo::returnValueGPR);
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="branchesjsCStackSourceJavaScriptCorellintLowLevelInterpreterasm"></a>
<div class="modfile"><h4>Modified: branches/jsCStack/Source/JavaScriptCore/llint/LowLevelInterpreter.asm (160467 => 160468)</h4>
<pre class="diff"><span>
<span class="info">--- branches/jsCStack/Source/JavaScriptCore/llint/LowLevelInterpreter.asm        2013-12-12 01:56:25 UTC (rev 160467)
+++ branches/jsCStack/Source/JavaScriptCore/llint/LowLevelInterpreter.asm        2013-12-12 01:57:43 UTC (rev 160468)
</span><span class="lines">@@ -354,8 +354,9 @@
</span><span class="cx">         baddis 5, CodeBlock::m_llintExecuteCounter + ExecutionCounter::m_counter[t1], .continue
</span><span class="cx">         cCall2(osrSlowPath, cfr, PC)
</span><span class="cx">         btpz t0, .recover
</span><del>-        pop cfr # pop the callerFrame since we will jump to a function that wants to save it
-        jmp t0
</del><ins>+        # FIXME: Turn off OSR entry
+        # pop cfr # pop the callerFrame since we will jump to a function that wants to save it
+        # jmp t0
</ins><span class="cx">     .recover:
</span><span class="cx">         codeBlockGetter(t1)
</span><span class="cx">     .continue:
</span></span></pre></div>
<a id="branchesjsCStackSourceJavaScriptCorellintLowLevelInterpreter64asm"></a>
<div class="modfile"><h4>Modified: branches/jsCStack/Source/JavaScriptCore/llint/LowLevelInterpreter64.asm (160467 => 160468)</h4>
<pre class="diff"><span>
<span class="info">--- branches/jsCStack/Source/JavaScriptCore/llint/LowLevelInterpreter64.asm        2013-12-12 01:56:25 UTC (rev 160467)
+++ branches/jsCStack/Source/JavaScriptCore/llint/LowLevelInterpreter64.asm        2013-12-12 01:57:43 UTC (rev 160468)
</span><span class="lines">@@ -365,7 +365,8 @@
</span><span class="cx">             cCall2(_llint_loop_osr, cfr, PC)
</span><span class="cx">             move t1, cfr
</span><span class="cx">             btpz t0, .recover
</span><del>-            jmp t0
</del><ins>+            # FIXME: CStack - Turn OSR entry back on
+            # jmp t0
</ins><span class="cx">         .recover:
</span><span class="cx">             move t3, PB
</span><span class="cx">             loadi ArgumentCount + TagOffset[cfr], PC
</span></span></pre>
</div>
</div>

</body>
</html>