<!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>[188654] branches/jsc-tailcall/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/188654">188654</a></dd>
<dt>Author</dt> <dd>msaboff@apple.com</dd>
<dt>Date</dt> <dd>2015-08-19 15:26:29 -0700 (Wed, 19 Aug 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>jsc-tailcall: Unify Register Offset classes
https://bugs.webkit.org/show_bug.cgi?id=148167

Reviewed by Basile Clement.

The is primarily a refactoring change.

Moved ftl/FTLRegisterAtOffset.{cpp,h} to jit/RegisterAtOffset.{cpp,h}.
Factored out the vector of RegisterAtOffsets in ftl/FTLUnwindInfo.{cpp,h} into a new
class in jit/RegisterAtOffsetList.{cpp,h}.
Eliminted UnwindInfo and changed UnwindInfo::parse() into a standalone function named parseUnwindInfo.
That standalone function now returns the callee saves RegisterAtOffsetList.  This is stored in the
code block and used instead of UnwindInfo.
Added a little more functionality to RegisterAtOffsetList to use it instead of RegisterSaveMap and
replaced all occurances of RegisterSaveMap.
Eliminated jit/RegisterSaveMap.{cpp,h}.

* CMakeLists.txt:
* JavaScriptCore.vcxproj/JavaScriptCore.vcxproj:
* JavaScriptCore.xcodeproj/project.pbxproj:
* bytecode/CodeBlock.cpp:
(JSC::CodeBlock::setCalleeSaveRegisters):
* bytecode/CodeBlock.h:
(JSC::CodeBlock::calleeSaveRegisters):
* dfg/DFGOSREntry.cpp:
(JSC::DFG::prepareOSREntry):
* ftl/FTLCompile.cpp:
(JSC::FTL::mmAllocateDataSection):
* ftl/FTLJITCode.h:
* ftl/FTLOSRExitCompiler.cpp:
(JSC::FTL::compileStub):
* ftl/FTLRegisterAtOffset.cpp: Removed.
* ftl/FTLRegisterAtOffset.h: Removed.
* ftl/FTLUnwindInfo.cpp:
(JSC::FTL::parseUnwindInfo):
(JSC::FTL::UnwindInfo::UnwindInfo): Deleted.
(JSC::FTL::UnwindInfo::~UnwindInfo): Deleted.
(JSC::FTL::UnwindInfo::parse): Deleted.
(JSC::FTL::UnwindInfo::dump): Deleted.
(JSC::FTL::UnwindInfo::find): Deleted.
(JSC::FTL::UnwindInfo::indexOf): Deleted.
* ftl/FTLUnwindInfo.h:
* interpreter/Interpreter.cpp:
(JSC::UnwindFunctor::copyCalleeSavesToVMCalleeSavesBuffer):
* jit/AssemblyHelpers.h:
(JSC::AssemblyHelpers::emitSaveCalleeSavesFor):
(JSC::AssemblyHelpers::emitRestoreCalleeSavesFor):
(JSC::AssemblyHelpers::copyCalleeSavesFromFrameOrRegisterToVMCalleeSavesBuffer):
(JSC::AssemblyHelpers::copyCalleeSavesFromFrameToVMCalleeSavesBuffer): Deleted.
* jit/RegisterAtOffset.cpp: Copied from Source/JavaScriptCore/ftl/FTLRegisterAtOffset.cpp.
(JSC::RegisterAtOffset::dump):
(JSC::FTL::RegisterAtOffset::dump): Deleted.
* jit/RegisterAtOffset.h: Copied from Source/JavaScriptCore/ftl/FTLRegisterAtOffset.h.
(JSC::RegisterAtOffset::reg):
(JSC::RegisterAtOffset::offset):
(JSC::RegisterAtOffset::offsetAsIndex):
(JSC::RegisterAtOffset::operator==):
(JSC::FTL::RegisterAtOffset::reg): Deleted.
(JSC::FTL::RegisterAtOffset::offset): Deleted.
(JSC::FTL::RegisterAtOffset::operator==): Deleted.
* jit/RegisterAtOffsetList.cpp: Added.
(JSC::RegisterAtOffsetList::RegisterAtOffsetList):
(JSC::RegisterAtOffsetList::sort):
(JSC::RegisterAtOffsetList::dump):
(JSC::RegisterAtOffsetList::find):
(JSC::RegisterAtOffsetList::indexOf):
* jit/RegisterAtOffsetList.h: Added.
(JSC::RegisterAtOffsetList::clear):
(JSC::RegisterAtOffsetList::size):
(JSC::RegisterAtOffsetList::at):
(JSC::RegisterAtOffsetList::append):
* jit/RegisterSaveMap.cpp: Removed.
* jit/RegisterSaveMap.h: Removed.
* jit/RegisterSet.cpp:
(JSC::RegisterSet::dfgCalleeSaveRegisters):
(JSC::RegisterSet::ftlCalleeSaveRegisters):
(JSC::RegisterSet::allVMCalleeSaveRegisters):
(JSC::RegisterSet::allGPRs):
* jit/RegisterSet.h:
* runtime/VM.cpp:
(JSC::VM::VM):
* runtime/VM.h:
(JSC::VM::getCTIStub):
(JSC::VM::getAllCalleeSaveRegisterOffsets):
(JSC::VM::getAllCalleeSaveRegistersMap): Deleted.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#branchesjsctailcallSourceJavaScriptCoreCMakeListstxt">branches/jsc-tailcall/Source/JavaScriptCore/CMakeLists.txt</a></li>
<li><a href="#branchesjsctailcallSourceJavaScriptCoreChangeLog">branches/jsc-tailcall/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#branchesjsctailcallSourceJavaScriptCoreJavaScriptCorevcxprojJavaScriptCorevcxproj">branches/jsc-tailcall/Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj</a></li>
<li><a href="#branchesjsctailcallSourceJavaScriptCoreJavaScriptCorexcodeprojprojectpbxproj">branches/jsc-tailcall/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj</a></li>
<li><a href="#branchesjsctailcallSourceJavaScriptCorebytecodeCodeBlockcpp">branches/jsc-tailcall/Source/JavaScriptCore/bytecode/CodeBlock.cpp</a></li>
<li><a href="#branchesjsctailcallSourceJavaScriptCorebytecodeCodeBlockh">branches/jsc-tailcall/Source/JavaScriptCore/bytecode/CodeBlock.h</a></li>
<li><a href="#branchesjsctailcallSourceJavaScriptCoredfgDFGOSREntrycpp">branches/jsc-tailcall/Source/JavaScriptCore/dfg/DFGOSREntry.cpp</a></li>
<li><a href="#branchesjsctailcallSourceJavaScriptCoreftlFTLCompilecpp">branches/jsc-tailcall/Source/JavaScriptCore/ftl/FTLCompile.cpp</a></li>
<li><a href="#branchesjsctailcallSourceJavaScriptCoreftlFTLJITCodeh">branches/jsc-tailcall/Source/JavaScriptCore/ftl/FTLJITCode.h</a></li>
<li><a href="#branchesjsctailcallSourceJavaScriptCoreftlFTLOSRExitCompilercpp">branches/jsc-tailcall/Source/JavaScriptCore/ftl/FTLOSRExitCompiler.cpp</a></li>
<li><a href="#branchesjsctailcallSourceJavaScriptCoreftlFTLUnwindInfocpp">branches/jsc-tailcall/Source/JavaScriptCore/ftl/FTLUnwindInfo.cpp</a></li>
<li><a href="#branchesjsctailcallSourceJavaScriptCoreftlFTLUnwindInfoh">branches/jsc-tailcall/Source/JavaScriptCore/ftl/FTLUnwindInfo.h</a></li>
<li><a href="#branchesjsctailcallSourceJavaScriptCoreinterpreterInterpretercpp">branches/jsc-tailcall/Source/JavaScriptCore/interpreter/Interpreter.cpp</a></li>
<li><a href="#branchesjsctailcallSourceJavaScriptCorejitAssemblyHelpersh">branches/jsc-tailcall/Source/JavaScriptCore/jit/AssemblyHelpers.h</a></li>
<li><a href="#branchesjsctailcallSourceJavaScriptCorejitRegisterSetcpp">branches/jsc-tailcall/Source/JavaScriptCore/jit/RegisterSet.cpp</a></li>
<li><a href="#branchesjsctailcallSourceJavaScriptCorejitRegisterSeth">branches/jsc-tailcall/Source/JavaScriptCore/jit/RegisterSet.h</a></li>
<li><a href="#branchesjsctailcallSourceJavaScriptCoreruntimeVMcpp">branches/jsc-tailcall/Source/JavaScriptCore/runtime/VM.cpp</a></li>
<li><a href="#branchesjsctailcallSourceJavaScriptCoreruntimeVMh">branches/jsc-tailcall/Source/JavaScriptCore/runtime/VM.h</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#branchesjsctailcallSourceJavaScriptCorejitRegisterAtOffsetcpp">branches/jsc-tailcall/Source/JavaScriptCore/jit/RegisterAtOffset.cpp</a></li>
<li><a href="#branchesjsctailcallSourceJavaScriptCorejitRegisterAtOffseth">branches/jsc-tailcall/Source/JavaScriptCore/jit/RegisterAtOffset.h</a></li>
<li><a href="#branchesjsctailcallSourceJavaScriptCorejitRegisterAtOffsetListcpp">branches/jsc-tailcall/Source/JavaScriptCore/jit/RegisterAtOffsetList.cpp</a></li>
<li><a href="#branchesjsctailcallSourceJavaScriptCorejitRegisterAtOffsetListh">branches/jsc-tailcall/Source/JavaScriptCore/jit/RegisterAtOffsetList.h</a></li>
</ul>

<h3>Removed Paths</h3>
<ul>
<li><a href="#branchesjsctailcallSourceJavaScriptCoreftlFTLRegisterAtOffsetcpp">branches/jsc-tailcall/Source/JavaScriptCore/ftl/FTLRegisterAtOffset.cpp</a></li>
<li><a href="#branchesjsctailcallSourceJavaScriptCoreftlFTLRegisterAtOffseth">branches/jsc-tailcall/Source/JavaScriptCore/ftl/FTLRegisterAtOffset.h</a></li>
<li><a href="#branchesjsctailcallSourceJavaScriptCorejitRegisterSaveMapcpp">branches/jsc-tailcall/Source/JavaScriptCore/jit/RegisterSaveMap.cpp</a></li>
<li><a href="#branchesjsctailcallSourceJavaScriptCorejitRegisterSaveMaph">branches/jsc-tailcall/Source/JavaScriptCore/jit/RegisterSaveMap.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="branchesjsctailcallSourceJavaScriptCoreCMakeListstxt"></a>
<div class="modfile"><h4>Modified: branches/jsc-tailcall/Source/JavaScriptCore/CMakeLists.txt (188653 => 188654)</h4>
<pre class="diff"><span>
<span class="info">--- branches/jsc-tailcall/Source/JavaScriptCore/CMakeLists.txt        2015-08-19 22:20:32 UTC (rev 188653)
+++ branches/jsc-tailcall/Source/JavaScriptCore/CMakeLists.txt        2015-08-19 22:26:29 UTC (rev 188654)
</span><span class="lines">@@ -368,8 +368,9 @@
</span><span class="cx">     jit/JITToDFGDeferredCompilationCallback.cpp
</span><span class="cx">     jit/PolymorphicCallStubRoutine.cpp
</span><span class="cx">     jit/Reg.cpp
</span><ins>+    jit/RegisterAtOffset.cpp
+    jit/RegisterAtOffsetList.cpp
</ins><span class="cx">     jit/RegisterPreservationWrapperGenerator.cpp
</span><del>-    jit/RegisterSaveMap.cpp
</del><span class="cx">     jit/RegisterSet.cpp
</span><span class="cx">     jit/Repatch.cpp
</span><span class="cx">     jit/ScratchRegisterAllocator.cpp
</span><span class="lines">@@ -887,7 +888,6 @@
</span><span class="cx">         ftl/FTLOperations.cpp
</span><span class="cx">         ftl/FTLOutput.cpp
</span><span class="cx">         ftl/FTLRecoveryOpcode.cpp
</span><del>-        ftl/FTLRegisterAtOffset.cpp
</del><span class="cx">         ftl/FTLSaveRestore.cpp
</span><span class="cx">         ftl/FTLSlowPathCall.cpp
</span><span class="cx">         ftl/FTLSlowPathCallKey.cpp
</span></span></pre></div>
<a id="branchesjsctailcallSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: branches/jsc-tailcall/Source/JavaScriptCore/ChangeLog (188653 => 188654)</h4>
<pre class="diff"><span>
<span class="info">--- branches/jsc-tailcall/Source/JavaScriptCore/ChangeLog        2015-08-19 22:20:32 UTC (rev 188653)
+++ branches/jsc-tailcall/Source/JavaScriptCore/ChangeLog        2015-08-19 22:26:29 UTC (rev 188654)
</span><span class="lines">@@ -1,3 +1,91 @@
</span><ins>+2015-08-19  Michael Saboff  &lt;msaboff@apple.com&gt;
+
+        jsc-tailcall: Unify Register Offset classes
+        https://bugs.webkit.org/show_bug.cgi?id=148167
+
+        Reviewed by Basile Clement.
+
+        The is primarily a refactoring change.
+
+        Moved ftl/FTLRegisterAtOffset.{cpp,h} to jit/RegisterAtOffset.{cpp,h}.
+        Factored out the vector of RegisterAtOffsets in ftl/FTLUnwindInfo.{cpp,h} into a new
+        class in jit/RegisterAtOffsetList.{cpp,h}.
+        Eliminted UnwindInfo and changed UnwindInfo::parse() into a standalone function named parseUnwindInfo.
+        That standalone function now returns the callee saves RegisterAtOffsetList.  This is stored in the
+        code block and used instead of UnwindInfo.
+        Added a little more functionality to RegisterAtOffsetList to use it instead of RegisterSaveMap and
+        replaced all occurances of RegisterSaveMap.
+        Eliminated jit/RegisterSaveMap.{cpp,h}.
+
+        * CMakeLists.txt:
+        * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj:
+        * JavaScriptCore.xcodeproj/project.pbxproj:
+        * bytecode/CodeBlock.cpp:
+        (JSC::CodeBlock::setCalleeSaveRegisters):
+        * bytecode/CodeBlock.h:
+        (JSC::CodeBlock::calleeSaveRegisters):
+        * dfg/DFGOSREntry.cpp:
+        (JSC::DFG::prepareOSREntry):
+        * ftl/FTLCompile.cpp:
+        (JSC::FTL::mmAllocateDataSection):
+        * ftl/FTLJITCode.h:
+        * ftl/FTLOSRExitCompiler.cpp:
+        (JSC::FTL::compileStub):
+        * ftl/FTLRegisterAtOffset.cpp: Removed.
+        * ftl/FTLRegisterAtOffset.h: Removed.
+        * ftl/FTLUnwindInfo.cpp:
+        (JSC::FTL::parseUnwindInfo):
+        (JSC::FTL::UnwindInfo::UnwindInfo): Deleted.
+        (JSC::FTL::UnwindInfo::~UnwindInfo): Deleted.
+        (JSC::FTL::UnwindInfo::parse): Deleted.
+        (JSC::FTL::UnwindInfo::dump): Deleted.
+        (JSC::FTL::UnwindInfo::find): Deleted.
+        (JSC::FTL::UnwindInfo::indexOf): Deleted.
+        * ftl/FTLUnwindInfo.h:
+        * interpreter/Interpreter.cpp:
+        (JSC::UnwindFunctor::copyCalleeSavesToVMCalleeSavesBuffer):
+        * jit/AssemblyHelpers.h:
+        (JSC::AssemblyHelpers::emitSaveCalleeSavesFor):
+        (JSC::AssemblyHelpers::emitRestoreCalleeSavesFor):
+        (JSC::AssemblyHelpers::copyCalleeSavesFromFrameOrRegisterToVMCalleeSavesBuffer):
+        (JSC::AssemblyHelpers::copyCalleeSavesFromFrameToVMCalleeSavesBuffer): Deleted.
+        * jit/RegisterAtOffset.cpp: Copied from Source/JavaScriptCore/ftl/FTLRegisterAtOffset.cpp.
+        (JSC::RegisterAtOffset::dump):
+        (JSC::FTL::RegisterAtOffset::dump): Deleted.
+        * jit/RegisterAtOffset.h: Copied from Source/JavaScriptCore/ftl/FTLRegisterAtOffset.h.
+        (JSC::RegisterAtOffset::reg):
+        (JSC::RegisterAtOffset::offset):
+        (JSC::RegisterAtOffset::offsetAsIndex):
+        (JSC::RegisterAtOffset::operator==):
+        (JSC::FTL::RegisterAtOffset::reg): Deleted.
+        (JSC::FTL::RegisterAtOffset::offset): Deleted.
+        (JSC::FTL::RegisterAtOffset::operator==): Deleted.
+        * jit/RegisterAtOffsetList.cpp: Added.
+        (JSC::RegisterAtOffsetList::RegisterAtOffsetList):
+        (JSC::RegisterAtOffsetList::sort):
+        (JSC::RegisterAtOffsetList::dump):
+        (JSC::RegisterAtOffsetList::find):
+        (JSC::RegisterAtOffsetList::indexOf):
+        * jit/RegisterAtOffsetList.h: Added.
+        (JSC::RegisterAtOffsetList::clear):
+        (JSC::RegisterAtOffsetList::size):
+        (JSC::RegisterAtOffsetList::at):
+        (JSC::RegisterAtOffsetList::append):
+        * jit/RegisterSaveMap.cpp: Removed.
+        * jit/RegisterSaveMap.h: Removed.
+        * jit/RegisterSet.cpp:
+        (JSC::RegisterSet::dfgCalleeSaveRegisters):
+        (JSC::RegisterSet::ftlCalleeSaveRegisters):
+        (JSC::RegisterSet::allVMCalleeSaveRegisters):
+        (JSC::RegisterSet::allGPRs):
+        * jit/RegisterSet.h:
+        * runtime/VM.cpp:
+        (JSC::VM::VM):
+        * runtime/VM.h:
+        (JSC::VM::getCTIStub):
+        (JSC::VM::getAllCalleeSaveRegisterOffsets):
+        (JSC::VM::getAllCalleeSaveRegistersMap): Deleted.
+
</ins><span class="cx"> 2015-08-17  Michael Saboff  &lt;msaboff@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         jsc-tailcall: Stop saving and restoring all callee saves on vmEntry / exit for platforms with per function callee saves handling
</span></span></pre></div>
<a id="branchesjsctailcallSourceJavaScriptCoreJavaScriptCorevcxprojJavaScriptCorevcxproj"></a>
<div class="modfile"><h4>Modified: branches/jsc-tailcall/Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj (188653 => 188654)</h4>
<pre class="diff"><span>
<span class="info">--- branches/jsc-tailcall/Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj        2015-08-19 22:20:32 UTC (rev 188653)
+++ branches/jsc-tailcall/Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj        2015-08-19 22:26:29 UTC (rev 188654)
</span><span class="lines">@@ -532,7 +532,6 @@
</span><span class="cx">     &lt;ClCompile Include=&quot;..\ftl\FTLOperations.cpp&quot; /&gt;
</span><span class="cx">     &lt;ClCompile Include=&quot;..\ftl\FTLOutput.cpp&quot; /&gt;
</span><span class="cx">     &lt;ClCompile Include=&quot;..\ftl\FTLRecoveryOpcode.cpp&quot; /&gt;
</span><del>-    &lt;ClCompile Include=&quot;..\ftl\FTLRegisterAtOffset.cpp&quot; /&gt;
</del><span class="cx">     &lt;ClCompile Include=&quot;..\ftl\FTLSaveRestore.cpp&quot; /&gt;
</span><span class="cx">     &lt;ClCompile Include=&quot;..\ftl\FTLSlowPathCall.cpp&quot; /&gt;
</span><span class="cx">     &lt;ClCompile Include=&quot;..\ftl\FTLSlowPathCallKey.cpp&quot; /&gt;
</span><span class="lines">@@ -634,8 +633,9 @@
</span><span class="cx">     &lt;ClCompile Include=&quot;..\jit\SetupVarargsFrame.cpp&quot; /&gt;
</span><span class="cx">     &lt;ClCompile Include=&quot;..\jit\PolymorphicCallStubRoutine.cpp&quot; /&gt;
</span><span class="cx">     &lt;ClCompile Include=&quot;..\jit\Reg.cpp&quot; /&gt;
</span><ins>+    &lt;ClCompile Include=&quot;..\jit\RegisterAtOffset.cpp&quot; /&gt;
+    &lt;ClCompile Include=&quot;..\jit\RegisterAtOffsetList.cpp&quot; /&gt;
</ins><span class="cx">     &lt;ClCompile Include=&quot;..\jit\RegisterPreservationWrapperGenerator.cpp&quot; /&gt;
</span><del>-    &lt;ClCompile Include=&quot;..\jit\RegisterSaveMap.cpp&quot; /&gt;
</del><span class="cx">     &lt;ClCompile Include=&quot;..\jit\RegisterSet.cpp&quot; /&gt;
</span><span class="cx">     &lt;ClCompile Include=&quot;..\jit\Repatch.cpp&quot; /&gt;
</span><span class="cx">     &lt;ClCompile Include=&quot;..\jit\ScratchRegisterAllocator.cpp&quot; /&gt;
</span><span class="lines">@@ -1249,7 +1249,6 @@
</span><span class="cx">     &lt;ClInclude Include=&quot;..\ftl\FTLOperations.h&quot; /&gt;
</span><span class="cx">     &lt;ClInclude Include=&quot;..\ftl\FTLOutput.h&quot; /&gt;
</span><span class="cx">     &lt;ClInclude Include=&quot;..\ftl\FTLRecoveryOpcode.h&quot; /&gt;
</span><del>-    &lt;ClInclude Include=&quot;..\ftl\FTLRegisterAtOffset.h&quot; /&gt;
</del><span class="cx">     &lt;ClInclude Include=&quot;..\ftl\FTLSaveRestore.h&quot; /&gt;
</span><span class="cx">     &lt;ClInclude Include=&quot;..\ftl\FTLSlowPathCall.h&quot; /&gt;
</span><span class="cx">     &lt;ClInclude Include=&quot;..\ftl\FTLSlowPathCallKey.h&quot; /&gt;
</span><span class="lines">@@ -1399,8 +1398,9 @@
</span><span class="cx">     &lt;ClInclude Include=&quot;..\jit\SetupVarargsFrame.h&quot; /&gt;
</span><span class="cx">     &lt;ClInclude Include=&quot;..\jit\PolymorphicCallStubRoutine.h&quot; /&gt;
</span><span class="cx">     &lt;ClInclude Include=&quot;..\jit\Reg.h&quot; /&gt;
</span><ins>+    &lt;ClInclude Include=&quot;..\jit\RegisterAtOffset.h&quot; /&gt;
+    &lt;ClInclude Include=&quot;..\jit\RegisterAtOffsetList.h&quot; /&gt;
</ins><span class="cx">     &lt;ClInclude Include=&quot;..\jit\RegisterPreservationWrapperGenerator.h&quot; /&gt;
</span><del>-    &lt;ClInclude Include=&quot;..\jit\RegisterSaveMap.h&quot; /&gt;
</del><span class="cx">     &lt;ClInclude Include=&quot;..\jit\RegisterSet.h&quot; /&gt;
</span><span class="cx">     &lt;ClInclude Include=&quot;..\jit\Repatch.h&quot; /&gt;
</span><span class="cx">     &lt;ClInclude Include=&quot;..\jit\ScratchRegisterAllocator.h&quot; /&gt;
</span></span></pre></div>
<a id="branchesjsctailcallSourceJavaScriptCoreJavaScriptCorexcodeprojprojectpbxproj"></a>
<div class="modfile"><h4>Modified: branches/jsc-tailcall/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj (188653 => 188654)</h4>
<pre class="diff"><span>
<span class="info">--- branches/jsc-tailcall/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj        2015-08-19 22:20:32 UTC (rev 188653)
+++ branches/jsc-tailcall/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj        2015-08-19 22:26:29 UTC (rev 188654)
</span><span class="lines">@@ -381,8 +381,6 @@
</span><span class="cx">                 0F6B1CBA1861244C00845D97 /* RegisterPreservationMode.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F6B1CB81861244C00845D97 /* RegisterPreservationMode.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 0F6B1CBD1861246A00845D97 /* RegisterPreservationWrapperGenerator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0F6B1CBB1861246A00845D97 /* RegisterPreservationWrapperGenerator.cpp */; };
</span><span class="cx">                 0F6B1CBE1861246A00845D97 /* RegisterPreservationWrapperGenerator.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F6B1CBC1861246A00845D97 /* RegisterPreservationWrapperGenerator.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><del>-                0F6B1CC31862C47800845D97 /* FTLRegisterAtOffset.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0F6B1CBF1862C47800845D97 /* FTLRegisterAtOffset.cpp */; };
-                0F6B1CC41862C47800845D97 /* FTLRegisterAtOffset.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F6B1CC01862C47800845D97 /* FTLRegisterAtOffset.h */; settings = {ATTRIBUTES = (Private, ); }; };
</del><span class="cx">                 0F6B1CC51862C47800845D97 /* FTLUnwindInfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0F6B1CC11862C47800845D97 /* FTLUnwindInfo.cpp */; };
</span><span class="cx">                 0F6B1CC61862C47800845D97 /* FTLUnwindInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F6B1CC21862C47800845D97 /* FTLUnwindInfo.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 0F6C73501AC9F99F00BE1682 /* VariableWriteFireDetail.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0F6C734E1AC9F99F00BE1682 /* VariableWriteFireDetail.cpp */; };
</span><span class="lines">@@ -974,8 +972,8 @@
</span><span class="cx">                 6511230714046B0A002B101D /* testRegExp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 651122E5140469BA002B101D /* testRegExp.cpp */; };
</span><span class="cx">                 6514F21918B3E1670098FF8B /* Bytecodes.h in Headers */ = {isa = PBXBuildFile; fileRef = 6514F21718B3E1670098FF8B /* Bytecodes.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 65303D641447B9E100D3F904 /* ParserTokens.h in Headers */ = {isa = PBXBuildFile; fileRef = 65303D631447B9E100D3F904 /* ParserTokens.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><del>-                653D508A1B5D9F9C00DD4BCD /* RegisterSaveMap.h in Headers */ = {isa = PBXBuildFile; fileRef = 65AD9B191B5D9B750098556D /* RegisterSaveMap.h */; settings = {ATTRIBUTES = (Private, ); }; };
-                653D508B1B5DC29000DD4BCD /* RegisterSaveMap.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 65AD9B181B5D9B750098556D /* RegisterSaveMap.cpp */; };
</del><ins>+                6540C7A01B82E1C3000F6B79 /* RegisterAtOffset.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6540C79E1B82D9CE000F6B79 /* RegisterAtOffset.cpp */; };
+                6540C7A11B82E1C3000F6B79 /* RegisterAtOffsetList.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6540C79C1B82D99D000F6B79 /* RegisterAtOffsetList.cpp */; };
</ins><span class="cx">                 6546F5211A32B313006F07D5 /* NullGetterFunction.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6546F51F1A32A59C006F07D5 /* NullGetterFunction.cpp */; };
</span><span class="cx">                 65525FC51A6DD801007B5495 /* NullSetterFunction.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 65525FC31A6DD3B3007B5495 /* NullSetterFunction.cpp */; };
</span><span class="cx">                 6553A33117A1F1EE008CF6F3 /* CommonSlowPathsExceptions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6553A32F17A1F1EE008CF6F3 /* CommonSlowPathsExceptions.cpp */; };
</span><span class="lines">@@ -2125,8 +2123,6 @@
</span><span class="cx">                 0F6B1CB81861244C00845D97 /* RegisterPreservationMode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RegisterPreservationMode.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 0F6B1CBB1861246A00845D97 /* RegisterPreservationWrapperGenerator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RegisterPreservationWrapperGenerator.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 0F6B1CBC1861246A00845D97 /* RegisterPreservationWrapperGenerator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RegisterPreservationWrapperGenerator.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><del>-                0F6B1CBF1862C47800845D97 /* FTLRegisterAtOffset.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = FTLRegisterAtOffset.cpp; path = ftl/FTLRegisterAtOffset.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
-                0F6B1CC01862C47800845D97 /* FTLRegisterAtOffset.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FTLRegisterAtOffset.h; path = ftl/FTLRegisterAtOffset.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</del><span class="cx">                 0F6B1CC11862C47800845D97 /* FTLUnwindInfo.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = FTLUnwindInfo.cpp; path = ftl/FTLUnwindInfo.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 0F6B1CC21862C47800845D97 /* FTLUnwindInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FTLUnwindInfo.h; path = ftl/FTLUnwindInfo.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 0F6C734E1AC9F99F00BE1682 /* VariableWriteFireDetail.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = VariableWriteFireDetail.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="lines">@@ -2698,6 +2694,10 @@
</span><span class="cx">                 652A3A231651C69700A80AFE /* A64DOpcode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = A64DOpcode.h; path = disassembler/ARM64/A64DOpcode.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 65303D631447B9E100D3F904 /* ParserTokens.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ParserTokens.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 65400C100A69BAF200509887 /* PropertyNameArray.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = PropertyNameArray.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><ins>+                6540C79C1B82D99D000F6B79 /* RegisterAtOffsetList.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RegisterAtOffsetList.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
+                6540C79D1B82D99D000F6B79 /* RegisterAtOffsetList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RegisterAtOffsetList.h; sourceTree = &quot;&lt;group&gt;&quot;; };
+                6540C79E1B82D9CE000F6B79 /* RegisterAtOffset.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RegisterAtOffset.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
+                6540C79F1B82D9CE000F6B79 /* RegisterAtOffset.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RegisterAtOffset.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</ins><span class="cx">                 6546F51F1A32A59C006F07D5 /* NullGetterFunction.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; lineEnding = 0; path = NullGetterFunction.cpp; sourceTree = &quot;&lt;group&gt;&quot;; xcLanguageSpecificationIdentifier = xcode.lang.cpp; };
</span><span class="cx">                 6546F5201A32A59C006F07D5 /* NullGetterFunction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NullGetterFunction.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 65525FC31A6DD3B3007B5495 /* NullSetterFunction.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NullSetterFunction.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="lines">@@ -2716,8 +2716,6 @@
</span><span class="cx">                 658D3A5519638268003C45D6 /* VMEntryRecord.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = VMEntryRecord.h; sourceTree = &quot;&lt;group&gt;&quot;; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; };
</span><span class="cx">                 65987F2C167FE84B003C2F8D /* DFGOSRExitCompilationInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DFGOSRExitCompilationInfo.h; path = dfg/DFGOSRExitCompilationInfo.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 65987F2F16828A7E003C2F8D /* UnusedPointer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UnusedPointer.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><del>-                65AD9B181B5D9B750098556D /* RegisterSaveMap.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RegisterSaveMap.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
-                65AD9B191B5D9B750098556D /* RegisterSaveMap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RegisterSaveMap.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</del><span class="cx">                 65C0284F171795E200351E35 /* ARMv7Disassembler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ARMv7Disassembler.cpp; path = disassembler/ARMv7Disassembler.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 65C0285A1717966800351E35 /* ARMv7DOpcode.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ARMv7DOpcode.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 65C0285B1717966800351E35 /* ARMv7DOpcode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ARMv7DOpcode.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="lines">@@ -3777,8 +3775,6 @@
</span><span class="cx">                                 0FEA0A06170513DB00BB722C /* FTLOutput.h */,
</span><span class="cx">                                 0F485325187DFDEC0083B687 /* FTLRecoveryOpcode.cpp */,
</span><span class="cx">                                 0F485326187DFDEC0083B687 /* FTLRecoveryOpcode.h */,
</span><del>-                                0F6B1CBF1862C47800845D97 /* FTLRegisterAtOffset.cpp */,
-                                0F6B1CC01862C47800845D97 /* FTLRegisterAtOffset.h */,
</del><span class="cx">                                 0FCEFAA91804C13E00472CE4 /* FTLSaveRestore.cpp */,
</span><span class="cx">                                 0FCEFAAA1804C13E00472CE4 /* FTLSaveRestore.h */,
</span><span class="cx">                                 0F25F1AA181635F300522F39 /* FTLSlowPathCall.cpp */,
</span><span class="lines">@@ -3961,22 +3957,24 @@
</span><span class="cx">                                 0FC712E117CD878F008CC93C /* JITToDFGDeferredCompilationCallback.h */,
</span><span class="cx">                                 A76F54A213B28AAB00EF2BCE /* JITWriteBarrier.h */,
</span><span class="cx">                                 A76C51741182748D00715B05 /* JSInterfaceJIT.h */,
</span><del>-                                0FEE98421A89227500754E93 /* SetupVarargsFrame.cpp */,
-                                0FEE98401A8865B600754E93 /* SetupVarargsFrame.h */,
</del><span class="cx">                                 0FE834151A6EF97B00D04847 /* PolymorphicCallStubRoutine.cpp */,
</span><span class="cx">                                 0FE834161A6EF97B00D04847 /* PolymorphicCallStubRoutine.h */,
</span><span class="cx">                                 0FA7A8E918B413C80052371D /* Reg.cpp */,
</span><span class="cx">                                 0FA7A8EA18B413C80052371D /* Reg.h */,
</span><ins>+                                6540C79E1B82D9CE000F6B79 /* RegisterAtOffset.cpp */,
+                                6540C79F1B82D9CE000F6B79 /* RegisterAtOffset.h */,
+                                6540C79C1B82D99D000F6B79 /* RegisterAtOffsetList.cpp */,
+                                6540C79D1B82D99D000F6B79 /* RegisterAtOffsetList.h */,
</ins><span class="cx">                                 0F6B1CBB1861246A00845D97 /* RegisterPreservationWrapperGenerator.cpp */,
</span><span class="cx">                                 0F6B1CBC1861246A00845D97 /* RegisterPreservationWrapperGenerator.h */,
</span><del>-                                65AD9B181B5D9B750098556D /* RegisterSaveMap.cpp */,
-                                65AD9B191B5D9B750098556D /* RegisterSaveMap.h */,
</del><span class="cx">                                 0FC3141418146D7000033232 /* RegisterSet.cpp */,
</span><span class="cx">                                 0FC314101814559100033232 /* RegisterSet.h */,
</span><span class="cx">                                 0F24E54917EE274900ABB217 /* Repatch.cpp */,
</span><span class="cx">                                 0F24E54A17EE274900ABB217 /* Repatch.h */,
</span><span class="cx">                                 0FA7A8ED18CE4FD80052371D /* ScratchRegisterAllocator.cpp */,
</span><span class="cx">                                 0F24E54B17EE274900ABB217 /* ScratchRegisterAllocator.h */,
</span><ins>+                                0FEE98421A89227500754E93 /* SetupVarargsFrame.cpp */,
+                                0FEE98401A8865B600754E93 /* SetupVarargsFrame.h */,
</ins><span class="cx">                                 A709F2EF17A0AC0400512E98 /* SlowPathCall.h */,
</span><span class="cx">                                 A7386551118697B400540279 /* SpecializedThunkJIT.h */,
</span><span class="cx">                                 A7FF647A18C52E8500B55307 /* SpillRegistersMode.h */,
</span><span class="lines">@@ -5631,7 +5629,6 @@
</span><span class="cx">                                 52678F911A04177C006A306D /* ControlFlowProfiler.h in Headers */,
</span><span class="cx">                                 52678F8F1A031009006A306D /* BasicBlockLocation.h in Headers */,
</span><span class="cx">                                 A5EA710E19F6DF810098F5EC /* InspectorAlternateBackendDispatchers.h in Headers */,
</span><del>-                                653D508A1B5D9F9C00DD4BCD /* RegisterSaveMap.h in Headers */,
</del><span class="cx">                                 A5EA70EC19F5B3EA0098F5EC /* generate_cpp_alternate_backend_dispatcher_header.py in Headers */,
</span><span class="cx">                                 C4F4B6F31A05C944005CAB76 /* cpp_generator_templates.py in Headers */,
</span><span class="cx">                                 A5EF9B151A1D43FA00702E90 /* generate_cpp_backend_dispatcher_implementation.py in Headers */,
</span><span class="lines">@@ -5996,7 +5993,6 @@
</span><span class="cx">                                 0FEA0A11170513DB00BB722C /* FTLOutput.h in Headers */,
</span><span class="cx">                                 9E72940B190F0514001A91B5 /* BundlePath.h in Headers */,
</span><span class="cx">                                 0F48532A187DFDEC0083B687 /* FTLRecoveryOpcode.h in Headers */,
</span><del>-                                0F6B1CC41862C47800845D97 /* FTLRegisterAtOffset.h in Headers */,
</del><span class="cx">                                 0FCEFAAC1804C13E00472CE4 /* FTLSaveRestore.h in Headers */,
</span><span class="cx">                                 0F25F1B2181635F300522F39 /* FTLSlowPathCall.h in Headers */,
</span><span class="cx">                                 0F25F1B4181635F300522F39 /* FTLSlowPathCallKey.h in Headers */,
</span><span class="lines">@@ -7011,7 +7007,6 @@
</span><span class="cx">                         isa = PBXSourcesBuildPhase;
</span><span class="cx">                         buildActionMask = 2147483647;
</span><span class="cx">                         files = (
</span><del>-                                653D508B1B5DC29000DD4BCD /* RegisterSaveMap.cpp in Sources */,
</del><span class="cx">                                 9EA5C7A2190F088700508EBE /* InitializeLLVMMac.cpp in Sources */,
</span><span class="cx">                                 9EA5C7A1190F084200508EBE /* BundlePath.mm in Sources */,
</span><span class="cx">                                 52B310FF1975B4240080857C /* TypeLocationCache.cpp in Sources */,
</span><span class="lines">@@ -7266,7 +7261,6 @@
</span><span class="cx">                                 0F235BDF17178E1C00690C7F /* FTLOSRExitCompiler.cpp in Sources */,
</span><span class="cx">                                 0FEA0A2A1709629600BB722C /* FTLOutput.cpp in Sources */,
</span><span class="cx">                                 0F485329187DFDEC0083B687 /* FTLRecoveryOpcode.cpp in Sources */,
</span><del>-                                0F6B1CC31862C47800845D97 /* FTLRegisterAtOffset.cpp in Sources */,
</del><span class="cx">                                 0FCEFAAB1804C13E00472CE4 /* FTLSaveRestore.cpp in Sources */,
</span><span class="cx">                                 0F25F1B1181635F300522F39 /* FTLSlowPathCall.cpp in Sources */,
</span><span class="cx">                                 0F25F1B3181635F300522F39 /* FTLSlowPathCallKey.cpp in Sources */,
</span><span class="lines">@@ -7530,6 +7524,8 @@
</span><span class="cx">                                 0F3E01AA19D353A500F61B7F /* DFGPrePostNumbering.cpp in Sources */,
</span><span class="cx">                                 0FF60AC316740F8800029779 /* ReduceWhitespace.cpp in Sources */,
</span><span class="cx">                                 0FA7A8EB18B413C80052371D /* Reg.cpp in Sources */,
</span><ins>+                                6540C7A11B82E1C3000F6B79 /* RegisterAtOffsetList.cpp in Sources */,
+                                6540C7A01B82E1C3000F6B79 /* RegisterAtOffset.cpp in Sources */,
</ins><span class="cx">                                 14280841107EC0930013E7B2 /* RegExp.cpp in Sources */,
</span><span class="cx">                                 A1712B3B11C7B212007A5315 /* RegExpCache.cpp in Sources */,
</span><span class="cx">                                 0FE0502C1AA9095600D33B33 /* VarOffset.cpp in Sources */,
</span></span></pre></div>
<a id="branchesjsctailcallSourceJavaScriptCorebytecodeCodeBlockcpp"></a>
<div class="modfile"><h4>Modified: branches/jsc-tailcall/Source/JavaScriptCore/bytecode/CodeBlock.cpp (188653 => 188654)</h4>
<pre class="diff"><span>
<span class="info">--- branches/jsc-tailcall/Source/JavaScriptCore/bytecode/CodeBlock.cpp        2015-08-19 22:20:32 UTC (rev 188653)
+++ branches/jsc-tailcall/Source/JavaScriptCore/bytecode/CodeBlock.cpp        2015-08-19 22:26:29 UTC (rev 188654)
</span><span class="lines">@@ -69,7 +69,7 @@
</span><span class="cx"> #include &lt;wtf/text/UniquedStringImpl.h&gt;
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(JIT)
</span><del>-#include &quot;RegisterSaveMap.h&quot;
</del><ins>+#include &quot;RegisterAtOffsetList.h&quot;
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(DFG_JIT)
</span><span class="lines">@@ -3303,9 +3303,14 @@
</span><span class="cx"> #if ENABLE(JIT)
</span><span class="cx"> void CodeBlock::setCalleeSaveRegisters(RegisterSet calleeSaveRegisters)
</span><span class="cx"> {
</span><del>-    m_calleeSaveRegisters = std::make_unique&lt;RegisterSaveMap&gt;(calleeSaveRegisters);
</del><ins>+    m_calleeSaveRegisters = std::make_unique&lt;RegisterAtOffsetList&gt;(calleeSaveRegisters);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void CodeBlock::setCalleeSaveRegisters(std::unique_ptr&lt;RegisterAtOffsetList&gt; registerAtOffsetList)
+{
+    m_calleeSaveRegisters = WTF::move(registerAtOffsetList);
+}
+    
</ins><span class="cx"> static size_t roundCalleeSaveSpaceAsVirtualRegisters(size_t calleeSaveRegisters)
</span><span class="cx"> {
</span><span class="cx">     static const unsigned cpuRegisterSize = sizeof(void*);
</span></span></pre></div>
<a id="branchesjsctailcallSourceJavaScriptCorebytecodeCodeBlockh"></a>
<div class="modfile"><h4>Modified: branches/jsc-tailcall/Source/JavaScriptCore/bytecode/CodeBlock.h (188653 => 188654)</h4>
<pre class="diff"><span>
<span class="info">--- branches/jsc-tailcall/Source/JavaScriptCore/bytecode/CodeBlock.h        2015-08-19 22:20:32 UTC (rev 188653)
+++ branches/jsc-tailcall/Source/JavaScriptCore/bytecode/CodeBlock.h        2015-08-19 22:26:29 UTC (rev 188654)
</span><span class="lines">@@ -80,7 +80,7 @@
</span><span class="cx"> 
</span><span class="cx"> class ExecState;
</span><span class="cx"> class LLIntOffsetsExtractor;
</span><del>-class RegisterSaveMap;
</del><ins>+class RegisterAtOffsetList;
</ins><span class="cx"> class RepatchBuffer;
</span><span class="cx"> class TypeLocation;
</span><span class="cx"> 
</span><span class="lines">@@ -824,8 +824,9 @@
</span><span class="cx">     bool shouldReoptimizeFromLoopNow();
</span><span class="cx"> 
</span><span class="cx">     void setCalleeSaveRegisters(RegisterSet);
</span><ins>+    void setCalleeSaveRegisters(std::unique_ptr&lt;RegisterAtOffsetList&gt;);
</ins><span class="cx">     
</span><del>-    RegisterSaveMap* calleeSaveRegisters() const { return m_calleeSaveRegisters.get(); }
</del><ins>+    RegisterAtOffsetList* calleeSaveRegisters() const { return m_calleeSaveRegisters.get(); }
</ins><span class="cx"> #else // No JIT
</span><span class="cx">     static unsigned numberOfLLIntBaselineCalleeSaveRegisters() { return 0; }
</span><span class="cx">     static size_t llintBaselineCalleeSaveSpaceAsVirtualRegisters() { return 0; };
</span><span class="lines">@@ -1025,7 +1026,7 @@
</span><span class="cx">     SentinelLinkedList&lt;LLIntCallLinkInfo, BasicRawSentinelNode&lt;LLIntCallLinkInfo&gt;&gt; m_incomingLLIntCalls;
</span><span class="cx">     RefPtr&lt;JITCode&gt; m_jitCode;
</span><span class="cx"> #if ENABLE(JIT)
</span><del>-    std::unique_ptr&lt;RegisterSaveMap&gt; m_calleeSaveRegisters;
</del><ins>+    std::unique_ptr&lt;RegisterAtOffsetList&gt; m_calleeSaveRegisters;
</ins><span class="cx">     Bag&lt;StructureStubInfo&gt; m_stubInfos;
</span><span class="cx">     Vector&lt;ByValInfo&gt; m_byValInfos;
</span><span class="cx">     Bag&lt;CallLinkInfo&gt; m_callLinkInfos;
</span></span></pre></div>
<a id="branchesjsctailcallSourceJavaScriptCoredfgDFGOSREntrycpp"></a>
<div class="modfile"><h4>Modified: branches/jsc-tailcall/Source/JavaScriptCore/dfg/DFGOSREntry.cpp (188653 => 188654)</h4>
<pre class="diff"><span>
<span class="info">--- branches/jsc-tailcall/Source/JavaScriptCore/dfg/DFGOSREntry.cpp        2015-08-19 22:20:32 UTC (rev 188653)
+++ branches/jsc-tailcall/Source/JavaScriptCore/dfg/DFGOSREntry.cpp        2015-08-19 22:26:29 UTC (rev 188654)
</span><span class="lines">@@ -256,14 +256,22 @@
</span><span class="cx">         pivot[i] = JSValue();
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    RegisterSaveMap* registerSaveLocations = codeBlock-&gt;calleeSaveRegisters();
-    unsigned numberRegistersToSave = registerSaveLocations-&gt;size();
-    for (Reg reg = Reg::first(); reg &lt;= Reg::last(); reg = reg.next()) {
-        if (registerSaveLocations-&gt;has(reg) &amp;&amp; reg.isGPR())
-            *(bitwise_cast&lt;intptr_t*&gt;(pivot) + numberRegistersToSave - registerSaveLocations-&gt;getIndexFor(reg) - 1) = vm-&gt;calleeSaveRegistersBuffer[vm-&gt;getAllCalleeSaveRegistersMap()-&gt;getIndexFor(reg)];
</del><ins>+    // 6) Copy our callee saves to buffer.
+    RegisterAtOffsetList* registerSaveLocations = codeBlock-&gt;calleeSaveRegisters();
+    RegisterAtOffsetList* allCalleeSaves = vm-&gt;getAllCalleeSaveRegisterOffsets();
+    RegisterSet dontSaveRegisters = RegisterSet(RegisterSet::stackRegisters(), RegisterSet::allFPRs());
+
+    unsigned registerCount = registerSaveLocations-&gt;size();
+    for (unsigned i = 0; i &lt; registerCount; i++) {
+        RegisterAtOffset currentEntry = registerSaveLocations-&gt;at(i);
+        if (dontSaveRegisters.get(currentEntry.reg()))
+            continue;
+        RegisterAtOffset* vmCalleeSavesEntry = allCalleeSaves-&gt;find(currentEntry.reg());
+        
+        *(bitwise_cast&lt;intptr_t*&gt;(pivot - 1) - currentEntry.offsetAsIndex()) = vm-&gt;calleeSaveRegistersBuffer[vmCalleeSavesEntry-&gt;offsetAsIndex()];
</ins><span class="cx">     }
</span><span class="cx">     
</span><del>-    // 6) Fix the call frame to have the right code block.
</del><ins>+    // 7) Fix the call frame to have the right code block.
</ins><span class="cx">     
</span><span class="cx">     *bitwise_cast&lt;CodeBlock**&gt;(pivot - 1 - JSStack::CodeBlock) = codeBlock;
</span><span class="cx">     
</span></span></pre></div>
<a id="branchesjsctailcallSourceJavaScriptCoreftlFTLCompilecpp"></a>
<div class="modfile"><h4>Modified: branches/jsc-tailcall/Source/JavaScriptCore/ftl/FTLCompile.cpp (188653 => 188654)</h4>
<pre class="diff"><span>
<span class="info">--- branches/jsc-tailcall/Source/JavaScriptCore/ftl/FTLCompile.cpp        2015-08-19 22:20:32 UTC (rev 188653)
+++ branches/jsc-tailcall/Source/JavaScriptCore/ftl/FTLCompile.cpp        2015-08-19 22:26:29 UTC (rev 188654)
</span><span class="lines">@@ -330,7 +330,7 @@
</span><span class="cx"> 
</span><span class="cx"> static void fixFunctionBasedOnStackMaps(
</span><span class="cx">     State&amp; state, CodeBlock* codeBlock, JITCode* jitCode, GeneratedFunction generatedFunction,
</span><del>-    StackMaps::RecordMap&amp; recordMap, bool didSeeUnwindInfo)
</del><ins>+    StackMaps::RecordMap&amp; recordMap)
</ins><span class="cx"> {
</span><span class="cx">     Graph&amp; graph = state.graph;
</span><span class="cx">     VM&amp; vm = graph.m_vm;
</span><span class="lines">@@ -393,7 +393,6 @@
</span><span class="cx">     exitThunkGenerator.emitThunks();
</span><span class="cx">     if (exitThunkGenerator.didThings()) {
</span><span class="cx">         RELEASE_ASSERT(state.finalizer-&gt;osrExit.size());
</span><del>-        RELEASE_ASSERT(didSeeUnwindInfo);
</del><span class="cx">         
</span><span class="cx">         auto linkBuffer = std::make_unique&lt;LinkBuffer&gt;(
</span><span class="cx">             vm, exitThunkGenerator, codeBlock, JITCompilationCanFail);
</span><span class="lines">@@ -813,16 +812,14 @@
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx">     
</span><del>-    bool didSeeUnwindInfo = state.jitCode-&gt;unwindInfo.parse(
</del><ins>+    std::unique_ptr&lt;RegisterAtOffsetList&gt; registerOffsets = parseUnwindInfo(
</ins><span class="cx">         state.unwindDataSection, state.unwindDataSectionSize,
</span><span class="cx">         state.generatedFunction);
</span><span class="cx">     if (shouldShowDisassembly()) {
</span><span class="cx">         dataLog(&quot;Unwind info for &quot;, CodeBlockWithJITType(state.graph.m_codeBlock, JITCode::FTLJIT), &quot;:\n&quot;);
</span><del>-        if (didSeeUnwindInfo)
-            dataLog(&quot;    &quot;, state.jitCode-&gt;unwindInfo, &quot;\n&quot;);
-        else
-            dataLog(&quot;    &lt;no unwind info&gt;\n&quot;);
</del><ins>+        dataLog(&quot;    &quot;, *registerOffsets, &quot;\n&quot;);
</ins><span class="cx">     }
</span><ins>+    state.graph.m_codeBlock-&gt;setCalleeSaveRegisters(WTF::move(registerOffsets));
</ins><span class="cx">     
</span><span class="cx">     if (state.stackmapsSection &amp;&amp; state.stackmapsSection-&gt;size()) {
</span><span class="cx">         if (shouldShowDisassembly()) {
</span><span class="lines">@@ -845,7 +842,7 @@
</span><span class="cx">         StackMaps::RecordMap recordMap = state.jitCode-&gt;stackmaps.computeRecordMap();
</span><span class="cx">         fixFunctionBasedOnStackMaps(
</span><span class="cx">             state, state.graph.m_codeBlock, state.jitCode.get(), state.generatedFunction,
</span><del>-            recordMap, didSeeUnwindInfo);
</del><ins>+            recordMap);
</ins><span class="cx">         if (state.allocationFailed)
</span><span class="cx">             return;
</span><span class="cx">         
</span></span></pre></div>
<a id="branchesjsctailcallSourceJavaScriptCoreftlFTLJITCodeh"></a>
<div class="modfile"><h4>Modified: branches/jsc-tailcall/Source/JavaScriptCore/ftl/FTLJITCode.h (188653 => 188654)</h4>
<pre class="diff"><span>
<span class="info">--- branches/jsc-tailcall/Source/JavaScriptCore/ftl/FTLJITCode.h        2015-08-19 22:20:32 UTC (rev 188653)
+++ branches/jsc-tailcall/Source/JavaScriptCore/ftl/FTLJITCode.h        2015-08-19 22:26:29 UTC (rev 188654)
</span><span class="lines">@@ -78,7 +78,6 @@
</span><span class="cx">     DFG::CommonData common;
</span><span class="cx">     SegmentedVector&lt;OSRExit, 8&gt; osrExit;
</span><span class="cx">     StackMaps stackmaps;
</span><del>-    UnwindInfo unwindInfo;
</del><span class="cx">     
</span><span class="cx"> private:
</span><span class="cx">     Vector&lt;RefPtr&lt;DataSection&gt;&gt; m_dataSections;
</span></span></pre></div>
<a id="branchesjsctailcallSourceJavaScriptCoreftlFTLOSRExitCompilercpp"></a>
<div class="modfile"><h4>Modified: branches/jsc-tailcall/Source/JavaScriptCore/ftl/FTLOSRExitCompiler.cpp (188653 => 188654)</h4>
<pre class="diff"><span>
<span class="info">--- branches/jsc-tailcall/Source/JavaScriptCore/ftl/FTLOSRExitCompiler.cpp        2015-08-19 22:20:32 UTC (rev 188653)
+++ branches/jsc-tailcall/Source/JavaScriptCore/ftl/FTLOSRExitCompiler.cpp        2015-08-19 22:26:29 UTC (rev 188654)
</span><span class="lines">@@ -161,7 +161,7 @@
</span><span class="cx">         sizeof(EncodedJSValue) * (
</span><span class="cx">             exit.m_values.size() + numMaterializations + maxMaterializationNumArguments) +
</span><span class="cx">         requiredScratchMemorySizeInBytes() +
</span><del>-        jitCode-&gt;unwindInfo.m_registers.size() * sizeof(uint64_t));
</del><ins>+        codeBlock-&gt;calleeSaveRegisters()-&gt;size() * sizeof(uint64_t));
</ins><span class="cx">     EncodedJSValue* scratch = scratchBuffer ? static_cast&lt;EncodedJSValue*&gt;(scratchBuffer-&gt;dataBuffer()) : 0;
</span><span class="cx">     EncodedJSValue* materializationPointers = scratch + exit.m_values.size();
</span><span class="cx">     EncodedJSValue* materializationArguments = materializationPointers + numMaterializations;
</span><span class="lines">@@ -305,8 +305,8 @@
</span><span class="cx">     
</span><span class="cx">     // Before we start messing with the frame, we need to set aside any registers that the
</span><span class="cx">     // FTL code was preserving.
</span><del>-    for (unsigned i = jitCode-&gt;unwindInfo.m_registers.size(); i--;) {
-        RegisterAtOffset entry = jitCode-&gt;unwindInfo.m_registers[i];
</del><ins>+    for (unsigned i = codeBlock-&gt;calleeSaveRegisters()-&gt;size(); i--;) {
+        RegisterAtOffset entry = codeBlock-&gt;calleeSaveRegisters()-&gt;at(i);
</ins><span class="cx">         jit.load64(
</span><span class="cx">             MacroAssembler::Address(MacroAssembler::framePointerRegister, entry.offset()),
</span><span class="cx">             GPRInfo::regT0);
</span><span class="lines">@@ -385,7 +385,7 @@
</span><span class="cx">         if (!toSave.get(reg))
</span><span class="cx">             continue;
</span><span class="cx">         currentOffset += sizeof(Register);
</span><del>-        unsigned unwindIndex = jitCode-&gt;unwindInfo.indexOf(reg);
</del><ins>+        unsigned unwindIndex = codeBlock-&gt;calleeSaveRegisters()-&gt;indexOf(reg);
</ins><span class="cx">         if (unwindIndex == UINT_MAX) {
</span><span class="cx">             // The FTL compilation didn't preserve this register. This means that it also
</span><span class="cx">             // didn't use the register. So its value at the beginning of OSR exit should be
</span></span></pre></div>
<a id="branchesjsctailcallSourceJavaScriptCoreftlFTLRegisterAtOffsetcpp"></a>
<div class="delfile"><h4>Deleted: branches/jsc-tailcall/Source/JavaScriptCore/ftl/FTLRegisterAtOffset.cpp (188653 => 188654)</h4>
<pre class="diff"><span>
<span class="info">--- branches/jsc-tailcall/Source/JavaScriptCore/ftl/FTLRegisterAtOffset.cpp        2015-08-19 22:20:32 UTC (rev 188653)
+++ branches/jsc-tailcall/Source/JavaScriptCore/ftl/FTLRegisterAtOffset.cpp        2015-08-19 22:26:29 UTC (rev 188654)
</span><span class="lines">@@ -1,41 +0,0 @@
</span><del>-/*
- * Copyright (C) 2013, 2014 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
- */
-
-#include &quot;config.h&quot;
-#include &quot;FTLRegisterAtOffset.h&quot;
-
-#if ENABLE(FTL_JIT)
-
-namespace JSC { namespace FTL {
-
-void RegisterAtOffset::dump(PrintStream&amp; out) const
-{
-    out.print(reg(), &quot; at &quot;, offset());
-}
-
-} } // namespace JSC::FTL
-
-#endif // ENABLE(FTL_JIT)
-
</del></span></pre></div>
<a id="branchesjsctailcallSourceJavaScriptCoreftlFTLRegisterAtOffseth"></a>
<div class="delfile"><h4>Deleted: branches/jsc-tailcall/Source/JavaScriptCore/ftl/FTLRegisterAtOffset.h (188653 => 188654)</h4>
<pre class="diff"><span>
<span class="info">--- branches/jsc-tailcall/Source/JavaScriptCore/ftl/FTLRegisterAtOffset.h        2015-08-19 22:20:32 UTC (rev 188653)
+++ branches/jsc-tailcall/Source/JavaScriptCore/ftl/FTLRegisterAtOffset.h        2015-08-19 22:26:29 UTC (rev 188654)
</span><span class="lines">@@ -1,80 +0,0 @@
</span><del>-/*
- * Copyright (C) 2013, 2014 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
- */
-
-#ifndef FTLRegisterAtOffset_h
-#define FTLRegisterAtOffset_h
-
-#if ENABLE(FTL_JIT)
-
-#include &quot;Reg.h&quot;
-#include &lt;wtf/PrintStream.h&gt;
-
-namespace JSC { namespace FTL {
-
-class RegisterAtOffset {
-public:
-    RegisterAtOffset()
-        : m_offset(0)
-    {
-    }
-    
-    RegisterAtOffset(Reg reg, ptrdiff_t offset)
-        : m_reg(reg)
-        , m_offset(offset)
-    {
-    }
-    
-    bool operator!() const { return !m_reg; }
-    
-    Reg reg() const { return m_reg; }
-    ptrdiff_t offset() const { return m_offset; }
-    
-    bool operator==(const RegisterAtOffset&amp; other) const
-    {
-        return reg() == other.reg() &amp;&amp; offset() == other.offset();
-    }
-    
-    bool operator&lt;(const RegisterAtOffset&amp; other) const
-    {
-        if (reg() != other.reg())
-            return reg() &lt; other.reg();
-        return offset() &lt; other.offset();
-    }
-    
-    static Reg getReg(RegisterAtOffset* value) { return value-&gt;reg(); }
-    
-    void dump(PrintStream&amp; out) const;
-
-private:
-    Reg m_reg;
-    ptrdiff_t m_offset;
-};
-
-} } // namespace JSC::FTL
-
-#endif // ENABLE(FTL_JIT)
-
-#endif // FTLRegisterAtOffset_h
-
</del></span></pre></div>
<a id="branchesjsctailcallSourceJavaScriptCoreftlFTLUnwindInfocpp"></a>
<div class="modfile"><h4>Modified: branches/jsc-tailcall/Source/JavaScriptCore/ftl/FTLUnwindInfo.cpp (188653 => 188654)</h4>
<pre class="diff"><span>
<span class="info">--- branches/jsc-tailcall/Source/JavaScriptCore/ftl/FTLUnwindInfo.cpp        2015-08-19 22:20:32 UTC (rev 188653)
+++ branches/jsc-tailcall/Source/JavaScriptCore/ftl/FTLUnwindInfo.cpp        2015-08-19 22:26:29 UTC (rev 188654)
</span><span class="lines">@@ -94,6 +94,9 @@
</span><span class="cx"> #include &quot;config.h&quot;
</span><span class="cx"> #include &quot;FTLUnwindInfo.h&quot;
</span><span class="cx"> 
</span><ins>+#include &quot;CodeBlock.h&quot;
+#include &quot;RegisterAtOffsetList.h&quot;
+
</ins><span class="cx"> #if ENABLE(FTL_JIT)
</span><span class="cx"> 
</span><span class="cx"> #if OS(DARWIN)
</span><span class="lines">@@ -103,10 +106,6 @@
</span><span class="cx"> 
</span><span class="cx"> namespace JSC { namespace FTL {
</span><span class="cx"> 
</span><del>-UnwindInfo::UnwindInfo() { }
-UnwindInfo::~UnwindInfo() { }
-
-
</del><span class="cx"> namespace {
</span><span class="cx"> #if OS(DARWIN)
</span><span class="cx"> struct CompactUnwind {
</span><span class="lines">@@ -654,13 +653,12 @@
</span><span class="cx"> #endif
</span><span class="cx"> } // anonymous namespace
</span><span class="cx"> 
</span><del>-bool UnwindInfo::parse(void* section, size_t size, GeneratedFunction generatedFunction)
</del><ins>+std::unique_ptr&lt;RegisterAtOffsetList&gt; parseUnwindInfo(void* section, size_t size, GeneratedFunction generatedFunction)
</ins><span class="cx"> {
</span><del>-    m_registers.clear();
</del><span class="cx">     RELEASE_ASSERT(!!section);
</span><del>-    if (!section)
-        return false;
</del><span class="cx"> 
</span><ins>+    std::unique_ptr&lt;RegisterAtOffsetList&gt; registerOffsets = std::make_unique&lt;RegisterAtOffsetList&gt;();
+
</ins><span class="cx"> #if OS(DARWIN)
</span><span class="cx">     RELEASE_ASSERT(size &gt;= sizeof(CompactUnwind));
</span><span class="cx">     
</span><span class="lines">@@ -689,27 +687,27 @@
</span><span class="cx">             break;
</span><span class="cx">             
</span><span class="cx">         case UNWIND_X86_64_REG_RBX:
</span><del>-            m_registers.append(RegisterAtOffset(X86Registers::ebx, offset));
</del><ins>+            registerOffsets-&gt;append(RegisterAtOffset(X86Registers::ebx, offset));
</ins><span class="cx">             break;
</span><span class="cx">             
</span><span class="cx">         case UNWIND_X86_64_REG_R12:
</span><del>-            m_registers.append(RegisterAtOffset(X86Registers::r12, offset));
</del><ins>+            registerOffsets-&gt;append(RegisterAtOffset(X86Registers::r12, offset));
</ins><span class="cx">             break;
</span><span class="cx">             
</span><span class="cx">         case UNWIND_X86_64_REG_R13:
</span><del>-            m_registers.append(RegisterAtOffset(X86Registers::r13, offset));
</del><ins>+            registerOffsets-&gt;append(RegisterAtOffset(X86Registers::r13, offset));
</ins><span class="cx">             break;
</span><span class="cx">             
</span><span class="cx">         case UNWIND_X86_64_REG_R14:
</span><del>-            m_registers.append(RegisterAtOffset(X86Registers::r14, offset));
</del><ins>+            registerOffsets-&gt;append(RegisterAtOffset(X86Registers::r14, offset));
</ins><span class="cx">             break;
</span><span class="cx">             
</span><span class="cx">         case UNWIND_X86_64_REG_R15:
</span><del>-            m_registers.append(RegisterAtOffset(X86Registers::r15, offset));
</del><ins>+            registerOffsets-&gt;append(RegisterAtOffset(X86Registers::r15, offset));
</ins><span class="cx">             break;
</span><span class="cx">             
</span><span class="cx">         case UNWIND_X86_64_REG_RBP:
</span><del>-            m_registers.append(RegisterAtOffset(X86Registers::ebp, offset));
</del><ins>+            registerOffsets-&gt;append(RegisterAtOffset(X86Registers::ebp, offset));
</ins><span class="cx">             break;
</span><span class="cx">             
</span><span class="cx">         default:
</span><span class="lines">@@ -721,44 +719,44 @@
</span><span class="cx"> #elif CPU(ARM64)
</span><span class="cx">     RELEASE_ASSERT((encoding &amp; UNWIND_ARM64_MODE_MASK) == UNWIND_ARM64_MODE_FRAME);
</span><span class="cx">     
</span><del>-    m_registers.append(RegisterAtOffset(ARM64Registers::fp, 0));
</del><ins>+    registerOffsets-&gt;append(RegisterAtOffset(ARM64Registers::fp, 0));
</ins><span class="cx">     
</span><span class="cx">     int32_t offset = 0;
</span><span class="cx">     if (encoding &amp; UNWIND_ARM64_FRAME_X19_X20_PAIR) {
</span><del>-        m_registers.append(RegisterAtOffset(ARM64Registers::x19, offset -= 8));
-        m_registers.append(RegisterAtOffset(ARM64Registers::x20, offset -= 8));
</del><ins>+        registerOffsets-&gt;append(RegisterAtOffset(ARM64Registers::x19, offset -= 8));
+        registerOffsets-&gt;append(RegisterAtOffset(ARM64Registers::x20, offset -= 8));
</ins><span class="cx">     }
</span><span class="cx">     if (encoding &amp; UNWIND_ARM64_FRAME_X21_X22_PAIR) {
</span><del>-        m_registers.append(RegisterAtOffset(ARM64Registers::x21, offset -= 8));
-        m_registers.append(RegisterAtOffset(ARM64Registers::x22, offset -= 8));
</del><ins>+        registerOffsets-&gt;append(RegisterAtOffset(ARM64Registers::x21, offset -= 8));
+        registerOffsets-&gt;append(RegisterAtOffset(ARM64Registers::x22, offset -= 8));
</ins><span class="cx">     }
</span><span class="cx">     if (encoding &amp; UNWIND_ARM64_FRAME_X23_X24_PAIR) {
</span><del>-        m_registers.append(RegisterAtOffset(ARM64Registers::x23, offset -= 8));
-        m_registers.append(RegisterAtOffset(ARM64Registers::x24, offset -= 8));
</del><ins>+        registerOffsets-&gt;append(RegisterAtOffset(ARM64Registers::x23, offset -= 8));
+        registerOffsets-&gt;append(RegisterAtOffset(ARM64Registers::x24, offset -= 8));
</ins><span class="cx">     }
</span><span class="cx">     if (encoding &amp; UNWIND_ARM64_FRAME_X25_X26_PAIR) {
</span><del>-        m_registers.append(RegisterAtOffset(ARM64Registers::x25, offset -= 8));
-        m_registers.append(RegisterAtOffset(ARM64Registers::x26, offset -= 8));
</del><ins>+        registerOffsets-&gt;append(RegisterAtOffset(ARM64Registers::x25, offset -= 8));
+        registerOffsets-&gt;append(RegisterAtOffset(ARM64Registers::x26, offset -= 8));
</ins><span class="cx">     }
</span><span class="cx">     if (encoding &amp; UNWIND_ARM64_FRAME_X27_X28_PAIR) {
</span><del>-        m_registers.append(RegisterAtOffset(ARM64Registers::x27, offset -= 8));
-        m_registers.append(RegisterAtOffset(ARM64Registers::x28, offset -= 8));
</del><ins>+        registerOffsets-&gt;append(RegisterAtOffset(ARM64Registers::x27, offset -= 8));
+        registerOffsets-&gt;append(RegisterAtOffset(ARM64Registers::x28, offset -= 8));
</ins><span class="cx">     }
</span><span class="cx">     if (encoding &amp; UNWIND_ARM64_FRAME_D8_D9_PAIR) {
</span><del>-        m_registers.append(RegisterAtOffset(ARM64Registers::q8, offset -= 8));
-        m_registers.append(RegisterAtOffset(ARM64Registers::q9, offset -= 8));
</del><ins>+        registerOffsets-&gt;append(RegisterAtOffset(ARM64Registers::q8, offset -= 8));
+        registerOffsets-&gt;append(RegisterAtOffset(ARM64Registers::q9, offset -= 8));
</ins><span class="cx">     }
</span><span class="cx">     if (encoding &amp; UNWIND_ARM64_FRAME_D10_D11_PAIR) {
</span><del>-        m_registers.append(RegisterAtOffset(ARM64Registers::q10, offset -= 8));
-        m_registers.append(RegisterAtOffset(ARM64Registers::q11, offset -= 8));
</del><ins>+        registerOffsets-&gt;append(RegisterAtOffset(ARM64Registers::q10, offset -= 8));
+        registerOffsets-&gt;append(RegisterAtOffset(ARM64Registers::q11, offset -= 8));
</ins><span class="cx">     }
</span><span class="cx">     if (encoding &amp; UNWIND_ARM64_FRAME_D12_D13_PAIR) {
</span><del>-        m_registers.append(RegisterAtOffset(ARM64Registers::q12, offset -= 8));
-        m_registers.append(RegisterAtOffset(ARM64Registers::q13, offset -= 8));
</del><ins>+        registerOffsets-&gt;append(RegisterAtOffset(ARM64Registers::q12, offset -= 8));
+        registerOffsets-&gt;append(RegisterAtOffset(ARM64Registers::q13, offset -= 8));
</ins><span class="cx">     }
</span><span class="cx">     if (encoding &amp; UNWIND_ARM64_FRAME_D14_D15_PAIR) {
</span><del>-        m_registers.append(RegisterAtOffset(ARM64Registers::q14, offset -= 8));
-        m_registers.append(RegisterAtOffset(ARM64Registers::q15, offset -= 8));
</del><ins>+        registerOffsets-&gt;append(RegisterAtOffset(ARM64Registers::q14, offset -= 8));
+        registerOffsets-&gt;append(RegisterAtOffset(ARM64Registers::q15, offset -= 8));
</ins><span class="cx">     }
</span><span class="cx"> #else
</span><span class="cx"> #error &quot;Unrecognized architecture&quot;
</span><span class="lines">@@ -782,22 +780,22 @@
</span><span class="cx">         if (prolog.savedRegisters[i].saved) {
</span><span class="cx">             switch (i) {
</span><span class="cx">             case UNW_X86_64_rbx:
</span><del>-                m_registers.append(RegisterAtOffset(X86Registers::ebx, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+                registerOffsets-&gt;append(RegisterAtOffset(X86Registers::ebx, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx">                 break;
</span><span class="cx">             case UNW_X86_64_r12:
</span><del>-                m_registers.append(RegisterAtOffset(X86Registers::r12, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+                registerOffsets-&gt;append(RegisterAtOffset(X86Registers::r12, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx">                 break;
</span><span class="cx">             case UNW_X86_64_r13:
</span><del>-                m_registers.append(RegisterAtOffset(X86Registers::r13, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+                registerOffsets-&gt;append(RegisterAtOffset(X86Registers::r13, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx">                 break;
</span><span class="cx">             case UNW_X86_64_r14:
</span><del>-                m_registers.append(RegisterAtOffset(X86Registers::r14, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+                registerOffsets-&gt;append(RegisterAtOffset(X86Registers::r14, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx">                 break;
</span><span class="cx">             case UNW_X86_64_r15:
</span><del>-                m_registers.append(RegisterAtOffset(X86Registers::r15, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+                registerOffsets-&gt;append(RegisterAtOffset(X86Registers::r15, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx">                 break;
</span><span class="cx">             case UNW_X86_64_rbp:
</span><del>-                m_registers.append(RegisterAtOffset(X86Registers::ebp, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+                registerOffsets-&gt;append(RegisterAtOffset(X86Registers::ebp, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx">                 break;
</span><span class="cx">             case DW_X86_64_RET_addr:
</span><span class="cx">                 break;
</span><span class="lines">@@ -816,196 +814,196 @@
</span><span class="cx">         if (prolog.savedRegisters[i].saved) {
</span><span class="cx">             switch (i) {
</span><span class="cx">             case UNW_ARM64_x0:
</span><del>-                m_registers.append(RegisterAtOffset(ARM64Registers::x0, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+                registerOffsets-&gt;append(RegisterAtOffset(ARM64Registers::x0, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx">                 break;
</span><span class="cx">             case UNW_ARM64_x1:
</span><del>-                m_registers.append(RegisterAtOffset(ARM64Registers::x1, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+                registerOffsets-&gt;append(RegisterAtOffset(ARM64Registers::x1, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx">                 break;
</span><span class="cx">             case UNW_ARM64_x2:
</span><del>-                m_registers.append(RegisterAtOffset(ARM64Registers::x2, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+                registerOffsets-&gt;append(RegisterAtOffset(ARM64Registers::x2, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx">                 break;
</span><span class="cx">             case UNW_ARM64_x3:
</span><del>-                m_registers.append(RegisterAtOffset(ARM64Registers::x3, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+                registerOffsets-&gt;append(RegisterAtOffset(ARM64Registers::x3, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx">                 break;
</span><span class="cx">             case UNW_ARM64_x4:
</span><del>-                m_registers.append(RegisterAtOffset(ARM64Registers::x4, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+                registerOffsets-&gt;append(RegisterAtOffset(ARM64Registers::x4, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx">                 break;
</span><span class="cx">             case UNW_ARM64_x5:
</span><del>-                m_registers.append(RegisterAtOffset(ARM64Registers::x5, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+                registerOffsets-&gt;append(RegisterAtOffset(ARM64Registers::x5, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx">                 break;
</span><span class="cx">             case UNW_ARM64_x6:
</span><del>-                m_registers.append(RegisterAtOffset(ARM64Registers::x6, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+                registerOffsets-&gt;append(RegisterAtOffset(ARM64Registers::x6, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx">                 break;
</span><span class="cx">             case UNW_ARM64_x7:
</span><del>-                m_registers.append(RegisterAtOffset(ARM64Registers::x7, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+                registerOffsets-&gt;append(RegisterAtOffset(ARM64Registers::x7, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx">                 break;
</span><span class="cx">             case UNW_ARM64_x8:
</span><del>-                m_registers.append(RegisterAtOffset(ARM64Registers::x8, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+                registerOffsets-&gt;append(RegisterAtOffset(ARM64Registers::x8, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx">                 break;
</span><span class="cx">             case UNW_ARM64_x9:
</span><del>-                m_registers.append(RegisterAtOffset(ARM64Registers::x9, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+                registerOffsets-&gt;append(RegisterAtOffset(ARM64Registers::x9, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx">                 break;
</span><span class="cx">             case UNW_ARM64_x10:
</span><del>-                m_registers.append(RegisterAtOffset(ARM64Registers::x10, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+                registerOffsets-&gt;append(RegisterAtOffset(ARM64Registers::x10, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx">                 break;
</span><span class="cx">             case UNW_ARM64_x11:
</span><del>-                m_registers.append(RegisterAtOffset(ARM64Registers::x11, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+                registerOffsets-&gt;append(RegisterAtOffset(ARM64Registers::x11, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx">                 break;
</span><span class="cx">             case UNW_ARM64_x12:
</span><del>-                m_registers.append(RegisterAtOffset(ARM64Registers::x12, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+                registerOffsets-&gt;append(RegisterAtOffset(ARM64Registers::x12, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx">                 break;
</span><span class="cx">             case UNW_ARM64_x13:
</span><del>-                m_registers.append(RegisterAtOffset(ARM64Registers::x13, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+                registerOffsets-&gt;append(RegisterAtOffset(ARM64Registers::x13, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx">                 break;
</span><span class="cx">             case UNW_ARM64_x14:
</span><del>-                m_registers.append(RegisterAtOffset(ARM64Registers::x14, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+                registerOffsets-&gt;append(RegisterAtOffset(ARM64Registers::x14, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx">                 break;
</span><span class="cx">             case UNW_ARM64_x15:
</span><del>-                m_registers.append(RegisterAtOffset(ARM64Registers::x15, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+                registerOffsets-&gt;append(RegisterAtOffset(ARM64Registers::x15, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx">                 break;
</span><span class="cx">             case UNW_ARM64_x16:
</span><del>-                m_registers.append(RegisterAtOffset(ARM64Registers::x16, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+                registerOffsets-&gt;append(RegisterAtOffset(ARM64Registers::x16, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx">                 break;
</span><span class="cx">             case UNW_ARM64_x17:
</span><del>-                m_registers.append(RegisterAtOffset(ARM64Registers::x17, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+                registerOffsets-&gt;append(RegisterAtOffset(ARM64Registers::x17, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx">                 break;
</span><span class="cx">             case UNW_ARM64_x18:
</span><del>-                m_registers.append(RegisterAtOffset(ARM64Registers::x18, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+                registerOffsets-&gt;append(RegisterAtOffset(ARM64Registers::x18, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx">                 break;
</span><span class="cx">             case UNW_ARM64_x19:
</span><del>-                m_registers.append(RegisterAtOffset(ARM64Registers::x19, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+                registerOffsets-&gt;append(RegisterAtOffset(ARM64Registers::x19, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx">                 break;
</span><span class="cx">             case UNW_ARM64_x20:
</span><del>-                m_registers.append(RegisterAtOffset(ARM64Registers::x20, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+                registerOffsets-&gt;append(RegisterAtOffset(ARM64Registers::x20, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx">                 break;
</span><span class="cx">             case UNW_ARM64_x21:
</span><del>-                m_registers.append(RegisterAtOffset(ARM64Registers::x21, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+                registerOffsets-&gt;append(RegisterAtOffset(ARM64Registers::x21, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx">                 break;
</span><span class="cx">             case UNW_ARM64_x22:
</span><del>-                m_registers.append(RegisterAtOffset(ARM64Registers::x22, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+                registerOffsets-&gt;append(RegisterAtOffset(ARM64Registers::x22, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx">                 break;
</span><span class="cx">             case UNW_ARM64_x23:
</span><del>-                m_registers.append(RegisterAtOffset(ARM64Registers::x23, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+                registerOffsets-&gt;append(RegisterAtOffset(ARM64Registers::x23, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx">                 break;
</span><span class="cx">             case UNW_ARM64_x24:
</span><del>-                m_registers.append(RegisterAtOffset(ARM64Registers::x24, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+                registerOffsets-&gt;append(RegisterAtOffset(ARM64Registers::x24, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx">                 break;
</span><span class="cx">             case UNW_ARM64_x25:
</span><del>-                m_registers.append(RegisterAtOffset(ARM64Registers::x25, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+                registerOffsets-&gt;append(RegisterAtOffset(ARM64Registers::x25, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx">                 break;
</span><span class="cx">             case UNW_ARM64_x26:
</span><del>-                m_registers.append(RegisterAtOffset(ARM64Registers::x26, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+                registerOffsets-&gt;append(RegisterAtOffset(ARM64Registers::x26, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx">                 break;
</span><span class="cx">             case UNW_ARM64_x27:
</span><del>-                m_registers.append(RegisterAtOffset(ARM64Registers::x27, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+                registerOffsets-&gt;append(RegisterAtOffset(ARM64Registers::x27, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx">                 break;
</span><span class="cx">             case UNW_ARM64_x28:
</span><del>-                m_registers.append(RegisterAtOffset(ARM64Registers::x28, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+                registerOffsets-&gt;append(RegisterAtOffset(ARM64Registers::x28, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx">                 break;
</span><span class="cx">             case UNW_ARM64_fp:
</span><del>-                m_registers.append(RegisterAtOffset(ARM64Registers::fp, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+                registerOffsets-&gt;append(RegisterAtOffset(ARM64Registers::fp, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx">                 break;
</span><span class="cx">             case UNW_ARM64_x30:
</span><del>-                m_registers.append(RegisterAtOffset(ARM64Registers::x30, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+                registerOffsets-&gt;append(RegisterAtOffset(ARM64Registers::x30, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx">                 break;
</span><span class="cx">             case UNW_ARM64_sp:
</span><del>-                m_registers.append(RegisterAtOffset(ARM64Registers::sp, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+                registerOffsets-&gt;append(RegisterAtOffset(ARM64Registers::sp, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx">                 break;
</span><span class="cx">             case UNW_ARM64_v0:
</span><del>-                m_registers.append(RegisterAtOffset(ARM64Registers::q0, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+                registerOffsets-&gt;append(RegisterAtOffset(ARM64Registers::q0, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx">                 break;
</span><span class="cx">             case UNW_ARM64_v1:
</span><del>-                m_registers.append(RegisterAtOffset(ARM64Registers::q1, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+                registerOffsets-&gt;append(RegisterAtOffset(ARM64Registers::q1, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx">                 break;
</span><span class="cx">             case UNW_ARM64_v2:
</span><del>-                m_registers.append(RegisterAtOffset(ARM64Registers::q2, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+                registerOffsets-&gt;append(RegisterAtOffset(ARM64Registers::q2, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx">                 break;
</span><span class="cx">             case UNW_ARM64_v3:
</span><del>-                m_registers.append(RegisterAtOffset(ARM64Registers::q3, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+                registerOffsets-&gt;append(RegisterAtOffset(ARM64Registers::q3, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx">                 break;
</span><span class="cx">             case UNW_ARM64_v4:
</span><del>-                m_registers.append(RegisterAtOffset(ARM64Registers::q4, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+                registerOffsets-&gt;append(RegisterAtOffset(ARM64Registers::q4, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx">                 break;
</span><span class="cx">             case UNW_ARM64_v5:
</span><del>-                m_registers.append(RegisterAtOffset(ARM64Registers::q5, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+                registerOffsets-&gt;append(RegisterAtOffset(ARM64Registers::q5, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx">                 break;
</span><span class="cx">             case UNW_ARM64_v6:
</span><del>-                m_registers.append(RegisterAtOffset(ARM64Registers::q6, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+                registerOffsets-&gt;append(RegisterAtOffset(ARM64Registers::q6, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx">                 break;
</span><span class="cx">             case UNW_ARM64_v7:
</span><del>-                m_registers.append(RegisterAtOffset(ARM64Registers::q7, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+                registerOffsets-&gt;append(RegisterAtOffset(ARM64Registers::q7, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx">                 break;
</span><span class="cx">             case UNW_ARM64_v8:
</span><del>-                m_registers.append(RegisterAtOffset(ARM64Registers::q8, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+                registerOffsets-&gt;append(RegisterAtOffset(ARM64Registers::q8, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx">                 break;
</span><span class="cx">             case UNW_ARM64_v9:
</span><del>-                m_registers.append(RegisterAtOffset(ARM64Registers::q9, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+                registerOffsets-&gt;append(RegisterAtOffset(ARM64Registers::q9, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx">                 break;
</span><span class="cx">             case UNW_ARM64_v10:
</span><del>-                m_registers.append(RegisterAtOffset(ARM64Registers::q10, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+                registerOffsets-&gt;append(RegisterAtOffset(ARM64Registers::q10, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx">                 break;
</span><span class="cx">             case UNW_ARM64_v11:
</span><del>-                m_registers.append(RegisterAtOffset(ARM64Registers::q11, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+                registerOffsets-&gt;append(RegisterAtOffset(ARM64Registers::q11, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx">                 break;
</span><span class="cx">             case UNW_ARM64_v12:
</span><del>-                m_registers.append(RegisterAtOffset(ARM64Registers::q12, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+                registerOffsets-&gt;append(RegisterAtOffset(ARM64Registers::q12, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx">                 break;
</span><span class="cx">             case UNW_ARM64_v13:
</span><del>-                m_registers.append(RegisterAtOffset(ARM64Registers::q13, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+                registerOffsets-&gt;append(RegisterAtOffset(ARM64Registers::q13, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx">                 break;
</span><span class="cx">             case UNW_ARM64_v14:
</span><del>-                m_registers.append(RegisterAtOffset(ARM64Registers::q14, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+                registerOffsets-&gt;append(RegisterAtOffset(ARM64Registers::q14, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx">                 break;
</span><span class="cx">             case UNW_ARM64_v15:
</span><del>-                m_registers.append(RegisterAtOffset(ARM64Registers::q15, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+                registerOffsets-&gt;append(RegisterAtOffset(ARM64Registers::q15, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx">                 break;
</span><span class="cx">             case UNW_ARM64_v16:
</span><del>-                m_registers.append(RegisterAtOffset(ARM64Registers::q16, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+                registerOffsets-&gt;append(RegisterAtOffset(ARM64Registers::q16, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx">                 break;
</span><span class="cx">             case UNW_ARM64_v17:
</span><del>-                m_registers.append(RegisterAtOffset(ARM64Registers::q17, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+                registerOffsets-&gt;append(RegisterAtOffset(ARM64Registers::q17, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx">                 break;
</span><span class="cx">             case UNW_ARM64_v18:
</span><del>-                m_registers.append(RegisterAtOffset(ARM64Registers::q18, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+                registerOffsets-&gt;append(RegisterAtOffset(ARM64Registers::q18, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx">                 break;
</span><span class="cx">             case UNW_ARM64_v19:
</span><del>-                m_registers.append(RegisterAtOffset(ARM64Registers::q19, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+                registerOffsets-&gt;append(RegisterAtOffset(ARM64Registers::q19, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx">                 break;
</span><span class="cx">             case UNW_ARM64_v20:
</span><del>-                m_registers.append(RegisterAtOffset(ARM64Registers::q20, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+                registerOffsets-&gt;append(RegisterAtOffset(ARM64Registers::q20, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx">                 break;
</span><span class="cx">             case UNW_ARM64_v21:
</span><del>-                m_registers.append(RegisterAtOffset(ARM64Registers::q21, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+                append(RegisterAtOffset(ARM64Registers::q21, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx">                 break;
</span><span class="cx">             case UNW_ARM64_v22:
</span><del>-                m_registers.append(RegisterAtOffset(ARM64Registers::q22, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+                registerOffsets-&gt;append(RegisterAtOffset(ARM64Registers::q22, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx">                 break;
</span><span class="cx">             case UNW_ARM64_v23:
</span><del>-                m_registers.append(RegisterAtOffset(ARM64Registers::q23, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+                registerOffsets-&gt;append(RegisterAtOffset(ARM64Registers::q23, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx">                 break;
</span><span class="cx">             case UNW_ARM64_v24:
</span><del>-                m_registers.append(RegisterAtOffset(ARM64Registers::q24, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+                registerOffsets-&gt;append(RegisterAtOffset(ARM64Registers::q24, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx">                 break;
</span><span class="cx">             case UNW_ARM64_v25:
</span><del>-                m_registers.append(RegisterAtOffset(ARM64Registers::q25, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+                registerOffsets-&gt;append(RegisterAtOffset(ARM64Registers::q25, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx">                 break;
</span><span class="cx">             case UNW_ARM64_v26:
</span><del>-                m_registers.append(RegisterAtOffset(ARM64Registers::q26, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+                registerOffsets-&gt;append(RegisterAtOffset(ARM64Registers::q26, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx">                 break;
</span><span class="cx">             case UNW_ARM64_v27:
</span><del>-                m_registers.append(RegisterAtOffset(ARM64Registers::q27, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+                registerOffsets-&gt;append(RegisterAtOffset(ARM64Registers::q27, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx">                 break;
</span><span class="cx">             case UNW_ARM64_v28:
</span><del>-                m_registers.append(RegisterAtOffset(ARM64Registers::q28, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+                registerOffsets-&gt;append(RegisterAtOffset(ARM64Registers::q28, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx">                 break;
</span><span class="cx">             case UNW_ARM64_v29:
</span><del>-                m_registers.append(RegisterAtOffset(ARM64Registers::q29, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+                registerOffsets-&gt;append(RegisterAtOffset(ARM64Registers::q29, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx">                 break;
</span><span class="cx">             case UNW_ARM64_v30:
</span><del>-                m_registers.append(RegisterAtOffset(ARM64Registers::q30, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+                registerOffsets-&gt;append(RegisterAtOffset(ARM64Registers::q30, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx">                 break;
</span><span class="cx">             case UNW_ARM64_v31:
</span><del>-                m_registers.append(RegisterAtOffset(ARM64Registers::q31, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</del><ins>+                registerOffsets-&gt;append(RegisterAtOffset(ARM64Registers::q31, prolog.savedRegisters[i].offset + prolog.cfaRegisterOffset));
</ins><span class="cx">                 break;
</span><span class="cx">             default:
</span><span class="cx">                 RELEASE_ASSERT_NOT_REACHED(); // non-standard register being saved in prolog
</span><span class="lines">@@ -1017,27 +1015,10 @@
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> #endif
</span><del>-    std::sort(m_registers.begin(), m_registers.end());
-    return true;
</del><ins>+    registerOffsets-&gt;sort();
+    return WTF::move(registerOffsets);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void UnwindInfo::dump(PrintStream&amp; out) const
-{
-    out.print(listDump(m_registers));
-}
-
-RegisterAtOffset* UnwindInfo::find(Reg reg) const
-{
-    return tryBinarySearch&lt;RegisterAtOffset, Reg&gt;(m_registers, m_registers.size(), reg, RegisterAtOffset::getReg);
-}
-
-unsigned UnwindInfo::indexOf(Reg reg) const
-{
-    if (RegisterAtOffset* pointer = find(reg))
-        return pointer - m_registers.begin();
-    return UINT_MAX;
-}
-
</del><span class="cx"> } } // namespace JSC::FTL
</span><span class="cx"> 
</span><span class="cx"> #endif // ENABLE(FTL_JIT)
</span></span></pre></div>
<a id="branchesjsctailcallSourceJavaScriptCoreftlFTLUnwindInfoh"></a>
<div class="modfile"><h4>Modified: branches/jsc-tailcall/Source/JavaScriptCore/ftl/FTLUnwindInfo.h (188653 => 188654)</h4>
<pre class="diff"><span>
<span class="info">--- branches/jsc-tailcall/Source/JavaScriptCore/ftl/FTLUnwindInfo.h        2015-08-19 22:20:32 UTC (rev 188653)
+++ branches/jsc-tailcall/Source/JavaScriptCore/ftl/FTLUnwindInfo.h        2015-08-19 22:26:29 UTC (rev 188654)
</span><span class="lines">@@ -31,23 +31,11 @@
</span><span class="cx"> #if ENABLE(FTL_JIT)
</span><span class="cx"> 
</span><span class="cx"> #include &quot;FTLGeneratedFunction.h&quot;
</span><del>-#include &quot;FTLRegisterAtOffset.h&quot;
</del><ins>+class RegisterAtOffsetList;
</ins><span class="cx"> 
</span><span class="cx"> namespace JSC { namespace FTL {
</span><span class="cx"> 
</span><del>-struct UnwindInfo {
-    UnwindInfo();
-    ~UnwindInfo();
-    
-    bool parse(void*, size_t, GeneratedFunction);
-    
-    void dump(PrintStream&amp;) const;
-    
-    RegisterAtOffset* find(Reg) const;
-    unsigned indexOf(Reg) const; // Returns UINT_MAX if not found.
-    
-    Vector&lt;RegisterAtOffset&gt; m_registers;
-};
</del><ins>+std::unique_ptr&lt;RegisterAtOffsetList&gt;  parseUnwindInfo(void*, size_t, GeneratedFunction);
</ins><span class="cx"> 
</span><span class="cx"> } } // namespace JSC::FTL
</span><span class="cx"> 
</span></span></pre></div>
<a id="branchesjsctailcallSourceJavaScriptCoreinterpreterInterpretercpp"></a>
<div class="modfile"><h4>Modified: branches/jsc-tailcall/Source/JavaScriptCore/interpreter/Interpreter.cpp (188653 => 188654)</h4>
<pre class="diff"><span>
<span class="info">--- branches/jsc-tailcall/Source/JavaScriptCore/interpreter/Interpreter.cpp        2015-08-19 22:20:32 UTC (rev 188653)
+++ branches/jsc-tailcall/Source/JavaScriptCore/interpreter/Interpreter.cpp        2015-08-19 22:26:29 UTC (rev 188654)
</span><span class="lines">@@ -658,20 +658,24 @@
</span><span class="cx">         if (visitor-&gt;inlineCallFrame())
</span><span class="cx">             return;
</span><span class="cx"> #endif
</span><del>-        RegisterSaveMap* currentCalleeSaves = m_codeBlock ? m_codeBlock-&gt;calleeSaveRegisters() : nullptr;
</del><ins>+        RegisterAtOffsetList* currentCalleeSaves = m_codeBlock ? m_codeBlock-&gt;calleeSaveRegisters() : nullptr;
</ins><span class="cx"> 
</span><span class="cx">         if (!currentCalleeSaves)
</span><span class="cx">             return;
</span><span class="cx"> 
</span><span class="cx">         VM&amp; vm = m_callFrame-&gt;vm();
</span><del>-        RegisterSaveMap* allCalleeSavesMap = vm.getAllCalleeSaveRegistersMap();
-        VirtualRegister calleeSaveBase = virtualRegisterForLocal(m_codeBlock-&gt;calleeSaveSpaceAsVirtualRegisters() - 1);
</del><ins>+        RegisterAtOffsetList* allCalleeSaves = vm.getAllCalleeSaveRegisterOffsets();
+        RegisterSet dontCopyRegisters = RegisterSet::stackRegisters();
+        intptr_t* frame = reinterpret_cast&lt;intptr_t*&gt;(m_callFrame-&gt;registers());
</ins><span class="cx"> 
</span><del>-        intptr_t* calleeSaves = reinterpret_cast&lt;intptr_t*&gt;(m_callFrame-&gt;registers()) + calleeSaveBase.offset();
-
-        for (Reg reg = Reg::first(); reg &lt;= Reg::last(); reg = reg.next()) {
-            if (currentCalleeSaves-&gt;has(reg))
-                vm.calleeSaveRegistersBuffer[allCalleeSavesMap-&gt;getIndexFor(reg)] = calleeSaves[currentCalleeSaves-&gt;getIndexFor(reg)];
</del><ins>+        unsigned registerCount = currentCalleeSaves-&gt;size();
+        for (unsigned i = 0; i &lt; registerCount; i++) {
+            RegisterAtOffset currentEntry = currentCalleeSaves-&gt;at(i);
+            if (dontCopyRegisters.get(currentEntry.reg()))
+                continue;
+            RegisterAtOffset* vmCalleeSavesEntry = allCalleeSaves-&gt;find(currentEntry.reg());
+            
+            vm.calleeSaveRegistersBuffer[vmCalleeSavesEntry-&gt;offsetAsIndex()] = *(frame + currentEntry.offsetAsIndex());
</ins><span class="cx">         }
</span><span class="cx"> #endif
</span><span class="cx">     }
</span></span></pre></div>
<a id="branchesjsctailcallSourceJavaScriptCorejitAssemblyHelpersh"></a>
<div class="modfile"><h4>Modified: branches/jsc-tailcall/Source/JavaScriptCore/jit/AssemblyHelpers.h (188653 => 188654)</h4>
<pre class="diff"><span>
<span class="info">--- branches/jsc-tailcall/Source/JavaScriptCore/jit/AssemblyHelpers.h        2015-08-19 22:20:32 UTC (rev 188653)
+++ branches/jsc-tailcall/Source/JavaScriptCore/jit/AssemblyHelpers.h        2015-08-19 22:26:29 UTC (rev 188654)
</span><span class="lines">@@ -33,7 +33,7 @@
</span><span class="cx"> #include &quot;GPRInfo.h&quot;
</span><span class="cx"> #include &quot;JITCode.h&quot;
</span><span class="cx"> #include &quot;MacroAssembler.h&quot;
</span><del>-#include &quot;RegisterSaveMap.h&quot;
</del><ins>+#include &quot;RegisterAtOffsetList.h&quot;
</ins><span class="cx"> #include &quot;RegisterSet.h&quot;
</span><span class="cx"> #include &quot;TypeofType.h&quot;
</span><span class="cx"> #include &quot;VM.h&quot;
</span><span class="lines">@@ -180,16 +180,15 @@
</span><span class="cx">     {
</span><span class="cx">         ASSERT(codeBlock);
</span><span class="cx"> 
</span><del>-        RegisterSaveMap* calleeSavesMap = codeBlock-&gt;calleeSaveRegisters();
</del><ins>+        RegisterAtOffsetList* calleeSaves = codeBlock-&gt;calleeSaveRegisters();
+        RegisterSet dontSaveRegisters = RegisterSet(RegisterSet::stackRegisters(), RegisterSet::allFPRs());
+        unsigned registerCount = calleeSaves-&gt;size();
</ins><span class="cx"> 
</span><del>-        if (!calleeSavesMap-&gt;size())
-            return;
-
-        VirtualRegister baseVirtualRegister = virtualRegisterForLocal(codeBlock-&gt;calleeSaveSpaceAsVirtualRegisters() - 1) + offsetVirtualRegister;
-
-        for (Reg reg = Reg::first(); reg &lt;= Reg::last(); reg = reg.next()) {
-            if (calleeSavesMap-&gt;has(reg) &amp;&amp; reg.isGPR())
-                storePtr(reg.gpr(), Address(framePointerRegister, baseVirtualRegister.offsetInBytes() + calleeSavesMap-&gt;getOffsetFor(reg)));
</del><ins>+        for (unsigned i = 0; i &lt; registerCount; i++) {
+            RegisterAtOffset entry = calleeSaves-&gt;at(i);
+            if (dontSaveRegisters.get(entry.reg()))
+                continue;
+            storePtr(entry.reg().gpr(), Address(framePointerRegister, offsetVirtualRegister.offsetInBytes() + entry.offset()));
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -197,16 +196,15 @@
</span><span class="cx">     {
</span><span class="cx">         ASSERT(codeBlock);
</span><span class="cx"> 
</span><del>-        RegisterSaveMap* calleeSavesMap = codeBlock-&gt;calleeSaveRegisters();
-
-        if (!calleeSavesMap-&gt;size())
-            return;
-
-        VirtualRegister baseVirtualRegister = virtualRegisterForLocal(codeBlock-&gt;calleeSaveSpaceAsVirtualRegisters() - 1);
-
-        for (Reg reg = Reg::first(); reg &lt;= Reg::last(); reg = reg.next()) {
-            if (calleeSavesMap-&gt;has(reg) &amp;&amp; reg.isGPR())
-                loadPtr(Address(framePointerRegister, baseVirtualRegister.offsetInBytes() + calleeSavesMap-&gt;getOffsetFor(reg)), reg.gpr());
</del><ins>+        RegisterAtOffsetList* calleeSaves = codeBlock-&gt;calleeSaveRegisters();
+        RegisterSet dontRestoreRegisters = RegisterSet(RegisterSet::stackRegisters(), RegisterSet::allFPRs());
+        unsigned registerCount = calleeSaves-&gt;size();
+        
+        for (unsigned i = 0; i &lt; registerCount; i++) {
+            RegisterAtOffset entry = calleeSaves-&gt;at(i);
+            if (dontRestoreRegisters.get(entry.reg()))
+                continue;
+            loadPtr(Address(framePointerRegister, entry.offset()), entry.reg().gpr());
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -226,11 +224,15 @@
</span><span class="cx"> 
</span><span class="cx">         move(TrustedImmPtr(m_vm-&gt;calleeSaveRegistersBuffer), temp1);
</span><span class="cx"> 
</span><del>-        RegisterSaveMap* allCalleeSavesMap = m_vm-&gt;getAllCalleeSaveRegistersMap();
-
-        for (Reg reg = Reg::first(); reg &lt;= Reg::last(); reg = reg.next()) {
-            if (allCalleeSavesMap-&gt;has(reg) &amp;&amp; reg.isGPR())
-                storePtr(reg.gpr(), Address(temp1, allCalleeSavesMap-&gt;getOffsetFor(reg)));
</del><ins>+        RegisterAtOffsetList* allCalleeSaves = m_vm-&gt;getAllCalleeSaveRegisterOffsets();
+        RegisterSet dontCopyRegisters = RegisterSet::stackRegisters();
+        unsigned registerCount = allCalleeSaves-&gt;size();
+        
+        for (unsigned i = 0; i &lt; registerCount; i++) {
+            RegisterAtOffset entry = allCalleeSaves-&gt;at(i);
+            if (dontCopyRegisters.get(entry.reg()))
+                continue;
+            storePtr(entry.reg().gpr(), Address(temp1, entry.offset()));
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -240,46 +242,18 @@
</span><span class="cx">         
</span><span class="cx">         move(TrustedImmPtr(m_vm-&gt;calleeSaveRegistersBuffer), temp1);
</span><span class="cx"> 
</span><del>-        RegisterSaveMap* allCalleeSavesMap = m_vm-&gt;getAllCalleeSaveRegistersMap();
</del><ins>+        RegisterAtOffsetList* allCalleeSaves = m_vm-&gt;getAllCalleeSaveRegisterOffsets();
+        RegisterSet dontRestoreRegisters = RegisterSet::stackRegisters();
+        unsigned registerCount = allCalleeSaves-&gt;size();
</ins><span class="cx">         
</span><del>-        for (Reg reg = Reg::first(); reg &lt;= Reg::last(); reg = reg.next()) {
-            if (allCalleeSavesMap-&gt;has(reg) &amp;&amp; reg.isGPR())
-                loadPtr(Address(temp1, allCalleeSavesMap-&gt;getOffsetFor(reg)), reg.gpr());
</del><ins>+        for (unsigned i = 0; i &lt; registerCount; i++) {
+            RegisterAtOffset entry = allCalleeSaves-&gt;at(i);
+            if (dontRestoreRegisters.get(entry.reg()))
+                continue;
+            loadPtr(Address(temp1, entry.offset()), entry.reg().gpr());
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx">     
</span><del>-    void copyCalleeSavesFromFrameToVMCalleeSavesBuffer(const TempRegisterSet&amp; usedRegisters = { RegisterSet::nonTempRegisters() })
-    {
-        GPRReg temp1 = usedRegisters.getFreeGPR(0);
-        GPRReg temp2 = usedRegisters.getFreeGPR(1);
-        ASSERT(temp2 != InvalidGPRReg);
-
-        ASSERT(codeBlock());
-
-        // Copy saved calleeSaves on stack or unsaved calleeSaves in register to vm calleeSave buffer
-        move(TrustedImmPtr(m_vm-&gt;calleeSaveRegistersBuffer), temp1);
-
-        RegisterSaveMap* allCalleeSavesMap = m_vm-&gt;getAllCalleeSaveRegistersMap();
-        RegisterSaveMap* currentCalleeSaves = codeBlock()-&gt;calleeSaveRegisters();
-        VirtualRegister calleeSaveBase = virtualRegisterForLocal(codeBlock()-&gt;calleeSaveSpaceAsVirtualRegisters() - 1);
-
-        for (Reg reg = Reg::first(); reg &lt;= Reg::last(); reg = reg.next()) {
-            GPRReg regToStore;
-
-            if (allCalleeSavesMap-&gt;has(reg) &amp;&amp; reg.isGPR()) {
-                if (currentCalleeSaves-&gt;has(reg)) {
-                    // Load calleeSave from stack into temp register
-                    regToStore = temp2;
-                    loadPtr(Address(framePointerRegister,  calleeSaveBase.offsetInBytes() + currentCalleeSaves-&gt;getOffsetFor(reg)), regToStore);
-                } else
-                    // Just store callee save directly
-                    regToStore = reg.gpr();
-
-                storePtr(regToStore, Address(temp1, allCalleeSavesMap-&gt;getOffsetFor(reg)));
-            }
-        }
-    }
-
</del><span class="cx">     void copyCalleeSavesFromFrameOrRegisterToVMCalleeSavesBuffer(const TempRegisterSet&amp; usedRegisters = { RegisterSet::nonTempRegisters() })
</span><span class="cx">     {
</span><span class="cx">         GPRReg temp1 = usedRegisters.getFreeGPR(0);
</span><span class="lines">@@ -291,24 +265,28 @@
</span><span class="cx">         // Copy saved calleeSaves on stack or unsaved calleeSaves in register to vm calleeSave buffer
</span><span class="cx">         move(TrustedImmPtr(m_vm-&gt;calleeSaveRegistersBuffer), temp1);
</span><span class="cx"> 
</span><del>-        RegisterSaveMap* allCalleeSavesMap = m_vm-&gt;getAllCalleeSaveRegistersMap();
-        RegisterSaveMap* currentCalleeSaves = codeBlock()-&gt;calleeSaveRegisters();
-        VirtualRegister calleeSaveBase = virtualRegisterForLocal(codeBlock()-&gt;calleeSaveSpaceAsVirtualRegisters() - 1);
-
-        for (Reg reg = Reg::first(); reg &lt;= Reg::last(); reg = reg.next()) {
</del><ins>+        RegisterAtOffsetList* allCalleeSaves = m_vm-&gt;getAllCalleeSaveRegisterOffsets();
+        RegisterAtOffsetList* currentCalleeSaves = codeBlock()-&gt;calleeSaveRegisters();
+        RegisterSet dontCopyRegisters = RegisterSet::stackRegisters();
+        unsigned registerCount = allCalleeSaves-&gt;size();
+        
+        for (unsigned i = 0; i &lt; registerCount; i++) {
</ins><span class="cx">             GPRReg regToStore;
</span><del>-
-            if (allCalleeSavesMap-&gt;has(reg) &amp;&amp; reg.isGPR()) {
-                if (currentCalleeSaves-&gt;has(reg)) {
-                    // Load calleeSave from stack into temp register
-                    regToStore = temp2;
-                    loadPtr(Address(framePointerRegister,  calleeSaveBase.offsetInBytes() + currentCalleeSaves-&gt;getOffsetFor(reg)), regToStore);
-                } else
-                    // Just store callee save directly
-                    regToStore = reg.gpr();
-                
-                storePtr(regToStore, Address(temp1, allCalleeSavesMap-&gt;getOffsetFor(reg)));
-            }
</del><ins>+            
+            RegisterAtOffset vmEntry = allCalleeSaves-&gt;at(i);
+            if (dontCopyRegisters.get(vmEntry.reg()))
+                continue;
+            RegisterAtOffset* currentFrameEntry = currentCalleeSaves-&gt;find(vmEntry.reg());
+            
+            if (currentFrameEntry) {
+                // Load calleeSave from stack into temp register
+                regToStore = temp2;
+                loadPtr(Address(framePointerRegister, currentFrameEntry-&gt;offset()), regToStore);
+            } else
+                // Just store callee save directly
+                regToStore = vmEntry.reg().gpr();
+            
+            storePtr(regToStore, Address(temp1, vmEntry.offset()));
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span></span></pre></div>
<a id="branchesjsctailcallSourceJavaScriptCorejitRegisterAtOffsetcppfromrev188653branchesjsctailcallSourceJavaScriptCoreftlFTLRegisterAtOffsetcpp"></a>
<div class="copfile"><h4>Copied: branches/jsc-tailcall/Source/JavaScriptCore/jit/RegisterAtOffset.cpp (from rev 188653, branches/jsc-tailcall/Source/JavaScriptCore/ftl/FTLRegisterAtOffset.cpp) (0 => 188654)</h4>
<pre class="diff"><span>
<span class="info">--- branches/jsc-tailcall/Source/JavaScriptCore/jit/RegisterAtOffset.cpp                                (rev 0)
+++ branches/jsc-tailcall/Source/JavaScriptCore/jit/RegisterAtOffset.cpp        2015-08-19 22:26:29 UTC (rev 188654)
</span><span class="lines">@@ -0,0 +1,41 @@
</span><ins>+/*
+ * Copyright (C) 2013-2015 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+#include &quot;config.h&quot;
+#include &quot;RegisterAtOffset.h&quot;
+
+#if ENABLE(JIT)
+
+namespace JSC {
+
+void RegisterAtOffset::dump(PrintStream&amp; out) const
+{
+    out.print(reg(), &quot; at &quot;, offset());
+}
+
+} // namespace JSC
+
+#endif // ENABLE(JIT)
+
</ins></span></pre></div>
<a id="branchesjsctailcallSourceJavaScriptCorejitRegisterAtOffsethfromrev188653branchesjsctailcallSourceJavaScriptCoreftlFTLRegisterAtOffseth"></a>
<div class="copfile"><h4>Copied: branches/jsc-tailcall/Source/JavaScriptCore/jit/RegisterAtOffset.h (from rev 188653, branches/jsc-tailcall/Source/JavaScriptCore/ftl/FTLRegisterAtOffset.h) (0 => 188654)</h4>
<pre class="diff"><span>
<span class="info">--- branches/jsc-tailcall/Source/JavaScriptCore/jit/RegisterAtOffset.h                                (rev 0)
+++ branches/jsc-tailcall/Source/JavaScriptCore/jit/RegisterAtOffset.h        2015-08-19 22:26:29 UTC (rev 188654)
</span><span class="lines">@@ -0,0 +1,81 @@
</span><ins>+/*
+ * Copyright (C) 2013-2015 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+#ifndef RegisterAtOffset_h
+#define RegisterAtOffset_h
+
+#if ENABLE(JIT)
+
+#include &quot;Reg.h&quot;
+#include &lt;wtf/PrintStream.h&gt;
+
+namespace JSC {
+
+class RegisterAtOffset {
+public:
+    RegisterAtOffset()
+        : m_offset(0)
+    {
+    }
+    
+    RegisterAtOffset(Reg reg, ptrdiff_t offset)
+        : m_reg(reg)
+        , m_offset(offset)
+    {
+    }
+    
+    bool operator!() const { return !m_reg; }
+    
+    Reg reg() const { return m_reg; }
+    ptrdiff_t offset() const { return m_offset; }
+    int offsetAsIndex() const { return offset() / sizeof(void*); }
+    
+    bool operator==(const RegisterAtOffset&amp; other) const
+    {
+        return reg() == other.reg() &amp;&amp; offset() == other.offset();
+    }
+    
+    bool operator&lt;(const RegisterAtOffset&amp; other) const
+    {
+        if (reg() != other.reg())
+            return reg() &lt; other.reg();
+        return offset() &lt; other.offset();
+    }
+    
+    static Reg getReg(RegisterAtOffset* value) { return value-&gt;reg(); }
+    
+    void dump(PrintStream&amp; out) const;
+
+private:
+    Reg m_reg;
+    ptrdiff_t m_offset;
+};
+
+} // namespace JSC
+
+#endif // ENABLE(JIT)
+
+#endif // RegisterAtOffset_h
+
</ins></span></pre></div>
<a id="branchesjsctailcallSourceJavaScriptCorejitRegisterAtOffsetListcpp"></a>
<div class="addfile"><h4>Added: branches/jsc-tailcall/Source/JavaScriptCore/jit/RegisterAtOffsetList.cpp (0 => 188654)</h4>
<pre class="diff"><span>
<span class="info">--- branches/jsc-tailcall/Source/JavaScriptCore/jit/RegisterAtOffsetList.cpp                                (rev 0)
+++ branches/jsc-tailcall/Source/JavaScriptCore/jit/RegisterAtOffsetList.cpp        2015-08-19 22:26:29 UTC (rev 188654)
</span><span class="lines">@@ -0,0 +1,80 @@
</span><ins>+/*
+ * Copyright (C) 2015 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+#include &quot;config.h&quot;
+#include &quot;RegisterAtOffsetList.h&quot;
+
+#if ENABLE(JIT)
+
+#include &lt;wtf/ListDump.h&gt;
+
+namespace JSC {
+    
+RegisterAtOffsetList::RegisterAtOffsetList() { }
+
+RegisterAtOffsetList::RegisterAtOffsetList(RegisterSet registerSet, OffsetBaseType offsetBaseType)
+{
+    size_t numberOfRegisters = registerSet.numberOfSetGPRs();
+    ptrdiff_t offset = 0;
+    
+    if (offsetBaseType == FramePointerBased)
+        offset = -(static_cast&lt;ptrdiff_t&gt;(numberOfRegisters) * sizeof(void*));
+
+    for (Reg reg = Reg::first(); reg &lt;= Reg::last();reg = reg.next()) {
+        if (registerSet.get(reg) &amp;&amp; reg.isGPR()) {
+            append(RegisterAtOffset(reg, offset));
+            offset += sizeof(void*);
+        }
+    }
+
+    sort();
+}
+
+void RegisterAtOffsetList::sort()
+{
+    std::sort(m_registers.begin(), m_registers.end());
+}
+
+void RegisterAtOffsetList::dump(PrintStream&amp; out) const
+{
+    out.print(listDump(m_registers));
+}
+
+RegisterAtOffset* RegisterAtOffsetList::find(Reg reg) const
+{
+    return tryBinarySearch&lt;RegisterAtOffset, Reg&gt;(m_registers, m_registers.size(), reg, RegisterAtOffset::getReg);
+}
+
+unsigned RegisterAtOffsetList::indexOf(Reg reg) const
+{
+    if (RegisterAtOffset* pointer = find(reg))
+        return pointer - m_registers.begin();
+    return UINT_MAX;
+}
+
+} // namespace JSC
+
+#endif // ENABLE(JIT)
+
</ins></span></pre></div>
<a id="branchesjsctailcallSourceJavaScriptCorejitRegisterAtOffsetListh"></a>
<div class="addfile"><h4>Added: branches/jsc-tailcall/Source/JavaScriptCore/jit/RegisterAtOffsetList.h (0 => 188654)</h4>
<pre class="diff"><span>
<span class="info">--- branches/jsc-tailcall/Source/JavaScriptCore/jit/RegisterAtOffsetList.h                                (rev 0)
+++ branches/jsc-tailcall/Source/JavaScriptCore/jit/RegisterAtOffsetList.h        2015-08-19 22:26:29 UTC (rev 188654)
</span><span class="lines">@@ -0,0 +1,78 @@
</span><ins>+/*
+ * Copyright (C) 2015 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
+ */
+
+#ifndef RegisterAtOffsetList_h
+#define RegisterAtOffsetList_h
+
+#if ENABLE(JIT)
+
+#include &quot;RegisterAtOffset.h&quot;
+#include &quot;RegisterSet.h&quot;
+
+namespace JSC {
+
+class RegisterAtOffsetList {
+public:
+    enum OffsetBaseType { FramePointerBased, ZeroBased };
+
+    RegisterAtOffsetList();
+    RegisterAtOffsetList(RegisterSet, OffsetBaseType = FramePointerBased);
+
+    void dump(PrintStream&amp;) const;
+
+    void clear()
+    {
+        m_registers.clear();
+    }
+
+    size_t size()
+    {
+        return m_registers.size();
+    }
+
+    RegisterAtOffset&amp; at(size_t index)
+    {
+        return m_registers.at(index);
+    }
+    
+    void append(RegisterAtOffset registerAtOffset)
+    {
+        m_registers.append(registerAtOffset);
+    }
+
+    void sort();
+    RegisterAtOffset* find(Reg) const;
+    unsigned indexOf(Reg) const; // Returns UINT_MAX if not found.
+
+private:
+    Vector&lt;RegisterAtOffset&gt; m_registers;
+};
+
+} // namespace JSC
+
+#endif // ENABLE(JIT)
+
+#endif // RegisterAtOffsetList_h
+
</ins></span></pre></div>
<a id="branchesjsctailcallSourceJavaScriptCorejitRegisterSaveMapcpp"></a>
<div class="delfile"><h4>Deleted: branches/jsc-tailcall/Source/JavaScriptCore/jit/RegisterSaveMap.cpp (188653 => 188654)</h4>
<pre class="diff"><span>
<span class="info">--- branches/jsc-tailcall/Source/JavaScriptCore/jit/RegisterSaveMap.cpp        2015-08-19 22:20:32 UTC (rev 188653)
+++ branches/jsc-tailcall/Source/JavaScriptCore/jit/RegisterSaveMap.cpp        2015-08-19 22:26:29 UTC (rev 188654)
</span><span class="lines">@@ -1,56 +0,0 @@
</span><del>-/*
- * Copyright (C) 2015 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
- */
-
-#include &quot;config.h&quot;
-#include &quot;RegisterSaveMap.h&quot;
-
-#if ENABLE(JIT)
-
-#include &quot;MacroAssembler.h&quot;
-
-namespace JSC {
-
-RegisterSaveMap::RegisterSaveMap(RegisterSet registers)
-{
-    m_numberOfRegisters = 0;
-    for (Reg reg = Reg::first(); reg &lt;= Reg::last();reg = reg.next()) {
-        if (registers.get(reg) &amp;&amp; reg.isGPR()) {
-            m_indexForRegister.set(reg.index(), m_numberOfRegisters);
-            m_numberOfRegisters++;
-        }
-    }
-}
-
-unsigned RegisterSaveMap::getIndexFor(Reg reg) const
-{
-    auto iter = m_indexForRegister.find(reg.index());
-    ASSERT(iter != m_indexForRegister.end());
-    return iter-&gt;value;
-}
-
-} // namespace JSC
-
-#endif // ENABLE(JIT)
-
</del></span></pre></div>
<a id="branchesjsctailcallSourceJavaScriptCorejitRegisterSaveMaph"></a>
<div class="delfile"><h4>Deleted: branches/jsc-tailcall/Source/JavaScriptCore/jit/RegisterSaveMap.h (188653 => 188654)</h4>
<pre class="diff"><span>
<span class="info">--- branches/jsc-tailcall/Source/JavaScriptCore/jit/RegisterSaveMap.h        2015-08-19 22:20:32 UTC (rev 188653)
+++ branches/jsc-tailcall/Source/JavaScriptCore/jit/RegisterSaveMap.h        2015-08-19 22:26:29 UTC (rev 188654)
</span><span class="lines">@@ -1,59 +0,0 @@
</span><del>-/*
- * Copyright (C) 2015 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
- */
-
-#ifndef RegisterSaveMap_h
-#define RegisterSaveMap_h
-
-#if ENABLE(JIT)
-
-#include &quot;GPRInfo.h&quot;
-#include &quot;Reg.h&quot;
-#include &quot;RegisterSet.h&quot;
-#include &lt;wtf/HashMap.h&gt;
-
-namespace JSC {
-
-class RegisterSaveMap {
-public:
-    RegisterSaveMap(RegisterSet registers);
-
-    unsigned size() { return m_numberOfRegisters; }
-    bool has(Reg reg) { return m_indexForRegister.contains(reg.index()); }
-    unsigned maxOffset() { return size() * cpuRegisterSize; }
-    unsigned getIndexFor(Reg) const;
-    unsigned getOffsetFor(Reg reg) const { return getIndexFor(reg) * cpuRegisterSize; }
-private:
-    static const unsigned cpuRegisterSize = sizeof(intptr_t);
-
-    unsigned m_numberOfRegisters;
-    HashMap&lt;unsigned, unsigned, WTF::IntHash&lt;unsigned&gt;, WTF::UnsignedWithZeroKeyHashTraits&lt;unsigned&gt; &gt; m_indexForRegister;
-};
-
-} // namespace JSC
-
-#endif // ENABLE(JIT)
-
-#endif // RegisterSaveMap_h
-
</del></span></pre></div>
<a id="branchesjsctailcallSourceJavaScriptCorejitRegisterSetcpp"></a>
<div class="modfile"><h4>Modified: branches/jsc-tailcall/Source/JavaScriptCore/jit/RegisterSet.cpp (188653 => 188654)</h4>
<pre class="diff"><span>
<span class="info">--- branches/jsc-tailcall/Source/JavaScriptCore/jit/RegisterSet.cpp        2015-08-19 22:20:32 UTC (rev 188653)
+++ branches/jsc-tailcall/Source/JavaScriptCore/jit/RegisterSet.cpp        2015-08-19 22:26:29 UTC (rev 188654)
</span><span class="lines">@@ -228,11 +228,45 @@
</span><span class="cx">     return result;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+RegisterSet RegisterSet::ftlCalleeSaveRegisters()
+{
+    RegisterSet result;
+#if ENABLE(FTL_JIT)
+#if CPU(X86_64) &amp;&amp; !OS(WINDOWS)
+    result.set(GPRInfo::regCS0);
+    result.set(GPRInfo::regCS1);
+    result.set(GPRInfo::regCS2);
+    ASSERT(GPRInfo::regCS3 == GPRInfo::tagTypeNumberRegister);
+    ASSERT(GPRInfo::regCS4 == GPRInfo::tagMaskRegister);
+    result.set(GPRInfo::regCS3);
+    result.set(GPRInfo::regCS4);
+#elif CPU(ARM64)
+    // LLVM might save and use all ARM64 callee saves specified in the ABI.
+    result.set(ARM64Registers::x19);
+    result.set(ARM64Registers::x20);
+    result.set(ARM64Registers::x21);
+    result.set(ARM64Registers::x22);
+    result.set(ARM64Registers::x23);
+    result.set(ARM64Registers::x24);
+    result.set(ARM64Registers::x25);
+    result.set(GPRInfo::regCS0);
+    ASSERT(GPRInfo::regCS1 == GPRInfo::tagTypeNumberRegister);
+    ASSERT(GPRInfo::regCS2 == GPRInfo::tagMaskRegister);
+    result.set(GPRInfo::regCS1);
+    result.set(GPRInfo::regCS2);
+#else
+    UNREACHABLE_FOR_PLATFORM();
+#endif
+#endif
+    return result;
+}
+
</ins><span class="cx"> RegisterSet RegisterSet::allVMCalleeSaveRegisters()
</span><span class="cx"> {
</span><span class="cx">     return RegisterSet(llintCalleeSaveRegisters(),
</span><span class="cx">         baselineCalleeSaveRegisters(),
</span><del>-        dfgCalleeSaveRegisters());
</del><ins>+        dfgCalleeSaveRegisters(),
+        ftlCalleeSaveRegisters());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> RegisterSet RegisterSet::allGPRs()
</span></span></pre></div>
<a id="branchesjsctailcallSourceJavaScriptCorejitRegisterSeth"></a>
<div class="modfile"><h4>Modified: branches/jsc-tailcall/Source/JavaScriptCore/jit/RegisterSet.h (188653 => 188654)</h4>
<pre class="diff"><span>
<span class="info">--- branches/jsc-tailcall/Source/JavaScriptCore/jit/RegisterSet.h        2015-08-19 22:20:32 UTC (rev 188653)
+++ branches/jsc-tailcall/Source/JavaScriptCore/jit/RegisterSet.h        2015-08-19 22:26:29 UTC (rev 188654)
</span><span class="lines">@@ -53,6 +53,7 @@
</span><span class="cx">     static RegisterSet llintCalleeSaveRegisters(); // Registers saved and used by the LLInt.
</span><span class="cx">     static RegisterSet baselineCalleeSaveRegisters(); // Registers saved and used by the baseline JIT.
</span><span class="cx">     static RegisterSet dfgCalleeSaveRegisters(); // Registers saved and used by the DFG JIT.
</span><ins>+    static RegisterSet ftlCalleeSaveRegisters(); // Registers that might be saved and used by the FTL JIT.
</ins><span class="cx">     static RegisterSet allVMCalleeSaveRegisters(); // The union of registers saved and used by any VM.
</span><span class="cx">     static RegisterSet nonTempRegisters(); // The union of VM callee save and special registers.
</span><span class="cx">     static RegisterSet allGPRs();
</span></span></pre></div>
<a id="branchesjsctailcallSourceJavaScriptCoreruntimeVMcpp"></a>
<div class="modfile"><h4>Modified: branches/jsc-tailcall/Source/JavaScriptCore/runtime/VM.cpp (188653 => 188654)</h4>
<pre class="diff"><span>
<span class="info">--- branches/jsc-tailcall/Source/JavaScriptCore/runtime/VM.cpp        2015-08-19 22:20:32 UTC (rev 188653)
+++ branches/jsc-tailcall/Source/JavaScriptCore/runtime/VM.cpp        2015-08-19 22:26:29 UTC (rev 188654)
</span><span class="lines">@@ -75,7 +75,7 @@
</span><span class="cx"> #include &quot;PropertyMapHashTable.h&quot;
</span><span class="cx"> #include &quot;RegExpCache.h&quot;
</span><span class="cx"> #include &quot;RegExpObject.h&quot;
</span><del>-#include &quot;RegisterSaveMap.h&quot;
</del><ins>+#include &quot;RegisterAtOffsetList.h&quot;
</ins><span class="cx"> #include &quot;RuntimeType.h&quot;
</span><span class="cx"> #include &quot;SimpleTypedArrayController.h&quot;
</span><span class="cx"> #include &quot;SourceProviderCache.h&quot;
</span><span class="lines">@@ -246,7 +246,7 @@
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(JIT)
</span><span class="cx">     jitStubs = std::make_unique&lt;JITThunks&gt;();
</span><del>-    allCalleeSaveRegistersMap = std::make_unique&lt;RegisterSaveMap&gt;(RegisterSet::allVMCalleeSaveRegisters());
</del><ins>+    allCalleeSaveRegisterOffsets = std::make_unique&lt;RegisterAtOffsetList&gt;(RegisterSet::allVMCalleeSaveRegisters(), RegisterAtOffsetList::ZeroBased);
</ins><span class="cx"> #endif
</span><span class="cx">     arityCheckData = std::make_unique&lt;CommonSlowPaths::ArityCheckData&gt;();
</span><span class="cx"> 
</span></span></pre></div>
<a id="branchesjsctailcallSourceJavaScriptCoreruntimeVMh"></a>
<div class="modfile"><h4>Modified: branches/jsc-tailcall/Source/JavaScriptCore/runtime/VM.h (188653 => 188654)</h4>
<pre class="diff"><span>
<span class="info">--- branches/jsc-tailcall/Source/JavaScriptCore/runtime/VM.h        2015-08-19 22:20:32 UTC (rev 188653)
+++ branches/jsc-tailcall/Source/JavaScriptCore/runtime/VM.h        2015-08-19 22:26:29 UTC (rev 188654)
</span><span class="lines">@@ -92,7 +92,7 @@
</span><span class="cx"> class LegacyProfiler;
</span><span class="cx"> class NativeExecutable;
</span><span class="cx"> class RegExpCache;
</span><del>-class RegisterSaveMap;
</del><ins>+class RegisterAtOffsetList;
</ins><span class="cx"> class ScriptExecutable;
</span><span class="cx"> class SourceProvider;
</span><span class="cx"> class SourceProviderCache;
</span><span class="lines">@@ -349,9 +349,9 @@
</span><span class="cx">     }
</span><span class="cx">     NativeExecutable* getHostFunction(NativeFunction, Intrinsic);
</span><span class="cx">     
</span><del>-    std::unique_ptr&lt;RegisterSaveMap&gt; allCalleeSaveRegistersMap;
</del><ins>+    std::unique_ptr&lt;RegisterAtOffsetList&gt; allCalleeSaveRegisterOffsets;
</ins><span class="cx">     
</span><del>-    RegisterSaveMap* getAllCalleeSaveRegistersMap() { return allCalleeSaveRegistersMap.get(); }
</del><ins>+    RegisterAtOffsetList* getAllCalleeSaveRegisterOffsets() { return allCalleeSaveRegisterOffsets.get(); }
</ins><span class="cx"> 
</span><span class="cx"> #endif // ENABLE(JIT)
</span><span class="cx">     std::unique_ptr&lt;CommonSlowPaths::ArityCheckData&gt; arityCheckData;
</span></span></pre>
</div>
</div>

</body>
</html>