<!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>[269729] 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/269729">269729</a></dd>
<dt>Author</dt> <dd>commit-queue@webkit.org</dd>
<dt>Date</dt> <dd>2020-11-12 03:59:44 -0800 (Thu, 12 Nov 2020)</dd>
</dl>

<h3>Log Message</h3>
<pre>[WASM-References] Support imm for ref.null
https://bugs.webkit.org/show_bug.cgi?id=218744

Patch by Dmitry Bezhetskov <dbezhetskov@igalia.com> on 2020-11-12
Reviewed by Yusuke Suzuki.

JSTests:

Updated the Builder DSL and spec tests for ref.null extern/funcref.
Spec is here - https://webassembly.github.io/reference-types/core/.

* wasm/Builder.js:
(export.default.Builder.prototype._registerSectionBuilders.const.section.in.WASM.description.section.switch.section.case.string_appeared_here.this.section):
* wasm/Builder_WebAssemblyBinary.js:
(const.putInitExpr):
* wasm/LowLevelBinary.js:
(export.default.LowLevelBinary.prototype.ref_type):
* wasm/WASM.js:
* wasm/references-spec-tests/ref_is_null.js:
* wasm/references-spec-tests/ref_null.js:
* wasm/references/externref_globals.js:
* wasm/references/externref_modules.js:
* wasm/references/externref_table.js:
* wasm/references/externref_table_import.js:
(makeImport):
(string_appeared_here.fullGC.assert.eq.1.exports.get_tbl.makeImport):
(string_appeared_here.fullGC.assert.eq.1.exports.get_tbl):
* wasm/references/func_ref.js:
(assert.eq.instance.exports.fix):
* wasm/references/is_null.js:
(checkRefNullWithI32ImmType):
* wasm/references/multitable.js:
* wasm/wasm.json:

Source/JavaScriptCore:

Updated ref.null according to the ref-types spec:
https://github.com/WebAssembly/reference-types/.

* wasm/WasmFormat.h:
(JSC::Wasm::isRefType):
* wasm/WasmFunctionParser.h:
(JSC::Wasm::FunctionParser<Context>::parseExpression):
* wasm/WasmParser.h:
(JSC::Wasm::Parser<SuccessType>::parseRefType):
* wasm/WasmSectionParser.cpp:
(JSC::Wasm::SectionParser::parseInitExpr):
* wasm/wasm.json:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkJSTestsChangeLog">trunk/JSTests/ChangeLog</a></li>
<li><a href="#trunkJSTestswasmBuilderjs">trunk/JSTests/wasm/Builder.js</a></li>
<li><a href="#trunkJSTestswasmBuilder_WebAssemblyBinaryjs">trunk/JSTests/wasm/Builder_WebAssemblyBinary.js</a></li>
<li><a href="#trunkJSTestswasmLowLevelBinaryjs">trunk/JSTests/wasm/LowLevelBinary.js</a></li>
<li><a href="#trunkJSTestswasmWASMjs">trunk/JSTests/wasm/WASM.js</a></li>
<li><a href="#trunkJSTestswasmreferencesexternref_globalsjs">trunk/JSTests/wasm/references/externref_globals.js</a></li>
<li><a href="#trunkJSTestswasmreferencesexternref_modulesjs">trunk/JSTests/wasm/references/externref_modules.js</a></li>
<li><a href="#trunkJSTestswasmreferencesexternref_tablejs">trunk/JSTests/wasm/references/externref_table.js</a></li>
<li><a href="#trunkJSTestswasmreferencesexternref_table_importjs">trunk/JSTests/wasm/references/externref_table_import.js</a></li>
<li><a href="#trunkJSTestswasmreferencesfunc_refjs">trunk/JSTests/wasm/references/func_ref.js</a></li>
<li><a href="#trunkJSTestswasmreferencesis_nulljs">trunk/JSTests/wasm/references/is_null.js</a></li>
<li><a href="#trunkJSTestswasmreferencesmultitablejs">trunk/JSTests/wasm/references/multitable.js</a></li>
<li><a href="#trunkJSTestswasmreferencesspectestsref_is_nulljs">trunk/JSTests/wasm/references-spec-tests/ref_is_null.js</a></li>
<li><a href="#trunkJSTestswasmreferencesspectestsref_nulljs">trunk/JSTests/wasm/references-spec-tests/ref_null.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="#trunkSourceJavaScriptCorewasmWasmFormath">trunk/Source/JavaScriptCore/wasm/WasmFormat.h</a></li>
<li><a href="#trunkSourceJavaScriptCorewasmWasmFunctionParserh">trunk/Source/JavaScriptCore/wasm/WasmFunctionParser.h</a></li>
<li><a href="#trunkSourceJavaScriptCorewasmWasmParserh">trunk/Source/JavaScriptCore/wasm/WasmParser.h</a></li>
<li><a href="#trunkSourceJavaScriptCorewasmWasmSectionParsercpp">trunk/Source/JavaScriptCore/wasm/WasmSectionParser.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 (269728 => 269729)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/JSTests/ChangeLog  2020-11-12 11:25:22 UTC (rev 269728)
+++ trunk/JSTests/ChangeLog     2020-11-12 11:59:44 UTC (rev 269729)
</span><span class="lines">@@ -1,3 +1,36 @@
</span><ins>+2020-11-12  Dmitry Bezhetskov  <dbezhetskov@igalia.com>
+
+        [WASM-References] Support imm for ref.null
+        https://bugs.webkit.org/show_bug.cgi?id=218744
+
+        Reviewed by Yusuke Suzuki.
+        
+        Updated the Builder DSL and spec tests for ref.null extern/funcref.
+        Spec is here - https://webassembly.github.io/reference-types/core/.
+
+        * wasm/Builder.js:
+        (export.default.Builder.prototype._registerSectionBuilders.const.section.in.WASM.description.section.switch.section.case.string_appeared_here.this.section):
+        * wasm/Builder_WebAssemblyBinary.js:
+        (const.putInitExpr):
+        * wasm/LowLevelBinary.js:
+        (export.default.LowLevelBinary.prototype.ref_type):
+        * wasm/WASM.js:
+        * wasm/references-spec-tests/ref_is_null.js:
+        * wasm/references-spec-tests/ref_null.js:
+        * wasm/references/externref_globals.js:
+        * wasm/references/externref_modules.js:
+        * wasm/references/externref_table.js:
+        * wasm/references/externref_table_import.js:
+        (makeImport):
+        (string_appeared_here.fullGC.assert.eq.1.exports.get_tbl.makeImport):
+        (string_appeared_here.fullGC.assert.eq.1.exports.get_tbl):
+        * wasm/references/func_ref.js:
+        (assert.eq.instance.exports.fix):
+        * wasm/references/is_null.js:
+        (checkRefNullWithI32ImmType):
+        * wasm/references/multitable.js:
+        * wasm/wasm.json:
+
</ins><span class="cx"> 2020-11-12  Angelos Oikonomopoulos  <angelos@igalia.com>
</span><span class="cx"> 
</span><span class="cx">         [JSC] Skip stress/lars-sab-workers.js on arm32
</span></span></pre></div>
<a id="trunkJSTestswasmBuilderjs"></a>
<div class="modfile"><h4>Modified: trunk/JSTests/wasm/Builder.js (269728 => 269729)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/JSTests/wasm/Builder.js    2020-11-12 11:25:22 UTC (rev 269728)
+++ trunk/JSTests/wasm/Builder.js       2020-11-12 11:59:44 UTC (rev 269729)
</span><span class="lines">@@ -307,6 +307,9 @@
</span><span class="cx">         case "target_table": break; // improve checking https://bugs.webkit.org/show_bug.cgi?id=163421
</span><span class="cx">         case "reserved": break; // improve checking https://bugs.webkit.org/show_bug.cgi?id=163421
</span><span class="cx">         case "table_index": break; // improve checking https://bugs.webkit.org/show_bug.cgi?id=163421
</span><ins>+        case "reftype":
+            assert.truthy(WASM.isValidRefType(imms[idx]), `Invalid ref type on ${op}: "${imms[idx]}"`);
+            break;
</ins><span class="cx">         default: throw new Error(`Implementation problem: unhandled immediate "${expect.name}" on "${op}"`);
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="lines">@@ -542,7 +545,7 @@
</span><span class="cx">                             return _errorHandlingProxyFor(globalBuilder);
</span><span class="cx">                         },
</span><span class="cx">                         RefNull: (type, mutability) => {
</span><del>-                            s.data.push({ type, op: "ref.null", mutability: _normalizeMutability(mutability) });
</del><ins>+                            s.data.push({ type, op: "ref.null", mutability: _normalizeMutability(mutability), reftype: type});
</ins><span class="cx">                             return _errorHandlingProxyFor(globalBuilder);
</span><span class="cx">                         }
</span><span class="cx">                     };
</span></span></pre></div>
<a id="trunkJSTestswasmBuilder_WebAssemblyBinaryjs"></a>
<div class="modfile"><h4>Modified: trunk/JSTests/wasm/Builder_WebAssemblyBinary.js (269728 => 269729)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/JSTests/wasm/Builder_WebAssemblyBinary.js  2020-11-12 11:25:22 UTC (rev 269728)
+++ trunk/JSTests/wasm/Builder_WebAssemblyBinary.js     2020-11-12 11:59:44 UTC (rev 269729)
</span><span class="lines">@@ -93,7 +93,7 @@
</span><span class="cx"> 
</span><span class="cx"> const putInitExpr = (bin, expr) => {
</span><span class="cx">     if (expr.op == "ref.null")
</span><del>-        putOp(bin, { value: WASM.description.opcode[expr.op].value, name: expr.op, immediates: [], arguments: [] });
</del><ins>+        putOp(bin, { value: WASM.description.opcode[expr.op].value, name: expr.op, immediates: [expr.reftype], arguments: [] });
</ins><span class="cx">     else
</span><span class="cx">         putOp(bin, { value: WASM.description.opcode[expr.op].value, name: expr.op, immediates: [expr.initValue], arguments: [] });
</span><span class="cx">     putOp(bin, { value: WASM.description.opcode.end.value, name: "end", immediates: [], arguments: [] });
</span></span></pre></div>
<a id="trunkJSTestswasmLowLevelBinaryjs"></a>
<div class="modfile"><h4>Modified: trunk/JSTests/wasm/LowLevelBinary.js (269728 => 269729)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/JSTests/wasm/LowLevelBinary.js     2020-11-12 11:25:22 UTC (rev 269728)
+++ trunk/JSTests/wasm/LowLevelBinary.js        2020-11-12 11:59:44 UTC (rev 269729)
</span><span class="lines">@@ -202,6 +202,11 @@
</span><span class="cx">             throw new Error(`Invalid block type ${v}`);
</span><span class="cx">         this.varint7(WASM.typeValue[v]);
</span><span class="cx">     }
</span><ins>+    ref_type(v) {
+        if (!WASM.isValidRefType(v))
+            throw new Error(`Invalid elem type ${v}`);
+        this.varint7(WASM.typeValue[v]);
+    }
</ins><span class="cx">     string(str) {
</span><span class="cx">         let patch = this.newPatchable("varuint32");
</span><span class="cx">         for (const char of str) {
</span></span></pre></div>
<a id="trunkJSTestswasmWASMjs"></a>
<div class="modfile"><h4>Modified: trunk/JSTests/wasm/WASM.js (269728 => 269729)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/JSTests/wasm/WASM.js       2020-11-12 11:25:22 UTC (rev 269728)
+++ trunk/JSTests/wasm/WASM.js  2020-11-12 11:59:44 UTC (rev 269729)
</span><span class="lines">@@ -41,6 +41,8 @@
</span><span class="cx"> export const isValidValueType = v => _valueTypeSet.has(v);
</span><span class="cx"> const _blockTypeSet = new Set(description.block_type);
</span><span class="cx"> export const isValidBlockType = v => _blockTypeSet.has(v);
</span><ins>+const _refTypeSet = new Set(description.ref_type);
+export const isValidRefType = v => _refTypeSet.has(v);
</ins><span class="cx"> export const externalKindValue = _mapValues(description.external_kind);
</span><span class="cx"> export const sections = Object.keys(description.section);
</span><span class="cx"> export const sectionEncodingType = description.section[sections[0]].type;
</span></span></pre></div>
<a id="trunkJSTestswasmreferencesexternref_globalsjs"></a>
<div class="modfile"><h4>Modified: trunk/JSTests/wasm/references/externref_globals.js (269728 => 269729)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/JSTests/wasm/references/externref_globals.js       2020-11-12 11:25:22 UTC (rev 269728)
+++ trunk/JSTests/wasm/references/externref_globals.js  2020-11-12 11:59:44 UTC (rev 269729)
</span><span class="lines">@@ -41,7 +41,7 @@
</span><span class="cx">         .End()
</span><span class="cx"> 
</span><span class="cx">         .Function("set_glob_null", { params: [], ret: "void" })
</span><del>-            .RefNull()
</del><ins>+            .RefNull("externref")
</ins><span class="cx">             .Call(0)
</span><span class="cx">         .End()
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkJSTestswasmreferencesexternref_modulesjs"></a>
<div class="modfile"><h4>Modified: trunk/JSTests/wasm/references/externref_modules.js (269728 => 269729)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/JSTests/wasm/references/externref_modules.js       2020-11-12 11:25:22 UTC (rev 269728)
+++ trunk/JSTests/wasm/references/externref_modules.js  2020-11-12 11:59:44 UTC (rev 269729)
</span><span class="lines">@@ -17,7 +17,7 @@
</span><span class="cx">         .End()
</span><span class="cx"> 
</span><span class="cx">         .Function("i", { params: [], ret: "externref" })
</span><del>-            .RefNull()
</del><ins>+            .RefNull("externref")
</ins><span class="cx">             .Call(0)
</span><span class="cx">         .End()
</span><span class="cx"> 
</span><span class="lines">@@ -27,7 +27,7 @@
</span><span class="cx">         .End()
</span><span class="cx"> 
</span><span class="cx">         .Function("k", { params: [], ret: "i32" })
</span><del>-            .RefNull()
</del><ins>+            .RefNull("externref")
</ins><span class="cx">             .RefIsNull()
</span><span class="cx">         .End()
</span><span class="cx">       .End().WebAssembly().get()));
</span><span class="lines">@@ -62,12 +62,12 @@
</span><span class="cx">         .End()
</span><span class="cx"> 
</span><span class="cx">         .Function("call_h_null", { params: [], ret: "externref" })
</span><del>-          .RefNull()
</del><ins>+          .RefNull("externref")
</ins><span class="cx">           .Call(0)
</span><span class="cx">         .End()
</span><span class="cx"> 
</span><span class="cx">         .Function("call_j_null", { params: [], ret: "i32" })
</span><del>-          .RefNull()
</del><ins>+          .RefNull("externref")
</ins><span class="cx">           .Call(1)
</span><span class="cx">         .End()
</span><span class="cx"> 
</span><span class="lines">@@ -86,7 +86,7 @@
</span><span class="cx">         .End()
</span><span class="cx"> 
</span><span class="cx">         .Function("call_ident_null", { params: [], ret: "externref" })
</span><del>-          .RefNull()
</del><ins>+          .RefNull("externref")
</ins><span class="cx">           .Call(2)
</span><span class="cx">         .End()
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkJSTestswasmreferencesexternref_tablejs"></a>
<div class="modfile"><h4>Modified: trunk/JSTests/wasm/references/externref_table.js (269728 => 269729)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/JSTests/wasm/references/externref_table.js 2020-11-12 11:25:22 UTC (rev 269728)
+++ trunk/JSTests/wasm/references/externref_table.js    2020-11-12 11:59:44 UTC (rev 269729)
</span><span class="lines">@@ -33,7 +33,7 @@
</span><span class="cx">         .End()
</span><span class="cx"> 
</span><span class="cx">         .Function("set_tbl_null", { params: [], ret: "void" })
</span><del>-            .RefNull()
</del><ins>+            .RefNull("externref")
</ins><span class="cx">             .Call(0)
</span><span class="cx">         .End()
</span><span class="cx">       .End().WebAssembly().get()));
</span></span></pre></div>
<a id="trunkJSTestswasmreferencesexternref_table_importjs"></a>
<div class="modfile"><h4>Modified: trunk/JSTests/wasm/references/externref_table_import.js (269728 => 269729)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/JSTests/wasm/references/externref_table_import.js  2020-11-12 11:25:22 UTC (rev 269728)
+++ trunk/JSTests/wasm/references/externref_table_import.js     2020-11-12 11:59:44 UTC (rev 269729)
</span><span class="lines">@@ -37,7 +37,7 @@
</span><span class="cx">             .End()
</span><span class="cx"> 
</span><span class="cx">             .Function("set_tbl_null", { params: [], ret: "void" })
</span><del>-                .RefNull()
</del><ins>+                .RefNull("externref")
</ins><span class="cx">                 .Call(0)
</span><span class="cx">             .End()
</span><span class="cx">           .End().WebAssembly().get()), { imp: { tbl }});
</span><span class="lines">@@ -103,7 +103,7 @@
</span><span class="cx">             .End()
</span><span class="cx"> 
</span><span class="cx">             .Function("set_tbl_null", { params: [], ret: "void" })
</span><del>-                .RefNull()
</del><ins>+                .RefNull("externref")
</ins><span class="cx">                 .Call(0)
</span><span class="cx">             .End()
</span><span class="cx">           .End().WebAssembly().get()), { imp: { tbl: new WebAssembly.Table({initial:2, element:"externref"}) }});
</span><span class="lines">@@ -142,7 +142,7 @@
</span><span class="cx">             .End()
</span><span class="cx"> 
</span><span class="cx">             .Function("set_tbl_null", { params: [], ret: "void" })
</span><del>-                .RefNull()
</del><ins>+                .RefNull("externref")
</ins><span class="cx">                 .Call(0)
</span><span class="cx">             .End()
</span><span class="cx">           .End().WebAssembly().get()), { imp: { tbl: $1.exports.tbl }});
</span></span></pre></div>
<a id="trunkJSTestswasmreferencesfunc_refjs"></a>
<div class="modfile"><h4>Modified: trunk/JSTests/wasm/references/func_ref.js (269728 => 269729)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/JSTests/wasm/references/func_ref.js        2020-11-12 11:25:22 UTC (rev 269728)
+++ trunk/JSTests/wasm/references/func_ref.js   2020-11-12 11:59:44 UTC (rev 269729)
</span><span class="lines">@@ -203,7 +203,7 @@
</span><span class="cx">         .End()
</span><span class="cx"> 
</span><span class="cx">         .Function("set_glob_null", { params: [], ret: "void" })
</span><del>-            .RefNull()
</del><ins>+            .RefNull("funcref")
</ins><span class="cx">             .Call(0)
</span><span class="cx">         .End()
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkJSTestswasmreferencesis_nulljs"></a>
<div class="modfile"><h4>Modified: trunk/JSTests/wasm/references/is_null.js (269728 => 269729)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/JSTests/wasm/references/is_null.js 2020-11-12 11:25:22 UTC (rev 269728)
+++ trunk/JSTests/wasm/references/is_null.js    2020-11-12 11:59:44 UTC (rev 269729)
</span><span class="lines">@@ -2,6 +2,21 @@
</span><span class="cx"> import * as assert from '../assert.js';
</span><span class="cx"> import Builder from '../Builder.js';
</span><span class="cx"> 
</span><ins>+function checkRefNullWithI32ImmType() {
+  /*
+  (module
+    (func (export "r") (result i32)
+      ref.null i32
+      ref.is_null
+    )
+  )
+  */
+  let bytes = Uint8Array.from([0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00, 0x01, 0x05, 0x01, 0x60, 0x00, 0x01, 0x7f, 0x03, 0x02, 0x01, 0x00, 0x07, 0x05, 0x01, 0x01, 0x72, 0x00, 0x00, 0x0a, 0x07, 0x01, 0x05, 0x00, 0xd0, 0x7f, 0xd1, 0x0b]);
+  assert.throws(() => new WebAssembly.Module(bytes), Error, "WebAssembly.Module doesn't parse at byte 3: ref.null type must be a reference type, in function at index 0 (evaluating 'new WebAssembly.Module(bytes)')");
+}
+
+checkRefNullWithI32ImmType();
+
</ins><span class="cx"> const builder = (new Builder())
</span><span class="cx">       .Type().End()
</span><span class="cx">       .Function().End()
</span><span class="lines">@@ -20,7 +35,7 @@
</span><span class="cx">         .End()
</span><span class="cx"> 
</span><span class="cx">         .Function("i", { params: [], ret: "externref" })
</span><del>-            .RefNull()
</del><ins>+            .RefNull("externref")
</ins><span class="cx">             .Call(0)
</span><span class="cx">         .End()
</span><span class="cx"> 
</span><span class="lines">@@ -30,7 +45,7 @@
</span><span class="cx">         .End()
</span><span class="cx"> 
</span><span class="cx">         .Function("k", { params: [], ret: "i32" })
</span><del>-            .RefNull()
</del><ins>+            .RefNull("externref")
</ins><span class="cx">             .RefIsNull()
</span><span class="cx">         .End()
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkJSTestswasmreferencesmultitablejs"></a>
<div class="modfile"><h4>Modified: trunk/JSTests/wasm/references/multitable.js (269728 => 269729)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/JSTests/wasm/references/multitable.js      2020-11-12 11:25:22 UTC (rev 269728)
+++ trunk/JSTests/wasm/references/multitable.js 2020-11-12 11:59:44 UTC (rev 269729)
</span><span class="lines">@@ -330,7 +330,7 @@
</span><span class="cx">           .Code()
</span><span class="cx">             .Function("fun", { params: [], ret: "void" })
</span><span class="cx">               .I32Const(0)
</span><del>-              .RefNull()
</del><ins>+              .RefNull("externref")
</ins><span class="cx">               .TableSet(2)
</span><span class="cx">             .End()
</span><span class="cx">           .End().WebAssembly().get())), Error, "WebAssembly.Module doesn't validate: table index 2 is invalid, limit is 2, in function at index 0 (evaluating 'new WebAssembly.Module')")
</span><span class="lines">@@ -370,7 +370,7 @@
</span><span class="cx">           .End()
</span><span class="cx">           .Code()
</span><span class="cx">             .Function("fun", { params: [], ret: "void" })
</span><del>-              .RefNull()
</del><ins>+              .RefNull("funcref")
</ins><span class="cx">               .TableGet(0)
</span><span class="cx">             .End()
</span><span class="cx">           .End().WebAssembly().get())), Error, "WebAssembly.Module doesn't validate: table.get index to type Funcref expected I32, in function at index 0 (evaluating 'new WebAssembly.Module')")
</span><span class="lines">@@ -385,8 +385,8 @@
</span><span class="cx">           .End()
</span><span class="cx">           .Code()
</span><span class="cx">             .Function("fun", { params: [], ret: "void" })
</span><del>-              .RefNull()
-              .RefNull()
</del><ins>+              .RefNull("funcref")
+              .RefNull("funcref")
</ins><span class="cx">               .TableSet(0)
</span><span class="cx">             .End()
</span><span class="cx">           .End().WebAssembly().get())), Error, "WebAssembly.Module doesn't validate: table.set index to type Funcref expected I32, in function at index 0 (evaluating 'new WebAssembly.Module')")
</span></span></pre></div>
<a id="trunkJSTestswasmreferencesspectestsref_is_nulljs"></a>
<div class="modfile"><h4>Modified: trunk/JSTests/wasm/references-spec-tests/ref_is_null.js (269728 => 269729)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/JSTests/wasm/references-spec-tests/ref_is_null.js  2020-11-12 11:25:22 UTC (rev 269728)
+++ trunk/JSTests/wasm/references-spec-tests/ref_is_null.js     2020-11-12 11:59:44 UTC (rev 269729)
</span><span class="lines">@@ -172,43 +172,49 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> // ref_is_null.wast:1
</span><del>-let $1 = instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x97\x80\x80\x80\x00\x05\x60\x01\x6f\x01\x7f\x60\x01\x70\x01\x7f\x60\x00\x00\x60\x01\x6f\x00\x60\x01\x7f\x01\x7f\x03\x88\x80\x80\x80\x00\x07\x00\x01\x02\x03\x02\x04\x04\x04\x87\x80\x80\x80\x00\x02\x6f\x00\x02\x70\x00\x02\x07\xc1\x80\x80\x80\x00\x06\x06\x61\x6e\x79\x72\x65\x66\x00\x00\x07\x66\x75\x6e\x63\x72\x65\x66\x00\x01\x04\x69\x6e\x69\x74\x00\x03\x06\x64\x65\x69\x6e\x69\x74\x00\x04\x0b\x61\x6e\x79\x72\x65\x66\x2d\x65\x6c\x65\x6d\x00\x05\x0c\x66\x75\x6e\x63\x72\x65\x66\x2d\x65\x6c\x65\x6d\x00\x06\x09\x88\x80\x80\x80\x00\x01\x02\x01\x41\x01\x0b\x01\x02\x0a\xd4\x80\x80\x80\x00\x07\x85\x80\x80\x80\x00\x00\x20\x00\xd1\x0b\x85\x80\x80\x80\x00\x00\x20\x00\xd1\x0b\x82\x80\x80\x80\x00\x00\x0b\x88\x80\x80\x80\x00\x00\x41\x01\x20\x00\x26\x00\x0b\x8c\x80\x80\x80\x00\x00\x41\x01\xd0\x26\x00\x41\x01\xd0\x26\x01\x0b\x88\x80\x80\x80\x00\x00\x20\x00\x25\x00\x10\x00\x0b\x88\x80\x80\x80\x00\x00\x20\x00\x25\x01\x10\x01\x0b&quot
 ;);
