<!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>[194493] 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/194493">194493</a></dd>
<dt>Author</dt> <dd>fpizlo@apple.com</dd>
<dt>Date</dt> <dd>2016-01-01 22:03:17 -0800 (Fri, 01 Jan 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>FTL B3 should be able to run all of the old V8v7 tests
https://bugs.webkit.org/show_bug.cgi?id=152579

Reviewed by Saam Barati.

Fixes some silly bugs that were preventing us from running all of the old V8v7 tests.

IRC's analysis of when to turn a Move into a Move32 when spilling is based on the premise
that if the dst has a 32-bit def width, then the src must also have a 32-bit def width. But
that doesn't happen if the src is an immediate.

This changes that condition in IRC to use the combined use/def width of both src and dst
rather than being clever. This is great because it's the combined width that determines the
size of the spill slot.

Also added some more debug support to TmpWidth.

This also fixes Air's description of DivDouble; previously it claimed to be a 32-bit
operation. Also implements Output::unsignedToDouble(), since we already had everything we
needed to implement this optimally.

* b3/air/AirIteratedRegisterCoalescing.cpp:
* b3/air/AirOpcode.opcodes:
* b3/air/AirTmpWidth.cpp:
(JSC::B3::Air::TmpWidth::recompute):
(JSC::B3::Air::TmpWidth::Widths::dump):
* b3/air/AirTmpWidth.h:
(JSC::B3::Air::TmpWidth::Widths::Widths):
* ftl/FTLB3Output.cpp:
(JSC::FTL::Output::doubleToUInt):
(JSC::FTL::Output::unsignedToDouble):
* ftl/FTLB3Output.h:
(JSC::FTL::Output::zeroExt):
(JSC::FTL::Output::zeroExtPtr):
(JSC::FTL::Output::intToDouble):
(JSC::FTL::Output::castToInt32):
(JSC::FTL::Output::unsignedToDouble): Deleted.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceJavaScriptCoreChangeLog">trunk/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#trunkSourceJavaScriptCoreb3airAirIteratedRegisterCoalescingcpp">trunk/Source/JavaScriptCore/b3/air/AirIteratedRegisterCoalescing.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreb3airAirOpcodeopcodes">trunk/Source/JavaScriptCore/b3/air/AirOpcode.opcodes</a></li>
<li><a href="#trunkSourceJavaScriptCoreb3airAirTmpWidthcpp">trunk/Source/JavaScriptCore/b3/air/AirTmpWidth.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreb3airAirTmpWidthh">trunk/Source/JavaScriptCore/b3/air/AirTmpWidth.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreftlFTLB3Outputcpp">trunk/Source/JavaScriptCore/ftl/FTLB3Output.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreftlFTLB3Outputh">trunk/Source/JavaScriptCore/ftl/FTLB3Output.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ChangeLog (194492 => 194493)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ChangeLog        2016-01-02 05:56:29 UTC (rev 194492)
+++ trunk/Source/JavaScriptCore/ChangeLog        2016-01-02 06:03:17 UTC (rev 194493)
</span><span class="lines">@@ -1,3 +1,43 @@
</span><ins>+2015-12-28  Filip Pizlo  &lt;fpizlo@apple.com&gt;
+
+        FTL B3 should be able to run all of the old V8v7 tests
+        https://bugs.webkit.org/show_bug.cgi?id=152579
+
+        Reviewed by Saam Barati.
+
+        Fixes some silly bugs that were preventing us from running all of the old V8v7 tests.
+
+        IRC's analysis of when to turn a Move into a Move32 when spilling is based on the premise
+        that if the dst has a 32-bit def width, then the src must also have a 32-bit def width. But
+        that doesn't happen if the src is an immediate.
+
+        This changes that condition in IRC to use the combined use/def width of both src and dst
+        rather than being clever. This is great because it's the combined width that determines the
+        size of the spill slot.
+
+        Also added some more debug support to TmpWidth.
+
+        This also fixes Air's description of DivDouble; previously it claimed to be a 32-bit
+        operation. Also implements Output::unsignedToDouble(), since we already had everything we
+        needed to implement this optimally.
+
+        * b3/air/AirIteratedRegisterCoalescing.cpp:
+        * b3/air/AirOpcode.opcodes:
+        * b3/air/AirTmpWidth.cpp:
+        (JSC::B3::Air::TmpWidth::recompute):
+        (JSC::B3::Air::TmpWidth::Widths::dump):
+        * b3/air/AirTmpWidth.h:
+        (JSC::B3::Air::TmpWidth::Widths::Widths):
+        * ftl/FTLB3Output.cpp:
+        (JSC::FTL::Output::doubleToUInt):
+        (JSC::FTL::Output::unsignedToDouble):
+        * ftl/FTLB3Output.h:
+        (JSC::FTL::Output::zeroExt):
+        (JSC::FTL::Output::zeroExtPtr):
+        (JSC::FTL::Output::intToDouble):
+        (JSC::FTL::Output::castToInt32):
+        (JSC::FTL::Output::unsignedToDouble): Deleted.
+
</ins><span class="cx"> 2016-01-01  Jeff Miller  &lt;jeffm@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Update user-visible copyright strings to include 2016
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreb3airAirIteratedRegisterCoalescingcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/b3/air/AirIteratedRegisterCoalescing.cpp (194492 => 194493)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/b3/air/AirIteratedRegisterCoalescing.cpp        2016-01-02 05:56:29 UTC (rev 194492)
+++ trunk/Source/JavaScriptCore/b3/air/AirIteratedRegisterCoalescing.cpp        2016-01-02 06:03:17 UTC (rev 194493)
</span><span class="lines">@@ -1193,8 +1193,8 @@
</span><span class="cx">                 bool forceMove32IfDidSpill = false;
</span><span class="cx">                 bool didSpill = false;
</span><span class="cx">                 if (type == Arg::GP &amp;&amp; inst.opcode == Move) {
</span><del>-                    if ((inst.args[0].isTmp() &amp;&amp; m_tmpWidth.defWidth(inst.args[0].tmp()) &lt;= Arg::Width32)
-                        || (inst.args[1].isTmp() &amp;&amp; m_tmpWidth.useWidth(inst.args[1].tmp()) &lt;= Arg::Width32))
</del><ins>+                    if ((inst.args[0].isTmp() &amp;&amp; m_tmpWidth.width(inst.args[0].tmp()) &lt;= Arg::Width32)
+                        || (inst.args[1].isTmp() &amp;&amp; m_tmpWidth.width(inst.args[1].tmp()) &lt;= Arg::Width32))
</ins><span class="cx">                         forceMove32IfDidSpill = true;
</span><span class="cx">                 }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreb3airAirOpcodeopcodes"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/b3/air/AirOpcode.opcodes (194492 => 194493)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/b3/air/AirOpcode.opcodes        2016-01-02 05:56:29 UTC (rev 194492)
+++ trunk/Source/JavaScriptCore/b3/air/AirOpcode.opcodes        2016-01-02 06:03:17 UTC (rev 194493)
</span><span class="lines">@@ -201,10 +201,10 @@
</span><span class="cx">     Tmp, Tmp
</span><span class="cx">     Addr, Tmp
</span><span class="cx"> 
</span><del>-arm64: DivDouble U:F:32, U:F:32, D:F:32
</del><ins>+arm64: DivDouble U:F:64, U:F:32, D:F:64
</ins><span class="cx">     Tmp, Tmp, Tmp
</span><span class="cx"> 
</span><del>-x86: DivDouble U:F:32, UD:F:32
</del><ins>+x86: DivDouble U:F:64, UD:F:64
</ins><span class="cx">     Tmp, Tmp
</span><span class="cx">     Addr, Tmp
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreb3airAirTmpWidthcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/b3/air/AirTmpWidth.cpp (194492 => 194493)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/b3/air/AirTmpWidth.cpp        2016-01-02 05:56:29 UTC (rev 194492)
+++ trunk/Source/JavaScriptCore/b3/air/AirTmpWidth.cpp        2016-01-02 06:03:17 UTC (rev 194493)
</span><span class="lines">@@ -30,6 +30,7 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;AirCode.h&quot;
</span><span class="cx"> #include &quot;AirInstInlines.h&quot;
</span><ins>+#include &lt;wtf/ListDump.h&gt;
</ins><span class="cx"> 
</span><span class="cx"> namespace JSC { namespace B3 { namespace Air {
</span><span class="cx"> 
</span><span class="lines">@@ -50,6 +51,13 @@
</span><span class="cx"> {
</span><span class="cx">     // Set this to true to cause this analysis to always return pessimistic results.
</span><span class="cx">     const bool beCareful = false;
</span><ins>+
+    const bool verbose = false;
+
+    if (verbose) {
+        dataLog(&quot;Code before TmpWidth:\n&quot;);
+        dataLog(code);
+    }
</ins><span class="cx">     
</span><span class="cx">     m_width.clear();
</span><span class="cx">     
</span><span class="lines">@@ -150,8 +158,16 @@
</span><span class="cx">             }
</span><span class="cx">         }
</span><span class="cx">     }
</span><ins>+
+    if (verbose)
+        dataLog(&quot;width: &quot;, mapDump(m_width), &quot;\n&quot;);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void TmpWidth::Widths::dump(PrintStream&amp; out) const
+{
+    out.print(&quot;{use = &quot;, use, &quot;, def = &quot;, def, &quot;}&quot;);
+}
+
</ins><span class="cx"> } } } // namespace JSC::B3::Air
</span><span class="cx"> 
</span><span class="cx"> #endif // ENABLE(B3_JIT)
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreb3airAirTmpWidthh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/b3/air/AirTmpWidth.h (194492 => 194493)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/b3/air/AirTmpWidth.h        2016-01-02 05:56:29 UTC (rev 194492)
+++ trunk/Source/JavaScriptCore/b3/air/AirTmpWidth.h        2016-01-02 06:03:17 UTC (rev 194493)
</span><span class="lines">@@ -92,6 +92,8 @@
</span><span class="cx">             use = Arg::minimumWidth(type);
</span><span class="cx">             def = Arg::minimumWidth(type);
</span><span class="cx">         }
</span><ins>+
+        void dump(PrintStream&amp; out) const;
</ins><span class="cx">         
</span><span class="cx">         Arg::Width use;
</span><span class="cx">         Arg::Width def;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreftlFTLB3Outputcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ftl/FTLB3Output.cpp (194492 => 194493)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ftl/FTLB3Output.cpp        2016-01-02 05:56:29 UTC (rev 194492)
+++ trunk/Source/JavaScriptCore/ftl/FTLB3Output.cpp        2016-01-02 06:03:17 UTC (rev 194493)
</span><span class="lines">@@ -125,6 +125,11 @@
</span><span class="cx">     return result;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+LValue Output::unsignedToDouble(LValue value)
+{
+    return intToDouble(zeroExt(value, Int64));
+}
+
</ins><span class="cx"> LValue Output::load8SignExt32(TypedPointer pointer)
</span><span class="cx"> {
</span><span class="cx">     LValue load = m_block-&gt;appendNew&lt;MemoryValue&gt;(m_proc, Load8S, Int32, origin(), pointer.value());
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreftlFTLB3Outputh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ftl/FTLB3Output.h (194492 => 194493)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ftl/FTLB3Output.h        2016-01-02 05:56:29 UTC (rev 194492)
+++ trunk/Source/JavaScriptCore/ftl/FTLB3Output.h        2016-01-02 06:03:17 UTC (rev 194493)
</span><span class="lines">@@ -189,7 +189,7 @@
</span><span class="cx">     }
</span><span class="cx">     LValue zeroExtPtr(LValue value) { return zeroExt(value, B3::Int64); }
</span><span class="cx">     LValue intToDouble(LValue value) { return m_block-&gt;appendNew&lt;B3::Value&gt;(m_proc, B3::IToD, origin(), value); }
</span><del>-    LValue unsignedToDouble(LValue value) { CRASH(); }
</del><ins>+    LValue unsignedToDouble(LValue);
</ins><span class="cx">     LValue castToInt32(LValue value)
</span><span class="cx">     {
</span><span class="cx">         return value-&gt;type() == B3::Int32 ? value :
</span></span></pre>
</div>
</div>

</body>
</html>