<!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>[208781] 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/208781">208781</a></dd>
<dt>Author</dt> <dd>keith_miller@apple.com</dd>
<dt>Date</dt> <dd>2016-11-15 20:47:20 -0800 (Tue, 15 Nov 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>B3 should support UDiv/UMod
https://bugs.webkit.org/show_bug.cgi?id=164811

Reviewed by Filip Pizlo.

JSTests:

Link new instructions to wasm.

* wasm/wasm.json:

Source/JavaScriptCore:

This patch adds support for UDiv and UMod in B3. Many of the magic number
cases have been ommited for now since they are unlikely to happen in wasm
code. Most wasm code we will see is generated via llvm, which has more
robust versions of what we would do anyway. Additionally, this patch
links the new opcodes up to the wasm parser.

* assembler/MacroAssemblerARM64.h:
(JSC::MacroAssemblerARM64::uDiv32):
(JSC::MacroAssemblerARM64::uDiv64):
* assembler/MacroAssemblerX86Common.h:
(JSC::MacroAssemblerX86Common::x86UDiv32):
* assembler/MacroAssemblerX86_64.h:
(JSC::MacroAssemblerX86_64::x86UDiv64):
* assembler/X86Assembler.h:
(JSC::X86Assembler::divq_r):
* b3/B3Common.h:
(JSC::B3::chillUDiv):
(JSC::B3::chillUMod):
* b3/B3Const32Value.cpp:
(JSC::B3::Const32Value::uDivConstant):
(JSC::B3::Const32Value::uModConstant):
* b3/B3Const32Value.h:
* b3/B3Const64Value.cpp:
(JSC::B3::Const64Value::uDivConstant):
(JSC::B3::Const64Value::uModConstant):
* b3/B3Const64Value.h:
* b3/B3LowerMacros.cpp:
* b3/B3LowerToAir.cpp:
(JSC::B3::Air::LowerToAir::lower):
(JSC::B3::Air::LowerToAir::lowerX86UDiv):
* b3/B3Opcode.cpp:
(WTF::printInternal):
* b3/B3Opcode.h:
* b3/B3ReduceStrength.cpp:
* b3/B3Validate.cpp:
* b3/B3Value.cpp:
(JSC::B3::Value::uDivConstant):
(JSC::B3::Value::uModConstant):
(JSC::B3::Value::effects):
(JSC::B3::Value::key):
(JSC::B3::Value::typeFor):
* b3/B3Value.h:
* b3/B3ValueKey.cpp:
(JSC::B3::ValueKey::materialize):
* b3/air/AirInstInlines.h:
(JSC::B3::Air::isX86UDiv32Valid):
(JSC::B3::Air::isX86UDiv64Valid):
* b3/air/AirOpcode.opcodes:
* b3/testb3.cpp:
(JSC::B3::testUDivArgsInt32):
(JSC::B3::testUDivArgsInt64):
(JSC::B3::testUModArgsInt32):
(JSC::B3::testUModArgsInt64):
(JSC::B3::run):
* wasm/wasm.json:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkJSTestsChangeLog">trunk/JSTests/ChangeLog</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="#trunkSourceJavaScriptCoreassemblerMacroAssemblerARM64h">trunk/Source/JavaScriptCore/assembler/MacroAssemblerARM64.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreassemblerMacroAssemblerX86Commonh">trunk/Source/JavaScriptCore/assembler/MacroAssemblerX86Common.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreassemblerMacroAssemblerX86_64h">trunk/Source/JavaScriptCore/assembler/MacroAssemblerX86_64.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreassemblerX86Assemblerh">trunk/Source/JavaScriptCore/assembler/X86Assembler.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreb3B3Commonh">trunk/Source/JavaScriptCore/b3/B3Common.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreb3B3Const32Valuecpp">trunk/Source/JavaScriptCore/b3/B3Const32Value.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreb3B3Const32Valueh">trunk/Source/JavaScriptCore/b3/B3Const32Value.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreb3B3Const64Valuecpp">trunk/Source/JavaScriptCore/b3/B3Const64Value.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreb3B3Const64Valueh">trunk/Source/JavaScriptCore/b3/B3Const64Value.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreb3B3LowerMacroscpp">trunk/Source/JavaScriptCore/b3/B3LowerMacros.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreb3B3LowerToAircpp">trunk/Source/JavaScriptCore/b3/B3LowerToAir.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreb3B3Opcodecpp">trunk/Source/JavaScriptCore/b3/B3Opcode.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreb3B3Opcodeh">trunk/Source/JavaScriptCore/b3/B3Opcode.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreb3B3ReduceStrengthcpp">trunk/Source/JavaScriptCore/b3/B3ReduceStrength.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreb3B3Validatecpp">trunk/Source/JavaScriptCore/b3/B3Validate.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreb3B3Valuecpp">trunk/Source/JavaScriptCore/b3/B3Value.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreb3B3Valueh">trunk/Source/JavaScriptCore/b3/B3Value.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreb3B3ValueKeycpp">trunk/Source/JavaScriptCore/b3/B3ValueKey.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCoreb3airAirInstInlinesh">trunk/Source/JavaScriptCore/b3/air/AirInstInlines.h</a></li>
<li><a href="#trunkSourceJavaScriptCoreb3airAirOpcodeopcodes">trunk/Source/JavaScriptCore/b3/air/AirOpcode.opcodes</a></li>
<li><a href="#trunkSourceJavaScriptCoreb3testb3cpp">trunk/Source/JavaScriptCore/b3/testb3.cpp</a></li>
<li><a href="#trunkSourceJavaScriptCorewasmwasmjson">trunk/Source/JavaScriptCore/wasm/wasm.json</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkJSTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/JSTests/ChangeLog (208780 => 208781)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/JSTests/ChangeLog        2016-11-16 04:07:30 UTC (rev 208780)
+++ trunk/JSTests/ChangeLog        2016-11-16 04:47:20 UTC (rev 208781)
</span><span class="lines">@@ -1,3 +1,14 @@
</span><ins>+2016-11-15  Keith Miller  &lt;keith_miller@apple.com&gt;
+
+        B3 should support UDiv/UMod
+        https://bugs.webkit.org/show_bug.cgi?id=164811
+
+        Reviewed by Filip Pizlo.
+
+        Link new instructions to wasm.
+
+        * wasm/wasm.json:
+
</ins><span class="cx"> 2016-11-15  Saam Barati  &lt;sbarati@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Debug JSC test timeout: stress/has-own-property-name-cache-symbols-and-strings.js.ftl-no-cjit-small-pool
</span></span></pre></div>
<a id="trunkJSTestswasmwasmjson"></a>
<div class="modfile"><h4>Modified: trunk/JSTests/wasm/wasm.json (208780 => 208781)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/JSTests/wasm/wasm.json        2016-11-16 04:07:30 UTC (rev 208780)
+++ trunk/JSTests/wasm/wasm.json        2016-11-16 04:47:20 UTC (rev 208781)
</span><span class="lines">@@ -96,9 +96,9 @@
</span><span class="cx">         &quot;i32.sub&quot;:             { &quot;category&quot;: &quot;arithmetic&quot;, &quot;value&quot;:  65, &quot;return&quot;: [&quot;i32&quot;],      &quot;parameter&quot;: [&quot;i32&quot;, &quot;i32&quot;],           &quot;immediate&quot;: [], &quot;b3op&quot;: &quot;Sub&quot;          },
</span><span class="cx">         &quot;i32.mul&quot;:             { &quot;category&quot;: &quot;arithmetic&quot;, &quot;value&quot;:  66, &quot;return&quot;: [&quot;i32&quot;],      &quot;parameter&quot;: [&quot;i32&quot;, &quot;i32&quot;],           &quot;immediate&quot;: [], &quot;b3op&quot;: &quot;Mul&quot;          },
</span><span class="cx">         &quot;i32.div_s&quot;:           { &quot;category&quot;: &quot;arithmetic&quot;, &quot;value&quot;:  67, &quot;return&quot;: [&quot;i32&quot;],      &quot;parameter&quot;: [&quot;i32&quot;, &quot;i32&quot;],           &quot;immediate&quot;: [], &quot;b3op&quot;: &quot;Div&quot;          },
</span><del>-        &quot;i32.div_u&quot;:           { &quot;category&quot;: &quot;arithmetic&quot;, &quot;value&quot;:  68, &quot;return&quot;: [&quot;i32&quot;],      &quot;parameter&quot;: [&quot;i32&quot;, &quot;i32&quot;],           &quot;immediate&quot;: []                         },
</del><ins>+        &quot;i32.div_u&quot;:           { &quot;category&quot;: &quot;arithmetic&quot;, &quot;value&quot;:  68, &quot;return&quot;: [&quot;i32&quot;],      &quot;parameter&quot;: [&quot;i32&quot;, &quot;i32&quot;],           &quot;immediate&quot;: [], &quot;b3op&quot;: &quot;UDiv&quot;         },
</ins><span class="cx">         &quot;i32.rem_s&quot;:           { &quot;category&quot;: &quot;arithmetic&quot;, &quot;value&quot;:  69, &quot;return&quot;: [&quot;i32&quot;],      &quot;parameter&quot;: [&quot;i32&quot;, &quot;i32&quot;],           &quot;immediate&quot;: [], &quot;b3op&quot;: &quot;Mod&quot;          },
</span><del>-        &quot;i32.rem_u&quot;:           { &quot;category&quot;: &quot;arithmetic&quot;, &quot;value&quot;:  70, &quot;return&quot;: [&quot;i32&quot;],      &quot;parameter&quot;: [&quot;i32&quot;, &quot;i32&quot;],           &quot;immediate&quot;: []                         },
</del><ins>+        &quot;i32.rem_u&quot;:           { &quot;category&quot;: &quot;arithmetic&quot;, &quot;value&quot;:  70, &quot;return&quot;: [&quot;i32&quot;],      &quot;parameter&quot;: [&quot;i32&quot;, &quot;i32&quot;],           &quot;immediate&quot;: [], &quot;b3op&quot;: &quot;UMod&quot;         },
</ins><span class="cx">         &quot;i32.and&quot;:             { &quot;category&quot;: &quot;arithmetic&quot;, &quot;value&quot;:  71, &quot;return&quot;: [&quot;i32&quot;],      &quot;parameter&quot;: [&quot;i32&quot;, &quot;i32&quot;],           &quot;immediate&quot;: [], &quot;b3op&quot;: &quot;BitAnd&quot;       },
</span><span class="cx">         &quot;i32.or&quot;:              { &quot;category&quot;: &quot;arithmetic&quot;, &quot;value&quot;:  72, &quot;return&quot;: [&quot;i32&quot;],      &quot;parameter&quot;: [&quot;i32&quot;, &quot;i32&quot;],           &quot;immediate&quot;: [], &quot;b3op&quot;: &quot;BitOr&quot;        },
</span><span class="cx">         &quot;i32.xor&quot;:             { &quot;category&quot;: &quot;arithmetic&quot;, &quot;value&quot;:  73, &quot;return&quot;: [&quot;i32&quot;],      &quot;parameter&quot;: [&quot;i32&quot;, &quot;i32&quot;],           &quot;immediate&quot;: [], &quot;b3op&quot;: &quot;BitXor&quot;       },
</span><span class="lines">@@ -125,9 +125,9 @@
</span><span class="cx">         &quot;i64.sub&quot;:             { &quot;category&quot;: &quot;arithmetic&quot;, &quot;value&quot;:  92, &quot;return&quot;: [&quot;i64&quot;],      &quot;parameter&quot;: [&quot;i64&quot;, &quot;i64&quot;],           &quot;immediate&quot;: [], &quot;b3op&quot;: &quot;Sub&quot;          },
</span><span class="cx">         &quot;i64.mul&quot;:             { &quot;category&quot;: &quot;arithmetic&quot;, &quot;value&quot;:  93, &quot;return&quot;: [&quot;i64&quot;],      &quot;parameter&quot;: [&quot;i64&quot;, &quot;i64&quot;],           &quot;immediate&quot;: [], &quot;b3op&quot;: &quot;Mul&quot;          },
</span><span class="cx">         &quot;i64.div_s&quot;:           { &quot;category&quot;: &quot;arithmetic&quot;, &quot;value&quot;:  94, &quot;return&quot;: [&quot;i64&quot;],      &quot;parameter&quot;: [&quot;i64&quot;, &quot;i64&quot;],           &quot;immediate&quot;: [], &quot;b3op&quot;: &quot;Div&quot;          },
</span><del>-        &quot;i64.div_u&quot;:           { &quot;category&quot;: &quot;arithmetic&quot;, &quot;value&quot;:  95, &quot;return&quot;: [&quot;i64&quot;],      &quot;parameter&quot;: [&quot;i64&quot;, &quot;i64&quot;],           &quot;immediate&quot;: []                         },
</del><ins>+        &quot;i64.div_u&quot;:           { &quot;category&quot;: &quot;arithmetic&quot;, &quot;value&quot;:  95, &quot;return&quot;: [&quot;i64&quot;],      &quot;parameter&quot;: [&quot;i64&quot;, &quot;i64&quot;],           &quot;immediate&quot;: [], &quot;b3op&quot;: &quot;UDiv&quot;         },
</ins><span class="cx">         &quot;i64.rem_s&quot;:           { &quot;category&quot;: &quot;arithmetic&quot;, &quot;value&quot;:  96, &quot;return&quot;: [&quot;i64&quot;],      &quot;parameter&quot;: [&quot;i64&quot;, &quot;i64&quot;],           &quot;immediate&quot;: [], &quot;b3op&quot;: &quot;Mod&quot;          },
</span><del>-        &quot;i64.rem_u&quot;:           { &quot;category&quot;: &quot;arithmetic&quot;, &quot;value&quot;:  97, &quot;return&quot;: [&quot;i64&quot;],      &quot;parameter&quot;: [&quot;i64&quot;, &quot;i64&quot;],           &quot;immediate&quot;: []                         },
</del><ins>+        &quot;i64.rem_u&quot;:           { &quot;category&quot;: &quot;arithmetic&quot;, &quot;value&quot;:  97, &quot;return&quot;: [&quot;i64&quot;],      &quot;parameter&quot;: [&quot;i64&quot;, &quot;i64&quot;],           &quot;immediate&quot;: [], &quot;b3op&quot;: &quot;UDiv&quot;         },
</ins><span class="cx">         &quot;i64.and&quot;:             { &quot;category&quot;: &quot;arithmetic&quot;, &quot;value&quot;:  98, &quot;return&quot;: [&quot;i64&quot;],      &quot;parameter&quot;: [&quot;i64&quot;, &quot;i64&quot;],           &quot;immediate&quot;: [], &quot;b3op&quot;: &quot;BitAnd&quot;       },
</span><span class="cx">         &quot;i64.or&quot;:              { &quot;category&quot;: &quot;arithmetic&quot;, &quot;value&quot;:  99, &quot;return&quot;: [&quot;i64&quot;],      &quot;parameter&quot;: [&quot;i64&quot;, &quot;i64&quot;],           &quot;immediate&quot;: [], &quot;b3op&quot;: &quot;BitOr&quot;        },
</span><span class="cx">         &quot;i64.xor&quot;:             { &quot;category&quot;: &quot;arithmetic&quot;, &quot;value&quot;: 100, &quot;return&quot;: [&quot;i64&quot;],      &quot;parameter&quot;: [&quot;i64&quot;, &quot;i64&quot;],           &quot;immediate&quot;: [], &quot;b3op&quot;: &quot;BitXor&quot;       },
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ChangeLog (208780 => 208781)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ChangeLog        2016-11-16 04:07:30 UTC (rev 208780)
+++ trunk/Source/JavaScriptCore/ChangeLog        2016-11-16 04:47:20 UTC (rev 208781)
</span><span class="lines">@@ -1,3 +1,66 @@
</span><ins>+2016-11-15  Keith Miller  &lt;keith_miller@apple.com&gt;
+
+        B3 should support UDiv/UMod
+        https://bugs.webkit.org/show_bug.cgi?id=164811
+
+        Reviewed by Filip Pizlo.
+
+        This patch adds support for UDiv and UMod in B3. Many of the magic number
+        cases have been ommited for now since they are unlikely to happen in wasm
+        code. Most wasm code we will see is generated via llvm, which has more
+        robust versions of what we would do anyway. Additionally, this patch
+        links the new opcodes up to the wasm parser.
+
+        * assembler/MacroAssemblerARM64.h:
+        (JSC::MacroAssemblerARM64::uDiv32):
+        (JSC::MacroAssemblerARM64::uDiv64):
+        * assembler/MacroAssemblerX86Common.h:
+        (JSC::MacroAssemblerX86Common::x86UDiv32):
+        * assembler/MacroAssemblerX86_64.h:
+        (JSC::MacroAssemblerX86_64::x86UDiv64):
+        * assembler/X86Assembler.h:
+        (JSC::X86Assembler::divq_r):
+        * b3/B3Common.h:
+        (JSC::B3::chillUDiv):
+        (JSC::B3::chillUMod):
+        * b3/B3Const32Value.cpp:
+        (JSC::B3::Const32Value::uDivConstant):
+        (JSC::B3::Const32Value::uModConstant):
+        * b3/B3Const32Value.h:
+        * b3/B3Const64Value.cpp:
+        (JSC::B3::Const64Value::uDivConstant):
+        (JSC::B3::Const64Value::uModConstant):
+        * b3/B3Const64Value.h:
+        * b3/B3LowerMacros.cpp:
+        * b3/B3LowerToAir.cpp:
+        (JSC::B3::Air::LowerToAir::lower):
+        (JSC::B3::Air::LowerToAir::lowerX86UDiv):
+        * b3/B3Opcode.cpp:
+        (WTF::printInternal):
+        * b3/B3Opcode.h:
+        * b3/B3ReduceStrength.cpp:
+        * b3/B3Validate.cpp:
+        * b3/B3Value.cpp:
+        (JSC::B3::Value::uDivConstant):
+        (JSC::B3::Value::uModConstant):
+        (JSC::B3::Value::effects):
+        (JSC::B3::Value::key):
+        (JSC::B3::Value::typeFor):
+        * b3/B3Value.h:
+        * b3/B3ValueKey.cpp:
+        (JSC::B3::ValueKey::materialize):
+        * b3/air/AirInstInlines.h:
+        (JSC::B3::Air::isX86UDiv32Valid):
+        (JSC::B3::Air::isX86UDiv64Valid):
+        * b3/air/AirOpcode.opcodes:
+        * b3/testb3.cpp:
+        (JSC::B3::testUDivArgsInt32):
+        (JSC::B3::testUDivArgsInt64):
+        (JSC::B3::testUModArgsInt32):
+        (JSC::B3::testUModArgsInt64):
+        (JSC::B3::run):
+        * wasm/wasm.json:
+
</ins><span class="cx"> 2016-11-15  Joseph Pecoraro  &lt;pecoraro@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Web Inspector: Preview other CSS @media in browser window (print)
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreassemblerMacroAssemblerARM64h"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/assembler/MacroAssemblerARM64.h (208780 => 208781)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/assembler/MacroAssemblerARM64.h        2016-11-16 04:07:30 UTC (rev 208780)
+++ trunk/Source/JavaScriptCore/assembler/MacroAssemblerARM64.h        2016-11-16 04:47:20 UTC (rev 208781)
</span><span class="lines">@@ -533,6 +533,16 @@
</span><span class="cx">         m_assembler.sdiv&lt;64&gt;(dest, dividend, divisor);
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    void uDiv32(RegisterID dividend, RegisterID divisor, RegisterID dest)
+    {
+        m_assembler.udiv&lt;32&gt;(dest, dividend, divisor);
+    }
+
+    void uDiv64(RegisterID dividend, RegisterID divisor, RegisterID dest)
+    {
+        m_assembler.udiv&lt;64&gt;(dest, dividend, divisor);
+    }
+
</ins><span class="cx">     void neg32(RegisterID dest)
</span><span class="cx">     {
</span><span class="cx">         m_assembler.neg&lt;32&gt;(dest, dest);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreassemblerMacroAssemblerX86Commonh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/assembler/MacroAssemblerX86Common.h (208780 => 208781)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/assembler/MacroAssemblerX86Common.h        2016-11-16 04:07:30 UTC (rev 208780)
+++ trunk/Source/JavaScriptCore/assembler/MacroAssemblerX86Common.h        2016-11-16 04:47:20 UTC (rev 208781)
</span><span class="lines">@@ -414,6 +414,18 @@
</span><span class="cx">         x86Div32(denominator);
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    void x86UDiv32(RegisterID denominator)
+    {
+        m_assembler.divl_r(denominator);
+    }
+
+    void x86UDiv32(RegisterID eax, RegisterID edx, RegisterID denominator)
+    {
+        ASSERT_UNUSED(eax, eax == X86Registers::eax);
+        ASSERT_UNUSED(edx, edx == X86Registers::edx);
+        x86UDiv32(denominator);
+    }
+
</ins><span class="cx">     void neg32(RegisterID srcDest)
</span><span class="cx">     {
</span><span class="cx">         m_assembler.negl_r(srcDest);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreassemblerMacroAssemblerX86_64h"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/assembler/MacroAssemblerX86_64.h (208780 => 208781)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/assembler/MacroAssemblerX86_64.h        2016-11-16 04:07:30 UTC (rev 208780)
+++ trunk/Source/JavaScriptCore/assembler/MacroAssemblerX86_64.h        2016-11-16 04:47:20 UTC (rev 208781)
</span><span class="lines">@@ -487,6 +487,18 @@
</span><span class="cx">         x86Div64(denominator);
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    void x86UDiv64(RegisterID denominator)
+    {
+        m_assembler.divq_r(denominator);
+    }
+
+    void x86UDiv64(RegisterID rax, RegisterID rdx, RegisterID denominator)
+    {
+        ASSERT_UNUSED(rax, rax == X86Registers::eax);
+        ASSERT_UNUSED(rdx, rdx == X86Registers::edx);
+        x86UDiv64(denominator);
+    }
+
</ins><span class="cx">     void neg64(RegisterID dest)
</span><span class="cx">     {
</span><span class="cx">         m_assembler.negq_r(dest);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreassemblerX86Assemblerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/assembler/X86Assembler.h (208780 => 208781)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/assembler/X86Assembler.h        2016-11-16 04:07:30 UTC (rev 208780)
+++ trunk/Source/JavaScriptCore/assembler/X86Assembler.h        2016-11-16 04:47:20 UTC (rev 208781)
</span><span class="lines">@@ -1154,6 +1154,11 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx"> #if CPU(X86_64)
</span><ins>+    void divq_r(RegisterID dst)
+    {
+        m_formatter.oneByteOp64(OP_GROUP3_Ev, GROUP3_OP_DIV, dst);
+    }
+
</ins><span class="cx">     void idivq_r(RegisterID dst)
</span><span class="cx">     {
</span><span class="cx">         m_formatter.oneByteOp64(OP_GROUP3_Ev, GROUP3_OP_IDIV, dst);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreb3B3Commonh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/b3/B3Common.h (208780 => 208781)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/b3/B3Common.h        2016-11-16 04:07:30 UTC (rev 208780)
+++ trunk/Source/JavaScriptCore/b3/B3Common.h        2016-11-16 04:47:20 UTC (rev 208781)
</span><span class="lines">@@ -28,6 +28,7 @@
</span><span class="cx"> #if ENABLE(B3_JIT)
</span><span class="cx"> 
</span><span class="cx"> #include &quot;JSExportMacros.h&quot;
</span><ins>+#include &lt;wtf/Optional.h&gt;
</ins><span class="cx"> 
</span><span class="cx"> namespace JSC { namespace B3 {
</span><span class="cx"> 
</span><span class="lines">@@ -125,6 +126,28 @@
</span><span class="cx">     return numerator % denominator;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+template&lt;typename IntType&gt;
+static IntType chillUDiv(IntType numerator, IntType denominator)
+{
+    typedef typename std::make_unsigned&lt;IntType&gt;::type UnsignedIntType;
+    UnsignedIntType unsignedNumerator = static_cast&lt;UnsignedIntType&gt;(numerator);
+    UnsignedIntType unsignedDenominator = static_cast&lt;UnsignedIntType&gt;(denominator);
+    if (!unsignedDenominator)
+        return 0;
+    return unsignedNumerator / unsignedDenominator;
+}
+
+template&lt;typename IntType&gt;
+static IntType chillUMod(IntType numerator, IntType denominator)
+{
+    typedef typename std::make_unsigned&lt;IntType&gt;::type UnsignedIntType;
+    UnsignedIntType unsignedNumerator = static_cast&lt;UnsignedIntType&gt;(numerator);
+    UnsignedIntType unsignedDenominator = static_cast&lt;UnsignedIntType&gt;(denominator);
+    if (!unsignedDenominator)
+        return 0;
+    return unsignedNumerator % unsignedDenominator;
+}
+
</ins><span class="cx"> } } // namespace JSC::B3
</span><span class="cx"> 
</span><span class="cx"> #endif // ENABLE(B3_JIT)
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreb3B3Const32Valuecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/b3/B3Const32Value.cpp (208780 => 208781)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/b3/B3Const32Value.cpp        2016-11-16 04:07:30 UTC (rev 208780)
+++ trunk/Source/JavaScriptCore/b3/B3Const32Value.cpp        2016-11-16 04:47:20 UTC (rev 208781)
</span><span class="lines">@@ -112,6 +112,13 @@
</span><span class="cx">     return proc.add&lt;Const32Value&gt;(origin(), chillDiv(m_value, other-&gt;asInt32()));
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+Value* Const32Value::uDivConstant(Procedure&amp; proc, const Value* other) const
+{
+    if (!other-&gt;hasInt32())
+        return nullptr;
+    return proc.add&lt;Const32Value&gt;(origin(), chillUDiv(m_value, other-&gt;asInt32()));
+}
+
</ins><span class="cx"> Value* Const32Value::modConstant(Procedure&amp; proc, const Value* other) const
</span><span class="cx"> {
</span><span class="cx">     if (!other-&gt;hasInt32())
</span><span class="lines">@@ -119,6 +126,13 @@
</span><span class="cx">     return proc.add&lt;Const32Value&gt;(origin(), chillMod(m_value, other-&gt;asInt32()));
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+Value* Const32Value::uModConstant(Procedure&amp; proc, const Value* other) const
+{
+    if (!other-&gt;hasInt32())
+        return nullptr;
+    return proc.add&lt;Const32Value&gt;(origin(), chillUMod(m_value, other-&gt;asInt32()));
+}
+
</ins><span class="cx"> Value* Const32Value::bitAndConstant(Procedure&amp; proc, const Value* other) const
</span><span class="cx"> {
</span><span class="cx">     if (!other-&gt;hasInt32())
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreb3B3Const32Valueh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/b3/B3Const32Value.h (208780 => 208781)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/b3/B3Const32Value.h        2016-11-16 04:07:30 UTC (rev 208780)
+++ trunk/Source/JavaScriptCore/b3/B3Const32Value.h        2016-11-16 04:47:20 UTC (rev 208781)
</span><span class="lines">@@ -49,7 +49,9 @@
</span><span class="cx">     Value* checkMulConstant(Procedure&amp;, const Value* other) const override;
</span><span class="cx">     Value* checkNegConstant(Procedure&amp;) const override;
</span><span class="cx">     Value* divConstant(Procedure&amp;, const Value* other) const override;
</span><ins>+    Value* uDivConstant(Procedure&amp;, const Value* other) const override;
</ins><span class="cx">     Value* modConstant(Procedure&amp;, const Value* other) const override;
</span><ins>+    Value* uModConstant(Procedure&amp;, const Value* other) const override;
</ins><span class="cx">     Value* bitAndConstant(Procedure&amp;, const Value* other) const override;
</span><span class="cx">     Value* bitOrConstant(Procedure&amp;, const Value* other) const override;
</span><span class="cx">     Value* bitXorConstant(Procedure&amp;, const Value* other) const override;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreb3B3Const64Valuecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/b3/B3Const64Value.cpp (208780 => 208781)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/b3/B3Const64Value.cpp        2016-11-16 04:07:30 UTC (rev 208780)
+++ trunk/Source/JavaScriptCore/b3/B3Const64Value.cpp        2016-11-16 04:47:20 UTC (rev 208781)
</span><span class="lines">@@ -112,6 +112,13 @@
</span><span class="cx">     return proc.add&lt;Const64Value&gt;(origin(), chillDiv(m_value, other-&gt;asInt64()));
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+Value* Const64Value::uDivConstant(Procedure&amp; proc, const Value* other) const
+{
+    if (!other-&gt;hasInt64())
+        return nullptr;
+    return proc.add&lt;Const64Value&gt;(origin(), chillUDiv(m_value, other-&gt;asInt64()));
+}
+
</ins><span class="cx"> Value* Const64Value::modConstant(Procedure&amp; proc, const Value* other) const
</span><span class="cx"> {
</span><span class="cx">     if (!other-&gt;hasInt64())
</span><span class="lines">@@ -119,6 +126,13 @@
</span><span class="cx">     return proc.add&lt;Const64Value&gt;(origin(), chillMod(m_value, other-&gt;asInt64()));
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+Value* Const64Value::uModConstant(Procedure&amp; proc, const Value* other) const
+{
+    if (!other-&gt;hasInt64())
+        return nullptr;
+    return proc.add&lt;Const64Value&gt;(origin(), chillUMod(m_value, other-&gt;asInt64()));
+}
+
</ins><span class="cx"> Value* Const64Value::bitAndConstant(Procedure&amp; proc, const Value* other) const
</span><span class="cx"> {
</span><span class="cx">     if (!other-&gt;hasInt64())
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreb3B3Const64Valueh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/b3/B3Const64Value.h (208780 => 208781)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/b3/B3Const64Value.h        2016-11-16 04:07:30 UTC (rev 208780)
+++ trunk/Source/JavaScriptCore/b3/B3Const64Value.h        2016-11-16 04:47:20 UTC (rev 208781)
</span><span class="lines">@@ -49,7 +49,9 @@
</span><span class="cx">     Value* checkMulConstant(Procedure&amp;, const Value* other) const override;
</span><span class="cx">     Value* checkNegConstant(Procedure&amp;) const override;
</span><span class="cx">     Value* divConstant(Procedure&amp;, const Value* other) const override;
</span><ins>+    Value* uDivConstant(Procedure&amp;, const Value* other) const override;
</ins><span class="cx">     Value* modConstant(Procedure&amp;, const Value* other) const override;
</span><ins>+    Value* uModConstant(Procedure&amp;, const Value* other) const override;
</ins><span class="cx">     Value* bitAndConstant(Procedure&amp;, const Value* other) const override;
</span><span class="cx">     Value* bitOrConstant(Procedure&amp;, const Value* other) const override;
</span><span class="cx">     Value* bitXorConstant(Procedure&amp;, const Value* other) const override;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreb3B3LowerMacroscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/b3/B3LowerMacros.cpp (208780 => 208781)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/b3/B3LowerMacros.cpp        2016-11-16 04:07:30 UTC (rev 208780)
+++ trunk/Source/JavaScriptCore/b3/B3LowerMacros.cpp        2016-11-16 04:47:20 UTC (rev 208781)
</span><span class="lines">@@ -149,6 +149,18 @@
</span><span class="cx">                 }
</span><span class="cx">                 break;
</span><span class="cx">             }
</span><ins>+
+            case UMod: {
+                if (isARM64()) {
+                    Value* divResult = m_insertionSet.insert&lt;Value&gt;(m_index, UDiv, m_origin, m_value-&gt;child(0), m_value-&gt;child(1));
+                    Value* multipliedBack = m_insertionSet.insert&lt;Value&gt;(m_index, Mul, m_origin, divResult, m_value-&gt;child(1));
+                    Value* result = m_insertionSet.insert&lt;Value&gt;(m_index, Sub, m_origin, m_value-&gt;child(0), multipliedBack);
+                    m_value-&gt;replaceWithIdentity(result);
+                    m_changed = true;
+                }
+                break;
+            }
+
</ins><span class="cx">             case Div: {
</span><span class="cx">                 if (m_value-&gt;isChill())
</span><span class="cx">                     makeDivisionChill(Div);
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreb3B3LowerToAircpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/b3/B3LowerToAir.cpp (208780 => 208781)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/b3/B3LowerToAir.cpp        2016-11-16 04:07:30 UTC (rev 208780)
+++ trunk/Source/JavaScriptCore/b3/B3LowerToAir.cpp        2016-11-16 04:47:20 UTC (rev 208781)
</span><span class="lines">@@ -2095,13 +2095,11 @@
</span><span class="cx">         case Div: {
</span><span class="cx">             if (m_value-&gt;isChill())
</span><span class="cx">                 RELEASE_ASSERT(isARM64());
</span><del>-#if CPU(X86) || CPU(X86_64)
-            if (isInt(m_value-&gt;type())) {
</del><ins>+            if (isInt(m_value-&gt;type()) &amp;&amp; isX86()) {
</ins><span class="cx">                 lowerX86Div();
</span><span class="cx">                 append(Move, Tmp(X86Registers::eax), tmp(m_value));
</span><span class="cx">                 return;
</span><span class="cx">             }
</span><del>-#endif
</del><span class="cx">             ASSERT(!isX86() || isFloat(m_value-&gt;type()));
</span><span class="cx"> 
</span><span class="cx">             appendBinOp&lt;Div32, Div64, DivDouble, DivFloat&gt;(m_value-&gt;child(0), m_value-&gt;child(1));
</span><span class="lines">@@ -2108,6 +2106,20 @@
</span><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><ins>+        case UDiv: {
+            if (isInt(m_value-&gt;type()) &amp;&amp; isX86()) {
+                lowerX86UDiv();
+                append(Move, Tmp(X86Registers::eax), tmp(m_value));
+                return;
+            }
+
+            ASSERT(!isX86() &amp;&amp; !isFloat(m_value-&gt;type()));
+
+            appendBinOp&lt;UDiv32, UDiv64, Air::Oops, Air::Oops&gt;(m_value-&gt;child(0), m_value-&gt;child(1));
+            return;
+
+        }
+
</ins><span class="cx">         case Mod: {
</span><span class="cx">             RELEASE_ASSERT(isX86());
</span><span class="cx">             RELEASE_ASSERT(!m_value-&gt;isChill());
</span><span class="lines">@@ -2118,6 +2130,15 @@
</span><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><ins>+        case UMod: {
+            RELEASE_ASSERT(isX86());
+#if CPU(X86) || CPU(X86_64)
+            lowerX86UDiv();
+            append(Move, Tmp(X86Registers::edx), tmp(m_value));
+#endif
+            return;
+        }
+
</ins><span class="cx">         case BitAnd: {
</span><span class="cx">             if (m_value-&gt;child(1)-&gt;isInt(0xff)) {
</span><span class="cx">                 appendUnOp&lt;ZeroExtend8To32, ZeroExtend8To32&gt;(m_value-&gt;child(0));
</span><span class="lines">@@ -2774,9 +2795,9 @@
</span><span class="cx">         RELEASE_ASSERT_NOT_REACHED();
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-#if CPU(X86) || CPU(X86_64)
</del><span class="cx">     void lowerX86Div()
</span><span class="cx">     {
</span><ins>+#if CPU(X86) || CPU(X86_64)
</ins><span class="cx">         Tmp eax = Tmp(X86Registers::eax);
</span><span class="cx">         Tmp edx = Tmp(X86Registers::edx);
</span><span class="cx"> 
</span><span class="lines">@@ -2799,8 +2820,26 @@
</span><span class="cx">         append(Move, tmp(m_value-&gt;child(0)), eax);
</span><span class="cx">         append(convertToDoubleWord, eax, edx);
</span><span class="cx">         append(div, eax, edx, tmp(m_value-&gt;child(1)));
</span><ins>+#else
+        UNREACHABLE_FOR_PLATFORM();
+#endif
</ins><span class="cx">     }
</span><ins>+
+    void lowerX86UDiv()
+    {
+#if CPU(X86) || CPU(X86_64)
+        Tmp eax = Tmp(X86Registers::eax);
+        Tmp edx = Tmp(X86Registers::edx);
+
+        Air::Opcode div = m_value-&gt;type() == Int32 ? X86UDiv32 : X86UDiv64;
+
+        append(Move, tmp(m_value-&gt;child(0)), eax);
+        append(Xor64, edx, edx);
+        append(div, eax, edx, tmp(m_value-&gt;child(1)));
+#else
+        UNREACHABLE_FOR_PLATFORM();
</ins><span class="cx"> #endif
</span><ins>+    }
</ins><span class="cx"> 
</span><span class="cx">     IndexSet&lt;Value&gt; m_locked; // These are values that will have no Tmp in Air.
</span><span class="cx">     IndexMap&lt;Value, Tmp&gt; m_valueToTmp; // These are values that must have a Tmp in Air. We say that a Value* with a non-null Tmp is &quot;pinned&quot;.
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreb3B3Opcodecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/b3/B3Opcode.cpp (208780 => 208781)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/b3/B3Opcode.cpp        2016-11-16 04:07:30 UTC (rev 208780)
+++ trunk/Source/JavaScriptCore/b3/B3Opcode.cpp        2016-11-16 04:47:20 UTC (rev 208781)
</span><span class="lines">@@ -122,9 +122,15 @@
</span><span class="cx">     case Div:
</span><span class="cx">         out.print(&quot;Div&quot;);
</span><span class="cx">         return;
</span><ins>+    case UDiv:
+        out.print(&quot;UDiv&quot;);
+        return;
</ins><span class="cx">     case Mod:
</span><span class="cx">         out.print(&quot;Mod&quot;);
</span><span class="cx">         return;
</span><ins>+    case UMod:
+        out.print(&quot;UMod&quot;);
+        return;
</ins><span class="cx">     case Neg:
</span><span class="cx">         out.print(&quot;Neg&quot;);
</span><span class="cx">         return;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreb3B3Opcodeh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/b3/B3Opcode.h (208780 => 208781)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/b3/B3Opcode.h        2016-11-16 04:07:30 UTC (rev 208780)
+++ trunk/Source/JavaScriptCore/b3/B3Opcode.h        2016-11-16 04:47:20 UTC (rev 208781)
</span><span class="lines">@@ -78,8 +78,11 @@
</span><span class="cx">     Sub,
</span><span class="cx">     Mul,
</span><span class="cx">     Div, // All bets are off as to what will happen when you execute this for -2^31/-1 and x/0.
</span><ins>+    UDiv,
</ins><span class="cx">     Mod, // All bets are off as to what will happen when you execute this for -2^31%-1 and x%0.
</span><ins>+    UMod,
</ins><span class="cx"> 
</span><ins>+
</ins><span class="cx">     // Polymorphic negation. Note that we only need this for floating point, since integer negation
</span><span class="cx">     // is exactly like Sub(0, x). But that's not true for floating point. Sub(0, 0) is 0, while
</span><span class="cx">     // Neg(0) is -0. Also, we canonicalize Sub(0, x) into Neg(x) in case of integers.
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreb3B3ReduceStrengthcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/b3/B3ReduceStrength.cpp (208780 => 208781)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/b3/B3ReduceStrength.cpp        2016-11-16 04:07:30 UTC (rev 208780)
+++ trunk/Source/JavaScriptCore/b3/B3ReduceStrength.cpp        2016-11-16 04:47:20 UTC (rev 208781)
</span><span class="lines">@@ -772,6 +772,35 @@
</span><span class="cx">             }
</span><span class="cx">             break;
</span><span class="cx"> 
</span><ins>+        case UDiv:
+            // Turn this: UDiv(constant1, constant2)
+            // Into this: constant1 / constant2
+            if (replaceWithNewValue(m_value-&gt;child(0)-&gt;uDivConstant(m_proc, m_value-&gt;child(1))))
+                break;
+
+            if (m_value-&gt;child(1)-&gt;hasInt()) {
+                switch (m_value-&gt;child(1)-&gt;asInt()) {
+                case 0:
+                    // Turn this: UDiv(value, 0)
+                    // Into this: 0
+                    // We can do whatever we want here so we might as well do the chill thing,
+                    // in case we add chill versions of UDiv in the future.
+                    replaceWithIdentity(m_value-&gt;child(1));
+                    break;
+
+                case 1:
+                    // Turn this: UDiv(value, 1)
+                    // Into this: value
+                    replaceWithIdentity(m_value-&gt;child(0));
+                    break;
+                default:
+                    // FIXME: We should do comprehensive strength reduction for unsigned numbers. Likely,
+                    // we will just want copy what llvm does. https://bugs.webkit.org/show_bug.cgi?id=164809
+                    break;
+                }
+            }
+            break;
+
</ins><span class="cx">         case Mod:
</span><span class="cx">             // Turn this: Mod(constant1, constant2)
</span><span class="cx">             // Into this: constant1 / constant2
</span><span class="lines">@@ -829,6 +858,14 @@
</span><span class="cx">             
</span><span class="cx">             break;
</span><span class="cx"> 
</span><ins>+        case UMod:
+            // Turn this: UMod(constant1, constant2)
+            // Into this: constant1 / constant2
+            replaceWithNewValue(m_value-&gt;child(0)-&gt;uModConstant(m_proc, m_value-&gt;child(1)));
+            // FIXME: We should do what we do for Mod since the same principle applies here.
+            // https://bugs.webkit.org/show_bug.cgi?id=164809
+            break;
+
</ins><span class="cx">         case BitAnd:
</span><span class="cx">             handleCommutativity();
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreb3B3Validatecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/b3/B3Validate.cpp (208780 => 208781)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/b3/B3Validate.cpp        2016-11-16 04:07:30 UTC (rev 208780)
+++ trunk/Source/JavaScriptCore/b3/B3Validate.cpp        2016-11-16 04:47:20 UTC (rev 208781)
</span><span class="lines">@@ -190,7 +190,9 @@
</span><span class="cx">             case Sub:
</span><span class="cx">             case Mul:
</span><span class="cx">             case Div:
</span><ins>+            case UDiv:
</ins><span class="cx">             case Mod:
</span><ins>+            case UMod:
</ins><span class="cx">             case BitAnd:
</span><span class="cx">             case BitXor:
</span><span class="cx">                 VALIDATE(!value-&gt;kind().traps(), (&quot;At &quot;, *value));
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreb3B3Valuecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/b3/B3Value.cpp (208780 => 208781)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/b3/B3Value.cpp        2016-11-16 04:07:30 UTC (rev 208780)
+++ trunk/Source/JavaScriptCore/b3/B3Value.cpp        2016-11-16 04:47:20 UTC (rev 208781)
</span><span class="lines">@@ -298,11 +298,21 @@
</span><span class="cx">     return nullptr;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+Value* Value::uDivConstant(Procedure&amp;, const Value*) const
+{
+    return nullptr;
+}
+
</ins><span class="cx"> Value* Value::modConstant(Procedure&amp;, const Value*) const
</span><span class="cx"> {
</span><span class="cx">     return nullptr;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+Value* Value::uModConstant(Procedure&amp;, const Value*) const
+{
+    return nullptr;
+}
+
</ins><span class="cx"> Value* Value::bitAndConstant(Procedure&amp;, const Value*) const
</span><span class="cx"> {
</span><span class="cx">     return nullptr;
</span><span class="lines">@@ -569,7 +579,9 @@
</span><span class="cx">     case Select:
</span><span class="cx">         break;
</span><span class="cx">     case Div:
</span><ins>+    case UDiv:
</ins><span class="cx">     case Mod:
</span><ins>+    case UMod:
</ins><span class="cx">         result.controlDependent = true;
</span><span class="cx">         break;
</span><span class="cx">     case Load8Z:
</span><span class="lines">@@ -675,7 +687,9 @@
</span><span class="cx">     case Sub:
</span><span class="cx">     case Mul:
</span><span class="cx">     case Div:
</span><ins>+    case UDiv:
</ins><span class="cx">     case Mod:
</span><ins>+    case UMod:
</ins><span class="cx">     case BitAnd:
</span><span class="cx">     case BitOr:
</span><span class="cx">     case BitXor:
</span><span class="lines">@@ -753,7 +767,9 @@
</span><span class="cx">     case Sub:
</span><span class="cx">     case Mul:
</span><span class="cx">     case Div:
</span><ins>+    case UDiv:
</ins><span class="cx">     case Mod:
</span><ins>+    case UMod:
</ins><span class="cx">     case Neg:
</span><span class="cx">     case BitAnd:
</span><span class="cx">     case BitOr:
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreb3B3Valueh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/b3/B3Value.h (208780 => 208781)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/b3/B3Value.h        2016-11-16 04:07:30 UTC (rev 208780)
+++ trunk/Source/JavaScriptCore/b3/B3Value.h        2016-11-16 04:47:20 UTC (rev 208781)
</span><span class="lines">@@ -166,7 +166,9 @@
</span><span class="cx">     virtual Value* checkMulConstant(Procedure&amp;, const Value* other) const;
</span><span class="cx">     virtual Value* checkNegConstant(Procedure&amp;) const;
</span><span class="cx">     virtual Value* divConstant(Procedure&amp;, const Value* other) const; // This chooses Div&lt;Chill&gt; semantics for integers.
</span><ins>+    virtual Value* uDivConstant(Procedure&amp;, const Value* other) const;
</ins><span class="cx">     virtual Value* modConstant(Procedure&amp;, const Value* other) const; // This chooses Mod&lt;Chill&gt; semantics.
</span><ins>+    virtual Value* uModConstant(Procedure&amp;, const Value* other) const;
</ins><span class="cx">     virtual Value* bitAndConstant(Procedure&amp;, const Value* other) const;
</span><span class="cx">     virtual Value* bitOrConstant(Procedure&amp;, const Value* other) const;
</span><span class="cx">     virtual Value* bitXorConstant(Procedure&amp;, const Value* other) const;
</span><span class="lines">@@ -322,7 +324,9 @@
</span><span class="cx">         case Sub:
</span><span class="cx">         case Mul:
</span><span class="cx">         case Div:
</span><ins>+        case UDiv:
</ins><span class="cx">         case Mod:
</span><ins>+        case UMod:
</ins><span class="cx">         case BitAnd:
</span><span class="cx">         case BitOr:
</span><span class="cx">         case BitXor:
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreb3B3ValueKeycpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/b3/B3ValueKey.cpp (208780 => 208781)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/b3/B3ValueKey.cpp        2016-11-16 04:07:30 UTC (rev 208780)
+++ trunk/Source/JavaScriptCore/b3/B3ValueKey.cpp        2016-11-16 04:47:20 UTC (rev 208781)
</span><span class="lines">@@ -76,7 +76,10 @@
</span><span class="cx">     case Add:
</span><span class="cx">     case Sub:
</span><span class="cx">     case Mul:
</span><ins>+    case Div:
+    case UDiv:
</ins><span class="cx">     case Mod:
</span><ins>+    case UMod:
</ins><span class="cx">     case BitAnd:
</span><span class="cx">     case BitOr:
</span><span class="cx">     case BitXor:
</span><span class="lines">@@ -91,7 +94,6 @@
</span><span class="cx">     case Below:
</span><span class="cx">     case AboveEqual:
</span><span class="cx">     case BelowEqual:
</span><del>-    case Div:
</del><span class="cx">         return proc.add&lt;Value&gt;(kind(), type(), origin, child(proc, 0), child(proc, 1));
</span><span class="cx">     case Select:
</span><span class="cx">         return proc.add&lt;Value&gt;(kind(), type(), origin, child(proc, 0), child(proc, 1), child(proc, 2));
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreb3airAirInstInlinesh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/b3/air/AirInstInlines.h (208780 => 208781)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/b3/air/AirInstInlines.h        2016-11-16 04:07:30 UTC (rev 208780)
+++ trunk/Source/JavaScriptCore/b3/air/AirInstInlines.h        2016-11-16 04:47:20 UTC (rev 208781)
</span><span class="lines">@@ -240,11 +240,21 @@
</span><span class="cx">     return isX86DivHelperValid(inst);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+inline bool isX86UDiv32Valid(const Inst&amp; inst)
+{
+    return isX86DivHelperValid(inst);
+}
+
</ins><span class="cx"> inline bool isX86Div64Valid(const Inst&amp; inst)
</span><span class="cx"> {
</span><span class="cx">     return isX86DivHelperValid(inst);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+inline bool isX86UDiv64Valid(const Inst&amp; inst)
+{
+    return isX86DivHelperValid(inst);
+}
+
</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="trunkSourceJavaScriptCoreb3airAirOpcodeopcodes"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/b3/air/AirOpcode.opcodes (208780 => 208781)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/b3/air/AirOpcode.opcodes        2016-11-16 04:07:30 UTC (rev 208780)
+++ trunk/Source/JavaScriptCore/b3/air/AirOpcode.opcodes        2016-11-16 04:47:20 UTC (rev 208781)
</span><span class="lines">@@ -251,9 +251,15 @@
</span><span class="cx"> arm64: Div32 U:G:32, U:G:32, ZD:G:32
</span><span class="cx">     Tmp, Tmp, Tmp
</span><span class="cx"> 
</span><ins>+arm64: UDiv32 U:G:32, U:G:32, ZD:G:32
+    Tmp, Tmp, Tmp
+
</ins><span class="cx"> arm64: Div64 U:G:64, U:G:64, D:G:64
</span><span class="cx">     Tmp, Tmp, Tmp
</span><span class="cx"> 
</span><ins>+arm64: UDiv64 U:G:64, U:G:64, D:G:64
+    Tmp, Tmp, Tmp
+
</ins><span class="cx"> MulDouble U:F:64, U:F:64, D:F:64
</span><span class="cx">     Tmp, Tmp, Tmp
</span><span class="cx">     x86: Addr, Tmp, Tmp
</span><span class="lines">@@ -297,9 +303,15 @@
</span><span class="cx"> x86: X86Div32 UZD:G:32, UZD:G:32, U:G:32
</span><span class="cx">     Tmp*, Tmp*, Tmp
</span><span class="cx"> 
</span><ins>+x86: X86UDiv32 UZD:G:32, UZD:G:32, U:G:32
+    Tmp*, Tmp*, Tmp
+
</ins><span class="cx"> x86_64: X86Div64 UZD:G:64, UZD:G:64, U:G:64
</span><span class="cx">     Tmp*, Tmp*, Tmp
</span><span class="cx"> 
</span><ins>+x86_64: X86UDiv64 UZD:G:64, UZD:G:64, U:G:64
+    Tmp*, Tmp*, Tmp
+
</ins><span class="cx"> Lea32 UA:G:32, D:G:32
</span><span class="cx">     Addr, Tmp
</span><span class="cx">     x86: Index, Tmp as x86Lea32
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreb3testb3cpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/b3/testb3.cpp (208780 => 208781)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/b3/testb3.cpp        2016-11-16 04:07:30 UTC (rev 208780)
+++ trunk/Source/JavaScriptCore/b3/testb3.cpp        2016-11-16 04:47:20 UTC (rev 208781)
</span><span class="lines">@@ -1757,6 +1757,74 @@
</span><span class="cx">     CHECK(isIdentical(effect, static_cast&lt;double&gt;(a) / static_cast&lt;double&gt;(b)));
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void testUDivArgsInt32(uint32_t a, uint32_t b)
+{
+    // UDiv with denominator == 0 is invalid.
+    if (!b)
+        return;
+
+    Procedure proc;
+    BasicBlock* root = proc.addBlock();
+    Value* argument1 = root-&gt;appendNew&lt;Value&gt;(proc, Trunc, Origin(),
+        root-&gt;appendNew&lt;ArgumentRegValue&gt;(proc, Origin(), GPRInfo::argumentGPR0));
+    Value* argument2 = root-&gt;appendNew&lt;Value&gt;(proc, Trunc, Origin(),
+        root-&gt;appendNew&lt;ArgumentRegValue&gt;(proc, Origin(), GPRInfo::argumentGPR1));
+    Value* result = root-&gt;appendNew&lt;Value&gt;(proc, UDiv, Origin(), argument1, argument2);
+    root-&gt;appendNew&lt;Value&gt;(proc, Return, Origin(), result);
+
+    CHECK_EQ(compileAndRun&lt;uint32_t&gt;(proc, a, b), a / b);
+}
+
+void testUDivArgsInt64(uint64_t a, uint64_t b)
+{
+    // UDiv with denominator == 0 is invalid.
+    if (!b)
+        return;
+
+    Procedure proc;
+    BasicBlock* root = proc.addBlock();
+    Value* argument1 = root-&gt;appendNew&lt;ArgumentRegValue&gt;(proc, Origin(), GPRInfo::argumentGPR0);
+    Value* argument2 = root-&gt;appendNew&lt;ArgumentRegValue&gt;(proc, Origin(), GPRInfo::argumentGPR1);
+    Value* result = root-&gt;appendNew&lt;Value&gt;(proc, UDiv, Origin(), argument1, argument2);
+    root-&gt;appendNew&lt;Value&gt;(proc, Return, Origin(), result);
+
+    CHECK_EQ(compileAndRun&lt;uint64_t&gt;(proc, a, b), a / b);
+}
+
+void testUModArgsInt32(uint32_t a, uint32_t b)
+{
+    // UMod with denominator == 0 is invalid.
+    if (!b)
+        return;
+
+    Procedure proc;
+    BasicBlock* root = proc.addBlock();
+    Value* argument1 = root-&gt;appendNew&lt;Value&gt;(proc, Trunc, Origin(),
+        root-&gt;appendNew&lt;ArgumentRegValue&gt;(proc, Origin(), GPRInfo::argumentGPR0));
+    Value* argument2 = root-&gt;appendNew&lt;Value&gt;(proc, Trunc, Origin(),
+        root-&gt;appendNew&lt;ArgumentRegValue&gt;(proc, Origin(), GPRInfo::argumentGPR1));
+    Value* result = root-&gt;appendNew&lt;Value&gt;(proc, UMod, Origin(), argument1, argument2);
+    root-&gt;appendNew&lt;Value&gt;(proc, Return, Origin(), result);
+
+    CHECK_EQ(compileAndRun&lt;uint32_t&gt;(proc, a, b), a % b);
+}
+
+void testUModArgsInt64(uint64_t a, uint64_t b)
+{
+    // UMod with denominator == 0 is invalid.
+    if (!b)
+        return;
+
+    Procedure proc;
+    BasicBlock* root = proc.addBlock();
+    Value* argument1 = root-&gt;appendNew&lt;ArgumentRegValue&gt;(proc, Origin(), GPRInfo::argumentGPR0);
+    Value* argument2 = root-&gt;appendNew&lt;ArgumentRegValue&gt;(proc, Origin(), GPRInfo::argumentGPR1);
+    Value* result = root-&gt;appendNew&lt;Value&gt;(proc, UMod, Origin(), argument1, argument2);
+    root-&gt;appendNew&lt;Value&gt;(proc, Return, Origin(), result);
+    
+    CHECK_EQ(compileAndRun&lt;uint64_t&gt;(proc, a, b), a % b);
+}
+
</ins><span class="cx"> void testSubArg(int a)
</span><span class="cx"> {
</span><span class="cx">     Procedure proc;
</span><span class="lines">@@ -14053,6 +14121,9 @@
</span><span class="cx">     RUN_BINARY(testDivArgsFloatWithUselessDoubleConversion, floatingPointOperands&lt;float&gt;(), floatingPointOperands&lt;float&gt;());
</span><span class="cx">     RUN_BINARY(testDivArgsFloatWithEffectfulDoubleConversion, floatingPointOperands&lt;float&gt;(), floatingPointOperands&lt;float&gt;());
</span><span class="cx"> 
</span><ins>+    RUN_BINARY(testUDivArgsInt32, int32Operands(), int32Operands());
+    RUN_BINARY(testUDivArgsInt64, int64Operands(), int64Operands());
+
</ins><span class="cx">     RUN_UNARY(testModArgDouble, floatingPointOperands&lt;double&gt;());
</span><span class="cx">     RUN_BINARY(testModArgsDouble, floatingPointOperands&lt;double&gt;(), floatingPointOperands&lt;double&gt;());
</span><span class="cx">     RUN_BINARY(testModArgImmDouble, floatingPointOperands&lt;double&gt;(), floatingPointOperands&lt;double&gt;());
</span><span class="lines">@@ -14064,6 +14135,9 @@
</span><span class="cx">     RUN_BINARY(testModImmArgFloat, floatingPointOperands&lt;float&gt;(), floatingPointOperands&lt;float&gt;());
</span><span class="cx">     RUN_BINARY(testModImmsFloat, floatingPointOperands&lt;float&gt;(), floatingPointOperands&lt;float&gt;());
</span><span class="cx"> 
</span><ins>+    RUN_BINARY(testUModArgsInt32, int32Operands(), int32Operands());
+    RUN_BINARY(testUModArgsInt64, int64Operands(), int64Operands());
+
</ins><span class="cx">     RUN(testSubArg(24));
</span><span class="cx">     RUN(testSubArgs(1, 1));
</span><span class="cx">     RUN(testSubArgs(1, 2));
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorewasmwasmjson"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/wasm/wasm.json (208780 => 208781)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/wasm/wasm.json        2016-11-16 04:07:30 UTC (rev 208780)
+++ trunk/Source/JavaScriptCore/wasm/wasm.json        2016-11-16 04:47:20 UTC (rev 208781)
</span><span class="lines">@@ -96,9 +96,9 @@
</span><span class="cx">         &quot;i32.sub&quot;:             { &quot;category&quot;: &quot;arithmetic&quot;, &quot;value&quot;:  65, &quot;return&quot;: [&quot;i32&quot;],      &quot;parameter&quot;: [&quot;i32&quot;, &quot;i32&quot;],           &quot;immediate&quot;: [], &quot;b3op&quot;: &quot;Sub&quot;          },
</span><span class="cx">         &quot;i32.mul&quot;:             { &quot;category&quot;: &quot;arithmetic&quot;, &quot;value&quot;:  66, &quot;return&quot;: [&quot;i32&quot;],      &quot;parameter&quot;: [&quot;i32&quot;, &quot;i32&quot;],           &quot;immediate&quot;: [], &quot;b3op&quot;: &quot;Mul&quot;          },
</span><span class="cx">         &quot;i32.div_s&quot;:           { &quot;category&quot;: &quot;arithmetic&quot;, &quot;value&quot;:  67, &quot;return&quot;: [&quot;i32&quot;],      &quot;parameter&quot;: [&quot;i32&quot;, &quot;i32&quot;],           &quot;immediate&quot;: [], &quot;b3op&quot;: &quot;Div&quot;          },
</span><del>-        &quot;i32.div_u&quot;:           { &quot;category&quot;: &quot;arithmetic&quot;, &quot;value&quot;:  68, &quot;return&quot;: [&quot;i32&quot;],      &quot;parameter&quot;: [&quot;i32&quot;, &quot;i32&quot;],           &quot;immediate&quot;: []                         },
</del><ins>+        &quot;i32.div_u&quot;:           { &quot;category&quot;: &quot;arithmetic&quot;, &quot;value&quot;:  68, &quot;return&quot;: [&quot;i32&quot;],      &quot;parameter&quot;: [&quot;i32&quot;, &quot;i32&quot;],           &quot;immediate&quot;: [], &quot;b3op&quot;: &quot;UDiv&quot;         },
</ins><span class="cx">         &quot;i32.rem_s&quot;:           { &quot;category&quot;: &quot;arithmetic&quot;, &quot;value&quot;:  69, &quot;return&quot;: [&quot;i32&quot;],      &quot;parameter&quot;: [&quot;i32&quot;, &quot;i32&quot;],           &quot;immediate&quot;: [], &quot;b3op&quot;: &quot;Mod&quot;          },
</span><del>-        &quot;i32.rem_u&quot;:           { &quot;category&quot;: &quot;arithmetic&quot;, &quot;value&quot;:  70, &quot;return&quot;: [&quot;i32&quot;],      &quot;parameter&quot;: [&quot;i32&quot;, &quot;i32&quot;],           &quot;immediate&quot;: []                         },
</del><ins>+        &quot;i32.rem_u&quot;:           { &quot;category&quot;: &quot;arithmetic&quot;, &quot;value&quot;:  70, &quot;return&quot;: [&quot;i32&quot;],      &quot;parameter&quot;: [&quot;i32&quot;, &quot;i32&quot;],           &quot;immediate&quot;: [], &quot;b3op&quot;: &quot;UMod&quot;         },
</ins><span class="cx">         &quot;i32.and&quot;:             { &quot;category&quot;: &quot;arithmetic&quot;, &quot;value&quot;:  71, &quot;return&quot;: [&quot;i32&quot;],      &quot;parameter&quot;: [&quot;i32&quot;, &quot;i32&quot;],           &quot;immediate&quot;: [], &quot;b3op&quot;: &quot;BitAnd&quot;       },
</span><span class="cx">         &quot;i32.or&quot;:              { &quot;category&quot;: &quot;arithmetic&quot;, &quot;value&quot;:  72, &quot;return&quot;: [&quot;i32&quot;],      &quot;parameter&quot;: [&quot;i32&quot;, &quot;i32&quot;],           &quot;immediate&quot;: [], &quot;b3op&quot;: &quot;BitOr&quot;        },
</span><span class="cx">         &quot;i32.xor&quot;:             { &quot;category&quot;: &quot;arithmetic&quot;, &quot;value&quot;:  73, &quot;return&quot;: [&quot;i32&quot;],      &quot;parameter&quot;: [&quot;i32&quot;, &quot;i32&quot;],           &quot;immediate&quot;: [], &quot;b3op&quot;: &quot;BitXor&quot;       },
</span><span class="lines">@@ -125,9 +125,9 @@
</span><span class="cx">         &quot;i64.sub&quot;:             { &quot;category&quot;: &quot;arithmetic&quot;, &quot;value&quot;:  92, &quot;return&quot;: [&quot;i64&quot;],      &quot;parameter&quot;: [&quot;i64&quot;, &quot;i64&quot;],           &quot;immediate&quot;: [], &quot;b3op&quot;: &quot;Sub&quot;          },
</span><span class="cx">         &quot;i64.mul&quot;:             { &quot;category&quot;: &quot;arithmetic&quot;, &quot;value&quot;:  93, &quot;return&quot;: [&quot;i64&quot;],      &quot;parameter&quot;: [&quot;i64&quot;, &quot;i64&quot;],           &quot;immediate&quot;: [], &quot;b3op&quot;: &quot;Mul&quot;          },
</span><span class="cx">         &quot;i64.div_s&quot;:           { &quot;category&quot;: &quot;arithmetic&quot;, &quot;value&quot;:  94, &quot;return&quot;: [&quot;i64&quot;],      &quot;parameter&quot;: [&quot;i64&quot;, &quot;i64&quot;],           &quot;immediate&quot;: [], &quot;b3op&quot;: &quot;Div&quot;          },
</span><del>-        &quot;i64.div_u&quot;:           { &quot;category&quot;: &quot;arithmetic&quot;, &quot;value&quot;:  95, &quot;return&quot;: [&quot;i64&quot;],      &quot;parameter&quot;: [&quot;i64&quot;, &quot;i64&quot;],           &quot;immediate&quot;: []                         },
</del><ins>+        &quot;i64.div_u&quot;:           { &quot;category&quot;: &quot;arithmetic&quot;, &quot;value&quot;:  95, &quot;return&quot;: [&quot;i64&quot;],      &quot;parameter&quot;: [&quot;i64&quot;, &quot;i64&quot;],           &quot;immediate&quot;: [], &quot;b3op&quot;: &quot;UDiv&quot;         },
</ins><span class="cx">         &quot;i64.rem_s&quot;:           { &quot;category&quot;: &quot;arithmetic&quot;, &quot;value&quot;:  96, &quot;return&quot;: [&quot;i64&quot;],      &quot;parameter&quot;: [&quot;i64&quot;, &quot;i64&quot;],           &quot;immediate&quot;: [], &quot;b3op&quot;: &quot;Mod&quot;          },
</span><del>-        &quot;i64.rem_u&quot;:           { &quot;category&quot;: &quot;arithmetic&quot;, &quot;value&quot;:  97, &quot;return&quot;: [&quot;i64&quot;],      &quot;parameter&quot;: [&quot;i64&quot;, &quot;i64&quot;],           &quot;immediate&quot;: []                         },
</del><ins>+        &quot;i64.rem_u&quot;:           { &quot;category&quot;: &quot;arithmetic&quot;, &quot;value&quot;:  97, &quot;return&quot;: [&quot;i64&quot;],      &quot;parameter&quot;: [&quot;i64&quot;, &quot;i64&quot;],           &quot;immediate&quot;: [], &quot;b3op&quot;: &quot;UDiv&quot;         },
</ins><span class="cx">         &quot;i64.and&quot;:             { &quot;category&quot;: &quot;arithmetic&quot;, &quot;value&quot;:  98, &quot;return&quot;: [&quot;i64&quot;],      &quot;parameter&quot;: [&quot;i64&quot;, &quot;i64&quot;],           &quot;immediate&quot;: [], &quot;b3op&quot;: &quot;BitAnd&quot;       },
</span><span class="cx">         &quot;i64.or&quot;:              { &quot;category&quot;: &quot;arithmetic&quot;, &quot;value&quot;:  99, &quot;return&quot;: [&quot;i64&quot;],      &quot;parameter&quot;: [&quot;i64&quot;, &quot;i64&quot;],           &quot;immediate&quot;: [], &quot;b3op&quot;: &quot;BitOr&quot;        },
</span><span class="cx">         &quot;i64.xor&quot;:             { &quot;category&quot;: &quot;arithmetic&quot;, &quot;value&quot;: 100, &quot;return&quot;: [&quot;i64&quot;],      &quot;parameter&quot;: [&quot;i64&quot;, &quot;i64&quot;],           &quot;immediate&quot;: [], &quot;b3op&quot;: &quot;BitXor&quot;       },
</span></span></pre>
</div>
</div>

</body>
</html>