</del><ins>+let $1 = instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x97\x80\x80\x80\x00\x05\x60\x01\x70\x01\x7f\x60\x01\x6f\x01\x7f\x60\x00\x00\x60\x01\x6f\x00\x60\x01\x7f\x01\x7f\x03\x88\x80\x80\x80\x00\x07\x00\x01\x02\x03\x02\x04\x04\x04\x87\x80\x80\x80\x00\x02\x70\x00\x02\x6f\x00\x02\x07\xc7\x80\x80\x80\x00\x06\x07\x66\x75\x6e\x63\x72\x65\x66\x00\x00\x09\x65\x78\x74\x65\x72\x6e\x72\x65\x66\x00\x01\x04\x69\x6e\x69\x74\x00\x03\x06\x64\x65\x69\x6e\x69\x74\x00\x04\x0c\x66\x75\x6e\x63\x72\x65\x66\x2d\x65\x6c\x65\x6d\x00\x05\x0e\x65\x78\x74\x65\x72\x6e\x72\x65\x66\x2d\x65\x6c\x65\x6d\x00\x06\x09\x87\x80\x80\x80\x00\x01\x00\x41\x01\x0b\x01\x02\x0a\xd6\x80\x80\x80\x00\x07\x85\x80\x80\x80\x00\x00\x20\x00\xd1\x0b\x85\x80\x80\x80\x00\x00\x20\x00\xd1\x0b\x82\x80\x80\x80\x00\x00\x0b\x88\x80\x80\x80\x00\x00\x41\x01\x20\x00\x26\x01\x0b\x8e\x80\x80\x80\x00\x00\x41\x01\xd0\x70\x26\x00\x41\x01\xd0\x6f\x26\x01\x0b\x88\x80\x80\x80\x00\x00\x20\x00\x25\x00\x10\x00\x0b\x88\x80\x80\x80\x00\x00\x20\x
 00\x25\x01\x10\x01\x0b");
