<!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>[164326] trunk/Source/JavaScriptCore</title>
</head>
<body>

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

<h3>Log Message</h3>
<pre>FTL unwind parsing should handle ARM64
https://bugs.webkit.org/show_bug.cgi?id=128984

Reviewed by Oliver Hunt.
        
This makes unwind parsing handle ARM64 and it makes all clients of unwind info capable of
dealing with that architecture.
        
The big difference is that ARM64 has callee-save double registers. This is conceptually easy
to handle, but out code for dealing with callee-saves spoke of &quot;GPRReg&quot;. We've been in this
situation before: code that needs to deal with either a GPRReg or a FPRReg. In the past we'd
hacked around the problem, but this time I decided to do a full frontal assault. This patch
adds a Reg class, which is a box for either GPRReg or FPRReg along with tools for iterating
over all possible registers. Then, I threaded this through SaveRestore, RegisterSet,
RegisterAtOffset, and UnwindInfo. With the help of Reg, it was easy to refactor the code to
handle FPRs in addition to GPRs.

* CMakeLists.txt:
* GNUmakefile.list.am:
* JavaScriptCore.vcxproj/JavaScriptCore.vcxproj:
* JavaScriptCore.xcodeproj/project.pbxproj:
* ftl/FTLOSRExitCompiler.cpp:
(JSC::FTL::compileStub):
* ftl/FTLRegisterAtOffset.cpp:
(JSC::FTL::RegisterAtOffset::dump):
* ftl/FTLRegisterAtOffset.h:
(JSC::FTL::RegisterAtOffset::RegisterAtOffset):
(JSC::FTL::RegisterAtOffset::operator!):
(JSC::FTL::RegisterAtOffset::reg):
(JSC::FTL::RegisterAtOffset::operator==):
(JSC::FTL::RegisterAtOffset::operator&lt;):
(JSC::FTL::RegisterAtOffset::getReg):
* ftl/FTLSaveRestore.cpp:
(JSC::FTL::offsetOfReg):
* ftl/FTLSaveRestore.h:
* ftl/FTLUnwindInfo.cpp:
(JSC::FTL::UnwindInfo::parse):
(JSC::FTL::UnwindInfo::find):
(JSC::FTL::UnwindInfo::indexOf):
* ftl/FTLUnwindInfo.h:
* jit/Reg.cpp: Added.
(JSC::Reg::dump):
* jit/Reg.h: Added.
(JSC::Reg::Reg):
(JSC::Reg::fromIndex):
(JSC::Reg::first):
(JSC::Reg::last):
(JSC::Reg::next):
(JSC::Reg::index):
(JSC::Reg::isSet):
(JSC::Reg::operator!):
(JSC::Reg::isGPR):
(JSC::Reg::isFPR):
(JSC::Reg::gpr):
(JSC::Reg::fpr):
(JSC::Reg::operator==):
(JSC::Reg::operator!=):
(JSC::Reg::operator&lt;):
(JSC::Reg::operator&gt;):
(JSC::Reg::operator&lt;=):
(JSC::Reg::operator&gt;=):
(JSC::Reg::hash):
(JSC::Reg::invalid):
* jit/RegisterSet.h:
(JSC::RegisterSet::set):
(JSC::RegisterSet::clear):
(JSC::RegisterSet::get):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceJavaScriptCoreCMakeListstxt">trunk/Source/JavaScriptCore/CMakeLists.txt</a></li>
<li><a href="#trunkSourceJavaScriptCoreChangeLog">trunk/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#trunkSourceJavaScriptCoreGNUmakefilelistam">trunk/Source/JavaScriptCore/GNUmakefile.list.am</a></li>
<li><a href="#trunkSourceJavaScriptCoreJavaScriptCorevcxprojJavaScriptCorevcxproj">trunk/Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj</a></li>
<li><a href="#trunkSourceJavaScriptCoreJavaScriptCorexcodeprojprojectpbxproj">trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj</a></li>
<li><a href="#trunkSourceJavaScriptCoreftlFTLOSRExitCompilercpp">trunk/Source/JavaScriptCore/ftl/FTLOSRExitCompiler.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreftlFTLRegisterAtOffsetcpp">trunk/Source/JavaScriptCore/ftl/FTLRegisterAtOffset.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreftlFTLRegisterAtOffseth">trunk/Source/JavaScriptCore/ftl/FTLRegisterAtOffset.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreftlFTLSaveRestorecpp">trunk/Source/JavaScriptCore/ftl/FTLSaveRestore.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreftlFTLSaveRestoreh">trunk/Source/JavaScriptCore/ftl/FTLSaveRestore.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreftlFTLUnwindInfocpp">trunk/Source/JavaScriptCore/ftl/FTLUnwindInfo.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreftlFTLUnwindInfoh">trunk/Source/JavaScriptCore/ftl/FTLUnwindInfo.h</a></li>
<li><a href="#trunkSourceJavaScriptCorejitRegisterSeth">trunk/Source/JavaScriptCore/jit/RegisterSet.h</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkSourceJavaScriptCorejitRegcpp">trunk/Source/JavaScriptCore/jit/Reg.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCorejitRegh">trunk/Source/JavaScriptCore/jit/Reg.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceJavaScriptCoreCMakeListstxt"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/CMakeLists.txt (164325 => 164326)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/CMakeLists.txt        2014-02-18 22:58:29 UTC (rev 164325)
+++ trunk/Source/JavaScriptCore/CMakeLists.txt        2014-02-18 23:04:53 UTC (rev 164326)
</span><span class="lines">@@ -295,6 +295,7 @@
</span><span class="cx">     jit/JITStubs.cpp
</span><span class="cx">     jit/JITThunks.cpp
</span><span class="cx">     jit/JITToDFGDeferredCompilationCallback.cpp
</span><ins>+    jit/Reg.cpp
</ins><span class="cx">     jit/RegisterPreservationWrapperGenerator.cpp
</span><span class="cx">     jit/RegisterSet.cpp
</span><span class="cx">     jit/Repatch.cpp
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ChangeLog (164325 => 164326)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ChangeLog        2014-02-18 22:58:29 UTC (rev 164325)
+++ trunk/Source/JavaScriptCore/ChangeLog        2014-02-18 23:04:53 UTC (rev 164326)
</span><span class="lines">@@ -1,3 +1,73 @@
</span><ins>+2014-02-18  Filip Pizlo  &lt;fpizlo@apple.com&gt;
+
+        FTL unwind parsing should handle ARM64
+        https://bugs.webkit.org/show_bug.cgi?id=128984
+
+        Reviewed by Oliver Hunt.
+        
+        This makes unwind parsing handle ARM64 and it makes all clients of unwind info capable of
+        dealing with that architecture.
+        
+        The big difference is that ARM64 has callee-save double registers. This is conceptually easy
+        to handle, but out code for dealing with callee-saves spoke of &quot;GPRReg&quot;. We've been in this
+        situation before: code that needs to deal with either a GPRReg or a FPRReg. In the past we'd
+        hacked around the problem, but this time I decided to do a full frontal assault. This patch
+        adds a Reg class, which is a box for either GPRReg or FPRReg along with tools for iterating
+        over all possible registers. Then, I threaded this through SaveRestore, RegisterSet,
+        RegisterAtOffset, and UnwindInfo. With the help of Reg, it was easy to refactor the code to
+        handle FPRs in addition to GPRs.
+
+        * CMakeLists.txt:
+        * GNUmakefile.list.am:
+        * JavaScriptCore.vcxproj/JavaScriptCore.vcxproj:
+        * JavaScriptCore.xcodeproj/project.pbxproj:
+        * ftl/FTLOSRExitCompiler.cpp:
+        (JSC::FTL::compileStub):
+        * ftl/FTLRegisterAtOffset.cpp:
+        (JSC::FTL::RegisterAtOffset::dump):
+        * ftl/FTLRegisterAtOffset.h:
+        (JSC::FTL::RegisterAtOffset::RegisterAtOffset):
+        (JSC::FTL::RegisterAtOffset::operator!):
+        (JSC::FTL::RegisterAtOffset::reg):
+        (JSC::FTL::RegisterAtOffset::operator==):
+        (JSC::FTL::RegisterAtOffset::operator&lt;):
+        (JSC::FTL::RegisterAtOffset::getReg):
+        * ftl/FTLSaveRestore.cpp:
+        (JSC::FTL::offsetOfReg):
+        * ftl/FTLSaveRestore.h:
+        * ftl/FTLUnwindInfo.cpp:
+        (JSC::FTL::UnwindInfo::parse):
+        (JSC::FTL::UnwindInfo::find):
+        (JSC::FTL::UnwindInfo::indexOf):
+        * ftl/FTLUnwindInfo.h:
+        * jit/Reg.cpp: Added.
+        (JSC::Reg::dump):
+        * jit/Reg.h: Added.
+        (JSC::Reg::Reg):
+        (JSC::Reg::fromIndex):
+        (JSC::Reg::first):
+        (JSC::Reg::last):
+        (JSC::Reg::next):
+        (JSC::Reg::index):
+        (JSC::Reg::isSet):
+        (JSC::Reg::operator!):
+        (JSC::Reg::isGPR):
+        (JSC::Reg::isFPR):
+        (JSC::Reg::gpr):
+        (JSC::Reg::fpr):
+        (JSC::Reg::operator==):
+        (JSC::Reg::operator!=):
+        (JSC::Reg::operator&lt;):
+        (JSC::Reg::operator&gt;):
+        (JSC::Reg::operator&lt;=):
+        (JSC::Reg::operator&gt;=):
+        (JSC::Reg::hash):
+        (JSC::Reg::invalid):
+        * jit/RegisterSet.h:
+        (JSC::RegisterSet::set):
+        (JSC::RegisterSet::clear):
+        (JSC::RegisterSet::get):
+
</ins><span class="cx"> 2014-02-17  Filip Pizlo  &lt;fpizlo@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         More ARM FTL glue
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreGNUmakefilelistam"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/GNUmakefile.list.am (164325 => 164326)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/GNUmakefile.list.am        2014-02-18 22:58:29 UTC (rev 164325)
+++ trunk/Source/JavaScriptCore/GNUmakefile.list.am        2014-02-18 23:04:53 UTC (rev 164326)
</span><span class="lines">@@ -786,8 +786,10 @@
</span><span class="cx">         Source/JavaScriptCore/jit/JITToDFGDeferredCompilationCallback.h \
</span><span class="cx">         Source/JavaScriptCore/jit/JITWriteBarrier.h \
</span><span class="cx">         Source/JavaScriptCore/jit/JSInterfaceJIT.h \
</span><del>-    Source/JavaScriptCore/jit/RegisterPreservationWrapperGenerator.h \
-    Source/JavaScriptCore/jit/RegisterPreservationWrapperGenerator.cpp \
</del><ins>+        Source/JavaScriptCore/jit/Reg.h \
+        Source/JavaScriptCore/jit/Reg.cpp \
+        Source/JavaScriptCore/jit/RegisterPreservationWrapperGenerator.h \
+        Source/JavaScriptCore/jit/RegisterPreservationWrapperGenerator.cpp \
</ins><span class="cx">         Source/JavaScriptCore/jit/RegisterSet.cpp \
</span><span class="cx">         Source/JavaScriptCore/jit/RegisterSet.h \
</span><span class="cx">         Source/JavaScriptCore/jit/Repatch.cpp \
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreJavaScriptCorevcxprojJavaScriptCorevcxproj"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj (164325 => 164326)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj        2014-02-18 22:58:29 UTC (rev 164325)
+++ trunk/Source/JavaScriptCore/JavaScriptCore.vcxproj/JavaScriptCore.vcxproj        2014-02-18 23:04:53 UTC (rev 164326)
</span><span class="lines">@@ -540,6 +540,7 @@
</span><span class="cx">     &lt;ClCompile Include=&quot;..\jit\JITStubs.cpp&quot; /&gt;
</span><span class="cx">     &lt;ClCompile Include=&quot;..\jit\JITThunks.cpp&quot; /&gt;
</span><span class="cx">     &lt;ClCompile Include=&quot;..\jit\JITToDFGDeferredCompilationCallback.cpp&quot; /&gt;
</span><ins>+    &lt;ClCompile Include=&quot;..\jit\Reg.cpp&quot; /&gt;
</ins><span class="cx">     &lt;ClCompile Include=&quot;..\jit\RegisterPreservationWrapperGenerator.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\ThunkGenerators.cpp&quot; /&gt;
</span><span class="lines">@@ -1153,6 +1154,7 @@
</span><span class="cx">     &lt;ClInclude Include=&quot;..\jit\JITWriteBarrier.h&quot; /&gt;
</span><span class="cx">     &lt;ClInclude Include=&quot;..\jit\JSInterfaceJIT.h&quot; /&gt;
</span><span class="cx">     &lt;ClCompile Include=&quot;..\jit\RegisterSet.cpp&quot; /&gt;
</span><ins>+    &lt;ClInclude Include=&quot;..\jit\Reg.h&quot; /&gt;
</ins><span class="cx">     &lt;ClInclude Include=&quot;..\jit\RegisterPreservationWrapperGenerator.h&quot; /&gt;
</span><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></pre></div>
<a id="trunkSourceJavaScriptCoreJavaScriptCorexcodeprojprojectpbxproj"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj (164325 => 164326)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj        2014-02-18 22:58:29 UTC (rev 164325)
+++ trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj        2014-02-18 23:04:53 UTC (rev 164326)
</span><span class="lines">@@ -373,6 +373,8 @@
</span><span class="cx">                 0FA581BA150E952C00B9A2D9 /* DFGNodeFlags.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0FA581B7150E952A00B9A2D9 /* DFGNodeFlags.cpp */; };
</span><span class="cx">                 0FA581BB150E953000B9A2D9 /* DFGNodeFlags.h in Headers */ = {isa = PBXBuildFile; fileRef = 0FA581B8150E952A00B9A2D9 /* DFGNodeFlags.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 0FA581BC150E953000B9A2D9 /* DFGNodeType.h in Headers */ = {isa = PBXBuildFile; fileRef = 0FA581B9150E952A00B9A2D9 /* DFGNodeType.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><ins>+                0FA7A8EB18B413C80052371D /* Reg.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0FA7A8E918B413C80052371D /* Reg.cpp */; };
+                0FA7A8EC18B413C80052371D /* Reg.h in Headers */ = {isa = PBXBuildFile; fileRef = 0FA7A8EA18B413C80052371D /* Reg.h */; settings = {ATTRIBUTES = (Private, ); }; };
</ins><span class="cx">                 0FAF7EFD165BA91B000C8455 /* JITDisassembler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0FAF7EFA165BA919000C8455 /* JITDisassembler.cpp */; };
</span><span class="cx">                 0FAF7EFE165BA91F000C8455 /* JITDisassembler.h in Headers */ = {isa = PBXBuildFile; fileRef = 0FAF7EFB165BA919000C8455 /* JITDisassembler.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 0FB105851675480F00F8AB6E /* ExitKind.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0FB105821675480C00F8AB6E /* ExitKind.cpp */; };
</span><span class="lines">@@ -1840,6 +1842,8 @@
</span><span class="cx">                 0FA581B7150E952A00B9A2D9 /* DFGNodeFlags.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = DFGNodeFlags.cpp; path = dfg/DFGNodeFlags.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 0FA581B8150E952A00B9A2D9 /* DFGNodeFlags.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DFGNodeFlags.h; path = dfg/DFGNodeFlags.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 0FA581B9150E952A00B9A2D9 /* DFGNodeType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DFGNodeType.h; path = dfg/DFGNodeType.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><ins>+                0FA7A8E918B413C80052371D /* Reg.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Reg.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
+                0FA7A8EA18B413C80052371D /* Reg.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Reg.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</ins><span class="cx">                 0FAF7EFA165BA919000C8455 /* JITDisassembler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JITDisassembler.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 0FAF7EFB165BA919000C8455 /* JITDisassembler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JITDisassembler.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 0FB105821675480C00F8AB6E /* ExitKind.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ExitKind.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="lines">@@ -3381,6 +3385,8 @@
</span><span class="cx">                                 0FC712E117CD878F008CC93C /* JITToDFGDeferredCompilationCallback.h */,
</span><span class="cx">                                 A76F54A213B28AAB00EF2BCE /* JITWriteBarrier.h */,
</span><span class="cx">                                 A76C51741182748D00715B05 /* JSInterfaceJIT.h */,
</span><ins>+                                0FA7A8E918B413C80052371D /* Reg.cpp */,
+                                0FA7A8EA18B413C80052371D /* Reg.h */,
</ins><span class="cx">                                 0F6B1CBB1861246A00845D97 /* RegisterPreservationWrapperGenerator.cpp */,
</span><span class="cx">                                 0F6B1CBC1861246A00845D97 /* RegisterPreservationWrapperGenerator.h */,
</span><span class="cx">                                 0FC3141418146D7000033232 /* RegisterSet.cpp */,
</span><span class="lines">@@ -5461,6 +5467,7 @@
</span><span class="cx">                                 0FB7F39D15ED8E4600F167B2 /* Reject.h in Headers */,
</span><span class="cx">                                 0F24E55117EE274900ABB217 /* Repatch.h in Headers */,
</span><span class="cx">                                 86D3B3C410159D7F002865E7 /* RepatchBuffer.h in Headers */,
</span><ins>+                                0FA7A8EC18B413C80052371D /* Reg.h in Headers */,
</ins><span class="cx">                                 2AC922BC18A16182003CE0FB /* FTLDWARFDebugLineInfo.h in Headers */,
</span><span class="cx">                                 A513E5B8185B8BD3007E95AD /* InjectedScript.h in Headers */,
</span><span class="cx">                                 869EBCB70E8C6D4A008722CC /* ResultType.h in Headers */,
</span><span class="lines">@@ -6185,6 +6192,7 @@
</span><span class="cx">                                 A532438918568335002ED692 /* InspectorJSFrontendDispatchers.cpp in Sources */,
</span><span class="cx">                                 0FEA0A0B170513DB00BB722C /* FTLCompile.cpp in Sources */,
</span><span class="cx">                                 0F235BD317178E1C00690C7F /* FTLExitArgument.cpp in Sources */,
</span><ins>+                                0FA7A8EB18B413C80052371D /* Reg.cpp in Sources */,
</ins><span class="cx">                                 0F235BD517178E1C00690C7F /* FTLExitArgumentForOperand.cpp in Sources */,
</span><span class="cx">                                 0F235BD817178E1C00690C7F /* FTLExitThunkGenerator.cpp in Sources */,
</span><span class="cx">                                 0F235BDA17178E1C00690C7F /* FTLExitValue.cpp in Sources */,
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreftlFTLOSRExitCompilercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ftl/FTLOSRExitCompiler.cpp (164325 => 164326)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ftl/FTLOSRExitCompiler.cpp        2014-02-18 22:58:29 UTC (rev 164325)
+++ trunk/Source/JavaScriptCore/ftl/FTLOSRExitCompiler.cpp        2014-02-18 23:04:53 UTC (rev 164326)
</span><span class="lines">@@ -274,17 +274,17 @@
</span><span class="cx">     
</span><span class="cx">     // At this point regT1 points to where we would save our registers. Save them here.
</span><span class="cx">     ptrdiff_t currentOffset = 0;
</span><del>-    for (GPRReg gpr = AssemblyHelpers::firstRegister(); gpr &lt;= AssemblyHelpers::lastRegister(); gpr = static_cast&lt;GPRReg&gt;(gpr + 1)) {
-        if (!toSave.get(gpr))
</del><ins>+    for (Reg reg = Reg::first(); reg &lt;= Reg::last(); reg = reg.next()) {
+        if (!toSave.get(reg))
</ins><span class="cx">             continue;
</span><span class="cx">         currentOffset += sizeof(Register);
</span><del>-        unsigned unwindIndex = jitCode-&gt;unwindInfo.indexOf(gpr);
</del><ins>+        unsigned unwindIndex = jitCode-&gt;unwindInfo.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 class="cx">             // preserved by the thunk. Luckily, we saved all registers into the register
</span><span class="cx">             // scratch buffer, so we can restore them from there.
</span><del>-            jit.load64(registerScratch + offsetOfGPR(gpr), GPRInfo::regT0);
</del><ins>+            jit.load64(registerScratch + offsetOfReg(reg), GPRInfo::regT0);
</ins><span class="cx">         } else {
</span><span class="cx">             // The FTL compilation preserved the register. Its new value is therefore
</span><span class="cx">             // irrelevant, but we can get the value that was preserved by using the unwind
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreftlFTLRegisterAtOffsetcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ftl/FTLRegisterAtOffset.cpp (164325 => 164326)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ftl/FTLRegisterAtOffset.cpp        2014-02-18 22:58:29 UTC (rev 164325)
+++ trunk/Source/JavaScriptCore/ftl/FTLRegisterAtOffset.cpp        2014-02-18 23:04:53 UTC (rev 164326)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2013 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2013, 2014 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -32,7 +32,7 @@
</span><span class="cx"> 
</span><span class="cx"> void RegisterAtOffset::dump(PrintStream&amp; out) const
</span><span class="cx"> {
</span><del>-    out.print(gpr(), &quot; at &quot;, offset());
</del><ins>+    out.print(reg(), &quot; at &quot;, offset());
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> } } // namespace JSC::FTL
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreftlFTLRegisterAtOffseth"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ftl/FTLRegisterAtOffset.h (164325 => 164326)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ftl/FTLRegisterAtOffset.h        2014-02-18 22:58:29 UTC (rev 164325)
+++ trunk/Source/JavaScriptCore/ftl/FTLRegisterAtOffset.h        2014-02-18 23:04:53 UTC (rev 164326)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2013 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2013, 2014 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -28,7 +28,7 @@
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(FTL_JIT)
</span><span class="cx"> 
</span><del>-#include &quot;GPRInfo.h&quot;
</del><ins>+#include &quot;Reg.h&quot;
</ins><span class="cx"> #include &lt;wtf/PrintStream.h&gt;
</span><span class="cx"> 
</span><span class="cx"> namespace JSC { namespace FTL {
</span><span class="lines">@@ -36,40 +36,39 @@
</span><span class="cx"> class RegisterAtOffset {
</span><span class="cx"> public:
</span><span class="cx">     RegisterAtOffset()
</span><del>-        : m_gpr(InvalidGPRReg)
-        , m_offset(0)
</del><ins>+        : m_offset(0)
</ins><span class="cx">     {
</span><span class="cx">     }
</span><span class="cx">     
</span><del>-    RegisterAtOffset(GPRReg gpr, ptrdiff_t offset)
-        : m_gpr(gpr)
</del><ins>+    RegisterAtOffset(Reg reg, ptrdiff_t offset)
+        : m_reg(reg)
</ins><span class="cx">         , m_offset(offset)
</span><span class="cx">     {
</span><span class="cx">     }
</span><span class="cx">     
</span><del>-    bool operator!() const { return m_gpr == InvalidGPRReg; }
</del><ins>+    bool operator!() const { return !m_reg; }
</ins><span class="cx">     
</span><del>-    GPRReg gpr() const { return m_gpr; }
</del><ins>+    Reg reg() const { return m_reg; }
</ins><span class="cx">     ptrdiff_t offset() const { return m_offset; }
</span><span class="cx">     
</span><span class="cx">     bool operator==(const RegisterAtOffset&amp; other) const
</span><span class="cx">     {
</span><del>-        return gpr() == other.gpr() &amp;&amp; offset() == other.offset();
</del><ins>+        return reg() == other.reg() &amp;&amp; offset() == other.offset();
</ins><span class="cx">     }
</span><span class="cx">     
</span><span class="cx">     bool operator&lt;(const RegisterAtOffset&amp; other) const
</span><span class="cx">     {
</span><del>-        if (gpr() != other.gpr())
-            return gpr() &lt; other.gpr();
</del><ins>+        if (reg() != other.reg())
+            return reg() &lt; other.reg();
</ins><span class="cx">         return offset() &lt; other.offset();
</span><span class="cx">     }
</span><span class="cx">     
</span><del>-    static GPRReg getGPR(RegisterAtOffset* value) { return value-&gt;gpr(); }
</del><ins>+    static Reg getReg(RegisterAtOffset* value) { return value-&gt;reg(); }
</ins><span class="cx">     
</span><span class="cx">     void dump(PrintStream&amp; out) const;
</span><span class="cx"> 
</span><span class="cx"> private:
</span><del>-    GPRReg m_gpr;
</del><ins>+    Reg m_reg;
</ins><span class="cx">     ptrdiff_t m_offset;
</span><span class="cx"> };
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreftlFTLSaveRestorecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ftl/FTLSaveRestore.cpp (164325 => 164326)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ftl/FTLSaveRestore.cpp        2014-02-18 22:58:29 UTC (rev 164325)
+++ trunk/Source/JavaScriptCore/ftl/FTLSaveRestore.cpp        2014-02-18 23:04:53 UTC (rev 164326)
</span><span class="lines">@@ -62,6 +62,13 @@
</span><span class="cx">     return bytesForGPRs() + MacroAssembler::fpRegisterIndex(reg) * sizeof(double);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+size_t offsetOfReg(Reg reg)
+{
+    if (reg.isGPR())
+        return offsetOfGPR(reg.gpr());
+    return offsetOfFPR(reg.fpr());
+}
+
</ins><span class="cx"> void saveAllRegisters(MacroAssembler&amp; jit, char* scratchMemory)
</span><span class="cx"> {
</span><span class="cx">     // Get the first register out of the way, so that we can use it as a pointer.
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreftlFTLSaveRestoreh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ftl/FTLSaveRestore.h (164325 => 164326)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ftl/FTLSaveRestore.h        2014-02-18 22:58:29 UTC (rev 164325)
+++ trunk/Source/JavaScriptCore/ftl/FTLSaveRestore.h        2014-02-18 23:04:53 UTC (rev 164326)
</span><span class="lines">@@ -32,6 +32,7 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;FPRInfo.h&quot;
</span><span class="cx"> #include &quot;GPRInfo.h&quot;
</span><ins>+#include &quot;Reg.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> namespace JSC {
</span><span class="cx"> 
</span><span class="lines">@@ -41,6 +42,7 @@
</span><span class="cx"> 
</span><span class="cx"> size_t requiredScratchMemorySizeInBytes();
</span><span class="cx"> 
</span><ins>+size_t offsetOfReg(Reg);
</ins><span class="cx"> size_t offsetOfGPR(GPRReg);
</span><span class="cx"> size_t offsetOfFPR(FPRReg);
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreftlFTLUnwindInfocpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ftl/FTLUnwindInfo.cpp (164325 => 164326)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ftl/FTLUnwindInfo.cpp        2014-02-18 22:58:29 UTC (rev 164325)
+++ trunk/Source/JavaScriptCore/ftl/FTLUnwindInfo.cpp        2014-02-18 23:04:53 UTC (rev 164326)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2013 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2013, 2014 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -65,6 +65,8 @@
</span><span class="cx">     RELEASE_ASSERT(!(encoding &amp; UNWIND_IS_NOT_FUNCTION_START));
</span><span class="cx">     RELEASE_ASSERT(!(encoding &amp; UNWIND_HAS_LSDA));
</span><span class="cx">     RELEASE_ASSERT(!(encoding &amp; UNWIND_PERSONALITY_MASK));
</span><ins>+
+#if CPU(X86_64)
</ins><span class="cx">     RELEASE_ASSERT((encoding &amp; UNWIND_X86_64_MODE_MASK) == UNWIND_X86_64_MODE_RBP_FRAME);
</span><span class="cx">     
</span><span class="cx">     int32_t offset = -((encoding &amp; UNWIND_X86_64_RBP_FRAME_OFFSET) &gt;&gt; 16) * 8;
</span><span class="lines">@@ -107,7 +109,52 @@
</span><span class="cx">         
</span><span class="cx">         offset += 8;
</span><span class="cx">     }
</span><ins>+#elif CPU(ARM64)
+    RELEASE_ASSERT((encoding &amp; UNWIND_ARM64_MODE_MASK) == UNWIND_ARM64_MODE_FRAME);
</ins><span class="cx">     
</span><ins>+    m_registers.append(RegisterAtOffset(ARM64Registers::fp, 0));
+    
+    int32_t offset = 0;
+    if (encoding &amp; UNWIND_ARM64_FRAME_X19_X20_PAIR) {
+        m_registers.append(RegisterAtOffset(ARM64Registers::x19, offset -= 8));
+        m_registers.append(RegisterAtOffset(ARM64Registers::x20, offset -= 8));
+    }
+    if (encoding &amp; UNWIND_ARM64_FRAME_X21_X22_PAIR) {
+        m_registers.append(RegisterAtOffset(ARM64Registers::x21, offset -= 8));
+        m_registers.append(RegisterAtOffset(ARM64Registers::x22, offset -= 8));
+    }
+    if (encoding &amp; UNWIND_ARM64_FRAME_X23_X24_PAIR) {
+        m_registers.append(RegisterAtOffset(ARM64Registers::x23, offset -= 8));
+        m_registers.append(RegisterAtOffset(ARM64Registers::x24, offset -= 8));
+    }
+    if (encoding &amp; UNWIND_ARM64_FRAME_X25_X26_PAIR) {
+        m_registers.append(RegisterAtOffset(ARM64Registers::x25, offset -= 8));
+        m_registers.append(RegisterAtOffset(ARM64Registers::x26, offset -= 8));
+    }
+    if (encoding &amp; UNWIND_ARM64_FRAME_X27_X28_PAIR) {
+        m_registers.append(RegisterAtOffset(ARM64Registers::x27, offset -= 8));
+        m_registers.append(RegisterAtOffset(ARM64Registers::x28, offset -= 8));
+    }
+    if (encoding &amp; UNWIND_ARM64_FRAME_D8_D9_PAIR) {
+        m_registers.append(RegisterAtOffset(ARM64Registers::d8, offset -= 8));
+        m_registers.append(RegisterAtOffset(ARM64Registers::d9, offset -= 8));
+    }
+    if (encoding &amp; UNWIND_ARM64_FRAME_D10_D11_PAIR) {
+        m_registers.append(RegisterAtOffset(ARM64Registers::d10, offset -= 8));
+        m_registers.append(RegisterAtOffset(ARM64Registers::d11, offset -= 8));
+    }
+    if (encoding &amp; UNWIND_ARM64_FRAME_D12_D13_PAIR) {
+        m_registers.append(RegisterAtOffset(ARM64Registers::d12, offset -= 8));
+        m_registers.append(RegisterAtOffset(ARM64Registers::d13, offset -= 8));
+    }
+    if (encoding &amp; UNWIND_ARM64_FRAME_D14_D15_PAIR) {
+        m_registers.append(RegisterAtOffset(ARM64Registers::d14, offset -= 8));
+        m_registers.append(RegisterAtOffset(ARM64Registers::d15, offset -= 8));
+    }
+#else
+#error &quot;Unrecognized architecture&quot;
+#endif
+    
</ins><span class="cx">     std::sort(m_registers.begin(), m_registers.end());
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -116,14 +163,14 @@
</span><span class="cx">     out.print(listDump(m_registers));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-RegisterAtOffset* UnwindInfo::find(GPRReg gpr) const
</del><ins>+RegisterAtOffset* UnwindInfo::find(Reg reg) const
</ins><span class="cx"> {
</span><del>-    return tryBinarySearch&lt;RegisterAtOffset, GPRReg&gt;(m_registers, m_registers.size(), gpr, RegisterAtOffset::getGPR);
</del><ins>+    return tryBinarySearch&lt;RegisterAtOffset, Reg&gt;(m_registers, m_registers.size(), reg, RegisterAtOffset::getReg);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-unsigned UnwindInfo::indexOf(GPRReg gpr) const
</del><ins>+unsigned UnwindInfo::indexOf(Reg reg) const
</ins><span class="cx"> {
</span><del>-    if (RegisterAtOffset* pointer = find(gpr))
</del><ins>+    if (RegisterAtOffset* pointer = find(reg))
</ins><span class="cx">         return pointer - m_registers.begin();
</span><span class="cx">     return UINT_MAX;
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreftlFTLUnwindInfoh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ftl/FTLUnwindInfo.h (164325 => 164326)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ftl/FTLUnwindInfo.h        2014-02-18 22:58:29 UTC (rev 164325)
+++ trunk/Source/JavaScriptCore/ftl/FTLUnwindInfo.h        2014-02-18 23:04:53 UTC (rev 164326)
</span><span class="lines">@@ -41,8 +41,8 @@
</span><span class="cx">     
</span><span class="cx">     void dump(PrintStream&amp;) const;
</span><span class="cx">     
</span><del>-    RegisterAtOffset* find(GPRReg) const;
-    unsigned indexOf(GPRReg) const; // Returns UINT_MAX if not found.
</del><ins>+    RegisterAtOffset* find(Reg) const;
+    unsigned indexOf(Reg) const; // Returns UINT_MAX if not found.
</ins><span class="cx">     
</span><span class="cx">     Vector&lt;RegisterAtOffset&gt; m_registers;
</span><span class="cx"> };
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorejitRegcpp"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/jit/Reg.cpp (0 => 164326)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/jit/Reg.cpp                                (rev 0)
+++ trunk/Source/JavaScriptCore/jit/Reg.cpp        2014-02-18 23:04:53 UTC (rev 164326)
</span><span class="lines">@@ -0,0 +1,49 @@
</span><ins>+/*
+ * Copyright (C) 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;Reg.h&quot;
+
+#if ENABLE(JIT)
+
+#include &quot;FPRInfo.h&quot;
+#include &quot;GPRInfo.h&quot;
+
+namespace JSC {
+
+void Reg::dump(PrintStream&amp; out) const
+{
+    if (!*this)
+        out.print(&quot;&lt;none&gt;&quot;);
+    else if (isGPR())
+        out.print(gpr());
+    else
+        out.print(fpr());
+}
+
+} // namespace JSC
+
+#endif // ENABLE(JIT)
+
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCorejitRegh"></a>
<div class="addfile"><h4>Added: trunk/Source/JavaScriptCore/jit/Reg.h (0 => 164326)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/jit/Reg.h                                (rev 0)
+++ trunk/Source/JavaScriptCore/jit/Reg.h        2014-02-18 23:04:53 UTC (rev 164326)
</span><span class="lines">@@ -0,0 +1,176 @@
</span><ins>+/*
+ * Copyright (C) 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 Reg_h
+#define Reg_h
+
+#if ENABLE(JIT)
+
+#include &quot;MacroAssembler.h&quot;
+
+namespace JSC {
+
+// Reg is a polymorphic register class. It can refer to either integer or float registers.
+// Here are some use cases:
+//
+// GPRReg gpr;
+// Reg reg = gpr;
+// reg.isSet() == true
+// reg.isGPR() == true
+// reg.isFPR() == false
+//
+// for (Reg reg = Reg::first(); reg &lt;= Reg::last(); reg = reg.next()) {
+//     if (reg.isGPR()) {
+//     } else /* reg.isFPR() */ {
+//     }
+// }
+//
+// The above loop could have also used !!reg or reg.isSet() as a condition.
+
+class Reg {
+public:
+    Reg()
+        : m_index(invalid())
+    {
+    }
+    
+    Reg(MacroAssembler::RegisterID reg)
+        : m_index(MacroAssembler::registerIndex(reg))
+    {
+    }
+    
+    Reg(MacroAssembler::FPRegisterID reg)
+        : m_index(MacroAssembler::registerIndex(reg))
+    {
+    }
+    
+    static Reg fromIndex(unsigned index)
+    {
+        Reg result;
+        result.m_index = index;
+        return result;
+    }
+    
+    static Reg first()
+    {
+        Reg result;
+        result.m_index = 0;
+        return result;
+    }
+    
+    static Reg last()
+    {
+        Reg result;
+        result.m_index = MacroAssembler::numberOfRegisters() + MacroAssembler::numberOfFPRegisters() - 1;
+        return result;
+    }
+    
+    Reg next() const
+    {
+        ASSERT(!!*this);
+        if (*this == last())
+            return Reg();
+        Reg result;
+        result.m_index = m_index + 1;
+        return result;
+    }
+    
+    unsigned index() const { return m_index; }
+    
+    bool isSet() const { return m_index != invalid(); }
+    bool operator!() const { return !isSet(); }
+    
+    bool isGPR() const
+    {
+        return m_index &lt; MacroAssembler::numberOfRegisters();
+    }
+    
+    bool isFPR() const
+    {
+        return (m_index - MacroAssembler::numberOfRegisters()) &lt; MacroAssembler::numberOfFPRegisters();
+    }
+    
+    MacroAssembler::RegisterID gpr() const
+    {
+        ASSERT(isGPR());
+        return static_cast&lt;MacroAssembler::RegisterID&gt;(MacroAssembler::firstRegister() + m_index);
+    }
+    
+    MacroAssembler::FPRegisterID fpr() const
+    {
+        ASSERT(isFPR());
+        return static_cast&lt;MacroAssembler::FPRegisterID&gt;(
+            MacroAssembler::firstFPRegister() + (m_index - MacroAssembler::numberOfRegisters()));
+    }
+    
+    bool operator==(const Reg&amp; other) const
+    {
+        return m_index == other.m_index;
+    }
+    
+    bool operator!=(const Reg&amp; other) const
+    {
+        return m_index != other.m_index;
+    }
+    
+    bool operator&lt;(const Reg&amp; other) const
+    {
+        return m_index &lt; other.m_index;
+    }
+    
+    bool operator&gt;(const Reg&amp; other) const
+    {
+        return m_index &gt; other.m_index;
+    }
+    
+    bool operator&lt;=(const Reg&amp; other) const
+    {
+        return m_index &lt;= other.m_index;
+    }
+    
+    bool operator&gt;=(const Reg&amp; other) const
+    {
+        return m_index &gt;= other.m_index;
+    }
+    
+    unsigned hash() const
+    {
+        return m_index;
+    }
+    
+    void dump(PrintStream&amp;) const;
+
+private:
+    static uint8_t invalid() { return 0xff; }
+    
+    uint8_t m_index;
+};
+
+} // namespace JSC
+
+#endif // ENABLE(JIT)
+
+#endif // Reg_h
+
</ins></span></pre></div>
<a id="trunkSourceJavaScriptCorejitRegisterSeth"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/jit/RegisterSet.h (164325 => 164326)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/jit/RegisterSet.h        2014-02-18 22:58:29 UTC (rev 164325)
+++ trunk/Source/JavaScriptCore/jit/RegisterSet.h        2014-02-18 23:04:53 UTC (rev 164326)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2013 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2013, 2014 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -33,6 +33,7 @@
</span><span class="cx"> #include &quot;FPRInfo.h&quot;
</span><span class="cx"> #include &quot;GPRInfo.h&quot;
</span><span class="cx"> #include &quot;MacroAssembler.h&quot;
</span><ins>+#include &quot;Reg.h&quot;
</ins><span class="cx"> #include &quot;TempRegisterSet.h&quot;
</span><span class="cx"> #include &lt;wtf/BitVector.h&gt;
</span><span class="cx"> 
</span><span class="lines">@@ -48,12 +49,13 @@
</span><span class="cx">     static RegisterSet allGPRs();
</span><span class="cx">     static RegisterSet allFPRs();
</span><span class="cx">     static RegisterSet allRegisters();
</span><del>-
-    void set(GPRReg reg, bool value = true)
</del><ins>+    
+    void set(Reg reg, bool value = true)
</ins><span class="cx">     {
</span><del>-        m_vector.set(MacroAssembler::registerIndex(reg), value);
</del><ins>+        ASSERT(!!reg);
+        m_vector.set(reg.index(), value);
</ins><span class="cx">     }
</span><del>-    
</del><ins>+
</ins><span class="cx">     void set(JSValueRegs regs)
</span><span class="cx">     {
</span><span class="cx">         if (regs.tagGPR() != InvalidGPRReg)
</span><span class="lines">@@ -61,25 +63,18 @@
</span><span class="cx">         set(regs.payloadGPR());
</span><span class="cx">     }
</span><span class="cx">     
</span><del>-    void clear(GPRReg reg)
</del><ins>+    void clear(Reg reg)
</ins><span class="cx">     {
</span><ins>+        ASSERT(!!reg);
</ins><span class="cx">         set(reg, false);
</span><span class="cx">     }
</span><span class="cx">     
</span><del>-    bool get(GPRReg reg) const { return m_vector.get(MacroAssembler::registerIndex(reg)); }
-    
-    void set(FPRReg reg, bool value = true)
</del><ins>+    bool get(Reg reg) const
</ins><span class="cx">     {
</span><del>-        m_vector.set(MacroAssembler::registerIndex(reg), value);
</del><ins>+        ASSERT(!!reg);
+        return m_vector.get(reg.index());
</ins><span class="cx">     }
</span><span class="cx">     
</span><del>-    void clear(FPRReg reg)
-    {
-        set(reg, false);
-    }
-    
-    bool get(FPRReg reg) const { return m_vector.get(MacroAssembler::registerIndex(reg)); }
-    
</del><span class="cx">     void merge(const RegisterSet&amp; other) { m_vector.merge(other.m_vector); }
</span><span class="cx">     void filter(const RegisterSet&amp; other) { m_vector.filter(other.m_vector); }
</span><span class="cx">     void exclude(const RegisterSet&amp; other) { m_vector.exclude(other.m_vector); }
</span></span></pre>
</div>
</div>

</body>
</html>