summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/binary-reader-ir.cc5
-rw-r--r--src/binary-reader-logging.cc1
-rw-r--r--src/binary-reader-logging.h1
-rw-r--r--src/binary-reader-nop.h1
-rw-r--r--src/binary-reader.cc5
-rw-r--r--src/binary-reader.h1
-rw-r--r--src/binary-writer.cc4
-rw-r--r--src/c-writer.cc1
-rw-r--r--src/expr-visitor.cc4
-rw-r--r--src/expr-visitor.h2
-rw-r--r--src/feature.cc6
-rw-r--r--src/feature.def27
-rw-r--r--src/interp/interp.cc1
-rw-r--r--src/interp/istream.cc1
-rw-r--r--src/ir-util.cc5
-rw-r--r--src/ir.cc1
-rw-r--r--src/ir.h11
-rw-r--r--src/lexer-keywords.txt1
-rw-r--r--src/opcode.cc3
-rw-r--r--src/opcode.def1
-rw-r--r--src/prebuilt/lexer-keywords.cc1198
-rw-r--r--src/shared-validator.cc17
-rw-r--r--src/shared-validator.h1
-rw-r--r--src/token.def1
-rw-r--r--src/type-checker.cc29
-rw-r--r--src/type-checker.h1
-rw-r--r--src/validator.cc12
-rw-r--r--src/wast-parser.cc7
-rw-r--r--src/wat-writer.cc7
-rw-r--r--test/dump/call_ref.txt108
-rw-r--r--test/help/spectest-interp.txt1
-rw-r--r--test/help/wasm-interp.txt1
-rw-r--r--test/help/wasm-opcodecnt.txt1
-rw-r--r--test/help/wasm-validate.txt1
-rw-r--r--test/help/wasm2wat.txt1
-rw-r--r--test/help/wast2json.txt1
-rw-r--r--test/help/wat-desugar.txt1
-rw-r--r--test/help/wat2wasm.txt1
-rw-r--r--test/parse/expr/callref-imported-function.txt11
-rw-r--r--test/parse/expr/callref-internal-function.txt14
-rw-r--r--test/roundtrip/fold-callref.txt64
-rwxr-xr-xtest/run-roundtrip.py3
-rw-r--r--test/typecheck/bad-callref-int32.txt15
-rw-r--r--test/typecheck/bad-callref-null.txt15
44 files changed, 980 insertions, 613 deletions
diff --git a/src/binary-reader-ir.cc b/src/binary-reader-ir.cc
index 06f4fa00..05b2d988 100644
--- a/src/binary-reader-ir.cc
+++ b/src/binary-reader-ir.cc
@@ -147,6 +147,7 @@ class BinaryReaderIR : public BinaryReaderNop {
Result OnCatchExpr(Index tag_index) override;
Result OnCatchAllExpr() override;
Result OnCallIndirectExpr(Index sig_index, Index table_index) override;
+ Result OnCallRefExpr() override;
Result OnReturnCallExpr(Index func_index) override;
Result OnReturnCallIndirectExpr(Index sig_index, Index table_index) override;
Result OnCompareExpr(Opcode opcode) override;
@@ -748,6 +749,10 @@ Result BinaryReaderIR::OnCallIndirectExpr(Index sig_index, Index table_index) {
return AppendExpr(std::move(expr));
}
+Result BinaryReaderIR::OnCallRefExpr() {
+ return AppendExpr(MakeUnique<CallRefExpr>());
+}
+
Result BinaryReaderIR::OnReturnCallExpr(Index func_index) {
return AppendExpr(MakeUnique<ReturnCallExpr>(Var(func_index)));
}
diff --git a/src/binary-reader-logging.cc b/src/binary-reader-logging.cc
index d67bb5cb..61ad43aa 100644
--- a/src/binary-reader-logging.cc
+++ b/src/binary-reader-logging.cc
@@ -802,6 +802,7 @@ DEFINE_LOAD_STORE_OPCODE(OnAtomicNotifyExpr);
DEFINE_OPCODE(OnBinaryExpr)
DEFINE_INDEX_DESC(OnCallExpr, "func_index")
DEFINE_INDEX_INDEX(OnCallIndirectExpr, "sig_index", "table_index")
+DEFINE0(OnCallRefExpr)
DEFINE_INDEX_DESC(OnCatchExpr, "tag_index");
DEFINE0(OnCatchAllExpr);
DEFINE_OPCODE(OnCompareExpr)
diff --git a/src/binary-reader-logging.h b/src/binary-reader-logging.h
index 5e385748..579d394c 100644
--- a/src/binary-reader-logging.h
+++ b/src/binary-reader-logging.h
@@ -169,6 +169,7 @@ class BinaryReaderLogging : public BinaryReaderDelegate {
Result OnCatchExpr(Index tag_index) override;
Result OnCatchAllExpr() override;
Result OnCallIndirectExpr(Index sig_index, Index table_index) override;
+ Result OnCallRefExpr() override;
Result OnCompareExpr(Opcode opcode) override;
Result OnConvertExpr(Opcode opcode) override;
Result OnDelegateExpr(Index depth) override;
diff --git a/src/binary-reader-nop.h b/src/binary-reader-nop.h
index 1ae01e53..0d74272b 100644
--- a/src/binary-reader-nop.h
+++ b/src/binary-reader-nop.h
@@ -238,6 +238,7 @@ class BinaryReaderNop : public BinaryReaderDelegate {
}
Result OnCallExpr(Index func_index) override { return Result::Ok; }
Result OnCallIndirectExpr(Index sig_index, Index table_index) override { return Result::Ok; }
+ Result OnCallRefExpr() override { return Result::Ok; }
Result OnCatchExpr(Index tag_index) override { return Result::Ok; }
Result OnCatchAllExpr() override { return Result::Ok; }
Result OnCompareExpr(Opcode opcode) override { return Result::Ok; }
diff --git a/src/binary-reader.cc b/src/binary-reader.cc
index 42fb5029..e1a7a336 100644
--- a/src/binary-reader.cc
+++ b/src/binary-reader.cc
@@ -1745,6 +1745,11 @@ Result BinaryReader::ReadFunctionBody(Offset end_offset) {
CALLBACK(OnOpcodeBare);
break;
+ case Opcode::CallRef:
+ CALLBACK(OnCallRefExpr);
+ CALLBACK(OnOpcodeBare);
+ break;
+
default:
return ReportUnexpectedOpcode(opcode);
}
diff --git a/src/binary-reader.h b/src/binary-reader.h
index a688eada..1e3ec6a5 100644
--- a/src/binary-reader.h
+++ b/src/binary-reader.h
@@ -233,6 +233,7 @@ class BinaryReaderDelegate {
Index default_target_depth) = 0;
virtual Result OnCallExpr(Index func_index) = 0;
virtual Result OnCallIndirectExpr(Index sig_index, Index table_index) = 0;
+ virtual Result OnCallRefExpr() = 0;
virtual Result OnCatchExpr(Index tag_index) = 0;
virtual Result OnCatchAllExpr() = 0;
virtual Result OnCompareExpr(Opcode opcode) = 0;
diff --git a/src/binary-writer.cc b/src/binary-writer.cc
index a1760023..aae2b4bf 100644
--- a/src/binary-writer.cc
+++ b/src/binary-writer.cc
@@ -747,6 +747,10 @@ void BinaryWriter::WriteExpr(const Func* func, const Expr* expr) {
WriteTableNumberWithReloc(table_index, "table index");
break;
}
+ case ExprType::CallRef:{
+ WriteOpcode(stream_, Opcode::CallRef);
+ break;
+ }
case ExprType::ReturnCallIndirect: {
Index sig_index =
module_->GetFuncTypeIndex(cast<ReturnCallIndirectExpr>(expr)->decl);
diff --git a/src/c-writer.cc b/src/c-writer.cc
index 19b7f3f1..08897ea9 100644
--- a/src/c-writer.cc
+++ b/src/c-writer.cc
@@ -1701,6 +1701,7 @@ void CWriter::Write(const ExprList& exprs) {
case ExprType::ReturnCallIndirect:
case ExprType::Throw:
case ExprType::Try:
+ case ExprType::CallRef:
UNIMPLEMENTED("...");
break;
}
diff --git a/src/expr-visitor.cc b/src/expr-visitor.cc
index 369c63bb..b50400c4 100644
--- a/src/expr-visitor.cc
+++ b/src/expr-visitor.cc
@@ -215,6 +215,10 @@ Result ExprVisitor::HandleDefaultState(Expr* expr) {
CHECK_RESULT(delegate_->OnCallIndirectExpr(cast<CallIndirectExpr>(expr)));
break;
+ case ExprType::CallRef:
+ CHECK_RESULT(delegate_->OnCallRefExpr(cast<CallRefExpr>(expr)));
+ break;
+
case ExprType::Compare:
CHECK_RESULT(delegate_->OnCompareExpr(cast<CompareExpr>(expr)));
break;
diff --git a/src/expr-visitor.h b/src/expr-visitor.h
index eda287f0..ab7dc9e4 100644
--- a/src/expr-visitor.h
+++ b/src/expr-visitor.h
@@ -75,6 +75,7 @@ class ExprVisitor::Delegate {
virtual Result OnBrTableExpr(BrTableExpr*) = 0;
virtual Result OnCallExpr(CallExpr*) = 0;
virtual Result OnCallIndirectExpr(CallIndirectExpr*) = 0;
+ virtual Result OnCallRefExpr(CallRefExpr*) = 0;
virtual Result OnCompareExpr(CompareExpr*) = 0;
virtual Result OnConstExpr(ConstExpr*) = 0;
virtual Result OnConvertExpr(ConvertExpr*) = 0;
@@ -147,6 +148,7 @@ class ExprVisitor::DelegateNop : public ExprVisitor::Delegate {
Result OnBrTableExpr(BrTableExpr*) override { return Result::Ok; }
Result OnCallExpr(CallExpr*) override { return Result::Ok; }
Result OnCallIndirectExpr(CallIndirectExpr*) override { return Result::Ok; }
+ Result OnCallRefExpr(CallRefExpr*) override { return Result::Ok; }
Result OnCompareExpr(CompareExpr*) override { return Result::Ok; }
Result OnConstExpr(ConstExpr*) override { return Result::Ok; }
Result OnConvertExpr(ConvertExpr*) override { return Result::Ok; }
diff --git a/src/feature.cc b/src/feature.cc
index 1c72c365..9d7878e1 100644
--- a/src/feature.cc
+++ b/src/feature.cc
@@ -41,6 +41,12 @@ void Features::UpdateDependencies() {
if (exceptions_enabled_) {
reference_types_enabled_ = true;
}
+
+ // Function references require reference types.
+ if (function_references_enabled_) {
+ reference_types_enabled_ = true;
+ }
+
// Reference types requires bulk memory.
if (reference_types_enabled_) {
bulk_memory_enabled_ = true;
diff --git a/src/feature.def b/src/feature.def
index 17f4de36..4a85f6f2 100644
--- a/src/feature.def
+++ b/src/feature.def
@@ -22,16 +22,17 @@
* variable flag default help
* ========================================================================= */
-WABT_FEATURE(exceptions, "exceptions", false, "Experimental exception handling")
-WABT_FEATURE(mutable_globals, "mutable-globals", true, "Import/export mutable globals")
-WABT_FEATURE(sat_float_to_int, "saturating-float-to-int", true, "Saturating float-to-int operators")
-WABT_FEATURE(sign_extension, "sign-extension", true, "Sign-extension operators")
-WABT_FEATURE(simd, "simd", false, "SIMD support")
-WABT_FEATURE(threads, "threads", false, "Threading support")
-WABT_FEATURE(multi_value, "multi-value", true, "Multi-value")
-WABT_FEATURE(tail_call, "tail-call", false, "Tail-call support")
-WABT_FEATURE(bulk_memory, "bulk-memory", false, "Bulk-memory operations")
-WABT_FEATURE(reference_types, "reference-types", false, "Reference types (externref)")
-WABT_FEATURE(annotations, "annotations", false, "Custom annotation syntax")
-WABT_FEATURE(gc, "gc", false, "Garbage collection")
-WABT_FEATURE(memory64, "memory64", false, "64-bit memory")
+WABT_FEATURE(exceptions, "exceptions", false, "Experimental exception handling")
+WABT_FEATURE(mutable_globals, "mutable-globals", true, "Import/export mutable globals")
+WABT_FEATURE(sat_float_to_int, "saturating-float-to-int", true, "Saturating float-to-int operators")
+WABT_FEATURE(sign_extension, "sign-extension", true, "Sign-extension operators")
+WABT_FEATURE(simd, "simd", false, "SIMD support")
+WABT_FEATURE(threads, "threads", false, "Threading support")
+WABT_FEATURE(function_references, "function-references", false, "Typed function references")
+WABT_FEATURE(multi_value, "multi-value", true, "Multi-value")
+WABT_FEATURE(tail_call, "tail-call", false, "Tail-call support")
+WABT_FEATURE(bulk_memory, "bulk-memory", false, "Bulk-memory operations")
+WABT_FEATURE(reference_types, "reference-types", false, "Reference types (externref)")
+WABT_FEATURE(annotations, "annotations", false, "Custom annotation syntax")
+WABT_FEATURE(gc, "gc", false, "Garbage collection")
+WABT_FEATURE(memory64, "memory64", false, "64-bit memory")
diff --git a/src/interp/interp.cc b/src/interp/interp.cc
index 44fa5b66..67082980 100644
--- a/src/interp/interp.cc
+++ b/src/interp/interp.cc
@@ -1791,6 +1791,7 @@ RunResult Thread::StepInternal(Trap::Ptr* out_trap) {
case O::ReturnCall:
case O::SelectT:
+ case O::CallRef:
case O::Try:
case O::Catch:
case O::CatchAll:
diff --git a/src/interp/istream.cc b/src/interp/istream.cc
index 609c6923..10a103b3 100644
--- a/src/interp/istream.cc
+++ b/src/interp/istream.cc
@@ -751,6 +751,7 @@ Instr Istream::Read(Offset* offset) const {
instr.imm_v128 = ReadAt<v128>(offset);
break;
+ case Opcode::CallRef:
case Opcode::Block:
case Opcode::Catch:
case Opcode::CatchAll:
diff --git a/src/ir-util.cc b/src/ir-util.cc
index 7c32d442..9b664611 100644
--- a/src/ir-util.cc
+++ b/src/ir-util.cc
@@ -140,6 +140,11 @@ ModuleContext::Arities ModuleContext::GetExprArity(const Expr& expr) const {
ci_expr->decl.GetNumResults() };
}
+ case ExprType::CallRef: {
+ const Var& var = cast<CallRefExpr>(&expr)->function_type_index;
+ return { GetFuncParamCount(var) + 1, GetFuncResultCount(var) };
+ }
+
case ExprType::ReturnCallIndirect: {
const auto* rci_expr = cast<ReturnCallIndirectExpr>(&expr);
return { rci_expr->decl.GetNumParams() + 1,
diff --git a/src/ir.cc b/src/ir.cc
index 92cbf2c0..ddfd490d 100644
--- a/src/ir.cc
+++ b/src/ir.cc
@@ -39,6 +39,7 @@ const char* ExprTypeName[] = {
"BrTable",
"Call",
"CallIndirect",
+ "CallRef",
"Compare",
"Const",
"Convert",
diff --git a/src/ir.h b/src/ir.h
index 4e49a09e..3c631284 100644
--- a/src/ir.h
+++ b/src/ir.h
@@ -295,6 +295,7 @@ enum class ExprType {
BrTable,
Call,
CallIndirect,
+ CallRef,
Compare,
Const,
Convert,
@@ -578,6 +579,16 @@ class ReturnCallIndirectExpr : public ExprMixin<ExprType::ReturnCallIndirect> {
Var table;
};
+class CallRefExpr : public ExprMixin<ExprType::CallRef> {
+ public:
+ explicit CallRefExpr(const Location &loc = Location())
+ : ExprMixin<ExprType::CallRef>(loc) {}
+
+ // This field is setup only during Validate phase,
+ // so keep that in mind when you use it.
+ Var function_type_index;
+};
+
template <ExprType TypeEnum>
class BlockExprBase : public ExprMixin<TypeEnum> {
public:
diff --git a/src/lexer-keywords.txt b/src/lexer-keywords.txt
index 9f23590e..1ff631ba 100644
--- a/src/lexer-keywords.txt
+++ b/src/lexer-keywords.txt
@@ -31,6 +31,7 @@ br_if, TokenType::BrIf, Opcode::BrIf
br_table, TokenType::BrTable, Opcode::BrTable
br, TokenType::Br, Opcode::Br
call_indirect, TokenType::CallIndirect, Opcode::CallIndirect
+call_ref, TokenType::CallRef, Opcode::CallRef
call, TokenType::Call, Opcode::Call
catch, TokenType::Catch, Opcode::Catch
catch_all, TokenType::CatchAll, Opcode::CatchAll
diff --git a/src/opcode.cc b/src/opcode.cc
index d4ffcdc1..6a70eb4f 100644
--- a/src/opcode.cc
+++ b/src/opcode.cc
@@ -335,6 +335,9 @@ bool Opcode::IsEnabled(const Features& features) const {
case Opcode::RefIsNull:
return features.reference_types_enabled();
+ case Opcode::CallRef:
+ return features.function_references_enabled();
+
// Interpreter opcodes are never "enabled".
case Opcode::InterpAlloca:
case Opcode::InterpBrUnless:
diff --git a/src/opcode.def b/src/opcode.def
index 846841d1..e5335d74 100644
--- a/src/opcode.def
+++ b/src/opcode.def
@@ -54,6 +54,7 @@ WABT_OPCODE(___, ___, ___, ___, 0, 0, 0x10, Call, "call", "")
WABT_OPCODE(___, ___, ___, ___, 0, 0, 0x11, CallIndirect, "call_indirect", "")
WABT_OPCODE(___, ___, ___, ___, 0, 0, 0x12, ReturnCall, "return_call", "")
WABT_OPCODE(___, ___, ___, ___, 0, 0, 0x13, ReturnCallIndirect, "return_call_indirect", "")
+WABT_OPCODE(___, ___, ___, ___, 0, 0, 0x14, CallRef, "call_ref", "")
WABT_OPCODE(___, ___, ___, ___, 0, 0, 0x18, Delegate, "delegate", "")
WABT_OPCODE(___, ___, ___, ___, 0, 0, 0x19, CatchAll, "catch_all", "")
WABT_OPCODE(___, ___, ___, ___, 0, 0, 0x1a, Drop, "drop", "")
diff --git a/src/prebuilt/lexer-keywords.cc b/src/prebuilt/lexer-keywords.cc
index 0c2d8df8..9f1f68ed 100644
--- a/src/prebuilt/lexer-keywords.cc
+++ b/src/prebuilt/lexer-keywords.cc
@@ -158,7 +158,7 @@ Perfect_Hash::InWordSet (const char *str, size_t len)
{
enum
{
- TOTAL_KEYWORDS = 610,
+ TOTAL_KEYWORDS = 611,
MIN_WORD_LENGTH = 2,
MAX_WORD_LENGTH = 29,
MIN_HASH_VALUE = 19,
@@ -170,1441 +170,1443 @@ Perfect_Hash::InWordSet (const char *str, size_t len)
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""},
-#line 506 "src/lexer-keywords.txt"
+#line 507 "src/lexer-keywords.txt"
{"if", TokenType::If, Opcode::If},
{""}, {""}, {""}, {""},
-#line 139 "src/lexer-keywords.txt"
+#line 140 "src/lexer-keywords.txt"
{"f64", Type::F64},
-#line 526 "src/lexer-keywords.txt"
+#line 527 "src/lexer-keywords.txt"
{"mut", TokenType::Mut},
-#line 81 "src/lexer-keywords.txt"
+#line 82 "src/lexer-keywords.txt"
{"f32", Type::F32},
-#line 438 "src/lexer-keywords.txt"
+#line 439 "src/lexer-keywords.txt"
{"i64", Type::I64},
{""},
-#line 300 "src/lexer-keywords.txt"
+#line 301 "src/lexer-keywords.txt"
{"i32", Type::I32},
{""}, {""}, {""},
-#line 556 "src/lexer-keywords.txt"
+#line 557 "src/lexer-keywords.txt"
{"then", TokenType::Then},
{""},
-#line 510 "src/lexer-keywords.txt"
+#line 511 "src/lexer-keywords.txt"
{"item", TokenType::Item},
{""},
-#line 46 "src/lexer-keywords.txt"
+#line 47 "src/lexer-keywords.txt"
{"else", TokenType::Else, Opcode::Else},
-#line 45 "src/lexer-keywords.txt"
+#line 46 "src/lexer-keywords.txt"
{"elem", TokenType::Elem},
{""}, {""}, {""},
-#line 126 "src/lexer-keywords.txt"
+#line 127 "src/lexer-keywords.txt"
{"f64.lt", TokenType::Compare, Opcode::F64Lt},
-#line 69 "src/lexer-keywords.txt"
+#line 70 "src/lexer-keywords.txt"
{"f32.lt", TokenType::Compare, Opcode::F32Lt},
{""}, {""}, {""}, {""}, {""}, {""}, {""},
-#line 49 "src/lexer-keywords.txt"
+#line 50 "src/lexer-keywords.txt"
{"extern", Type::ExternRef, TokenType::Extern},
{""}, {""},
-#line 124 "src/lexer-keywords.txt"
+#line 125 "src/lexer-keywords.txt"
{"f64.le", TokenType::Compare, Opcode::F64Le},
-#line 67 "src/lexer-keywords.txt"
+#line 68 "src/lexer-keywords.txt"
{"f32.le", TokenType::Compare, Opcode::F32Le},
-#line 555 "src/lexer-keywords.txt"
+#line 556 "src/lexer-keywords.txt"
{"table", TokenType::Table},
-#line 169 "src/lexer-keywords.txt"
+#line 170 "src/lexer-keywords.txt"
{"funcref", Type::FuncRef},
-#line 128 "src/lexer-keywords.txt"
+#line 129 "src/lexer-keywords.txt"
{"f64.min", TokenType::Binary, Opcode::F64Min},
-#line 71 "src/lexer-keywords.txt"
+#line 72 "src/lexer-keywords.txt"
{"f32.min", TokenType::Binary, Opcode::F32Min},
{""}, {""},
-#line 411 "src/lexer-keywords.txt"
+#line 412 "src/lexer-keywords.txt"
{"i64.lt_s", TokenType::Compare, Opcode::I64LtS},
-#line 274 "src/lexer-keywords.txt"
+#line 275 "src/lexer-keywords.txt"
{"i32.lt_s", TokenType::Compare, Opcode::I32LtS},
{""},
-#line 168 "src/lexer-keywords.txt"
+#line 169 "src/lexer-keywords.txt"
{"field", TokenType::Field},
-#line 412 "src/lexer-keywords.txt"
+#line 413 "src/lexer-keywords.txt"
{"i64.lt_u", TokenType::Compare, Opcode::I64LtU},
-#line 275 "src/lexer-keywords.txt"
+#line 276 "src/lexer-keywords.txt"
{"i32.lt_u", TokenType::Compare, Opcode::I32LtU},
-#line 402 "src/lexer-keywords.txt"
+#line 403 "src/lexer-keywords.txt"
{"i64.le_s", TokenType::Compare, Opcode::I64LeS},
-#line 267 "src/lexer-keywords.txt"
+#line 268 "src/lexer-keywords.txt"
{"i32.le_s", TokenType::Compare, Opcode::I32LeS},
-#line 47 "src/lexer-keywords.txt"
+#line 48 "src/lexer-keywords.txt"
{"end", TokenType::End, Opcode::End},
-#line 167 "src/lexer-keywords.txt"
+#line 168 "src/lexer-keywords.txt"
{"f64x2", TokenType::F64X2},
-#line 403 "src/lexer-keywords.txt"
+#line 404 "src/lexer-keywords.txt"
{"i64.le_u", TokenType::Compare, Opcode::I64LeU},
-#line 268 "src/lexer-keywords.txt"
+#line 269 "src/lexer-keywords.txt"
{"i32.le_u", TokenType::Compare, Opcode::I32LeU},
-#line 468 "src/lexer-keywords.txt"
+#line 469 "src/lexer-keywords.txt"
{"i64x2", TokenType::I64X2},
-#line 525 "src/lexer-keywords.txt"
+#line 526 "src/lexer-keywords.txt"
{"module", TokenType::Module},
-#line 418 "src/lexer-keywords.txt"
+#line 419 "src/lexer-keywords.txt"
{"i64.rem_s", TokenType::Binary, Opcode::I64RemS},
-#line 281 "src/lexer-keywords.txt"
+#line 282 "src/lexer-keywords.txt"
{"i32.rem_s", TokenType::Binary, Opcode::I32RemS},
{""}, {""},
-#line 419 "src/lexer-keywords.txt"
+#line 420 "src/lexer-keywords.txt"
{"i64.rem_u", TokenType::Binary, Opcode::I64RemU},
-#line 282 "src/lexer-keywords.txt"
+#line 283 "src/lexer-keywords.txt"
{"i32.rem_u", TokenType::Binary, Opcode::I32RemU},
-#line 42 "src/lexer-keywords.txt"
+#line 43 "src/lexer-keywords.txt"
{"do", TokenType::Do},
-#line 110 "src/lexer-keywords.txt"
+#line 111 "src/lexer-keywords.txt"
{"f64.abs", TokenType::Unary, Opcode::F64Abs},
-#line 52 "src/lexer-keywords.txt"
+#line 53 "src/lexer-keywords.txt"
{"f32.abs", TokenType::Unary, Opcode::F32Abs},
-#line 137 "src/lexer-keywords.txt"
+#line 138 "src/lexer-keywords.txt"
{"f64.sub", TokenType::Binary, Opcode::F64Sub},
-#line 79 "src/lexer-keywords.txt"
+#line 80 "src/lexer-keywords.txt"
{"f32.sub", TokenType::Binary, Opcode::F32Sub},
-#line 530 "src/lexer-keywords.txt"
+#line 531 "src/lexer-keywords.txt"
{"offset", TokenType::Offset},
-#line 429 "src/lexer-keywords.txt"
+#line 430 "src/lexer-keywords.txt"
{"i64.sub", TokenType::Binary, Opcode::I64Sub},
-#line 291 "src/lexer-keywords.txt"
+#line 292 "src/lexer-keywords.txt"
{"i32.sub", TokenType::Binary, Opcode::I32Sub},
{""}, {""}, {""},
-#line 553 "src/lexer-keywords.txt"
+#line 554 "src/lexer-keywords.txt"
{"table.set", TokenType::TableSet, Opcode::TableSet},
-#line 544 "src/lexer-keywords.txt"
+#line 545 "src/lexer-keywords.txt"
{"select", TokenType::Select, Opcode::Select},
-#line 546 "src/lexer-keywords.txt"
+#line 547 "src/lexer-keywords.txt"
{"start", TokenType::Start},
-#line 552 "src/lexer-keywords.txt"
+#line 553 "src/lexer-keywords.txt"
{"table.init", TokenType::TableInit, Opcode::TableInit},
-#line 170 "src/lexer-keywords.txt"
+#line 171 "src/lexer-keywords.txt"
{"func", Type::FuncRef, TokenType::Func},
{""},
-#line 132 "src/lexer-keywords.txt"
+#line 133 "src/lexer-keywords.txt"
{"f64.ne", TokenType::Compare, Opcode::F64Ne},
-#line 75 "src/lexer-keywords.txt"
+#line 76 "src/lexer-keywords.txt"
{"f32.ne", TokenType::Compare, Opcode::F32Ne},
{""},
-#line 414 "src/lexer-keywords.txt"
+#line 415 "src/lexer-keywords.txt"
{"i64.ne", TokenType::Compare, Opcode::I64Ne},
-#line 277 "src/lexer-keywords.txt"
+#line 278 "src/lexer-keywords.txt"
{"i32.ne", TokenType::Compare, Opcode::I32Ne},
{""},
-#line 39 "src/lexer-keywords.txt"
+#line 40 "src/lexer-keywords.txt"
{"data", TokenType::Data},
{""}, {""}, {""}, {""}, {""},
-#line 349 "src/lexer-keywords.txt"
+#line 350 "src/lexer-keywords.txt"
{"i64.and", TokenType::Binary, Opcode::I64And},
-#line 226 "src/lexer-keywords.txt"
+#line 227 "src/lexer-keywords.txt"
{"i32.and", TokenType::Binary, Opcode::I32And},
-#line 156 "src/lexer-keywords.txt"
+#line 157 "src/lexer-keywords.txt"
{"f64x2.ne", TokenType::Compare, Opcode::F64X2Ne},
{""},
-#line 152 "src/lexer-keywords.txt"
+#line 153 "src/lexer-keywords.txt"
{"f64x2.min", TokenType::Binary, Opcode::F64X2Min},
-#line 445 "src/lexer-keywords.txt"
+#line 446 "src/lexer-keywords.txt"
{"i64x2.ne", TokenType::Binary, Opcode::I64X2Ne},
{""}, {""},
-#line 129 "src/lexer-keywords.txt"
+#line 130 "src/lexer-keywords.txt"
{"f64.mul", TokenType::Binary, Opcode::F64Mul},
-#line 72 "src/lexer-keywords.txt"
+#line 73 "src/lexer-keywords.txt"
{"f32.mul", TokenType::Binary, Opcode::F32Mul},
{""},
-#line 413 "src/lexer-keywords.txt"
+#line 414 "src/lexer-keywords.txt"
{"i64.mul", TokenType::Binary, Opcode::I64Mul},
-#line 276 "src/lexer-keywords.txt"
+#line 277 "src/lexer-keywords.txt"
{"i32.mul", TokenType::Binary, Opcode::I32Mul},
{""}, {""},
-#line 111 "src/lexer-keywords.txt"
+#line 112 "src/lexer-keywords.txt"
{"f64.add", TokenType::Binary, Opcode::F64Add},
-#line 53 "src/lexer-keywords.txt"
+#line 54 "src/lexer-keywords.txt"
{"f32.add", TokenType::Binary, Opcode::F32Add},
{""},
-#line 348 "src/lexer-keywords.txt"
+#line 349 "src/lexer-keywords.txt"
{"i64.add", TokenType::Binary, Opcode::I64Add},
-#line 225 "src/lexer-keywords.txt"
+#line 226 "src/lexer-keywords.txt"
{"i32.add", TokenType::Binary, Opcode::I32Add},
{""},
-#line 150 "src/lexer-keywords.txt"
+#line 151 "src/lexer-keywords.txt"
{"f64x2.lt", TokenType::Compare, Opcode::F64X2Lt},
-#line 113 "src/lexer-keywords.txt"
+#line 114 "src/lexer-keywords.txt"
{"f64.const", TokenType::Const, Opcode::F64Const},
-#line 55 "src/lexer-keywords.txt"
+#line 56 "src/lexer-keywords.txt"
{"f32.const", TokenType::Const, Opcode::F32Const},
{""},
-#line 387 "src/lexer-keywords.txt"
+#line 388 "src/lexer-keywords.txt"
{"i64.const", TokenType::Const, Opcode::I64Const},
-#line 255 "src/lexer-keywords.txt"
+#line 256 "src/lexer-keywords.txt"
{"i32.const", TokenType::Const, Opcode::I32Const},
{""}, {""}, {""},
-#line 545 "src/lexer-keywords.txt"
+#line 546 "src/lexer-keywords.txt"
{"shared", TokenType::Shared},
{""},
-#line 162 "src/lexer-keywords.txt"
+#line 163 "src/lexer-keywords.txt"
{"f64x2.sub", TokenType::Binary, Opcode::F64X2Sub},
-#line 149 "src/lexer-keywords.txt"
+#line 150 "src/lexer-keywords.txt"
{"f64x2.le", TokenType::Compare, Opcode::F64X2Le},
-#line 446 "src/lexer-keywords.txt"
+#line 447 "src/lexer-keywords.txt"
{"i64x2.lt_s", TokenType::Binary, Opcode::I64X2LtS},
-#line 463 "src/lexer-keywords.txt"
+#line 464 "src/lexer-keywords.txt"
{"i64x2.sub", TokenType::Binary, Opcode::I64X2Sub},
#line 29 "src/lexer-keywords.txt"
{"block", TokenType::Block, Opcode::Block},
{""}, {""}, {""},
-#line 448 "src/lexer-keywords.txt"
+#line 449 "src/lexer-keywords.txt"
{"i64x2.le_s", TokenType::Binary, Opcode::I64X2LeS},
-#line 112 "src/lexer-keywords.txt"
+#line 113 "src/lexer-keywords.txt"
{"f64.ceil", TokenType::Unary, Opcode::F64Ceil},
-#line 54 "src/lexer-keywords.txt"
+#line 55 "src/lexer-keywords.txt"
{"f32.ceil", TokenType::Unary, Opcode::F32Ceil},
#line 31 "src/lexer-keywords.txt"
{"br_table", TokenType::BrTable, Opcode::BrTable},
{""}, {""},
-#line 549 "src/lexer-keywords.txt"
+#line 550 "src/lexer-keywords.txt"
{"table.fill", TokenType::TableFill, Opcode::TableFill},
{""}, {""}, {""},
-#line 34 "src/lexer-keywords.txt"
+#line 35 "src/lexer-keywords.txt"
{"call", TokenType::Call, Opcode::Call},
{""}, {""}, {""}, {""},
#line 32 "src/lexer-keywords.txt"
{"br", TokenType::Br, Opcode::Br},
{""}, {""}, {""},
-#line 514 "src/lexer-keywords.txt"
+#line 515 "src/lexer-keywords.txt"
{"local", TokenType::Local},
{""},
-#line 420 "src/lexer-keywords.txt"
+#line 421 "src/lexer-keywords.txt"
{"i64.rotl", TokenType::Binary, Opcode::I64Rotl},
-#line 283 "src/lexer-keywords.txt"
+#line 284 "src/lexer-keywords.txt"
{"i32.rotl", TokenType::Binary, Opcode::I32Rotl},
{""},
-#line 539 "src/lexer-keywords.txt"
+#line 540 "src/lexer-keywords.txt"
{"result", TokenType::Result},
-#line 153 "src/lexer-keywords.txt"
+#line 154 "src/lexer-keywords.txt"
{"f64x2.mul", TokenType::Binary, Opcode::F64X2Mul},
{""},
-#line 543 "src/lexer-keywords.txt"
+#line 544 "src/lexer-keywords.txt"
{"return", TokenType::Return, Opcode::Return},
-#line 443 "src/lexer-keywords.txt"
+#line 444 "src/lexer-keywords.txt"
{"i64x2.mul", TokenType::Binary, Opcode::I64X2Mul},
-#line 512 "src/lexer-keywords.txt"
+#line 513 "src/lexer-keywords.txt"
{"local.set", TokenType::LocalSet, Opcode::LocalSet},
{""}, {""}, {""},
-#line 140 "src/lexer-keywords.txt"
+#line 141 "src/lexer-keywords.txt"
{"f64x2.abs", TokenType::Unary, Opcode::F64X2Abs},
-#line 554 "src/lexer-keywords.txt"
+#line 555 "src/lexer-keywords.txt"
{"table.size", TokenType::TableSize, Opcode::TableSize},
{""},
-#line 450 "src/lexer-keywords.txt"
+#line 451 "src/lexer-keywords.txt"
{"i64x2.abs", TokenType::Unary, Opcode::I64X2Abs},
{""}, {""}, {""}, {""},
-#line 513 "src/lexer-keywords.txt"
+#line 514 "src/lexer-keywords.txt"
{"local.tee", TokenType::LocalTee, Opcode::LocalTee},
{""},
-#line 547 "src/lexer-keywords.txt"
+#line 548 "src/lexer-keywords.txt"
{"struct", Type::Struct, TokenType::Struct},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
-#line 125 "src/lexer-keywords.txt"
+#line 126 "src/lexer-keywords.txt"
{"f64.load", TokenType::Load, Opcode::F64Load},
-#line 68 "src/lexer-keywords.txt"
+#line 69 "src/lexer-keywords.txt"
{"f32.load", TokenType::Load, Opcode::F32Load},
-#line 154 "src/lexer-keywords.txt"
+#line 155 "src/lexer-keywords.txt"
{"f64x2.nearest", TokenType::Unary, Opcode::F64X2Nearest},
-#line 410 "src/lexer-keywords.txt"
+#line 411 "src/lexer-keywords.txt"
{"i64.load", TokenType::Load, Opcode::I64Load},
-#line 273 "src/lexer-keywords.txt"
+#line 274 "src/lexer-keywords.txt"
{"i32.load", TokenType::Load, Opcode::I32Load},
{""}, {""}, {""},
-#line 50 "src/lexer-keywords.txt"
+#line 51 "src/lexer-keywords.txt"
{"externref", Type::ExternRef},
{""}, {""}, {""}, {""}, {""}, {""}, {""},
-#line 142 "src/lexer-keywords.txt"
+#line 143 "src/lexer-keywords.txt"
{"f64x2.ceil", TokenType::Unary, Opcode::F64X2Ceil},
{""}, {""}, {""}, {""}, {""}, {""},
-#line 141 "src/lexer-keywords.txt"
+#line 142 "src/lexer-keywords.txt"
{"f64x2.add", TokenType::Binary, Opcode::F64X2Add},
{""}, {""},
-#line 439 "src/lexer-keywords.txt"
+#line 440 "src/lexer-keywords.txt"
{"i64x2.add", TokenType::Binary, Opcode::I64X2Add},
{""}, {""},
-#line 389 "src/lexer-keywords.txt"
+#line 390 "src/lexer-keywords.txt"
{"i64.div_s", TokenType::Binary, Opcode::I64DivS},
-#line 257 "src/lexer-keywords.txt"
+#line 258 "src/lexer-keywords.txt"
{"i32.div_s", TokenType::Binary, Opcode::I32DivS},
{""}, {""},
-#line 390 "src/lexer-keywords.txt"
+#line 391 "src/lexer-keywords.txt"
{"i64.div_u", TokenType::Binary, Opcode::I64DivU},
-#line 258 "src/lexer-keywords.txt"
+#line 259 "src/lexer-keywords.txt"
{"i32.div_u", TokenType::Binary, Opcode::I32DivU},
{""},
-#line 385 "src/lexer-keywords.txt"
+#line 386 "src/lexer-keywords.txt"
{"i64.atomic.store", TokenType::AtomicStore, Opcode::I64AtomicStore},
-#line 253 "src/lexer-keywords.txt"
+#line 254 "src/lexer-keywords.txt"
{"i32.atomic.store", TokenType::AtomicStore, Opcode::I32AtomicStore},
-#line 531 "src/lexer-keywords.txt"
+#line 532 "src/lexer-keywords.txt"
{"output", TokenType::Output},
{""},
-#line 509 "src/lexer-keywords.txt"
+#line 510 "src/lexer-keywords.txt"
{"invoke", TokenType::Invoke},
{""}, {""}, {""},
-#line 388 "src/lexer-keywords.txt"
+#line 389 "src/lexer-keywords.txt"
{"i64.ctz", TokenType::Unary, Opcode::I64Ctz},
-#line 256 "src/lexer-keywords.txt"
+#line 257 "src/lexer-keywords.txt"
{"i32.ctz", TokenType::Unary, Opcode::I32Ctz},
-#line 406 "src/lexer-keywords.txt"
+#line 407 "src/lexer-keywords.txt"
{"i64.load32_s", TokenType::Load, Opcode::I64Load32S},
-#line 453 "src/lexer-keywords.txt"
+#line 454 "src/lexer-keywords.txt"
{"i64x2.bitmask", TokenType::Unary, Opcode::I64X2Bitmask},
-#line 383 "src/lexer-keywords.txt"
+#line 384 "src/lexer-keywords.txt"
{"i64.atomic.store32", TokenType::AtomicStore, Opcode::I64AtomicStore32},
{""},
-#line 407 "src/lexer-keywords.txt"
+#line 408 "src/lexer-keywords.txt"
{"i64.load32_u", TokenType::Load, Opcode::I64Load32U},
{""},
-#line 136 "src/lexer-keywords.txt"
+#line 137 "src/lexer-keywords.txt"
{"f64.store", TokenType::Store, Opcode::F64Store},
-#line 78 "src/lexer-keywords.txt"
+#line 79 "src/lexer-keywords.txt"
{"f32.store", TokenType::Store, Opcode::F32Store},
{""},
-#line 428 "src/lexer-keywords.txt"
+#line 429 "src/lexer-keywords.txt"
{"i64.store", TokenType::Store, Opcode::I64Store},
-#line 290 "src/lexer-keywords.txt"
+#line 291 "src/lexer-keywords.txt"
{"i32.store", TokenType::Store, Opcode::I32Store},
{""}, {""}, {""},
-#line 426 "src/lexer-keywords.txt"
+#line 427 "src/lexer-keywords.txt"
{"i64.store32", TokenType::Store, Opcode::I64Store32},
{""},
-#line 404 "src/lexer-keywords.txt"
+#line 405 "src/lexer-keywords.txt"
{"i64.load16_s", TokenType::Load, Opcode::I64Load16S},
-#line 269 "src/lexer-keywords.txt"
+#line 270 "src/lexer-keywords.txt"
{"i32.load16_s", TokenType::Load, Opcode::I32Load16S},
{""}, {""},
-#line 405 "src/lexer-keywords.txt"
+#line 406 "src/lexer-keywords.txt"
{"i64.load16_u", TokenType::Load, Opcode::I64Load16U},
-#line 270 "src/lexer-keywords.txt"
+#line 271 "src/lexer-keywords.txt"
{"i32.load16_u", TokenType::Load, Opcode::I32Load16U},
{""}, {""}, {""}, {""}, {""}, {""},
-#line 61 "src/lexer-keywords.txt"
+#line 62 "src/lexer-keywords.txt"
{"f32.demote_f64", TokenType::Convert, Opcode::F32DemoteF64},
{""}, {""},
-#line 386 "src/lexer-keywords.txt"
+#line 387 "src/lexer-keywords.txt"
{"i64.clz", TokenType::Unary, Opcode::I64Clz},
-#line 254 "src/lexer-keywords.txt"
+#line 255 "src/lexer-keywords.txt"
{"i32.clz", TokenType::Unary, Opcode::I32Clz},
{""},
-#line 536 "src/lexer-keywords.txt"
+#line 537 "src/lexer-keywords.txt"
{"ref.is_null", TokenType::RefIsNull, Opcode::RefIsNull},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""}, {""},
-#line 36 "src/lexer-keywords.txt"
+#line 37 "src/lexer-keywords.txt"
{"catch_all", TokenType::CatchAll, Opcode::CatchAll},
{""},
#line 22 "src/lexer-keywords.txt"
{"assert_invalid", TokenType::AssertInvalid},
-#line 40 "src/lexer-keywords.txt"
+#line 41 "src/lexer-keywords.txt"
{"declare", TokenType::Declare},
#line 26 "src/lexer-keywords.txt"
{"assert_unlinkable", TokenType::AssertUnlinkable},
{""}, {""}, {""}, {""}, {""},
-#line 629 "src/lexer-keywords.txt"
+#line 630 "src/lexer-keywords.txt"
{"set_local", TokenType::LocalSet, Opcode::LocalSet},
{""}, {""}, {""}, {""}, {""},
-#line 630 "src/lexer-keywords.txt"
+#line 631 "src/lexer-keywords.txt"
{"tee_local", TokenType::LocalTee, Opcode::LocalTee},
{""}, {""}, {""}, {""}, {""},
#line 33 "src/lexer-keywords.txt"
{"call_indirect", TokenType::CallIndirect, Opcode::CallIndirect},
-#line 109 "src/lexer-keywords.txt"
+#line 110 "src/lexer-keywords.txt"
{"f32x4", TokenType::F32X4},
- {""}, {""},
-#line 338 "src/lexer-keywords.txt"
+#line 34 "src/lexer-keywords.txt"
+ {"call_ref", TokenType::CallRef, Opcode::CallRef},
+ {""},
+#line 339 "src/lexer-keywords.txt"
{"i32x4", TokenType::I32X4},
-#line 130 "src/lexer-keywords.txt"
+#line 131 "src/lexer-keywords.txt"
{"f64.nearest", TokenType::Unary, Opcode::F64Nearest},
-#line 73 "src/lexer-keywords.txt"
+#line 74 "src/lexer-keywords.txt"
{"f32.nearest", TokenType::Unary, Opcode::F32Nearest},
{""}, {""}, {""}, {""}, {""}, {""},
-#line 353 "src/lexer-keywords.txt"
+#line 354 "src/lexer-keywords.txt"
{"i64.atomic.load", TokenType::AtomicLoad, Opcode::I64AtomicLoad},
-#line 229 "src/lexer-keywords.txt"
+#line 230 "src/lexer-keywords.txt"
{"i32.atomic.load", TokenType::AtomicLoad, Opcode::I32AtomicLoad},
{""}, {""},
-#line 537 "src/lexer-keywords.txt"
+#line 538 "src/lexer-keywords.txt"
{"ref.null", TokenType::RefNull, Opcode::RefNull},
{""}, {""}, {""}, {""}, {""}, {""},
-#line 138 "src/lexer-keywords.txt"
+#line 139 "src/lexer-keywords.txt"
{"f64.trunc", TokenType::Unary, Opcode::F64Trunc},
-#line 80 "src/lexer-keywords.txt"
+#line 81 "src/lexer-keywords.txt"
{"f32.trunc", TokenType::Unary, Opcode::F32Trunc},
{""}, {""}, {""}, {""},
-#line 430 "src/lexer-keywords.txt"
+#line 431 "src/lexer-keywords.txt"
{"i64.trunc_f32_s", TokenType::Convert, Opcode::I64TruncF32S},
-#line 292 "src/lexer-keywords.txt"
+#line 293 "src/lexer-keywords.txt"
{"i32.trunc_f32_s", TokenType::Convert, Opcode::I32TruncF32S},
-#line 431 "src/lexer-keywords.txt"
+#line 432 "src/lexer-keywords.txt"
{"i64.trunc_f32_u", TokenType::Convert, Opcode::I64TruncF32U},
-#line 293 "src/lexer-keywords.txt"
+#line 294 "src/lexer-keywords.txt"
{"i32.trunc_f32_u", TokenType::Convert, Opcode::I32TruncF32U},
{""}, {""}, {""},
#line 27 "src/lexer-keywords.txt"
{"atomic.fence", TokenType::AtomicFence, Opcode::AtomicFence},
{""}, {""}, {""},
-#line 591 "src/lexer-keywords.txt"
+#line 592 "src/lexer-keywords.txt"
{"i64.atomic.wait", TokenType::AtomicWait, Opcode::MemoryAtomicWait64},
-#line 590 "src/lexer-keywords.txt"
+#line 591 "src/lexer-keywords.txt"
{"i32.atomic.wait", TokenType::AtomicWait, Opcode::MemoryAtomicWait32},
{""},
-#line 100 "src/lexer-keywords.txt"
+#line 101 "src/lexer-keywords.txt"
{"f32x4.ne", TokenType::Compare, Opcode::F32X4Ne},
-#line 566 "src/lexer-keywords.txt"
+#line 567 "src/lexer-keywords.txt"
{"v128.not", TokenType::Unary, Opcode::V128Not},
-#line 96 "src/lexer-keywords.txt"
+#line 97 "src/lexer-keywords.txt"
{"f32x4.min", TokenType::Binary, Opcode::F32X4Min},
-#line 325 "src/lexer-keywords.txt"
+#line 326 "src/lexer-keywords.txt"
{"i32x4.ne", TokenType::Compare, Opcode::I32X4Ne},
-#line 119 "src/lexer-keywords.txt"
+#line 120 "src/lexer-keywords.txt"
{"f64.div", TokenType::Binary, Opcode::F64Div},
-#line 62 "src/lexer-keywords.txt"
+#line 63 "src/lexer-keywords.txt"
{"f32.div", TokenType::Binary, Opcode::F32Div},
{""}, {""},
-#line 421 "src/lexer-keywords.txt"
+#line 422 "src/lexer-keywords.txt"
{"i64.rotr", TokenType::Binary, Opcode::I64Rotr},
-#line 284 "src/lexer-keywords.txt"
+#line 285 "src/lexer-keywords.txt"
{"i32.rotr", TokenType::Binary, Opcode::I32Rotr},
{""}, {""},
-#line 320 "src/lexer-keywords.txt"
+#line 321 "src/lexer-keywords.txt"
{"i32x4.min_s", TokenType::Binary, Opcode::I32X4MinS},
-#line 559 "src/lexer-keywords.txt"
+#line 560 "src/lexer-keywords.txt"
{"type", TokenType::Type},
{""}, {""},
-#line 321 "src/lexer-keywords.txt"
+#line 322 "src/lexer-keywords.txt"
{"i32x4.min_u", TokenType::Binary, Opcode::I32X4MinU},
-#line 597 "src/lexer-keywords.txt"
+#line 598 "src/lexer-keywords.txt"
{"f32.demote/f64", TokenType::Convert, Opcode::F32DemoteF64},
{""},
-#line 94 "src/lexer-keywords.txt"
+#line 95 "src/lexer-keywords.txt"
{"f32x4.lt", TokenType::Compare, Opcode::F32X4Lt},
-#line 508 "src/lexer-keywords.txt"
+#line 509 "src/lexer-keywords.txt"
{"input", TokenType::Input},
{""},
-#line 114 "src/lexer-keywords.txt"
+#line 115 "src/lexer-keywords.txt"
{"f64.convert_i32_s", TokenType::Convert, Opcode::F64ConvertI32S},
-#line 56 "src/lexer-keywords.txt"
+#line 57 "src/lexer-keywords.txt"
{"f32.convert_i32_s", TokenType::Convert, Opcode::F32ConvertI32S},
{""}, {""},
-#line 507 "src/lexer-keywords.txt"
+#line 508 "src/lexer-keywords.txt"
{"import", TokenType::Import},
-#line 163 "src/lexer-keywords.txt"
+#line 164 "src/lexer-keywords.txt"
{"f64x2.trunc", TokenType::Unary, Opcode::F64X2Trunc},
{""},
-#line 51 "src/lexer-keywords.txt"
+#line 52 "src/lexer-keywords.txt"
{"export", TokenType::Export},
-#line 106 "src/lexer-keywords.txt"
+#line 107 "src/lexer-keywords.txt"
{"f32x4.sub", TokenType::Binary, Opcode::F32X4Sub},
-#line 93 "src/lexer-keywords.txt"
+#line 94 "src/lexer-keywords.txt"
{"f32x4.le", TokenType::Compare, Opcode::F32X4Le},
-#line 316 "src/lexer-keywords.txt"
+#line 317 "src/lexer-keywords.txt"
{"i32x4.lt_s", TokenType::Compare, Opcode::I32X4LtS},
-#line 331 "src/lexer-keywords.txt"
+#line 332 "src/lexer-keywords.txt"
{"i32x4.sub", TokenType::Binary, Opcode::I32X4Sub},
-#line 317 "src/lexer-keywords.txt"
+#line 318 "src/lexer-keywords.txt"
{"i32x4.lt_u", TokenType::Compare, Opcode::I32X4LtU},
{""}, {""}, {""},
-#line 312 "src/lexer-keywords.txt"
+#line 313 "src/lexer-keywords.txt"
{"i32x4.le_s", TokenType::Compare, Opcode::I32X4LeS},
{""},
-#line 313 "src/lexer-keywords.txt"
+#line 314 "src/lexer-keywords.txt"
{"i32x4.le_u", TokenType::Compare, Opcode::I32X4LeU},
{""},
-#line 542 "src/lexer-keywords.txt"
+#line 543 "src/lexer-keywords.txt"
{"return_call", TokenType::ReturnCall, Opcode::ReturnCall},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
-#line 452 "src/lexer-keywords.txt"
+#line 453 "src/lexer-keywords.txt"
{"i64x2.all_true", TokenType::Unary, Opcode::I64X2AllTrue},
{""},
-#line 561 "src/lexer-keywords.txt"
- {"v128.andnot", TokenType::Binary, Opcode::V128Andnot},
#line 562 "src/lexer-keywords.txt"
+ {"v128.andnot", TokenType::Binary, Opcode::V128Andnot},
+#line 563 "src/lexer-keywords.txt"
{"v128.and", TokenType::Binary, Opcode::V128And},
-#line 528 "src/lexer-keywords.txt"
+#line 529 "src/lexer-keywords.txt"
{"nan:canonical", TokenType::NanCanonical},
{""}, {""}, {""},
-#line 351 "src/lexer-keywords.txt"
+#line 352 "src/lexer-keywords.txt"
{"i64.atomic.load32_u", TokenType::AtomicLoad, Opcode::I64AtomicLoad32U},
{""}, {""},
-#line 97 "src/lexer-keywords.txt"
+#line 98 "src/lexer-keywords.txt"
{"f32x4.mul", TokenType::Binary, Opcode::F32X4Mul},
{""},
#line 24 "src/lexer-keywords.txt"
{"assert_return", TokenType::AssertReturn},
-#line 323 "src/lexer-keywords.txt"
+#line 324 "src/lexer-keywords.txt"
{"i32x4.mul", TokenType::Binary, Opcode::I32X4Mul},
-#line 432 "src/lexer-keywords.txt"
+#line 433 "src/lexer-keywords.txt"
{"i64.trunc_f64_s", TokenType::Convert, Opcode::I64TruncF64S},
-#line 294 "src/lexer-keywords.txt"
+#line 295 "src/lexer-keywords.txt"
{"i32.trunc_f64_s", TokenType::Convert, Opcode::I32TruncF64S},
-#line 433 "src/lexer-keywords.txt"
+#line 434 "src/lexer-keywords.txt"
{"i64.trunc_f64_u", TokenType::Convert, Opcode::I64TruncF64U},
-#line 295 "src/lexer-keywords.txt"
+#line 296 "src/lexer-keywords.txt"
{"i32.trunc_f64_u", TokenType::Convert, Opcode::I32TruncF64U},
-#line 82 "src/lexer-keywords.txt"
+#line 83 "src/lexer-keywords.txt"
{"f32x4.abs", TokenType::Unary, Opcode::F32X4Abs},
{""},
-#line 43 "src/lexer-keywords.txt"
+#line 44 "src/lexer-keywords.txt"
{"drop", TokenType::Drop, Opcode::Drop},
-#line 302 "src/lexer-keywords.txt"
+#line 303 "src/lexer-keywords.txt"
{"i32x4.abs", TokenType::Unary, Opcode::I32X4Abs},
{""},
-#line 143 "src/lexer-keywords.txt"
+#line 144 "src/lexer-keywords.txt"
{"f64x2.div", TokenType::Binary, Opcode::F64X2Div},
{""}, {""}, {""},
-#line 564 "src/lexer-keywords.txt"
+#line 565 "src/lexer-keywords.txt"
{"v128.const", TokenType::Const, Opcode::V128Const},
{""}, {""}, {""}, {""},
#line 23 "src/lexer-keywords.txt"
{"assert_malformed", TokenType::AssertMalformed},
-#line 515 "src/lexer-keywords.txt"
+#line 516 "src/lexer-keywords.txt"
{"loop", TokenType::Loop, Opcode::Loop},
{""}, {""},
-#line 620 "src/lexer-keywords.txt"
+#line 621 "src/lexer-keywords.txt"
{"i64.trunc_s/f32", TokenType::Convert, Opcode::I64TruncF32S},
-#line 608 "src/lexer-keywords.txt"
+#line 609 "src/lexer-keywords.txt"
{"i32.trunc_s/f32", TokenType::Convert, Opcode::I32TruncF32S},
-#line 624 "src/lexer-keywords.txt"
+#line 625 "src/lexer-keywords.txt"
{"i64.trunc_u/f32", TokenType::Convert, Opcode::I64TruncF32U},
-#line 612 "src/lexer-keywords.txt"
+#line 613 "src/lexer-keywords.txt"
{"i32.trunc_u/f32", TokenType::Convert, Opcode::I32TruncF32U},
-#line 98 "src/lexer-keywords.txt"
+#line 99 "src/lexer-keywords.txt"
{"f32x4.nearest", TokenType::Unary, Opcode::F32X4Nearest},
-#line 394 "src/lexer-keywords.txt"
+#line 395 "src/lexer-keywords.txt"
{"i64.extend32_s", TokenType::Unary, Opcode::I64Extend32S},
{""},
-#line 158 "src/lexer-keywords.txt"
+#line 159 "src/lexer-keywords.txt"
{"f64x2.pmin", TokenType::Binary, Opcode::F64X2PMin},
-#line 146 "src/lexer-keywords.txt"
+#line 147 "src/lexer-keywords.txt"
{"f64x2.floor", TokenType::Unary, Opcode::F64X2Floor},
{""}, {""}, {""}, {""}, {""}, {""},
-#line 116 "src/lexer-keywords.txt"
+#line 117 "src/lexer-keywords.txt"
{"f64.convert_i64_s", TokenType::Convert, Opcode::F64ConvertI64S},
-#line 58 "src/lexer-keywords.txt"
+#line 59 "src/lexer-keywords.txt"
{"f32.convert_i64_s", TokenType::Convert, Opcode::F32ConvertI64S},
-#line 396 "src/lexer-keywords.txt"
+#line 397 "src/lexer-keywords.txt"
{"i64.extend_i32_s", TokenType::Convert, Opcode::I64ExtendI32S},
-#line 84 "src/lexer-keywords.txt"
+#line 85 "src/lexer-keywords.txt"
{"f32x4.ceil", TokenType::Unary, Opcode::F32X4Ceil},
{""}, {""},
-#line 397 "src/lexer-keywords.txt"
+#line 398 "src/lexer-keywords.txt"
{"i64.extend_i32_u", TokenType::Convert, Opcode::I64ExtendI32U},
{""},
-#line 540 "src/lexer-keywords.txt"
+#line 541 "src/lexer-keywords.txt"
{"rethrow", TokenType::Rethrow, Opcode::Rethrow},
{""},
-#line 83 "src/lexer-keywords.txt"
+#line 84 "src/lexer-keywords.txt"
{"f32x4.add", TokenType::Binary, Opcode::F32X4Add},
-#line 434 "src/lexer-keywords.txt"
+#line 435 "src/lexer-keywords.txt"
{"i64.trunc_sat_f32_s", TokenType::Convert, Opcode::I64TruncSatF32S},
-#line 296 "src/lexer-keywords.txt"
+#line 297 "src/lexer-keywords.txt"
{"i32.trunc_sat_f32_s", TokenType::Convert, Opcode::I32TruncSatF32S},
-#line 303 "src/lexer-keywords.txt"
+#line 304 "src/lexer-keywords.txt"
{"i32x4.add", TokenType::Binary, Opcode::I32X4Add},
{""},
-#line 435 "src/lexer-keywords.txt"
+#line 436 "src/lexer-keywords.txt"
{"i64.trunc_sat_f32_u", TokenType::Convert, Opcode::I64TruncSatF32U},
-#line 297 "src/lexer-keywords.txt"
+#line 298 "src/lexer-keywords.txt"
{"i32.trunc_sat_f32_u", TokenType::Convert, Opcode::I32TruncSatF32U},
{""}, {""},
-#line 563 "src/lexer-keywords.txt"
+#line 564 "src/lexer-keywords.txt"
{"v128.bitselect", TokenType::Ternary, Opcode::V128BitSelect},
{""},
-#line 382 "src/lexer-keywords.txt"
+#line 383 "src/lexer-keywords.txt"
{"i64.atomic.store16", TokenType::AtomicStore, Opcode::I64AtomicStore16},
-#line 251 "src/lexer-keywords.txt"
+#line 252 "src/lexer-keywords.txt"
{"i32.atomic.store16", TokenType::AtomicStore, Opcode::I32AtomicStore16},
{""},
-#line 372 "src/lexer-keywords.txt"
+#line 373 "src/lexer-keywords.txt"
{"i64.atomic.rmw8.sub_u", TokenType::AtomicRmw, Opcode::I64AtomicRmw8SubU},
-#line 241 "src/lexer-keywords.txt"
+#line 242 "src/lexer-keywords.txt"
{"i32.atomic.rmw8.sub_u", TokenType::AtomicRmw, Opcode::I32AtomicRmw8SubU},
{""},
-#line 160 "src/lexer-keywords.txt"
+#line 161 "src/lexer-keywords.txt"
{"f64x2.splat", TokenType::Unary, Opcode::F64X2Splat},
{""}, {""},
-#line 462 "src/lexer-keywords.txt"
+#line 463 "src/lexer-keywords.txt"
{"i64x2.splat", TokenType::Unary, Opcode::I64X2Splat},
{""},
-#line 425 "src/lexer-keywords.txt"
+#line 426 "src/lexer-keywords.txt"
{"i64.store16", TokenType::Store, Opcode::I64Store16},
-#line 288 "src/lexer-keywords.txt"
+#line 289 "src/lexer-keywords.txt"
{"i32.store16", TokenType::Store, Opcode::I32Store16},
-#line 305 "src/lexer-keywords.txt"
+#line 306 "src/lexer-keywords.txt"
{"i32x4.bitmask", TokenType::Unary, Opcode::I32X4Bitmask},
{""},
-#line 565 "src/lexer-keywords.txt"
+#line 566 "src/lexer-keywords.txt"
{"v128.load", TokenType::Load, Opcode::V128Load},
{""}, {""}, {""}, {""}, {""}, {""},
-#line 571 "src/lexer-keywords.txt"
+#line 572 "src/lexer-keywords.txt"
{"v128.store", TokenType::Store, Opcode::V128Store},
-#line 369 "src/lexer-keywords.txt"
+#line 370 "src/lexer-keywords.txt"
{"i64.atomic.rmw8.and_u", TokenType::AtomicRmw, Opcode::I64AtomicRmw8AndU},
-#line 238 "src/lexer-keywords.txt"
+#line 239 "src/lexer-keywords.txt"
{"i32.atomic.rmw8.and_u", TokenType::AtomicRmw, Opcode::I32AtomicRmw8AndU},
{""},
-#line 532 "src/lexer-keywords.txt"
+#line 533 "src/lexer-keywords.txt"
{"param", TokenType::Param},
-#line 541 "src/lexer-keywords.txt"
+#line 542 "src/lexer-keywords.txt"
{"return_call_indirect", TokenType::ReturnCallIndirect, Opcode::ReturnCallIndirect},
{""}, {""}, {""}, {""}, {""}, {""}, {""},
-#line 599 "src/lexer-keywords.txt"
+#line 600 "src/lexer-keywords.txt"
{"f64.convert_s/i32", TokenType::Convert, Opcode::F64ConvertI32S},
-#line 593 "src/lexer-keywords.txt"
+#line 594 "src/lexer-keywords.txt"
{"f32.convert_s/i32", TokenType::Convert, Opcode::F32ConvertI32S},
-#line 601 "src/lexer-keywords.txt"
+#line 602 "src/lexer-keywords.txt"
{"f64.convert_u/i32", TokenType::Convert, Opcode::F64ConvertI32U},
-#line 595 "src/lexer-keywords.txt"
+#line 596 "src/lexer-keywords.txt"
{"f32.convert_u/i32", TokenType::Convert, Opcode::F32ConvertI32U},
{""}, {""},
-#line 368 "src/lexer-keywords.txt"
+#line 369 "src/lexer-keywords.txt"
{"i64.atomic.rmw8.add_u", TokenType::AtomicRmw, Opcode::I64AtomicRmw8AddU},
-#line 237 "src/lexer-keywords.txt"
+#line 238 "src/lexer-keywords.txt"
{"i32.atomic.rmw8.add_u", TokenType::AtomicRmw, Opcode::I32AtomicRmw8AddU},
{""},
-#line 572 "src/lexer-keywords.txt"
+#line 573 "src/lexer-keywords.txt"
{"v128", Type::V128},
-#line 621 "src/lexer-keywords.txt"
+#line 622 "src/lexer-keywords.txt"
{"i64.trunc_s/f64", TokenType::Convert, Opcode::I64TruncF64S},
-#line 609 "src/lexer-keywords.txt"
+#line 610 "src/lexer-keywords.txt"
{"i32.trunc_s/f64", TokenType::Convert, Opcode::I32TruncF64S},
-#line 625 "src/lexer-keywords.txt"
+#line 626 "src/lexer-keywords.txt"
{"i64.trunc_u/f64", TokenType::Convert, Opcode::I64TruncF64U},
-#line 613 "src/lexer-keywords.txt"
+#line 614 "src/lexer-keywords.txt"
{"i32.trunc_u/f64", TokenType::Convert, Opcode::I32TruncF64U},
-#line 617 "src/lexer-keywords.txt"
+#line 618 "src/lexer-keywords.txt"
{"i64.extend_s/i32", TokenType::Convert, Opcode::I64ExtendI32S},
{""},
-#line 618 "src/lexer-keywords.txt"
+#line 619 "src/lexer-keywords.txt"
{"i64.extend_u/i32", TokenType::Convert, Opcode::I64ExtendI32U},
{""}, {""},
-#line 115 "src/lexer-keywords.txt"
+#line 116 "src/lexer-keywords.txt"
{"f64.convert_i32_u", TokenType::Convert, Opcode::F64ConvertI32U},
-#line 57 "src/lexer-keywords.txt"
+#line 58 "src/lexer-keywords.txt"
{"f32.convert_i32_u", TokenType::Convert, Opcode::F32ConvertI32U},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""},
-#line 408 "src/lexer-keywords.txt"
+#line 409 "src/lexer-keywords.txt"
{"i64.load8_s", TokenType::Load, Opcode::I64Load8S},
-#line 271 "src/lexer-keywords.txt"
+#line 272 "src/lexer-keywords.txt"
{"i32.load8_s", TokenType::Load, Opcode::I32Load8S},
{""}, {""},
-#line 409 "src/lexer-keywords.txt"
+#line 410 "src/lexer-keywords.txt"
{"i64.load8_u", TokenType::Load, Opcode::I64Load8U},
-#line 272 "src/lexer-keywords.txt"
+#line 273 "src/lexer-keywords.txt"
{"i32.load8_u", TokenType::Load, Opcode::I32Load8U},
-#line 375 "src/lexer-keywords.txt"
+#line 376 "src/lexer-keywords.txt"
{"i64.atomic.rmw.add", TokenType::AtomicRmw, Opcode::I64AtomicRmwAdd},
-#line 244 "src/lexer-keywords.txt"
+#line 245 "src/lexer-keywords.txt"
{"i32.atomic.rmw.add", TokenType::AtomicRmw, Opcode::I32AtomicRmwAdd},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""},
-#line 365 "src/lexer-keywords.txt"
+#line 366 "src/lexer-keywords.txt"
{"i64.atomic.rmw32.sub_u", TokenType::AtomicRmw, Opcode::I64AtomicRmw32SubU},
{""},
-#line 171 "src/lexer-keywords.txt"
+#line 172 "src/lexer-keywords.txt"
{"get", TokenType::Get},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""}, {""},
-#line 393 "src/lexer-keywords.txt"
+#line 394 "src/lexer-keywords.txt"
{"i64.extend16_s", TokenType::Unary, Opcode::I64Extend16S},
-#line 261 "src/lexer-keywords.txt"
+#line 262 "src/lexer-keywords.txt"
{"i32.extend16_s", TokenType::Unary, Opcode::I32Extend16S},
{""}, {""}, {""}, {""}, {""}, {""},
-#line 557 "src/lexer-keywords.txt"
+#line 558 "src/lexer-keywords.txt"
{"throw", TokenType::Throw, Opcode::Throw},
{""},
-#line 376 "src/lexer-keywords.txt"
+#line 377 "src/lexer-keywords.txt"
{"i64.atomic.rmw.and", TokenType::AtomicRmw, Opcode::I64AtomicRmwAnd},
-#line 245 "src/lexer-keywords.txt"
+#line 246 "src/lexer-keywords.txt"
{"i32.atomic.rmw.and", TokenType::AtomicRmw, Opcode::I32AtomicRmwAnd},
{""},
#line 30 "src/lexer-keywords.txt"
{"br_if", TokenType::BrIf, Opcode::BrIf},
-#line 427 "src/lexer-keywords.txt"
+#line 428 "src/lexer-keywords.txt"
{"i64.store8", TokenType::Store, Opcode::I64Store8},
-#line 289 "src/lexer-keywords.txt"
+#line 290 "src/lexer-keywords.txt"
{"i32.store8", TokenType::Store, Opcode::I32Store8},
{""}, {""}, {""}, {""}, {""}, {""}, {""},
-#line 533 "src/lexer-keywords.txt"
+#line 534 "src/lexer-keywords.txt"
{"quote", TokenType::Quote},
{""}, {""}, {""}, {""},
-#line 578 "src/lexer-keywords.txt"
+#line 579 "src/lexer-keywords.txt"
{"v128.load8_lane", TokenType::SimdLoadLane, Opcode::V128Load8Lane},
-#line 567 "src/lexer-keywords.txt"
+#line 568 "src/lexer-keywords.txt"
{"v128.or", TokenType::Binary, Opcode::V128Or},
{""}, {""}, {""},
-#line 117 "src/lexer-keywords.txt"
+#line 118 "src/lexer-keywords.txt"
{"f64.convert_i64_u", TokenType::Convert, Opcode::F64ConvertI64U},
-#line 59 "src/lexer-keywords.txt"
+#line 60 "src/lexer-keywords.txt"
{"f32.convert_i64_u", TokenType::Convert, Opcode::F32ConvertI64U},
-#line 378 "src/lexer-keywords.txt"
+#line 379 "src/lexer-keywords.txt"
{"i64.atomic.rmw.or", TokenType::AtomicRmw, Opcode::I64AtomicRmwOr},
-#line 247 "src/lexer-keywords.txt"
+#line 248 "src/lexer-keywords.txt"
{"i32.atomic.rmw.or", TokenType::AtomicRmw, Opcode::I32AtomicRmwOr},
{""}, {""}, {""},
-#line 581 "src/lexer-keywords.txt"
+#line 582 "src/lexer-keywords.txt"
{"v128.load64_lane", TokenType::SimdLoadLane, Opcode::V128Load64Lane},
-#line 580 "src/lexer-keywords.txt"
+#line 581 "src/lexer-keywords.txt"
{"v128.load32_lane", TokenType::SimdLoadLane, Opcode::V128Load32Lane},
-#line 584 "src/lexer-keywords.txt"
+#line 585 "src/lexer-keywords.txt"
{"v128.store32_lane", TokenType::SimdStoreLane, Opcode::V128Store32Lane},
{""},
-#line 362 "src/lexer-keywords.txt"
+#line 363 "src/lexer-keywords.txt"
{"i64.atomic.rmw32.and_u", TokenType::AtomicRmw, Opcode::I64AtomicRmw32AndU},
{""}, {""}, {""}, {""}, {""},
-#line 107 "src/lexer-keywords.txt"
+#line 108 "src/lexer-keywords.txt"
{"f32x4.trunc", TokenType::Unary, Opcode::F32X4Trunc},
{""}, {""},
-#line 379 "src/lexer-keywords.txt"
+#line 380 "src/lexer-keywords.txt"
{"i64.atomic.rmw.sub", TokenType::AtomicRmw, Opcode::I64AtomicRmwSub},
-#line 248 "src/lexer-keywords.txt"
+#line 249 "src/lexer-keywords.txt"
{"i32.atomic.rmw.sub", TokenType::AtomicRmw, Opcode::I32AtomicRmwSub},
-#line 550 "src/lexer-keywords.txt"
+#line 551 "src/lexer-keywords.txt"
{"table.get", TokenType::TableGet, Opcode::TableGet},
#line 21 "src/lexer-keywords.txt"
{"assert_exhaustion", TokenType::AssertExhaustion},
{""},
-#line 534 "src/lexer-keywords.txt"
+#line 535 "src/lexer-keywords.txt"
{"ref.extern", TokenType::RefExtern},
{""}, {""},
-#line 148 "src/lexer-keywords.txt"
+#line 149 "src/lexer-keywords.txt"
{"f64x2.gt", TokenType::Compare, Opcode::F64X2Gt},
-#line 361 "src/lexer-keywords.txt"
+#line 362 "src/lexer-keywords.txt"
{"i64.atomic.rmw32.add_u", TokenType::AtomicRmw, Opcode::I64AtomicRmw32AddU},
{""},
-#line 415 "src/lexer-keywords.txt"
+#line 416 "src/lexer-keywords.txt"
{"i64.or", TokenType::Binary, Opcode::I64Or},
-#line 278 "src/lexer-keywords.txt"
+#line 279 "src/lexer-keywords.txt"
{"i32.or", TokenType::Binary, Opcode::I32Or},
-#line 123 "src/lexer-keywords.txt"
+#line 124 "src/lexer-keywords.txt"
{"f64.gt", TokenType::Compare, Opcode::F64Gt},
-#line 66 "src/lexer-keywords.txt"
+#line 67 "src/lexer-keywords.txt"
{"f32.gt", TokenType::Compare, Opcode::F32Gt},
{""}, {""}, {""}, {""}, {""},
-#line 147 "src/lexer-keywords.txt"
+#line 148 "src/lexer-keywords.txt"
{"f64x2.ge", TokenType::Compare, Opcode::F64X2Ge},
-#line 447 "src/lexer-keywords.txt"
+#line 448 "src/lexer-keywords.txt"
{"i64x2.gt_s", TokenType::Binary, Opcode::I64X2GtS},
-#line 304 "src/lexer-keywords.txt"
+#line 305 "src/lexer-keywords.txt"
{"i32x4.all_true", TokenType::Unary, Opcode::I32X4AllTrue},
{""}, {""},
-#line 122 "src/lexer-keywords.txt"
+#line 123 "src/lexer-keywords.txt"
{"f64.ge", TokenType::Compare, Opcode::F64Ge},
-#line 65 "src/lexer-keywords.txt"
+#line 66 "src/lexer-keywords.txt"
{"f32.ge", TokenType::Compare, Opcode::F32Ge},
-#line 449 "src/lexer-keywords.txt"
+#line 450 "src/lexer-keywords.txt"
{"i64x2.ge_s", TokenType::Binary, Opcode::I64X2GeS},
{""}, {""}, {""}, {""}, {""},
-#line 400 "src/lexer-keywords.txt"
+#line 401 "src/lexer-keywords.txt"
{"i64.gt_s", TokenType::Compare, Opcode::I64GtS},
-#line 265 "src/lexer-keywords.txt"
+#line 266 "src/lexer-keywords.txt"
{"i32.gt_s", TokenType::Compare, Opcode::I32GtS},
{""}, {""},
-#line 401 "src/lexer-keywords.txt"
+#line 402 "src/lexer-keywords.txt"
{"i64.gt_u", TokenType::Compare, Opcode::I64GtU},
-#line 266 "src/lexer-keywords.txt"
+#line 267 "src/lexer-keywords.txt"
{"i32.gt_u", TokenType::Compare, Opcode::I32GtU},
-#line 398 "src/lexer-keywords.txt"
+#line 399 "src/lexer-keywords.txt"
{"i64.ge_s", TokenType::Compare, Opcode::I64GeS},
-#line 263 "src/lexer-keywords.txt"
+#line 264 "src/lexer-keywords.txt"
{"i32.ge_s", TokenType::Compare, Opcode::I32GeS},
{""}, {""},
-#line 399 "src/lexer-keywords.txt"
+#line 400 "src/lexer-keywords.txt"
{"i64.ge_u", TokenType::Compare, Opcode::I64GeU},
-#line 264 "src/lexer-keywords.txt"
+#line 265 "src/lexer-keywords.txt"
{"i32.ge_u", TokenType::Compare, Opcode::I32GeU},
{""},
-#line 87 "src/lexer-keywords.txt"
+#line 88 "src/lexer-keywords.txt"
{"f32x4.div", TokenType::Binary, Opcode::F32X4Div},
{""}, {""},
-#line 358 "src/lexer-keywords.txt"
+#line 359 "src/lexer-keywords.txt"
{"i64.atomic.rmw16.sub_u", TokenType::AtomicRmw, Opcode::I64AtomicRmw16SubU},
-#line 234 "src/lexer-keywords.txt"
+#line 235 "src/lexer-keywords.txt"
{"i32.atomic.rmw16.sub_u", TokenType::AtomicRmw, Opcode::I32AtomicRmw16SubU},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""}, {""}, {""}, {""},
-#line 102 "src/lexer-keywords.txt"
+#line 103 "src/lexer-keywords.txt"
{"f32x4.pmin", TokenType::Binary, Opcode::F32X4PMin},
-#line 90 "src/lexer-keywords.txt"
+#line 91 "src/lexer-keywords.txt"
{"f32x4.floor", TokenType::Unary, Opcode::F32X4Floor},
-#line 570 "src/lexer-keywords.txt"
+#line 571 "src/lexer-keywords.txt"
{"v128.load64_zero", TokenType::Load, Opcode::V128Load64Zero},
-#line 569 "src/lexer-keywords.txt"
+#line 570 "src/lexer-keywords.txt"
{"v128.load32_zero", TokenType::Load, Opcode::V128Load32Zero},
-#line 585 "src/lexer-keywords.txt"
+#line 586 "src/lexer-keywords.txt"
{"v128.store64_lane", TokenType::SimdStoreLane, Opcode::V128Store64Lane},
-#line 352 "src/lexer-keywords.txt"
+#line 353 "src/lexer-keywords.txt"
{"i64.atomic.load8_u", TokenType::AtomicLoad, Opcode::I64AtomicLoad8U},
-#line 228 "src/lexer-keywords.txt"
+#line 229 "src/lexer-keywords.txt"
{"i32.atomic.load8_u", TokenType::AtomicLoad, Opcode::I32AtomicLoad8U},
-#line 529 "src/lexer-keywords.txt"
+#line 530 "src/lexer-keywords.txt"
{"nop", TokenType::Nop, Opcode::Nop},
{""},
-#line 135 "src/lexer-keywords.txt"
+#line 136 "src/lexer-keywords.txt"
{"f64.sqrt", TokenType::Unary, Opcode::F64Sqrt},
-#line 77 "src/lexer-keywords.txt"
+#line 78 "src/lexer-keywords.txt"
{"f32.sqrt", TokenType::Unary, Opcode::F32Sqrt},
{""},
-#line 35 "src/lexer-keywords.txt"
+#line 36 "src/lexer-keywords.txt"
{"catch", TokenType::Catch, Opcode::Catch},
-#line 174 "src/lexer-keywords.txt"
+#line 175 "src/lexer-keywords.txt"
{"global", TokenType::Global},
{""}, {""},
-#line 173 "src/lexer-keywords.txt"
+#line 174 "src/lexer-keywords.txt"
{"global.set", TokenType::GlobalSet, Opcode::GlobalSet},
{""}, {""},
-#line 145 "src/lexer-keywords.txt"
+#line 146 "src/lexer-keywords.txt"
{"f64x2.extract_lane", TokenType::SimdLaneOp, Opcode::F64X2ExtractLane},
-#line 127 "src/lexer-keywords.txt"
+#line 128 "src/lexer-keywords.txt"
{"f64.max", TokenType::Binary, Opcode::F64Max},
-#line 70 "src/lexer-keywords.txt"
+#line 71 "src/lexer-keywords.txt"
{"f32.max", TokenType::Binary, Opcode::F32Max},
-#line 440 "src/lexer-keywords.txt"
+#line 441 "src/lexer-keywords.txt"
{"i64x2.extract_lane", TokenType::SimdLaneOp, Opcode::I64X2ExtractLane},
-#line 511 "src/lexer-keywords.txt"
+#line 512 "src/lexer-keywords.txt"
{"local.get", TokenType::LocalGet, Opcode::LocalGet},
-#line 422 "src/lexer-keywords.txt"
+#line 423 "src/lexer-keywords.txt"
{"i64.shl", TokenType::Binary, Opcode::I64Shl},
-#line 285 "src/lexer-keywords.txt"
+#line 286 "src/lexer-keywords.txt"
{"i32.shl", TokenType::Binary, Opcode::I32Shl},
{""}, {""}, {""}, {""},
-#line 318 "src/lexer-keywords.txt"
+#line 319 "src/lexer-keywords.txt"
{"i32x4.max_s", TokenType::Binary, Opcode::I32X4MaxS},
{""}, {""}, {""},
-#line 319 "src/lexer-keywords.txt"
+#line 320 "src/lexer-keywords.txt"
{"i32x4.max_u", TokenType::Binary, Opcode::I32X4MaxU},
-#line 104 "src/lexer-keywords.txt"
+#line 105 "src/lexer-keywords.txt"
{"f32x4.splat", TokenType::Unary, Opcode::F32X4Splat},
{""},
-#line 454 "src/lexer-keywords.txt"
+#line 455 "src/lexer-keywords.txt"
{"i64x2.extend_low_i32x4_s", TokenType::Unary, Opcode::I64X2ExtendLowI32X4S},
-#line 330 "src/lexer-keywords.txt"
+#line 331 "src/lexer-keywords.txt"
{"i32x4.splat", TokenType::Unary, Opcode::I32X4Splat},
-#line 456 "src/lexer-keywords.txt"
+#line 457 "src/lexer-keywords.txt"
{"i64x2.extend_low_i32x4_u", TokenType::Unary, Opcode::I64X2ExtendLowI32X4U},
-#line 579 "src/lexer-keywords.txt"
+#line 580 "src/lexer-keywords.txt"
{"v128.load16_lane", TokenType::SimdLoadLane, Opcode::V128Load16Lane},
-#line 364 "src/lexer-keywords.txt"
+#line 365 "src/lexer-keywords.txt"
{"i64.atomic.rmw32.or_u", TokenType::AtomicRmw, Opcode::I64AtomicRmw32OrU},
{""},
-#line 355 "src/lexer-keywords.txt"
+#line 356 "src/lexer-keywords.txt"
{"i64.atomic.rmw16.and_u", TokenType::AtomicRmw, Opcode::I64AtomicRmw16AndU},
-#line 231 "src/lexer-keywords.txt"
+#line 232 "src/lexer-keywords.txt"
{"i32.atomic.rmw16.and_u", TokenType::AtomicRmw, Opcode::I32AtomicRmw16AndU},
{""}, {""},
-#line 392 "src/lexer-keywords.txt"
+#line 393 "src/lexer-keywords.txt"
{"i64.eqz", TokenType::Convert, Opcode::I64Eqz},
-#line 260 "src/lexer-keywords.txt"
+#line 261 "src/lexer-keywords.txt"
{"i32.eqz", TokenType::Convert, Opcode::I32Eqz},
{""},
-#line 464 "src/lexer-keywords.txt"
+#line 465 "src/lexer-keywords.txt"
{"i64x2.extmul_low_i32x4_s", TokenType::Binary, Opcode::I64X2ExtmulLowI32X4S},
{""},
-#line 466 "src/lexer-keywords.txt"
+#line 467 "src/lexer-keywords.txt"
{"i64x2.extmul_low_i32x4_u", TokenType::Binary, Opcode::I64X2ExtmulLowI32X4U},
-#line 395 "src/lexer-keywords.txt"
+#line 396 "src/lexer-keywords.txt"
{"i64.extend8_s", TokenType::Unary, Opcode::I64Extend8S},
-#line 262 "src/lexer-keywords.txt"
+#line 263 "src/lexer-keywords.txt"
{"i32.extend8_s", TokenType::Unary, Opcode::I32Extend8S},
-#line 205 "src/lexer-keywords.txt"
+#line 206 "src/lexer-keywords.txt"
{"i16x8.ne", TokenType::Compare, Opcode::I16X8Ne},
{""},
-#line 583 "src/lexer-keywords.txt"
+#line 584 "src/lexer-keywords.txt"
{"v128.store16_lane", TokenType::SimdStoreLane, Opcode::V128Store16Lane},
{""}, {""},
-#line 161 "src/lexer-keywords.txt"
+#line 162 "src/lexer-keywords.txt"
{"f64x2.sqrt", TokenType::Unary, Opcode::F64X2Sqrt},
-#line 354 "src/lexer-keywords.txt"
+#line 355 "src/lexer-keywords.txt"
{"i64.atomic.rmw16.add_u", TokenType::AtomicRmw, Opcode::I64AtomicRmw16AddU},
-#line 230 "src/lexer-keywords.txt"
+#line 231 "src/lexer-keywords.txt"
{"i32.atomic.rmw16.add_u", TokenType::AtomicRmw, Opcode::I32AtomicRmw16AddU},
{""},
-#line 198 "src/lexer-keywords.txt"
+#line 199 "src/lexer-keywords.txt"
{"i16x8.min_s", TokenType::Binary, Opcode::I16X8MinS},
{""}, {""}, {""},
-#line 199 "src/lexer-keywords.txt"
+#line 200 "src/lexer-keywords.txt"
{"i16x8.min_u", TokenType::Binary, Opcode::I16X8MinU},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
-#line 151 "src/lexer-keywords.txt"
+#line 152 "src/lexer-keywords.txt"
{"f64x2.max", TokenType::Binary, Opcode::F64X2Max},
{""}, {""}, {""}, {""},
-#line 459 "src/lexer-keywords.txt"
+#line 460 "src/lexer-keywords.txt"
{"i64x2.shl", TokenType::Binary, Opcode::I64X2Shl},
{""},
-#line 194 "src/lexer-keywords.txt"
+#line 195 "src/lexer-keywords.txt"
{"i16x8.lt_s", TokenType::Compare, Opcode::I16X8LtS},
-#line 213 "src/lexer-keywords.txt"
+#line 214 "src/lexer-keywords.txt"
{"i16x8.sub", TokenType::Binary, Opcode::I16X8Sub},
-#line 195 "src/lexer-keywords.txt"
+#line 196 "src/lexer-keywords.txt"
{"i16x8.lt_u", TokenType::Compare, Opcode::I16X8LtU},
{""},
-#line 41 "src/lexer-keywords.txt"
+#line 42 "src/lexer-keywords.txt"
{"delegate", TokenType::Delegate},
{""},
-#line 190 "src/lexer-keywords.txt"
+#line 191 "src/lexer-keywords.txt"
{"i16x8.le_s", TokenType::Compare, Opcode::I16X8LeS},
{""},
-#line 191 "src/lexer-keywords.txt"
+#line 192 "src/lexer-keywords.txt"
{"i16x8.le_u", TokenType::Compare, Opcode::I16X8LeU},
-#line 164 "src/lexer-keywords.txt"
+#line 165 "src/lexer-keywords.txt"
{"f64x2.convert_low_i32x4_s", TokenType::Unary, Opcode::F64X2ConvertLowI32X4S},
{""},
-#line 165 "src/lexer-keywords.txt"
+#line 166 "src/lexer-keywords.txt"
{"f64x2.convert_low_i32x4_u", TokenType::Unary, Opcode::F64X2ConvertLowI32X4U},
-#line 76 "src/lexer-keywords.txt"
+#line 77 "src/lexer-keywords.txt"
{"f32.reinterpret_i32", TokenType::Convert, Opcode::F32ReinterpretI32},
{""}, {""}, {""},
-#line 436 "src/lexer-keywords.txt"
+#line 437 "src/lexer-keywords.txt"
{"i64.trunc_sat_f64_s", TokenType::Convert, Opcode::I64TruncSatF64S},
-#line 298 "src/lexer-keywords.txt"
+#line 299 "src/lexer-keywords.txt"
{"i32.trunc_sat_f64_s", TokenType::Convert, Opcode::I32TruncSatF64S},
{""}, {""},
-#line 437 "src/lexer-keywords.txt"
+#line 438 "src/lexer-keywords.txt"
{"i64.trunc_sat_f64_u", TokenType::Convert, Opcode::I64TruncSatF64U},
-#line 299 "src/lexer-keywords.txt"
+#line 300 "src/lexer-keywords.txt"
{"i32.trunc_sat_f64_u", TokenType::Convert, Opcode::I32TruncSatF64U},
{""}, {""},
-#line 423 "src/lexer-keywords.txt"
+#line 424 "src/lexer-keywords.txt"
{"i64.shr_s", TokenType::Binary, Opcode::I64ShrS},
-#line 286 "src/lexer-keywords.txt"
+#line 287 "src/lexer-keywords.txt"
{"i32.shr_s", TokenType::Binary, Opcode::I32ShrS},
{""}, {""},
-#line 424 "src/lexer-keywords.txt"
+#line 425 "src/lexer-keywords.txt"
{"i64.shr_u", TokenType::Binary, Opcode::I64ShrU},
-#line 287 "src/lexer-keywords.txt"
+#line 288 "src/lexer-keywords.txt"
{"i32.shr_u", TokenType::Binary, Opcode::I32ShrU},
-#line 157 "src/lexer-keywords.txt"
+#line 158 "src/lexer-keywords.txt"
{"f64x2.pmax", TokenType::Binary, Opcode::F64X2PMax},
{""}, {""}, {""},
-#line 200 "src/lexer-keywords.txt"
+#line 201 "src/lexer-keywords.txt"
{"i16x8.mul", TokenType::Binary, Opcode::I16X8Mul},
-#line 522 "src/lexer-keywords.txt"
+#line 523 "src/lexer-keywords.txt"
{"memory.init", TokenType::MemoryInit, Opcode::MemoryInit},
-#line 441 "src/lexer-keywords.txt"
+#line 442 "src/lexer-keywords.txt"
{"v128.load32x2_s", TokenType::Load, Opcode::V128Load32X2S},
{""},
-#line 442 "src/lexer-keywords.txt"
+#line 443 "src/lexer-keywords.txt"
{"v128.load32x2_u", TokenType::Load, Opcode::V128Load32X2U},
{""}, {""}, {""},
-#line 176 "src/lexer-keywords.txt"
+#line 177 "src/lexer-keywords.txt"
{"i16x8.abs", TokenType::Unary, Opcode::I16X8Abs},
{""}, {""},
-#line 523 "src/lexer-keywords.txt"
+#line 524 "src/lexer-keywords.txt"
{"memory.size", TokenType::MemorySize, Opcode::MemorySize},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""}, {""}, {""},
-#line 600 "src/lexer-keywords.txt"
+#line 601 "src/lexer-keywords.txt"
{"f64.convert_s/i64", TokenType::Convert, Opcode::F64ConvertI64S},
-#line 594 "src/lexer-keywords.txt"
+#line 595 "src/lexer-keywords.txt"
{"f32.convert_s/i64", TokenType::Convert, Opcode::F32ConvertI64S},
-#line 602 "src/lexer-keywords.txt"
+#line 603 "src/lexer-keywords.txt"
{"f64.convert_u/i64", TokenType::Convert, Opcode::F64ConvertI64U},
-#line 596 "src/lexer-keywords.txt"
+#line 597 "src/lexer-keywords.txt"
{"f32.convert_u/i64", TokenType::Convert, Opcode::F32ConvertI64U},
{""}, {""}, {""},
-#line 606 "src/lexer-keywords.txt"
+#line 607 "src/lexer-keywords.txt"
{"get_local", TokenType::LocalGet, Opcode::LocalGet},
{""}, {""}, {""}, {""}, {""}, {""},
-#line 460 "src/lexer-keywords.txt"
+#line 461 "src/lexer-keywords.txt"
{"i64x2.shr_s", TokenType::Binary, Opcode::I64X2ShrS},
-#line 357 "src/lexer-keywords.txt"
+#line 358 "src/lexer-keywords.txt"
{"i64.atomic.rmw16.or_u", TokenType::AtomicRmw, Opcode::I64AtomicRmw16OrU},
-#line 233 "src/lexer-keywords.txt"
+#line 234 "src/lexer-keywords.txt"
{"i32.atomic.rmw16.or_u", TokenType::AtomicRmw, Opcode::I32AtomicRmw16OrU},
-#line 628 "src/lexer-keywords.txt"
+#line 629 "src/lexer-keywords.txt"
{"set_global", TokenType::GlobalSet, Opcode::GlobalSet},
-#line 461 "src/lexer-keywords.txt"
+#line 462 "src/lexer-keywords.txt"
{"i64x2.shr_u", TokenType::Binary, Opcode::I64X2ShrU},
-#line 211 "src/lexer-keywords.txt"
+#line 212 "src/lexer-keywords.txt"
{"i16x8.sub_sat_s", TokenType::Binary, Opcode::I16X8SubSatS},
{""},
-#line 212 "src/lexer-keywords.txt"
+#line 213 "src/lexer-keywords.txt"
{"i16x8.sub_sat_u", TokenType::Binary, Opcode::I16X8SubSatU},
{""}, {""}, {""},
-#line 179 "src/lexer-keywords.txt"
+#line 180 "src/lexer-keywords.txt"
{"i16x8.add", TokenType::Binary, Opcode::I16X8Add},
{""}, {""}, {""}, {""}, {""},
-#line 134 "src/lexer-keywords.txt"
+#line 135 "src/lexer-keywords.txt"
{"f64.reinterpret_i64", TokenType::Convert, Opcode::F64ReinterpretI64},
{""},
-#line 535 "src/lexer-keywords.txt"
+#line 536 "src/lexer-keywords.txt"
{"ref.func", TokenType::RefFunc, Opcode::RefFunc},
{""}, {""}, {""}, {""}, {""},
-#line 520 "src/lexer-keywords.txt"
+#line 521 "src/lexer-keywords.txt"
{"memory.fill", TokenType::MemoryFill, Opcode::MemoryFill},
{""}, {""}, {""}, {""}, {""},
-#line 133 "src/lexer-keywords.txt"
+#line 134 "src/lexer-keywords.txt"
{"f64.promote_f32", TokenType::Convert, Opcode::F64PromoteF32},
-#line 182 "src/lexer-keywords.txt"
+#line 183 "src/lexer-keywords.txt"
{"i16x8.bitmask", TokenType::Unary, Opcode::I16X8Bitmask},
{""}, {""},
-#line 92 "src/lexer-keywords.txt"
+#line 93 "src/lexer-keywords.txt"
{"f32x4.gt", TokenType::Compare, Opcode::F32X4Gt},
-#line 159 "src/lexer-keywords.txt"
+#line 160 "src/lexer-keywords.txt"
{"f64x2.replace_lane", TokenType::SimdLaneOp, Opcode::F64X2ReplaceLane},
-#line 577 "src/lexer-keywords.txt"
+#line 578 "src/lexer-keywords.txt"
{"v128.load8_splat", TokenType::Load, Opcode::V128Load8Splat},
{""},
-#line 458 "src/lexer-keywords.txt"
+#line 459 "src/lexer-keywords.txt"
{"i64x2.replace_lane", TokenType::SimdLaneOp, Opcode::I64X2ReplaceLane},
{""},
-#line 598 "src/lexer-keywords.txt"
+#line 599 "src/lexer-keywords.txt"
{"f32.reinterpret/i32", TokenType::Convert, Opcode::F32ReinterpretI32},
{""}, {""}, {""}, {""}, {""},
-#line 91 "src/lexer-keywords.txt"
+#line 92 "src/lexer-keywords.txt"
{"f32x4.ge", TokenType::Compare, Opcode::F32X4Ge},
-#line 310 "src/lexer-keywords.txt"
+#line 311 "src/lexer-keywords.txt"
{"i32x4.gt_s", TokenType::Compare, Opcode::I32X4GtS},
{""},
-#line 311 "src/lexer-keywords.txt"
+#line 312 "src/lexer-keywords.txt"
{"i32x4.gt_u", TokenType::Compare, Opcode::I32X4GtU},
{""}, {""}, {""},
-#line 308 "src/lexer-keywords.txt"
+#line 309 "src/lexer-keywords.txt"
{"i32x4.ge_s", TokenType::Compare, Opcode::I32X4GeS},
{""},
-#line 309 "src/lexer-keywords.txt"
+#line 310 "src/lexer-keywords.txt"
{"i32x4.ge_u", TokenType::Compare, Opcode::I32X4GeU},
{""}, {""}, {""}, {""},
-#line 367 "src/lexer-keywords.txt"
+#line 368 "src/lexer-keywords.txt"
{"i64.atomic.rmw32.xor_u", TokenType::AtomicRmw, Opcode::I64AtomicRmw32XorU},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
-#line 573 "src/lexer-keywords.txt"
+#line 574 "src/lexer-keywords.txt"
{"v128.xor", TokenType::Binary, Opcode::V128Xor},
{""}, {""}, {""},
-#line 576 "src/lexer-keywords.txt"
+#line 577 "src/lexer-keywords.txt"
{"v128.load64_splat", TokenType::Load, Opcode::V128Load64Splat},
-#line 575 "src/lexer-keywords.txt"
+#line 576 "src/lexer-keywords.txt"
{"v128.load32_splat", TokenType::Load, Opcode::V128Load32Splat},
-#line 551 "src/lexer-keywords.txt"
+#line 552 "src/lexer-keywords.txt"
{"table.grow", TokenType::TableGrow, Opcode::TableGrow},
{""}, {""},
-#line 314 "src/lexer-keywords.txt"
+#line 315 "src/lexer-keywords.txt"
{"v128.load16x4_s", TokenType::Load, Opcode::V128Load16X4S},
{""},
-#line 315 "src/lexer-keywords.txt"
+#line 316 "src/lexer-keywords.txt"
{"v128.load16x4_u", TokenType::Load, Opcode::V128Load16X4U},
{""},
-#line 371 "src/lexer-keywords.txt"
+#line 372 "src/lexer-keywords.txt"
{"i64.atomic.rmw8.or_u", TokenType::AtomicRmw, Opcode::I64AtomicRmw8OrU},
-#line 240 "src/lexer-keywords.txt"
+#line 241 "src/lexer-keywords.txt"
{"i32.atomic.rmw8.or_u", TokenType::AtomicRmw, Opcode::I32AtomicRmw8OrU},
{""},
-#line 177 "src/lexer-keywords.txt"
+#line 178 "src/lexer-keywords.txt"
{"i16x8.add_sat_s", TokenType::Binary, Opcode::I16X8AddSatS},
{""},
-#line 178 "src/lexer-keywords.txt"
+#line 179 "src/lexer-keywords.txt"
{"i16x8.add_sat_u", TokenType::Binary, Opcode::I16X8AddSatU},
{""}, {""},
#line 25 "src/lexer-keywords.txt"
{"assert_trap", TokenType::AssertTrap},
{""}, {""},
-#line 322 "src/lexer-keywords.txt"
+#line 323 "src/lexer-keywords.txt"
{"i32x4.dot_i16x8_s", TokenType::Binary, Opcode::I32X4DotI16X8S},
-#line 366 "src/lexer-keywords.txt"
+#line 367 "src/lexer-keywords.txt"
{"i64.atomic.rmw32.xchg_u", TokenType::AtomicRmw, Opcode::I64AtomicRmw32XchgU},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""}, {""}, {""}, {""}, {""},
-#line 89 "src/lexer-keywords.txt"
+#line 90 "src/lexer-keywords.txt"
{"f32x4.extract_lane", TokenType::SimdLaneOp, Opcode::F32X4ExtractLane},
{""},
-#line 496 "src/lexer-keywords.txt"
+#line 497 "src/lexer-keywords.txt"
{"i8x16.ne", TokenType::Compare, Opcode::I8X16Ne},
-#line 307 "src/lexer-keywords.txt"
+#line 308 "src/lexer-keywords.txt"
{"i32x4.extract_lane", TokenType::SimdLaneOp, Opcode::I32X4ExtractLane},
{""}, {""}, {""}, {""},
-#line 604 "src/lexer-keywords.txt"
+#line 605 "src/lexer-keywords.txt"
{"f64.reinterpret/i64", TokenType::Convert, Opcode::F64ReinterpretI64},
{""}, {""},
-#line 490 "src/lexer-keywords.txt"
+#line 491 "src/lexer-keywords.txt"
{"i8x16.min_s", TokenType::Binary, Opcode::I8X16MinS},
{""}, {""}, {""},
-#line 491 "src/lexer-keywords.txt"
+#line 492 "src/lexer-keywords.txt"
{"i8x16.min_u", TokenType::Binary, Opcode::I8X16MinU},
-#line 350 "src/lexer-keywords.txt"
+#line 351 "src/lexer-keywords.txt"
{"i64.atomic.load16_u", TokenType::AtomicLoad, Opcode::I64AtomicLoad16U},
-#line 227 "src/lexer-keywords.txt"
+#line 228 "src/lexer-keywords.txt"
{"i32.atomic.load16_u", TokenType::AtomicLoad, Opcode::I32AtomicLoad16U},
{""}, {""}, {""},
-#line 560 "src/lexer-keywords.txt"
+#line 561 "src/lexer-keywords.txt"
{"unreachable", TokenType::Unreachable, Opcode::Unreachable},
-#line 603 "src/lexer-keywords.txt"
+#line 604 "src/lexer-keywords.txt"
{"f64.promote/f32", TokenType::Convert, Opcode::F64PromoteF32},
-#line 582 "src/lexer-keywords.txt"
+#line 583 "src/lexer-keywords.txt"
{"v128.store8_lane", TokenType::SimdStoreLane, Opcode::V128Store8Lane},
{""}, {""}, {""}, {""}, {""},
-#line 121 "src/lexer-keywords.txt"
+#line 122 "src/lexer-keywords.txt"
{"f64.floor", TokenType::Unary, Opcode::F64Floor},
-#line 64 "src/lexer-keywords.txt"
+#line 65 "src/lexer-keywords.txt"
{"f32.floor", TokenType::Unary, Opcode::F32Floor},
-#line 486 "src/lexer-keywords.txt"
+#line 487 "src/lexer-keywords.txt"
{"i8x16.lt_s", TokenType::Compare, Opcode::I8X16LtS},
-#line 504 "src/lexer-keywords.txt"
+#line 505 "src/lexer-keywords.txt"
{"i8x16.sub", TokenType::Binary, Opcode::I8X16Sub},
-#line 487 "src/lexer-keywords.txt"
+#line 488 "src/lexer-keywords.txt"
{"i8x16.lt_u", TokenType::Compare, Opcode::I8X16LtU},
-#line 343 "src/lexer-keywords.txt"
+#line 344 "src/lexer-keywords.txt"
{"i32x4.extend_low_i16x8_s", TokenType::Unary, Opcode::I32X4ExtendLowI16X8S},
-#line 538 "src/lexer-keywords.txt"
+#line 539 "src/lexer-keywords.txt"
{"register", TokenType::Register},
-#line 344 "src/lexer-keywords.txt"
+#line 345 "src/lexer-keywords.txt"
{"i32x4.extend_low_i16x8_u", TokenType::Unary, Opcode::I32X4ExtendLowI16X8U},
-#line 484 "src/lexer-keywords.txt"
+#line 485 "src/lexer-keywords.txt"
{"i8x16.le_s", TokenType::Compare, Opcode::I8X16LeS},
{""},
-#line 485 "src/lexer-keywords.txt"
+#line 486 "src/lexer-keywords.txt"
{"i8x16.le_u", TokenType::Compare, Opcode::I8X16LeU},
-#line 527 "src/lexer-keywords.txt"
+#line 528 "src/lexer-keywords.txt"
{"nan:arithmetic", TokenType::NanArithmetic},
-#line 105 "src/lexer-keywords.txt"
+#line 106 "src/lexer-keywords.txt"
{"f32x4.sqrt", TokenType::Unary, Opcode::F32X4Sqrt},
{""}, {""}, {""}, {""}, {""},
-#line 334 "src/lexer-keywords.txt"
+#line 335 "src/lexer-keywords.txt"
{"i32x4.extmul_low_i16x8_s", TokenType::Binary, Opcode::I32X4ExtmulLowI16X8S},
{""},
-#line 336 "src/lexer-keywords.txt"
+#line 337 "src/lexer-keywords.txt"
{"i32x4.extmul_low_i16x8_u", TokenType::Binary, Opcode::I32X4ExtmulLowI16X8U},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
-#line 95 "src/lexer-keywords.txt"
+#line 96 "src/lexer-keywords.txt"
{"f32x4.max", TokenType::Binary, Opcode::F32X4Max},
{""}, {""}, {""}, {""},
-#line 327 "src/lexer-keywords.txt"
+#line 328 "src/lexer-keywords.txt"
{"i32x4.shl", TokenType::Binary, Opcode::I32X4Shl},
{""}, {""}, {""},
-#line 360 "src/lexer-keywords.txt"
+#line 361 "src/lexer-keywords.txt"
{"i64.atomic.rmw16.xor_u", TokenType::AtomicRmw, Opcode::I64AtomicRmw16XorU},
-#line 236 "src/lexer-keywords.txt"
+#line 237 "src/lexer-keywords.txt"
{"i32.atomic.rmw16.xor_u", TokenType::AtomicRmw, Opcode::I32AtomicRmw16XorU},
{""}, {""}, {""}, {""},
-#line 470 "src/lexer-keywords.txt"
+#line 471 "src/lexer-keywords.txt"
{"i8x16.abs", TokenType::Unary, Opcode::I8X16Abs},
-#line 301 "src/lexer-keywords.txt"
+#line 302 "src/lexer-keywords.txt"
{"i32.wrap_i64", TokenType::Convert, Opcode::I32WrapI64},
{""}, {""},
#line 20 "src/lexer-keywords.txt"
{"array", Type::Array, TokenType::Array},
-#line 505 "src/lexer-keywords.txt"
+#line 506 "src/lexer-keywords.txt"
{"i8x16", TokenType::I8X16},
{""}, {""},
-#line 574 "src/lexer-keywords.txt"
+#line 575 "src/lexer-keywords.txt"
{"v128.load16_splat", TokenType::Load, Opcode::V128Load16Splat},
-#line 416 "src/lexer-keywords.txt"
+#line 417 "src/lexer-keywords.txt"
{"i64.popcnt", TokenType::Unary, Opcode::I64Popcnt},
-#line 279 "src/lexer-keywords.txt"
+#line 280 "src/lexer-keywords.txt"
{"i32.popcnt", TokenType::Unary, Opcode::I32Popcnt},
{""},
-#line 180 "src/lexer-keywords.txt"
+#line 181 "src/lexer-keywords.txt"
{"i16x8.all_true", TokenType::Unary, Opcode::I16X8AllTrue},
{""},
-#line 85 "src/lexer-keywords.txt"
+#line 86 "src/lexer-keywords.txt"
{"f32x4.convert_i32x4_s", TokenType::Unary, Opcode::F32X4ConvertI32X4S},
{""},
-#line 86 "src/lexer-keywords.txt"
+#line 87 "src/lexer-keywords.txt"
{"f32x4.convert_i32x4_u", TokenType::Unary, Opcode::F32X4ConvertI32X4U},
{""},
-#line 44 "src/lexer-keywords.txt"
+#line 45 "src/lexer-keywords.txt"
{"elem.drop", TokenType::ElemDrop, Opcode::ElemDrop},
{""}, {""},
-#line 220 "src/lexer-keywords.txt"
+#line 221 "src/lexer-keywords.txt"
{"i16x8", TokenType::I16X8},
-#line 101 "src/lexer-keywords.txt"
+#line 102 "src/lexer-keywords.txt"
{"f32x4.pmax", TokenType::Binary, Opcode::F32X4PMax},
{""}, {""}, {""},
-#line 38 "src/lexer-keywords.txt"
+#line 39 "src/lexer-keywords.txt"
{"data.drop", TokenType::DataDrop, Opcode::DataDrop},
{""},
-#line 359 "src/lexer-keywords.txt"
+#line 360 "src/lexer-keywords.txt"
{"i64.atomic.rmw16.xchg_u", TokenType::AtomicRmw, Opcode::I64AtomicRmw16XchgU},
-#line 235 "src/lexer-keywords.txt"
+#line 236 "src/lexer-keywords.txt"
{"i32.atomic.rmw16.xchg_u", TokenType::AtomicRmw, Opcode::I32AtomicRmw16XchgU},
{""}, {""}, {""}, {""}, {""}, {""}, {""},
-#line 502 "src/lexer-keywords.txt"
+#line 503 "src/lexer-keywords.txt"
{"i8x16.sub_sat_s", TokenType::Binary, Opcode::I8X16SubSatS},
{""},
-#line 503 "src/lexer-keywords.txt"
+#line 504 "src/lexer-keywords.txt"
{"i8x16.sub_sat_u", TokenType::Binary, Opcode::I8X16SubSatU},
{""}, {""}, {""},
-#line 473 "src/lexer-keywords.txt"
+#line 474 "src/lexer-keywords.txt"
{"i8x16.add", TokenType::Binary, Opcode::I8X16Add},
{""}, {""}, {""},
-#line 120 "src/lexer-keywords.txt"
+#line 121 "src/lexer-keywords.txt"
{"f64.eq", TokenType::Compare, Opcode::F64Eq},
-#line 63 "src/lexer-keywords.txt"
+#line 64 "src/lexer-keywords.txt"
{"f32.eq", TokenType::Compare, Opcode::F32Eq},
{""},
-#line 391 "src/lexer-keywords.txt"
+#line 392 "src/lexer-keywords.txt"
{"i64.eq", TokenType::Compare, Opcode::I64Eq},
-#line 259 "src/lexer-keywords.txt"
+#line 260 "src/lexer-keywords.txt"
{"i32.eq", TokenType::Compare, Opcode::I32Eq},
{""}, {""},
-#line 469 "src/lexer-keywords.txt"
+#line 470 "src/lexer-keywords.txt"
{"i64.xor", TokenType::Binary, Opcode::I64Xor},
-#line 347 "src/lexer-keywords.txt"
+#line 348 "src/lexer-keywords.txt"
{"i32.xor", TokenType::Binary, Opcode::I32Xor},
-#line 622 "src/lexer-keywords.txt"
+#line 623 "src/lexer-keywords.txt"
{"i64.trunc_s:sat/f32", TokenType::Convert, Opcode::I64TruncSatF32S},
-#line 610 "src/lexer-keywords.txt"
+#line 611 "src/lexer-keywords.txt"
{"i32.trunc_s:sat/f32", TokenType::Convert, Opcode::I32TruncSatF32S},
-#line 626 "src/lexer-keywords.txt"
+#line 627 "src/lexer-keywords.txt"
{"i64.trunc_u:sat/f32", TokenType::Convert, Opcode::I64TruncSatF32U},
-#line 614 "src/lexer-keywords.txt"
+#line 615 "src/lexer-keywords.txt"
{"i32.trunc_u:sat/f32", TokenType::Convert, Opcode::I32TruncSatF32U},
{""}, {""}, {""}, {""},
-#line 476 "src/lexer-keywords.txt"
+#line 477 "src/lexer-keywords.txt"
{"i8x16.bitmask", TokenType::Unary, Opcode::I8X16Bitmask},
-#line 166 "src/lexer-keywords.txt"
+#line 167 "src/lexer-keywords.txt"
{"f64x2.promote_low_f32x4", TokenType::Unary, Opcode::F64X2PromoteLowF32X4},
-#line 328 "src/lexer-keywords.txt"
+#line 329 "src/lexer-keywords.txt"
{"i32x4.shr_s", TokenType::Binary, Opcode::I32X4ShrS},
{""}, {""}, {""},
-#line 329 "src/lexer-keywords.txt"
+#line 330 "src/lexer-keywords.txt"
{"i32x4.shr_u", TokenType::Binary, Opcode::I32X4ShrU},
{""},
-#line 517 "src/lexer-keywords.txt"
+#line 518 "src/lexer-keywords.txt"
{"memory.atomic.wait32", TokenType::AtomicWait, Opcode::MemoryAtomicWait32},
{""}, {""}, {""}, {""}, {""},
-#line 48 "src/lexer-keywords.txt"
+#line 49 "src/lexer-keywords.txt"
{"tag", TokenType::Tag},
{""}, {""}, {""}, {""}, {""}, {""}, {""},
-#line 196 "src/lexer-keywords.txt"
+#line 197 "src/lexer-keywords.txt"
{"i16x8.max_s", TokenType::Binary, Opcode::I16X8MaxS},
{""}, {""}, {""},
-#line 197 "src/lexer-keywords.txt"
+#line 198 "src/lexer-keywords.txt"
{"i16x8.max_u", TokenType::Binary, Opcode::I16X8MaxU},
{""}, {""}, {""},
-#line 210 "src/lexer-keywords.txt"
+#line 211 "src/lexer-keywords.txt"
{"i16x8.splat", TokenType::Unary, Opcode::I16X8Splat},
{""},
-#line 592 "src/lexer-keywords.txt"
+#line 593 "src/lexer-keywords.txt"
{"anyfunc", Type::FuncRef},
{""}, {""}, {""}, {""}, {""},
-#line 103 "src/lexer-keywords.txt"
+#line 104 "src/lexer-keywords.txt"
{"f32x4.replace_lane", TokenType::SimdLaneOp, Opcode::F32X4ReplaceLane},
{""},
-#line 616 "src/lexer-keywords.txt"
+#line 617 "src/lexer-keywords.txt"
{"i32.wrap/i64", TokenType::Convert, Opcode::I32WrapI64},
-#line 326 "src/lexer-keywords.txt"
+#line 327 "src/lexer-keywords.txt"
{"i32x4.replace_lane", TokenType::SimdLaneOp, Opcode::I32X4ReplaceLane},
{""}, {""},
-#line 384 "src/lexer-keywords.txt"
+#line 385 "src/lexer-keywords.txt"
{"i64.atomic.store8", TokenType::AtomicStore, Opcode::I64AtomicStore8},
-#line 252 "src/lexer-keywords.txt"
+#line 253 "src/lexer-keywords.txt"
{"i32.atomic.store8", TokenType::AtomicStore, Opcode::I32AtomicStore8},
{""},
-#line 144 "src/lexer-keywords.txt"
+#line 145 "src/lexer-keywords.txt"
{"f64x2.eq", TokenType::Compare, Opcode::F64X2Eq},
{""}, {""},
-#line 444 "src/lexer-keywords.txt"
+#line 445 "src/lexer-keywords.txt"
{"i64x2.eq", TokenType::Binary, Opcode::I64X2Eq},
{""}, {""}, {""},
-#line 471 "src/lexer-keywords.txt"
+#line 472 "src/lexer-keywords.txt"
{"i8x16.add_sat_s", TokenType::Binary, Opcode::I8X16AddSatS},
{""},
-#line 472 "src/lexer-keywords.txt"
+#line 473 "src/lexer-keywords.txt"
{"i8x16.add_sat_u", TokenType::Binary, Opcode::I8X16AddSatU},
{""}, {""}, {""}, {""}, {""},
-#line 192 "src/lexer-keywords.txt"
+#line 193 "src/lexer-keywords.txt"
{"v128.load8x8_s", TokenType::Load, Opcode::V128Load8X8S},
{""}, {""}, {""},
-#line 193 "src/lexer-keywords.txt"
+#line 194 "src/lexer-keywords.txt"
{"v128.load8x8_u", TokenType::Load, Opcode::V128Load8X8U},
{""}, {""}, {""}, {""}, {""},
-#line 623 "src/lexer-keywords.txt"
+#line 624 "src/lexer-keywords.txt"
{"i64.trunc_s:sat/f64", TokenType::Convert, Opcode::I64TruncSatF64S},
-#line 611 "src/lexer-keywords.txt"
+#line 612 "src/lexer-keywords.txt"
{"i32.trunc_s:sat/f64", TokenType::Convert, Opcode::I32TruncSatF64S},
-#line 627 "src/lexer-keywords.txt"
+#line 628 "src/lexer-keywords.txt"
{"i64.trunc_u:sat/f64", TokenType::Convert, Opcode::I64TruncSatF64U},
-#line 615 "src/lexer-keywords.txt"
+#line 616 "src/lexer-keywords.txt"
{"i32.trunc_u:sat/f64", TokenType::Convert, Opcode::I32TruncSatF64U},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""}, {""},
-#line 518 "src/lexer-keywords.txt"
+#line 519 "src/lexer-keywords.txt"
{"memory.atomic.wait64", TokenType::AtomicWait, Opcode::MemoryAtomicWait64},
{""},
-#line 131 "src/lexer-keywords.txt"
+#line 132 "src/lexer-keywords.txt"
{"f64.neg", TokenType::Unary, Opcode::F64Neg},
-#line 74 "src/lexer-keywords.txt"
+#line 75 "src/lexer-keywords.txt"
{"f32.neg", TokenType::Unary, Opcode::F32Neg},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""},
-#line 155 "src/lexer-keywords.txt"
+#line 156 "src/lexer-keywords.txt"
{"f64x2.neg", TokenType::Unary, Opcode::F64X2Neg},
{""}, {""},
-#line 451 "src/lexer-keywords.txt"
+#line 452 "src/lexer-keywords.txt"
{"i64x2.neg", TokenType::Unary, Opcode::I64X2Neg},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
-#line 587 "src/lexer-keywords.txt"
+#line 588 "src/lexer-keywords.txt"
{"i8x16.swizzle", TokenType::Binary, Opcode::I8X16Swizzle},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""},
-#line 363 "src/lexer-keywords.txt"
+#line 364 "src/lexer-keywords.txt"
{"i64.atomic.rmw32.cmpxchg_u", TokenType::AtomicRmwCmpxchg, Opcode::I64AtomicRmw32CmpxchgU},
{""}, {""}, {""}, {""}, {""}, {""},
-#line 332 "src/lexer-keywords.txt"
+#line 333 "src/lexer-keywords.txt"
{"i32x4.extadd_pairwise_i16x8_s", TokenType::Unary, Opcode::I32X4ExtaddPairwiseI16X8S},
-#line 172 "src/lexer-keywords.txt"
+#line 173 "src/lexer-keywords.txt"
{"global.get", TokenType::GlobalGet, Opcode::GlobalGet},
-#line 333 "src/lexer-keywords.txt"
+#line 334 "src/lexer-keywords.txt"
{"i32x4.extadd_pairwise_i16x8_u", TokenType::Unary, Opcode::I32X4ExtaddPairwiseI16X8U},
-#line 474 "src/lexer-keywords.txt"
+#line 475 "src/lexer-keywords.txt"
{"i8x16.all_true", TokenType::Unary, Opcode::I8X16AllTrue},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""},
-#line 548 "src/lexer-keywords.txt"
+#line 549 "src/lexer-keywords.txt"
{"table.copy", TokenType::TableCopy, Opcode::TableCopy},
{""}, {""},
-#line 339 "src/lexer-keywords.txt"
+#line 340 "src/lexer-keywords.txt"
{"i32x4.trunc_sat_f32x4_s", TokenType::Unary, Opcode::I32X4TruncSatF32X4S},
{""}, {""}, {""},
-#line 340 "src/lexer-keywords.txt"
+#line 341 "src/lexer-keywords.txt"
{"i32x4.trunc_sat_f32x4_u", TokenType::Unary, Opcode::I32X4TruncSatF32X4U},
{""}, {""},
-#line 568 "src/lexer-keywords.txt"
+#line 569 "src/lexer-keywords.txt"
{"v128.any_true", TokenType::Unary, Opcode::V128AnyTrue},
{""}, {""},
-#line 108 "src/lexer-keywords.txt"
+#line 109 "src/lexer-keywords.txt"
{"f32x4.demote_f64x2_zero", TokenType::Unary, Opcode::F32X4DemoteF64X2Zero},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
-#line 188 "src/lexer-keywords.txt"
+#line 189 "src/lexer-keywords.txt"
{"i16x8.gt_s", TokenType::Compare, Opcode::I16X8GtS},
{""},
-#line 189 "src/lexer-keywords.txt"
+#line 190 "src/lexer-keywords.txt"
{"i16x8.gt_u", TokenType::Compare, Opcode::I16X8GtU},
{""}, {""}, {""},
-#line 186 "src/lexer-keywords.txt"
+#line 187 "src/lexer-keywords.txt"
{"i16x8.ge_s", TokenType::Compare, Opcode::I16X8GeS},
{""},
-#line 187 "src/lexer-keywords.txt"
+#line 188 "src/lexer-keywords.txt"
{"i16x8.ge_u", TokenType::Compare, Opcode::I16X8GeU},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""}, {""}, {""},
-#line 488 "src/lexer-keywords.txt"
+#line 489 "src/lexer-keywords.txt"
{"i8x16.max_s", TokenType::Binary, Opcode::I8X16MaxS},
-#line 280 "src/lexer-keywords.txt"
+#line 281 "src/lexer-keywords.txt"
{"i32.reinterpret_f32", TokenType::Convert, Opcode::I32ReinterpretF32},
{""}, {""},
-#line 489 "src/lexer-keywords.txt"
+#line 490 "src/lexer-keywords.txt"
{"i8x16.max_u", TokenType::Binary, Opcode::I8X16MaxU},
{""}, {""}, {""},
-#line 501 "src/lexer-keywords.txt"
+#line 502 "src/lexer-keywords.txt"
{"i8x16.splat", TokenType::Unary, Opcode::I8X16Splat},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""},
-#line 381 "src/lexer-keywords.txt"
+#line 382 "src/lexer-keywords.txt"
{"i64.atomic.rmw.xor", TokenType::AtomicRmw, Opcode::I64AtomicRmwXor},
-#line 250 "src/lexer-keywords.txt"
+#line 251 "src/lexer-keywords.txt"
{"i32.atomic.rmw.xor", TokenType::AtomicRmw, Opcode::I32AtomicRmwXor},
{""}, {""}, {""}, {""}, {""}, {""}, {""},
-#line 184 "src/lexer-keywords.txt"
+#line 185 "src/lexer-keywords.txt"
{"i16x8.extract_lane_s", TokenType::SimdLaneOp, Opcode::I16X8ExtractLaneS},
{""},
-#line 185 "src/lexer-keywords.txt"
+#line 186 "src/lexer-keywords.txt"
{"i16x8.extract_lane_u", TokenType::SimdLaneOp, Opcode::I16X8ExtractLaneU},
{""},
-#line 356 "src/lexer-keywords.txt"
+#line 357 "src/lexer-keywords.txt"
{"i64.atomic.rmw16.cmpxchg_u", TokenType::AtomicRmwCmpxchg, Opcode::I64AtomicRmw16CmpxchgU},
-#line 232 "src/lexer-keywords.txt"
+#line 233 "src/lexer-keywords.txt"
{"i32.atomic.rmw16.cmpxchg_u", TokenType::AtomicRmwCmpxchg, Opcode::I32AtomicRmw16CmpxchgU},
{""}, {""}, {""},
-#line 374 "src/lexer-keywords.txt"
+#line 375 "src/lexer-keywords.txt"
{"i64.atomic.rmw8.xor_u", TokenType::AtomicRmw, Opcode::I64AtomicRmw8XorU},
-#line 243 "src/lexer-keywords.txt"
+#line 244 "src/lexer-keywords.txt"
{"i32.atomic.rmw8.xor_u", TokenType::AtomicRmw, Opcode::I32AtomicRmw8XorU},
{""}, {""}, {""}, {""}, {""}, {""}, {""},
-#line 370 "src/lexer-keywords.txt"
+#line 371 "src/lexer-keywords.txt"
{"i64.atomic.rmw8.cmpxchg_u", TokenType::AtomicRmwCmpxchg, Opcode::I64AtomicRmw8CmpxchgU},
-#line 239 "src/lexer-keywords.txt"
+#line 240 "src/lexer-keywords.txt"
{"i32.atomic.rmw8.cmpxchg_u", TokenType::AtomicRmwCmpxchg, Opcode::I32AtomicRmw8CmpxchgU},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
-#line 88 "src/lexer-keywords.txt"
+#line 89 "src/lexer-keywords.txt"
{"f32x4.eq", TokenType::Compare, Opcode::F32X4Eq},
{""}, {""},
-#line 306 "src/lexer-keywords.txt"
+#line 307 "src/lexer-keywords.txt"
{"i32x4.eq", TokenType::Compare, Opcode::I32X4Eq},
{""}, {""}, {""}, {""}, {""}, {""},
-#line 605 "src/lexer-keywords.txt"
+#line 606 "src/lexer-keywords.txt"
{"get_global", TokenType::GlobalGet, Opcode::GlobalGet},
{""}, {""},
-#line 345 "src/lexer-keywords.txt"
+#line 346 "src/lexer-keywords.txt"
{"i32x4.trunc_sat_f64x2_s_zero", TokenType::Unary, Opcode::I32X4TruncSatF64X2SZero},
{""},
-#line 346 "src/lexer-keywords.txt"
+#line 347 "src/lexer-keywords.txt"
{"i32x4.trunc_sat_f64x2_u_zero", TokenType::Unary, Opcode::I32X4TruncSatF64X2UZero},
{""}, {""}, {""}, {""}, {""},
-#line 417 "src/lexer-keywords.txt"
+#line 418 "src/lexer-keywords.txt"
{"i64.reinterpret_f64", TokenType::Convert, Opcode::I64ReinterpretF64},
{""}, {""}, {""}, {""}, {""},
-#line 207 "src/lexer-keywords.txt"
+#line 208 "src/lexer-keywords.txt"
{"i16x8.shl", TokenType::Binary, Opcode::I16X8Shl},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
-#line 607 "src/lexer-keywords.txt"
+#line 608 "src/lexer-keywords.txt"
{"i32.reinterpret/f32", TokenType::Convert, Opcode::I32ReinterpretF32},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""},
-#line 99 "src/lexer-keywords.txt"
+#line 100 "src/lexer-keywords.txt"
{"f32x4.neg", TokenType::Unary, Opcode::F32X4Neg},
{""}, {""},
-#line 324 "src/lexer-keywords.txt"
+#line 325 "src/lexer-keywords.txt"
{"i32x4.neg", TokenType::Unary, Opcode::I32X4Neg},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""}, {""}, {""}, {""}, {""},
-#line 558 "src/lexer-keywords.txt"
+#line 559 "src/lexer-keywords.txt"
{"try", TokenType::Try, Opcode::Try},
{""}, {""}, {""}, {""}, {""}, {""},
-#line 208 "src/lexer-keywords.txt"
+#line 209 "src/lexer-keywords.txt"
{"i16x8.shr_s", TokenType::Binary, Opcode::I16X8ShrS},
{""}, {""}, {""},
-#line 209 "src/lexer-keywords.txt"
+#line 210 "src/lexer-keywords.txt"
{"i16x8.shr_u", TokenType::Binary, Opcode::I16X8ShrU},
{""}, {""}, {""}, {""}, {""}, {""}, {""},
-#line 524 "src/lexer-keywords.txt"
+#line 525 "src/lexer-keywords.txt"
{"memory", TokenType::Memory},
{""},
-#line 482 "src/lexer-keywords.txt"
+#line 483 "src/lexer-keywords.txt"
{"i8x16.gt_s", TokenType::Compare, Opcode::I8X16GtS},
{""},
-#line 483 "src/lexer-keywords.txt"
+#line 484 "src/lexer-keywords.txt"
{"i8x16.gt_u", TokenType::Compare, Opcode::I8X16GtU},
{""}, {""}, {""},
-#line 480 "src/lexer-keywords.txt"
+#line 481 "src/lexer-keywords.txt"
{"i8x16.ge_s", TokenType::Compare, Opcode::I8X16GeS},
-#line 619 "src/lexer-keywords.txt"
+#line 620 "src/lexer-keywords.txt"
{"i64.reinterpret/f64", TokenType::Convert, Opcode::I64ReinterpretF64},
-#line 481 "src/lexer-keywords.txt"
+#line 482 "src/lexer-keywords.txt"
{"i8x16.ge_u", TokenType::Compare, Opcode::I8X16GeU},
{""}, {""}, {""}, {""}, {""}, {""},
#line 28 "src/lexer-keywords.txt"
{"binary", TokenType::Bin},
{""}, {""},
-#line 181 "src/lexer-keywords.txt"
+#line 182 "src/lexer-keywords.txt"
{"i16x8.avgr_u", TokenType::Binary, Opcode::I16X8AvgrU},
{""}, {""}, {""}, {""}, {""}, {""},
-#line 206 "src/lexer-keywords.txt"
+#line 207 "src/lexer-keywords.txt"
{"i16x8.replace_lane", TokenType::SimdLaneOp, Opcode::I16X8ReplaceLane},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
-#line 478 "src/lexer-keywords.txt"
+#line 479 "src/lexer-keywords.txt"
{"i8x16.extract_lane_s", TokenType::SimdLaneOp, Opcode::I8X16ExtractLaneS},
{""},
-#line 479 "src/lexer-keywords.txt"
+#line 480 "src/lexer-keywords.txt"
{"i8x16.extract_lane_u", TokenType::SimdLaneOp, Opcode::I8X16ExtractLaneU},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
@@ -1612,81 +1614,81 @@ Perfect_Hash::InWordSet (const char *str, size_t len)
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
-#line 498 "src/lexer-keywords.txt"
+#line 499 "src/lexer-keywords.txt"
{"i8x16.shl", TokenType::Binary, Opcode::I8X16Shl},
{""}, {""}, {""}, {""}, {""},
-#line 586 "src/lexer-keywords.txt"
+#line 587 "src/lexer-keywords.txt"
{"i8x16.shuffle", TokenType::SimdShuffleOp, Opcode::I8X16Shuffle},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""},
-#line 214 "src/lexer-keywords.txt"
+#line 215 "src/lexer-keywords.txt"
{"i16x8.extadd_pairwise_i8x16_s", TokenType::Unary, Opcode::I16X8ExtaddPairwiseI8X16S},
{""},
-#line 215 "src/lexer-keywords.txt"
+#line 216 "src/lexer-keywords.txt"
{"i16x8.extadd_pairwise_i8x16_u", TokenType::Unary, Opcode::I16X8ExtaddPairwiseI8X16U},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""}, {""}, {""}, {""},
-#line 455 "src/lexer-keywords.txt"
+#line 456 "src/lexer-keywords.txt"
{"i64x2.extend_high_i32x4_s", TokenType::Unary, Opcode::I64X2ExtendHighI32X4S},
{""},
-#line 457 "src/lexer-keywords.txt"
+#line 458 "src/lexer-keywords.txt"
{"i64x2.extend_high_i32x4_u", TokenType::Unary, Opcode::I64X2ExtendHighI32X4U},
{""}, {""}, {""}, {""},
-#line 223 "src/lexer-keywords.txt"
+#line 224 "src/lexer-keywords.txt"
{"i16x8.extend_low_i8x16_s", TokenType::Unary, Opcode::I16X8ExtendLowI8X16S},
{""},
-#line 224 "src/lexer-keywords.txt"
+#line 225 "src/lexer-keywords.txt"
{"i16x8.extend_low_i8x16_u", TokenType::Unary, Opcode::I16X8ExtendLowI8X16U},
{""}, {""}, {""},
-#line 465 "src/lexer-keywords.txt"
+#line 466 "src/lexer-keywords.txt"
{"i64x2.extmul_high_i32x4_s", TokenType::Binary, Opcode::I64X2ExtmulHighI32X4S},
{""},
-#line 467 "src/lexer-keywords.txt"
+#line 468 "src/lexer-keywords.txt"
{"i64x2.extmul_high_i32x4_u", TokenType::Binary, Opcode::I64X2ExtmulHighI32X4U},
{""}, {""}, {""}, {""},
-#line 216 "src/lexer-keywords.txt"
+#line 217 "src/lexer-keywords.txt"
{"i16x8.extmul_low_i8x16_s", TokenType::Binary, Opcode::I16X8ExtmulLowI8X16S},
{""},
-#line 218 "src/lexer-keywords.txt"
+#line 219 "src/lexer-keywords.txt"
{"i16x8.extmul_low_i8x16_u", TokenType::Binary, Opcode::I16X8ExtmulLowI8X16U},
{""}, {""}, {""}, {""}, {""},
-#line 495 "src/lexer-keywords.txt"
+#line 496 "src/lexer-keywords.txt"
{"i8x16.popcnt", TokenType::Unary, Opcode::I8X16Popcnt},
{""},
-#line 499 "src/lexer-keywords.txt"
+#line 500 "src/lexer-keywords.txt"
{"i8x16.shr_s", TokenType::Binary, Opcode::I8X16ShrS},
{""}, {""}, {""},
-#line 500 "src/lexer-keywords.txt"
+#line 501 "src/lexer-keywords.txt"
{"i8x16.shr_u", TokenType::Binary, Opcode::I8X16ShrU},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
-#line 377 "src/lexer-keywords.txt"
+#line 378 "src/lexer-keywords.txt"
{"i64.atomic.rmw.cmpxchg", TokenType::AtomicRmwCmpxchg, Opcode::I64AtomicRmwCmpxchg},
-#line 246 "src/lexer-keywords.txt"
+#line 247 "src/lexer-keywords.txt"
{"i32.atomic.rmw.cmpxchg", TokenType::AtomicRmwCmpxchg, Opcode::I32AtomicRmwCmpxchg},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
-#line 521 "src/lexer-keywords.txt"
+#line 522 "src/lexer-keywords.txt"
{"memory.grow", TokenType::MemoryGrow, Opcode::MemoryGrow},
{""}, {""}, {""}, {""}, {""}, {""}, {""},
-#line 475 "src/lexer-keywords.txt"
+#line 476 "src/lexer-keywords.txt"
{"i8x16.avgr_u", TokenType::Binary, Opcode::I8X16AvgrU},
{""}, {""}, {""}, {""}, {""}, {""},
-#line 497 "src/lexer-keywords.txt"
+#line 498 "src/lexer-keywords.txt"
{"i8x16.replace_lane", TokenType::SimdLaneOp, Opcode::I8X16ReplaceLane},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""},
-#line 118 "src/lexer-keywords.txt"
+#line 119 "src/lexer-keywords.txt"
{"f64.copysign", TokenType::Binary, Opcode::F64Copysign},
-#line 60 "src/lexer-keywords.txt"
+#line 61 "src/lexer-keywords.txt"
{"f32.copysign", TokenType::Binary, Opcode::F32Copysign},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
-#line 589 "src/lexer-keywords.txt"
+#line 590 "src/lexer-keywords.txt"
{"atomic.notify", TokenType::AtomicNotify, Opcode::MemoryAtomicNotify},
-#line 516 "src/lexer-keywords.txt"
+#line 517 "src/lexer-keywords.txt"
{"memory.atomic.notify", TokenType::AtomicNotify, Opcode::MemoryAtomicNotify},
-#line 183 "src/lexer-keywords.txt"
+#line 184 "src/lexer-keywords.txt"
{"i16x8.eq", TokenType::Compare, Opcode::I16X8Eq},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
@@ -1695,33 +1697,33 @@ Perfect_Hash::InWordSet (const char *str, size_t len)
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""},
-#line 203 "src/lexer-keywords.txt"
+#line 204 "src/lexer-keywords.txt"
{"i16x8.neg", TokenType::Unary, Opcode::I16X8Neg},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""},
-#line 373 "src/lexer-keywords.txt"
+#line 374 "src/lexer-keywords.txt"
{"i64.atomic.rmw8.xchg_u", TokenType::AtomicRmw, Opcode::I64AtomicRmw8XchgU},
-#line 242 "src/lexer-keywords.txt"
+#line 243 "src/lexer-keywords.txt"
{"i32.atomic.rmw8.xchg_u", TokenType::AtomicRmw, Opcode::I32AtomicRmw8XchgU},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""},
-#line 204 "src/lexer-keywords.txt"
+#line 205 "src/lexer-keywords.txt"
{"i16x8.q15mulr_sat_s", TokenType::Binary, Opcode::I16X8Q15mulrSatS},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""}, {""},
-#line 201 "src/lexer-keywords.txt"
+#line 202 "src/lexer-keywords.txt"
{"i16x8.narrow_i32x4_s", TokenType::Binary, Opcode::I16X8NarrowI32X4S},
{""},
-#line 202 "src/lexer-keywords.txt"
+#line 203 "src/lexer-keywords.txt"
{"i16x8.narrow_i32x4_u", TokenType::Binary, Opcode::I16X8NarrowI32X4U},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""},
-#line 37 "src/lexer-keywords.txt"
+#line 38 "src/lexer-keywords.txt"
{"current_memory", TokenType::MemorySize, Opcode::MemorySize},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
@@ -1730,7 +1732,7 @@ Perfect_Hash::InWordSet (const char *str, size_t len)
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""}, {""}, {""}, {""}, {""},
-#line 477 "src/lexer-keywords.txt"
+#line 478 "src/lexer-keywords.txt"
{"i8x16.eq", TokenType::Compare, Opcode::I8X16Eq},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
@@ -1739,7 +1741,7 @@ Perfect_Hash::InWordSet (const char *str, size_t len)
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""},
-#line 494 "src/lexer-keywords.txt"
+#line 495 "src/lexer-keywords.txt"
{"i8x16.neg", TokenType::Unary, Opcode::I8X16Neg},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
@@ -1758,7 +1760,7 @@ Perfect_Hash::InWordSet (const char *str, size_t len)
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""},
-#line 175 "src/lexer-keywords.txt"
+#line 176 "src/lexer-keywords.txt"
{"grow_memory", TokenType::MemoryGrow, Opcode::MemoryGrow},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
@@ -1768,17 +1770,17 @@ Perfect_Hash::InWordSet (const char *str, size_t len)
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""}, {""}, {""}, {""},
-#line 341 "src/lexer-keywords.txt"
+#line 342 "src/lexer-keywords.txt"
{"i32x4.extend_high_i16x8_s", TokenType::Unary, Opcode::I32X4ExtendHighI16X8S},
{""},
-#line 342 "src/lexer-keywords.txt"
+#line 343 "src/lexer-keywords.txt"
{"i32x4.extend_high_i16x8_u", TokenType::Unary, Opcode::I32X4ExtendHighI16X8U},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""},
-#line 335 "src/lexer-keywords.txt"
+#line 336 "src/lexer-keywords.txt"
{"i32x4.extmul_high_i16x8_s", TokenType::Binary, Opcode::I32X4ExtmulHighI16X8S},
{""},
-#line 337 "src/lexer-keywords.txt"
+#line 338 "src/lexer-keywords.txt"
{"i32x4.extmul_high_i16x8_u", TokenType::Binary, Opcode::I32X4ExtmulHighI16X8U},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
@@ -1792,32 +1794,32 @@ Perfect_Hash::InWordSet (const char *str, size_t len)
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""}, {""}, {""},
-#line 519 "src/lexer-keywords.txt"
+#line 520 "src/lexer-keywords.txt"
{"memory.copy", TokenType::MemoryCopy, Opcode::MemoryCopy},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
-#line 221 "src/lexer-keywords.txt"
+#line 222 "src/lexer-keywords.txt"
{"i16x8.extend_high_i8x16_s", TokenType::Unary, Opcode::I16X8ExtendHighI8X16S},
{""},
-#line 222 "src/lexer-keywords.txt"
+#line 223 "src/lexer-keywords.txt"
{"i16x8.extend_high_i8x16_u", TokenType::Unary, Opcode::I16X8ExtendHighI8X16U},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""},
-#line 217 "src/lexer-keywords.txt"
+#line 218 "src/lexer-keywords.txt"
{"i16x8.extmul_high_i8x16_s", TokenType::Binary, Opcode::I16X8ExtmulHighI8X16S},
{""},
-#line 219 "src/lexer-keywords.txt"
+#line 220 "src/lexer-keywords.txt"
{"i16x8.extmul_high_i8x16_u", TokenType::Binary, Opcode::I16X8ExtmulHighI8X16U},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""},
-#line 380 "src/lexer-keywords.txt"
+#line 381 "src/lexer-keywords.txt"
{"i64.atomic.rmw.xchg", TokenType::AtomicRmw, Opcode::I64AtomicRmwXchg},
-#line 249 "src/lexer-keywords.txt"
+#line 250 "src/lexer-keywords.txt"
{"i32.atomic.rmw.xchg", TokenType::AtomicRmw, Opcode::I32AtomicRmwXchg},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
@@ -1831,10 +1833,10 @@ Perfect_Hash::InWordSet (const char *str, size_t len)
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
-#line 492 "src/lexer-keywords.txt"
+#line 493 "src/lexer-keywords.txt"
{"i8x16.narrow_i16x8_s", TokenType::Binary, Opcode::I8X16NarrowI16X8S},
{""},
-#line 493 "src/lexer-keywords.txt"
+#line 494 "src/lexer-keywords.txt"
{"i8x16.narrow_i16x8_u", TokenType::Binary, Opcode::I8X16NarrowI16X8U}
};
diff --git a/src/shared-validator.cc b/src/shared-validator.cc
index 214c4204..51c0edea 100644
--- a/src/shared-validator.cc
+++ b/src/shared-validator.cc
@@ -763,6 +763,23 @@ Result SharedValidator::OnCallIndirect(const Location& loc,
return result;
}
+Result SharedValidator::OnCallRef(const Location& loc, Index* function_type_index) {
+ Result result = Result::Ok;
+ expr_loc_ = &loc;
+ Index func_index;
+ result |= typechecker_.OnFuncRef(&func_index);
+ if (Failed(result)) {
+ return result;
+ }
+ FuncType func_type;
+ result |= CheckFuncTypeIndex(Var(func_index, loc), &func_type);
+ result |= typechecker_.OnCall(func_type.params, func_type.results);
+ if (Succeeded(result)) {
+ *function_type_index = func_index;
+ }
+ return result;
+}
+
Result SharedValidator::OnCatch(const Location& loc,
Var tag_var,
bool is_catch_all) {
diff --git a/src/shared-validator.h b/src/shared-validator.h
index da49e4e0..415e484e 100644
--- a/src/shared-validator.h
+++ b/src/shared-validator.h
@@ -124,6 +124,7 @@ class SharedValidator {
Result EndBrTable(const Location&);
Result OnCall(const Location&, Var func_var);
Result OnCallIndirect(const Location&, Var sig_var, Var table_var);
+ Result OnCallRef(const Location&, Index* function_type_index);
Result OnCatch(const Location&, Var tag_var, bool is_catch_all);
Result OnCompare(const Location&, Opcode);
Result OnConst(const Location&, Type);
diff --git a/src/token.def b/src/token.def
index 4c582491..3238675d 100644
--- a/src/token.def
+++ b/src/token.def
@@ -94,6 +94,7 @@ WABT_TOKEN(BrIf, "br_if")
WABT_TOKEN(BrTable, "br_table")
WABT_TOKEN(Call, "call")
WABT_TOKEN(CallIndirect, "call_indirect")
+WABT_TOKEN(CallRef, "call_ref")
WABT_TOKEN(Catch, "catch")
WABT_TOKEN(CatchAll, "catch_all")
WABT_TOKEN(Compare, "COMPARE")
diff --git a/src/type-checker.cc b/src/type-checker.cc
index 1daa5ecf..3e875a31 100644
--- a/src/type-checker.cc
+++ b/src/type-checker.cc
@@ -489,6 +489,27 @@ Result TypeChecker::OnCallIndirect(const TypeVector& param_types,
return result;
}
+Result TypeChecker::OnFuncRef(Index* out_index) {
+ Type type;
+ Result result = PeekType(0, &type);
+ if (!type.IsIndex()) {
+ TypeVector actual;
+ if (Succeeded(result)) {
+ actual.push_back(type);
+ }
+ std::string message =
+ "type mismatch in call_ref, expected reference but got " +
+ TypesToString(actual);
+ PrintError("%s", message.c_str());
+ result = Result::Error;
+ }
+ if (Succeeded(result)) {
+ *out_index = type.GetIndex();
+ }
+ result |= DropTypes(1);
+ return result;
+}
+
Result TypeChecker::OnReturnCall(const TypeVector& param_types,
const TypeVector& result_types) {
Result result = PopAndCheckSignature(param_types, "return_call");
@@ -728,8 +749,12 @@ Result TypeChecker::OnTableFill(Type elem_type) {
return PopAndCheck3Types(Type::I32, elem_type, Type::I32, "table.fill");
}
-Result TypeChecker::OnRefFuncExpr(Index) {
- PushType(Type::FuncRef);
+Result TypeChecker::OnRefFuncExpr(Index func_index) {
+ if (features_.function_references_enabled()) {
+ PushType(Type(func_index));
+ } else {
+ PushType(Type::FuncRef);
+ }
return Result::Ok;
}
diff --git a/src/type-checker.h b/src/type-checker.h
index 4a027568..b7cdf82d 100644
--- a/src/type-checker.h
+++ b/src/type-checker.h
@@ -77,6 +77,7 @@ class TypeChecker {
Result OnCall(const TypeVector& param_types, const TypeVector& result_types);
Result OnCallIndirect(const TypeVector& param_types,
const TypeVector& result_types);
+ Result OnFuncRef(Index* out_index);
Result OnReturnCall(const TypeVector& param_types, const TypeVector& result_types);
Result OnReturnCallIndirect(const TypeVector& param_types, const TypeVector& result_types);
Result OnCatch(const TypeVector& sig);
diff --git a/src/validator.cc b/src/validator.cc
index b98121d4..d78219ee 100644
--- a/src/validator.cc
+++ b/src/validator.cc
@@ -93,6 +93,7 @@ class Validator : public ExprVisitor::Delegate {
Result OnBrTableExpr(BrTableExpr*) override;
Result OnCallExpr(CallExpr*) override;
Result OnCallIndirectExpr(CallIndirectExpr*) override;
+ Result OnCallRefExpr(CallRefExpr*) override;
Result OnCompareExpr(CompareExpr*) override;
Result OnConstExpr(ConstExpr*) override;
Result OnConvertExpr(ConvertExpr*) override;
@@ -273,6 +274,17 @@ Result Validator::OnCallIndirectExpr(CallIndirectExpr* expr) {
return Result::Ok;
}
+Result Validator::OnCallRefExpr(CallRefExpr* expr) {
+ Index function_type_index;
+ result_ |= validator_.OnCallRef(expr->loc, &function_type_index);
+ if (Succeeded(result_)) {
+ expr->function_type_index = Var{function_type_index};
+ return Result::Ok;
+ }
+
+ return Result::Error;
+}
+
Result Validator::OnCompareExpr(CompareExpr* expr) {
result_ |= validator_.OnCompare(expr->loc, expr->opcode);
return Result::Ok;
diff --git a/src/wast-parser.cc b/src/wast-parser.cc
index 9fb09c5a..5954f651 100644
--- a/src/wast-parser.cc
+++ b/src/wast-parser.cc
@@ -120,6 +120,7 @@ bool IsPlainInstr(TokenType token_type) {
case TokenType::ReturnCallIndirect:
case TokenType::Call:
case TokenType::CallIndirect:
+ case TokenType::CallRef:
case TokenType::LocalGet:
case TokenType::LocalSet:
case TokenType::LocalTee:
@@ -1863,6 +1864,12 @@ Result WastParser::ParsePlainInstr(std::unique_ptr<Expr>* out_expr) {
break;
}
+ case TokenType::CallRef: {
+ ErrorUnlessOpcodeEnabled(Consume());
+ out_expr->reset(new CallRefExpr(loc));
+ break;
+ }
+
case TokenType::ReturnCall:
ErrorUnlessOpcodeEnabled(Consume());
CHECK_RESULT(ParsePlainInstrVar<ReturnCallExpr>(loc, out_expr));
diff --git a/src/wat-writer.cc b/src/wat-writer.cc
index 07e48799..6483224b 100644
--- a/src/wat-writer.cc
+++ b/src/wat-writer.cc
@@ -516,6 +516,7 @@ class WatWriter::ExprVisitorDelegate : public ExprVisitor::Delegate {
Result OnBrTableExpr(BrTableExpr*) override;
Result OnCallExpr(CallExpr*) override;
Result OnCallIndirectExpr(CallIndirectExpr*) override;
+ Result OnCallRefExpr(CallRefExpr*) override;
Result OnCompareExpr(CompareExpr*) override;
Result OnConstExpr(ConstExpr*) override;
Result OnConvertExpr(ConvertExpr*) override;
@@ -634,6 +635,12 @@ Result WatWriter::ExprVisitorDelegate::OnCallIndirectExpr(
return Result::Ok;
}
+Result WatWriter::ExprVisitorDelegate::OnCallRefExpr(
+ CallRefExpr* expr) {
+ writer_->WritePutsSpace(Opcode::CallRef_Opcode.GetName());
+ return Result::Ok;
+}
+
Result WatWriter::ExprVisitorDelegate::OnCompareExpr(CompareExpr* expr) {
writer_->WritePutsNewline(expr->opcode.GetName());
return Result::Ok;
diff --git a/test/dump/call_ref.txt b/test/dump/call_ref.txt
new file mode 100644
index 00000000..9589cfbf
--- /dev/null
+++ b/test/dump/call_ref.txt
@@ -0,0 +1,108 @@
+;;; TOOL: run-objdump
+;;; ARGS0: -v --enable-function-references
+
+(module
+ (func (export "main") (result i32)
+ i32.const 10
+ ref.func $foo
+ call_ref
+ )
+ (func $foo (param $x i32) (result i32)
+ (i32.add (local.get $x)
+ (i32.const 19))
+ )
+ (elem declare funcref (ref.func $foo))
+)
+
+(;; STDERR ;;;
+0000000: 0061 736d ; WASM_BINARY_MAGIC
+0000004: 0100 0000 ; WASM_BINARY_VERSION
+; section "Type" (1)
+0000008: 01 ; section code
+0000009: 00 ; section size (guess)
+000000a: 02 ; num types
+; func type 0
+000000b: 60 ; func
+000000c: 00 ; num params
+000000d: 01 ; num results
+000000e: 7f ; i32
+; func type 1
+000000f: 60 ; func
+0000010: 01 ; num params
+0000011: 7f ; i32
+0000012: 01 ; num results
+0000013: 7f ; i32
+0000009: 0a ; FIXUP section size
+; section "Function" (3)
+0000014: 03 ; section code
+0000015: 00 ; section size (guess)
+0000016: 02 ; num functions
+0000017: 00 ; function 0 signature index
+0000018: 01 ; function 1 signature index
+0000015: 03 ; FIXUP section size
+; section "Export" (7)
+0000019: 07 ; section code
+000001a: 00 ; section size (guess)
+000001b: 01 ; num exports
+000001c: 04 ; string length
+000001d: 6d61 696e main ; export name
+0000021: 00 ; export kind
+0000022: 00 ; export func index
+000001a: 08 ; FIXUP section size
+; section "Elem" (9)
+0000023: 09 ; section code
+0000024: 00 ; section size (guess)
+0000025: 01 ; num elem segments
+; elem segment header 0
+0000026: 03 ; segment flags
+0000027: 00 ; elem list type
+0000028: 01 ; num elems
+0000029: 01 ; elem function index
+0000024: 05 ; FIXUP section size
+; section "DataCount" (12)
+000002a: 0c ; section code
+000002b: 00 ; section size (guess)
+000002c: 00 ; data count
+000002b: 01 ; FIXUP section size
+; section "Code" (10)
+000002d: 0a ; section code
+000002e: 00 ; section size (guess)
+000002f: 02 ; num functions
+; function body 0
+0000030: 00 ; func body size (guess)
+0000031: 00 ; local decl count
+0000032: 41 ; i32.const
+0000033: 0a ; i32 literal
+0000034: d2 ; ref.func
+0000035: 01 ; function index
+0000036: 14 ; call_ref
+0000037: 0b ; end
+0000030: 07 ; FIXUP func body size
+; function body 1
+0000038: 00 ; func body size (guess)
+0000039: 00 ; local decl count
+000003a: 20 ; local.get
+000003b: 00 ; local index
+000003c: 41 ; i32.const
+000003d: 13 ; i32 literal
+000003e: 6a ; i32.add
+000003f: 0b ; end
+0000038: 07 ; FIXUP func body size
+000002e: 11 ; FIXUP section size
+; move data: [2d, 40) -> [2a, 3d)
+; truncate to 61 (0x3d)
+;;; STDERR ;;)
+(;; STDOUT ;;;
+call_ref.wasm: file format wasm 0x1
+Code Disassembly:
+00002e func[0] <main>:
+ 00002f: 41 0a | i32.const 10
+ 000031: d2 01 | ref.func 1
+ 000033: 14 | call_ref
+ 000034: 0b | end
+000036 func[1]:
+ 000037: 20 00 | local.get 0
+ 000039: 41 13 | i32.const 19
+ 00003b: 6a | i32.add
+ 00003c: 0b | end
+;;; STDOUT ;;)
diff --git a/test/help/spectest-interp.txt b/test/help/spectest-interp.txt
index 13ba5720..fd11e584 100644
--- a/test/help/spectest-interp.txt
+++ b/test/help/spectest-interp.txt
@@ -19,6 +19,7 @@ options:
--disable-sign-extension Disable Sign-extension operators
--enable-simd Enable SIMD support
--enable-threads Enable Threading support
+ --enable-function-references Enable Typed function references
--disable-multi-value Disable Multi-value
--enable-tail-call Enable Tail-call support
--enable-bulk-memory Enable Bulk-memory operations
diff --git a/test/help/wasm-interp.txt b/test/help/wasm-interp.txt
index d2af964f..34ab871b 100644
--- a/test/help/wasm-interp.txt
+++ b/test/help/wasm-interp.txt
@@ -30,6 +30,7 @@ options:
--disable-sign-extension Disable Sign-extension operators
--enable-simd Enable SIMD support
--enable-threads Enable Threading support
+ --enable-function-references Enable Typed function references
--disable-multi-value Disable Multi-value
--enable-tail-call Enable Tail-call support
--enable-bulk-memory Enable Bulk-memory operations
diff --git a/test/help/wasm-opcodecnt.txt b/test/help/wasm-opcodecnt.txt
index e3fe3edd..06fc23af 100644
--- a/test/help/wasm-opcodecnt.txt
+++ b/test/help/wasm-opcodecnt.txt
@@ -20,6 +20,7 @@ options:
--disable-sign-extension Disable Sign-extension operators
--enable-simd Enable SIMD support
--enable-threads Enable Threading support
+ --enable-function-references Enable Typed function references
--disable-multi-value Disable Multi-value
--enable-tail-call Enable Tail-call support
--enable-bulk-memory Enable Bulk-memory operations
diff --git a/test/help/wasm-validate.txt b/test/help/wasm-validate.txt
index b01f1101..a2fca640 100644
--- a/test/help/wasm-validate.txt
+++ b/test/help/wasm-validate.txt
@@ -19,6 +19,7 @@ options:
--disable-sign-extension Disable Sign-extension operators
--enable-simd Enable SIMD support
--enable-threads Enable Threading support
+ --enable-function-references Enable Typed function references
--disable-multi-value Disable Multi-value
--enable-tail-call Enable Tail-call support
--enable-bulk-memory Enable Bulk-memory operations
diff --git a/test/help/wasm2wat.txt b/test/help/wasm2wat.txt
index a7b26d4a..213d68d6 100644
--- a/test/help/wasm2wat.txt
+++ b/test/help/wasm2wat.txt
@@ -25,6 +25,7 @@ options:
--disable-sign-extension Disable Sign-extension operators
--enable-simd Enable SIMD support
--enable-threads Enable Threading support
+ --enable-function-references Enable Typed function references
--disable-multi-value Disable Multi-value
--enable-tail-call Enable Tail-call support
--enable-bulk-memory Enable Bulk-memory operations
diff --git a/test/help/wast2json.txt b/test/help/wast2json.txt
index a838d2d2..c167b45d 100644
--- a/test/help/wast2json.txt
+++ b/test/help/wast2json.txt
@@ -22,6 +22,7 @@ options:
--disable-sign-extension Disable Sign-extension operators
--enable-simd Enable SIMD support
--enable-threads Enable Threading support
+ --enable-function-references Enable Typed function references
--disable-multi-value Disable Multi-value
--enable-tail-call Enable Tail-call support
--enable-bulk-memory Enable Bulk-memory operations
diff --git a/test/help/wat-desugar.txt b/test/help/wat-desugar.txt
index 10076f78..92614752 100644
--- a/test/help/wat-desugar.txt
+++ b/test/help/wat-desugar.txt
@@ -29,6 +29,7 @@ options:
--disable-sign-extension Disable Sign-extension operators
--enable-simd Enable SIMD support
--enable-threads Enable Threading support
+ --enable-function-references Enable Typed function references
--disable-multi-value Disable Multi-value
--enable-tail-call Enable Tail-call support
--enable-bulk-memory Enable Bulk-memory operations
diff --git a/test/help/wat2wasm.txt b/test/help/wat2wasm.txt
index 35f228f5..10e3721d 100644
--- a/test/help/wat2wasm.txt
+++ b/test/help/wat2wasm.txt
@@ -29,6 +29,7 @@ options:
--disable-sign-extension Disable Sign-extension operators
--enable-simd Enable SIMD support
--enable-threads Enable Threading support
+ --enable-function-references Enable Typed function references
--disable-multi-value Disable Multi-value
--enable-tail-call Enable Tail-call support
--enable-bulk-memory Enable Bulk-memory operations
diff --git a/test/parse/expr/callref-imported-function.txt b/test/parse/expr/callref-imported-function.txt
new file mode 100644
index 00000000..255f7c19
--- /dev/null
+++ b/test/parse/expr/callref-imported-function.txt
@@ -0,0 +1,11 @@
+;;; TOOL: wat2wasm
+;;; ARGS: --enable-function-references
+(module
+ (import "" "foo" (func $foo (param i32) (result i32)))
+ (func (export "main") (result i32)
+ (call_ref (i32.const 10)
+ (ref.func $foo)
+ )
+ )
+ (elem declare funcref (ref.func $foo))
+)
diff --git a/test/parse/expr/callref-internal-function.txt b/test/parse/expr/callref-internal-function.txt
new file mode 100644
index 00000000..5cc27cc6
--- /dev/null
+++ b/test/parse/expr/callref-internal-function.txt
@@ -0,0 +1,14 @@
+;;; TOOL: wat2wasm
+;;; ARGS: --enable-function-references
+(module
+ (func (export "main") (result i32)
+ (call_ref (i32.const 10)
+ (ref.func $foo)
+ )
+ )
+ (func $foo (param $x i32) (result i32)
+ (i32.add (local.get $x)
+ (i32.const 19))
+ )
+ (elem declare funcref (ref.func $foo))
+)
diff --git a/test/roundtrip/fold-callref.txt b/test/roundtrip/fold-callref.txt
new file mode 100644
index 00000000..fdfbcae0
--- /dev/null
+++ b/test/roundtrip/fold-callref.txt
@@ -0,0 +1,64 @@
+;;; TOOL: run-roundtrip
+;;; ARGS: --stdout --fold-exprs --enable-function-references
+(module
+ (type $i_i (func (param i32) (result i32)))
+
+ (func $i32_r_i32 (type $i_i)
+ i32.const 1)
+
+ (func $i32_f32_r_f32 (param i32 f32) (result f32)
+ f32.const 0)
+
+ (func $f32_f32_f32_f32_r_v (param f32 f32 f32 f32))
+
+ (elem declare funcref (ref.func $i32_r_i32) (ref.func $i32_f32_r_f32) (ref.func $f32_f32_f32_f32_r_v))
+
+ (func $fold-callref (result i32)
+ i32.const 1
+ ref.func $i32_r_i32
+ call_ref
+ drop
+ i32.const 2
+ ref.func $i32_r_i32
+ call_ref)
+
+ (func $fold-call-2
+ f32.const 0
+ f32.const 1
+ f32.const 2
+ i32.const 3
+ f32.const 4
+ ref.func $i32_f32_r_f32
+ call_ref
+ ref.func $f32_f32_f32_f32_r_v
+ call_ref)
+)
+
+(;; STDOUT ;;;
+(module
+ (type (;0;) (func (param i32) (result i32)))
+ (type (;1;) (func (param i32 f32) (result f32)))
+ (type (;2;) (func (param f32 f32 f32 f32)))
+ (type (;3;) (func (result i32)))
+ (type (;4;) (func))
+ (func (;0;) (type 0) (param i32) (result i32)
+ (i32.const 1))
+ (func (;1;) (type 1) (param i32 f32) (result f32)
+ (f32.const 0x0p+0 (;=0;)))
+ (func (;2;) (type 2) (param f32 f32 f32 f32))
+ (func (;3;) (type 3) (result i32)
+ (drop
+ (call_ref (i32.const 1)
+ (ref.func 0)))
+ (call_ref (i32.const 2)
+ (ref.func 0)))
+ (func (;4;) (type 4)
+ (call_ref (f32.const 0x0p+0 (;=0;))
+ (f32.const 0x1p+0 (;=1;))
+ (f32.const 0x1p+1 (;=2;))
+ (call_ref (i32.const 3)
+ (f32.const 0x1p+2 (;=4;))
+ (ref.func 1))
+ (ref.func 2)))
+ (elem (;0;) declare func 0 1 2))
+;;; STDOUT ;;)
diff --git a/test/run-roundtrip.py b/test/run-roundtrip.py
index 8aef6f55..2ee58736 100755
--- a/test/run-roundtrip.py
+++ b/test/run-roundtrip.py
@@ -116,6 +116,7 @@ def main(args):
parser.add_argument('--fold-exprs', action='store_true')
parser.add_argument('--enable-exceptions', action='store_true')
parser.add_argument('--enable-saturating-float-to-int', action='store_true')
+ parser.add_argument('--enable-function-references', action='store_true')
parser.add_argument('--enable-threads', action='store_true')
parser.add_argument('--enable-simd', action='store_true')
parser.add_argument('--enable-sign-extension', action='store_true')
@@ -141,6 +142,7 @@ def main(args):
options.enable_saturating_float_to_int,
'--enable-sign-extension': options.enable_sign_extension,
'--enable-simd': options.enable_simd,
+ '--enable-function-references': options.enable_function_references,
'--enable-threads': options.enable_threads,
'--enable-bulk-memory': options.enable_bulk_memory,
'--enable-tail-call': options.enable_tail_call,
@@ -163,6 +165,7 @@ def main(args):
'--enable-simd': options.enable_simd,
'--enable-bulk-memory': options.enable_bulk_memory,
'--enable-tail-call': options.enable_tail_call,
+ '--enable-function-references': options.enable_function_references,
'--enable-reference-types': options.enable_reference_types,
'--enable-threads': options.enable_threads,
'--enable-memory64': options.enable_memory64,
diff --git a/test/typecheck/bad-callref-int32.txt b/test/typecheck/bad-callref-int32.txt
new file mode 100644
index 00000000..289bd5ae
--- /dev/null
+++ b/test/typecheck/bad-callref-int32.txt
@@ -0,0 +1,15 @@
+;;; TOOL: wat2wasm
+;;; ARGS: --enable-function-references
+;;; ERROR: 1
+(module
+ (func (export "main") (result i32)
+ (call_ref (i32.const 10)
+ (i32.const 13)
+ )
+ )
+)
+(;; STDERR ;;;
+out/test/typecheck/bad-callref-int32.txt:6:6: error: type mismatch in call_ref, expected reference but got [i32]
+ (call_ref (i32.const 10)
+ ^^^^^^^^
+;;; STDERR ;;) \ No newline at end of file
diff --git a/test/typecheck/bad-callref-null.txt b/test/typecheck/bad-callref-null.txt
new file mode 100644
index 00000000..08860777
--- /dev/null
+++ b/test/typecheck/bad-callref-null.txt
@@ -0,0 +1,15 @@
+;;; TOOL: wat2wasm
+;;; ARGS: --enable-function-references
+;;; ERROR: 1
+(module
+ (func (export "main") (result i32)
+ (call_ref (i32.const 10)
+ (ref.null func)
+ )
+ )
+)
+(;; STDERR ;;;
+out/test/typecheck/bad-callref-null.txt:6:6: error: type mismatch in call_ref, expected reference but got [funcref]
+ (call_ref (i32.const 10)
+ ^^^^^^^^
+;;; STDERR ;;)