</ins><span class="cx"> 
</span><del>-// ref_is_null.wast:29
-assert_return(() => call($1, "anyref", [null]), 1);
-
</del><span class="cx"> // ref_is_null.wast:30
</span><span class="cx"> assert_return(() => call($1, "funcref", [null]), 1);
</span><span class="cx"> 
</span><del>-// ref_is_null.wast:32
-assert_return(() => call($1, "anyref", [hostref(1)]), 0);
</del><ins>+// ref_is_null.wast:31
+assert_return(() => call($1, "externref", [null]), 1);
</ins><span class="cx"> 
</span><del>-// ref_is_null.wast:34
</del><ins>+// ref_is_null.wast:33
+assert_return(() => call($1, "externref", [hostref(1)]), 0);
+
+// ref_is_null.wast:35
</ins><span class="cx"> run(() => call($1, "init", [hostref(0)]));
</span><span class="cx"> 
</span><del>-// ref_is_null.wast:36
-assert_return(() => call($1, "anyref-elem", [0]), 1);
-
</del><span class="cx"> // ref_is_null.wast:37
</span><span class="cx"> assert_return(() => call($1, "funcref-elem", [0]), 1);
</span><span class="cx"> 
</span><del>-// ref_is_null.wast:39
-assert_return(() => call($1, "anyref-elem", [1]), 0);
</del><ins>+// ref_is_null.wast:38
+assert_return(() => call($1, "externref-elem", [0]), 1);
</ins><span class="cx"> 
</span><span class="cx"> // ref_is_null.wast:40
</span><span class="cx"> assert_return(() => call($1, "funcref-elem", [1]), 0);
</span><span class="cx"> 
</span><del>-// ref_is_null.wast:42
</del><ins>+// ref_is_null.wast:41
+assert_return(() => call($1, "externref-elem", [1]), 0);
+
+// ref_is_null.wast:43
</ins><span class="cx"> run(() => call($1, "deinit", []));
</span><span class="cx"> 
</span><del>-// ref_is_null.wast:44
-assert_return(() => call($1, "anyref-elem", [0]), 1);
-
</del><span class="cx"> // ref_is_null.wast:45
</span><span class="cx"> assert_return(() => call($1, "funcref-elem", [0]), 1);
</span><span class="cx"> 
</span><del>-// ref_is_null.wast:47
-assert_return(() => call($1, "anyref-elem", [1]), 1);
</del><ins>+// ref_is_null.wast:46
+assert_return(() => call($1, "externref-elem", [0]), 1);
</ins><span class="cx"> 
</span><span class="cx"> // ref_is_null.wast:48
</span><span class="cx"> assert_return(() => call($1, "funcref-elem", [1]), 1);
</span><ins>+
+// ref_is_null.wast:49
+assert_return(() => call($1, "externref-elem", [1]), 1);
+
+// ref_is_null.wast:51
+assert_invalid("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x85\x80\x80\x80\x00\x01\x60\x01\x7f\x00\x03\x82\x80\x80\x80\x00\x01\x00\x0a\x8b\x80\x80\x80\x00\x01\x85\x80\x80\x80\x00\x00\x20\x00\xd1\x0b");
+
+// ref_is_null.wast:55
+assert_invalid("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x84\x80\x80\x80\x00\x01\x60\x00\x00\x03\x82\x80\x80\x80\x00\x01\x00\x0a\x89\x80\x80\x80\x00\x01\x83\x80\x80\x80\x00\x00\xd1\x0b");
</ins></span></pre></div>
<a id="trunkJSTestswasmreferencesspectestsref_nulljs"></a>
<div class="modfile"><h4>Modified: trunk/JSTests/wasm/references-spec-tests/ref_null.js (269728 => 269729)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/JSTests/wasm/references-spec-tests/ref_null.js     2020-11-12 11:25:22 UTC (rev 269728)
+++ trunk/JSTests/wasm/references-spec-tests/ref_null.js        2020-11-12 11:59:44 UTC (rev 269729)
</span><span class="lines">@@ -175,10 +175,10 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> // ref_null.wast:1
</span><del>-let $1 = instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x89\x80\x80\x80\x00\x02\x60\x00\x01\x6f\x60\x00\x01\x70\x03\x83\x80\x80\x80\x00\x02\x00\x01\x06\x89\x80\x80\x80\x00\x02\x6f\x00\xd0\x0b\x70\x00\xd0\x0b\x07\x94\x80\x80\x80\x00\x02\x06\x61\x6e\x79\x72\x65\x66\x00\x00\x07\x66\x75\x6e\x63\x72\x65\x66\x00\x01\x0a\x91\x80\x80\x80\x00\x02\x83\x80\x80\x80\x00\x00\xd0\x0b\x83\x80\x80\x80\x00\x00\xd0\x0b");
</del><ins>+let $1 = instance("\x00\x61\x73\x6d\x01\x00\x00\x00\x01\x89\x80\x80\x80\x00\x02\x60\x00\x01\x6f\x60\x00\x01\x70\x03\x83\x80\x80\x80\x00\x02\x00\x01\x06\x8b\x80\x80\x80\x00\x02\x6f\x00\xd0\x6f\x0b\x70\x00\xd0\x70\x0b\x07\x97\x80\x80\x80\x00\x02\x09\x65\x78\x74\x65\x72\x6e\x72\x65\x66\x00\x00\x07\x66\x75\x6e\x63\x72\x65\x66\x00\x01\x0a\x93\x80\x80\x80\x00\x02\x84\x80\x80\x80\x00\x00\xd0\x6f\x0b\x84\x80\x80\x80\x00\x00\xd0\x70\x0b");
</ins><span class="cx"> 
</span><span class="cx"> // ref_null.wast:9
</span><del>-assert_return(() => call($1, "anyref", []), null);
</del><ins>+assert_return(() => call($1, "externref", []), null);
</ins><span class="cx"> 
</span><span class="cx"> // ref_null.wast:10
</span><span class="cx"> assert_return(() => call($1, "funcref", []), null);
</span></span></pre></div>
<a id="trunkJSTestswasmwasmjson"></a>
<div class="modfile"><h4>Modified: trunk/JSTests/wasm/wasm.json (269728 => 269729)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/JSTests/wasm/wasm.json     2020-11-12 11:25:22 UTC (rev 269728)
+++ trunk/JSTests/wasm/wasm.json        2020-11-12 11:59:44 UTC (rev 269729)
</span><span class="lines">@@ -18,7 +18,7 @@
</span><span class="cx">     },
</span><span class="cx">     "value_type": ["i32", "i64", "f32", "f64", "externref", "funcref"],
</span><span class="cx">     "block_type": ["i32", "i64", "f32", "f64", "void", "externref", "funcref"],
</span><del>-    "elem_type": ["funcref","externref"],
</del><ins>+    "ref_type": ["funcref","externref"],
</ins><span class="cx">     "external_kind": {
</span><span class="cx">         "Function": { "type": "uint8", "value": 0 },
</span><span class="cx">         "Table":    { "type": "uint8", "value": 1 },
</span><span class="lines">@@ -39,188 +39,188 @@
</span><span class="cx">         "Data":     { "type": "varuint7", "value": 11, "description": "Data segments" }
</span><span class="cx">     },
</span><span class="cx">     "opcode": {
</span><del>-        "unreachable":         { "category": "control",    "value":   0, "return": [],              "parameter": [],                             "immediate": [],                                                                                            "description": "trap immediately" },
-        "block":               { "category": "control",    "value":   2, "return": ["control"],     "parameter": [],                             "immediate": [{"name": "sig", "type": "block_type"}],                                                       "description": "begin a sequence of expressions, yielding 0 or 1 values" },
-        "loop":                { "category": "control",    "value":   3, "return": ["control"],     "parameter": [],                             "immediate": [{"name": "sig", "type": "block_type"}],                                                       "description": "begin a block which can also form control flow loops" },
-        "if":                  { "category": "control",    "value":   4, "return": ["control"],     "parameter": ["bool"],                       "immediate": [{"name": "sig", "type": "block_type"}],                                                       "description": "begin if expression" },
-        "else":                { "category": "control",    "value":   5, "return": ["control"],     "parameter": [],                             "immediate": [],                                                                                            "description": "begin else expression of if" },
-        "select":              { "category": "control",    "value":  27, "return": ["prev"],        "parameter": ["any", "prev", "bool"],        "immediate": [],                                                                                            "description": "select one of two values based on condition" },
-        "br":                  { "category": "control",    "value":  12, "return": [],              "parameter": [],                             "immediate": [{"name": "relative_depth", "type": "varuint32"}],                                             "description": "break that targets an outer nested block" },
-        "br_if":               { "category": "control",    "value":  13, "return": [],              "parameter": [],                             "immediate": [{"name": "relative_depth", "type": "varuint32"}],                                             "description": "conditional break that targets an outer nested block" },
-        "br_table":            { "category": "control",    "value":  14, "return": [],              "parameter": [],                             "immediate": [{"name": "target_count",   "type": "varuint32",                                               "description": "number of entries in the target_table"},
-                                                                                                                                                               {"name": "target_table",   "type": "varuint32*",                                              "description": "target entries that indicate an outer block or loop to which to break"},
-                                                                                                                                                               {"name": "default_target", "type": "varuint32",                                               "description": "an outer block or loop to which to break in the default case"}],
-                                                                                                                                                                                                                                                             "description": "branch table control flow construct" },
-        "return":              { "category": "control",    "value":  15, "return": [],              "parameter": [],                             "immediate": [],                                                                                            "description": "return zero or one value from this function" },
-        "drop":                { "category": "control",    "value":  26, "return": [],              "parameter": ["any"],                        "immediate": [],                                                                                            "description": "ignore value" },
-        "nop":                 { "category": "control",    "value":   1, "return": [],              "parameter": [],                             "immediate": [],                                                                                            "description": "no operation" },
-        "end":                 { "category": "control",    "value":  11, "return": [],              "parameter": [],                             "immediate": [],                                                                                            "description": "end a block, loop, or if" },
-        "i32.const":           { "category": "special",    "value":  65, "return": ["i32"],         "parameter": [],                             "immediate": [{"name": "value",          "type": "varint32"}],                                              "description": "a constant value interpreted as i32" },
-        "i64.const":           { "category": "special",    "value":  66, "return": ["i64"],         "parameter": [],                             "immediate": [{"name": "value",          "type": "varint64"}],                                              "description": "a constant value interpreted as i64" },
-        "f64.const":           { "category": "special",    "value":  68, "return": ["f64"],         "parameter": [],                             "immediate": [{"name": "value",          "type": "double"}],                                                "description": "a constant value interpreted as f64" },
-        "f32.const":           { "category": "special",    "value":  67, "return": ["f32"],         "parameter": [],                             "immediate": [{"name": "value",          "type": "float"}],                                                 "description": "a constant value interpreted as f32" },
-        "ref.null":            { "category": "special",    "value": 208, "return": ["funcref"],     "parameter": [],                             "immediate": [],                                                                                            "description": "a constant null reference" },
-        "ref.is_null":         { "category": "special",    "value": 209, "return": ["i32"],         "parameter": ["externref"],                  "immediate": [],                                                                                            "description": "determine if a reference is null" },
-        "ref.func":            { "category": "special",    "value": 210, "return": ["funcref"],     "parameter": [],                             "immediate": [{"name": "function_index", "type": "varuint32"}],                                             "description": "return a reference to the function at the given index" },
-        "get_local":           { "category": "special",    "value":  32, "return": ["any"],         "parameter": [],                             "immediate": [{"name": "local_index",    "type": "varuint32"}],                                             "description": "read a local variable or parameter" },
-        "set_local":           { "category": "special",    "value":  33, "return": [],              "parameter": ["any"],                        "immediate": [{"name": "local_index",    "type": "varuint32"}],                                             "description": "write a local variable or parameter" },
-        "tee_local":           { "category": "special",    "value":  34, "return": ["any"],         "parameter": ["any"],                        "immediate": [{"name": "local_index",    "type": "varuint32"}],                                             "description": "write a local variable or parameter and return the same value" },
-        "get_global":          { "category": "special",    "value":  35, "return": ["any"],         "parameter": [],                             "immediate": [{"name": "global_index",   "type": "varuint32"}],                                             "description": "read a global variable" },
-        "set_global":          { "category": "special",    "value":  36, "return": [],              "parameter": ["any"],                        "immediate": [{"name": "global_index",   "type": "varuint32"}],                                             "description": "write a global variable" },
-        "table.get":           { "category": "special",    "value":  37, "return": ["externref"],   "parameter": ["i32"],                        "immediate": [{"name": "table_index",    "type": "varuint32"}],                                             "description": "get a table value" },
-        "table.set":           { "category": "special",    "value":  38, "return": [],              "parameter": ["i32", "externref"],           "immediate": [{"name": "table_index",    "type": "varuint32"}],                                             "description": "set a table value" },
-        "table.size":          { "category": "exttable",   "value":  252, "return": ["i32"],        "parameter": [],                             "immediate": [{"name": "table_index",    "type": "varuint32"}],                                             "description": "get the size of a table", "extendedOp": 15 },
-        "table.grow":          { "category": "exttable",   "value":  252, "return": ["i32"],        "parameter": ["externref", "i32"],           "immediate": [{"name": "table_index",    "type": "varuint32"}],                                             "description": "grow a table by the given delta and return the previous size, or -1 if enough space cannot be allocated", "extendedOp": 16 },
-        "table.fill":          { "category": "exttable",   "value":  252, "return": ["i32"],        "parameter": ["i32", "externref", "i32"],    "immediate": [{"name": "table_index",    "type": "varuint32"}],                                             "description": "fill entries [i,i+n) with the given value", "extendedOp": 17 },
-        "call":                { "category": "call",       "value":  16, "return": ["call"],        "parameter": ["call"],                       "immediate": [{"name": "function_index", "type": "varuint32"}],                                             "description": "call a function by its index" },
-        "call_indirect":       { "category": "call",       "value":  17, "return": ["call"],        "parameter": ["call"],                       "immediate": [{"name": "type_index",     "type": "varuint32"}, {"name": "table_index","type": "varuint32"}],"description": "call a function indirect with an expected signature" },
-        "i32.load8_s":         { "category": "memory",     "value":  44, "return": ["i32"],         "parameter": ["addr"],                       "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "load from memory" },
-        "i32.load8_u":         { "category": "memory",     "value":  45, "return": ["i32"],         "parameter": ["addr"],                       "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "load from memory" },
-        "i32.load16_s":        { "category": "memory",     "value":  46, "return": ["i32"],         "parameter": ["addr"],                       "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "load from memory" },
-        "i32.load16_u":        { "category": "memory",     "value":  47, "return": ["i32"],         "parameter": ["addr"],                       "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "load from memory" },
-        "i64.load8_s":         { "category": "memory",     "value":  48, "return": ["i64"],         "parameter": ["addr"],                       "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "load from memory" },
-        "i64.load8_u":         { "category": "memory",     "value":  49, "return": ["i64"],         "parameter": ["addr"],                       "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "load from memory" },
-        "i64.load16_s":        { "category": "memory",     "value":  50, "return": ["i64"],         "parameter": ["addr"],                       "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "load from memory" },
-        "i64.load16_u":        { "category": "memory",     "value":  51, "return": ["i64"],         "parameter": ["addr"],                       "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "load from memory" },
-        "i64.load32_s":        { "category": "memory",     "value":  52, "return": ["i64"],         "parameter": ["addr"],                       "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "load from memory" },
-        "i64.load32_u":        { "category": "memory",     "value":  53, "return": ["i64"],         "parameter": ["addr"],                       "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "load from memory" },
-        "i32.load":            { "category": "memory",     "value":  40, "return": ["i32"],         "parameter": ["addr"],                       "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "load from memory" },
-        "i64.load":            { "category": "memory",     "value":  41, "return": ["i64"],         "parameter": ["addr"],                       "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "load from memory" },
-        "f32.load":            { "category": "memory",     "value":  42, "return": ["f32"],         "parameter": ["addr"],                       "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "load from memory" },
-        "f64.load":            { "category": "memory",     "value":  43, "return": ["f64"],         "parameter": ["addr"],                       "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "load from memory" },
-        "i32.store8":          { "category": "memory",     "value":  58, "return": [],              "parameter": ["addr", "i32"],                "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "store to memory" },
-        "i32.store16":         { "category": "memory",     "value":  59, "return": [],              "parameter": ["addr", "i32"],                "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "store to memory" },
-        "i64.store8":          { "category": "memory",     "value":  60, "return": [],              "parameter": ["addr", "i64"],                "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "store to memory" },
-        "i64.store16":         { "category": "memory",     "value":  61, "return": [],              "parameter": ["addr", "i64"],                "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "store to memory" },
-        "i64.store32":         { "category": "memory",     "value":  62, "return": [],              "parameter": ["addr", "i64"],                "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "store to memory" },
-        "i32.store":           { "category": "memory",     "value":  54, "return": [],              "parameter": ["addr", "i32"],                "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "store to memory" },
-        "i64.store":           { "category": "memory",     "value":  55, "return": [],              "parameter": ["addr", "i64"],                "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "store to memory" },
-        "f32.store":           { "category": "memory",     "value":  56, "return": [],              "parameter": ["addr", "f32"],                "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "store to memory" },
-        "f64.store":           { "category": "memory",     "value":  57, "return": [],              "parameter": ["addr", "f64"],                "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "store to memory" },
-        "current_memory":      { "category": "operation",  "value":  63, "return": ["size"],        "parameter": [],                             "immediate": [{"name": "flags",          "type": "varuint32"}],                                            "description": "query the size of memory" },
-        "grow_memory":         { "category": "operation",  "value":  64, "return": ["size"],        "parameter": ["size"],                       "immediate": [{"name": "flags",          "type": "varuint32"}],                                            "description": "grow the size of memory" },
-        "i32.add":             { "category": "arithmetic", "value": 106, "return": ["i32"],         "parameter": ["i32", "i32"],                 "immediate": [], "b3op": "Add"          },
-        "i32.sub":             { "category": "arithmetic", "value": 107, "return": ["i32"],         "parameter": ["i32", "i32"],                 "immediate": [], "b3op": "Sub"          },
-        "i32.mul":             { "category": "arithmetic", "value": 108, "return": ["i32"],         "parameter": ["i32", "i32"],                 "immediate": [], "b3op": "Mul"          },
-        "i32.div_s":           { "category": "arithmetic", "value": 109, "return": ["i32"],         "parameter": ["i32", "i32"],                 "immediate": []                         },
-        "i32.div_u":           { "category": "arithmetic", "value": 110, "return": ["i32"],         "parameter": ["i32", "i32"],                 "immediate": []                         },
-        "i32.rem_s":           { "category": "arithmetic", "value": 111, "return": ["i32"],         "parameter": ["i32", "i32"],                 "immediate": []                         },
-        "i32.rem_u":           { "category": "arithmetic", "value": 112, "return": ["i32"],         "parameter": ["i32", "i32"],                 "immediate": []                         },
-        "i32.and":             { "category": "arithmetic", "value": 113, "return": ["i32"],         "parameter": ["i32", "i32"],                 "immediate": [], "b3op": "BitAnd"       },
-        "i32.or":              { "category": "arithmetic", "value": 114, "return": ["i32"],         "parameter": ["i32", "i32"],                 "immediate": [], "b3op": "BitOr"        },
-        "i32.xor":             { "category": "arithmetic", "value": 115, "return": ["i32"],         "parameter": ["i32", "i32"],                 "immediate": [], "b3op": "BitXor"       },
-        "i32.shl":             { "category": "arithmetic", "value": 116, "return": ["i32"],         "parameter": ["i32", "i32"],                 "immediate": [], "b3op": "Shl"          },
-        "i32.shr_u":           { "category": "arithmetic", "value": 118, "return": ["i32"],         "parameter": ["i32", "i32"],                 "immediate": [], "b3op": "ZShr"         },
-        "i32.shr_s":           { "category": "arithmetic", "value": 117, "return": ["i32"],         "parameter": ["i32", "i32"],                 "immediate": [], "b3op": "SShr"         },
-        "i32.rotr":            { "category": "arithmetic", "value": 120, "return": ["i32"],         "parameter": ["i32", "i32"],                 "immediate": [], "b3op": "RotR"         },
-        "i32.rotl":            { "category": "arithmetic", "value": 119, "return": ["i32"],         "parameter": ["i32", "i32"],                 "immediate": [], "b3op": "RotL"         },
-        "i32.eq":              { "category": "comparison", "value":  70, "return": ["bool"],        "parameter": ["i32", "i32"],                 "immediate": [], "b3op": "Equal"        },
-        "i32.ne":              { "category": "comparison", "value":  71, "return": ["bool"],        "parameter": ["i32", "i32"],                 "immediate": [], "b3op": "NotEqual"     },
-        "i32.lt_s":            { "category": "comparison", "value":  72, "return": ["bool"],        "parameter": ["i32", "i32"],                 "immediate": [], "b3op": "LessThan"     },
-        "i32.le_s":            { "category": "comparison", "value":  76, "return": ["bool"],        "parameter": ["i32", "i32"],                 "immediate": [], "b3op": "LessEqual"    },
-        "i32.lt_u":            { "category": "comparison", "value":  73, "return": ["bool"],        "parameter": ["i32", "i32"],                 "immediate": [], "b3op": "Below"        },
-        "i32.le_u":            { "category": "comparison", "value":  77, "return": ["bool"],        "parameter": ["i32", "i32"],                 "immediate": [], "b3op": "BelowEqual"   },
-        "i32.gt_s":            { "category": "comparison", "value":  74, "return": ["bool"],        "parameter": ["i32", "i32"],                 "immediate": [], "b3op": "GreaterThan"  },
-        "i32.ge_s":            { "category": "comparison", "value":  78, "return": ["bool"],        "parameter": ["i32", "i32"],                 "immediate": [], "b3op": "GreaterEqual" },
-        "i32.gt_u":            { "category": "comparison", "value":  75, "return": ["bool"],        "parameter": ["i32", "i32"],                 "immediate": [], "b3op": "Above"        },
-        "i32.ge_u":            { "category": "comparison", "value":  79, "return": ["bool"],        "parameter": ["i32", "i32"],                 "immediate": [], "b3op": "AboveEqual"   },
-        "i32.clz":             { "category": "arithmetic", "value": 103, "return": ["i32"],         "parameter": ["i32"],                        "immediate": [], "b3op": "Clz"          },
-        "i32.ctz":             { "category": "arithmetic", "value": 104, "return": ["i32"],         "parameter": ["i32"],                        "immediate": []                         },
-        "i32.popcnt":          { "category": "arithmetic", "value": 105, "return": ["i32"],         "parameter": ["i32"],                        "immediate": []                         },
-        "i32.eqz":             { "category": "comparison", "value":  69, "return": ["bool"],        "parameter": ["i32"],                        "immediate": [], "b3op": "Equal(i32(0), @0)" },
-        "i64.add":             { "category": "arithmetic", "value": 124, "return": ["i64"],         "parameter": ["i64", "i64"],                 "immediate": [], "b3op": "Add"          },
-        "i64.sub":             { "category": "arithmetic", "value": 125, "return": ["i64"],         "parameter": ["i64", "i64"],                 "immediate": [], "b3op": "Sub"          },
-        "i64.mul":             { "category": "arithmetic", "value": 126, "return": ["i64"],         "parameter": ["i64", "i64"],                 "immediate": [], "b3op": "Mul"          },
-        "i64.div_s":           { "category": "arithmetic", "value": 127, "return": ["i64"],         "parameter": ["i64", "i64"],                 "immediate": []                         },
-        "i64.div_u":           { "category": "arithmetic", "value": 128, "return": ["i64"],         "parameter": ["i64", "i64"],                 "immediate": []                         },
-        "i64.rem_s":           { "category": "arithmetic", "value": 129, "return": ["i64"],         "parameter": ["i64", "i64"],                 "immediate": []                         },
-        "i64.rem_u":           { "category": "arithmetic", "value": 130, "return": ["i64"],         "parameter": ["i64", "i64"],                 "immediate": []                         },
-        "i64.and":             { "category": "arithmetic", "value": 131, "return": ["i64"],         "parameter": ["i64", "i64"],                 "immediate": [], "b3op": "BitAnd"       },
-        "i64.or":              { "category": "arithmetic", "value": 132, "return": ["i64"],         "parameter": ["i64", "i64"],                 "immediate": [], "b3op": "BitOr"        },
-        "i64.xor":             { "category": "arithmetic", "value": 133, "return": ["i64"],         "parameter": ["i64", "i64"],                 "immediate": [], "b3op": "BitXor"       },
-        "i64.shl":             { "category": "arithmetic", "value": 134, "return": ["i64"],         "parameter": ["i64", "i64"],                 "immediate": [], "b3op": "Shl(@0, Trunc(@1))" },
-        "i64.shr_u":           { "category": "arithmetic", "value": 136, "return": ["i64"],         "parameter": ["i64", "i64"],                 "immediate": [], "b3op": "ZShr(@0, Trunc(@1))" },
-        "i64.shr_s":           { "category": "arithmetic", "value": 135, "return": ["i64"],         "parameter": ["i64", "i64"],                 "immediate": [], "b3op": "SShr(@0, Trunc(@1))" },
-        "i64.rotr":            { "category": "arithmetic", "value": 138, "return": ["i64"],         "parameter": ["i64", "i64"],                 "immediate": [], "b3op": "RotR(@0, Trunc(@1))" },
-        "i64.rotl":            { "category": "arithmetic", "value": 137, "return": ["i64"],         "parameter": ["i64", "i64"],                 "immediate": [], "b3op": "RotL(@0, Trunc(@1))" },
-        "i64.eq":              { "category": "comparison", "value":  81, "return": ["bool"],        "parameter": ["i64", "i64"],                 "immediate": [], "b3op": "Equal"        },
-        "i64.ne":              { "category": "comparison", "value":  82, "return": ["bool"],        "parameter": ["i64", "i64"],                 "immediate": [], "b3op": "NotEqual"     },
-        "i64.lt_s":            { "category": "comparison", "value":  83, "return": ["bool"],        "parameter": ["i64", "i64"],                 "immediate": [], "b3op": "LessThan"     },
-        "i64.le_s":            { "category": "comparison", "value":  87, "return": ["bool"],        "parameter": ["i64", "i64"],                 "immediate": [], "b3op": "LessEqual"    },
-        "i64.lt_u":            { "category": "comparison", "value":  84, "return": ["bool"],        "parameter": ["i64", "i64"],                 "immediate": [], "b3op": "Below"        },
-        "i64.le_u":            { "category": "comparison", "value":  88, "return": ["bool"],        "parameter": ["i64", "i64"],                 "immediate": [], "b3op": "BelowEqual"   },
-        "i64.gt_s":            { "category": "comparison", "value":  85, "return": ["bool"],        "parameter": ["i64", "i64"],                 "immediate": [], "b3op": "GreaterThan"  },
-        "i64.ge_s":            { "category": "comparison", "value":  89, "return": ["bool"],        "parameter": ["i64", "i64"],                 "immediate": [], "b3op": "GreaterEqual" },
-        "i64.gt_u":            { "category": "comparison", "value":  86, "return": ["bool"],        "parameter": ["i64", "i64"],                 "immediate": [], "b3op": "Above"        },
-        "i64.ge_u":            { "category": "comparison", "value":  90, "return": ["bool"],        "parameter": ["i64", "i64"],                 "immediate": [], "b3op": "AboveEqual"   },
-        "i64.clz":             { "category": "arithmetic", "value": 121, "return": ["i64"],         "parameter": ["i64"],                        "immediate": [], "b3op": "Clz"          },
-        "i64.ctz":             { "category": "arithmetic", "value": 122, "return": ["i64"],         "parameter": ["i64"],                        "immediate": []                         },
-        "i64.popcnt":          { "category": "arithmetic", "value": 123, "return": ["i64"],         "parameter": ["i64"],                        "immediate": []                         },
-        "i64.eqz":             { "category": "comparison", "value":  80, "return": ["bool"],        "parameter": ["i64"],                        "immediate": [], "b3op": "Equal(i64(0), @0)" },
-        "f32.add":             { "category": "arithmetic", "value": 146, "return": ["f32"],         "parameter": ["f32", "f32"],                 "immediate": [], "b3op": "Add"          },
-        "f32.sub":             { "category": "arithmetic", "value": 147, "return": ["f32"],         "parameter": ["f32", "f32"],                 "immediate": [], "b3op": "Sub"          },
-        "f32.mul":             { "category": "arithmetic", "value": 148, "return": ["f32"],         "parameter": ["f32", "f32"],                 "immediate": [], "b3op": "Mul"          },
-        "f32.div":             { "category": "arithmetic", "value": 149, "return": ["f32"],         "parameter": ["f32", "f32"],                 "immediate": [], "b3op": "Div"          },
-        "f32.min":             { "category": "arithmetic", "value": 150, "return": ["f32"],         "parameter": ["f32", "f32"],                 "immediate": [], "b3op": "Select(Equal(@0, @1), BitOr(@0, @1), Select(LessThan(@0, @1), @0, Select(GreaterThan(@0, @1), @1, Add(@0, @1))))" },
-        "f32.max":             { "category": "arithmetic", "value": 151, "return": ["f32"],         "parameter": ["f32", "f32"],                 "immediate": [], "b3op": "Select(Equal(@0, @1), BitAnd(@0, @1), Select(LessThan(@0, @1), @1, Select(GreaterThan(@0, @1), @0, Add(@0, @1))))" },
-        "f32.abs":             { "category": "arithmetic", "value": 139, "return": ["f32"],         "parameter": ["f32"],                        "immediate": [], "b3op": "Abs"          },
-        "f32.neg":             { "category": "arithmetic", "value": 140, "return": ["f32"],         "parameter": ["f32"],                        "immediate": [], "b3op": "Neg"          },
-        "f32.copysign":        { "category": "arithmetic", "value": 152, "return": ["f32"],         "parameter": ["f32", "f32"],                 "immediate": [], "b3op": "BitwiseCast(BitOr(BitAnd(BitwiseCast(@1), i32(0x80000000)), BitAnd(BitwiseCast(@0), i32(0x7fffffff))))" },
-        "f32.ceil":            { "category": "arithmetic", "value": 141, "return": ["f32"],         "parameter": ["f32"],                        "immediate": [], "b3op": "Ceil"         },
-        "f32.floor":           { "category": "arithmetic", "value": 142, "return": ["f32"],         "parameter": ["f32"],                        "immediate": [], "b3op": "Floor"        },
-        "f32.trunc":           { "category": "arithmetic", "value": 143, "return": ["f32"],         "parameter": ["f32"],                        "immediate": []                         },
-        "f32.nearest":         { "category": "arithmetic", "value": 144, "return": ["f32"],         "parameter": ["f32"],                        "immediate": []                         },
-        "f32.sqrt":            { "category": "arithmetic", "value": 145, "return": ["f32"],         "parameter": ["f32"],                        "immediate": [], "b3op": "Sqrt"         },
-        "f32.eq":              { "category": "comparison", "value":  91, "return": ["bool"],        "parameter": ["f32", "f32"],                 "immediate": [], "b3op": "Equal"        },
-        "f32.ne":              { "category": "comparison", "value":  92, "return": ["bool"],        "parameter": ["f32", "f32"],                 "immediate": [], "b3op": "NotEqual"     },
-        "f32.lt":              { "category": "comparison", "value":  93, "return": ["bool"],        "parameter": ["f32", "f32"],                 "immediate": [], "b3op": "LessThan"     },
-        "f32.le":              { "category": "comparison", "value":  95, "return": ["bool"],        "parameter": ["f32", "f32"],                 "immediate": [], "b3op": "LessEqual"    },
-        "f32.gt":              { "category": "comparison", "value":  94, "return": ["bool"],        "parameter": ["f32", "f32"],                 "immediate": [], "b3op": "GreaterThan"  },
-        "f32.ge":              { "category": "comparison", "value":  96, "return": ["bool"],        "parameter": ["f32", "f32"],                 "immediate": [], "b3op": "GreaterEqual" },
-        "f64.add":             { "category": "arithmetic", "value": 160, "return": ["f64"],         "parameter": ["f64", "f64"],                 "immediate": [], "b3op": "Add"          },
-        "f64.sub":             { "category": "arithmetic", "value": 161, "return": ["f64"],         "parameter": ["f64", "f64"],                 "immediate": [], "b3op": "Sub"          },
-        "f64.mul":             { "category": "arithmetic", "value": 162, "return": ["f64"],         "parameter": ["f64", "f64"],                 "immediate": [], "b3op": "Mul"          },
-        "f64.div":             { "category": "arithmetic", "value": 163, "return": ["f64"],         "parameter": ["f64", "f64"],                 "immediate": [], "b3op": "Div"          },
-        "f64.min":             { "category": "arithmetic", "value": 164, "return": ["f64"],         "parameter": ["f64", "f64"],                 "immediate": [], "b3op": "Select(Equal(@0, @1), BitOr(@0, @1), Select(LessThan(@0, @1), @0, Select(GreaterThan(@0, @1), @1, Add(@0, @1))))" },
-        "f64.max":             { "category": "arithmetic", "value": 165, "return": ["f64"],         "parameter": ["f64", "f64"],                 "immediate": [], "b3op": "Select(Equal(@0, @1), BitAnd(@0, @1), Select(LessThan(@0, @1), @1, Select(GreaterThan(@0, @1), @0, Add(@0, @1))))" },
-        "f64.abs":             { "category": "arithmetic", "value": 153, "return": ["f64"],         "parameter": ["f64"],                        "immediate": [], "b3op": "Abs"          },
-        "f64.neg":             { "category": "arithmetic", "value": 154, "return": ["f64"],         "parameter": ["f64"],                        "immediate": [], "b3op": "Neg"          },
-        "f64.copysign":        { "category": "arithmetic", "value": 166, "return": ["f64"],         "parameter": ["f64", "f64"],                 "immediate": [], "b3op": "BitwiseCast(BitOr(BitAnd(BitwiseCast(@1), i64(0x8000000000000000)), BitAnd(BitwiseCast(@0), i64(0x7fffffffffffffff))))" },
-        "f64.ceil":            { "category": "arithmetic", "value": 155, "return": ["f64"],         "parameter": ["f64"],                        "immediate": [], "b3op": "Ceil"         },
-        "f64.floor":           { "category": "arithmetic", "value": 156, "return": ["f64"],         "parameter": ["f64"],                        "immediate": [], "b3op": "Floor"        },
-        "f64.trunc":           { "category": "arithmetic", "value": 157, "return": ["f64"],         "parameter": ["f64"],                        "immediate": []                         },
-        "f64.nearest":         { "category": "arithmetic", "value": 158, "return": ["f64"],         "parameter": ["f64"],                        "immediate": []                         },
-        "f64.sqrt":            { "category": "arithmetic", "value": 159, "return": ["f64"],         "parameter": ["f64"],                        "immediate": [], "b3op": "Sqrt"         },
-        "f64.eq":              { "category": "comparison", "value":  97, "return": ["bool"],        "parameter": ["f64", "f64"],                 "immediate": [], "b3op": "Equal"        },
-        "f64.ne":              { "category": "comparison", "value":  98, "return": ["bool"],        "parameter": ["f64", "f64"],                 "immediate": [], "b3op": "NotEqual"     },
-        "f64.lt":              { "category": "comparison", "value":  99, "return": ["bool"],        "parameter": ["f64", "f64"],                 "immediate": [], "b3op": "LessThan"     },
-        "f64.le":              { "category": "comparison", "value": 101, "return": ["bool"],        "parameter": ["f64", "f64"],                 "immediate": [], "b3op": "LessEqual"    },
-        "f64.gt":              { "category": "comparison", "value": 100, "return": ["bool"],        "parameter": ["f64", "f64"],                 "immediate": [], "b3op": "GreaterThan"  },
-        "f64.ge":              { "category": "comparison", "value": 102, "return": ["bool"],        "parameter": ["f64", "f64"],                 "immediate": [], "b3op": "GreaterEqual" },
-        "i32.trunc_s/f32":     { "category": "conversion", "value": 168, "return": ["i32"],         "parameter": ["f32"],                        "immediate": []                         },
-        "i32.trunc_s/f64":     { "category": "conversion", "value": 170, "return": ["i32"],         "parameter": ["f64"],                        "immediate": []                         },
-        "i32.trunc_u/f32":     { "category": "conversion", "value": 169, "return": ["i32"],         "parameter": ["f32"],                        "immediate": []                         },
-        "i32.trunc_u/f64":     { "category": "conversion", "value": 171, "return": ["i32"],         "parameter": ["f64"],                        "immediate": []                         },
-        "i32.wrap/i64":        { "category": "conversion", "value": 167, "return": ["i32"],         "parameter": ["i64"],                        "immediate": [], "b3op": "Trunc"        },
-        "i64.trunc_s/f32":     { "category": "conversion", "value": 174, "return": ["i64"],         "parameter": ["f32"],                        "immediate": []                         },
-        "i64.trunc_s/f64":     { "category": "conversion", "value": 176, "return": ["i64"],         "parameter": ["f64"],                        "immediate": []                         },
-        "i64.trunc_u/f32":     { "category": "conversion", "value": 175, "return": ["i64"],         "parameter": ["f32"],                        "immediate": []                         },
-        "i64.trunc_u/f64":     { "category": "conversion", "value": 177, "return": ["i64"],         "parameter": ["f64"],                        "immediate": []                         },
-        "i64.extend_s/i32":    { "category": "conversion", "value": 172, "return": ["i64"],         "parameter": ["i32"],                        "immediate": [], "b3op": "SExt32"       },
-        "i64.extend_u/i32":    { "category": "conversion", "value": 173, "return": ["i64"],         "parameter": ["i32"],                        "immediate": [], "b3op": "ZExt32"       },
-        "f32.convert_s/i32":   { "category": "conversion", "value": 178, "return": ["f32"],         "parameter": ["i32"],                        "immediate": [], "b3op": "IToF"         },
-        "f32.convert_u/i32":   { "category": "conversion", "value": 179, "return": ["f32"],         "parameter": ["i32"],                        "immediate": [], "b3op": "IToF(ZExt32(@0))" },
-        "f32.convert_s/i64":   { "category": "conversion", "value": 180, "return": ["f32"],         "parameter": ["i64"],                        "immediate": [], "b3op": "IToF"         },
-        "f32.convert_u/i64":   { "category": "conversion", "value": 181, "return": ["f32"],         "parameter": ["i64"],                        "immediate": []                         },
-        "f32.demote/f64":      { "category": "conversion", "value": 182, "return": ["f32"],         "parameter": ["f64"],                        "immediate": [], "b3op": "DoubleToFloat"},
-        "f32.reinterpret/i32": { "category": "conversion", "value": 190, "return": ["f32"],         "parameter": ["i32"],                        "immediate": [], "b3op": "BitwiseCast"  },
-        "f64.convert_s/i32":   { "category": "conversion", "value": 183, "return": ["f64"],         "parameter": ["i32"],                        "immediate": [], "b3op": "IToD"         },
-        "f64.convert_u/i32":   { "category": "conversion", "value": 184, "return": ["f64"],         "parameter": ["i32"],                        "immediate": [], "b3op": "IToD(ZExt32(@0))" },
-        "f64.convert_s/i64":   { "category": "conversion", "value": 185, "return": ["f64"],         "parameter": ["i64"],                        "immediate": [], "b3op": "IToD"         },
-        "f64.convert_u/i64":   { "category": "conversion", "value": 186, "return": ["f64"],         "parameter": ["i64"],                        "immediate": []                         },
-        "f64.promote/f32":     { "category": "conversion", "value": 187, "return": ["f64"],         "parameter": ["f32"],                        "immediate": [], "b3op": "FloatToDouble"},
-        "f64.reinterpret/i64": { "category": "conversion", "value": 191, "return": ["f64"],         "parameter": ["i64"],                        "immediate": [], "b3op": "BitwiseCast"  },
-        "i32.reinterpret/f32": { "category": "conversion", "value": 188, "return": ["i32"],         "parameter": ["f32"],                        "immediate": [], "b3op": "BitwiseCast"  },
-        "i64.reinterpret/f64": { "category": "conversion", "value": 189, "return": ["i64"],         "parameter": ["f64"],                        "immediate": [], "b3op": "BitwiseCast"  }
</del><ins>+        "unreachable":         { "category": "control",    "value":   0, "return": [],                               "parameter": [],                             "immediate": [],                                                                                            "description": "trap immediately" },
+        "block":               { "category": "control",    "value":   2, "return": ["control"],                      "parameter": [],                             "immediate": [{"name": "sig", "type": "block_type"}],                                                       "description": "begin a sequence of expressions, yielding 0 or 1 values" },
+        "loop":                { "category": "control",    "value":   3, "return": ["control"],                      "parameter": [],                             "immediate": [{"name": "sig", "type": "block_type"}],                                                       "description": "begin a block which can also form control flow loops" },
+        "if":                  { "category": "control",    "value":   4, "return": ["control"],                      "parameter": ["bool"],                       "immediate": [{"name": "sig", "type": "block_type"}],                                                       "description": "begin if expression" },
+        "else":                { "category": "control",    "value":   5, "return": ["control"],                      "parameter": [],                             "immediate": [],                                                                                            "description": "begin else expression of if" },
+        "select":              { "category": "control",    "value":  27, "return": ["prev"],                         "parameter": ["any", "prev", "bool"],        "immediate": [],                                                                                            "description": "select one of two values based on condition" },
+        "br":                  { "category": "control",    "value":  12, "return": [],                               "parameter": [],                             "immediate": [{"name": "relative_depth", "type": "varuint32"}],                                             "description": "break that targets an outer nested block" },
+        "br_if":               { "category": "control",    "value":  13, "return": [],                               "parameter": [],                             "immediate": [{"name": "relative_depth", "type": "varuint32"}],                                             "description": "conditional break that targets an outer nested block" },
+        "br_table":            { "category": "control",    "value":  14, "return": [],                               "parameter": [],                             "immediate": [{"name": "target_count",   "type": "varuint32",                                               "description": "number of entries in the target_table"},
+                                                                                                                                                                                {"name": "target_table",   "type": "varuint32*",                                              "description": "target entries that indicate an outer block or loop to which to break"},
+                                                                                                                                                                                {"name": "default_target", "type": "varuint32",                                               "description": "an outer block or loop to which to break in the default case"}],
+                                                                                                                                                                                                                                                                              "description": "branch table control flow construct" },
+        "return":              { "category": "control",    "value":  15, "return": [],                               "parameter": [],                             "immediate": [],                                                                                            "description": "return zero or one value from this function" },
+        "drop":                { "category": "control",    "value":  26, "return": [],                               "parameter": ["any"],                        "immediate": [],                                                                                            "description": "ignore value" },
+        "nop":                 { "category": "control",    "value":   1, "return": [],                               "parameter": [],                             "immediate": [],                                                                                            "description": "no operation" },
+        "end":                 { "category": "control",    "value":  11, "return": [],                               "parameter": [],                             "immediate": [],                                                                                            "description": "end a block, loop, or if" },
+        "i32.const":           { "category": "special",    "value":  65, "return": ["i32"],                          "parameter": [],                             "immediate": [{"name": "value",          "type": "varint32"}],                                              "description": "a constant value interpreted as i32" },
+        "i64.const":           { "category": "special",    "value":  66, "return": ["i64"],                          "parameter": [],                             "immediate": [{"name": "value",          "type": "varint64"}],                                              "description": "a constant value interpreted as i64" },
+        "f64.const":           { "category": "special",    "value":  68, "return": ["f64"],                          "parameter": [],                             "immediate": [{"name": "value",          "type": "double"}],                                                "description": "a constant value interpreted as f64" },
+        "f32.const":           { "category": "special",    "value":  67, "return": ["f32"],                          "parameter": [],                             "immediate": [{"name": "value",          "type": "float"}],                                                 "description": "a constant value interpreted as f32" },
+        "ref.null":            { "category": "special",    "value": 208, "return": ["externref", "funcref"],         "parameter": [],                             "immediate": [{"name": "reftype",        "type": "ref_type"}],                                              "description": "a constant null reference" },
+        "ref.is_null":         { "category": "special",    "value": 209, "return": ["i32"],                          "parameter": ["externref"],                  "immediate": [],                                                                                            "description": "determine if a reference is null" },
+        "ref.func":            { "category": "special",    "value": 210, "return": ["funcref"],                      "parameter": [],                             "immediate": [{"name": "function_index", "type": "varuint32"}],                                             "description": "return a reference to the function at the given index" },
+        "get_local":           { "category": "special",    "value":  32, "return": ["any"],                          "parameter": [],                             "immediate": [{"name": "local_index",    "type": "varuint32"}],                                             "description": "read a local variable or parameter" },
+        "set_local":           { "category": "special",    "value":  33, "return": [],                               "parameter": ["any"],                        "immediate": [{"name": "local_index",    "type": "varuint32"}],                                             "description": "write a local variable or parameter" },
+        "tee_local":           { "category": "special",    "value":  34, "return": ["any"],                          "parameter": ["any"],                        "immediate": [{"name": "local_index",    "type": "varuint32"}],                                             "description": "write a local variable or parameter and return the same value" },
+        "get_global":          { "category": "special",    "value":  35, "return": ["any"],                          "parameter": [],                             "immediate": [{"name": "global_index",   "type": "varuint32"}],                                             "description": "read a global variable" },
+        "set_global":          { "category": "special",    "value":  36, "return": [],                               "parameter": ["any"],                        "immediate": [{"name": "global_index",   "type": "varuint32"}],                                             "description": "write a global variable" },
+        "table.get":           { "category": "special",    "value":  37, "return": ["externref"],                    "parameter": ["i32"],                        "immediate": [{"name": "table_index",    "type": "varuint32"}],                                             "description": "get a table value" },
+        "table.set":           { "category": "special",    "value":  38, "return": [],                               "parameter": ["i32", "externref"],           "immediate": [{"name": "table_index",    "type": "varuint32"}],                                             "description": "set a table value" },
+        "table.size":          { "category": "exttable",   "value":  252, "return": ["i32"],                         "parameter": [],                             "immediate": [{"name": "table_index",    "type": "varuint32"}],                                             "description": "get the size of a table", "extendedOp": 15 },
+        "table.grow":          { "category": "exttable",   "value":  252, "return": ["i32"],                         "parameter": ["externref", "i32"],           "immediate": [{"name": "table_index",    "type": "varuint32"}],                                             "description": "grow a table by the given delta and return the previous size, or -1 if enough space cannot be allocated", "extendedOp": 16 },
+        "table.fill":          { "category": "exttable",   "value":  252, "return": ["i32"],                         "parameter": ["i32", "externref", "i32"],    "immediate": [{"name": "table_index",    "type": "varuint32"}],                                             "description": "fill entries [i,i+n) with the given value", "extendedOp": 17 },
+        "call":                { "category": "call",       "value":  16, "return": ["call"],                         "parameter": ["call"],                       "immediate": [{"name": "function_index", "type": "varuint32"}],                                             "description": "call a function by its index" },
+        "call_indirect":       { "category": "call",       "value":  17, "return": ["call"],                         "parameter": ["call"],                       "immediate": [{"name": "type_index",     "type": "varuint32"}, {"name": "table_index","type": "varuint32"}],"description": "call a function indirect with an expected signature" },
+        "i32.load8_s":         { "category": "memory",     "value":  44, "return": ["i32"],                          "parameter": ["addr"],                       "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "load from memory" },
+        "i32.load8_u":         { "category": "memory",     "value":  45, "return": ["i32"],                          "parameter": ["addr"],                       "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "load from memory" },
+        "i32.load16_s":        { "category": "memory",     "value":  46, "return": ["i32"],                          "parameter": ["addr"],                       "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "load from memory" },
+        "i32.load16_u":        { "category": "memory",     "value":  47, "return": ["i32"],                          "parameter": ["addr"],                       "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "load from memory" },
+        "i64.load8_s":         { "category": "memory",     "value":  48, "return": ["i64"],                          "parameter": ["addr"],                       "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "load from memory" },
+        "i64.load8_u":         { "category": "memory",     "value":  49, "return": ["i64"],                          "parameter": ["addr"],                       "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "load from memory" },
+        "i64.load16_s":        { "category": "memory",     "value":  50, "return": ["i64"],                          "parameter": ["addr"],                       "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "load from memory" },
+        "i64.load16_u":        { "category": "memory",     "value":  51, "return": ["i64"],                          "parameter": ["addr"],                       "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "load from memory" },
+        "i64.load32_s":        { "category": "memory",     "value":  52, "return": ["i64"],                          "parameter": ["addr"],                       "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "load from memory" },
+        "i64.load32_u":        { "category": "memory",     "value":  53, "return": ["i64"],                          "parameter": ["addr"],                       "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "load from memory" },
+        "i32.load":            { "category": "memory",     "value":  40, "return": ["i32"],                          "parameter": ["addr"],                       "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "load from memory" },
+        "i64.load":            { "category": "memory",     "value":  41, "return": ["i64"],                          "parameter": ["addr"],                       "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "load from memory" },
+        "f32.load":            { "category": "memory",     "value":  42, "return": ["f32"],                          "parameter": ["addr"],                       "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "load from memory" },
+        "f64.load":            { "category": "memory",     "value":  43, "return": ["f64"],                          "parameter": ["addr"],                       "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "load from memory" },
+        "i32.store8":          { "category": "memory",     "value":  58, "return": [],                               "parameter": ["addr", "i32"],                "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "store to memory" },
+        "i32.store16":         { "category": "memory",     "value":  59, "return": [],                               "parameter": ["addr", "i32"],                "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "store to memory" },
+        "i64.store8":          { "category": "memory",     "value":  60, "return": [],                               "parameter": ["addr", "i64"],                "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "store to memory" },
+        "i64.store16":         { "category": "memory",     "value":  61, "return": [],                               "parameter": ["addr", "i64"],                "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "store to memory" },
+        "i64.store32":         { "category": "memory",     "value":  62, "return": [],                               "parameter": ["addr", "i64"],                "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "store to memory" },
+        "i32.store":           { "category": "memory",     "value":  54, "return": [],                               "parameter": ["addr", "i32"],                "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "store to memory" },
+        "i64.store":           { "category": "memory",     "value":  55, "return": [],                               "parameter": ["addr", "i64"],                "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "store to memory" },
+        "f32.store":           { "category": "memory",     "value":  56, "return": [],                               "parameter": ["addr", "f32"],                "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "store to memory" },
+        "f64.store":           { "category": "memory",     "value":  57, "return": [],                               "parameter": ["addr", "f64"],                "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "store to memory" },
+        "current_memory":      { "category": "operation",  "value":  63, "return": ["size"],                         "parameter": [],                             "immediate": [{"name": "flags",          "type": "varuint32"}],                                            "description": "query the size of memory" },
+        "grow_memory":         { "category": "operation",  "value":  64, "return": ["size"],                         "parameter": ["size"],                       "immediate": [{"name": "flags",          "type": "varuint32"}],                                            "description": "grow the size of memory" },
+        "i32.add":             { "category": "arithmetic", "value": 106, "return": ["i32"],                          "parameter": ["i32", "i32"],                 "immediate": [], "b3op": "Add"          },
+        "i32.sub":             { "category": "arithmetic", "value": 107, "return": ["i32"],                          "parameter": ["i32", "i32"],                 "immediate": [], "b3op": "Sub"          },
+        "i32.mul":             { "category": "arithmetic", "value": 108, "return": ["i32"],                          "parameter": ["i32", "i32"],                 "immediate": [], "b3op": "Mul"          },
+        "i32.div_s":           { "category": "arithmetic", "value": 109, "return": ["i32"],                          "parameter": ["i32", "i32"],                 "immediate": []                         },
+        "i32.div_u":           { "category": "arithmetic", "value": 110, "return": ["i32"],                          "parameter": ["i32", "i32"],                 "immediate": []                         },
+        "i32.rem_s":           { "category": "arithmetic", "value": 111, "return": ["i32"],                          "parameter": ["i32", "i32"],                 "immediate": []                         },
+        "i32.rem_u":           { "category": "arithmetic", "value": 112, "return": ["i32"],                          "parameter": ["i32", "i32"],                 "immediate": []                         },
+        "i32.and":             { "category": "arithmetic", "value": 113, "return": ["i32"],                          "parameter": ["i32", "i32"],                 "immediate": [], "b3op": "BitAnd"       },
+        "i32.or":              { "category": "arithmetic", "value": 114, "return": ["i32"],                          "parameter": ["i32", "i32"],                 "immediate": [], "b3op": "BitOr"        },
+        "i32.xor":             { "category": "arithmetic", "value": 115, "return": ["i32"],                          "parameter": ["i32", "i32"],                 "immediate": [], "b3op": "BitXor"       },
+        "i32.shl":             { "category": "arithmetic", "value": 116, "return": ["i32"],                          "parameter": ["i32", "i32"],                 "immediate": [], "b3op": "Shl"          },
+        "i32.shr_u":           { "category": "arithmetic", "value": 118, "return": ["i32"],                          "parameter": ["i32", "i32"],                 "immediate": [], "b3op": "ZShr"         },
+        "i32.shr_s":           { "category": "arithmetic", "value": 117, "return": ["i32"],                          "parameter": ["i32", "i32"],                 "immediate": [], "b3op": "SShr"         },
+        "i32.rotr":            { "category": "arithmetic", "value": 120, "return": ["i32"],                          "parameter": ["i32", "i32"],                 "immediate": [], "b3op": "RotR"         },
+        "i32.rotl":            { "category": "arithmetic", "value": 119, "return": ["i32"],                          "parameter": ["i32", "i32"],                 "immediate": [], "b3op": "RotL"         },
+        "i32.eq":              { "category": "comparison", "value":  70, "return": ["bool"],                         "parameter": ["i32", "i32"],                 "immediate": [], "b3op": "Equal"        },
+        "i32.ne":              { "category": "comparison", "value":  71, "return": ["bool"],                         "parameter": ["i32", "i32"],                 "immediate": [], "b3op": "NotEqual"     },
+        "i32.lt_s":            { "category": "comparison", "value":  72, "return": ["bool"],                         "parameter": ["i32", "i32"],                 "immediate": [], "b3op": "LessThan"     },
+        "i32.le_s":            { "category": "comparison", "value":  76, "return": ["bool"],                         "parameter": ["i32", "i32"],                 "immediate": [], "b3op": "LessEqual"    },
+        "i32.lt_u":            { "category": "comparison", "value":  73, "return": ["bool"],                         "parameter": ["i32", "i32"],                 "immediate": [], "b3op": "Below"        },
+        "i32.le_u":            { "category": "comparison", "value":  77, "return": ["bool"],                         "parameter": ["i32", "i32"],                 "immediate": [], "b3op": "BelowEqual"   },
+        "i32.gt_s":            { "category": "comparison", "value":  74, "return": ["bool"],                         "parameter": ["i32", "i32"],                 "immediate": [], "b3op": "GreaterThan"  },
+        "i32.ge_s":            { "category": "comparison", "value":  78, "return": ["bool"],                         "parameter": ["i32", "i32"],                 "immediate": [], "b3op": "GreaterEqual" },
+        "i32.gt_u":            { "category": "comparison", "value":  75, "return": ["bool"],                         "parameter": ["i32", "i32"],                 "immediate": [], "b3op": "Above"        },
+        "i32.ge_u":            { "category": "comparison", "value":  79, "return": ["bool"],                         "parameter": ["i32", "i32"],                 "immediate": [], "b3op": "AboveEqual"   },
+        "i32.clz":             { "category": "arithmetic", "value": 103, "return": ["i32"],                          "parameter": ["i32"],                        "immediate": [], "b3op": "Clz"          },
+        "i32.ctz":             { "category": "arithmetic", "value": 104, "return": ["i32"],                          "parameter": ["i32"],                        "immediate": []                         },
+        "i32.popcnt":          { "category": "arithmetic", "value": 105, "return": ["i32"],                          "parameter": ["i32"],                        "immediate": []                         },
+        "i32.eqz":             { "category": "comparison", "value":  69, "return": ["bool"],                         "parameter": ["i32"],                        "immediate": [], "b3op": "Equal(i32(0), @0)" },
+        "i64.add":             { "category": "arithmetic", "value": 124, "return": ["i64"],                          "parameter": ["i64", "i64"],                 "immediate": [], "b3op": "Add"          },
+        "i64.sub":             { "category": "arithmetic", "value": 125, "return": ["i64"],                          "parameter": ["i64", "i64"],                 "immediate": [], "b3op": "Sub"          },
+        "i64.mul":             { "category": "arithmetic", "value": 126, "return": ["i64"],                          "parameter": ["i64", "i64"],                 "immediate": [], "b3op": "Mul"          },
+        "i64.div_s":           { "category": "arithmetic", "value": 127, "return": ["i64"],                          "parameter": ["i64", "i64"],                 "immediate": []                         },
+        "i64.div_u":           { "category": "arithmetic", "value": 128, "return": ["i64"],                          "parameter": ["i64", "i64"],                 "immediate": []                         },
+        "i64.rem_s":           { "category": "arithmetic", "value": 129, "return": ["i64"],                          "parameter": ["i64", "i64"],                 "immediate": []                         },
+        "i64.rem_u":           { "category": "arithmetic", "value": 130, "return": ["i64"],                          "parameter": ["i64", "i64"],                 "immediate": []                         },
+        "i64.and":             { "category": "arithmetic", "value": 131, "return": ["i64"],                          "parameter": ["i64", "i64"],                 "immediate": [], "b3op": "BitAnd"       },
+        "i64.or":              { "category": "arithmetic", "value": 132, "return": ["i64"],                          "parameter": ["i64", "i64"],                 "immediate": [], "b3op": "BitOr"        },
+        "i64.xor":             { "category": "arithmetic", "value": 133, "return": ["i64"],                          "parameter": ["i64", "i64"],                 "immediate": [], "b3op": "BitXor"       },
+        "i64.shl":             { "category": "arithmetic", "value": 134, "return": ["i64"],                          "parameter": ["i64", "i64"],                 "immediate": [], "b3op": "Shl(@0, Trunc(@1))" },
+        "i64.shr_u":           { "category": "arithmetic", "value": 136, "return": ["i64"],                          "parameter": ["i64", "i64"],                 "immediate": [], "b3op": "ZShr(@0, Trunc(@1))" },
+        "i64.shr_s":           { "category": "arithmetic", "value": 135, "return": ["i64"],                          "parameter": ["i64", "i64"],                 "immediate": [], "b3op": "SShr(@0, Trunc(@1))" },
+        "i64.rotr":            { "category": "arithmetic", "value": 138, "return": ["i64"],                          "parameter": ["i64", "i64"],                 "immediate": [], "b3op": "RotR(@0, Trunc(@1))" },
+        "i64.rotl":            { "category": "arithmetic", "value": 137, "return": ["i64"],                          "parameter": ["i64", "i64"],                 "immediate": [], "b3op": "RotL(@0, Trunc(@1))" },
+        "i64.eq":              { "category": "comparison", "value":  81, "return": ["bool"],                         "parameter": ["i64", "i64"],                 "immediate": [], "b3op": "Equal"        },
+        "i64.ne":              { "category": "comparison", "value":  82, "return": ["bool"],                         "parameter": ["i64", "i64"],                 "immediate": [], "b3op": "NotEqual"     },
+        "i64.lt_s":            { "category": "comparison", "value":  83, "return": ["bool"],                         "parameter": ["i64", "i64"],                 "immediate": [], "b3op": "LessThan"     },
+        "i64.le_s":            { "category": "comparison", "value":  87, "return": ["bool"],                         "parameter": ["i64", "i64"],                 "immediate": [], "b3op": "LessEqual"    },
+        "i64.lt_u":            { "category": "comparison", "value":  84, "return": ["bool"],                         "parameter": ["i64", "i64"],                 "immediate": [], "b3op": "Below"        },
+        "i64.le_u":            { "category": "comparison", "value":  88, "return": ["bool"],                         "parameter": ["i64", "i64"],                 "immediate": [], "b3op": "BelowEqual"   },
+        "i64.gt_s":            { "category": "comparison", "value":  85, "return": ["bool"],                         "parameter": ["i64", "i64"],                 "immediate": [], "b3op": "GreaterThan"  },
+        "i64.ge_s":            { "category": "comparison", "value":  89, "return": ["bool"],                         "parameter": ["i64", "i64"],                 "immediate": [], "b3op": "GreaterEqual" },
+        "i64.gt_u":            { "category": "comparison", "value":  86, "return": ["bool"],                         "parameter": ["i64", "i64"],                 "immediate": [], "b3op": "Above"        },
+        "i64.ge_u":            { "category": "comparison", "value":  90, "return": ["bool"],                         "parameter": ["i64", "i64"],                 "immediate": [], "b3op": "AboveEqual"   },
+        "i64.clz":             { "category": "arithmetic", "value": 121, "return": ["i64"],                          "parameter": ["i64"],                        "immediate": [], "b3op": "Clz"          },
+        "i64.ctz":             { "category": "arithmetic", "value": 122, "return": ["i64"],                          "parameter": ["i64"],                        "immediate": []                         },
+        "i64.popcnt":          { "category": "arithmetic", "value": 123, "return": ["i64"],                          "parameter": ["i64"],                        "immediate": []                         },
+        "i64.eqz":             { "category": "comparison", "value":  80, "return": ["bool"],                         "parameter": ["i64"],                        "immediate": [], "b3op": "Equal(i64(0), @0)" },
+        "f32.add":             { "category": "arithmetic", "value": 146, "return": ["f32"],                          "parameter": ["f32", "f32"],                 "immediate": [], "b3op": "Add"          },
+        "f32.sub":             { "category": "arithmetic", "value": 147, "return": ["f32"],                          "parameter": ["f32", "f32"],                 "immediate": [], "b3op": "Sub"          },
+        "f32.mul":             { "category": "arithmetic", "value": 148, "return": ["f32"],                          "parameter": ["f32", "f32"],                 "immediate": [], "b3op": "Mul"          },
+        "f32.div":             { "category": "arithmetic", "value": 149, "return": ["f32"],                          "parameter": ["f32", "f32"],                 "immediate": [], "b3op": "Div"          },
+        "f32.min":             { "category": "arithmetic", "value": 150, "return": ["f32"],                          "parameter": ["f32", "f32"],                 "immediate": [], "b3op": "Select(Equal(@0, @1), BitOr(@0, @1), Select(LessThan(@0, @1), @0, Select(GreaterThan(@0, @1), @1, Add(@0, @1))))" },
+        "f32.max":             { "category": "arithmetic", "value": 151, "return": ["f32"],                          "parameter": ["f32", "f32"],                 "immediate": [], "b3op": "Select(Equal(@0, @1), BitAnd(@0, @1), Select(LessThan(@0, @1), @1, Select(GreaterThan(@0, @1), @0, Add(@0, @1))))" },
+        "f32.abs":             { "category": "arithmetic", "value": 139, "return": ["f32"],                          "parameter": ["f32"],                        "immediate": [], "b3op": "Abs"          },
+        "f32.neg":             { "category": "arithmetic", "value": 140, "return": ["f32"],                          "parameter": ["f32"],                        "immediate": [], "b3op": "Neg"          },
+        "f32.copysign":        { "category": "arithmetic", "value": 152, "return": ["f32"],                          "parameter": ["f32", "f32"],                 "immediate": [], "b3op": "BitwiseCast(BitOr(BitAnd(BitwiseCast(@1), i32(0x80000000)), BitAnd(BitwiseCast(@0), i32(0x7fffffff))))" },
+        "f32.ceil":            { "category": "arithmetic", "value": 141, "return": ["f32"],                          "parameter": ["f32"],                        "immediate": [], "b3op": "Ceil"         },
+        "f32.floor":           { "category": "arithmetic", "value": 142, "return": ["f32"],                          "parameter": ["f32"],                        "immediate": [], "b3op": "Floor"        },
+        "f32.trunc":           { "category": "arithmetic", "value": 143, "return": ["f32"],                          "parameter": ["f32"],                        "immediate": []                         },
+        "f32.nearest":         { "category": "arithmetic", "value": 144, "return": ["f32"],                          "parameter": ["f32"],                        "immediate": []                         },
+        "f32.sqrt":            { "category": "arithmetic", "value": 145, "return": ["f32"],                          "parameter": ["f32"],                        "immediate": [], "b3op": "Sqrt"         },
+        "f32.eq":              { "category": "comparison", "value":  91, "return": ["bool"],                         "parameter": ["f32", "f32"],                 "immediate": [], "b3op": "Equal"        },
+        "f32.ne":              { "category": "comparison", "value":  92, "return": ["bool"],                         "parameter": ["f32", "f32"],                 "immediate": [], "b3op": "NotEqual"     },
+        "f32.lt":              { "category": "comparison", "value":  93, "return": ["bool"],                         "parameter": ["f32", "f32"],                 "immediate": [], "b3op": "LessThan"     },
+        "f32.le":              { "category": "comparison", "value":  95, "return": ["bool"],                         "parameter": ["f32", "f32"],                 "immediate": [], "b3op": "LessEqual"    },
+        "f32.gt":              { "category": "comparison", "value":  94, "return": ["bool"],                         "parameter": ["f32", "f32"],                 "immediate": [], "b3op": "GreaterThan"  },
+        "f32.ge":              { "category": "comparison", "value":  96, "return": ["bool"],                         "parameter": ["f32", "f32"],                 "immediate": [], "b3op": "GreaterEqual" },
+        "f64.add":             { "category": "arithmetic", "value": 160, "return": ["f64"],                          "parameter": ["f64", "f64"],                 "immediate": [], "b3op": "Add"          },
+        "f64.sub":             { "category": "arithmetic", "value": 161, "return": ["f64"],                          "parameter": ["f64", "f64"],                 "immediate": [], "b3op": "Sub"          },
+        "f64.mul":             { "category": "arithmetic", "value": 162, "return": ["f64"],                          "parameter": ["f64", "f64"],                 "immediate": [], "b3op": "Mul"          },
+        "f64.div":             { "category": "arithmetic", "value": 163, "return": ["f64"],                          "parameter": ["f64", "f64"],                 "immediate": [], "b3op": "Div"          },
+        "f64.min":             { "category": "arithmetic", "value": 164, "return": ["f64"],                          "parameter": ["f64", "f64"],                 "immediate": [], "b3op": "Select(Equal(@0, @1), BitOr(@0, @1), Select(LessThan(@0, @1), @0, Select(GreaterThan(@0, @1), @1, Add(@0, @1))))" },
+        "f64.max":             { "category": "arithmetic", "value": 165, "return": ["f64"],                          "parameter": ["f64", "f64"],                 "immediate": [], "b3op": "Select(Equal(@0, @1), BitAnd(@0, @1), Select(LessThan(@0, @1), @1, Select(GreaterThan(@0, @1), @0, Add(@0, @1))))" },
+        "f64.abs":             { "category": "arithmetic", "value": 153, "return": ["f64"],                          "parameter": ["f64"],                        "immediate": [], "b3op": "Abs"          },
+        "f64.neg":             { "category": "arithmetic", "value": 154, "return": ["f64"],                          "parameter": ["f64"],                        "immediate": [], "b3op": "Neg"          },
+        "f64.copysign":        { "category": "arithmetic", "value": 166, "return": ["f64"],                          "parameter": ["f64", "f64"],                 "immediate": [], "b3op": "BitwiseCast(BitOr(BitAnd(BitwiseCast(@1), i64(0x8000000000000000)), BitAnd(BitwiseCast(@0), i64(0x7fffffffffffffff))))" },
+        "f64.ceil":            { "category": "arithmetic", "value": 155, "return": ["f64"],                          "parameter": ["f64"],                        "immediate": [], "b3op": "Ceil"         },
+        "f64.floor":           { "category": "arithmetic", "value": 156, "return": ["f64"],                          "parameter": ["f64"],                        "immediate": [], "b3op": "Floor"        },
+        "f64.trunc":           { "category": "arithmetic", "value": 157, "return": ["f64"],                          "parameter": ["f64"],                        "immediate": []                         },
+        "f64.nearest":         { "category": "arithmetic", "value": 158, "return": ["f64"],                          "parameter": ["f64"],                        "immediate": []                         },
+        "f64.sqrt":            { "category": "arithmetic", "value": 159, "return": ["f64"],                          "parameter": ["f64"],                        "immediate": [], "b3op": "Sqrt"         },
+        "f64.eq":              { "category": "comparison", "value":  97, "return": ["bool"],                         "parameter": ["f64", "f64"],                 "immediate": [], "b3op": "Equal"        },
+        "f64.ne":              { "category": "comparison", "value":  98, "return": ["bool"],                         "parameter": ["f64", "f64"],                 "immediate": [], "b3op": "NotEqual"     },
+        "f64.lt":              { "category": "comparison", "value":  99, "return": ["bool"],                         "parameter": ["f64", "f64"],                 "immediate": [], "b3op": "LessThan"     },
+        "f64.le":              { "category": "comparison", "value": 101, "return": ["bool"],                         "parameter": ["f64", "f64"],                 "immediate": [], "b3op": "LessEqual"    },
+        "f64.gt":              { "category": "comparison", "value": 100, "return": ["bool"],                         "parameter": ["f64", "f64"],                 "immediate": [], "b3op": "GreaterThan"  },
+        "f64.ge":              { "category": "comparison", "value": 102, "return": ["bool"],                         "parameter": ["f64", "f64"],                 "immediate": [], "b3op": "GreaterEqual" },
+        "i32.trunc_s/f32":     { "category": "conversion", "value": 168, "return": ["i32"],                          "parameter": ["f32"],                        "immediate": []                         },
+        "i32.trunc_s/f64":     { "category": "conversion", "value": 170, "return": ["i32"],                          "parameter": ["f64"],                        "immediate": []                         },
+        "i32.trunc_u/f32":     { "category": "conversion", "value": 169, "return": ["i32"],                          "parameter": ["f32"],                        "immediate": []                         },
+        "i32.trunc_u/f64":     { "category": "conversion", "value": 171, "return": ["i32"],                          "parameter": ["f64"],                        "immediate": []                         },
+        "i32.wrap/i64":        { "category": "conversion", "value": 167, "return": ["i32"],                          "parameter": ["i64"],                        "immediate": [], "b3op": "Trunc"        },
+        "i64.trunc_s/f32":     { "category": "conversion", "value": 174, "return": ["i64"],                          "parameter": ["f32"],                        "immediate": []                         },
+        "i64.trunc_s/f64":     { "category": "conversion", "value": 176, "return": ["i64"],                          "parameter": ["f64"],                        "immediate": []                         },
+        "i64.trunc_u/f32":     { "category": "conversion", "value": 175, "return": ["i64"],                          "parameter": ["f32"],                        "immediate": []                         },
+        "i64.trunc_u/f64":     { "category": "conversion", "value": 177, "return": ["i64"],                          "parameter": ["f64"],                        "immediate": []                         },
+        "i64.extend_s/i32":    { "category": "conversion", "value": 172, "return": ["i64"],                          "parameter": ["i32"],                        "immediate": [], "b3op": "SExt32"       },
+        "i64.extend_u/i32":    { "category": "conversion", "value": 173, "return": ["i64"],                          "parameter": ["i32"],                        "immediate": [], "b3op": "ZExt32"       },
+        "f32.convert_s/i32":   { "category": "conversion", "value": 178, "return": ["f32"],                          "parameter": ["i32"],                        "immediate": [], "b3op": "IToF"         },
+        "f32.convert_u/i32":   { "category": "conversion", "value": 179, "return": ["f32"],                          "parameter": ["i32"],                        "immediate": [], "b3op": "IToF(ZExt32(@0))" },
+        "f32.convert_s/i64":   { "category": "conversion", "value": 180, "return": ["f32"],                          "parameter": ["i64"],                        "immediate": [], "b3op": "IToF"         },
+        "f32.convert_u/i64":   { "category": "conversion", "value": 181, "return": ["f32"],                          "parameter": ["i64"],                        "immediate": []                         },
+        "f32.demote/f64":      { "category": "conversion", "value": 182, "return": ["f32"],                          "parameter": ["f64"],                        "immediate": [], "b3op": "DoubleToFloat"},
+        "f32.reinterpret/i32": { "category": "conversion", "value": 190, "return": ["f32"],                          "parameter": ["i32"],                        "immediate": [], "b3op": "BitwiseCast"  },
+        "f64.convert_s/i32":   { "category": "conversion", "value": 183, "return": ["f64"],                          "parameter": ["i32"],                        "immediate": [], "b3op": "IToD"         },
+        "f64.convert_u/i32":   { "category": "conversion", "value": 184, "return": ["f64"],                          "parameter": ["i32"],                        "immediate": [], "b3op": "IToD(ZExt32(@0))" },
+        "f64.convert_s/i64":   { "category": "conversion", "value": 185, "return": ["f64"],                          "parameter": ["i64"],                        "immediate": [], "b3op": "IToD"         },
+        "f64.convert_u/i64":   { "category": "conversion", "value": 186, "return": ["f64"],                          "parameter": ["i64"],                        "immediate": []                         },
+        "f64.promote/f32":     { "category": "conversion", "value": 187, "return": ["f64"],                          "parameter": ["f32"],                        "immediate": [], "b3op": "FloatToDouble"},
+        "f64.reinterpret/i64": { "category": "conversion", "value": 191, "return": ["f64"],                          "parameter": ["i64"],                        "immediate": [], "b3op": "BitwiseCast"  },
+        "i32.reinterpret/f32": { "category": "conversion", "value": 188, "return": ["i32"],                          "parameter": ["f32"],                        "immediate": [], "b3op": "BitwiseCast"  },
+        "i64.reinterpret/f64": { "category": "conversion", "value": 189, "return": ["i64"],                          "parameter": ["f64"],                        "immediate": [], "b3op": "BitwiseCast"  }
</ins><span class="cx">     }
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ChangeLog (269728 => 269729)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ChangeLog    2020-11-12 11:25:22 UTC (rev 269728)
+++ trunk/Source/JavaScriptCore/ChangeLog       2020-11-12 11:59:44 UTC (rev 269729)
</span><span class="lines">@@ -1,3 +1,23 @@
</span><ins>+2020-11-12  Dmitry Bezhetskov  <dbezhetskov@igalia.com>
+
+        [WASM-References] Support imm for ref.null
+        https://bugs.webkit.org/show_bug.cgi?id=218744
+
+        Reviewed by Yusuke Suzuki.
+        
+        Updated ref.null according to the ref-types spec:
+        https://github.com/WebAssembly/reference-types/.
+
+        * wasm/WasmFormat.h:
+        (JSC::Wasm::isRefType):
+        * wasm/WasmFunctionParser.h:
+        (JSC::Wasm::FunctionParser<Context>::parseExpression):
+        * wasm/WasmParser.h:
+        (JSC::Wasm::Parser<SuccessType>::parseRefType):
+        * wasm/WasmSectionParser.cpp:
+        (JSC::Wasm::SectionParser::parseInitExpr):
+        * wasm/wasm.json:
+
</ins><span class="cx"> 2020-11-11  John Wilander  <wilander@apple.com>
</span><span class="cx"> 
</span><span class="cx">         PCM: Change from ad-click-attribution to private-click-measurement (in all forms, including .well-known URL)
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorewasmWasmFormath"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/wasm/WasmFormat.h (269728 => 269729)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/wasm/WasmFormat.h    2020-11-12 11:25:22 UTC (rev 269728)
+++ trunk/Source/JavaScriptCore/wasm/WasmFormat.h       2020-11-12 11:59:44 UTC (rev 269729)
</span><span class="lines">@@ -84,6 +84,11 @@
</span><span class="cx">         return true;
</span><span class="cx">     return sub == Funcref && parent == Externref;
</span><span class="cx"> }
</span><ins>+
+inline bool isRefType(Type type)
+{
+    return type == Externref || type == Funcref;
+}
</ins><span class="cx">     
</span><span class="cx"> enum class ExternalKind : uint8_t {
</span><span class="cx">     // FIXME auto-generate this. https://bugs.webkit.org/show_bug.cgi?id=165231
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorewasmWasmFunctionParserh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/wasm/WasmFunctionParser.h (269728 => 269729)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/wasm/WasmFunctionParser.h    2020-11-12 11:25:22 UTC (rev 269728)
+++ trunk/Source/JavaScriptCore/wasm/WasmFunctionParser.h       2020-11-12 11:59:44 UTC (rev 269729)
</span><span class="lines">@@ -493,7 +493,9 @@
</span><span class="cx"> 
</span><span class="cx">     case RefNull: {
</span><span class="cx">         WASM_PARSER_FAIL_IF(!Options::useWebAssemblyReferences(), "references are not enabled");
</span><del>-        m_expressionStack.constructAndAppend(Funcref, m_context.addConstant(Funcref, JSValue::encode(jsNull())));
</del><ins>+        Type typeOfNull;
+        WASM_PARSER_FAIL_IF(!parseRefType(typeOfNull), "ref.null type must be a reference type");
+        m_expressionStack.constructAndAppend(typeOfNull, m_context.addConstant(typeOfNull, JSValue::encode(jsNull())));
</ins><span class="cx">         return { };
</span><span class="cx">     }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorewasmWasmParserh"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/wasm/WasmParser.h (269728 => 269729)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/wasm/WasmParser.h    2020-11-12 11:25:22 UTC (rev 269728)
+++ trunk/Source/JavaScriptCore/wasm/WasmParser.h       2020-11-12 11:59:44 UTC (rev 269729)
</span><span class="lines">@@ -85,6 +85,7 @@
</span><span class="cx"> 
</span><span class="cx">     PartialResult WARN_UNUSED_RETURN parseBlockSignature(const ModuleInformation&, BlockSignature&);
</span><span class="cx">     bool WARN_UNUSED_RETURN parseValueType(Type&);
</span><ins>+    bool WARN_UNUSED_RETURN parseRefType(Type&);
</ins><span class="cx">     bool WARN_UNUSED_RETURN parseExternalKind(ExternalKind&);
</span><span class="cx"> 
</span><span class="cx">     size_t m_offset = 0;
</span><span class="lines">@@ -307,6 +308,13 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> template<typename SuccessType>
</span><ins>+ALWAYS_INLINE bool Parser<SuccessType>::parseRefType(Type& result)
+{
+    const bool parsed = parseValueType(result);
+    return parsed && isRefType(result);
+}
+
+template<typename SuccessType>
</ins><span class="cx"> ALWAYS_INLINE bool Parser<SuccessType>::parseExternalKind(ExternalKind& result)
</span><span class="cx"> {
</span><span class="cx">     uint8_t value;
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorewasmWasmSectionParsercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/wasm/WasmSectionParser.cpp (269728 => 269729)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/wasm/WasmSectionParser.cpp   2020-11-12 11:25:22 UTC (rev 269728)
+++ trunk/Source/JavaScriptCore/wasm/WasmSectionParser.cpp      2020-11-12 11:59:44 UTC (rev 269729)
</span><span class="lines">@@ -474,7 +474,9 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     case RefNull: {
</span><del>-        resultType = Funcref;
</del><ins>+        Type typeOfNull;
+        WASM_PARSER_FAIL_IF(!parseRefType(typeOfNull), "ref.null type must be a reference type");
+        resultType = typeOfNull;
</ins><span class="cx">         bitsOrImportNumber = JSValue::encode(jsNull());
</span><span class="cx">         break;
</span><span class="cx">     }
</span></span></pre></div>
<a id="trunkSourceJavaScriptCorewasmwasmjson"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/wasm/wasm.json (269728 => 269729)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/wasm/wasm.json       2020-11-12 11:25:22 UTC (rev 269728)
+++ trunk/Source/JavaScriptCore/wasm/wasm.json  2020-11-12 11:59:44 UTC (rev 269729)
</span><span class="lines">@@ -18,7 +18,7 @@
</span><span class="cx">     },
</span><span class="cx">     "value_type": ["i32", "i64", "f32", "f64", "externref", "funcref"],
</span><span class="cx">     "block_type": ["i32", "i64", "f32", "f64", "void", "externref", "funcref"],
</span><del>-    "elem_type": ["funcref","externref"],
</del><ins>+    "ref_type": ["funcref","externref"],
</ins><span class="cx">     "external_kind": {
</span><span class="cx">         "Function": { "type": "uint8", "value": 0 },
</span><span class="cx">         "Table":    { "type": "uint8", "value": 1 },
</span><span class="lines">@@ -39,188 +39,188 @@
</span><span class="cx">         "Data":     { "type": "varuint7", "value": 11, "description": "Data segments" }
</span><span class="cx">     },
</span><span class="cx">     "opcode": {
</span><del>-        "unreachable":         { "category": "control",    "value":   0, "return": [],              "parameter": [],                             "immediate": [],                                                                                            "description": "trap immediately" },
-        "block":               { "category": "control",    "value":   2, "return": ["control"],     "parameter": [],                             "immediate": [{"name": "sig", "type": "block_type"}],                                                       "description": "begin a sequence of expressions, yielding 0 or 1 values" },
-        "loop":                { "category": "control",    "value":   3, "return": ["control"],     "parameter": [],                             "immediate": [{"name": "sig", "type": "block_type"}],                                                       "description": "begin a block which can also form control flow loops" },
-        "if":                  { "category": "control",    "value":   4, "return": ["control"],     "parameter": ["bool"],                       "immediate": [{"name": "sig", "type": "block_type"}],                                                       "description": "begin if expression" },
-        "else":                { "category": "control",    "value":   5, "return": ["control"],     "parameter": [],                             "immediate": [],                                                                                            "description": "begin else expression of if" },
-        "select":              { "category": "control",    "value":  27, "return": ["prev"],        "parameter": ["any", "prev", "bool"],        "immediate": [],                                                                                            "description": "select one of two values based on condition" },
-        "br":                  { "category": "control",    "value":  12, "return": [],              "parameter": [],                             "immediate": [{"name": "relative_depth", "type": "varuint32"}],                                             "description": "break that targets an outer nested block" },
-        "br_if":               { "category": "control",    "value":  13, "return": [],              "parameter": [],                             "immediate": [{"name": "relative_depth", "type": "varuint32"}],                                             "description": "conditional break that targets an outer nested block" },
-        "br_table":            { "category": "control",    "value":  14, "return": [],              "parameter": [],                             "immediate": [{"name": "target_count",   "type": "varuint32",                                               "description": "number of entries in the target_table"},
-                                                                                                                                                               {"name": "target_table",   "type": "varuint32*",                                              "description": "target entries that indicate an outer block or loop to which to break"},
-                                                                                                                                                               {"name": "default_target", "type": "varuint32",                                               "description": "an outer block or loop to which to break in the default case"}],
-                                                                                                                                                                                                                                                             "description": "branch table control flow construct" },
-        "return":              { "category": "control",    "value":  15, "return": [],              "parameter": [],                             "immediate": [],                                                                                            "description": "return zero or one value from this function" },
-        "drop":                { "category": "control",    "value":  26, "return": [],              "parameter": ["any"],                        "immediate": [],                                                                                            "description": "ignore value" },
-        "nop":                 { "category": "control",    "value":   1, "return": [],              "parameter": [],                             "immediate": [],                                                                                            "description": "no operation" },
-        "end":                 { "category": "control",    "value":  11, "return": [],              "parameter": [],                             "immediate": [],                                                                                            "description": "end a block, loop, or if" },
-        "i32.const":           { "category": "special",    "value":  65, "return": ["i32"],         "parameter": [],                             "immediate": [{"name": "value",          "type": "varint32"}],                                              "description": "a constant value interpreted as i32" },
-        "i64.const":           { "category": "special",    "value":  66, "return": ["i64"],         "parameter": [],                             "immediate": [{"name": "value",          "type": "varint64"}],                                              "description": "a constant value interpreted as i64" },
-        "f64.const":           { "category": "special",    "value":  68, "return": ["f64"],         "parameter": [],                             "immediate": [{"name": "value",          "type": "double"}],                                                "description": "a constant value interpreted as f64" },
-        "f32.const":           { "category": "special",    "value":  67, "return": ["f32"],         "parameter": [],                             "immediate": [{"name": "value",          "type": "float"}],                                                 "description": "a constant value interpreted as f32" },
-        "ref.null":            { "category": "special",    "value": 208, "return": ["funcref"],     "parameter": [],                             "immediate": [],                                                                                            "description": "a constant null reference" },
-        "ref.is_null":         { "category": "special",    "value": 209, "return": ["i32"],         "parameter": ["externref"],                  "immediate": [],                                                                                            "description": "determine if a reference is null" },
-        "ref.func":            { "category": "special",    "value": 210, "return": ["funcref"],     "parameter": [],                             "immediate": [{"name": "function_index", "type": "varuint32"}],                                             "description": "return a reference to the function at the given index" },
-        "get_local":           { "category": "special",    "value":  32, "return": ["any"],         "parameter": [],                             "immediate": [{"name": "local_index",    "type": "varuint32"}],                                             "description": "read a local variable or parameter" },
-        "set_local":           { "category": "special",    "value":  33, "return": [],              "parameter": ["any"],                        "immediate": [{"name": "local_index",    "type": "varuint32"}],                                             "description": "write a local variable or parameter" },
-        "tee_local":           { "category": "special",    "value":  34, "return": ["any"],         "parameter": ["any"],                        "immediate": [{"name": "local_index",    "type": "varuint32"}],                                             "description": "write a local variable or parameter and return the same value" },
-        "get_global":          { "category": "special",    "value":  35, "return": ["any"],         "parameter": [],                             "immediate": [{"name": "global_index",   "type": "varuint32"}],                                             "description": "read a global variable" },
-        "set_global":          { "category": "special",    "value":  36, "return": [],              "parameter": ["any"],                        "immediate": [{"name": "global_index",   "type": "varuint32"}],                                             "description": "write a global variable" },
-        "table.get":           { "category": "special",    "value":  37, "return": ["externref"],   "parameter": ["i32"],                        "immediate": [{"name": "table_index",    "type": "varuint32"}],                                             "description": "get a table value" },
-        "table.set":           { "category": "special",    "value":  38, "return": [],              "parameter": ["i32", "externref"],           "immediate": [{"name": "table_index",    "type": "varuint32"}],                                             "description": "set a table value" },
-        "table.size":          { "category": "exttable",   "value":  252, "return": ["i32"],        "parameter": [],                             "immediate": [{"name": "table_index",    "type": "varuint32"}],                                             "description": "get the size of a table", "extendedOp": 15 },
-        "table.grow":          { "category": "exttable",   "value":  252, "return": ["i32"],        "parameter": ["externref", "i32"],           "immediate": [{"name": "table_index",    "type": "varuint32"}],                                             "description": "grow a table by the given delta and return the previous size, or -1 if enough space cannot be allocated", "extendedOp": 16 },
-        "table.fill":          { "category": "exttable",   "value":  252, "return": ["i32"],        "parameter": ["i32", "externref", "i32"],    "immediate": [{"name": "table_index",    "type": "varuint32"}],                                             "description": "fill entries [i,i+n) with the given value", "extendedOp": 17 },
-        "call":                { "category": "call",       "value":  16, "return": ["call"],        "parameter": ["call"],                       "immediate": [{"name": "function_index", "type": "varuint32"}],                                             "description": "call a function by its index" },
-        "call_indirect":       { "category": "call",       "value":  17, "return": ["call"],        "parameter": ["call"],                       "immediate": [{"name": "type_index",     "type": "varuint32"}, {"name": "table_index","type": "varuint32"}],"description": "call a function indirect with an expected signature" },
-        "i32.load8_s":         { "category": "memory",     "value":  44, "return": ["i32"],         "parameter": ["addr"],                       "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "load from memory" },
-        "i32.load8_u":         { "category": "memory",     "value":  45, "return": ["i32"],         "parameter": ["addr"],                       "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "load from memory" },
-        "i32.load16_s":        { "category": "memory",     "value":  46, "return": ["i32"],         "parameter": ["addr"],                       "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "load from memory" },
-        "i32.load16_u":        { "category": "memory",     "value":  47, "return": ["i32"],         "parameter": ["addr"],                       "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "load from memory" },
-        "i64.load8_s":         { "category": "memory",     "value":  48, "return": ["i64"],         "parameter": ["addr"],                       "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "load from memory" },
-        "i64.load8_u":         { "category": "memory",     "value":  49, "return": ["i64"],         "parameter": ["addr"],                       "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "load from memory" },
-        "i64.load16_s":        { "category": "memory",     "value":  50, "return": ["i64"],         "parameter": ["addr"],                       "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "load from memory" },
-        "i64.load16_u":        { "category": "memory",     "value":  51, "return": ["i64"],         "parameter": ["addr"],                       "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "load from memory" },
-        "i64.load32_s":        { "category": "memory",     "value":  52, "return": ["i64"],         "parameter": ["addr"],                       "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "load from memory" },
-        "i64.load32_u":        { "category": "memory",     "value":  53, "return": ["i64"],         "parameter": ["addr"],                       "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "load from memory" },
-        "i32.load":            { "category": "memory",     "value":  40, "return": ["i32"],         "parameter": ["addr"],                       "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "load from memory" },
-        "i64.load":            { "category": "memory",     "value":  41, "return": ["i64"],         "parameter": ["addr"],                       "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "load from memory" },
-        "f32.load":            { "category": "memory",     "value":  42, "return": ["f32"],         "parameter": ["addr"],                       "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "load from memory" },
-        "f64.load":            { "category": "memory",     "value":  43, "return": ["f64"],         "parameter": ["addr"],                       "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "load from memory" },
-        "i32.store8":          { "category": "memory",     "value":  58, "return": [],              "parameter": ["addr", "i32"],                "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "store to memory" },
-        "i32.store16":         { "category": "memory",     "value":  59, "return": [],              "parameter": ["addr", "i32"],                "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "store to memory" },
-        "i64.store8":          { "category": "memory",     "value":  60, "return": [],              "parameter": ["addr", "i64"],                "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "store to memory" },
-        "i64.store16":         { "category": "memory",     "value":  61, "return": [],              "parameter": ["addr", "i64"],                "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "store to memory" },
-        "i64.store32":         { "category": "memory",     "value":  62, "return": [],              "parameter": ["addr", "i64"],                "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "store to memory" },
-        "i32.store":           { "category": "memory",     "value":  54, "return": [],              "parameter": ["addr", "i32"],                "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "store to memory" },
-        "i64.store":           { "category": "memory",     "value":  55, "return": [],              "parameter": ["addr", "i64"],                "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "store to memory" },
-        "f32.store":           { "category": "memory",     "value":  56, "return": [],              "parameter": ["addr", "f32"],                "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "store to memory" },
-        "f64.store":           { "category": "memory",     "value":  57, "return": [],              "parameter": ["addr", "f64"],                "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "store to memory" },
-        "current_memory":      { "category": "operation",  "value":  63, "return": ["size"],        "parameter": [],                             "immediate": [{"name": "flags",          "type": "varuint32"}],                                            "description": "query the size of memory" },
-        "grow_memory":         { "category": "operation",  "value":  64, "return": ["size"],        "parameter": ["size"],                       "immediate": [{"name": "flags",          "type": "varuint32"}],                                            "description": "grow the size of memory" },
-        "i32.add":             { "category": "arithmetic", "value": 106, "return": ["i32"],         "parameter": ["i32", "i32"],                 "immediate": [], "b3op": "Add"          },
-        "i32.sub":             { "category": "arithmetic", "value": 107, "return": ["i32"],         "parameter": ["i32", "i32"],                 "immediate": [], "b3op": "Sub"          },
-        "i32.mul":             { "category": "arithmetic", "value": 108, "return": ["i32"],         "parameter": ["i32", "i32"],                 "immediate": [], "b3op": "Mul"          },
-        "i32.div_s":           { "category": "arithmetic", "value": 109, "return": ["i32"],         "parameter": ["i32", "i32"],                 "immediate": []                         },
-        "i32.div_u":           { "category": "arithmetic", "value": 110, "return": ["i32"],         "parameter": ["i32", "i32"],                 "immediate": []                         },
-        "i32.rem_s":           { "category": "arithmetic", "value": 111, "return": ["i32"],         "parameter": ["i32", "i32"],                 "immediate": []                         },
-        "i32.rem_u":           { "category": "arithmetic", "value": 112, "return": ["i32"],         "parameter": ["i32", "i32"],                 "immediate": []                         },
-        "i32.and":             { "category": "arithmetic", "value": 113, "return": ["i32"],         "parameter": ["i32", "i32"],                 "immediate": [], "b3op": "BitAnd"       },
-        "i32.or":              { "category": "arithmetic", "value": 114, "return": ["i32"],         "parameter": ["i32", "i32"],                 "immediate": [], "b3op": "BitOr"        },
-        "i32.xor":             { "category": "arithmetic", "value": 115, "return": ["i32"],         "parameter": ["i32", "i32"],                 "immediate": [], "b3op": "BitXor"       },
-        "i32.shl":             { "category": "arithmetic", "value": 116, "return": ["i32"],         "parameter": ["i32", "i32"],                 "immediate": [], "b3op": "Shl"          },
-        "i32.shr_u":           { "category": "arithmetic", "value": 118, "return": ["i32"],         "parameter": ["i32", "i32"],                 "immediate": [], "b3op": "ZShr"         },
-        "i32.shr_s":           { "category": "arithmetic", "value": 117, "return": ["i32"],         "parameter": ["i32", "i32"],                 "immediate": [], "b3op": "SShr"         },
-        "i32.rotr":            { "category": "arithmetic", "value": 120, "return": ["i32"],         "parameter": ["i32", "i32"],                 "immediate": [], "b3op": "RotR"         },
-        "i32.rotl":            { "category": "arithmetic", "value": 119, "return": ["i32"],         "parameter": ["i32", "i32"],                 "immediate": [], "b3op": "RotL"         },
-        "i32.eq":              { "category": "comparison", "value":  70, "return": ["bool"],        "parameter": ["i32", "i32"],                 "immediate": [], "b3op": "Equal"        },
-        "i32.ne":              { "category": "comparison", "value":  71, "return": ["bool"],        "parameter": ["i32", "i32"],                 "immediate": [], "b3op": "NotEqual"     },
-        "i32.lt_s":            { "category": "comparison", "value":  72, "return": ["bool"],        "parameter": ["i32", "i32"],                 "immediate": [], "b3op": "LessThan"     },
-        "i32.le_s":            { "category": "comparison", "value":  76, "return": ["bool"],        "parameter": ["i32", "i32"],                 "immediate": [], "b3op": "LessEqual"    },
-        "i32.lt_u":            { "category": "comparison", "value":  73, "return": ["bool"],        "parameter": ["i32", "i32"],                 "immediate": [], "b3op": "Below"        },
-        "i32.le_u":            { "category": "comparison", "value":  77, "return": ["bool"],        "parameter": ["i32", "i32"],                 "immediate": [], "b3op": "BelowEqual"   },
-        "i32.gt_s":            { "category": "comparison", "value":  74, "return": ["bool"],        "parameter": ["i32", "i32"],                 "immediate": [], "b3op": "GreaterThan"  },
-        "i32.ge_s":            { "category": "comparison", "value":  78, "return": ["bool"],        "parameter": ["i32", "i32"],                 "immediate": [], "b3op": "GreaterEqual" },
-        "i32.gt_u":            { "category": "comparison", "value":  75, "return": ["bool"],        "parameter": ["i32", "i32"],                 "immediate": [], "b3op": "Above"        },
-        "i32.ge_u":            { "category": "comparison", "value":  79, "return": ["bool"],        "parameter": ["i32", "i32"],                 "immediate": [], "b3op": "AboveEqual"   },
-        "i32.clz":             { "category": "arithmetic", "value": 103, "return": ["i32"],         "parameter": ["i32"],                        "immediate": [], "b3op": "Clz"          },
-        "i32.ctz":             { "category": "arithmetic", "value": 104, "return": ["i32"],         "parameter": ["i32"],                        "immediate": []                         },
-        "i32.popcnt":          { "category": "arithmetic", "value": 105, "return": ["i32"],         "parameter": ["i32"],                        "immediate": []                         },
-        "i32.eqz":             { "category": "comparison", "value":  69, "return": ["bool"],        "parameter": ["i32"],                        "immediate": [], "b3op": "Equal(i32(0), @0)" },
-        "i64.add":             { "category": "arithmetic", "value": 124, "return": ["i64"],         "parameter": ["i64", "i64"],                 "immediate": [], "b3op": "Add"          },
-        "i64.sub":             { "category": "arithmetic", "value": 125, "return": ["i64"],         "parameter": ["i64", "i64"],                 "immediate": [], "b3op": "Sub"          },
-        "i64.mul":             { "category": "arithmetic", "value": 126, "return": ["i64"],         "parameter": ["i64", "i64"],                 "immediate": [], "b3op": "Mul"          },
-        "i64.div_s":           { "category": "arithmetic", "value": 127, "return": ["i64"],         "parameter": ["i64", "i64"],                 "immediate": []                         },
-        "i64.div_u":           { "category": "arithmetic", "value": 128, "return": ["i64"],         "parameter": ["i64", "i64"],                 "immediate": []                         },
-        "i64.rem_s":           { "category": "arithmetic", "value": 129, "return": ["i64"],         "parameter": ["i64", "i64"],                 "immediate": []                         },
-        "i64.rem_u":           { "category": "arithmetic", "value": 130, "return": ["i64"],         "parameter": ["i64", "i64"],                 "immediate": []                         },
-        "i64.and":             { "category": "arithmetic", "value": 131, "return": ["i64"],         "parameter": ["i64", "i64"],                 "immediate": [], "b3op": "BitAnd"       },
-        "i64.or":              { "category": "arithmetic", "value": 132, "return": ["i64"],         "parameter": ["i64", "i64"],                 "immediate": [], "b3op": "BitOr"        },
-        "i64.xor":             { "category": "arithmetic", "value": 133, "return": ["i64"],         "parameter": ["i64", "i64"],                 "immediate": [], "b3op": "BitXor"       },
-        "i64.shl":             { "category": "arithmetic", "value": 134, "return": ["i64"],         "parameter": ["i64", "i64"],                 "immediate": [], "b3op": "Shl(@0, Trunc(@1))" },
-        "i64.shr_u":           { "category": "arithmetic", "value": 136, "return": ["i64"],         "parameter": ["i64", "i64"],                 "immediate": [], "b3op": "ZShr(@0, Trunc(@1))" },
-        "i64.shr_s":           { "category": "arithmetic", "value": 135, "return": ["i64"],         "parameter": ["i64", "i64"],                 "immediate": [], "b3op": "SShr(@0, Trunc(@1))" },
-        "i64.rotr":            { "category": "arithmetic", "value": 138, "return": ["i64"],         "parameter": ["i64", "i64"],                 "immediate": [], "b3op": "RotR(@0, Trunc(@1))" },
-        "i64.rotl":            { "category": "arithmetic", "value": 137, "return": ["i64"],         "parameter": ["i64", "i64"],                 "immediate": [], "b3op": "RotL(@0, Trunc(@1))" },
-        "i64.eq":              { "category": "comparison", "value":  81, "return": ["bool"],        "parameter": ["i64", "i64"],                 "immediate": [], "b3op": "Equal"        },
-        "i64.ne":              { "category": "comparison", "value":  82, "return": ["bool"],        "parameter": ["i64", "i64"],                 "immediate": [], "b3op": "NotEqual"     },
-        "i64.lt_s":            { "category": "comparison", "value":  83, "return": ["bool"],        "parameter": ["i64", "i64"],                 "immediate": [], "b3op": "LessThan"     },
-        "i64.le_s":            { "category": "comparison", "value":  87, "return": ["bool"],        "parameter": ["i64", "i64"],                 "immediate": [], "b3op": "LessEqual"    },
-        "i64.lt_u":            { "category": "comparison", "value":  84, "return": ["bool"],        "parameter": ["i64", "i64"],                 "immediate": [], "b3op": "Below"        },
-        "i64.le_u":            { "category": "comparison", "value":  88, "return": ["bool"],        "parameter": ["i64", "i64"],                 "immediate": [], "b3op": "BelowEqual"   },
-        "i64.gt_s":            { "category": "comparison", "value":  85, "return": ["bool"],        "parameter": ["i64", "i64"],                 "immediate": [], "b3op": "GreaterThan"  },
-        "i64.ge_s":            { "category": "comparison", "value":  89, "return": ["bool"],        "parameter": ["i64", "i64"],                 "immediate": [], "b3op": "GreaterEqual" },
-        "i64.gt_u":            { "category": "comparison", "value":  86, "return": ["bool"],        "parameter": ["i64", "i64"],                 "immediate": [], "b3op": "Above"        },
-        "i64.ge_u":            { "category": "comparison", "value":  90, "return": ["bool"],        "parameter": ["i64", "i64"],                 "immediate": [], "b3op": "AboveEqual"   },
-        "i64.clz":             { "category": "arithmetic", "value": 121, "return": ["i64"],         "parameter": ["i64"],                        "immediate": [], "b3op": "Clz"          },
-        "i64.ctz":             { "category": "arithmetic", "value": 122, "return": ["i64"],         "parameter": ["i64"],                        "immediate": []                         },
-        "i64.popcnt":          { "category": "arithmetic", "value": 123, "return": ["i64"],         "parameter": ["i64"],                        "immediate": []                         },
-        "i64.eqz":             { "category": "comparison", "value":  80, "return": ["bool"],        "parameter": ["i64"],                        "immediate": [], "b3op": "Equal(i64(0), @0)" },
-        "f32.add":             { "category": "arithmetic", "value": 146, "return": ["f32"],         "parameter": ["f32", "f32"],                 "immediate": [], "b3op": "Add"          },
-        "f32.sub":             { "category": "arithmetic", "value": 147, "return": ["f32"],         "parameter": ["f32", "f32"],                 "immediate": [], "b3op": "Sub"          },
-        "f32.mul":             { "category": "arithmetic", "value": 148, "return": ["f32"],         "parameter": ["f32", "f32"],                 "immediate": [], "b3op": "Mul"          },
-        "f32.div":             { "category": "arithmetic", "value": 149, "return": ["f32"],         "parameter": ["f32", "f32"],                 "immediate": [], "b3op": "Div"          },
-        "f32.min":             { "category": "arithmetic", "value": 150, "return": ["f32"],         "parameter": ["f32", "f32"],                 "immediate": [], "b3op": "Select(Equal(@0, @1), BitOr(@0, @1), Select(LessThan(@0, @1), @0, Select(GreaterThan(@0, @1), @1, Add(@0, @1))))" },
-        "f32.max":             { "category": "arithmetic", "value": 151, "return": ["f32"],         "parameter": ["f32", "f32"],                 "immediate": [], "b3op": "Select(Equal(@0, @1), BitAnd(@0, @1), Select(LessThan(@0, @1), @1, Select(GreaterThan(@0, @1), @0, Add(@0, @1))))" },
-        "f32.abs":             { "category": "arithmetic", "value": 139, "return": ["f32"],         "parameter": ["f32"],                        "immediate": [], "b3op": "Abs"          },
-        "f32.neg":             { "category": "arithmetic", "value": 140, "return": ["f32"],         "parameter": ["f32"],                        "immediate": [], "b3op": "Neg"          },
-        "f32.copysign":        { "category": "arithmetic", "value": 152, "return": ["f32"],         "parameter": ["f32", "f32"],                 "immediate": [], "b3op": "BitwiseCast(BitOr(BitAnd(BitwiseCast(@1), i32(0x80000000)), BitAnd(BitwiseCast(@0), i32(0x7fffffff))))" },
-        "f32.ceil":            { "category": "arithmetic", "value": 141, "return": ["f32"],         "parameter": ["f32"],                        "immediate": [], "b3op": "Ceil"         },
-        "f32.floor":           { "category": "arithmetic", "value": 142, "return": ["f32"],         "parameter": ["f32"],                        "immediate": [], "b3op": "Floor"        },
-        "f32.trunc":           { "category": "arithmetic", "value": 143, "return": ["f32"],         "parameter": ["f32"],                        "immediate": []                         },
-        "f32.nearest":         { "category": "arithmetic", "value": 144, "return": ["f32"],         "parameter": ["f32"],                        "immediate": []                         },
-        "f32.sqrt":            { "category": "arithmetic", "value": 145, "return": ["f32"],         "parameter": ["f32"],                        "immediate": [], "b3op": "Sqrt"         },
-        "f32.eq":              { "category": "comparison", "value":  91, "return": ["bool"],        "parameter": ["f32", "f32"],                 "immediate": [], "b3op": "Equal"        },
-        "f32.ne":              { "category": "comparison", "value":  92, "return": ["bool"],        "parameter": ["f32", "f32"],                 "immediate": [], "b3op": "NotEqual"     },
-        "f32.lt":              { "category": "comparison", "value":  93, "return": ["bool"],        "parameter": ["f32", "f32"],                 "immediate": [], "b3op": "LessThan"     },
-        "f32.le":              { "category": "comparison", "value":  95, "return": ["bool"],        "parameter": ["f32", "f32"],                 "immediate": [], "b3op": "LessEqual"    },
-        "f32.gt":              { "category": "comparison", "value":  94, "return": ["bool"],        "parameter": ["f32", "f32"],                 "immediate": [], "b3op": "GreaterThan"  },
-        "f32.ge":              { "category": "comparison", "value":  96, "return": ["bool"],        "parameter": ["f32", "f32"],                 "immediate": [], "b3op": "GreaterEqual" },
-        "f64.add":             { "category": "arithmetic", "value": 160, "return": ["f64"],         "parameter": ["f64", "f64"],                 "immediate": [], "b3op": "Add"          },
-        "f64.sub":             { "category": "arithmetic", "value": 161, "return": ["f64"],         "parameter": ["f64", "f64"],                 "immediate": [], "b3op": "Sub"          },
-        "f64.mul":             { "category": "arithmetic", "value": 162, "return": ["f64"],         "parameter": ["f64", "f64"],                 "immediate": [], "b3op": "Mul"          },
-        "f64.div":             { "category": "arithmetic", "value": 163, "return": ["f64"],         "parameter": ["f64", "f64"],                 "immediate": [], "b3op": "Div"          },
-        "f64.min":             { "category": "arithmetic", "value": 164, "return": ["f64"],         "parameter": ["f64", "f64"],                 "immediate": [], "b3op": "Select(Equal(@0, @1), BitOr(@0, @1), Select(LessThan(@0, @1), @0, Select(GreaterThan(@0, @1), @1, Add(@0, @1))))" },
-        "f64.max":             { "category": "arithmetic", "value": 165, "return": ["f64"],         "parameter": ["f64", "f64"],                 "immediate": [], "b3op": "Select(Equal(@0, @1), BitAnd(@0, @1), Select(LessThan(@0, @1), @1, Select(GreaterThan(@0, @1), @0, Add(@0, @1))))" },
-        "f64.abs":             { "category": "arithmetic", "value": 153, "return": ["f64"],         "parameter": ["f64"],                        "immediate": [], "b3op": "Abs"          },
-        "f64.neg":             { "category": "arithmetic", "value": 154, "return": ["f64"],         "parameter": ["f64"],                        "immediate": [], "b3op": "Neg"          },
-        "f64.copysign":        { "category": "arithmetic", "value": 166, "return": ["f64"],         "parameter": ["f64", "f64"],                 "immediate": [], "b3op": "BitwiseCast(BitOr(BitAnd(BitwiseCast(@1), i64(0x8000000000000000)), BitAnd(BitwiseCast(@0), i64(0x7fffffffffffffff))))" },
-        "f64.ceil":            { "category": "arithmetic", "value": 155, "return": ["f64"],         "parameter": ["f64"],                        "immediate": [], "b3op": "Ceil"         },
-        "f64.floor":           { "category": "arithmetic", "value": 156, "return": ["f64"],         "parameter": ["f64"],                        "immediate": [], "b3op": "Floor"        },
-        "f64.trunc":           { "category": "arithmetic", "value": 157, "return": ["f64"],         "parameter": ["f64"],                        "immediate": []                         },
-        "f64.nearest":         { "category": "arithmetic", "value": 158, "return": ["f64"],         "parameter": ["f64"],                        "immediate": []                         },
-        "f64.sqrt":            { "category": "arithmetic", "value": 159, "return": ["f64"],         "parameter": ["f64"],                        "immediate": [], "b3op": "Sqrt"         },
-        "f64.eq":              { "category": "comparison", "value":  97, "return": ["bool"],        "parameter": ["f64", "f64"],                 "immediate": [], "b3op": "Equal"        },
-        "f64.ne":              { "category": "comparison", "value":  98, "return": ["bool"],        "parameter": ["f64", "f64"],                 "immediate": [], "b3op": "NotEqual"     },
-        "f64.lt":              { "category": "comparison", "value":  99, "return": ["bool"],        "parameter": ["f64", "f64"],                 "immediate": [], "b3op": "LessThan"     },
-        "f64.le":              { "category": "comparison", "value": 101, "return": ["bool"],        "parameter": ["f64", "f64"],                 "immediate": [], "b3op": "LessEqual"    },
-        "f64.gt":              { "category": "comparison", "value": 100, "return": ["bool"],        "parameter": ["f64", "f64"],                 "immediate": [], "b3op": "GreaterThan"  },
-        "f64.ge":              { "category": "comparison", "value": 102, "return": ["bool"],        "parameter": ["f64", "f64"],                 "immediate": [], "b3op": "GreaterEqual" },
-        "i32.trunc_s/f32":     { "category": "conversion", "value": 168, "return": ["i32"],         "parameter": ["f32"],                        "immediate": []                         },
-        "i32.trunc_s/f64":     { "category": "conversion", "value": 170, "return": ["i32"],         "parameter": ["f64"],                        "immediate": []                         },
-        "i32.trunc_u/f32":     { "category": "conversion", "value": 169, "return": ["i32"],         "parameter": ["f32"],                        "immediate": []                         },
-        "i32.trunc_u/f64":     { "category": "conversion", "value": 171, "return": ["i32"],         "parameter": ["f64"],                        "immediate": []                         },
-        "i32.wrap/i64":        { "category": "conversion", "value": 167, "return": ["i32"],         "parameter": ["i64"],                        "immediate": [], "b3op": "Trunc"        },
-        "i64.trunc_s/f32":     { "category": "conversion", "value": 174, "return": ["i64"],         "parameter": ["f32"],                        "immediate": []                         },
-        "i64.trunc_s/f64":     { "category": "conversion", "value": 176, "return": ["i64"],         "parameter": ["f64"],                        "immediate": []                         },
-        "i64.trunc_u/f32":     { "category": "conversion", "value": 175, "return": ["i64"],         "parameter": ["f32"],                        "immediate": []                         },
-        "i64.trunc_u/f64":     { "category": "conversion", "value": 177, "return": ["i64"],         "parameter": ["f64"],                        "immediate": []                         },
-        "i64.extend_s/i32":    { "category": "conversion", "value": 172, "return": ["i64"],         "parameter": ["i32"],                        "immediate": [], "b3op": "SExt32"       },
-        "i64.extend_u/i32":    { "category": "conversion", "value": 173, "return": ["i64"],         "parameter": ["i32"],                        "immediate": [], "b3op": "ZExt32"       },
-        "f32.convert_s/i32":   { "category": "conversion", "value": 178, "return": ["f32"],         "parameter": ["i32"],                        "immediate": [], "b3op": "IToF"         },
-        "f32.convert_u/i32":   { "category": "conversion", "value": 179, "return": ["f32"],         "parameter": ["i32"],                        "immediate": [], "b3op": "IToF(ZExt32(@0))" },
-        "f32.convert_s/i64":   { "category": "conversion", "value": 180, "return": ["f32"],         "parameter": ["i64"],                        "immediate": [], "b3op": "IToF"         },
-        "f32.convert_u/i64":   { "category": "conversion", "value": 181, "return": ["f32"],         "parameter": ["i64"],                        "immediate": []                         },
-        "f32.demote/f64":      { "category": "conversion", "value": 182, "return": ["f32"],         "parameter": ["f64"],                        "immediate": [], "b3op": "DoubleToFloat"},
-        "f32.reinterpret/i32": { "category": "conversion", "value": 190, "return": ["f32"],         "parameter": ["i32"],                        "immediate": [], "b3op": "BitwiseCast"  },
-        "f64.convert_s/i32":   { "category": "conversion", "value": 183, "return": ["f64"],         "parameter": ["i32"],                        "immediate": [], "b3op": "IToD"         },
-        "f64.convert_u/i32":   { "category": "conversion", "value": 184, "return": ["f64"],         "parameter": ["i32"],                        "immediate": [], "b3op": "IToD(ZExt32(@0))" },
-        "f64.convert_s/i64":   { "category": "conversion", "value": 185, "return": ["f64"],         "parameter": ["i64"],                        "immediate": [], "b3op": "IToD"         },
-        "f64.convert_u/i64":   { "category": "conversion", "value": 186, "return": ["f64"],         "parameter": ["i64"],                        "immediate": []                         },
-        "f64.promote/f32":     { "category": "conversion", "value": 187, "return": ["f64"],         "parameter": ["f32"],                        "immediate": [], "b3op": "FloatToDouble"},
-        "f64.reinterpret/i64": { "category": "conversion", "value": 191, "return": ["f64"],         "parameter": ["i64"],                        "immediate": [], "b3op": "BitwiseCast"  },
-        "i32.reinterpret/f32": { "category": "conversion", "value": 188, "return": ["i32"],         "parameter": ["f32"],                        "immediate": [], "b3op": "BitwiseCast"  },
-        "i64.reinterpret/f64": { "category": "conversion", "value": 189, "return": ["i64"],         "parameter": ["f64"],                        "immediate": [], "b3op": "BitwiseCast"  }
</del><ins>+        "unreachable":         { "category": "control",    "value":   0, "return": [],                               "parameter": [],                             "immediate": [],                                                                                            "description": "trap immediately" },
+        "block":               { "category": "control",    "value":   2, "return": ["control"],                      "parameter": [],                             "immediate": [{"name": "sig", "type": "block_type"}],                                                       "description": "begin a sequence of expressions, yielding 0 or 1 values" },
+        "loop":                { "category": "control",    "value":   3, "return": ["control"],                      "parameter": [],                             "immediate": [{"name": "sig", "type": "block_type"}],                                                       "description": "begin a block which can also form control flow loops" },
+        "if":                  { "category": "control",    "value":   4, "return": ["control"],                      "parameter": ["bool"],                       "immediate": [{"name": "sig", "type": "block_type"}],                                                       "description": "begin if expression" },
+        "else":                { "category": "control",    "value":   5, "return": ["control"],                      "parameter": [],                             "immediate": [],                                                                                            "description": "begin else expression of if" },
+        "select":              { "category": "control",    "value":  27, "return": ["prev"],                         "parameter": ["any", "prev", "bool"],        "immediate": [],                                                                                            "description": "select one of two values based on condition" },
+        "br":                  { "category": "control",    "value":  12, "return": [],                               "parameter": [],                             "immediate": [{"name": "relative_depth", "type": "varuint32"}],                                             "description": "break that targets an outer nested block" },
+        "br_if":               { "category": "control",    "value":  13, "return": [],                               "parameter": [],                             "immediate": [{"name": "relative_depth", "type": "varuint32"}],                                             "description": "conditional break that targets an outer nested block" },
+        "br_table":            { "category": "control",    "value":  14, "return": [],                               "parameter": [],                             "immediate": [{"name": "target_count",   "type": "varuint32",                                               "description": "number of entries in the target_table"},
+                                                                                                                                                                                {"name": "target_table",   "type": "varuint32*",                                              "description": "target entries that indicate an outer block or loop to which to break"},
+                                                                                                                                                                                {"name": "default_target", "type": "varuint32",                                               "description": "an outer block or loop to which to break in the default case"}],
+                                                                                                                                                                                                                                                                              "description": "branch table control flow construct" },
+        "return":              { "category": "control",    "value":  15, "return": [],                               "parameter": [],                             "immediate": [],                                                                                            "description": "return zero or one value from this function" },
+        "drop":                { "category": "control",    "value":  26, "return": [],                               "parameter": ["any"],                        "immediate": [],                                                                                            "description": "ignore value" },
+        "nop":                 { "category": "control",    "value":   1, "return": [],                               "parameter": [],                             "immediate": [],                                                                                            "description": "no operation" },
+        "end":                 { "category": "control",    "value":  11, "return": [],                               "parameter": [],                             "immediate": [],                                                                                            "description": "end a block, loop, or if" },
+        "i32.const":           { "category": "special",    "value":  65, "return": ["i32"],                          "parameter": [],                             "immediate": [{"name": "value",          "type": "varint32"}],                                              "description": "a constant value interpreted as i32" },
+        "i64.const":           { "category": "special",    "value":  66, "return": ["i64"],                          "parameter": [],                             "immediate": [{"name": "value",          "type": "varint64"}],                                              "description": "a constant value interpreted as i64" },
+        "f64.const":           { "category": "special",    "value":  68, "return": ["f64"],                          "parameter": [],                             "immediate": [{"name": "value",          "type": "double"}],                                                "description": "a constant value interpreted as f64" },
+        "f32.const":           { "category": "special",    "value":  67, "return": ["f32"],                          "parameter": [],                             "immediate": [{"name": "value",          "type": "float"}],                                                 "description": "a constant value interpreted as f32" },
+        "ref.null":            { "category": "special",    "value": 208, "return": ["externref", "funcref"],         "parameter": [],                             "immediate": [{"name": "reftype",        "type": "ref_type"}],                                              "description": "a constant null reference" },
+        "ref.is_null":         { "category": "special",    "value": 209, "return": ["i32"],                          "parameter": ["externref"],                  "immediate": [],                                                                                            "description": "determine if a reference is null" },
+        "ref.func":            { "category": "special",    "value": 210, "return": ["funcref"],                      "parameter": [],                             "immediate": [{"name": "function_index", "type": "varuint32"}],                                             "description": "return a reference to the function at the given index" },
+        "get_local":           { "category": "special",    "value":  32, "return": ["any"],                          "parameter": [],                             "immediate": [{"name": "local_index",    "type": "varuint32"}],                                             "description": "read a local variable or parameter" },
+        "set_local":           { "category": "special",    "value":  33, "return": [],                               "parameter": ["any"],                        "immediate": [{"name": "local_index",    "type": "varuint32"}],                                             "description": "write a local variable or parameter" },
+        "tee_local":           { "category": "special",    "value":  34, "return": ["any"],                          "parameter": ["any"],                        "immediate": [{"name": "local_index",    "type": "varuint32"}],                                             "description": "write a local variable or parameter and return the same value" },
+        "get_global":          { "category": "special",    "value":  35, "return": ["any"],                          "parameter": [],                             "immediate": [{"name": "global_index",   "type": "varuint32"}],                                             "description": "read a global variable" },
+        "set_global":          { "category": "special",    "value":  36, "return": [],                               "parameter": ["any"],                        "immediate": [{"name": "global_index",   "type": "varuint32"}],                                             "description": "write a global variable" },
+        "table.get":           { "category": "special",    "value":  37, "return": ["externref"],                    "parameter": ["i32"],                        "immediate": [{"name": "table_index",    "type": "varuint32"}],                                             "description": "get a table value" },
+        "table.set":           { "category": "special",    "value":  38, "return": [],                               "parameter": ["i32", "externref"],           "immediate": [{"name": "table_index",    "type": "varuint32"}],                                             "description": "set a table value" },
+        "table.size":          { "category": "exttable",   "value":  252, "return": ["i32"],                         "parameter": [],                             "immediate": [{"name": "table_index",    "type": "varuint32"}],                                             "description": "get the size of a table", "extendedOp": 15 },
+        "table.grow":          { "category": "exttable",   "value":  252, "return": ["i32"],                         "parameter": ["externref", "i32"],           "immediate": [{"name": "table_index",    "type": "varuint32"}],                                             "description": "grow a table by the given delta and return the previous size, or -1 if enough space cannot be allocated", "extendedOp": 16 },
+        "table.fill":          { "category": "exttable",   "value":  252, "return": ["i32"],                         "parameter": ["i32", "externref", "i32"],    "immediate": [{"name": "table_index",    "type": "varuint32"}],                                             "description": "fill entries [i,i+n) with the given value", "extendedOp": 17 },
+        "call":                { "category": "call",       "value":  16, "return": ["call"],                         "parameter": ["call"],                       "immediate": [{"name": "function_index", "type": "varuint32"}],                                             "description": "call a function by its index" },
+        "call_indirect":       { "category": "call",       "value":  17, "return": ["call"],                         "parameter": ["call"],                       "immediate": [{"name": "type_index",     "type": "varuint32"}, {"name": "table_index","type": "varuint32"}],"description": "call a function indirect with an expected signature" },
+        "i32.load8_s":         { "category": "memory",     "value":  44, "return": ["i32"],                          "parameter": ["addr"],                       "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "load from memory" },
+        "i32.load8_u":         { "category": "memory",     "value":  45, "return": ["i32"],                          "parameter": ["addr"],                       "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "load from memory" },
+        "i32.load16_s":        { "category": "memory",     "value":  46, "return": ["i32"],                          "parameter": ["addr"],                       "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "load from memory" },
+        "i32.load16_u":        { "category": "memory",     "value":  47, "return": ["i32"],                          "parameter": ["addr"],                       "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "load from memory" },
+        "i64.load8_s":         { "category": "memory",     "value":  48, "return": ["i64"],                          "parameter": ["addr"],                       "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "load from memory" },
+        "i64.load8_u":         { "category": "memory",     "value":  49, "return": ["i64"],                          "parameter": ["addr"],                       "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "load from memory" },
+        "i64.load16_s":        { "category": "memory",     "value":  50, "return": ["i64"],                          "parameter": ["addr"],                       "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "load from memory" },
+        "i64.load16_u":        { "category": "memory",     "value":  51, "return": ["i64"],                          "parameter": ["addr"],                       "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "load from memory" },
+        "i64.load32_s":        { "category": "memory",     "value":  52, "return": ["i64"],                          "parameter": ["addr"],                       "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "load from memory" },
+        "i64.load32_u":        { "category": "memory",     "value":  53, "return": ["i64"],                          "parameter": ["addr"],                       "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "load from memory" },
+        "i32.load":            { "category": "memory",     "value":  40, "return": ["i32"],                          "parameter": ["addr"],                       "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "load from memory" },
+        "i64.load":            { "category": "memory",     "value":  41, "return": ["i64"],                          "parameter": ["addr"],                       "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "load from memory" },
+        "f32.load":            { "category": "memory",     "value":  42, "return": ["f32"],                          "parameter": ["addr"],                       "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "load from memory" },
+        "f64.load":            { "category": "memory",     "value":  43, "return": ["f64"],                          "parameter": ["addr"],                       "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "load from memory" },
+        "i32.store8":          { "category": "memory",     "value":  58, "return": [],                               "parameter": ["addr", "i32"],                "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "store to memory" },
+        "i32.store16":         { "category": "memory",     "value":  59, "return": [],                               "parameter": ["addr", "i32"],                "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "store to memory" },
+        "i64.store8":          { "category": "memory",     "value":  60, "return": [],                               "parameter": ["addr", "i64"],                "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "store to memory" },
+        "i64.store16":         { "category": "memory",     "value":  61, "return": [],                               "parameter": ["addr", "i64"],                "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "store to memory" },
+        "i64.store32":         { "category": "memory",     "value":  62, "return": [],                               "parameter": ["addr", "i64"],                "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "store to memory" },
+        "i32.store":           { "category": "memory",     "value":  54, "return": [],                               "parameter": ["addr", "i32"],                "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "store to memory" },
+        "i64.store":           { "category": "memory",     "value":  55, "return": [],                               "parameter": ["addr", "i64"],                "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "store to memory" },
+        "f32.store":           { "category": "memory",     "value":  56, "return": [],                               "parameter": ["addr", "f32"],                "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "store to memory" },
+        "f64.store":           { "category": "memory",     "value":  57, "return": [],                               "parameter": ["addr", "f64"],                "immediate": [{"name": "flags",          "type": "varuint32"}, {"name": "offset",   "type": "varuint32"}], "description": "store to memory" },
+        "current_memory":      { "category": "operation",  "value":  63, "return": ["size"],                         "parameter": [],                             "immediate": [{"name": "flags",          "type": "varuint32"}],                                            "description": "query the size of memory" },
+        "grow_memory":         { "category": "operation",  "value":  64, "return": ["size"],                         "parameter": ["size"],                       "immediate": [{"name": "flags",          "type": "varuint32"}],                                            "description": "grow the size of memory" },
+        "i32.add":             { "category": "arithmetic", "value": 106, "return": ["i32"],                          "parameter": ["i32", "i32"],                 "immediate": [], "b3op": "Add"          },
+        "i32.sub":             { "category": "arithmetic", "value": 107, "return": ["i32"],                          "parameter": ["i32", "i32"],                 "immediate": [], "b3op": "Sub"          },
+        "i32.mul":             { "category": "arithmetic", "value": 108, "return": ["i32"],                          "parameter": ["i32", "i32"],                 "immediate": [], "b3op": "Mul"          },
+        "i32.div_s":           { "category": "arithmetic", "value": 109, "return": ["i32"],                          "parameter": ["i32", "i32"],                 "immediate": []                         },
+        "i32.div_u":           { "category": "arithmetic", "value": 110, "return": ["i32"],                          "parameter": ["i32", "i32"],                 "immediate": []                         },
+        "i32.rem_s":           { "category": "arithmetic", "value": 111, "return": ["i32"],                          "parameter": ["i32", "i32"],                 "immediate": []                         },
+        "i32.rem_u":           { "category": "arithmetic", "value": 112, "return": ["i32"],                          "parameter": ["i32", "i32"],                 "immediate": []                         },
+        "i32.and":             { "category": "arithmetic", "value": 113, "return": ["i32"],                          "parameter": ["i32", "i32"],                 "immediate": [], "b3op": "BitAnd"       },
+        "i32.or":              { "category": "arithmetic", "value": 114, "return": ["i32"],                          "parameter": ["i32", "i32"],                 "immediate": [], "b3op": "BitOr"        },
+        "i32.xor":             { "category": "arithmetic", "value": 115, "return": ["i32"],                          "parameter": ["i32", "i32"],                 "immediate": [], "b3op": "BitXor"       },
+        "i32.shl":             { "category": "arithmetic", "value": 116, "return": ["i32"],                          "parameter": ["i32", "i32"],                 "immediate": [], "b3op": "Shl"          },
+        "i32.shr_u":           { "category": "arithmetic", "value": 118, "return": ["i32"],                          "parameter": ["i32", "i32"],                 "immediate": [], "b3op": "ZShr"         },
+        "i32.shr_s":           { "category": "arithmetic", "value": 117, "return": ["i32"],                          "parameter": ["i32", "i32"],                 "immediate": [], "b3op": "SShr"         },
+        "i32.rotr":            { "category": "arithmetic", "value": 120, "return": ["i32"],                          "parameter": ["i32", "i32"],                 "immediate": [], "b3op": "RotR"         },
+        "i32.rotl":            { "category": "arithmetic", "value": 119, "return": ["i32"],                          "parameter": ["i32", "i32"],                 "immediate": [], "b3op": "RotL"         },
+        "i32.eq":              { "category": "comparison", "value":  70, "return": ["bool"],                         "parameter": ["i32", "i32"],                 "immediate": [], "b3op": "Equal"        },
+        "i32.ne":              { "category": "comparison", "value":  71, "return": ["bool"],                         "parameter": ["i32", "i32"],                 "immediate": [], "b3op": "NotEqual"     },
+        "i32.lt_s":            { "category": "comparison", "value":  72, "return": ["bool"],                         "parameter": ["i32", "i32"],                 "immediate": [], "b3op": "LessThan"     },
+        "i32.le_s":            { "category": "comparison", "value":  76, "return": ["bool"],                         "parameter": ["i32", "i32"],                 "immediate": [], "b3op": "LessEqual"    },
+        "i32.lt_u":            { "category": "comparison", "value":  73, "return": ["bool"],                         "parameter": ["i32", "i32"],                 "immediate": [], "b3op": "Below"        },
+        "i32.le_u":            { "category": "comparison", "value":  77, "return": ["bool"],                         "parameter": ["i32", "i32"],                 "immediate": [], "b3op": "BelowEqual"   },
+        "i32.gt_s":            { "category": "comparison", "value":  74, "return": ["bool"],                         "parameter": ["i32", "i32"],                 "immediate": [], "b3op": "GreaterThan"  },
+        "i32.ge_s":            { "category": "comparison", "value":  78, "return": ["bool"],                         "parameter": ["i32", "i32"],                 "immediate": [], "b3op": "GreaterEqual" },
+        "i32.gt_u":            { "category": "comparison", "value":  75, "return": ["bool"],                         "parameter": ["i32", "i32"],                 "immediate": [], "b3op": "Above"        },
+        "i32.ge_u":            { "category": "comparison", "value":  79, "return": ["bool"],                         "parameter": ["i32", "i32"],                 "immediate": [], "b3op": "AboveEqual"   },
+        "i32.clz":             { "category": "arithmetic", "value": 103, "return": ["i32"],                          "parameter": ["i32"],                        "immediate": [], "b3op": "Clz"          },
+        "i32.ctz":             { "category": "arithmetic", "value": 104, "return": ["i32"],                          "parameter": ["i32"],                        "immediate": []                         },
+        "i32.popcnt":          { "category": "arithmetic", "value": 105, "return": ["i32"],                          "parameter": ["i32"],                        "immediate": []                         },
+        "i32.eqz":             { "category": "comparison", "value":  69, "return": ["bool"],                         "parameter": ["i32"],                        "immediate": [], "b3op": "Equal(i32(0), @0)" },
+        "i64.add":             { "category": "arithmetic", "value": 124, "return": ["i64"],                          "parameter": ["i64", "i64"],                 "immediate": [], "b3op": "Add"          },
+        "i64.sub":             { "category": "arithmetic", "value": 125, "return": ["i64"],                          "parameter": ["i64", "i64"],                 "immediate": [], "b3op": "Sub"          },
+        "i64.mul":             { "category": "arithmetic", "value": 126, "return": ["i64"],                          "parameter": ["i64", "i64"],                 "immediate": [], "b3op": "Mul"          },
+        "i64.div_s":           { "category": "arithmetic", "value": 127, "return": ["i64"],                          "parameter": ["i64", "i64"],                 "immediate": []                         },
+        "i64.div_u":           { "category": "arithmetic", "value": 128, "return": ["i64"],                          "parameter": ["i64", "i64"],                 "immediate": []                         },
+        "i64.rem_s":           { "category": "arithmetic", "value": 129, "return": ["i64"],                          "parameter": ["i64", "i64"],                 "immediate": []                         },
+        "i64.rem_u":           { "category": "arithmetic", "value": 130, "return": ["i64"],                          "parameter": ["i64", "i64"],                 "immediate": []                         },
+        "i64.and":             { "category": "arithmetic", "value": 131, "return": ["i64"],                          "parameter": ["i64", "i64"],                 "immediate": [], "b3op": "BitAnd"       },
+        "i64.or":              { "category": "arithmetic", "value": 132, "return": ["i64"],                          "parameter": ["i64", "i64"],                 "immediate": [], "b3op": "BitOr"        },
+        "i64.xor":             { "category": "arithmetic", "value": 133, "return": ["i64"],                          "parameter": ["i64", "i64"],                 "immediate": [], "b3op": "BitXor"       },
+        "i64.shl":             { "category": "arithmetic", "value": 134, "return": ["i64"],                          "parameter": ["i64", "i64"],                 "immediate": [], "b3op": "Shl(@0, Trunc(@1))" },
+        "i64.shr_u":           { "category": "arithmetic", "value": 136, "return": ["i64"],                          "parameter": ["i64", "i64"],                 "immediate": [], "b3op": "ZShr(@0, Trunc(@1))" },
+        "i64.shr_s":           { "category": "arithmetic", "value": 135, "return": ["i64"],                          "parameter": ["i64", "i64"],                 "immediate": [], "b3op": "SShr(@0, Trunc(@1))" },
+        "i64.rotr":            { "category": "arithmetic", "value": 138, "return": ["i64"],                          "parameter": ["i64", "i64"],                 "immediate": [], "b3op": "RotR(@0, Trunc(@1))" },
+        "i64.rotl":            { "category": "arithmetic", "value": 137, "return": ["i64"],                          "parameter": ["i64", "i64"],                 "immediate": [], "b3op": "RotL(@0, Trunc(@1))" },
+        "i64.eq":              { "category": "comparison", "value":  81, "return": ["bool"],                         "parameter": ["i64", "i64"],                 "immediate": [], "b3op": "Equal"        },
+        "i64.ne":              { "category": "comparison", "value":  82, "return": ["bool"],                         "parameter": ["i64", "i64"],                 "immediate": [], "b3op": "NotEqual"     },
+        "i64.lt_s":            { "category": "comparison", "value":  83, "return": ["bool"],                         "parameter": ["i64", "i64"],                 "immediate": [], "b3op": "LessThan"     },
+        "i64.le_s":            { "category": "comparison", "value":  87, "return": ["bool"],                         "parameter": ["i64", "i64"],                 "immediate": [], "b3op": "LessEqual"    },
+        "i64.lt_u":            { "category": "comparison", "value":  84, "return": ["bool"],                         "parameter": ["i64", "i64"],                 "immediate": [], "b3op": "Below"        },
+        "i64.le_u":            { "category": "comparison", "value":  88, "return": ["bool"],                         "parameter": ["i64", "i64"],                 "immediate": [], "b3op": "BelowEqual"   },
+        "i64.gt_s":            { "category": "comparison", "value":  85, "return": ["bool"],                         "parameter": ["i64", "i64"],                 "immediate": [], "b3op": "GreaterThan"  },
+        "i64.ge_s":            { "category": "comparison", "value":  89, "return": ["bool"],                         "parameter": ["i64", "i64"],                 "immediate": [], "b3op": "GreaterEqual" },
+        "i64.gt_u":            { "category": "comparison", "value":  86, "return": ["bool"],                         "parameter": ["i64", "i64"],                 "immediate": [], "b3op": "Above"        },
+        "i64.ge_u":            { "category": "comparison", "value":  90, "return": ["bool"],                         "parameter": ["i64", "i64"],                 "immediate": [], "b3op": "AboveEqual"   },
+        "i64.clz":             { "category": "arithmetic", "value": 121, "return": ["i64"],                          "parameter": ["i64"],                        "immediate": [], "b3op": "Clz"          },
+        "i64.ctz":             { "category": "arithmetic", "value": 122, "return": ["i64"],                          "parameter": ["i64"],                        "immediate": []                         },
+        "i64.popcnt":          { "category": "arithmetic", "value": 123, "return": ["i64"],                          "parameter": ["i64"],                        "immediate": []                         },
+        "i64.eqz":             { "category": "comparison", "value":  80, "return": ["bool"],                         "parameter": ["i64"],                        "immediate": [], "b3op": "Equal(i64(0), @0)" },
+        "f32.add":             { "category": "arithmetic", "value": 146, "return": ["f32"],                          "parameter": ["f32", "f32"],                 "immediate": [], "b3op": "Add"          },
+        "f32.sub":             { "category": "arithmetic", "value": 147, "return": ["f32"],                          "parameter": ["f32", "f32"],                 "immediate": [], "b3op": "Sub"          },
+        "f32.mul":             { "category": "arithmetic", "value": 148, "return": ["f32"],                          "parameter": ["f32", "f32"],                 "immediate": [], "b3op": "Mul"          },
+        "f32.div":             { "category": "arithmetic", "value": 149, "return": ["f32"],                          "parameter": ["f32", "f32"],                 "immediate": [], "b3op": "Div"          },
+        "f32.min":             { "category": "arithmetic", "value": 150, "return": ["f32"],                          "parameter": ["f32", "f32"],                 "immediate": [], "b3op": "Select(Equal(@0, @1), BitOr(@0, @1), Select(LessThan(@0, @1), @0, Select(GreaterThan(@0, @1), @1, Add(@0, @1))))" },
+        "f32.max":             { "category": "arithmetic", "value": 151, "return": ["f32"],                          "parameter": ["f32", "f32"],                 "immediate": [], "b3op": "Select(Equal(@0, @1), BitAnd(@0, @1), Select(LessThan(@0, @1), @1, Select(GreaterThan(@0, @1), @0, Add(@0, @1))))" },
+        "f32.abs":             { "category": "arithmetic", "value": 139, "return": ["f32"],                          "parameter": ["f32"],                        "immediate": [], "b3op": "Abs"          },
+        "f32.neg":             { "category": "arithmetic", "value": 140, "return": ["f32"],                          "parameter": ["f32"],                        "immediate": [], "b3op": "Neg"          },
+        "f32.copysign":        { "category": "arithmetic", "value": 152, "return": ["f32"],                          "parameter": ["f32", "f32"],                 "immediate": [], "b3op": "BitwiseCast(BitOr(BitAnd(BitwiseCast(@1), i32(0x80000000)), BitAnd(BitwiseCast(@0), i32(0x7fffffff))))" },
+        "f32.ceil":            { "category": "arithmetic", "value": 141, "return": ["f32"],                          "parameter": ["f32"],                        "immediate": [], "b3op": "Ceil"         },
+        "f32.floor":           { "category": "arithmetic", "value": 142, "return": ["f32"],                          "parameter": ["f32"],                        "immediate": [], "b3op": "Floor"        },
+        "f32.trunc":           { "category": "arithmetic", "value": 143, "return": ["f32"],                          "parameter": ["f32"],                        "immediate": []                         },
+        "f32.nearest":         { "category": "arithmetic", "value": 144, "return": ["f32"],                          "parameter": ["f32"],                        "immediate": []                         },
+        "f32.sqrt":            { "category": "arithmetic", "value": 145, "return": ["f32"],                          "parameter": ["f32"],                        "immediate": [], "b3op": "Sqrt"         },
+        "f32.eq":              { "category": "comparison", "value":  91, "return": ["bool"],                         "parameter": ["f32", "f32"],                 "immediate": [], "b3op": "Equal"        },
+        "f32.ne":              { "category": "comparison", "value":  92, "return": ["bool"],                         "parameter": ["f32", "f32"],                 "immediate": [], "b3op": "NotEqual"     },
+        "f32.lt":              { "category": "comparison", "value":  93, "return": ["bool"],                         "parameter": ["f32", "f32"],                 "immediate": [], "b3op": "LessThan"     },
+        "f32.le":              { "category": "comparison", "value":  95, "return": ["bool"],                         "parameter": ["f32", "f32"],                 "immediate": [], "b3op": "LessEqual"    },
+        "f32.gt":              { "category": "comparison", "value":  94, "return": ["bool"],                         "parameter": ["f32", "f32"],                 "immediate": [], "b3op": "GreaterThan"  },
+        "f32.ge":              { "category": "comparison", "value":  96, "return": ["bool"],                         "parameter": ["f32", "f32"],                 "immediate": [], "b3op": "GreaterEqual" },
+        "f64.add":             { "category": "arithmetic", "value": 160, "return": ["f64"],                          "parameter": ["f64", "f64"],                 "immediate": [], "b3op": "Add"          },
+        "f64.sub":             { "category": "arithmetic", "value": 161, "return": ["f64"],                          "parameter": ["f64", "f64"],                 "immediate": [], "b3op": "Sub"          },
+        "f64.mul":             { "category": "arithmetic", "value": 162, "return": ["f64"],                          "parameter": ["f64", "f64"],                 "immediate": [], "b3op": "Mul"          },
+        "f64.div":             { "category": "arithmetic", "value": 163, "return": ["f64"],                          "parameter": ["f64", "f64"],                 "immediate": [], "b3op": "Div"          },
+        "f64.min":             { "category": "arithmetic", "value": 164, "return": ["f64"],                          "parameter": ["f64", "f64"],                 "immediate": [], "b3op": "Select(Equal(@0, @1), BitOr(@0, @1), Select(LessThan(@0, @1), @0, Select(GreaterThan(@0, @1), @1, Add(@0, @1))))" },
+        "f64.max":             { "category": "arithmetic", "value": 165, "return": ["f64"],                          "parameter": ["f64", "f64"],                 "immediate": [], "b3op": "Select(Equal(@0, @1), BitAnd(@0, @1), Select(LessThan(@0, @1), @1, Select(GreaterThan(@0, @1), @0, Add(@0, @1))))" },
+        "f64.abs":             { "category": "arithmetic", "value": 153, "return": ["f64"],                          "parameter": ["f64"],                        "immediate": [], "b3op": "Abs"          },
+        "f64.neg":             { "category": "arithmetic", "value": 154, "return": ["f64"],                          "parameter": ["f64"],                        "immediate": [], "b3op": "Neg"          },
+        "f64.copysign":        { "category": "arithmetic", "value": 166, "return": ["f64"],                          "parameter": ["f64", "f64"],                 "immediate": [], "b3op": "BitwiseCast(BitOr(BitAnd(BitwiseCast(@1), i64(0x8000000000000000)), BitAnd(BitwiseCast(@0), i64(0x7fffffffffffffff))))" },
+        "f64.ceil":            { "category": "arithmetic", "value": 155, "return": ["f64"],                          "parameter": ["f64"],                        "immediate": [], "b3op": "Ceil"         },
+        "f64.floor":           { "category": "arithmetic", "value": 156, "return": ["f64"],                          "parameter": ["f64"],                        "immediate": [], "b3op": "Floor"        },
+        "f64.trunc":           { "category": "arithmetic", "value": 157, "return": ["f64"],                          "parameter": ["f64"],                        "immediate": []                         },
+        "f64.nearest":         { "category": "arithmetic", "value": 158, "return": ["f64"],                          "parameter": ["f64"],                        "immediate": []                         },
+        "f64.sqrt":            { "category": "arithmetic", "value": 159, "return": ["f64"],                          "parameter": ["f64"],                        "immediate": [], "b3op": "Sqrt"         },
+        "f64.eq":              { "category": "comparison", "value":  97, "return": ["bool"],                         "parameter": ["f64", "f64"],                 "immediate": [], "b3op": "Equal"        },
+        "f64.ne":              { "category": "comparison", "value":  98, "return": ["bool"],                         "parameter": ["f64", "f64"],                 "immediate": [], "b3op": "NotEqual"     },
+        "f64.lt":              { "category": "comparison", "value":  99, "return": ["bool"],                         "parameter": ["f64", "f64"],                 "immediate": [], "b3op": "LessThan"     },
+        "f64.le":              { "category": "comparison", "value": 101, "return": ["bool"],                         "parameter": ["f64", "f64"],                 "immediate": [], "b3op": "LessEqual"    },
+        "f64.gt":              { "category": "comparison", "value": 100, "return": ["bool"],                         "parameter": ["f64", "f64"],                 "immediate": [], "b3op": "GreaterThan"  },
+        "f64.ge":              { "category": "comparison", "value": 102, "return": ["bool"],                         "parameter": ["f64", "f64"],                 "immediate": [], "b3op": "GreaterEqual" },
+        "i32.trunc_s/f32":     { "category": "conversion", "value": 168, "return": ["i32"],                          "parameter": ["f32"],                        "immediate": []                         },
+        "i32.trunc_s/f64":     { "category": "conversion", "value": 170, "return": ["i32"],                          "parameter": ["f64"],                        "immediate": []                         },
+        "i32.trunc_u/f32":     { "category": "conversion", "value": 169, "return": ["i32"],                          "parameter": ["f32"],                        "immediate": []                         },
+        "i32.trunc_u/f64":     { "category": "conversion", "value": 171, "return": ["i32"],                          "parameter": ["f64"],                        "immediate": []                         },
+        "i32.wrap/i64":        { "category": "conversion", "value": 167, "return": ["i32"],                          "parameter": ["i64"],                        "immediate": [], "b3op": "Trunc"        },
+        "i64.trunc_s/f32":     { "category": "conversion", "value": 174, "return": ["i64"],                          "parameter": ["f32"],                        "immediate": []                         },
+        "i64.trunc_s/f64":     { "category": "conversion", "value": 176, "return": ["i64"],                          "parameter": ["f64"],                        "immediate": []                         },
+        "i64.trunc_u/f32":     { "category": "conversion", "value": 175, "return": ["i64"],                          "parameter": ["f32"],                        "immediate": []                         },
+        "i64.trunc_u/f64":     { "category": "conversion", "value": 177, "return": ["i64"],                          "parameter": ["f64"],                        "immediate": []                         },
+        "i64.extend_s/i32":    { "category": "conversion", "value": 172, "return": ["i64"],                          "parameter": ["i32"],                        "immediate": [], "b3op": "SExt32"       },
+        "i64.extend_u/i32":    { "category": "conversion", "value": 173, "return": ["i64"],                          "parameter": ["i32"],                        "immediate": [], "b3op": "ZExt32"       },
+        "f32.convert_s/i32":   { "category": "conversion", "value": 178, "return": ["f32"],                          "parameter": ["i32"],                        "immediate": [], "b3op": "IToF"         },
+        "f32.convert_u/i32":   { "category": "conversion", "value": 179, "return": ["f32"],                          "parameter": ["i32"],                        "immediate": [], "b3op": "IToF(ZExt32(@0))" },
+        "f32.convert_s/i64":   { "category": "conversion", "value": 180, "return": ["f32"],                          "parameter": ["i64"],                        "immediate": [], "b3op": "IToF"         },
+        "f32.convert_u/i64":   { "category": "conversion", "value": 181, "return": ["f32"],                          "parameter": ["i64"],                        "immediate": []                         },
+        "f32.demote/f64":      { "category": "conversion", "value": 182, "return": ["f32"],                          "parameter": ["f64"],                        "immediate": [], "b3op": "DoubleToFloat"},
+        "f32.reinterpret/i32": { "category": "conversion", "value": 190, "return": ["f32"],                          "parameter": ["i32"],                        "immediate": [], "b3op": "BitwiseCast"  },
+        "f64.convert_s/i32":   { "category": "conversion", "value": 183, "return": ["f64"],                          "parameter": ["i32"],                        "immediate": [], "b3op": "IToD"         },
+        "f64.convert_u/i32":   { "category": "conversion", "value": 184, "return": ["f64"],                          "parameter": ["i32"],                        "immediate": [], "b3op": "IToD(ZExt32(@0))" },
+        "f64.convert_s/i64":   { "category": "conversion", "value": 185, "return": ["f64"],                          "parameter": ["i64"],                        "immediate": [], "b3op": "IToD"         },
+        "f64.convert_u/i64":   { "category": "conversion", "value": 186, "return": ["f64"],                          "parameter": ["i64"],                        "immediate": []                         },
+        "f64.promote/f32":     { "category": "conversion", "value": 187, "return": ["f64"],                          "parameter": ["f32"],                        "immediate": [], "b3op": "FloatToDouble"},
+        "f64.reinterpret/i64": { "category": "conversion", "value": 191, "return": ["f64"],                          "parameter": ["i64"],                        "immediate": [], "b3op": "BitwiseCast"  },
+        "i32.reinterpret/f32": { "category": "conversion", "value": 188, "return": ["i32"],                          "parameter": ["f32"],                        "immediate": [], "b3op": "BitwiseCast"  },
+        "i64.reinterpret/f64": { "category": "conversion", "value": 189, "return": ["i64"],                          "parameter": ["f64"],                        "immediate": [], "b3op": "BitwiseCast"  }
</ins><span class="cx">     }
</span><span class="cx"> }
</span></span></pre>
</div>
</div>

</body>
</html>