<!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>[191763] 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/191763">191763</a></dd>
<dt>Author</dt> <dd>fpizlo@apple.com</dd>
<dt>Date</dt> <dd>2015-10-29 16:43:42 -0700 (Thu, 29 Oct 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>B3::LowerToAir::imm() should work for both 32-bit and 64-bit immediates
https://bugs.webkit.org/show_bug.cgi?id=150685

Reviewed by Geoffrey Garen.

In B3, a constant must match the type of its use. In Air, immediates don't have type, they
only have representation. A 32-bit immediate (i.e. Arg::imm) can be used either for 32-bit
operations or for 64-bit operations. The only difference from a Arg::imm64 is that it
requires fewer bits.

In the B3-&gt;Air lowering, we have a lot of code that is effectively polymorphic over integer
type. That code should still be able to use Arg::imm, and it should work even for 64-bit
immediates - so long as they are representable as 32-bit immediates. Therefore, the imm()
helper should happily accept either Const32Value or Const64Value.

We already sort of had this with immAnyType(), but it just turns out that anyone using
immAnyType() should really be using imm().

* b3/B3LowerToAir.cpp:
(JSC::B3::Air::LowerToAir::imm):
(JSC::B3::Air::LowerToAir::tryStore):
(JSC::B3::Air::LowerToAir::tryConst64):
(JSC::B3::Air::LowerToAir::immAnyInt): Deleted.
* b3/testb3.cpp:
(JSC::B3::testAdd1):
(JSC::B3::testAdd1Ptr):
(JSC::B3::testStoreAddLoad):
(JSC::B3::run):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceJavaScriptCoreChangeLog">trunk/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#trunkSourceJavaScriptCoreb3B3LowerToAircpp">trunk/Source/JavaScriptCore/b3/B3LowerToAir.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreb3testb3cpp">trunk/Source/JavaScriptCore/b3/testb3.cpp</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ChangeLog (191762 => 191763)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ChangeLog        2015-10-29 23:42:04 UTC (rev 191762)
+++ trunk/Source/JavaScriptCore/ChangeLog        2015-10-29 23:43:42 UTC (rev 191763)
</span><span class="lines">@@ -1,5 +1,36 @@
</span><span class="cx"> 2015-10-29  Filip Pizlo  &lt;fpizlo@apple.com&gt;
</span><span class="cx"> 
</span><ins>+        B3::LowerToAir::imm() should work for both 32-bit and 64-bit immediates
+        https://bugs.webkit.org/show_bug.cgi?id=150685
+
+        Reviewed by Geoffrey Garen.
+
+        In B3, a constant must match the type of its use. In Air, immediates don't have type, they
+        only have representation. A 32-bit immediate (i.e. Arg::imm) can be used either for 32-bit
+        operations or for 64-bit operations. The only difference from a Arg::imm64 is that it
+        requires fewer bits.
+
+        In the B3-&gt;Air lowering, we have a lot of code that is effectively polymorphic over integer
+        type. That code should still be able to use Arg::imm, and it should work even for 64-bit
+        immediates - so long as they are representable as 32-bit immediates. Therefore, the imm()
+        helper should happily accept either Const32Value or Const64Value.
+
+        We already sort of had this with immAnyType(), but it just turns out that anyone using
+        immAnyType() should really be using imm().
+
+        * b3/B3LowerToAir.cpp:
+        (JSC::B3::Air::LowerToAir::imm):
+        (JSC::B3::Air::LowerToAir::tryStore):
+        (JSC::B3::Air::LowerToAir::tryConst64):
+        (JSC::B3::Air::LowerToAir::immAnyInt): Deleted.
+        * b3/testb3.cpp:
+        (JSC::B3::testAdd1):
+        (JSC::B3::testAdd1Ptr):
+        (JSC::B3::testStoreAddLoad):
+        (JSC::B3::run):
+
+2015-10-29  Filip Pizlo  &lt;fpizlo@apple.com&gt;
+
</ins><span class="cx">         StoreOpLoad pattern matching should check effects between the Store and Load
</span><span class="cx">         https://bugs.webkit.org/show_bug.cgi?id=150534
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreb3B3LowerToAircpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/b3/B3LowerToAir.cpp (191762 => 191763)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/b3/B3LowerToAir.cpp        2015-10-29 23:42:04 UTC (rev 191762)
+++ trunk/Source/JavaScriptCore/b3/B3LowerToAir.cpp        2015-10-29 23:43:42 UTC (rev 191763)
</span><span class="lines">@@ -217,13 +217,6 @@
</span><span class="cx"> 
</span><span class="cx">     Arg imm(Value* value)
</span><span class="cx">     {
</span><del>-        if (value-&gt;hasInt32())
-            return Arg::imm(value-&gt;asInt32());
-        return Arg();
-    }
-
-    Arg immAnyInt(Value* value)
-    {
</del><span class="cx">         if (value-&gt;hasInt()) {
</span><span class="cx">             int64_t fullValue = value-&gt;asInt();
</span><span class="cx">             int32_t immediateValue = static_cast&lt;int32_t&gt;(fullValue);
</span><span class="lines">@@ -600,9 +593,8 @@
</span><span class="cx">         Air::Opcode move = moveForType(value-&gt;type());
</span><span class="cx">         Arg destination = effectiveAddr(address);
</span><span class="cx"> 
</span><del>-        Arg imm = immAnyInt(value);
-        if (imm &amp;&amp; isValidForm(move, Arg::Imm, destination.kind())) {
-            append(moveForType(value-&gt;type()), imm, effectiveAddr(address, currentValue));
</del><ins>+        if (imm(value) &amp;&amp; isValidForm(move, Arg::Imm, destination.kind())) {
+            append(moveForType(value-&gt;type()), imm(value), effectiveAddr(address, currentValue));
</ins><span class="cx">             return true;
</span><span class="cx">         }
</span><span class="cx">         
</span><span class="lines">@@ -642,6 +634,10 @@
</span><span class="cx">     
</span><span class="cx">     bool tryConst64()
</span><span class="cx">     {
</span><ins>+        if (imm(currentValue)) {
+            append(Move, imm(currentValue), tmp(currentValue));
+            return true;
+        }
</ins><span class="cx">         append(Move, Arg::imm64(currentValue-&gt;asInt64()), tmp(currentValue));
</span><span class="cx">         return true;
</span><span class="cx">     }
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreb3testb3cpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/b3/testb3.cpp (191762 => 191763)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/b3/testb3.cpp        2015-10-29 23:42:04 UTC (rev 191762)
+++ trunk/Source/JavaScriptCore/b3/testb3.cpp        2015-10-29 23:43:42 UTC (rev 191763)
</span><span class="lines">@@ -214,6 +214,20 @@
</span><span class="cx">     CHECK(compileAndRun&lt;int&gt;(proc, value) == value + 1);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void testAdd1Ptr(intptr_t value)
+{
+    Procedure proc;
+    BasicBlock* root = proc.addBlock();
+    root-&gt;appendNew&lt;ControlValue&gt;(
+        proc, Return, Origin(),
+        root-&gt;appendNew&lt;Value&gt;(
+            proc, Add, Origin(),
+            root-&gt;appendNew&lt;ArgumentRegValue&gt;(proc, Origin(), GPRInfo::argumentGPR0),
+            root-&gt;appendNew&lt;ConstPtrValue&gt;(proc, Origin(), 1)));
+
+    CHECK(compileAndRun&lt;intptr_t&gt;(proc, value) == value + 1);
+}
+
</ins><span class="cx"> void testStoreAddLoad(int amount)
</span><span class="cx"> {
</span><span class="cx">     Procedure proc;
</span><span class="lines">@@ -502,6 +516,8 @@
</span><span class="cx">     RUN(testStoreConstantPtr(49));
</span><span class="cx">     RUN(testTrunc((static_cast&lt;int64_t&gt;(1) &lt;&lt; 40) + 42));
</span><span class="cx">     RUN(testAdd1(45));
</span><ins>+    RUN(testAdd1Ptr(51));
+    RUN(testAdd1Ptr(bitwise_cast&lt;intptr_t&gt;(vm)));
</ins><span class="cx">     RUN(testStoreAddLoad(46));
</span><span class="cx">     RUN(testStoreAddLoadInterference(52));
</span><span class="cx">     RUN(testStoreAddAndLoad(47, 0xffff));
</span></span></pre>
</div>
</div>

</body>
</html>