<!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>[207781] trunk</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/207781">207781</a></dd>
<dt>Author</dt> <dd>keith_miller@apple.com</dd>
<dt>Date</dt> <dd>2016-10-24 14:44:34 -0700 (Mon, 24 Oct 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>Wasm should support floating point operations.
https://bugs.webkit.org/show_bug.cgi?id=163770

Reviewed by Michael Saboff.

JSTests:

Add appropriate b3op names for floating point wasm bytecodes, where they exist.
Also, fix some WASM =&gt; Wasm in WasmOps.h generator script that I missed
the first time I made the change.

* wasm/generate-wasmops-header.js:
(const.template.pragma.once.ENABLE.WEBASSEMBLY.include.cstdint.namespace.JSC.namespace.WASM.template.typename.Int.inline.bool.isValidOpType): Deleted.
(const.template.pragma.once.ENABLE.WEBASSEMBLY.include.cstdint.namespace.JSC.namespace.WASM.enum.BinaryOpType): Deleted.
(const.template.pragma.once.ENABLE.WEBASSEMBLY.include.cstdint.namespace.JSC.namespace.WASM.enum.UnaryOpType): Deleted.
(const.template.pragma.once.ENABLE.WEBASSEMBLY.include.cstdint.namespace.JSC.namespace.WASM.enum.LoadOpType): Deleted.
(const.template.pragma.once.ENABLE.WEBASSEMBLY.include.cstdint.namespace.JSC.namespace.WASM.enum.StoreOpType): Deleted.
(const.template.pragma.once.ENABLE.WEBASSEMBLY.include.cstdint.namespace.JSC.namespace.WASM.undef.CREATE_ENUM_VALUE.inline.bool.isControlOp): Deleted.
* wasm/wasm.json:

Source/JavaScriptCore:

Since we now have a Double =&gt; Float Trunc in B3, we can now support calls in Wasm
that take floating point arguments. This patch also enables most of the Wasm
floating point operations, as the associated B3 opcode has been linked via wasm.json.
If there is no direct mapping to a B3 opcode the Wasm is not yet implemented. This
patch also fixes a bug in calls where the arguments would be reversed.

* testWasm.cpp:
(cast):
(invoke):
(boxf):
(boxd):
(runWasmTests):
* wasm/WasmB3IRGenerator.cpp:
(JSC::Wasm::createJSWrapper):
* wasm/WasmCallingConvention.h:
(JSC::Wasm::CallingConvention::loadArguments):
(JSC::Wasm::CallingConvention::setupCall):
* wasm/WasmFunctionParser.h:
(JSC::Wasm::FunctionParser&lt;Context&gt;::parseExpression):
(JSC::Wasm::FunctionParser&lt;Context&gt;::parseUnreachableExpression):
* wasm/WasmOps.h:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkJSTestsChangeLog">trunk/JSTests/ChangeLog</a></li>
<li><a href="#trunkJSTestswasmgeneratewasmopsheaderjs">trunk/JSTests/wasm/generate-wasmops-header.js</a></li>
<li><a href="#trunkJSTestswasmwasmjson">trunk/JSTests/wasm/wasm.json</a></li>
<li><a href="#trunkSourceJavaScriptCoreChangeLog">trunk/Source/JavaScriptCore/ChangeLog</a></li>
<li><a href="#trunkSourceJavaScriptCoretestWasmcpp">trunk/Source/JavaScriptCore/testWasm.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCorewasmWasmB3IRGeneratorcpp">trunk/Source/JavaScriptCore/wasm/WasmB3IRGenerator.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCorewasmWasmCallingConventionh">trunk/Source/JavaScriptCore/wasm/WasmCallingConvention.h</a></li>
<li><a href="#trunkSourceJavaScriptCorewasmWasmFunctionParserh">trunk/Source/JavaScriptCore/wasm/WasmFunctionParser.h</a></li>
<li><a href="#trunkSourceJavaScriptCorewasmWasmOpsh">trunk/Source/JavaScriptCore/wasm/WasmOps.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkJSTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/JSTests/ChangeLog (207780 => 207781)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/JSTests/ChangeLog        2016-10-24 21:34:09 UTC (rev 207780)
+++ trunk/JSTests/ChangeLog        2016-10-24 21:44:34 UTC (rev 207781)
</span><span class="lines">@@ -1,3 +1,23 @@
</span><ins>+2016-10-24  Keith Miller  &lt;keith_miller@apple.com&gt;
+
+        Wasm should support floating point operations.
+        https://bugs.webkit.org/show_bug.cgi?id=163770
+
+        Reviewed by Michael Saboff.
+
+        Add appropriate b3op names for floating point wasm bytecodes, where they exist.
+        Also, fix some WASM =&gt; Wasm in WasmOps.h generator script that I missed
+        the first time I made the change.
+
+        * wasm/generate-wasmops-header.js:
+        (const.template.pragma.once.ENABLE.WEBASSEMBLY.include.cstdint.namespace.JSC.namespace.WASM.template.typename.Int.inline.bool.isValidOpType): Deleted.
+        (const.template.pragma.once.ENABLE.WEBASSEMBLY.include.cstdint.namespace.JSC.namespace.WASM.enum.BinaryOpType): Deleted.
+        (const.template.pragma.once.ENABLE.WEBASSEMBLY.include.cstdint.namespace.JSC.namespace.WASM.enum.UnaryOpType): Deleted.
+        (const.template.pragma.once.ENABLE.WEBASSEMBLY.include.cstdint.namespace.JSC.namespace.WASM.enum.LoadOpType): Deleted.
+        (const.template.pragma.once.ENABLE.WEBASSEMBLY.include.cstdint.namespace.JSC.namespace.WASM.enum.StoreOpType): Deleted.
+        (const.template.pragma.once.ENABLE.WEBASSEMBLY.include.cstdint.namespace.JSC.namespace.WASM.undef.CREATE_ENUM_VALUE.inline.bool.isControlOp): Deleted.
+        * wasm/wasm.json:
+
</ins><span class="cx"> 2016-10-21  Saam Barati  &lt;sbarati@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         SpeculativeJIT::compileTryGetById needs to pass in NeedsToSpill along both the cell speculation and untyped speculation path
</span></span></pre></div>
<a id="trunkJSTestswasmgeneratewasmopsheaderjs"></a>
<div class="modfile"><h4>Modified: trunk/JSTests/wasm/generate-wasmops-header.js (207780 => 207781)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/JSTests/wasm/generate-wasmops-header.js        2016-10-24 21:34:09 UTC (rev 207780)
+++ trunk/JSTests/wasm/generate-wasmops-header.js        2016-10-24 21:44:34 UTC (rev 207781)
</span><span class="lines">@@ -1,4 +1,4 @@
</span><del>-// Use the JSON description of WebAssembly to generate the JavaScriptCore's WASMOps.h.
</del><ins>+// Use the JSON description of WebAssembly to generate the JavaScriptCore's WasmOps.h.
</ins><span class="cx"> 
</span><span class="cx"> const jsonFile = 'wasm.json';
</span><span class="cx"> const wasm = JSON.parse(read(jsonFile));
</span><span class="lines">@@ -90,7 +90,7 @@
</span><span class="cx"> 
</span><span class="cx"> #include &lt;cstdint&gt;
</span><span class="cx"> 
</span><del>-namespace JSC { namespace WASM {
</del><ins>+namespace JSC { namespace Wasm {
</ins><span class="cx"> 
</span><span class="cx"> ${defines}
</span><span class="cx"> 
</span><span class="lines">@@ -147,7 +147,7 @@
</span><span class="cx">     return false;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-} } // namespace JSC::WASM
</del><ins>+} } // namespace JSC::Wasm
</ins><span class="cx"> 
</span><span class="cx"> #endif // ENABLE(WEBASSEMBLY)
</span><span class="cx"> `;
</span></span></pre></div>
<a id="trunkJSTestswasmwasmjson"></a>
<div class="modfile"><h4>Modified: trunk/JSTests/wasm/wasm.json (207780 => 207781)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/JSTests/wasm/wasm.json        2016-10-24 21:34:09 UTC (rev 207780)
+++ trunk/JSTests/wasm/wasm.json        2016-10-24 21:44:34 UTC (rev 207781)
</span><span class="lines">@@ -150,46 +150,46 @@
</span><span class="cx">         &quot;i64.ctz&quot;:             { &quot;category&quot;: &quot;arithmetic&quot;, &quot;value&quot;: 115, &quot;return&quot;: [&quot;i64&quot;],      &quot;parameter&quot;: [&quot;i64&quot;],                  &quot;immediate&quot;: []                         },
</span><span class="cx">         &quot;i64.popcnt&quot;:          { &quot;category&quot;: &quot;arithmetic&quot;, &quot;value&quot;: 116, &quot;return&quot;: [&quot;i64&quot;],      &quot;parameter&quot;: [&quot;i64&quot;],                  &quot;immediate&quot;: []                         },
</span><span class="cx">         &quot;i64.eqz&quot;:             { &quot;category&quot;: &quot;comparison&quot;, &quot;value&quot;: 186, &quot;return&quot;: [&quot;bool&quot;],     &quot;parameter&quot;: [&quot;i64&quot;],                  &quot;immediate&quot;: []                         },
</span><del>-        &quot;f32.add&quot;:             { &quot;category&quot;: &quot;arithmetic&quot;, &quot;value&quot;: 117, &quot;return&quot;: [&quot;f32&quot;],      &quot;parameter&quot;: [&quot;f32&quot;, &quot;f32&quot;],           &quot;immediate&quot;: []                         },
-        &quot;f32.sub&quot;:             { &quot;category&quot;: &quot;arithmetic&quot;, &quot;value&quot;: 118, &quot;return&quot;: [&quot;f32&quot;],      &quot;parameter&quot;: [&quot;f32&quot;, &quot;f32&quot;],           &quot;immediate&quot;: []                         },
-        &quot;f32.mul&quot;:             { &quot;category&quot;: &quot;arithmetic&quot;, &quot;value&quot;: 119, &quot;return&quot;: [&quot;f32&quot;],      &quot;parameter&quot;: [&quot;f32&quot;, &quot;f32&quot;],           &quot;immediate&quot;: []                         },
-        &quot;f32.div&quot;:             { &quot;category&quot;: &quot;arithmetic&quot;, &quot;value&quot;: 120, &quot;return&quot;: [&quot;f32&quot;],      &quot;parameter&quot;: [&quot;f32&quot;, &quot;f32&quot;],           &quot;immediate&quot;: []                         },
</del><ins>+        &quot;f32.add&quot;:             { &quot;category&quot;: &quot;arithmetic&quot;, &quot;value&quot;: 117, &quot;return&quot;: [&quot;f32&quot;],      &quot;parameter&quot;: [&quot;f32&quot;, &quot;f32&quot;],           &quot;immediate&quot;: [], &quot;b3op&quot;: &quot;Add&quot;          },
+        &quot;f32.sub&quot;:             { &quot;category&quot;: &quot;arithmetic&quot;, &quot;value&quot;: 118, &quot;return&quot;: [&quot;f32&quot;],      &quot;parameter&quot;: [&quot;f32&quot;, &quot;f32&quot;],           &quot;immediate&quot;: [], &quot;b3op&quot;: &quot;Sub&quot;          },
+        &quot;f32.mul&quot;:             { &quot;category&quot;: &quot;arithmetic&quot;, &quot;value&quot;: 119, &quot;return&quot;: [&quot;f32&quot;],      &quot;parameter&quot;: [&quot;f32&quot;, &quot;f32&quot;],           &quot;immediate&quot;: [], &quot;b3op&quot;: &quot;Mul&quot;          },
+        &quot;f32.div&quot;:             { &quot;category&quot;: &quot;arithmetic&quot;, &quot;value&quot;: 120, &quot;return&quot;: [&quot;f32&quot;],      &quot;parameter&quot;: [&quot;f32&quot;, &quot;f32&quot;],           &quot;immediate&quot;: [], &quot;b3op&quot;: &quot;Div&quot;          },
</ins><span class="cx">         &quot;f32.min&quot;:             { &quot;category&quot;: &quot;arithmetic&quot;, &quot;value&quot;: 121, &quot;return&quot;: [&quot;f32&quot;],      &quot;parameter&quot;: [&quot;f32&quot;, &quot;f32&quot;],           &quot;immediate&quot;: []                         },
</span><span class="cx">         &quot;f32.max&quot;:             { &quot;category&quot;: &quot;arithmetic&quot;, &quot;value&quot;: 122, &quot;return&quot;: [&quot;f32&quot;],      &quot;parameter&quot;: [&quot;f32&quot;, &quot;f32&quot;],           &quot;immediate&quot;: []                         },
</span><del>-        &quot;f32.abs&quot;:             { &quot;category&quot;: &quot;arithmetic&quot;, &quot;value&quot;: 123, &quot;return&quot;: [&quot;f32&quot;],      &quot;parameter&quot;: [&quot;f32&quot;],                  &quot;immediate&quot;: []                         },
</del><ins>+        &quot;f32.abs&quot;:             { &quot;category&quot;: &quot;arithmetic&quot;, &quot;value&quot;: 123, &quot;return&quot;: [&quot;f32&quot;],      &quot;parameter&quot;: [&quot;f32&quot;],                  &quot;immediate&quot;: [], &quot;b3op&quot;: &quot;Abs&quot;          },
</ins><span class="cx">         &quot;f32.neg&quot;:             { &quot;category&quot;: &quot;arithmetic&quot;, &quot;value&quot;: 124, &quot;return&quot;: [&quot;f32&quot;],      &quot;parameter&quot;: [&quot;f32&quot;],                  &quot;immediate&quot;: []                         },
</span><span class="cx">         &quot;f32.copysign&quot;:        { &quot;category&quot;: &quot;arithmetic&quot;, &quot;value&quot;: 125, &quot;return&quot;: [&quot;f32&quot;],      &quot;parameter&quot;: [&quot;f32&quot;],                  &quot;immediate&quot;: []                         },
</span><del>-        &quot;f32.ceil&quot;:            { &quot;category&quot;: &quot;arithmetic&quot;, &quot;value&quot;: 126, &quot;return&quot;: [&quot;f32&quot;],      &quot;parameter&quot;: [&quot;f32&quot;],                  &quot;immediate&quot;: []                         },
-        &quot;f32.floor&quot;:           { &quot;category&quot;: &quot;arithmetic&quot;, &quot;value&quot;: 127, &quot;return&quot;: [&quot;f32&quot;],      &quot;parameter&quot;: [&quot;f32&quot;],                  &quot;immediate&quot;: []                         },
</del><ins>+        &quot;f32.ceil&quot;:            { &quot;category&quot;: &quot;arithmetic&quot;, &quot;value&quot;: 126, &quot;return&quot;: [&quot;f32&quot;],      &quot;parameter&quot;: [&quot;f32&quot;],                  &quot;immediate&quot;: [], &quot;b3op&quot;: &quot;Ceil&quot;         },
+        &quot;f32.floor&quot;:           { &quot;category&quot;: &quot;arithmetic&quot;, &quot;value&quot;: 127, &quot;return&quot;: [&quot;f32&quot;],      &quot;parameter&quot;: [&quot;f32&quot;],                  &quot;immediate&quot;: [], &quot;b3op&quot;: &quot;Floor&quot;        },
</ins><span class="cx">         &quot;f32.trunc&quot;:           { &quot;category&quot;: &quot;arithmetic&quot;, &quot;value&quot;: 128, &quot;return&quot;: [&quot;f32&quot;],      &quot;parameter&quot;: [&quot;f32&quot;],                  &quot;immediate&quot;: []                         },
</span><span class="cx">         &quot;f32.nearest&quot;:         { &quot;category&quot;: &quot;arithmetic&quot;, &quot;value&quot;: 129, &quot;return&quot;: [&quot;f32&quot;],      &quot;parameter&quot;: [&quot;f32&quot;],                  &quot;immediate&quot;: []                         },
</span><span class="cx">         &quot;f32.sqrt&quot;:            { &quot;category&quot;: &quot;arithmetic&quot;, &quot;value&quot;: 130, &quot;return&quot;: [&quot;f32&quot;],      &quot;parameter&quot;: [&quot;f32&quot;],                  &quot;immediate&quot;: []                         },
</span><del>-        &quot;f32.eq&quot;:              { &quot;category&quot;: &quot;comparison&quot;, &quot;value&quot;: 131, &quot;return&quot;: [&quot;bool&quot;],     &quot;parameter&quot;: [&quot;f32&quot;, &quot;f32&quot;],           &quot;immediate&quot;: []                         },
-        &quot;f32.ne&quot;:              { &quot;category&quot;: &quot;comparison&quot;, &quot;value&quot;: 132, &quot;return&quot;: [&quot;bool&quot;],     &quot;parameter&quot;: [&quot;f32&quot;, &quot;f32&quot;],           &quot;immediate&quot;: []                         },
-        &quot;f32.lt&quot;:              { &quot;category&quot;: &quot;comparison&quot;, &quot;value&quot;: 133, &quot;return&quot;: [&quot;bool&quot;],     &quot;parameter&quot;: [&quot;f32&quot;, &quot;f32&quot;],           &quot;immediate&quot;: []                         },
-        &quot;f32.le&quot;:              { &quot;category&quot;: &quot;comparison&quot;, &quot;value&quot;: 134, &quot;return&quot;: [&quot;bool&quot;],     &quot;parameter&quot;: [&quot;f32&quot;, &quot;f32&quot;],           &quot;immediate&quot;: []                         },
-        &quot;f32.gt&quot;:              { &quot;category&quot;: &quot;comparison&quot;, &quot;value&quot;: 135, &quot;return&quot;: [&quot;bool&quot;],     &quot;parameter&quot;: [&quot;f32&quot;, &quot;f32&quot;],           &quot;immediate&quot;: []                         },
-        &quot;f32.ge&quot;:              { &quot;category&quot;: &quot;comparison&quot;, &quot;value&quot;: 136, &quot;return&quot;: [&quot;bool&quot;],     &quot;parameter&quot;: [&quot;f32&quot;, &quot;f32&quot;],           &quot;immediate&quot;: []                         },
-        &quot;f64.add&quot;:             { &quot;category&quot;: &quot;arithmetic&quot;, &quot;value&quot;: 137, &quot;return&quot;: [&quot;f64&quot;],      &quot;parameter&quot;: [&quot;f64&quot;, &quot;f64&quot;],           &quot;immediate&quot;: []                         },
-        &quot;f64.sub&quot;:             { &quot;category&quot;: &quot;arithmetic&quot;, &quot;value&quot;: 138, &quot;return&quot;: [&quot;f64&quot;],      &quot;parameter&quot;: [&quot;f64&quot;, &quot;f64&quot;],           &quot;immediate&quot;: []                         },
-        &quot;f64.mul&quot;:             { &quot;category&quot;: &quot;arithmetic&quot;, &quot;value&quot;: 139, &quot;return&quot;: [&quot;f64&quot;],      &quot;parameter&quot;: [&quot;f64&quot;, &quot;f64&quot;],           &quot;immediate&quot;: []                         },
-        &quot;f64.div&quot;:             { &quot;category&quot;: &quot;arithmetic&quot;, &quot;value&quot;: 140, &quot;return&quot;: [&quot;f64&quot;],      &quot;parameter&quot;: [&quot;f64&quot;, &quot;f64&quot;],           &quot;immediate&quot;: []                         },
</del><ins>+        &quot;f32.eq&quot;:              { &quot;category&quot;: &quot;comparison&quot;, &quot;value&quot;: 131, &quot;return&quot;: [&quot;bool&quot;],     &quot;parameter&quot;: [&quot;f32&quot;, &quot;f32&quot;],           &quot;immediate&quot;: [], &quot;b3op&quot;: &quot;Equal&quot;        },
+        &quot;f32.ne&quot;:              { &quot;category&quot;: &quot;comparison&quot;, &quot;value&quot;: 132, &quot;return&quot;: [&quot;bool&quot;],     &quot;parameter&quot;: [&quot;f32&quot;, &quot;f32&quot;],           &quot;immediate&quot;: [], &quot;b3op&quot;: &quot;NotEqual&quot;     },
+        &quot;f32.lt&quot;:              { &quot;category&quot;: &quot;comparison&quot;, &quot;value&quot;: 133, &quot;return&quot;: [&quot;bool&quot;],     &quot;parameter&quot;: [&quot;f32&quot;, &quot;f32&quot;],           &quot;immediate&quot;: [], &quot;b3op&quot;: &quot;LessThan&quot;     },
+        &quot;f32.le&quot;:              { &quot;category&quot;: &quot;comparison&quot;, &quot;value&quot;: 134, &quot;return&quot;: [&quot;bool&quot;],     &quot;parameter&quot;: [&quot;f32&quot;, &quot;f32&quot;],           &quot;immediate&quot;: [], &quot;b3op&quot;: &quot;LessEqual&quot;    },
+        &quot;f32.gt&quot;:              { &quot;category&quot;: &quot;comparison&quot;, &quot;value&quot;: 135, &quot;return&quot;: [&quot;bool&quot;],     &quot;parameter&quot;: [&quot;f32&quot;, &quot;f32&quot;],           &quot;immediate&quot;: [], &quot;b3op&quot;: &quot;GreaterThan&quot;  },
+        &quot;f32.ge&quot;:              { &quot;category&quot;: &quot;comparison&quot;, &quot;value&quot;: 136, &quot;return&quot;: [&quot;bool&quot;],     &quot;parameter&quot;: [&quot;f32&quot;, &quot;f32&quot;],           &quot;immediate&quot;: [], &quot;b3op&quot;: &quot;GreaterEqual&quot; },
+        &quot;f64.add&quot;:             { &quot;category&quot;: &quot;arithmetic&quot;, &quot;value&quot;: 137, &quot;return&quot;: [&quot;f64&quot;],      &quot;parameter&quot;: [&quot;f64&quot;, &quot;f64&quot;],           &quot;immediate&quot;: [], &quot;b3op&quot;: &quot;Add&quot;          },
+        &quot;f64.sub&quot;:             { &quot;category&quot;: &quot;arithmetic&quot;, &quot;value&quot;: 138, &quot;return&quot;: [&quot;f64&quot;],      &quot;parameter&quot;: [&quot;f64&quot;, &quot;f64&quot;],           &quot;immediate&quot;: [], &quot;b3op&quot;: &quot;Sub&quot;          },
+        &quot;f64.mul&quot;:             { &quot;category&quot;: &quot;arithmetic&quot;, &quot;value&quot;: 139, &quot;return&quot;: [&quot;f64&quot;],      &quot;parameter&quot;: [&quot;f64&quot;, &quot;f64&quot;],           &quot;immediate&quot;: [], &quot;b3op&quot;: &quot;Mul&quot;          },
+        &quot;f64.div&quot;:             { &quot;category&quot;: &quot;arithmetic&quot;, &quot;value&quot;: 140, &quot;return&quot;: [&quot;f64&quot;],      &quot;parameter&quot;: [&quot;f64&quot;, &quot;f64&quot;],           &quot;immediate&quot;: [], &quot;b3op&quot;: &quot;Div&quot;          },
</ins><span class="cx">         &quot;f64.min&quot;:             { &quot;category&quot;: &quot;arithmetic&quot;, &quot;value&quot;: 141, &quot;return&quot;: [&quot;f64&quot;],      &quot;parameter&quot;: [&quot;f64&quot;, &quot;f64&quot;],           &quot;immediate&quot;: []                         },
</span><span class="cx">         &quot;f64.max&quot;:             { &quot;category&quot;: &quot;arithmetic&quot;, &quot;value&quot;: 142, &quot;return&quot;: [&quot;f64&quot;],      &quot;parameter&quot;: [&quot;f64&quot;, &quot;f64&quot;],           &quot;immediate&quot;: []                         },
</span><del>-        &quot;f64.abs&quot;:             { &quot;category&quot;: &quot;arithmetic&quot;, &quot;value&quot;: 143, &quot;return&quot;: [&quot;f64&quot;],      &quot;parameter&quot;: [&quot;f64&quot;],                  &quot;immediate&quot;: []                         },
</del><ins>+        &quot;f64.abs&quot;:             { &quot;category&quot;: &quot;arithmetic&quot;, &quot;value&quot;: 143, &quot;return&quot;: [&quot;f64&quot;],      &quot;parameter&quot;: [&quot;f64&quot;],                  &quot;immediate&quot;: [], &quot;b3op&quot;: &quot;Abs&quot;          },
</ins><span class="cx">         &quot;f64.neg&quot;:             { &quot;category&quot;: &quot;arithmetic&quot;, &quot;value&quot;: 144, &quot;return&quot;: [&quot;f64&quot;],      &quot;parameter&quot;: [&quot;f64&quot;],                  &quot;immediate&quot;: []                         },
</span><span class="cx">         &quot;f64.copysign&quot;:        { &quot;category&quot;: &quot;arithmetic&quot;, &quot;value&quot;: 145, &quot;return&quot;: [&quot;f64&quot;],      &quot;parameter&quot;: [&quot;f64&quot;],                  &quot;immediate&quot;: []                         },
</span><del>-        &quot;f64.ceil&quot;:            { &quot;category&quot;: &quot;arithmetic&quot;, &quot;value&quot;: 146, &quot;return&quot;: [&quot;f64&quot;],      &quot;parameter&quot;: [&quot;f64&quot;],                  &quot;immediate&quot;: []                         },
-        &quot;f64.floor&quot;:           { &quot;category&quot;: &quot;arithmetic&quot;, &quot;value&quot;: 147, &quot;return&quot;: [&quot;f64&quot;],      &quot;parameter&quot;: [&quot;f64&quot;],                  &quot;immediate&quot;: []                         },
</del><ins>+        &quot;f64.ceil&quot;:            { &quot;category&quot;: &quot;arithmetic&quot;, &quot;value&quot;: 146, &quot;return&quot;: [&quot;f64&quot;],      &quot;parameter&quot;: [&quot;f64&quot;],                  &quot;immediate&quot;: [], &quot;b3op&quot;: &quot;Ceil&quot;         },
+        &quot;f64.floor&quot;:           { &quot;category&quot;: &quot;arithmetic&quot;, &quot;value&quot;: 147, &quot;return&quot;: [&quot;f64&quot;],      &quot;parameter&quot;: [&quot;f64&quot;],                  &quot;immediate&quot;: [], &quot;b3op&quot;: &quot;Floor&quot;        },
</ins><span class="cx">         &quot;f64.trunc&quot;:           { &quot;category&quot;: &quot;arithmetic&quot;, &quot;value&quot;: 148, &quot;return&quot;: [&quot;f64&quot;],      &quot;parameter&quot;: [&quot;f64&quot;],                  &quot;immediate&quot;: []                         },
</span><span class="cx">         &quot;f64.nearest&quot;:         { &quot;category&quot;: &quot;arithmetic&quot;, &quot;value&quot;: 149, &quot;return&quot;: [&quot;f64&quot;],      &quot;parameter&quot;: [&quot;f64&quot;],                  &quot;immediate&quot;: []                         },
</span><span class="cx">         &quot;f64.sqrt&quot;:            { &quot;category&quot;: &quot;arithmetic&quot;, &quot;value&quot;: 150, &quot;return&quot;: [&quot;f64&quot;],      &quot;parameter&quot;: [&quot;f64&quot;],                  &quot;immediate&quot;: []                         },
</span><del>-        &quot;f64.eq&quot;:              { &quot;category&quot;: &quot;comparison&quot;, &quot;value&quot;: 151, &quot;return&quot;: [&quot;bool&quot;],     &quot;parameter&quot;: [&quot;f64&quot;, &quot;f64&quot;],           &quot;immediate&quot;: []                         },
-        &quot;f64.ne&quot;:              { &quot;category&quot;: &quot;comparison&quot;, &quot;value&quot;: 152, &quot;return&quot;: [&quot;bool&quot;],     &quot;parameter&quot;: [&quot;f64&quot;, &quot;f64&quot;],           &quot;immediate&quot;: []                         },
-        &quot;f64.lt&quot;:              { &quot;category&quot;: &quot;comparison&quot;, &quot;value&quot;: 153, &quot;return&quot;: [&quot;bool&quot;],     &quot;parameter&quot;: [&quot;f64&quot;, &quot;f64&quot;],           &quot;immediate&quot;: []                         },
-        &quot;f64.le&quot;:              { &quot;category&quot;: &quot;comparison&quot;, &quot;value&quot;: 154, &quot;return&quot;: [&quot;bool&quot;],     &quot;parameter&quot;: [&quot;f64&quot;, &quot;f64&quot;],           &quot;immediate&quot;: []                         },
-        &quot;f64.gt&quot;:              { &quot;category&quot;: &quot;comparison&quot;, &quot;value&quot;: 155, &quot;return&quot;: [&quot;bool&quot;],     &quot;parameter&quot;: [&quot;f64&quot;, &quot;f64&quot;],           &quot;immediate&quot;: []                         },
-        &quot;f64.ge&quot;:              { &quot;category&quot;: &quot;comparison&quot;, &quot;value&quot;: 156, &quot;return&quot;: [&quot;bool&quot;],     &quot;parameter&quot;: [&quot;f64&quot;, &quot;f64&quot;],           &quot;immediate&quot;: []                         },
</del><ins>+        &quot;f64.eq&quot;:              { &quot;category&quot;: &quot;comparison&quot;, &quot;value&quot;: 151, &quot;return&quot;: [&quot;bool&quot;],     &quot;parameter&quot;: [&quot;f64&quot;, &quot;f64&quot;],           &quot;immediate&quot;: [], &quot;b3op&quot;: &quot;Equal&quot;        },
+        &quot;f64.ne&quot;:              { &quot;category&quot;: &quot;comparison&quot;, &quot;value&quot;: 152, &quot;return&quot;: [&quot;bool&quot;],     &quot;parameter&quot;: [&quot;f64&quot;, &quot;f64&quot;],           &quot;immediate&quot;: [], &quot;b3op&quot;: &quot;NotEqual&quot;     },
+        &quot;f64.lt&quot;:              { &quot;category&quot;: &quot;comparison&quot;, &quot;value&quot;: 153, &quot;return&quot;: [&quot;bool&quot;],     &quot;parameter&quot;: [&quot;f64&quot;, &quot;f64&quot;],           &quot;immediate&quot;: [], &quot;b3op&quot;: &quot;LessThan&quot;     },
+        &quot;f64.le&quot;:              { &quot;category&quot;: &quot;comparison&quot;, &quot;value&quot;: 154, &quot;return&quot;: [&quot;bool&quot;],     &quot;parameter&quot;: [&quot;f64&quot;, &quot;f64&quot;],           &quot;immediate&quot;: [], &quot;b3op&quot;: &quot;LessEqual&quot;    },
+        &quot;f64.gt&quot;:              { &quot;category&quot;: &quot;comparison&quot;, &quot;value&quot;: 155, &quot;return&quot;: [&quot;bool&quot;],     &quot;parameter&quot;: [&quot;f64&quot;, &quot;f64&quot;],           &quot;immediate&quot;: [], &quot;b3op&quot;: &quot;GreaterThan&quot;  },
+        &quot;f64.ge&quot;:              { &quot;category&quot;: &quot;comparison&quot;, &quot;value&quot;: 156, &quot;return&quot;: [&quot;bool&quot;],     &quot;parameter&quot;: [&quot;f64&quot;, &quot;f64&quot;],           &quot;immediate&quot;: [], &quot;b3op&quot;: &quot;GreaterEqual&quot; },
</ins><span class="cx">         &quot;i32.trunc_s/f32&quot;:     { &quot;category&quot;: &quot;conversion&quot;, &quot;value&quot;: 157, &quot;return&quot;: [&quot;i32&quot;],      &quot;parameter&quot;: [&quot;f32&quot;],                  &quot;immediate&quot;: []                         },
</span><span class="cx">         &quot;i32.trunc_s/f64&quot;:     { &quot;category&quot;: &quot;conversion&quot;, &quot;value&quot;: 158, &quot;return&quot;: [&quot;i32&quot;],      &quot;parameter&quot;: [&quot;f64&quot;],                  &quot;immediate&quot;: []                         },
</span><span class="cx">         &quot;i32.trunc_u/f32&quot;:     { &quot;category&quot;: &quot;conversion&quot;, &quot;value&quot;: 159, &quot;return&quot;: [&quot;i32&quot;],      &quot;parameter&quot;: [&quot;f32&quot;],                  &quot;immediate&quot;: []                         },
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ChangeLog (207780 => 207781)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ChangeLog        2016-10-24 21:34:09 UTC (rev 207780)
+++ trunk/Source/JavaScriptCore/ChangeLog        2016-10-24 21:44:34 UTC (rev 207781)
</span><span class="lines">@@ -1,3 +1,32 @@
</span><ins>+2016-10-24  Keith Miller  &lt;keith_miller@apple.com&gt;
+
+        Wasm should support floating point operations.
+        https://bugs.webkit.org/show_bug.cgi?id=163770
+
+        Reviewed by Michael Saboff.
+
+        Since we now have a Double =&gt; Float Trunc in B3, we can now support calls in Wasm
+        that take floating point arguments. This patch also enables most of the Wasm
+        floating point operations, as the associated B3 opcode has been linked via wasm.json.
+        If there is no direct mapping to a B3 opcode the Wasm is not yet implemented. This
+        patch also fixes a bug in calls where the arguments would be reversed.
+
+        * testWasm.cpp:
+        (cast):
+        (invoke):
+        (boxf):
+        (boxd):
+        (runWasmTests):
+        * wasm/WasmB3IRGenerator.cpp:
+        (JSC::Wasm::createJSWrapper):
+        * wasm/WasmCallingConvention.h:
+        (JSC::Wasm::CallingConvention::loadArguments):
+        (JSC::Wasm::CallingConvention::setupCall):
+        * wasm/WasmFunctionParser.h:
+        (JSC::Wasm::FunctionParser&lt;Context&gt;::parseExpression):
+        (JSC::Wasm::FunctionParser&lt;Context&gt;::parseUnreachableExpression):
+        * wasm/WasmOps.h:
+
</ins><span class="cx"> 2016-10-24  Mark Lam  &lt;mark.lam@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Dumping of op_negate bytecode is broken.
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoretestWasmcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/testWasm.cpp (207780 => 207781)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/testWasm.cpp        2016-10-24 21:34:09 UTC (rev 207780)
+++ trunk/Source/JavaScriptCore/testWasm.cpp        2016-10-24 21:44:34 UTC (rev 207781)
</span><span class="lines">@@ -25,6 +25,7 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;config.h&quot;
</span><span class="cx"> 
</span><ins>+#include &quot;B3Common.h&quot;
</ins><span class="cx"> #include &quot;B3Compilation.h&quot;
</span><span class="cx"> #include &quot;InitializeThreading.h&quot;
</span><span class="cx"> #include &quot;JSCJSValueInlines.h&quot;
</span><span class="lines">@@ -96,6 +97,8 @@
</span><span class="cx">         CRASH(); \
</span><span class="cx">     } while (false)
</span><span class="cx"> 
</span><ins>+#define CHECK(x) CHECK_EQ(x, true)
+
</ins><span class="cx"> #define FOR_EACH_UNSIGNED_LEB_TEST(macro) \
</span><span class="cx">     /* Simple tests that use all the bits in the array */ \
</span><span class="cx">     macro(({ 0x07 }), 0, true, 0x7lu, 1lu) \
</span><span class="lines">@@ -208,6 +211,24 @@
</span><span class="cx"> using namespace B3;
</span><span class="cx"> 
</span><span class="cx"> template&lt;typename T&gt;
</span><ins>+T cast(EncodedJSValue value)
+{
+    return static_cast&lt;T&gt;(value);
+}
+
+template&lt;&gt;
+double cast(EncodedJSValue value)
+{
+    return bitwise_cast&lt;double&gt;(value);
+}
+
+template&lt;&gt;
+float cast(EncodedJSValue value)
+{
+    return bitwise_cast&lt;float&gt;(static_cast&lt;int&gt;(value));
+}
+
+template&lt;typename T&gt;
</ins><span class="cx"> T invoke(MacroAssemblerCodePtr ptr, std::initializer_list&lt;JSValue&gt; args)
</span><span class="cx"> {
</span><span class="cx">     JSValue firstArgument;
</span><span class="lines">@@ -224,8 +245,7 @@
</span><span class="cx">     ProtoCallFrame protoCallFrame;
</span><span class="cx">     protoCallFrame.init(nullptr, nullptr, firstArgument, argCount, remainingArguments);
</span><span class="cx"> 
</span><del>-    // This won't work for floating point values but we don't have those yet.
-    return static_cast&lt;T&gt;(vmEntryToWasm(ptr.executableAddress(), vm, &amp;protoCallFrame));
</del><ins>+    return cast&lt;T&gt;(vmEntryToWasm(ptr.executableAddress(), vm, &amp;protoCallFrame));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template&lt;typename T&gt;
</span><span class="lines">@@ -239,12 +259,81 @@
</span><span class="cx">     return JSValue::decode(value);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+inline JSValue boxf(float value)
+{
+    return box(bitwise_cast&lt;uint32_t&gt;(value));
+}
+
+inline JSValue boxd(double value)
+{
+    return box(bitwise_cast&lt;uint64_t&gt;(value));
+}
+
</ins><span class="cx"> // For now we inline the test files.
</span><span class="cx"> static void runWasmTests()
</span><span class="cx"> {
</span><ins>+
</ins><span class="cx">     {
</span><span class="cx">         // Generated from:
</span><span class="cx">         //    (module
</span><ins>+        //     (func $f32-sub (export &quot;f32-sub&quot;) (param f32) (param f32) (result f32) (return (f32.sub (get_local 0) (get_local 1))))
+        //     (func (export &quot;indirect-f32-sub&quot;) (param f32) (param f32) (result f32) (return (call $f32-sub (get_local 0) (get_local 1))))
+        //     )
+        Vector&lt;uint8_t&gt; vector = {
+            0x00, 0x61, 0x73, 0x6d, 0x0c, 0x00, 0x00, 0x00, 0x01, 0x87, 0x80, 0x80, 0x80, 0x00, 0x01, 0x40,
+            0x02, 0x03, 0x03, 0x01, 0x03, 0x03, 0x83, 0x80, 0x80, 0x80, 0x00, 0x02, 0x00, 0x00, 0x07, 0x9e,
+            0x80, 0x80, 0x80, 0x00, 0x02, 0x07, 0x66, 0x33, 0x32, 0x2d, 0x73, 0x75, 0x62, 0x00, 0x00, 0x10,
+            0x69, 0x6e, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x2d, 0x66, 0x33, 0x32, 0x2d, 0x73, 0x75, 0x62,
+            0x00, 0x01, 0x0a, 0x9c, 0x80, 0x80, 0x80, 0x00, 0x02, 0x88, 0x80, 0x80, 0x80, 0x00, 0x00, 0x14,
+            0x00, 0x14, 0x01, 0x76, 0x09, 0x0f, 0x89, 0x80, 0x80, 0x80, 0x00, 0x00, 0x14, 0x00, 0x14, 0x01,
+            0x16, 0x00, 0x09, 0x0f
+        };
+
+        Plan plan(*vm, vector);
+        if (plan.result.size() != 2 || !plan.result[0] || !plan.result[1]) {
+            dataLogLn(&quot;Module failed to compile correctly.&quot;);
+            CRASH();
+        }
+
+        // Test this doesn't crash.
+        CHECK(isIdentical(invoke&lt;float&gt;(*plan.result[1]-&gt;jsEntryPoint, { boxf(0.0), boxf(1.5) }), -1.5f));
+        CHECK(isIdentical(invoke&lt;float&gt;(*plan.result[1]-&gt;jsEntryPoint, { boxf(100.1234), boxf(12.5) }), 87.6234f));
+        CHECK(isIdentical(invoke&lt;float&gt;(*plan.result[0]-&gt;jsEntryPoint, { boxf(0.0), boxf(1.5) }), -1.5f));
+        CHECK(isIdentical(invoke&lt;float&gt;(*plan.result[0]-&gt;jsEntryPoint, { boxf(100.1234), boxf(12.5) }), 87.6234f));
+    }
+
+    {
+        // Generated from:
+        //    (module
+        //     (func $f32-add (export &quot;f32-add&quot;) (param f32) (param f32) (result f32) (return (f32.add (get_local 0) (get_local 1))))
+        //     (func (export &quot;indirect-f32-add&quot;) (param f32) (param f32) (result f32) (return (call $f32-add (get_local 0) (get_local 1))))
+        //     )
+        Vector&lt;uint8_t&gt; vector = {
+            0x00, 0x61, 0x73, 0x6d, 0x0c, 0x00, 0x00, 0x00, 0x01, 0x87, 0x80, 0x80, 0x80, 0x00, 0x01, 0x40,
+            0x02, 0x03, 0x03, 0x01, 0x03, 0x03, 0x83, 0x80, 0x80, 0x80, 0x00, 0x02, 0x00, 0x00, 0x07, 0x9e,
+            0x80, 0x80, 0x80, 0x00, 0x02, 0x07, 0x66, 0x33, 0x32, 0x2d, 0x61, 0x64, 0x64, 0x00, 0x00, 0x10,
+            0x69, 0x6e, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x2d, 0x66, 0x33, 0x32, 0x2d, 0x61, 0x64, 0x64,
+            0x00, 0x01, 0x0a, 0x9c, 0x80, 0x80, 0x80, 0x00, 0x02, 0x88, 0x80, 0x80, 0x80, 0x00, 0x00, 0x14,
+            0x00, 0x14, 0x01, 0x75, 0x09, 0x0f, 0x89, 0x80, 0x80, 0x80, 0x00, 0x00, 0x14, 0x00, 0x14, 0x01,
+            0x16, 0x00, 0x09, 0x0f
+        };
+
+        Plan plan(*vm, vector);
+        if (plan.result.size() != 2 || !plan.result[0] || !plan.result[1]) {
+            dataLogLn(&quot;Module failed to compile correctly.&quot;);
+            CRASH();
+        }
+
+        // Test this doesn't crash.
+        CHECK(isIdentical(invoke&lt;float&gt;(*plan.result[1]-&gt;jsEntryPoint, { boxf(0.0), boxf(1.5) }), 1.5f));
+        CHECK(isIdentical(invoke&lt;float&gt;(*plan.result[1]-&gt;jsEntryPoint, { boxf(100.1234), boxf(12.5) }), 112.6234f));
+        CHECK(isIdentical(invoke&lt;float&gt;(*plan.result[0]-&gt;jsEntryPoint, { boxf(0.0), boxf(1.5) }), 1.5f));
+        CHECK(isIdentical(invoke&lt;float&gt;(*plan.result[0]-&gt;jsEntryPoint, { boxf(100.1234), boxf(12.5) }), 112.6234f));
+    }
+
+    {
+        // Generated from:
+        //    (module
</ins><span class="cx">         //     (memory 1)
</span><span class="cx">         //     (func $sum12 (param i32) (param i32) (param i32) (param i32) (param i32) (param i32) (param i32) (param i32) (param i32) (param i32) (param i32) (param i32) (result i32) (return (i32.add (get_local 0) (i32.add (get_local 1) (i32.add (get_local 2) (i32.add (get_local 3) (i32.add (get_local 4) (i32.add (get_local 5) (i32.add (get_local 6) (i32.add (get_local 7) (i32.add (get_local 8) (i32.add (get_local 9) (i32.add (get_local 10) (get_local 11))))))))))))))
</span><span class="cx">         //     (func (export &quot;mult12&quot;) (param i32) (result i32) (return (call $sum12 (get_local 0) (get_local 0) (get_local 0) (get_local 0) (get_local 0) (get_local 0) (get_local 0) (get_local 0) (get_local 0) (get_local 0) (get_local 0) (get_local 0))))
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorewasmWasmB3IRGeneratorcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/wasm/WasmB3IRGenerator.cpp (207780 => 207781)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/wasm/WasmB3IRGenerator.cpp        2016-10-24 21:34:09 UTC (rev 207780)
+++ trunk/Source/JavaScriptCore/wasm/WasmB3IRGenerator.cpp        2016-10-24 21:44:34 UTC (rev 207781)
</span><span class="lines">@@ -697,10 +697,19 @@
</span><span class="cx">     });
</span><span class="cx"> 
</span><span class="cx">     // Return the result, if needed.
</span><del>-    if (signature-&gt;returnType != Void)
</del><ins>+    switch (signature-&gt;returnType) {
+    case Void:
+        block-&gt;appendNewControlValue(proc, B3::Return, Origin());
+        break;
+    case F32:
+    case F64:
+        result = block-&gt;appendNew&lt;Value&gt;(proc, BitwiseCast, Origin(), result);
+        FALLTHROUGH;
+    case I32:
+    case I64:
</ins><span class="cx">         block-&gt;appendNewControlValue(proc, B3::Return, Origin(), result);
</span><del>-    else
-        block-&gt;appendNewControlValue(proc, B3::Return, Origin());
</del><ins>+        break;
+    }
</ins><span class="cx"> 
</span><span class="cx">     return std::make_unique&lt;Compilation&gt;(vm, proc);
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorewasmWasmCallingConventionh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/wasm/WasmCallingConvention.h (207780 => 207781)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/wasm/WasmCallingConvention.h        2016-10-24 21:34:09 UTC (rev 207780)
+++ trunk/Source/JavaScriptCore/wasm/WasmCallingConvention.h        2016-10-24 21:44:34 UTC (rev 207781)
</span><span class="lines">@@ -98,10 +98,8 @@
</span><span class="cx">             B3::ValueRep rep = marshallArgument(type, gpArgumentCount, fpArgumentCount, stackOffset);
</span><span class="cx">             if (rep.isReg()) {
</span><span class="cx">                 argument = block-&gt;appendNew&lt;B3::ArgumentRegValue&gt;(proc, origin, rep.reg());
</span><del>-                if (type == B3::Int32)
</del><ins>+                if (type == B3::Int32 || type == B3::Float)
</ins><span class="cx">                     argument = block-&gt;appendNew&lt;B3::Value&gt;(proc, B3::Trunc, origin, argument);
</span><del>-                // FIXME: How do I get a float from a FPR? We don't support floating points yet so it's not a big deal... yet.
-                // see: https://bugs.webkit.org/show_bug.cgi?id=163770
</del><span class="cx">             } else {
</span><span class="cx">                 ASSERT(rep.isStackArgument());
</span><span class="cx">                 B3::Value* address = block-&gt;appendNew&lt;B3::Value&gt;(proc, B3::Add, origin, framePointer,
</span><span class="lines">@@ -134,10 +132,18 @@
</span><span class="cx">         patchpoint-&gt;appendVector(constrainedArguments);
</span><span class="cx">         patchpointFunctor(patchpoint);
</span><span class="cx"> 
</span><del>-        if (returnType == B3::Void)
</del><ins>+        switch (returnType) {
+        case B3::Void:
</ins><span class="cx">             return nullptr;
</span><del>-
-        patchpoint-&gt;resultConstraint = B3::ValueRep::reg(GPRInfo::returnValueGPR);
</del><ins>+        case B3::Float:
+        case B3::Double:
+            patchpoint-&gt;resultConstraint = B3::ValueRep::reg(FPRInfo::returnValueFPR);
+            break;
+        case B3::Int32:
+        case B3::Int64:
+            patchpoint-&gt;resultConstraint = B3::ValueRep::reg(GPRInfo::returnValueGPR);
+            break;
+        }
</ins><span class="cx">         return patchpoint;
</span><span class="cx">     }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorewasmWasmFunctionParserh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/wasm/WasmFunctionParser.h (207780 => 207781)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/wasm/WasmFunctionParser.h        2016-10-24 21:34:09 UTC (rev 207780)
+++ trunk/Source/JavaScriptCore/wasm/WasmFunctionParser.h        2016-10-24 21:44:34 UTC (rev 207781)
</span><span class="lines">@@ -190,6 +190,7 @@
</span><span class="cx">         return m_context.store(static_cast&lt;StoreOpType&gt;(op), pointer, value, offset);
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    case OpType::F32Const:
</ins><span class="cx">     case OpType::I32Const: {
</span><span class="cx">         uint32_t constant;
</span><span class="cx">         if (!parseVarUInt32(constant))
</span><span class="lines">@@ -198,6 +199,7 @@
</span><span class="cx">         return true;
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    case OpType::F64Const:
</ins><span class="cx">     case OpType::I64Const: {
</span><span class="cx">         uint64_t constant;
</span><span class="cx">         if (!parseVarUInt64(constant))
</span><span class="lines">@@ -236,9 +238,15 @@
</span><span class="cx"> 
</span><span class="cx">         const FunctionInformation&amp; info = m_functions[functionIndex];
</span><span class="cx"> 
</span><ins>+        if (info.signature-&gt;arguments.size() &gt; m_expressionStack.size())
+            return false;
+
+        size_t firstArgumentIndex = m_expressionStack.size() - info.signature-&gt;arguments.size();
</ins><span class="cx">         Vector&lt;ExpressionType&gt; args;
</span><del>-        for (unsigned i = 0; i &lt; info.signature-&gt;arguments.size(); ++i)
-            args.append(m_expressionStack.takeLast());
</del><ins>+        args.reserveInitialCapacity(info.signature-&gt;arguments.size());
+        for (unsigned i = firstArgumentIndex; i &lt; m_expressionStack.size(); ++i)
+            args.append(m_expressionStack[i]);
+        m_expressionStack.shrink(firstArgumentIndex);
</ins><span class="cx"> 
</span><span class="cx">         ExpressionType result = Context::emptyExpression;
</span><span class="cx">         if (!m_context.addCall(functionIndex, info, args, result))
</span><span class="lines">@@ -318,8 +326,6 @@
</span><span class="cx">     case OpType::BrTable:
</span><span class="cx">     case OpType::Nop:
</span><span class="cx">     case OpType::Drop:
</span><del>-    case OpType::F32Const:
-    case OpType::F64Const:
</del><span class="cx">     case OpType::TeeLocal:
</span><span class="cx">     case OpType::GetGlobal:
</span><span class="cx">     case OpType::SetGlobal:
</span><span class="lines">@@ -374,7 +380,10 @@
</span><span class="cx"> 
</span><span class="cx">     // one immediate cases
</span><span class="cx">     case OpType::Return:
</span><ins>+    case OpType::F32Const:
</ins><span class="cx">     case OpType::I32Const:
</span><ins>+    case OpType::F64Const:
+    case OpType::I64Const:
</ins><span class="cx">     case OpType::SetLocal:
</span><span class="cx">     case OpType::GetLocal: {
</span><span class="cx">         uint32_t unused;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorewasmWasmOpsh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/wasm/WasmOps.h (207780 => 207781)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/wasm/WasmOps.h        2016-10-24 21:34:09 UTC (rev 207780)
+++ trunk/Source/JavaScriptCore/wasm/WasmOps.h        2016-10-24 21:44:34 UTC (rev 207781)
</span><span class="lines">@@ -68,19 +68,19 @@
</span><span class="cx">     macro(I64Clz, 0x72, Clz) \
</span><span class="cx">     macro(I64Ctz, 0x73, Oops) \
</span><span class="cx">     macro(I64Popcnt, 0x74, Oops) \
</span><del>-    macro(F32Abs, 0x7b, Oops) \
</del><ins>+    macro(F32Abs, 0x7b, Abs) \
</ins><span class="cx">     macro(F32Neg, 0x7c, Oops) \
</span><span class="cx">     macro(F32Copysign, 0x7d, Oops) \
</span><del>-    macro(F32Ceil, 0x7e, Oops) \
-    macro(F32Floor, 0x7f, Oops) \
</del><ins>+    macro(F32Ceil, 0x7e, Ceil) \
+    macro(F32Floor, 0x7f, Floor) \
</ins><span class="cx">     macro(F32Trunc, 0x80, Oops) \
</span><span class="cx">     macro(F32Nearest, 0x81, Oops) \
</span><span class="cx">     macro(F32Sqrt, 0x82, Oops) \
</span><del>-    macro(F64Abs, 0x8f, Oops) \
</del><ins>+    macro(F64Abs, 0x8f, Abs) \
</ins><span class="cx">     macro(F64Neg, 0x90, Oops) \
</span><span class="cx">     macro(F64Copysign, 0x91, Oops) \
</span><del>-    macro(F64Ceil, 0x92, Oops) \
-    macro(F64Floor, 0x93, Oops) \
</del><ins>+    macro(F64Ceil, 0x92, Ceil) \
+    macro(F64Floor, 0x93, Floor) \
</ins><span class="cx">     macro(F64Trunc, 0x94, Oops) \
</span><span class="cx">     macro(F64Nearest, 0x95, Oops) \
</span><span class="cx">     macro(F64Sqrt, 0x96, Oops)
</span><span class="lines">@@ -136,30 +136,30 @@
</span><span class="cx">     macro(I64GeS, 0x6f, GreaterEqual) \
</span><span class="cx">     macro(I64GtU, 0x70, Above) \
</span><span class="cx">     macro(I64GeU, 0x71, AboveEqual) \
</span><del>-    macro(F32Add, 0x75, Oops) \
-    macro(F32Sub, 0x76, Oops) \
-    macro(F32Mul, 0x77, Oops) \
-    macro(F32Div, 0x78, Oops) \
</del><ins>+    macro(F32Add, 0x75, Add) \
+    macro(F32Sub, 0x76, Sub) \
+    macro(F32Mul, 0x77, Mul) \
+    macro(F32Div, 0x78, Div) \
</ins><span class="cx">     macro(F32Min, 0x79, Oops) \
</span><span class="cx">     macro(F32Max, 0x7a, Oops) \
</span><del>-    macro(F32Eq, 0x83, Oops) \
-    macro(F32Ne, 0x84, Oops) \
-    macro(F32Lt, 0x85, Oops) \
-    macro(F32Le, 0x86, Oops) \
-    macro(F32Gt, 0x87, Oops) \
-    macro(F32Ge, 0x88, Oops) \
-    macro(F64Add, 0x89, Oops) \
-    macro(F64Sub, 0x8a, Oops) \
-    macro(F64Mul, 0x8b, Oops) \
-    macro(F64Div, 0x8c, Oops) \
</del><ins>+    macro(F32Eq, 0x83, Equal) \
+    macro(F32Ne, 0x84, NotEqual) \
+    macro(F32Lt, 0x85, LessThan) \
+    macro(F32Le, 0x86, LessEqual) \
+    macro(F32Gt, 0x87, GreaterThan) \
+    macro(F32Ge, 0x88, GreaterEqual) \
+    macro(F64Add, 0x89, Add) \
+    macro(F64Sub, 0x8a, Sub) \
+    macro(F64Mul, 0x8b, Mul) \
+    macro(F64Div, 0x8c, Div) \
</ins><span class="cx">     macro(F64Min, 0x8d, Oops) \
</span><span class="cx">     macro(F64Max, 0x8e, Oops) \
</span><del>-    macro(F64Eq, 0x97, Oops) \
-    macro(F64Ne, 0x98, Oops) \
-    macro(F64Lt, 0x99, Oops) \
-    macro(F64Le, 0x9a, Oops) \
-    macro(F64Gt, 0x9b, Oops) \
-    macro(F64Ge, 0x9c, Oops)
</del><ins>+    macro(F64Eq, 0x97, Equal) \
+    macro(F64Ne, 0x98, NotEqual) \
+    macro(F64Lt, 0x99, LessThan) \
+    macro(F64Le, 0x9a, LessEqual) \
+    macro(F64Gt, 0x9b, GreaterThan) \
+    macro(F64Ge, 0x9c, GreaterEqual)
</ins><span class="cx"> 
</span><span class="cx"> #define FOR_EACH_WASM_MEMORY_LOAD_OP(macro) \
</span><span class="cx">     macro(I32Load8S, 0x20, Oops) \
</span></span></pre>
</div>
</div>

</body>
</html>