blob: 14386334e19a9647532e8998beb19077a58035f1 [file] [log] [blame]
// DO NOT EDIT! This file generated by scripts/gen-s-parser.py
// clang-format off
#ifdef INSTRUCTION_PARSER
#undef INSTRUCTION_PARSER
using namespace std::string_view_literals;
auto op = s[0]->str().str;
char buf[33] = {};
memcpy(buf, op.data(), op.size());
switch (buf[0]) {
case 'a': {
switch (buf[1]) {
case 'r': {
switch (buf[6]) {
case 'c':
if (op == "array.copy"sv) { return makeArrayCopy(s); }
goto parse_error;
case 'f':
if (op == "array.fill"sv) { return makeArrayFill(s); }
goto parse_error;
case 'g': {
switch (buf[9]) {
case '\0':
if (op == "array.get"sv) { return makeArrayGet(s); }
goto parse_error;
case '_': {
switch (buf[10]) {
case 's':
if (op == "array.get_s"sv) { return makeArrayGet(s, true); }
goto parse_error;
case 'u':
if (op == "array.get_u"sv) { return makeArrayGet(s, false); }
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'i': {
switch (buf[11]) {
case 'd':
if (op == "array.init_data"sv) { return makeArrayInitData(s); }
goto parse_error;
case 'e':
if (op == "array.init_elem"sv) { return makeArrayInitElem(s); }
goto parse_error;
case 's':
if (op == "array.init_static"sv) { return makeArrayNewFixed(s); }
goto parse_error;
default: goto parse_error;
}
}
case 'l':
if (op == "array.len"sv) { return makeArrayLen(s); }
goto parse_error;
case 'n': {
switch (buf[9]) {
case '\0':
if (op == "array.new"sv) { return makeArrayNew(s, false); }
goto parse_error;
case '_': {
switch (buf[10]) {
case 'd': {
switch (buf[11]) {
case 'a':
if (op == "array.new_data"sv) { return makeArrayNewData(s); }
goto parse_error;
case 'e':
if (op == "array.new_default"sv) { return makeArrayNew(s, true); }
goto parse_error;
default: goto parse_error;
}
}
case 'e':
if (op == "array.new_elem"sv) { return makeArrayNewElem(s); }
goto parse_error;
case 'f':
if (op == "array.new_fixed"sv) { return makeArrayNewFixed(s); }
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 's':
if (op == "array.set"sv) { return makeArraySet(s); }
goto parse_error;
default: goto parse_error;
}
}
case 't':
if (op == "atomic.fence"sv) { return makeAtomicFence(s); }
goto parse_error;
default: goto parse_error;
}
}
case 'b': {
switch (buf[1]) {
case 'l':
if (op == "block"sv) { return makeBlock(s); }
goto parse_error;
case 'r': {
switch (buf[2]) {
case '\0':
if (op == "br"sv) { return makeBreak(s); }
goto parse_error;
case '_': {
switch (buf[3]) {
case 'i':
if (op == "br_if"sv) { return makeBreak(s); }
goto parse_error;
case 'o': {
switch (buf[6]) {
case 'c': {
switch (buf[10]) {
case '\0':
if (op == "br_on_cast"sv) { return makeBrOnCast(s); }
goto parse_error;
case '_':
if (op == "br_on_cast_fail"sv) { return makeBrOnCast(s, true); }
goto parse_error;
default: goto parse_error;
}
}
case 'n': {
switch (buf[7]) {
case 'o':
if (op == "br_on_non_null"sv) { return makeBrOnNull(s, true); }
goto parse_error;
case 'u':
if (op == "br_on_null"sv) { return makeBrOnNull(s); }
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 't':
if (op == "br_table"sv) { return makeBreakTable(s); }
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'c': {
switch (buf[4]) {
case '\0':
if (op == "call"sv) { return makeCall(s, /*isReturn=*/false); }
goto parse_error;
case '_': {
switch (buf[5]) {
case 'i':
if (op == "call_indirect"sv) { return makeCallIndirect(s, /*isReturn=*/false); }
goto parse_error;
case 'r':
if (op == "call_ref"sv) { return makeCallRef(s, /*isReturn=*/false); }
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'd': {
switch (buf[1]) {
case 'a':
if (op == "data.drop"sv) { return makeDataDrop(s); }
goto parse_error;
case 'r':
if (op == "drop"sv) { return makeDrop(s); }
goto parse_error;
default: goto parse_error;
}
}
case 'e': {
switch (buf[1]) {
case 'l':
if (op == "else"sv) { return makeThenOrElse(s); }
goto parse_error;
case 'x': {
switch (buf[7]) {
case 'e':
if (op == "extern.externalize"sv) { return makeRefAs(s, ExternExternalize); }
goto parse_error;
case 'i':
if (op == "extern.internalize"sv) { return makeRefAs(s, ExternInternalize); }
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'f': {
switch (buf[1]) {
case '3': {
switch (buf[3]) {
case '.': {
switch (buf[4]) {
case 'a': {
switch (buf[5]) {
case 'b':
if (op == "f32.abs"sv) { return makeUnary(s, UnaryOp::AbsFloat32); }
goto parse_error;
case 'd':
if (op == "f32.add"sv) { return makeBinary(s, BinaryOp::AddFloat32); }
goto parse_error;
default: goto parse_error;
}
}
case 'c': {
switch (buf[5]) {
case 'e':
if (op == "f32.ceil"sv) { return makeUnary(s, UnaryOp::CeilFloat32); }
goto parse_error;
case 'o': {
switch (buf[6]) {
case 'n': {
switch (buf[7]) {
case 's':
if (op == "f32.const"sv) { return makeConst(s, Type::f32); }
goto parse_error;
case 'v': {
switch (buf[13]) {
case '3': {
switch (buf[16]) {
case 's':
if (op == "f32.convert_i32_s"sv) { return makeUnary(s, UnaryOp::ConvertSInt32ToFloat32); }
goto parse_error;
case 'u':
if (op == "f32.convert_i32_u"sv) { return makeUnary(s, UnaryOp::ConvertUInt32ToFloat32); }
goto parse_error;
default: goto parse_error;
}
}
case '6': {
switch (buf[16]) {
case 's':
if (op == "f32.convert_i64_s"sv) { return makeUnary(s, UnaryOp::ConvertSInt64ToFloat32); }
goto parse_error;
case 'u':
if (op == "f32.convert_i64_u"sv) { return makeUnary(s, UnaryOp::ConvertUInt64ToFloat32); }
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'p':
if (op == "f32.copysign"sv) { return makeBinary(s, BinaryOp::CopySignFloat32); }
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'd': {
switch (buf[5]) {
case 'e':
if (op == "f32.demote_f64"sv) { return makeUnary(s, UnaryOp::DemoteFloat64); }
goto parse_error;
case 'i':
if (op == "f32.div"sv) { return makeBinary(s, BinaryOp::DivFloat32); }
goto parse_error;
default: goto parse_error;
}
}
case 'e':
if (op == "f32.eq"sv) { return makeBinary(s, BinaryOp::EqFloat32); }
goto parse_error;
case 'f':
if (op == "f32.floor"sv) { return makeUnary(s, UnaryOp::FloorFloat32); }
goto parse_error;
case 'g': {
switch (buf[5]) {
case 'e':
if (op == "f32.ge"sv) { return makeBinary(s, BinaryOp::GeFloat32); }
goto parse_error;
case 't':
if (op == "f32.gt"sv) { return makeBinary(s, BinaryOp::GtFloat32); }
goto parse_error;
default: goto parse_error;
}
}
case 'l': {
switch (buf[5]) {
case 'e':
if (op == "f32.le"sv) { return makeBinary(s, BinaryOp::LeFloat32); }
goto parse_error;
case 'o':
if (op == "f32.load"sv) { return makeLoad(s, Type::f32, /*signed=*/false, 4, /*isAtomic=*/false); }
goto parse_error;
case 't':
if (op == "f32.lt"sv) { return makeBinary(s, BinaryOp::LtFloat32); }
goto parse_error;
default: goto parse_error;
}
}
case 'm': {
switch (buf[5]) {
case 'a':
if (op == "f32.max"sv) { return makeBinary(s, BinaryOp::MaxFloat32); }
goto parse_error;
case 'i':
if (op == "f32.min"sv) { return makeBinary(s, BinaryOp::MinFloat32); }
goto parse_error;
case 'u':
if (op == "f32.mul"sv) { return makeBinary(s, BinaryOp::MulFloat32); }
goto parse_error;
default: goto parse_error;
}
}
case 'n': {
switch (buf[6]) {
case '\0':
if (op == "f32.ne"sv) { return makeBinary(s, BinaryOp::NeFloat32); }
goto parse_error;
case 'a':
if (op == "f32.nearest"sv) { return makeUnary(s, UnaryOp::NearestFloat32); }
goto parse_error;
case 'g':
if (op == "f32.neg"sv) { return makeUnary(s, UnaryOp::NegFloat32); }
goto parse_error;
default: goto parse_error;
}
}
case 'r':
if (op == "f32.reinterpret_i32"sv) { return makeUnary(s, UnaryOp::ReinterpretInt32); }
goto parse_error;
case 's': {
switch (buf[5]) {
case 'q':
if (op == "f32.sqrt"sv) { return makeUnary(s, UnaryOp::SqrtFloat32); }
goto parse_error;
case 't':
if (op == "f32.store"sv) { return makeStore(s, Type::f32, 4, /*isAtomic=*/false); }
goto parse_error;
case 'u':
if (op == "f32.sub"sv) { return makeBinary(s, BinaryOp::SubFloat32); }
goto parse_error;
default: goto parse_error;
}
}
case 't':
if (op == "f32.trunc"sv) { return makeUnary(s, UnaryOp::TruncFloat32); }
goto parse_error;
default: goto parse_error;
}
}
case 'x': {
switch (buf[6]) {
case 'a': {
switch (buf[7]) {
case 'b':
if (op == "f32x4.abs"sv) { return makeUnary(s, UnaryOp::AbsVecF32x4); }
goto parse_error;
case 'd':
if (op == "f32x4.add"sv) { return makeBinary(s, BinaryOp::AddVecF32x4); }
goto parse_error;
default: goto parse_error;
}
}
case 'c': {
switch (buf[7]) {
case 'e':
if (op == "f32x4.ceil"sv) { return makeUnary(s, UnaryOp::CeilVecF32x4); }
goto parse_error;
case 'o': {
switch (buf[20]) {
case 's':
if (op == "f32x4.convert_i32x4_s"sv) { return makeUnary(s, UnaryOp::ConvertSVecI32x4ToVecF32x4); }
goto parse_error;
case 'u':
if (op == "f32x4.convert_i32x4_u"sv) { return makeUnary(s, UnaryOp::ConvertUVecI32x4ToVecF32x4); }
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'd': {
switch (buf[7]) {
case 'e':
if (op == "f32x4.demote_f64x2_zero"sv) { return makeUnary(s, UnaryOp::DemoteZeroVecF64x2ToVecF32x4); }
goto parse_error;
case 'i':
if (op == "f32x4.div"sv) { return makeBinary(s, BinaryOp::DivVecF32x4); }
goto parse_error;
default: goto parse_error;
}
}
case 'e': {
switch (buf[7]) {
case 'q':
if (op == "f32x4.eq"sv) { return makeBinary(s, BinaryOp::EqVecF32x4); }
goto parse_error;
case 'x':
if (op == "f32x4.extract_lane"sv) { return makeSIMDExtract(s, SIMDExtractOp::ExtractLaneVecF32x4, 4); }
goto parse_error;
default: goto parse_error;
}
}
case 'f':
if (op == "f32x4.floor"sv) { return makeUnary(s, UnaryOp::FloorVecF32x4); }
goto parse_error;
case 'g': {
switch (buf[7]) {
case 'e':
if (op == "f32x4.ge"sv) { return makeBinary(s, BinaryOp::GeVecF32x4); }
goto parse_error;
case 't':
if (op == "f32x4.gt"sv) { return makeBinary(s, BinaryOp::GtVecF32x4); }
goto parse_error;
default: goto parse_error;
}
}
case 'l': {
switch (buf[7]) {
case 'e':
if (op == "f32x4.le"sv) { return makeBinary(s, BinaryOp::LeVecF32x4); }
goto parse_error;
case 't':
if (op == "f32x4.lt"sv) { return makeBinary(s, BinaryOp::LtVecF32x4); }
goto parse_error;
default: goto parse_error;
}
}
case 'm': {
switch (buf[7]) {
case 'a':
if (op == "f32x4.max"sv) { return makeBinary(s, BinaryOp::MaxVecF32x4); }
goto parse_error;
case 'i':
if (op == "f32x4.min"sv) { return makeBinary(s, BinaryOp::MinVecF32x4); }
goto parse_error;
case 'u':
if (op == "f32x4.mul"sv) { return makeBinary(s, BinaryOp::MulVecF32x4); }
goto parse_error;
default: goto parse_error;
}
}
case 'n': {
switch (buf[8]) {
case '\0':
if (op == "f32x4.ne"sv) { return makeBinary(s, BinaryOp::NeVecF32x4); }
goto parse_error;
case 'a':
if (op == "f32x4.nearest"sv) { return makeUnary(s, UnaryOp::NearestVecF32x4); }
goto parse_error;
case 'g':
if (op == "f32x4.neg"sv) { return makeUnary(s, UnaryOp::NegVecF32x4); }
goto parse_error;
default: goto parse_error;
}
}
case 'p': {
switch (buf[8]) {
case 'a':
if (op == "f32x4.pmax"sv) { return makeBinary(s, BinaryOp::PMaxVecF32x4); }
goto parse_error;
case 'i':
if (op == "f32x4.pmin"sv) { return makeBinary(s, BinaryOp::PMinVecF32x4); }
goto parse_error;
default: goto parse_error;
}
}
case 'r': {
switch (buf[8]) {
case 'l': {
switch (buf[14]) {
case 'f': {
switch (buf[16]) {
case 'a':
if (op == "f32x4.relaxed_fma"sv) { return makeSIMDTernary(s, SIMDTernaryOp::RelaxedFmaVecF32x4); }
goto parse_error;
case 's':
if (op == "f32x4.relaxed_fms"sv) { return makeSIMDTernary(s, SIMDTernaryOp::RelaxedFmsVecF32x4); }
goto parse_error;
default: goto parse_error;
}
}
case 'm': {
switch (buf[15]) {
case 'a':
if (op == "f32x4.relaxed_max"sv) { return makeBinary(s, BinaryOp::RelaxedMaxVecF32x4); }
goto parse_error;
case 'i':
if (op == "f32x4.relaxed_min"sv) { return makeBinary(s, BinaryOp::RelaxedMinVecF32x4); }
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'p':
if (op == "f32x4.replace_lane"sv) { return makeSIMDReplace(s, SIMDReplaceOp::ReplaceLaneVecF32x4, 4); }
goto parse_error;
default: goto parse_error;
}
}
case 's': {
switch (buf[7]) {
case 'p':
if (op == "f32x4.splat"sv) { return makeUnary(s, UnaryOp::SplatVecF32x4); }
goto parse_error;
case 'q':
if (op == "f32x4.sqrt"sv) { return makeUnary(s, UnaryOp::SqrtVecF32x4); }
goto parse_error;
case 'u':
if (op == "f32x4.sub"sv) { return makeBinary(s, BinaryOp::SubVecF32x4); }
goto parse_error;
default: goto parse_error;
}
}
case 't':
if (op == "f32x4.trunc"sv) { return makeUnary(s, UnaryOp::TruncVecF32x4); }
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case '6': {
switch (buf[3]) {
case '.': {
switch (buf[4]) {
case 'a': {
switch (buf[5]) {
case 'b':
if (op == "f64.abs"sv) { return makeUnary(s, UnaryOp::AbsFloat64); }
goto parse_error;
case 'd':
if (op == "f64.add"sv) { return makeBinary(s, BinaryOp::AddFloat64); }
goto parse_error;
default: goto parse_error;
}
}
case 'c': {
switch (buf[5]) {
case 'e':
if (op == "f64.ceil"sv) { return makeUnary(s, UnaryOp::CeilFloat64); }
goto parse_error;
case 'o': {
switch (buf[6]) {
case 'n': {
switch (buf[7]) {
case 's':
if (op == "f64.const"sv) { return makeConst(s, Type::f64); }
goto parse_error;
case 'v': {
switch (buf[13]) {
case '3': {
switch (buf[16]) {
case 's':
if (op == "f64.convert_i32_s"sv) { return makeUnary(s, UnaryOp::ConvertSInt32ToFloat64); }
goto parse_error;
case 'u':
if (op == "f64.convert_i32_u"sv) { return makeUnary(s, UnaryOp::ConvertUInt32ToFloat64); }
goto parse_error;
default: goto parse_error;
}
}
case '6': {
switch (buf[16]) {
case 's':
if (op == "f64.convert_i64_s"sv) { return makeUnary(s, UnaryOp::ConvertSInt64ToFloat64); }
goto parse_error;
case 'u':
if (op == "f64.convert_i64_u"sv) { return makeUnary(s, UnaryOp::ConvertUInt64ToFloat64); }
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'p':
if (op == "f64.copysign"sv) { return makeBinary(s, BinaryOp::CopySignFloat64); }
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'd':
if (op == "f64.div"sv) { return makeBinary(s, BinaryOp::DivFloat64); }
goto parse_error;
case 'e':
if (op == "f64.eq"sv) { return makeBinary(s, BinaryOp::EqFloat64); }
goto parse_error;
case 'f':
if (op == "f64.floor"sv) { return makeUnary(s, UnaryOp::FloorFloat64); }
goto parse_error;
case 'g': {
switch (buf[5]) {
case 'e':
if (op == "f64.ge"sv) { return makeBinary(s, BinaryOp::GeFloat64); }
goto parse_error;
case 't':
if (op == "f64.gt"sv) { return makeBinary(s, BinaryOp::GtFloat64); }
goto parse_error;
default: goto parse_error;
}
}
case 'l': {
switch (buf[5]) {
case 'e':
if (op == "f64.le"sv) { return makeBinary(s, BinaryOp::LeFloat64); }
goto parse_error;
case 'o':
if (op == "f64.load"sv) { return makeLoad(s, Type::f64, /*signed=*/false, 8, /*isAtomic=*/false); }
goto parse_error;
case 't':
if (op == "f64.lt"sv) { return makeBinary(s, BinaryOp::LtFloat64); }
goto parse_error;
default: goto parse_error;
}
}
case 'm': {
switch (buf[5]) {
case 'a':
if (op == "f64.max"sv) { return makeBinary(s, BinaryOp::MaxFloat64); }
goto parse_error;
case 'i':
if (op == "f64.min"sv) { return makeBinary(s, BinaryOp::MinFloat64); }
goto parse_error;
case 'u':
if (op == "f64.mul"sv) { return makeBinary(s, BinaryOp::MulFloat64); }
goto parse_error;
default: goto parse_error;
}
}
case 'n': {
switch (buf[6]) {
case '\0':
if (op == "f64.ne"sv) { return makeBinary(s, BinaryOp::NeFloat64); }
goto parse_error;
case 'a':
if (op == "f64.nearest"sv) { return makeUnary(s, UnaryOp::NearestFloat64); }
goto parse_error;
case 'g':
if (op == "f64.neg"sv) { return makeUnary(s, UnaryOp::NegFloat64); }
goto parse_error;
default: goto parse_error;
}
}
case 'p':
if (op == "f64.promote_f32"sv) { return makeUnary(s, UnaryOp::PromoteFloat32); }
goto parse_error;
case 'r':
if (op == "f64.reinterpret_i64"sv) { return makeUnary(s, UnaryOp::ReinterpretInt64); }
goto parse_error;
case 's': {
switch (buf[5]) {
case 'q':
if (op == "f64.sqrt"sv) { return makeUnary(s, UnaryOp::SqrtFloat64); }
goto parse_error;
case 't':
if (op == "f64.store"sv) { return makeStore(s, Type::f64, 8, /*isAtomic=*/false); }
goto parse_error;
case 'u':
if (op == "f64.sub"sv) { return makeBinary(s, BinaryOp::SubFloat64); }
goto parse_error;
default: goto parse_error;
}
}
case 't':
if (op == "f64.trunc"sv) { return makeUnary(s, UnaryOp::TruncFloat64); }
goto parse_error;
default: goto parse_error;
}
}
case 'x': {
switch (buf[6]) {
case 'a': {
switch (buf[7]) {
case 'b':
if (op == "f64x2.abs"sv) { return makeUnary(s, UnaryOp::AbsVecF64x2); }
goto parse_error;
case 'd':
if (op == "f64x2.add"sv) { return makeBinary(s, BinaryOp::AddVecF64x2); }
goto parse_error;
default: goto parse_error;
}
}
case 'c': {
switch (buf[7]) {
case 'e':
if (op == "f64x2.ceil"sv) { return makeUnary(s, UnaryOp::CeilVecF64x2); }
goto parse_error;
case 'o': {
switch (buf[24]) {
case 's':
if (op == "f64x2.convert_low_i32x4_s"sv) { return makeUnary(s, UnaryOp::ConvertLowSVecI32x4ToVecF64x2); }
goto parse_error;
case 'u':
if (op == "f64x2.convert_low_i32x4_u"sv) { return makeUnary(s, UnaryOp::ConvertLowUVecI32x4ToVecF64x2); }
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'd':
if (op == "f64x2.div"sv) { return makeBinary(s, BinaryOp::DivVecF64x2); }
goto parse_error;
case 'e': {
switch (buf[7]) {
case 'q':
if (op == "f64x2.eq"sv) { return makeBinary(s, BinaryOp::EqVecF64x2); }
goto parse_error;
case 'x':
if (op == "f64x2.extract_lane"sv) { return makeSIMDExtract(s, SIMDExtractOp::ExtractLaneVecF64x2, 2); }
goto parse_error;
default: goto parse_error;
}
}
case 'f':
if (op == "f64x2.floor"sv) { return makeUnary(s, UnaryOp::FloorVecF64x2); }
goto parse_error;
case 'g': {
switch (buf[7]) {
case 'e':
if (op == "f64x2.ge"sv) { return makeBinary(s, BinaryOp::GeVecF64x2); }
goto parse_error;
case 't':
if (op == "f64x2.gt"sv) { return makeBinary(s, BinaryOp::GtVecF64x2); }
goto parse_error;
default: goto parse_error;
}
}
case 'l': {
switch (buf[7]) {
case 'e':
if (op == "f64x2.le"sv) { return makeBinary(s, BinaryOp::LeVecF64x2); }
goto parse_error;
case 't':
if (op == "f64x2.lt"sv) { return makeBinary(s, BinaryOp::LtVecF64x2); }
goto parse_error;
default: goto parse_error;
}
}
case 'm': {
switch (buf[7]) {
case 'a':
if (op == "f64x2.max"sv) { return makeBinary(s, BinaryOp::MaxVecF64x2); }
goto parse_error;
case 'i':
if (op == "f64x2.min"sv) { return makeBinary(s, BinaryOp::MinVecF64x2); }
goto parse_error;
case 'u':
if (op == "f64x2.mul"sv) { return makeBinary(s, BinaryOp::MulVecF64x2); }
goto parse_error;
default: goto parse_error;
}
}
case 'n': {
switch (buf[8]) {
case '\0':
if (op == "f64x2.ne"sv) { return makeBinary(s, BinaryOp::NeVecF64x2); }
goto parse_error;
case 'a':
if (op == "f64x2.nearest"sv) { return makeUnary(s, UnaryOp::NearestVecF64x2); }
goto parse_error;
case 'g':
if (op == "f64x2.neg"sv) { return makeUnary(s, UnaryOp::NegVecF64x2); }
goto parse_error;
default: goto parse_error;
}
}
case 'p': {
switch (buf[7]) {
case 'm': {
switch (buf[8]) {
case 'a':
if (op == "f64x2.pmax"sv) { return makeBinary(s, BinaryOp::PMaxVecF64x2); }
goto parse_error;
case 'i':
if (op == "f64x2.pmin"sv) { return makeBinary(s, BinaryOp::PMinVecF64x2); }
goto parse_error;
default: goto parse_error;
}
}
case 'r':
if (op == "f64x2.promote_low_f32x4"sv) { return makeUnary(s, UnaryOp::PromoteLowVecF32x4ToVecF64x2); }
goto parse_error;
default: goto parse_error;
}
}
case 'r': {
switch (buf[8]) {
case 'l': {
switch (buf[14]) {
case 'f': {
switch (buf[16]) {
case 'a':
if (op == "f64x2.relaxed_fma"sv) { return makeSIMDTernary(s, SIMDTernaryOp::RelaxedFmaVecF64x2); }
goto parse_error;
case 's':
if (op == "f64x2.relaxed_fms"sv) { return makeSIMDTernary(s, SIMDTernaryOp::RelaxedFmsVecF64x2); }
goto parse_error;
default: goto parse_error;
}
}
case 'm': {
switch (buf[15]) {
case 'a':
if (op == "f64x2.relaxed_max"sv) { return makeBinary(s, BinaryOp::RelaxedMaxVecF64x2); }
goto parse_error;
case 'i':
if (op == "f64x2.relaxed_min"sv) { return makeBinary(s, BinaryOp::RelaxedMinVecF64x2); }
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'p':
if (op == "f64x2.replace_lane"sv) { return makeSIMDReplace(s, SIMDReplaceOp::ReplaceLaneVecF64x2, 2); }
goto parse_error;
default: goto parse_error;
}
}
case 's': {
switch (buf[7]) {
case 'p':
if (op == "f64x2.splat"sv) { return makeUnary(s, UnaryOp::SplatVecF64x2); }
goto parse_error;
case 'q':
if (op == "f64x2.sqrt"sv) { return makeUnary(s, UnaryOp::SqrtVecF64x2); }
goto parse_error;
case 'u':
if (op == "f64x2.sub"sv) { return makeBinary(s, BinaryOp::SubVecF64x2); }
goto parse_error;
default: goto parse_error;
}
}
case 't':
if (op == "f64x2.trunc"sv) { return makeUnary(s, UnaryOp::TruncVecF64x2); }
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'g': {
switch (buf[7]) {
case 'g':
if (op == "global.get"sv) { return makeGlobalGet(s); }
goto parse_error;
case 's':
if (op == "global.set"sv) { return makeGlobalSet(s); }
goto parse_error;
default: goto parse_error;
}
}
case 'i': {
switch (buf[1]) {
case '1': {
switch (buf[6]) {
case 'a': {
switch (buf[7]) {
case 'b':
if (op == "i16x8.abs"sv) { return makeUnary(s, UnaryOp::AbsVecI16x8); }
goto parse_error;
case 'd': {
switch (buf[9]) {
case '\0':
if (op == "i16x8.add"sv) { return makeBinary(s, BinaryOp::AddVecI16x8); }
goto parse_error;
case '_': {
switch (buf[14]) {
case 's':
if (op == "i16x8.add_sat_s"sv) { return makeBinary(s, BinaryOp::AddSatSVecI16x8); }
goto parse_error;
case 'u':
if (op == "i16x8.add_sat_u"sv) { return makeBinary(s, BinaryOp::AddSatUVecI16x8); }
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'l':
if (op == "i16x8.all_true"sv) { return makeUnary(s, UnaryOp::AllTrueVecI16x8); }
goto parse_error;
case 'v':
if (op == "i16x8.avgr_u"sv) { return makeBinary(s, BinaryOp::AvgrUVecI16x8); }
goto parse_error;
default: goto parse_error;
}
}
case 'b':
if (op == "i16x8.bitmask"sv) { return makeUnary(s, UnaryOp::BitmaskVecI16x8); }
goto parse_error;
case 'd':
if (op == "i16x8.dot_i8x16_i7x16_s"sv) { return makeBinary(s, BinaryOp::DotI8x16I7x16SToVecI16x8); }
goto parse_error;
case 'e': {
switch (buf[7]) {
case 'q':
if (op == "i16x8.eq"sv) { return makeBinary(s, BinaryOp::EqVecI16x8); }
goto parse_error;
case 'x': {
switch (buf[9]) {
case 'a': {
switch (buf[28]) {
case 's':
if (op == "i16x8.extadd_pairwise_i8x16_s"sv) { return makeUnary(s, UnaryOp::ExtAddPairwiseSVecI8x16ToI16x8); }
goto parse_error;
case 'u':
if (op == "i16x8.extadd_pairwise_i8x16_u"sv) { return makeUnary(s, UnaryOp::ExtAddPairwiseUVecI8x16ToI16x8); }
goto parse_error;
default: goto parse_error;
}
}
case 'e': {
switch (buf[13]) {
case 'h': {
switch (buf[24]) {
case 's':
if (op == "i16x8.extend_high_i8x16_s"sv) { return makeUnary(s, UnaryOp::ExtendHighSVecI8x16ToVecI16x8); }
goto parse_error;
case 'u':
if (op == "i16x8.extend_high_i8x16_u"sv) { return makeUnary(s, UnaryOp::ExtendHighUVecI8x16ToVecI16x8); }
goto parse_error;
default: goto parse_error;
}
}
case 'l': {
switch (buf[23]) {
case 's':
if (op == "i16x8.extend_low_i8x16_s"sv) { return makeUnary(s, UnaryOp::ExtendLowSVecI8x16ToVecI16x8); }
goto parse_error;
case 'u':
if (op == "i16x8.extend_low_i8x16_u"sv) { return makeUnary(s, UnaryOp::ExtendLowUVecI8x16ToVecI16x8); }
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'm': {
switch (buf[13]) {
case 'h': {
switch (buf[24]) {
case 's':
if (op == "i16x8.extmul_high_i8x16_s"sv) { return makeBinary(s, BinaryOp::ExtMulHighSVecI16x8); }
goto parse_error;
case 'u':
if (op == "i16x8.extmul_high_i8x16_u"sv) { return makeBinary(s, BinaryOp::ExtMulHighUVecI16x8); }
goto parse_error;
default: goto parse_error;
}
}
case 'l': {
switch (buf[23]) {
case 's':
if (op == "i16x8.extmul_low_i8x16_s"sv) { return makeBinary(s, BinaryOp::ExtMulLowSVecI16x8); }
goto parse_error;
case 'u':
if (op == "i16x8.extmul_low_i8x16_u"sv) { return makeBinary(s, BinaryOp::ExtMulLowUVecI16x8); }
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'r': {
switch (buf[19]) {
case 's':
if (op == "i16x8.extract_lane_s"sv) { return makeSIMDExtract(s, SIMDExtractOp::ExtractLaneSVecI16x8, 8); }
goto parse_error;
case 'u':
if (op == "i16x8.extract_lane_u"sv) { return makeSIMDExtract(s, SIMDExtractOp::ExtractLaneUVecI16x8, 8); }
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'g': {
switch (buf[7]) {
case 'e': {
switch (buf[9]) {
case 's':
if (op == "i16x8.ge_s"sv) { return makeBinary(s, BinaryOp::GeSVecI16x8); }
goto parse_error;
case 'u':
if (op == "i16x8.ge_u"sv) { return makeBinary(s, BinaryOp::GeUVecI16x8); }
goto parse_error;
default: goto parse_error;
}
}
case 't': {
switch (buf[9]) {
case 's':
if (op == "i16x8.gt_s"sv) { return makeBinary(s, BinaryOp::GtSVecI16x8); }
goto parse_error;
case 'u':
if (op == "i16x8.gt_u"sv) { return makeBinary(s, BinaryOp::GtUVecI16x8); }
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'l': {
switch (buf[7]) {
case 'a':
if (op == "i16x8.laneselect"sv) { return makeSIMDTernary(s, SIMDTernaryOp::LaneselectI16x8); }
goto parse_error;
case 'e': {
switch (buf[9]) {
case 's':
if (op == "i16x8.le_s"sv) { return makeBinary(s, BinaryOp::LeSVecI16x8); }
goto parse_error;
case 'u':
if (op == "i16x8.le_u"sv) { return makeBinary(s, BinaryOp::LeUVecI16x8); }
goto parse_error;
default: goto parse_error;
}
}
case 't': {
switch (buf[9]) {
case 's':
if (op == "i16x8.lt_s"sv) { return makeBinary(s, BinaryOp::LtSVecI16x8); }
goto parse_error;
case 'u':
if (op == "i16x8.lt_u"sv) { return makeBinary(s, BinaryOp::LtUVecI16x8); }
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'm': {
switch (buf[7]) {
case 'a': {
switch (buf[10]) {
case 's':
if (op == "i16x8.max_s"sv) { return makeBinary(s, BinaryOp::MaxSVecI16x8); }
goto parse_error;
case 'u':
if (op == "i16x8.max_u"sv) { return makeBinary(s, BinaryOp::MaxUVecI16x8); }
goto parse_error;
default: goto parse_error;
}
}
case 'i': {
switch (buf[10]) {
case 's':
if (op == "i16x8.min_s"sv) { return makeBinary(s, BinaryOp::MinSVecI16x8); }
goto parse_error;
case 'u':
if (op == "i16x8.min_u"sv) { return makeBinary(s, BinaryOp::MinUVecI16x8); }
goto parse_error;
default: goto parse_error;
}
}
case 'u':
if (op == "i16x8.mul"sv) { return makeBinary(s, BinaryOp::MulVecI16x8); }
goto parse_error;
default: goto parse_error;
}
}
case 'n': {
switch (buf[7]) {
case 'a': {
switch (buf[19]) {
case 's':
if (op == "i16x8.narrow_i32x4_s"sv) { return makeBinary(s, BinaryOp::NarrowSVecI32x4ToVecI16x8); }
goto parse_error;
case 'u':
if (op == "i16x8.narrow_i32x4_u"sv) { return makeBinary(s, BinaryOp::NarrowUVecI32x4ToVecI16x8); }
goto parse_error;
default: goto parse_error;
}
}
case 'e': {
switch (buf[8]) {
case '\0':
if (op == "i16x8.ne"sv) { return makeBinary(s, BinaryOp::NeVecI16x8); }
goto parse_error;
case 'g':
if (op == "i16x8.neg"sv) { return makeUnary(s, UnaryOp::NegVecI16x8); }
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'q':
if (op == "i16x8.q15mulr_sat_s"sv) { return makeBinary(s, BinaryOp::Q15MulrSatSVecI16x8); }
goto parse_error;
case 'r': {
switch (buf[8]) {
case 'l':
if (op == "i16x8.relaxed_q15mulr_s"sv) { return makeBinary(s, BinaryOp::RelaxedQ15MulrSVecI16x8); }
goto parse_error;
case 'p':
if (op == "i16x8.replace_lane"sv) { return makeSIMDReplace(s, SIMDReplaceOp::ReplaceLaneVecI16x8, 8); }
goto parse_error;
default: goto parse_error;
}
}
case 's': {
switch (buf[7]) {
case 'h': {
switch (buf[8]) {
case 'l':
if (op == "i16x8.shl"sv) { return makeSIMDShift(s, SIMDShiftOp::ShlVecI16x8); }
goto parse_error;
case 'r': {
switch (buf[10]) {
case 's':
if (op == "i16x8.shr_s"sv) { return makeSIMDShift(s, SIMDShiftOp::ShrSVecI16x8); }
goto parse_error;
case 'u':
if (op == "i16x8.shr_u"sv) { return makeSIMDShift(s, SIMDShiftOp::ShrUVecI16x8); }
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'p':
if (op == "i16x8.splat"sv) { return makeUnary(s, UnaryOp::SplatVecI16x8); }
goto parse_error;
case 'u': {
switch (buf[9]) {
case '\0':
if (op == "i16x8.sub"sv) { return makeBinary(s, BinaryOp::SubVecI16x8); }
goto parse_error;
case '_': {
switch (buf[14]) {
case 's':
if (op == "i16x8.sub_sat_s"sv) { return makeBinary(s, BinaryOp::SubSatSVecI16x8); }
goto parse_error;
case 'u':
if (op == "i16x8.sub_sat_u"sv) { return makeBinary(s, BinaryOp::SubSatUVecI16x8); }
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case '3': {
switch (buf[2]) {
case '1': {
switch (buf[4]) {
case 'g': {
switch (buf[8]) {
case 's':
if (op == "i31.get_s"sv) { return makeI31Get(s, true); }
goto parse_error;
case 'u':
if (op == "i31.get_u"sv) { return makeI31Get(s, false); }
goto parse_error;
default: goto parse_error;
}
}
case 'n':
if (op == "i31.new"sv) { return makeI31New(s); }
goto parse_error;
default: goto parse_error;
}
}
case '2': {
switch (buf[3]) {
case '.': {
switch (buf[4]) {
case 'a': {
switch (buf[5]) {
case 'd':
if (op == "i32.add"sv) { return makeBinary(s, BinaryOp::AddInt32); }
goto parse_error;
case 'n':
if (op == "i32.and"sv) { return makeBinary(s, BinaryOp::AndInt32); }
goto parse_error;
case 't': {
switch (buf[11]) {
case 'l': {
switch (buf[15]) {
case '\0':
if (op == "i32.atomic.load"sv) { return makeLoad(s, Type::i32, /*signed=*/false, 4, /*isAtomic=*/true); }
goto parse_error;
case '1':
if (op == "i32.atomic.load16_u"sv) { return makeLoad(s, Type::i32, /*signed=*/false, 2, /*isAtomic=*/true); }
goto parse_error;
case '8':
if (op == "i32.atomic.load8_u"sv) { return makeLoad(s, Type::i32, /*signed=*/false, 1, /*isAtomic=*/true); }
goto parse_error;
default: goto parse_error;
}
}
case 'r': {
switch (buf[14]) {
case '.': {
switch (buf[15]) {
case 'a': {
switch (buf[16]) {
case 'd':
if (op == "i32.atomic.rmw.add"sv) { return makeAtomicRMW(s, AtomicRMWOp::RMWAdd, Type::i32, 4); }
goto parse_error;
case 'n':
if (op == "i32.atomic.rmw.and"sv) { return makeAtomicRMW(s, AtomicRMWOp::RMWAnd, Type::i32, 4); }
goto parse_error;
default: goto parse_error;
}
}
case 'c':
if (op == "i32.atomic.rmw.cmpxchg"sv) { return makeAtomicCmpxchg(s, Type::i32, 4); }
goto parse_error;
case 'o':
if (op == "i32.atomic.rmw.or"sv) { return makeAtomicRMW(s, AtomicRMWOp::RMWOr, Type::i32, 4); }
goto parse_error;
case 's':
if (op == "i32.atomic.rmw.sub"sv) { return makeAtomicRMW(s, AtomicRMWOp::RMWSub, Type::i32, 4); }
goto parse_error;
case 'x': {
switch (buf[16]) {
case 'c':
if (op == "i32.atomic.rmw.xchg"sv) { return makeAtomicRMW(s, AtomicRMWOp::RMWXchg, Type::i32, 4); }
goto parse_error;
case 'o':
if (op == "i32.atomic.rmw.xor"sv) { return makeAtomicRMW(s, AtomicRMWOp::RMWXor, Type::i32, 4); }
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case '1': {
switch (buf[17]) {
case 'a': {
switch (buf[18]) {
case 'd':
if (op == "i32.atomic.rmw16.add_u"sv) { return makeAtomicRMW(s, AtomicRMWOp::RMWAdd, Type::i32, 2); }
goto parse_error;
case 'n':
if (op == "i32.atomic.rmw16.and_u"sv) { return makeAtomicRMW(s, AtomicRMWOp::RMWAnd, Type::i32, 2); }
goto parse_error;
default: goto parse_error;
}
}
case 'c':
if (op == "i32.atomic.rmw16.cmpxchg_u"sv) { return makeAtomicCmpxchg(s, Type::i32, 2); }
goto parse_error;
case 'o':
if (op == "i32.atomic.rmw16.or_u"sv) { return makeAtomicRMW(s, AtomicRMWOp::RMWOr, Type::i32, 2); }
goto parse_error;
case 's':
if (op == "i32.atomic.rmw16.sub_u"sv) { return makeAtomicRMW(s, AtomicRMWOp::RMWSub, Type::i32, 2); }
goto parse_error;
case 'x': {
switch (buf[18]) {
case 'c':
if (op == "i32.atomic.rmw16.xchg_u"sv) { return makeAtomicRMW(s, AtomicRMWOp::RMWXchg, Type::i32, 2); }
goto parse_error;
case 'o':
if (op == "i32.atomic.rmw16.xor_u"sv) { return makeAtomicRMW(s, AtomicRMWOp::RMWXor, Type::i32, 2); }
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case '8': {
switch (buf[16]) {
case 'a': {
switch (buf[17]) {
case 'd':
if (op == "i32.atomic.rmw8.add_u"sv) { return makeAtomicRMW(s, AtomicRMWOp::RMWAdd, Type::i32, 1); }
goto parse_error;
case 'n':
if (op == "i32.atomic.rmw8.and_u"sv) { return makeAtomicRMW(s, AtomicRMWOp::RMWAnd, Type::i32, 1); }
goto parse_error;
default: goto parse_error;
}
}
case 'c':
if (op == "i32.atomic.rmw8.cmpxchg_u"sv) { return makeAtomicCmpxchg(s, Type::i32, 1); }
goto parse_error;
case 'o':
if (op == "i32.atomic.rmw8.or_u"sv) { return makeAtomicRMW(s, AtomicRMWOp::RMWOr, Type::i32, 1); }
goto parse_error;
case 's':
if (op == "i32.atomic.rmw8.sub_u"sv) { return makeAtomicRMW(s, AtomicRMWOp::RMWSub, Type::i32, 1); }
goto parse_error;
case 'x': {
switch (buf[17]) {
case 'c':
if (op == "i32.atomic.rmw8.xchg_u"sv) { return makeAtomicRMW(s, AtomicRMWOp::RMWXchg, Type::i32, 1); }
goto parse_error;
case 'o':
if (op == "i32.atomic.rmw8.xor_u"sv) { return makeAtomicRMW(s, AtomicRMWOp::RMWXor, Type::i32, 1); }
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 's': {
switch (buf[16]) {
case '\0':
if (op == "i32.atomic.store"sv) { return makeStore(s, Type::i32, 4, /*isAtomic=*/true); }
goto parse_error;
case '1':
if (op == "i32.atomic.store16"sv) { return makeStore(s, Type::i32, 2, /*isAtomic=*/true); }
goto parse_error;
case '8':
if (op == "i32.atomic.store8"sv) { return makeStore(s, Type::i32, 1, /*isAtomic=*/true); }
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'c': {
switch (buf[5]) {
case 'l':
if (op == "i32.clz"sv) { return makeUnary(s, UnaryOp::ClzInt32); }
goto parse_error;
case 'o':
if (op == "i32.const"sv) { return makeConst(s, Type::i32); }
goto parse_error;
case 't':
if (op == "i32.ctz"sv) { return makeUnary(s, UnaryOp::CtzInt32); }
goto parse_error;
default: goto parse_error;
}
}
case 'd': {
switch (buf[8]) {
case 's':
if (op == "i32.div_s"sv) { return makeBinary(s, BinaryOp::DivSInt32); }
goto parse_error;
case 'u':
if (op == "i32.div_u"sv) { return makeBinary(s, BinaryOp::DivUInt32); }
goto parse_error;
default: goto parse_error;
}
}
case 'e': {
switch (buf[5]) {
case 'q': {
switch (buf[6]) {
case '\0':
if (op == "i32.eq"sv) { return makeBinary(s, BinaryOp::EqInt32); }
goto parse_error;
case 'z':
if (op == "i32.eqz"sv) { return makeUnary(s, UnaryOp::EqZInt32); }
goto parse_error;
default: goto parse_error;
}
}
case 'x': {
switch (buf[10]) {
case '1':
if (op == "i32.extend16_s"sv) { return makeUnary(s, UnaryOp::ExtendS16Int32); }
goto parse_error;
case '8':
if (op == "i32.extend8_s"sv) { return makeUnary(s, UnaryOp::ExtendS8Int32); }
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'g': {
switch (buf[5]) {
case 'e': {
switch (buf[7]) {
case 's':
if (op == "i32.ge_s"sv) { return makeBinary(s, BinaryOp::GeSInt32); }
goto parse_error;
case 'u':
if (op == "i32.ge_u"sv) { return makeBinary(s, BinaryOp::GeUInt32); }
goto parse_error;
default: goto parse_error;
}
}
case 't': {
switch (buf[7]) {
case 's':
if (op == "i32.gt_s"sv) { return makeBinary(s, BinaryOp::GtSInt32); }
goto parse_error;
case 'u':
if (op == "i32.gt_u"sv) { return makeBinary(s, BinaryOp::GtUInt32); }
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'l': {
switch (buf[5]) {
case 'e': {
switch (buf[7]) {
case 's':
if (op == "i32.le_s"sv) { return makeBinary(s, BinaryOp::LeSInt32); }
goto parse_error;
case 'u':
if (op == "i32.le_u"sv) { return makeBinary(s, BinaryOp::LeUInt32); }
goto parse_error;
default: goto parse_error;
}
}
case 'o': {
switch (buf[8]) {
case '\0':
if (op == "i32.load"sv) { return makeLoad(s, Type::i32, /*signed=*/false, 4, /*isAtomic=*/false); }
goto parse_error;
case '1': {
switch (buf[11]) {
case 's':
if (op == "i32.load16_s"sv) { return makeLoad(s, Type::i32, /*signed=*/true, 2, /*isAtomic=*/false); }
goto parse_error;
case 'u':
if (op == "i32.load16_u"sv) { return makeLoad(s, Type::i32, /*signed=*/false, 2, /*isAtomic=*/false); }
goto parse_error;
default: goto parse_error;
}
}
case '8': {
switch (buf[10]) {
case 's':
if (op == "i32.load8_s"sv) { return makeLoad(s, Type::i32, /*signed=*/true, 1, /*isAtomic=*/false); }
goto parse_error;
case 'u':
if (op == "i32.load8_u"sv) { return makeLoad(s, Type::i32, /*signed=*/false, 1, /*isAtomic=*/false); }
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 't': {
switch (buf[7]) {
case 's':
if (op == "i32.lt_s"sv) { return makeBinary(s, BinaryOp::LtSInt32); }
goto parse_error;
case 'u':
if (op == "i32.lt_u"sv) { return makeBinary(s, BinaryOp::LtUInt32); }
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'm':
if (op == "i32.mul"sv) { return makeBinary(s, BinaryOp::MulInt32); }
goto parse_error;
case 'n':
if (op == "i32.ne"sv) { return makeBinary(s, BinaryOp::NeInt32); }
goto parse_error;
case 'o':
if (op == "i32.or"sv) { return makeBinary(s, BinaryOp::OrInt32); }
goto parse_error;
case 'p':
if (op == "i32.popcnt"sv) { return makeUnary(s, UnaryOp::PopcntInt32); }
goto parse_error;
case 'r': {
switch (buf[5]) {
case 'e': {
switch (buf[6]) {
case 'i':
if (op == "i32.reinterpret_f32"sv) { return makeUnary(s, UnaryOp::ReinterpretFloat32); }
goto parse_error;
case 'm': {
switch (buf[8]) {
case 's':
if (op == "i32.rem_s"sv) { return makeBinary(s, BinaryOp::RemSInt32); }
goto parse_error;
case 'u':
if (op == "i32.rem_u"sv) { return makeBinary(s, BinaryOp::RemUInt32); }
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'o': {
switch (buf[7]) {
case 'l':
if (op == "i32.rotl"sv) { return makeBinary(s, BinaryOp::RotLInt32); }
goto parse_error;
case 'r':
if (op == "i32.rotr"sv) { return makeBinary(s, BinaryOp::RotRInt32); }
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 's': {
switch (buf[5]) {
case 'h': {
switch (buf[6]) {
case 'l':
if (op == "i32.shl"sv) { return makeBinary(s, BinaryOp::ShlInt32); }
goto parse_error;
case 'r': {
switch (buf[8]) {
case 's':
if (op == "i32.shr_s"sv) { return makeBinary(s, BinaryOp::ShrSInt32); }
goto parse_error;
case 'u':
if (op == "i32.shr_u"sv) { return makeBinary(s, BinaryOp::ShrUInt32); }
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 't': {
switch (buf[9]) {
case '\0':
if (op == "i32.store"sv) { return makeStore(s, Type::i32, 4, /*isAtomic=*/false); }
goto parse_error;
case '1':
if (op == "i32.store16"sv) { return makeStore(s, Type::i32, 2, /*isAtomic=*/false); }
goto parse_error;
case '8':
if (op == "i32.store8"sv) { return makeStore(s, Type::i32, 1, /*isAtomic=*/false); }
goto parse_error;
default: goto parse_error;
}
}
case 'u':
if (op == "i32.sub"sv) { return makeBinary(s, BinaryOp::SubInt32); }
goto parse_error;
default: goto parse_error;
}
}
case 't': {
switch (buf[10]) {
case 'f': {
switch (buf[11]) {
case '3': {
switch (buf[14]) {
case 's':
if (op == "i32.trunc_f32_s"sv) { return makeUnary(s, UnaryOp::TruncSFloat32ToInt32); }
goto parse_error;
case 'u':
if (op == "i32.trunc_f32_u"sv) { return makeUnary(s, UnaryOp::TruncUFloat32ToInt32); }
goto parse_error;
default: goto parse_error;
}
}
case '6': {
switch (buf[14]) {
case 's':
if (op == "i32.trunc_f64_s"sv) { return makeUnary(s, UnaryOp::TruncSFloat64ToInt32); }
goto parse_error;
case 'u':
if (op == "i32.trunc_f64_u"sv) { return makeUnary(s, UnaryOp::TruncUFloat64ToInt32); }
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 's': {
switch (buf[15]) {
case '3': {
switch (buf[18]) {
case 's':
if (op == "i32.trunc_sat_f32_s"sv) { return makeUnary(s, UnaryOp::TruncSatSFloat32ToInt32); }
goto parse_error;
case 'u':
if (op == "i32.trunc_sat_f32_u"sv) { return makeUnary(s, UnaryOp::TruncSatUFloat32ToInt32); }
goto parse_error;
default: goto parse_error;
}
}
case '6': {
switch (buf[18]) {
case 's':
if (op == "i32.trunc_sat_f64_s"sv) { return makeUnary(s, UnaryOp::TruncSatSFloat64ToInt32); }
goto parse_error;
case 'u':
if (op == "i32.trunc_sat_f64_u"sv) { return makeUnary(s, UnaryOp::TruncSatUFloat64ToInt32); }
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'w':
if (op == "i32.wrap_i64"sv) { return makeUnary(s, UnaryOp::WrapInt64); }
goto parse_error;
case 'x':
if (op == "i32.xor"sv) { return makeBinary(s, BinaryOp::XorInt32); }
goto parse_error;
default: goto parse_error;
}
}
case 'x': {
switch (buf[6]) {
case 'a': {
switch (buf[7]) {
case 'b':
if (op == "i32x4.abs"sv) { return makeUnary(s, UnaryOp::AbsVecI32x4); }
goto parse_error;
case 'd':
if (op == "i32x4.add"sv) { return makeBinary(s, BinaryOp::AddVecI32x4); }
goto parse_error;
case 'l':
if (op == "i32x4.all_true"sv) { return makeUnary(s, UnaryOp::AllTrueVecI32x4); }
goto parse_error;
default: goto parse_error;
}
}
case 'b':
if (op == "i32x4.bitmask"sv) { return makeUnary(s, UnaryOp::BitmaskVecI32x4); }
goto parse_error;
case 'd': {
switch (buf[11]) {
case '1':
if (op == "i32x4.dot_i16x8_s"sv) { return makeBinary(s, BinaryOp::DotSVecI16x8ToVecI32x4); }
goto parse_error;
case '8':
if (op == "i32x4.dot_i8x16_i7x16_add_s"sv) { return makeSIMDTernary(s, SIMDTernaryOp::DotI8x16I7x16AddSToVecI32x4); }
goto parse_error;
default: goto parse_error;
}
}
case 'e': {
switch (buf[7]) {
case 'q':
if (op == "i32x4.eq"sv) { return makeBinary(s, BinaryOp::EqVecI32x4); }
goto parse_error;
case 'x': {
switch (buf[9]) {
case 'a': {
switch (buf[28]) {
case 's':
if (op == "i32x4.extadd_pairwise_i16x8_s"sv) { return makeUnary(s, UnaryOp::ExtAddPairwiseSVecI16x8ToI32x4); }
goto parse_error;
case 'u':
if (op == "i32x4.extadd_pairwise_i16x8_u"sv) { return makeUnary(s, UnaryOp::ExtAddPairwiseUVecI16x8ToI32x4); }
goto parse_error;
default: goto parse_error;
}
}
case 'e': {
switch (buf[13]) {
case 'h': {
switch (buf[24]) {
case 's':
if (op == "i32x4.extend_high_i16x8_s"sv) { return makeUnary(s, UnaryOp::ExtendHighSVecI16x8ToVecI32x4); }
goto parse_error;
case 'u':
if (op == "i32x4.extend_high_i16x8_u"sv) { return makeUnary(s, UnaryOp::ExtendHighUVecI16x8ToVecI32x4); }
goto parse_error;
default: goto parse_error;
}
}
case 'l': {
switch (buf[23]) {
case 's':
if (op == "i32x4.extend_low_i16x8_s"sv) { return makeUnary(s, UnaryOp::ExtendLowSVecI16x8ToVecI32x4); }
goto parse_error;
case 'u':
if (op == "i32x4.extend_low_i16x8_u"sv) { return makeUnary(s, UnaryOp::ExtendLowUVecI16x8ToVecI32x4); }
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'm': {
switch (buf[13]) {
case 'h': {
switch (buf[24]) {
case 's':
if (op == "i32x4.extmul_high_i16x8_s"sv) { return makeBinary(s, BinaryOp::ExtMulHighSVecI32x4); }
goto parse_error;
case 'u':
if (op == "i32x4.extmul_high_i16x8_u"sv) { return makeBinary(s, BinaryOp::ExtMulHighUVecI32x4); }
goto parse_error;
default: goto parse_error;
}
}
case 'l': {
switch (buf[23]) {
case 's':
if (op == "i32x4.extmul_low_i16x8_s"sv) { return makeBinary(s, BinaryOp::ExtMulLowSVecI32x4); }
goto parse_error;
case 'u':
if (op == "i32x4.extmul_low_i16x8_u"sv) { return makeBinary(s, BinaryOp::ExtMulLowUVecI32x4); }
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'r':
if (op == "i32x4.extract_lane"sv) { return makeSIMDExtract(s, SIMDExtractOp::ExtractLaneVecI32x4, 4); }
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'g': {
switch (buf[7]) {
case 'e': {
switch (buf[9]) {
case 's':
if (op == "i32x4.ge_s"sv) { return makeBinary(s, BinaryOp::GeSVecI32x4); }
goto parse_error;
case 'u':
if (op == "i32x4.ge_u"sv) { return makeBinary(s, BinaryOp::GeUVecI32x4); }
goto parse_error;
default: goto parse_error;
}
}
case 't': {
switch (buf[9]) {
case 's':
if (op == "i32x4.gt_s"sv) { return makeBinary(s, BinaryOp::GtSVecI32x4); }
goto parse_error;
case 'u':
if (op == "i32x4.gt_u"sv) { return makeBinary(s, BinaryOp::GtUVecI32x4); }
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'l': {
switch (buf[7]) {
case 'a':
if (op == "i32x4.laneselect"sv) { return makeSIMDTernary(s, SIMDTernaryOp::LaneselectI32x4); }
goto parse_error;
case 'e': {
switch (buf[9]) {
case 's':
if (op == "i32x4.le_s"sv) { return makeBinary(s, BinaryOp::LeSVecI32x4); }
goto parse_error;
case 'u':
if (op == "i32x4.le_u"sv) { return makeBinary(s, BinaryOp::LeUVecI32x4); }
goto parse_error;
default: goto parse_error;
}
}
case 't': {
switch (buf[9]) {
case 's':
if (op == "i32x4.lt_s"sv) { return makeBinary(s, BinaryOp::LtSVecI32x4); }
goto parse_error;
case 'u':
if (op == "i32x4.lt_u"sv) { return makeBinary(s, BinaryOp::LtUVecI32x4); }
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'm': {
switch (buf[7]) {
case 'a': {
switch (buf[10]) {
case 's':
if (op == "i32x4.max_s"sv) { return makeBinary(s, BinaryOp::MaxSVecI32x4); }
goto parse_error;
case 'u':
if (op == "i32x4.max_u"sv) { return makeBinary(s, BinaryOp::MaxUVecI32x4); }
goto parse_error;
default: goto parse_error;
}
}
case 'i': {
switch (buf[10]) {
case 's':
if (op == "i32x4.min_s"sv) { return makeBinary(s, BinaryOp::MinSVecI32x4); }
goto parse_error;
case 'u':
if (op == "i32x4.min_u"sv) { return makeBinary(s, BinaryOp::MinUVecI32x4); }
goto parse_error;
default: goto parse_error;
}
}
case 'u':
if (op == "i32x4.mul"sv) { return makeBinary(s, BinaryOp::MulVecI32x4); }
goto parse_error;
default: goto parse_error;
}
}
case 'n': {
switch (buf[8]) {
case '\0':
if (op == "i32x4.ne"sv) { return makeBinary(s, BinaryOp::NeVecI32x4); }
goto parse_error;
case 'g':
if (op == "i32x4.neg"sv) { return makeUnary(s, UnaryOp::NegVecI32x4); }
goto parse_error;
default: goto parse_error;
}
}
case 'r': {
switch (buf[8]) {
case 'l': {
switch (buf[21]) {
case '3': {
switch (buf[26]) {
case 's':
if (op == "i32x4.relaxed_trunc_f32x4_s"sv) { return makeUnary(s, UnaryOp::RelaxedTruncSVecF32x4ToVecI32x4); }
goto parse_error;
case 'u':
if (op == "i32x4.relaxed_trunc_f32x4_u"sv) { return makeUnary(s, UnaryOp::RelaxedTruncUVecF32x4ToVecI32x4); }
goto parse_error;
default: goto parse_error;
}
}
case '6': {
switch (buf[26]) {
case 's':
if (op == "i32x4.relaxed_trunc_f64x2_s_zero"sv) { return makeUnary(s, UnaryOp::RelaxedTruncZeroSVecF64x2ToVecI32x4); }
goto parse_error;
case 'u':
if (op == "i32x4.relaxed_trunc_f64x2_u_zero"sv) { return makeUnary(s, UnaryOp::RelaxedTruncZeroUVecF64x2ToVecI32x4); }
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'p':
if (op == "i32x4.replace_lane"sv) { return makeSIMDReplace(s, SIMDReplaceOp::ReplaceLaneVecI32x4, 4); }
goto parse_error;
default: goto parse_error;
}
}
case 's': {
switch (buf[7]) {
case 'h': {
switch (buf[8]) {
case 'l':
if (op == "i32x4.shl"sv) { return makeSIMDShift(s, SIMDShiftOp::ShlVecI32x4); }
goto parse_error;
case 'r': {
switch (buf[10]) {
case 's':
if (op == "i32x4.shr_s"sv) { return makeSIMDShift(s, SIMDShiftOp::ShrSVecI32x4); }
goto parse_error;
case 'u':
if (op == "i32x4.shr_u"sv) { return makeSIMDShift(s, SIMDShiftOp::ShrUVecI32x4); }
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'p':
if (op == "i32x4.splat"sv) { return makeUnary(s, UnaryOp::SplatVecI32x4); }
goto parse_error;
case 'u':
if (op == "i32x4.sub"sv) { return makeBinary(s, BinaryOp::SubVecI32x4); }
goto parse_error;
default: goto parse_error;
}
}
case 't': {
switch (buf[17]) {
case '3': {
switch (buf[22]) {
case 's':
if (op == "i32x4.trunc_sat_f32x4_s"sv) { return makeUnary(s, UnaryOp::TruncSatSVecF32x4ToVecI32x4); }
goto parse_error;
case 'u':
if (op == "i32x4.trunc_sat_f32x4_u"sv) { return makeUnary(s, UnaryOp::TruncSatUVecF32x4ToVecI32x4); }
goto parse_error;
default: goto parse_error;
}
}
case '6': {
switch (buf[22]) {
case 's':
if (op == "i32x4.trunc_sat_f64x2_s_zero"sv) { return makeUnary(s, UnaryOp::TruncSatZeroSVecF64x2ToVecI32x4); }
goto parse_error;
case 'u':
if (op == "i32x4.trunc_sat_f64x2_u_zero"sv) { return makeUnary(s, UnaryOp::TruncSatZeroUVecF64x2ToVecI32x4); }
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
default: goto parse_error;
}
}
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case '6': {
switch (buf[3]) {
case '.': {
switch (buf[4]) {
case 'a': {
switch (buf[5]) {
case 'd':
if (op == "i64.add"sv) { return makeBinary(s, BinaryOp::AddInt64); }
goto parse_error;
case 'n':
if (op == "i64.and"sv) { return makeBinary(s, BinaryOp::AndInt64); }
goto parse_error;
case 't': {
switch (buf[11]) {
case 'l': {
switch (buf[15]) {
case '\0':
if (op == "i64.atomic.load"sv) { return makeLoad(s, Type::i64, /*signed=*/false, 8, /*isAtomic=*/true); }
goto parse_error;
case '1':
if (op == "i64.atomic.load16_u"sv) { return makeLoad(s, Type::i64, /*signed=*/false, 2, /*isAtomic=*/true); }
goto parse_error;
case '3':
if (op == "i64.atomic.load32_u"sv) { return makeLoad(s, Type::i64, /*signed=*/false, 4, /*isAtomic=*/true); }
goto parse_error;
case '8':
if (op == "i64.atomic.load8_u"sv) { return makeLoad(s, Type::i64, /*signed=*/false, 1, /*isAtomic=*/true); }
goto parse_error;
default: goto parse_error;
}
}
case 'r': {
switch (buf[14]) {
case '.': {
switch (buf[15]) {
case 'a': {
switch (buf[16]) {
case 'd':
if (op == "i64.atomic.rmw.add"sv) { return makeAtomicRMW(s, AtomicRMWOp::RMWAdd, Type::i64, 8); }
goto parse_error;
case 'n':
if (op == "i64.atomic.rmw.and"sv) { return makeAtomicRMW(s, AtomicRMWOp::RMWAnd, Type::i64, 8); }
goto parse_error;
default: goto parse_error;
}
}
case 'c':
if (op == "i64.atomic.rmw.cmpxchg"sv) { return makeAtomicCmpxchg(s, Type::i64, 8); }
goto parse_error;
case 'o':
if (op == "i64.atomic.rmw.or"sv) { return makeAtomicRMW(s, AtomicRMWOp::RMWOr, Type::i64, 8); }
goto parse_error;
case 's':
if (op == "i64.atomic.rmw.sub"sv) { return makeAtomicRMW(s, AtomicRMWOp::RMWSub, Type::i64, 8); }
goto parse_error;
case 'x': {
switch (buf[16]) {
case 'c':
if (op == "i64.atomic.rmw.xchg"sv) { return makeAtomicRMW(s, AtomicRMWOp::RMWXchg, Type::i64, 8); }
goto parse_error;
case 'o':
if (op == "i64.atomic.rmw.xor"sv) { return makeAtomicRMW(s, AtomicRMWOp::RMWXor, Type::i64, 8); }
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case '1': {
switch (buf[17]) {
case 'a': {
switch (buf[18]) {
case 'd':
if (op == "i64.atomic.rmw16.add_u"sv) { return makeAtomicRMW(s, AtomicRMWOp::RMWAdd, Type::i64, 2); }
goto parse_error;
case 'n':
if (op == "i64.atomic.rmw16.and_u"sv) { return makeAtomicRMW(s, AtomicRMWOp::RMWAnd, Type::i64, 2); }
goto parse_error;
default: goto parse_error;
}
}
case 'c':
if (op == "i64.atomic.rmw16.cmpxchg_u"sv) { return makeAtomicCmpxchg(s, Type::i64, 2); }
goto parse_error;
case 'o':
if (op == "i64.atomic.rmw16.or_u"sv) { return makeAtomicRMW(s, AtomicRMWOp::RMWOr, Type::i64, 2); }
goto parse_error;
case 's':
if (op == "i64.atomic.rmw16.sub_u"sv) { return makeAtomicRMW(s, AtomicRMWOp::RMWSub, Type::i64, 2); }
goto parse_error;
case 'x': {
switch (buf[18]) {
case 'c':
if (op == "i64.atomic.rmw16.xchg_u"sv) { return makeAtomicRMW(s, AtomicRMWOp::RMWXchg, Type::i64, 2); }
goto parse_error;
case 'o':
if (op == "i64.atomic.rmw16.xor_u"sv) { return makeAtomicRMW(s, AtomicRMWOp::RMWXor, Type::i64, 2); }
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case '3': {
switch (buf[17]) {
case 'a': {
switch (buf[18]) {
case 'd':
if (op == "i64.atomic.rmw32.add_u"sv) { return makeAtomicRMW(s, AtomicRMWOp::RMWAdd, Type::i64, 4); }
goto parse_error;
case 'n':
if (op == "i64.atomic.rmw32.and_u"sv) { return makeAtomicRMW(s, AtomicRMWOp::RMWAnd, Type::i64, 4); }
goto parse_error;
default: goto parse_error;
}
}
case 'c':
if (op == "i64.atomic.rmw32.cmpxchg_u"sv) { return makeAtomicCmpxchg(s, Type::i64, 4); }
goto parse_error;
case 'o':
if (op == "i64.atomic.rmw32.or_u"sv) { return makeAtomicRMW(s, AtomicRMWOp::RMWOr, Type::i64, 4); }
goto parse_error;
case 's':
if (op == "i64.atomic.rmw32.sub_u"sv) { return makeAtomicRMW(s, AtomicRMWOp::RMWSub, Type::i64, 4); }
goto parse_error;
case 'x': {
switch (buf[18]) {
case 'c':
if (op == "i64.atomic.rmw32.xchg_u"sv) { return makeAtomicRMW(s, AtomicRMWOp::RMWXchg, Type::i64, 4); }
goto parse_error;
case 'o':
if (op == "i64.atomic.rmw32.xor_u"sv) { return makeAtomicRMW(s, AtomicRMWOp::RMWXor, Type::i64, 4); }
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case '8': {
switch (buf[16]) {
case 'a': {
switch (buf[17]) {
case 'd':
if (op == "i64.atomic.rmw8.add_u"sv) { return makeAtomicRMW(s, AtomicRMWOp::RMWAdd, Type::i64, 1); }
goto parse_error;
case 'n':
if (op == "i64.atomic.rmw8.and_u"sv) { return makeAtomicRMW(s, AtomicRMWOp::RMWAnd, Type::i64, 1); }
goto parse_error;
default: goto parse_error;
}
}
case 'c':
if (op == "i64.atomic.rmw8.cmpxchg_u"sv) { return makeAtomicCmpxchg(s, Type::i64, 1); }
goto parse_error;
case 'o':
if (op == "i64.atomic.rmw8.or_u"sv) { return makeAtomicRMW(s, AtomicRMWOp::RMWOr, Type::i64, 1); }
goto parse_error;
case 's':
if (op == "i64.atomic.rmw8.sub_u"sv) { return makeAtomicRMW(s, AtomicRMWOp::RMWSub, Type::i64, 1); }
goto parse_error;
case 'x': {
switch (buf[17]) {
case 'c':
if (op == "i64.atomic.rmw8.xchg_u"sv) { return makeAtomicRMW(s, AtomicRMWOp::RMWXchg, Type::i64, 1); }
goto parse_error;
case 'o':
if (op == "i64.atomic.rmw8.xor_u"sv) { return makeAtomicRMW(s, AtomicRMWOp::RMWXor, Type::i64, 1); }
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 's': {
switch (buf[16]) {
case '\0':
if (op == "i64.atomic.store"sv) { return makeStore(s, Type::i64, 8, /*isAtomic=*/true); }
goto parse_error;
case '1':
if (op == "i64.atomic.store16"sv) { return makeStore(s, Type::i64, 2, /*isAtomic=*/true); }
goto parse_error;
case '3':
if (op == "i64.atomic.store32"sv) { return makeStore(s, Type::i64, 4, /*isAtomic=*/true); }
goto parse_error;
case '8':
if (op == "i64.atomic.store8"sv) { return makeStore(s, Type::i64, 1, /*isAtomic=*/true); }
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'c': {
switch (buf[5]) {
case 'l':
if (op == "i64.clz"sv) { return makeUnary(s, UnaryOp::ClzInt64); }
goto parse_error;
case 'o':
if (op == "i64.const"sv) { return makeConst(s, Type::i64); }
goto parse_error;
case 't':
if (op == "i64.ctz"sv) { return makeUnary(s, UnaryOp::CtzInt64); }
goto parse_error;
default: goto parse_error;
}
}
case 'd': {
switch (buf[8]) {
case 's':
if (op == "i64.div_s"sv) { return makeBinary(s, BinaryOp::DivSInt64); }
goto parse_error;
case 'u':
if (op == "i64.div_u"sv) { return makeBinary(s, BinaryOp::DivUInt64); }
goto parse_error;
default: goto parse_error;
}
}
case 'e': {
switch (buf[5]) {
case 'q': {
switch (buf[6]) {
case '\0':
if (op == "i64.eq"sv) { return makeBinary(s, BinaryOp::EqInt64); }
goto parse_error;
case 'z':
if (op == "i64.eqz"sv) { return makeUnary(s, UnaryOp::EqZInt64); }
goto parse_error;
default: goto parse_error;
}
}
case 'x': {
switch (buf[10]) {
case '1':
if (op == "i64.extend16_s"sv) { return makeUnary(s, UnaryOp::ExtendS16Int64); }
goto parse_error;
case '3':
if (op == "i64.extend32_s"sv) { return makeUnary(s, UnaryOp::ExtendS32Int64); }
goto parse_error;
case '8':
if (op == "i64.extend8_s"sv) { return makeUnary(s, UnaryOp::ExtendS8Int64); }
goto parse_error;
case '_': {
switch (buf[15]) {
case 's':
if (op == "i64.extend_i32_s"sv) { return makeUnary(s, UnaryOp::ExtendSInt32); }
goto parse_error;
case 'u':
if (op == "i64.extend_i32_u"sv) { return makeUnary(s, UnaryOp::ExtendUInt32); }
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'g': {
switch (buf[5]) {
case 'e': {
switch (buf[7]) {
case 's':
if (op == "i64.ge_s"sv) { return makeBinary(s, BinaryOp::GeSInt64); }
goto parse_error;
case 'u':
if (op == "i64.ge_u"sv) { return makeBinary(s, BinaryOp::GeUInt64); }
goto parse_error;
default: goto parse_error;
}
}
case 't': {
switch (buf[7]) {
case 's':
if (op == "i64.gt_s"sv) { return makeBinary(s, BinaryOp::GtSInt64); }
goto parse_error;
case 'u':
if (op == "i64.gt_u"sv) { return makeBinary(s, BinaryOp::GtUInt64); }
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'l': {
switch (buf[5]) {
case 'e': {
switch (buf[7]) {
case 's':
if (op == "i64.le_s"sv) { return makeBinary(s, BinaryOp::LeSInt64); }
goto parse_error;
case 'u':
if (op == "i64.le_u"sv) { return makeBinary(s, BinaryOp::LeUInt64); }
goto parse_error;
default: goto parse_error;
}
}
case 'o': {
switch (buf[8]) {
case '\0':
if (op == "i64.load"sv) { return makeLoad(s, Type::i64, /*signed=*/false, 8, /*isAtomic=*/false); }
goto parse_error;
case '1': {
switch (buf[11]) {
case 's':
if (op == "i64.load16_s"sv) { return makeLoad(s, Type::i64, /*signed=*/true, 2, /*isAtomic=*/false); }
goto parse_error;
case 'u':
if (op == "i64.load16_u"sv) { return makeLoad(s, Type::i64, /*signed=*/false, 2, /*isAtomic=*/false); }
goto parse_error;
default: goto parse_error;
}
}
case '3': {
switch (buf[11]) {
case 's':
if (op == "i64.load32_s"sv) { return makeLoad(s, Type::i64, /*signed=*/true, 4, /*isAtomic=*/false); }
goto parse_error;
case 'u':
if (op == "i64.load32_u"sv) { return makeLoad(s, Type::i64, /*signed=*/false, 4, /*isAtomic=*/false); }
goto parse_error;
default: goto parse_error;
}
}
case '8': {
switch (buf[10]) {
case 's':
if (op == "i64.load8_s"sv) { return makeLoad(s, Type::i64, /*signed=*/true, 1, /*isAtomic=*/false); }
goto parse_error;
case 'u':
if (op == "i64.load8_u"sv) { return makeLoad(s, Type::i64, /*signed=*/false, 1, /*isAtomic=*/false); }
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 't': {
switch (buf[7]) {
case 's':
if (op == "i64.lt_s"sv) { return makeBinary(s, BinaryOp::LtSInt64); }
goto parse_error;
case 'u':
if (op == "i64.lt_u"sv) { return makeBinary(s, BinaryOp::LtUInt64); }
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'm':
if (op == "i64.mul"sv) { return makeBinary(s, BinaryOp::MulInt64); }
goto parse_error;
case 'n':
if (op == "i64.ne"sv) { return makeBinary(s, BinaryOp::NeInt64); }
goto parse_error;
case 'o':
if (op == "i64.or"sv) { return makeBinary(s, BinaryOp::OrInt64); }
goto parse_error;
case 'p':
if (op == "i64.popcnt"sv) { return makeUnary(s, UnaryOp::PopcntInt64); }
goto parse_error;
case 'r': {
switch (buf[5]) {
case 'e': {
switch (buf[6]) {
case 'i':
if (op == "i64.reinterpret_f64"sv) { return makeUnary(s, UnaryOp::ReinterpretFloat64); }
goto parse_error;
case 'm': {
switch (buf[8]) {
case 's':
if (op == "i64.rem_s"sv) { return makeBinary(s, BinaryOp::RemSInt64); }
goto parse_error;
case 'u':
if (op == "i64.rem_u"sv) { return makeBinary(s, BinaryOp::RemUInt64); }
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'o': {
switch (buf[7]) {
case 'l':
if (op == "i64.rotl"sv) { return makeBinary(s, BinaryOp::RotLInt64); }
goto parse_error;
case 'r':
if (op == "i64.rotr"sv) { return makeBinary(s, BinaryOp::RotRInt64); }
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 's': {
switch (buf[5]) {
case 'h': {
switch (buf[6]) {
case 'l':
if (op == "i64.shl"sv) { return makeBinary(s, BinaryOp::ShlInt64); }
goto parse_error;
case 'r': {
switch (buf[8]) {
case 's':
if (op == "i64.shr_s"sv) { return makeBinary(s, BinaryOp::ShrSInt64); }
goto parse_error;
case 'u':
if (op == "i64.shr_u"sv) { return makeBinary(s, BinaryOp::ShrUInt64); }
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 't': {
switch (buf[9]) {
case '\0':
if (op == "i64.store"sv) { return makeStore(s, Type::i64, 8, /*isAtomic=*/false); }
goto parse_error;
case '1':
if (op == "i64.store16"sv) { return makeStore(s, Type::i64, 2, /*isAtomic=*/false); }
goto parse_error;
case '3':
if (op == "i64.store32"sv) { return makeStore(s, Type::i64, 4, /*isAtomic=*/false); }
goto parse_error;
case '8':
if (op == "i64.store8"sv) { return makeStore(s, Type::i64, 1, /*isAtomic=*/false); }
goto parse_error;
default: goto parse_error;
}
}
case 'u':
if (op == "i64.sub"sv) { return makeBinary(s, BinaryOp::SubInt64); }
goto parse_error;
default: goto parse_error;
}
}
case 't': {
switch (buf[10]) {
case 'f': {
switch (buf[11]) {
case '3': {
switch (buf[14]) {
case 's':
if (op == "i64.trunc_f32_s"sv) { return makeUnary(s, UnaryOp::TruncSFloat32ToInt64); }
goto parse_error;
case 'u':
if (op == "i64.trunc_f32_u"sv) { return makeUnary(s, UnaryOp::TruncUFloat32ToInt64); }
goto parse_error;
default: goto parse_error;
}
}
case '6': {
switch (buf[14]) {
case 's':
if (op == "i64.trunc_f64_s"sv) { return makeUnary(s, UnaryOp::TruncSFloat64ToInt64); }
goto parse_error;
case 'u':
if (op == "i64.trunc_f64_u"sv) { return makeUnary(s, UnaryOp::TruncUFloat64ToInt64); }
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 's': {
switch (buf[15]) {
case '3': {
switch (buf[18]) {
case 's':
if (op == "i64.trunc_sat_f32_s"sv) { return makeUnary(s, UnaryOp::TruncSatSFloat32ToInt64); }
goto parse_error;
case 'u':
if (op == "i64.trunc_sat_f32_u"sv) { return makeUnary(s, UnaryOp::TruncSatUFloat32ToInt64); }
goto parse_error;
default: goto parse_error;
}
}
case '6': {
switch (buf[18]) {
case 's':
if (op == "i64.trunc_sat_f64_s"sv) { return makeUnary(s, UnaryOp::TruncSatSFloat64ToInt64); }
goto parse_error;
case 'u':
if (op == "i64.trunc_sat_f64_u"sv) { return makeUnary(s, UnaryOp::TruncSatUFloat64ToInt64); }
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'x':
if (op == "i64.xor"sv) { return makeBinary(s, BinaryOp::XorInt64); }
goto parse_error;
default: goto parse_error;
}
}
case 'x': {
switch (buf[6]) {
case 'a': {
switch (buf[7]) {
case 'b':
if (op == "i64x2.abs"sv) { return makeUnary(s, UnaryOp::AbsVecI64x2); }
goto parse_error;
case 'd':
if (op == "i64x2.add"sv) { return makeBinary(s, BinaryOp::AddVecI64x2); }
goto parse_error;
case 'l':
if (op == "i64x2.all_true"sv) { return makeUnary(s, UnaryOp::AllTrueVecI64x2); }
goto parse_error;
default: goto parse_error;
}
}
case 'b':
if (op == "i64x2.bitmask"sv) { return makeUnary(s, UnaryOp::BitmaskVecI64x2); }
goto parse_error;
case 'e': {
switch (buf[7]) {
case 'q':
if (op == "i64x2.eq"sv) { return makeBinary(s, BinaryOp::EqVecI64x2); }
goto parse_error;
case 'x': {
switch (buf[9]) {
case 'e': {
switch (buf[13]) {
case 'h': {
switch (buf[24]) {
case 's':
if (op == "i64x2.extend_high_i32x4_s"sv) { return makeUnary(s, UnaryOp::ExtendHighSVecI32x4ToVecI64x2); }
goto parse_error;
case 'u':
if (op == "i64x2.extend_high_i32x4_u"sv) { return makeUnary(s, UnaryOp::ExtendHighUVecI32x4ToVecI64x2); }
goto parse_error;
default: goto parse_error;
}
}
case 'l': {
switch (buf[23]) {
case 's':
if (op == "i64x2.extend_low_i32x4_s"sv) { return makeUnary(s, UnaryOp::ExtendLowSVecI32x4ToVecI64x2); }
goto parse_error;
case 'u':
if (op == "i64x2.extend_low_i32x4_u"sv) { return makeUnary(s, UnaryOp::ExtendLowUVecI32x4ToVecI64x2); }
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'm': {
switch (buf[13]) {
case 'h': {
switch (buf[24]) {
case 's':
if (op == "i64x2.extmul_high_i32x4_s"sv) { return makeBinary(s, BinaryOp::ExtMulHighSVecI64x2); }
goto parse_error;
case 'u':
if (op == "i64x2.extmul_high_i32x4_u"sv) { return makeBinary(s, BinaryOp::ExtMulHighUVecI64x2); }
goto parse_error;
default: goto parse_error;
}
}
case 'l': {
switch (buf[23]) {
case 's':
if (op == "i64x2.extmul_low_i32x4_s"sv) { return makeBinary(s, BinaryOp::ExtMulLowSVecI64x2); }
goto parse_error;
case 'u':
if (op == "i64x2.extmul_low_i32x4_u"sv) { return makeBinary(s, BinaryOp::ExtMulLowUVecI64x2); }
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'r':
if (op == "i64x2.extract_lane"sv) { return makeSIMDExtract(s, SIMDExtractOp::ExtractLaneVecI64x2, 2); }
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'g': {
switch (buf[7]) {
case 'e':
if (op == "i64x2.ge_s"sv) { return makeBinary(s, BinaryOp::GeSVecI64x2); }
goto parse_error;
case 't':
if (op == "i64x2.gt_s"sv) { return makeBinary(s, BinaryOp::GtSVecI64x2); }
goto parse_error;
default: goto parse_error;
}
}
case 'l': {
switch (buf[7]) {
case 'a':
if (op == "i64x2.laneselect"sv) { return makeSIMDTernary(s, SIMDTernaryOp::LaneselectI64x2); }
goto parse_error;
case 'e':
if (op == "i64x2.le_s"sv) { return makeBinary(s, BinaryOp::LeSVecI64x2); }
goto parse_error;
case 't':
if (op == "i64x2.lt_s"sv) { return makeBinary(s, BinaryOp::LtSVecI64x2); }
goto parse_error;
default: goto parse_error;
}
}
case 'm':
if (op == "i64x2.mul"sv) { return makeBinary(s, BinaryOp::MulVecI64x2); }
goto parse_error;
case 'n': {
switch (buf[8]) {
case '\0':
if (op == "i64x2.ne"sv) { return makeBinary(s, BinaryOp::NeVecI64x2); }
goto parse_error;
case 'g':
if (op == "i64x2.neg"sv) { return makeUnary(s, UnaryOp::NegVecI64x2); }
goto parse_error;
default: goto parse_error;
}
}
case 'r':
if (op == "i64x2.replace_lane"sv) { return makeSIMDReplace(s, SIMDReplaceOp::ReplaceLaneVecI64x2, 2); }
goto parse_error;
case 's': {
switch (buf[7]) {
case 'h': {
switch (buf[8]) {
case 'l':
if (op == "i64x2.shl"sv) { return makeSIMDShift(s, SIMDShiftOp::ShlVecI64x2); }
goto parse_error;
case 'r': {
switch (buf[10]) {
case 's':
if (op == "i64x2.shr_s"sv) { return makeSIMDShift(s, SIMDShiftOp::ShrSVecI64x2); }
goto parse_error;
case 'u':
if (op == "i64x2.shr_u"sv) { return makeSIMDShift(s, SIMDShiftOp::ShrUVecI64x2); }
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'p':
if (op == "i64x2.splat"sv) { return makeUnary(s, UnaryOp::SplatVecI64x2); }
goto parse_error;
case 'u':
if (op == "i64x2.sub"sv) { return makeBinary(s, BinaryOp::SubVecI64x2); }
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case '8': {
switch (buf[6]) {
case 'a': {
switch (buf[7]) {
case 'b':
if (op == "i8x16.abs"sv) { return makeUnary(s, UnaryOp::AbsVecI8x16); }
goto parse_error;
case 'd': {
switch (buf[9]) {
case '\0':
if (op == "i8x16.add"sv) { return makeBinary(s, BinaryOp::AddVecI8x16); }
goto parse_error;
case '_': {
switch (buf[14]) {
case 's':
if (op == "i8x16.add_sat_s"sv) { return makeBinary(s, BinaryOp::AddSatSVecI8x16); }
goto parse_error;
case 'u':
if (op == "i8x16.add_sat_u"sv) { return makeBinary(s, BinaryOp::AddSatUVecI8x16); }
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'l':
if (op == "i8x16.all_true"sv) { return makeUnary(s, UnaryOp::AllTrueVecI8x16); }
goto parse_error;
case 'v':
if (op == "i8x16.avgr_u"sv) { return makeBinary(s, BinaryOp::AvgrUVecI8x16); }
goto parse_error;
default: goto parse_error;
}
}
case 'b':
if (op == "i8x16.bitmask"sv) { return makeUnary(s, UnaryOp::BitmaskVecI8x16); }
goto parse_error;
case 'e': {
switch (buf[7]) {
case 'q':
if (op == "i8x16.eq"sv) { return makeBinary(s, BinaryOp::EqVecI8x16); }
goto parse_error;
case 'x': {
switch (buf[19]) {
case 's':
if (op == "i8x16.extract_lane_s"sv) { return makeSIMDExtract(s, SIMDExtractOp::ExtractLaneSVecI8x16, 16); }
goto parse_error;
case 'u':
if (op == "i8x16.extract_lane_u"sv) { return makeSIMDExtract(s, SIMDExtractOp::ExtractLaneUVecI8x16, 16); }
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'g': {
switch (buf[7]) {
case 'e': {
switch (buf[9]) {
case 's':
if (op == "i8x16.ge_s"sv) { return makeBinary(s, BinaryOp::GeSVecI8x16); }
goto parse_error;
case 'u':
if (op == "i8x16.ge_u"sv) { return makeBinary(s, BinaryOp::GeUVecI8x16); }
goto parse_error;
default: goto parse_error;
}
}
case 't': {
switch (buf[9]) {
case 's':
if (op == "i8x16.gt_s"sv) { return makeBinary(s, BinaryOp::GtSVecI8x16); }
goto parse_error;
case 'u':
if (op == "i8x16.gt_u"sv) { return makeBinary(s, BinaryOp::GtUVecI8x16); }
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'l': {
switch (buf[7]) {
case 'a':
if (op == "i8x16.laneselect"sv) { return makeSIMDTernary(s, SIMDTernaryOp::LaneselectI8x16); }
goto parse_error;
case 'e': {
switch (buf[9]) {
case 's':
if (op == "i8x16.le_s"sv) { return makeBinary(s, BinaryOp::LeSVecI8x16); }
goto parse_error;
case 'u':
if (op == "i8x16.le_u"sv) { return makeBinary(s, BinaryOp::LeUVecI8x16); }
goto parse_error;
default: goto parse_error;
}
}
case 't': {
switch (buf[9]) {
case 's':
if (op == "i8x16.lt_s"sv) { return makeBinary(s, BinaryOp::LtSVecI8x16); }
goto parse_error;
case 'u':
if (op == "i8x16.lt_u"sv) { return makeBinary(s, BinaryOp::LtUVecI8x16); }
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'm': {
switch (buf[7]) {
case 'a': {
switch (buf[10]) {
case 's':
if (op == "i8x16.max_s"sv) { return makeBinary(s, BinaryOp::MaxSVecI8x16); }
goto parse_error;
case 'u':
if (op == "i8x16.max_u"sv) { return makeBinary(s, BinaryOp::MaxUVecI8x16); }
goto parse_error;
default: goto parse_error;
}
}
case 'i': {
switch (buf[10]) {
case 's':
if (op == "i8x16.min_s"sv) { return makeBinary(s, BinaryOp::MinSVecI8x16); }
goto parse_error;
case 'u':
if (op == "i8x16.min_u"sv) { return makeBinary(s, BinaryOp::MinUVecI8x16); }
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'n': {
switch (buf[7]) {
case 'a': {
switch (buf[19]) {
case 's':
if (op == "i8x16.narrow_i16x8_s"sv) { return makeBinary(s, BinaryOp::NarrowSVecI16x8ToVecI8x16); }
goto parse_error;
case 'u':
if (op == "i8x16.narrow_i16x8_u"sv) { return makeBinary(s, BinaryOp::NarrowUVecI16x8ToVecI8x16); }
goto parse_error;
default: goto parse_error;
}
}
case 'e': {
switch (buf[8]) {
case '\0':
if (op == "i8x16.ne"sv) { return makeBinary(s, BinaryOp::NeVecI8x16); }
goto parse_error;
case 'g':
if (op == "i8x16.neg"sv) { return makeUnary(s, UnaryOp::NegVecI8x16); }
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'p':
if (op == "i8x16.popcnt"sv) { return makeUnary(s, UnaryOp::PopcntVecI8x16); }
goto parse_error;
case 'r': {
switch (buf[8]) {
case 'l':
if (op == "i8x16.relaxed_swizzle"sv) { return makeBinary(s, BinaryOp::RelaxedSwizzleVecI8x16); }
goto parse_error;
case 'p':
if (op == "i8x16.replace_lane"sv) { return makeSIMDReplace(s, SIMDReplaceOp::ReplaceLaneVecI8x16, 16); }
goto parse_error;
default: goto parse_error;
}
}
case 's': {
switch (buf[7]) {
case 'h': {
switch (buf[8]) {
case 'l':
if (op == "i8x16.shl"sv) { return makeSIMDShift(s, SIMDShiftOp::ShlVecI8x16); }
goto parse_error;
case 'r': {
switch (buf[10]) {
case 's':
if (op == "i8x16.shr_s"sv) { return makeSIMDShift(s, SIMDShiftOp::ShrSVecI8x16); }
goto parse_error;
case 'u':
if (op == "i8x16.shr_u"sv) { return makeSIMDShift(s, SIMDShiftOp::ShrUVecI8x16); }
goto parse_error;
default: goto parse_error;
}
}
case 'u':
if (op == "i8x16.shuffle"sv) { return makeSIMDShuffle(s); }
goto parse_error;
default: goto parse_error;
}
}
case 'p':
if (op == "i8x16.splat"sv) { return makeUnary(s, UnaryOp::SplatVecI8x16); }
goto parse_error;
case 'u': {
switch (buf[9]) {
case '\0':
if (op == "i8x16.sub"sv) { return makeBinary(s, BinaryOp::SubVecI8x16); }
goto parse_error;
case '_': {
switch (buf[14]) {
case 's':
if (op == "i8x16.sub_sat_s"sv) { return makeBinary(s, BinaryOp::SubSatSVecI8x16); }
goto parse_error;
case 'u':
if (op == "i8x16.sub_sat_u"sv) { return makeBinary(s, BinaryOp::SubSatUVecI8x16); }
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'w':
if (op == "i8x16.swizzle"sv) { return makeBinary(s, BinaryOp::SwizzleVecI8x16); }
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'f':
if (op == "if"sv) { return makeIf(s); }
goto parse_error;
default: goto parse_error;
}
}
case 'l': {
switch (buf[2]) {
case 'c': {
switch (buf[6]) {
case 'g':
if (op == "local.get"sv) { return makeLocalGet(s); }
goto parse_error;
case 's':
if (op == "local.set"sv) { return makeLocalSet(s); }
goto parse_error;
case 't':
if (op == "local.tee"sv) { return makeLocalTee(s); }
goto parse_error;
default: goto parse_error;
}
}
case 'o':
if (op == "loop"sv) { return makeLoop(s); }
goto parse_error;
default: goto parse_error;
}
}
case 'm': {
switch (buf[7]) {
case 'a': {
switch (buf[14]) {
case 'n':
if (op == "memory.atomic.notify"sv) { return makeAtomicNotify(s); }
goto parse_error;
case 'w': {
switch (buf[18]) {
case '3':
if (op == "memory.atomic.wait32"sv) { return makeAtomicWait(s, Type::i32); }
goto parse_error;
case '6':
if (op == "memory.atomic.wait64"sv) { return makeAtomicWait(s, Type::i64); }
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'c':
if (op == "memory.copy"sv) { return makeMemoryCopy(s); }
goto parse_error;
case 'f':
if (op == "memory.fill"sv) { return makeMemoryFill(s); }
goto parse_error;
case 'g':
if (op == "memory.grow"sv) { return makeMemoryGrow(s); }
goto parse_error;
case 'i':
if (op == "memory.init"sv) { return makeMemoryInit(s); }
goto parse_error;
case 's':
if (op == "memory.size"sv) { return makeMemorySize(s); }
goto parse_error;
default: goto parse_error;
}
}
case 'n':
if (op == "nop"sv) { return makeNop(); }
goto parse_error;
case 'p':
if (op == "pop"sv) { return makePop(s); }
goto parse_error;
case 'r': {
switch (buf[2]) {
case 'f': {
switch (buf[4]) {
case 'a':
if (op == "ref.as_non_null"sv) { return makeRefAs(s, RefAsNonNull); }
goto parse_error;
case 'c':
if (op == "ref.cast"sv) { return makeRefCast(s); }
goto parse_error;
case 'e':
if (op == "ref.eq"sv) { return makeRefEq(s); }
goto parse_error;
case 'f':
if (op == "ref.func"sv) { return makeRefFunc(s); }
goto parse_error;
case 'i':
if (op == "ref.is_null"sv) { return makeRefIsNull(s); }
goto parse_error;
case 'n':
if (op == "ref.null"sv) { return makeRefNull(s); }
goto parse_error;
case 't':
if (op == "ref.test"sv) { return makeRefTest(s); }
goto parse_error;
default: goto parse_error;
}
}
case 't': {
switch (buf[3]) {
case 'h':
if (op == "rethrow"sv) { return makeRethrow(s); }
goto parse_error;
case 'u': {
switch (buf[6]) {
case '\0':
if (op == "return"sv) { return makeReturn(s); }
goto parse_error;
case '_': {
switch (buf[11]) {
case '\0':
if (op == "return_call"sv) { return makeCall(s, /*isReturn=*/true); }
goto parse_error;
case '_': {
switch (buf[12]) {
case 'i':
if (op == "return_call_indirect"sv) { return makeCallIndirect(s, /*isReturn=*/true); }
goto parse_error;
case 'r':
if (op == "return_call_ref"sv) { return makeCallRef(s, /*isReturn=*/true); }
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
default: goto parse_error;
}
}
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 's': {
switch (buf[1]) {
case 'e':
if (op == "select"sv) { return makeSelect(s); }
goto parse_error;
case 't': {
switch (buf[3]) {
case 'i': {
switch (buf[6]) {
case '.': {
switch (buf[7]) {
case 'a': {
switch (buf[10]) {
case 'i':
if (op == "string.as_iter"sv) { return makeStringAs(s, StringAsIter); }
goto parse_error;
case 'w': {
switch (buf[13]) {
case '1':
if (op == "string.as_wtf16"sv) { return makeStringAs(s, StringAsWTF16); }
goto parse_error;
case '8':
if (op == "string.as_wtf8"sv) { return makeStringAs(s, StringAsWTF8); }
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'c': {
switch (buf[9]) {
case 'm':
if (op == "string.compare"sv) { return makeStringEq(s, StringEqCompare); }
goto parse_error;
case 'n': {
switch (buf[10]) {
case 'c':
if (op == "string.concat"sv) { return makeStringConcat(s); }
goto parse_error;
case 's':
if (op == "string.const"sv) { return makeStringConst(s); }
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'e': {
switch (buf[8]) {
case 'n': {
switch (buf[14]) {
case 'l': {
switch (buf[24]) {
case '\0':
if (op == "string.encode_lossy_utf8"sv) { return makeStringEncode(s, StringEncodeLossyUTF8); }
goto parse_error;
case '_':
if (op == "string.encode_lossy_utf8_array"sv) { return makeStringEncode(s, StringEncodeLossyUTF8Array); }
goto parse_error;
default: goto parse_error;
}
}
case 'u': {
switch (buf[18]) {
case '\0':
if (op == "string.encode_utf8"sv) { return makeStringEncode(s, StringEncodeUTF8); }
goto parse_error;
case '_':
if (op == "string.encode_utf8_array"sv) { return makeStringEncode(s, StringEncodeUTF8Array); }
goto parse_error;
default: goto parse_error;
}
}
case 'w': {
switch (buf[17]) {
case '1': {
switch (buf[19]) {
case '\0':
if (op == "string.encode_wtf16"sv) { return makeStringEncode(s, StringEncodeWTF16); }
goto parse_error;
case '_':
if (op == "string.encode_wtf16_array"sv) { return makeStringEncode(s, StringEncodeWTF16Array); }
goto parse_error;
default: goto parse_error;
}
}
case '8': {
switch (buf[18]) {
case '\0':
if (op == "string.encode_wtf8"sv) { return makeStringEncode(s, StringEncodeWTF8); }
goto parse_error;
case '_':
if (op == "string.encode_wtf8_array"sv) { return makeStringEncode(s, StringEncodeWTF8Array); }
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'q':
if (op == "string.eq"sv) { return makeStringEq(s, StringEqEqual); }
goto parse_error;
default: goto parse_error;
}
}
case 'f':
if (op == "string.from_code_point"sv) { return makeStringNew(s, StringNewFromCodePoint, false); }
goto parse_error;
case 'h':
if (op == "string.hash"sv) { return makeStringMeasure(s, StringMeasureHash); }
goto parse_error;
case 'i':
if (op == "string.is_usv_sequence"sv) { return makeStringMeasure(s, StringMeasureIsUSV); }
goto parse_error;
case 'm': {
switch (buf[15]) {
case 'u':
if (op == "string.measure_utf8"sv) { return makeStringMeasure(s, StringMeasureUTF8); }
goto parse_error;
case 'w': {
switch (buf[18]) {
case '1':
if (op == "string.measure_wtf16"sv) { return makeStringMeasure(s, StringMeasureWTF16); }
goto parse_error;
case '8':
if (op == "string.measure_wtf8"sv) { return makeStringMeasure(s, StringMeasureWTF8); }
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'n': {
switch (buf[11]) {
case 'l': {
switch (buf[21]) {
case '\0':
if (op == "string.new_lossy_utf8"sv) { return makeStringNew(s, StringNewLossyUTF8, false); }
goto parse_error;
case '_':
if (op == "string.new_lossy_utf8_array"sv) { return makeStringNew(s, StringNewLossyUTF8Array, false); }
goto parse_error;
default: goto parse_error;
}
}
case 'u': {
switch (buf[15]) {
case '\0':
if (op == "string.new_utf8"sv) { return makeStringNew(s, StringNewUTF8, false); }
goto parse_error;
case '_': {
switch (buf[16]) {
case 'a': {
switch (buf[21]) {
case '\0':
if (op == "string.new_utf8_array"sv) { return makeStringNew(s, StringNewUTF8Array, false); }
goto parse_error;
case '_':
if (op == "string.new_utf8_array_try"sv) { return makeStringNew(s, StringNewUTF8Array, true); }
goto parse_error;
default: goto parse_error;
}
}
case 't':
if (op == "string.new_utf8_try"sv) { return makeStringNew(s, StringNewUTF8, true); }
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'w': {
switch (buf[14]) {
case '1': {
switch (buf[16]) {
case '\0':
if (op == "string.new_wtf16"sv) { return makeStringNew(s, StringNewWTF16, false); }
goto parse_error;
case '_':
if (op == "string.new_wtf16_array"sv) { return makeStringNew(s, StringNewWTF16Array, false); }
goto parse_error;
default: goto parse_error;
}
}
case '8': {
switch (buf[15]) {
case '\0':
if (op == "string.new_wtf8"sv) { return makeStringNew(s, StringNewWTF8, false); }
goto parse_error;
case '_':
if (op == "string.new_wtf8_array"sv) { return makeStringNew(s, StringNewWTF8Array, false); }
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'v': {
switch (buf[11]) {
case 'i': {
switch (buf[16]) {
case 'a':
if (op == "stringview_iter.advance"sv) { return makeStringIterMove(s, StringIterMoveAdvance); }
goto parse_error;
case 'n':
if (op == "stringview_iter.next"sv) { return makeStringIterNext(s); }
goto parse_error;
case 'r':
if (op == "stringview_iter.rewind"sv) { return makeStringIterMove(s, StringIterMoveRewind); }
goto parse_error;
case 's':
if (op == "stringview_iter.slice"sv) { return makeStringSliceIter(s); }
goto parse_error;
default: goto parse_error;
}
}
case 'w': {
switch (buf[14]) {
case '1': {
switch (buf[17]) {
case 'g':
if (op == "stringview_wtf16.get_codeunit"sv) { return makeStringWTF16Get(s); }
goto parse_error;
case 'l':
if (op == "stringview_wtf16.length"sv) { return makeStringMeasure(s, StringMeasureWTF16View); }
goto parse_error;
case 's':
if (op == "stringview_wtf16.slice"sv) { return makeStringSliceWTF(s, StringSliceWTF16); }
goto parse_error;
default: goto parse_error;
}
}
case '8': {
switch (buf[16]) {
case 'a':
if (op == "stringview_wtf8.advance"sv) { return makeStringWTF8Advance(s); }
goto parse_error;
case 's':
if (op == "stringview_wtf8.slice"sv) { return makeStringSliceWTF(s, StringSliceWTF8); }
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'u': {
switch (buf[7]) {
case 'g': {
switch (buf[10]) {
case '\0':
if (op == "struct.get"sv) { return makeStructGet(s); }
goto parse_error;
case '_': {
switch (buf[11]) {
case 's':
if (op == "struct.get_s"sv) { return makeStructGet(s, true); }
goto parse_error;
case 'u':
if (op == "struct.get_u"sv) { return makeStructGet(s, false); }
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'n': {
switch (buf[10]) {
case '\0':
if (op == "struct.new"sv) { return makeStructNew(s, false); }
goto parse_error;
case '_':
if (op == "struct.new_default"sv) { return makeStructNew(s, true); }
goto parse_error;
default: goto parse_error;
}
}
case 's':
if (op == "struct.set"sv) { return makeStructSet(s); }
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 't': {
switch (buf[1]) {
case 'a': {
switch (buf[6]) {
case 'g': {
switch (buf[7]) {
case 'e':
if (op == "table.get"sv) { return makeTableGet(s); }
goto parse_error;
case 'r':
if (op == "table.grow"sv) { return makeTableGrow(s); }
goto parse_error;
default: goto parse_error;
}
}
case 's': {
switch (buf[7]) {
case 'e':
if (op == "table.set"sv) { return makeTableSet(s); }
goto parse_error;
case 'i':
if (op == "table.size"sv) { return makeTableSize(s); }
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'h': {
switch (buf[2]) {
case 'e':
if (op == "then"sv) { return makeThenOrElse(s); }
goto parse_error;
case 'r':
if (op == "throw"sv) { return makeThrow(s); }
goto parse_error;
default: goto parse_error;
}
}
case 'r':
if (op == "try"sv) { return makeTry(s); }
goto parse_error;
case 'u': {
switch (buf[6]) {
case 'e':
if (op == "tuple.extract"sv) { return makeTupleExtract(s); }
goto parse_error;
case 'm':
if (op == "tuple.make"sv) { return makeTupleMake(s); }
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'u':
if (op == "unreachable"sv) { return makeUnreachable(); }
goto parse_error;
case 'v': {
switch (buf[5]) {
case 'a': {
switch (buf[7]) {
case 'd': {
switch (buf[8]) {
case '\0':
if (op == "v128.and"sv) { return makeBinary(s, BinaryOp::AndVec128); }
goto parse_error;
case 'n':
if (op == "v128.andnot"sv) { return makeBinary(s, BinaryOp::AndNotVec128); }
goto parse_error;
default: goto parse_error;
}
}
case 'y':
if (op == "v128.any_true"sv) { return makeUnary(s, UnaryOp::AnyTrueVec128); }
goto parse_error;
default: goto parse_error;
}
}
case 'b':
if (op == "v128.bitselect"sv) { return makeSIMDTernary(s, SIMDTernaryOp::Bitselect); }
goto parse_error;
case 'c':
if (op == "v128.const"sv) { return makeConst(s, Type::v128); }
goto parse_error;
case 'l': {
switch (buf[9]) {
case '\0':
if (op == "v128.load"sv) { return makeLoad(s, Type::v128, /*signed=*/false, 16, /*isAtomic=*/false); }
goto parse_error;
case '1': {
switch (buf[11]) {
case '_': {
switch (buf[12]) {
case 'l':
if (op == "v128.load16_lane"sv) { return makeSIMDLoadStoreLane(s, SIMDLoadStoreLaneOp::Load16LaneVec128, 2); }
goto parse_error;
case 's':
if (op == "v128.load16_splat"sv) { return makeSIMDLoad(s, SIMDLoadOp::Load16SplatVec128, 2); }
goto parse_error;
default: goto parse_error;
}
}
case 'x': {
switch (buf[14]) {
case 's':
if (op == "v128.load16x4_s"sv) { return makeSIMDLoad(s, SIMDLoadOp::Load16x4SVec128, 8); }
goto parse_error;
case 'u':
if (op == "v128.load16x4_u"sv) { return makeSIMDLoad(s, SIMDLoadOp::Load16x4UVec128, 8); }
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case '3': {
switch (buf[11]) {
case '_': {
switch (buf[12]) {
case 'l':
if (op == "v128.load32_lane"sv) { return makeSIMDLoadStoreLane(s, SIMDLoadStoreLaneOp::Load32LaneVec128, 4); }
goto parse_error;
case 's':
if (op == "v128.load32_splat"sv) { return makeSIMDLoad(s, SIMDLoadOp::Load32SplatVec128, 4); }
goto parse_error;
case 'z':
if (op == "v128.load32_zero"sv) { return makeSIMDLoad(s, SIMDLoadOp::Load32ZeroVec128, 4); }
goto parse_error;
default: goto parse_error;
}
}
case 'x': {
switch (buf[14]) {
case 's':
if (op == "v128.load32x2_s"sv) { return makeSIMDLoad(s, SIMDLoadOp::Load32x2SVec128, 8); }
goto parse_error;
case 'u':
if (op == "v128.load32x2_u"sv) { return makeSIMDLoad(s, SIMDLoadOp::Load32x2UVec128, 8); }
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case '6': {
switch (buf[12]) {
case 'l':
if (op == "v128.load64_lane"sv) { return makeSIMDLoadStoreLane(s, SIMDLoadStoreLaneOp::Load64LaneVec128, 8); }
goto parse_error;
case 's':
if (op == "v128.load64_splat"sv) { return makeSIMDLoad(s, SIMDLoadOp::Load64SplatVec128, 8); }
goto parse_error;
case 'z':
if (op == "v128.load64_zero"sv) { return makeSIMDLoad(s, SIMDLoadOp::Load64ZeroVec128, 8); }
goto parse_error;
default: goto parse_error;
}
}
case '8': {
switch (buf[10]) {
case '_': {
switch (buf[11]) {
case 'l':
if (op == "v128.load8_lane"sv) { return makeSIMDLoadStoreLane(s, SIMDLoadStoreLaneOp::Load8LaneVec128, 1); }
goto parse_error;
case 's':
if (op == "v128.load8_splat"sv) { return makeSIMDLoad(s, SIMDLoadOp::Load8SplatVec128, 1); }
goto parse_error;
default: goto parse_error;
}
}
case 'x': {
switch (buf[13]) {
case 's':
if (op == "v128.load8x8_s"sv) { return makeSIMDLoad(s, SIMDLoadOp::Load8x8SVec128, 8); }
goto parse_error;
case 'u':
if (op == "v128.load8x8_u"sv) { return makeSIMDLoad(s, SIMDLoadOp::Load8x8UVec128, 8); }
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'n':
if (op == "v128.not"sv) { return makeUnary(s, UnaryOp::NotVec128); }
goto parse_error;
case 'o':
if (op == "v128.or"sv) { return makeBinary(s, BinaryOp::OrVec128); }
goto parse_error;
case 's': {
switch (buf[10]) {
case '\0':
if (op == "v128.store"sv) { return makeStore(s, Type::v128, 16, /*isAtomic=*/false); }
goto parse_error;
case '1':
if (op == "v128.store16_lane"sv) { return makeSIMDLoadStoreLane(s, SIMDLoadStoreLaneOp::Store16LaneVec128, 2); }
goto parse_error;
case '3':
if (op == "v128.store32_lane"sv) { return makeSIMDLoadStoreLane(s, SIMDLoadStoreLaneOp::Store32LaneVec128, 4); }
goto parse_error;
case '6':
if (op == "v128.store64_lane"sv) { return makeSIMDLoadStoreLane(s, SIMDLoadStoreLaneOp::Store64LaneVec128, 8); }
goto parse_error;
case '8':
if (op == "v128.store8_lane"sv) { return makeSIMDLoadStoreLane(s, SIMDLoadStoreLaneOp::Store8LaneVec128, 1); }
goto parse_error;
default: goto parse_error;
}
}
case 'x':
if (op == "v128.xor"sv) { return makeBinary(s, BinaryOp::XorVec128); }
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
parse_error:
throw ParseException(std::string(op), s.line, s.col);
#endif // INSTRUCTION_PARSER
#ifdef NEW_INSTRUCTION_PARSER
#undef NEW_INSTRUCTION_PARSER
auto op = *keyword;
char buf[33] = {};
memcpy(buf, op.data(), op.size());
switch (buf[0]) {
case 'a': {
switch (buf[1]) {
case 'r': {
switch (buf[6]) {
case 'c':
if (op == "array.copy"sv) {
auto ret = makeArrayCopy(ctx, pos);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'f':
if (op == "array.fill"sv) {
auto ret = makeArrayFill(ctx, pos);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'g': {
switch (buf[9]) {
case '\0':
if (op == "array.get"sv) {
auto ret = makeArrayGet(ctx, pos);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case '_': {
switch (buf[10]) {
case 's':
if (op == "array.get_s"sv) {
auto ret = makeArrayGet(ctx, pos, true);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "array.get_u"sv) {
auto ret = makeArrayGet(ctx, pos, false);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'i': {
switch (buf[11]) {
case 'd':
if (op == "array.init_data"sv) {
auto ret = makeArrayInitData(ctx, pos);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'e':
if (op == "array.init_elem"sv) {
auto ret = makeArrayInitElem(ctx, pos);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 's':
if (op == "array.init_static"sv) {
auto ret = makeArrayNewFixed(ctx, pos);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'l':
if (op == "array.len"sv) {
auto ret = makeArrayLen(ctx, pos);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'n': {
switch (buf[9]) {
case '\0':
if (op == "array.new"sv) {
auto ret = makeArrayNew(ctx, pos, false);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case '_': {
switch (buf[10]) {
case 'd': {
switch (buf[11]) {
case 'a':
if (op == "array.new_data"sv) {
auto ret = makeArrayNewData(ctx, pos);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'e':
if (op == "array.new_default"sv) {
auto ret = makeArrayNew(ctx, pos, true);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'e':
if (op == "array.new_elem"sv) {
auto ret = makeArrayNewElem(ctx, pos);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'f':
if (op == "array.new_fixed"sv) {
auto ret = makeArrayNewFixed(ctx, pos);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 's':
if (op == "array.set"sv) {
auto ret = makeArraySet(ctx, pos);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 't':
if (op == "atomic.fence"sv) {
auto ret = makeAtomicFence(ctx, pos);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'b': {
switch (buf[1]) {
case 'l':
if (op == "block"sv) {
auto ret = makeBlock(ctx, pos);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'r': {
switch (buf[2]) {
case '\0':
if (op == "br"sv) {
auto ret = makeBreak(ctx, pos);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case '_': {
switch (buf[3]) {
case 'i':
if (op == "br_if"sv) {
auto ret = makeBreak(ctx, pos);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'o': {
switch (buf[6]) {
case 'c': {
switch (buf[10]) {
case '\0':
if (op == "br_on_cast"sv) {
auto ret = makeBrOnCast(ctx, pos);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case '_':
if (op == "br_on_cast_fail"sv) {
auto ret = makeBrOnCast(ctx, pos, true);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'n': {
switch (buf[7]) {
case 'o':
if (op == "br_on_non_null"sv) {
auto ret = makeBrOnNull(ctx, pos, true);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "br_on_null"sv) {
auto ret = makeBrOnNull(ctx, pos);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 't':
if (op == "br_table"sv) {
auto ret = makeBreakTable(ctx, pos);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'c': {
switch (buf[4]) {
case '\0':
if (op == "call"sv) {
auto ret = makeCall(ctx, pos, /*isReturn=*/false);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case '_': {
switch (buf[5]) {
case 'i':
if (op == "call_indirect"sv) {
auto ret = makeCallIndirect(ctx, pos, /*isReturn=*/false);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'r':
if (op == "call_ref"sv) {
auto ret = makeCallRef(ctx, pos, /*isReturn=*/false);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'd': {
switch (buf[1]) {
case 'a':
if (op == "data.drop"sv) {
auto ret = makeDataDrop(ctx, pos);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'r':
if (op == "drop"sv) {
auto ret = makeDrop(ctx, pos);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'e': {
switch (buf[1]) {
case 'l':
if (op == "else"sv) {
auto ret = makeThenOrElse(ctx, pos);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'x': {
switch (buf[7]) {
case 'e':
if (op == "extern.externalize"sv) {
auto ret = makeRefAs(ctx, pos, ExternExternalize);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'i':
if (op == "extern.internalize"sv) {
auto ret = makeRefAs(ctx, pos, ExternInternalize);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'f': {
switch (buf[1]) {
case '3': {
switch (buf[3]) {
case '.': {
switch (buf[4]) {
case 'a': {
switch (buf[5]) {
case 'b':
if (op == "f32.abs"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::AbsFloat32);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'd':
if (op == "f32.add"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::AddFloat32);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'c': {
switch (buf[5]) {
case 'e':
if (op == "f32.ceil"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::CeilFloat32);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'o': {
switch (buf[6]) {
case 'n': {
switch (buf[7]) {
case 's':
if (op == "f32.const"sv) {
auto ret = makeConst(ctx, pos, Type::f32);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'v': {
switch (buf[13]) {
case '3': {
switch (buf[16]) {
case 's':
if (op == "f32.convert_i32_s"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::ConvertSInt32ToFloat32);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "f32.convert_i32_u"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::ConvertUInt32ToFloat32);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case '6': {
switch (buf[16]) {
case 's':
if (op == "f32.convert_i64_s"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::ConvertSInt64ToFloat32);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "f32.convert_i64_u"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::ConvertUInt64ToFloat32);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'p':
if (op == "f32.copysign"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::CopySignFloat32);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'd': {
switch (buf[5]) {
case 'e':
if (op == "f32.demote_f64"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::DemoteFloat64);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'i':
if (op == "f32.div"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::DivFloat32);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'e':
if (op == "f32.eq"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::EqFloat32);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'f':
if (op == "f32.floor"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::FloorFloat32);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'g': {
switch (buf[5]) {
case 'e':
if (op == "f32.ge"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::GeFloat32);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 't':
if (op == "f32.gt"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::GtFloat32);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'l': {
switch (buf[5]) {
case 'e':
if (op == "f32.le"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::LeFloat32);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'o':
if (op == "f32.load"sv) {
auto ret = makeLoad(ctx, pos, Type::f32, /*signed=*/false, 4, /*isAtomic=*/false);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 't':
if (op == "f32.lt"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::LtFloat32);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'm': {
switch (buf[5]) {
case 'a':
if (op == "f32.max"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::MaxFloat32);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'i':
if (op == "f32.min"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::MinFloat32);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "f32.mul"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::MulFloat32);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'n': {
switch (buf[6]) {
case '\0':
if (op == "f32.ne"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::NeFloat32);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'a':
if (op == "f32.nearest"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::NearestFloat32);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'g':
if (op == "f32.neg"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::NegFloat32);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'r':
if (op == "f32.reinterpret_i32"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::ReinterpretInt32);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 's': {
switch (buf[5]) {
case 'q':
if (op == "f32.sqrt"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::SqrtFloat32);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 't':
if (op == "f32.store"sv) {
auto ret = makeStore(ctx, pos, Type::f32, 4, /*isAtomic=*/false);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "f32.sub"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::SubFloat32);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 't':
if (op == "f32.trunc"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::TruncFloat32);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'x': {
switch (buf[6]) {
case 'a': {
switch (buf[7]) {
case 'b':
if (op == "f32x4.abs"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::AbsVecF32x4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'd':
if (op == "f32x4.add"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::AddVecF32x4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'c': {
switch (buf[7]) {
case 'e':
if (op == "f32x4.ceil"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::CeilVecF32x4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'o': {
switch (buf[20]) {
case 's':
if (op == "f32x4.convert_i32x4_s"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::ConvertSVecI32x4ToVecF32x4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "f32x4.convert_i32x4_u"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::ConvertUVecI32x4ToVecF32x4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'd': {
switch (buf[7]) {
case 'e':
if (op == "f32x4.demote_f64x2_zero"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::DemoteZeroVecF64x2ToVecF32x4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'i':
if (op == "f32x4.div"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::DivVecF32x4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'e': {
switch (buf[7]) {
case 'q':
if (op == "f32x4.eq"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::EqVecF32x4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'x':
if (op == "f32x4.extract_lane"sv) {
auto ret = makeSIMDExtract(ctx, pos, SIMDExtractOp::ExtractLaneVecF32x4, 4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'f':
if (op == "f32x4.floor"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::FloorVecF32x4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'g': {
switch (buf[7]) {
case 'e':
if (op == "f32x4.ge"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::GeVecF32x4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 't':
if (op == "f32x4.gt"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::GtVecF32x4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'l': {
switch (buf[7]) {
case 'e':
if (op == "f32x4.le"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::LeVecF32x4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 't':
if (op == "f32x4.lt"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::LtVecF32x4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'm': {
switch (buf[7]) {
case 'a':
if (op == "f32x4.max"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::MaxVecF32x4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'i':
if (op == "f32x4.min"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::MinVecF32x4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "f32x4.mul"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::MulVecF32x4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'n': {
switch (buf[8]) {
case '\0':
if (op == "f32x4.ne"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::NeVecF32x4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'a':
if (op == "f32x4.nearest"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::NearestVecF32x4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'g':
if (op == "f32x4.neg"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::NegVecF32x4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'p': {
switch (buf[8]) {
case 'a':
if (op == "f32x4.pmax"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::PMaxVecF32x4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'i':
if (op == "f32x4.pmin"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::PMinVecF32x4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'r': {
switch (buf[8]) {
case 'l': {
switch (buf[14]) {
case 'f': {
switch (buf[16]) {
case 'a':
if (op == "f32x4.relaxed_fma"sv) {
auto ret = makeSIMDTernary(ctx, pos, SIMDTernaryOp::RelaxedFmaVecF32x4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 's':
if (op == "f32x4.relaxed_fms"sv) {
auto ret = makeSIMDTernary(ctx, pos, SIMDTernaryOp::RelaxedFmsVecF32x4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'm': {
switch (buf[15]) {
case 'a':
if (op == "f32x4.relaxed_max"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::RelaxedMaxVecF32x4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'i':
if (op == "f32x4.relaxed_min"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::RelaxedMinVecF32x4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'p':
if (op == "f32x4.replace_lane"sv) {
auto ret = makeSIMDReplace(ctx, pos, SIMDReplaceOp::ReplaceLaneVecF32x4, 4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 's': {
switch (buf[7]) {
case 'p':
if (op == "f32x4.splat"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::SplatVecF32x4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'q':
if (op == "f32x4.sqrt"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::SqrtVecF32x4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "f32x4.sub"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::SubVecF32x4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 't':
if (op == "f32x4.trunc"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::TruncVecF32x4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case '6': {
switch (buf[3]) {
case '.': {
switch (buf[4]) {
case 'a': {
switch (buf[5]) {
case 'b':
if (op == "f64.abs"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::AbsFloat64);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'd':
if (op == "f64.add"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::AddFloat64);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'c': {
switch (buf[5]) {
case 'e':
if (op == "f64.ceil"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::CeilFloat64);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'o': {
switch (buf[6]) {
case 'n': {
switch (buf[7]) {
case 's':
if (op == "f64.const"sv) {
auto ret = makeConst(ctx, pos, Type::f64);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'v': {
switch (buf[13]) {
case '3': {
switch (buf[16]) {
case 's':
if (op == "f64.convert_i32_s"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::ConvertSInt32ToFloat64);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "f64.convert_i32_u"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::ConvertUInt32ToFloat64);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case '6': {
switch (buf[16]) {
case 's':
if (op == "f64.convert_i64_s"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::ConvertSInt64ToFloat64);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "f64.convert_i64_u"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::ConvertUInt64ToFloat64);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'p':
if (op == "f64.copysign"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::CopySignFloat64);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'd':
if (op == "f64.div"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::DivFloat64);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'e':
if (op == "f64.eq"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::EqFloat64);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'f':
if (op == "f64.floor"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::FloorFloat64);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'g': {
switch (buf[5]) {
case 'e':
if (op == "f64.ge"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::GeFloat64);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 't':
if (op == "f64.gt"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::GtFloat64);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'l': {
switch (buf[5]) {
case 'e':
if (op == "f64.le"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::LeFloat64);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'o':
if (op == "f64.load"sv) {
auto ret = makeLoad(ctx, pos, Type::f64, /*signed=*/false, 8, /*isAtomic=*/false);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 't':
if (op == "f64.lt"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::LtFloat64);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'm': {
switch (buf[5]) {
case 'a':
if (op == "f64.max"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::MaxFloat64);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'i':
if (op == "f64.min"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::MinFloat64);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "f64.mul"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::MulFloat64);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'n': {
switch (buf[6]) {
case '\0':
if (op == "f64.ne"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::NeFloat64);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'a':
if (op == "f64.nearest"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::NearestFloat64);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'g':
if (op == "f64.neg"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::NegFloat64);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'p':
if (op == "f64.promote_f32"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::PromoteFloat32);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'r':
if (op == "f64.reinterpret_i64"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::ReinterpretInt64);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 's': {
switch (buf[5]) {
case 'q':
if (op == "f64.sqrt"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::SqrtFloat64);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 't':
if (op == "f64.store"sv) {
auto ret = makeStore(ctx, pos, Type::f64, 8, /*isAtomic=*/false);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "f64.sub"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::SubFloat64);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 't':
if (op == "f64.trunc"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::TruncFloat64);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'x': {
switch (buf[6]) {
case 'a': {
switch (buf[7]) {
case 'b':
if (op == "f64x2.abs"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::AbsVecF64x2);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'd':
if (op == "f64x2.add"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::AddVecF64x2);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'c': {
switch (buf[7]) {
case 'e':
if (op == "f64x2.ceil"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::CeilVecF64x2);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'o': {
switch (buf[24]) {
case 's':
if (op == "f64x2.convert_low_i32x4_s"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::ConvertLowSVecI32x4ToVecF64x2);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "f64x2.convert_low_i32x4_u"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::ConvertLowUVecI32x4ToVecF64x2);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'd':
if (op == "f64x2.div"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::DivVecF64x2);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'e': {
switch (buf[7]) {
case 'q':
if (op == "f64x2.eq"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::EqVecF64x2);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'x':
if (op == "f64x2.extract_lane"sv) {
auto ret = makeSIMDExtract(ctx, pos, SIMDExtractOp::ExtractLaneVecF64x2, 2);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'f':
if (op == "f64x2.floor"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::FloorVecF64x2);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'g': {
switch (buf[7]) {
case 'e':
if (op == "f64x2.ge"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::GeVecF64x2);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 't':
if (op == "f64x2.gt"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::GtVecF64x2);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'l': {
switch (buf[7]) {
case 'e':
if (op == "f64x2.le"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::LeVecF64x2);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 't':
if (op == "f64x2.lt"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::LtVecF64x2);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'm': {
switch (buf[7]) {
case 'a':
if (op == "f64x2.max"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::MaxVecF64x2);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'i':
if (op == "f64x2.min"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::MinVecF64x2);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "f64x2.mul"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::MulVecF64x2);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'n': {
switch (buf[8]) {
case '\0':
if (op == "f64x2.ne"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::NeVecF64x2);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'a':
if (op == "f64x2.nearest"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::NearestVecF64x2);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'g':
if (op == "f64x2.neg"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::NegVecF64x2);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'p': {
switch (buf[7]) {
case 'm': {
switch (buf[8]) {
case 'a':
if (op == "f64x2.pmax"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::PMaxVecF64x2);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'i':
if (op == "f64x2.pmin"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::PMinVecF64x2);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'r':
if (op == "f64x2.promote_low_f32x4"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::PromoteLowVecF32x4ToVecF64x2);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'r': {
switch (buf[8]) {
case 'l': {
switch (buf[14]) {
case 'f': {
switch (buf[16]) {
case 'a':
if (op == "f64x2.relaxed_fma"sv) {
auto ret = makeSIMDTernary(ctx, pos, SIMDTernaryOp::RelaxedFmaVecF64x2);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 's':
if (op == "f64x2.relaxed_fms"sv) {
auto ret = makeSIMDTernary(ctx, pos, SIMDTernaryOp::RelaxedFmsVecF64x2);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'm': {
switch (buf[15]) {
case 'a':
if (op == "f64x2.relaxed_max"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::RelaxedMaxVecF64x2);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'i':
if (op == "f64x2.relaxed_min"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::RelaxedMinVecF64x2);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'p':
if (op == "f64x2.replace_lane"sv) {
auto ret = makeSIMDReplace(ctx, pos, SIMDReplaceOp::ReplaceLaneVecF64x2, 2);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 's': {
switch (buf[7]) {
case 'p':
if (op == "f64x2.splat"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::SplatVecF64x2);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'q':
if (op == "f64x2.sqrt"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::SqrtVecF64x2);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "f64x2.sub"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::SubVecF64x2);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 't':
if (op == "f64x2.trunc"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::TruncVecF64x2);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'g': {
switch (buf[7]) {
case 'g':
if (op == "global.get"sv) {
auto ret = makeGlobalGet(ctx, pos);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 's':
if (op == "global.set"sv) {
auto ret = makeGlobalSet(ctx, pos);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'i': {
switch (buf[1]) {
case '1': {
switch (buf[6]) {
case 'a': {
switch (buf[7]) {
case 'b':
if (op == "i16x8.abs"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::AbsVecI16x8);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'd': {
switch (buf[9]) {
case '\0':
if (op == "i16x8.add"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::AddVecI16x8);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case '_': {
switch (buf[14]) {
case 's':
if (op == "i16x8.add_sat_s"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::AddSatSVecI16x8);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "i16x8.add_sat_u"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::AddSatUVecI16x8);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'l':
if (op == "i16x8.all_true"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::AllTrueVecI16x8);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'v':
if (op == "i16x8.avgr_u"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::AvgrUVecI16x8);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'b':
if (op == "i16x8.bitmask"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::BitmaskVecI16x8);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'd':
if (op == "i16x8.dot_i8x16_i7x16_s"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::DotI8x16I7x16SToVecI16x8);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'e': {
switch (buf[7]) {
case 'q':
if (op == "i16x8.eq"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::EqVecI16x8);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'x': {
switch (buf[9]) {
case 'a': {
switch (buf[28]) {
case 's':
if (op == "i16x8.extadd_pairwise_i8x16_s"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::ExtAddPairwiseSVecI8x16ToI16x8);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "i16x8.extadd_pairwise_i8x16_u"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::ExtAddPairwiseUVecI8x16ToI16x8);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'e': {
switch (buf[13]) {
case 'h': {
switch (buf[24]) {
case 's':
if (op == "i16x8.extend_high_i8x16_s"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::ExtendHighSVecI8x16ToVecI16x8);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "i16x8.extend_high_i8x16_u"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::ExtendHighUVecI8x16ToVecI16x8);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'l': {
switch (buf[23]) {
case 's':
if (op == "i16x8.extend_low_i8x16_s"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::ExtendLowSVecI8x16ToVecI16x8);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "i16x8.extend_low_i8x16_u"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::ExtendLowUVecI8x16ToVecI16x8);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'm': {
switch (buf[13]) {
case 'h': {
switch (buf[24]) {
case 's':
if (op == "i16x8.extmul_high_i8x16_s"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::ExtMulHighSVecI16x8);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "i16x8.extmul_high_i8x16_u"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::ExtMulHighUVecI16x8);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'l': {
switch (buf[23]) {
case 's':
if (op == "i16x8.extmul_low_i8x16_s"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::ExtMulLowSVecI16x8);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "i16x8.extmul_low_i8x16_u"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::ExtMulLowUVecI16x8);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'r': {
switch (buf[19]) {
case 's':
if (op == "i16x8.extract_lane_s"sv) {
auto ret = makeSIMDExtract(ctx, pos, SIMDExtractOp::ExtractLaneSVecI16x8, 8);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "i16x8.extract_lane_u"sv) {
auto ret = makeSIMDExtract(ctx, pos, SIMDExtractOp::ExtractLaneUVecI16x8, 8);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'g': {
switch (buf[7]) {
case 'e': {
switch (buf[9]) {
case 's':
if (op == "i16x8.ge_s"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::GeSVecI16x8);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "i16x8.ge_u"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::GeUVecI16x8);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 't': {
switch (buf[9]) {
case 's':
if (op == "i16x8.gt_s"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::GtSVecI16x8);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "i16x8.gt_u"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::GtUVecI16x8);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'l': {
switch (buf[7]) {
case 'a':
if (op == "i16x8.laneselect"sv) {
auto ret = makeSIMDTernary(ctx, pos, SIMDTernaryOp::LaneselectI16x8);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'e': {
switch (buf[9]) {
case 's':
if (op == "i16x8.le_s"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::LeSVecI16x8);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "i16x8.le_u"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::LeUVecI16x8);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 't': {
switch (buf[9]) {
case 's':
if (op == "i16x8.lt_s"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::LtSVecI16x8);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "i16x8.lt_u"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::LtUVecI16x8);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'm': {
switch (buf[7]) {
case 'a': {
switch (buf[10]) {
case 's':
if (op == "i16x8.max_s"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::MaxSVecI16x8);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "i16x8.max_u"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::MaxUVecI16x8);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'i': {
switch (buf[10]) {
case 's':
if (op == "i16x8.min_s"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::MinSVecI16x8);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "i16x8.min_u"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::MinUVecI16x8);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'u':
if (op == "i16x8.mul"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::MulVecI16x8);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'n': {
switch (buf[7]) {
case 'a': {
switch (buf[19]) {
case 's':
if (op == "i16x8.narrow_i32x4_s"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::NarrowSVecI32x4ToVecI16x8);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "i16x8.narrow_i32x4_u"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::NarrowUVecI32x4ToVecI16x8);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'e': {
switch (buf[8]) {
case '\0':
if (op == "i16x8.ne"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::NeVecI16x8);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'g':
if (op == "i16x8.neg"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::NegVecI16x8);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'q':
if (op == "i16x8.q15mulr_sat_s"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::Q15MulrSatSVecI16x8);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'r': {
switch (buf[8]) {
case 'l':
if (op == "i16x8.relaxed_q15mulr_s"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::RelaxedQ15MulrSVecI16x8);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'p':
if (op == "i16x8.replace_lane"sv) {
auto ret = makeSIMDReplace(ctx, pos, SIMDReplaceOp::ReplaceLaneVecI16x8, 8);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 's': {
switch (buf[7]) {
case 'h': {
switch (buf[8]) {
case 'l':
if (op == "i16x8.shl"sv) {
auto ret = makeSIMDShift(ctx, pos, SIMDShiftOp::ShlVecI16x8);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'r': {
switch (buf[10]) {
case 's':
if (op == "i16x8.shr_s"sv) {
auto ret = makeSIMDShift(ctx, pos, SIMDShiftOp::ShrSVecI16x8);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "i16x8.shr_u"sv) {
auto ret = makeSIMDShift(ctx, pos, SIMDShiftOp::ShrUVecI16x8);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'p':
if (op == "i16x8.splat"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::SplatVecI16x8);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u': {
switch (buf[9]) {
case '\0':
if (op == "i16x8.sub"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::SubVecI16x8);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case '_': {
switch (buf[14]) {
case 's':
if (op == "i16x8.sub_sat_s"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::SubSatSVecI16x8);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "i16x8.sub_sat_u"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::SubSatUVecI16x8);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case '3': {
switch (buf[2]) {
case '1': {
switch (buf[4]) {
case 'g': {
switch (buf[8]) {
case 's':
if (op == "i31.get_s"sv) {
auto ret = makeI31Get(ctx, pos, true);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "i31.get_u"sv) {
auto ret = makeI31Get(ctx, pos, false);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'n':
if (op == "i31.new"sv) {
auto ret = makeI31New(ctx, pos);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case '2': {
switch (buf[3]) {
case '.': {
switch (buf[4]) {
case 'a': {
switch (buf[5]) {
case 'd':
if (op == "i32.add"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::AddInt32);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'n':
if (op == "i32.and"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::AndInt32);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 't': {
switch (buf[11]) {
case 'l': {
switch (buf[15]) {
case '\0':
if (op == "i32.atomic.load"sv) {
auto ret = makeLoad(ctx, pos, Type::i32, /*signed=*/false, 4, /*isAtomic=*/true);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case '1':
if (op == "i32.atomic.load16_u"sv) {
auto ret = makeLoad(ctx, pos, Type::i32, /*signed=*/false, 2, /*isAtomic=*/true);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case '8':
if (op == "i32.atomic.load8_u"sv) {
auto ret = makeLoad(ctx, pos, Type::i32, /*signed=*/false, 1, /*isAtomic=*/true);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'r': {
switch (buf[14]) {
case '.': {
switch (buf[15]) {
case 'a': {
switch (buf[16]) {
case 'd':
if (op == "i32.atomic.rmw.add"sv) {
auto ret = makeAtomicRMW(ctx, pos, AtomicRMWOp::RMWAdd, Type::i32, 4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'n':
if (op == "i32.atomic.rmw.and"sv) {
auto ret = makeAtomicRMW(ctx, pos, AtomicRMWOp::RMWAnd, Type::i32, 4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'c':
if (op == "i32.atomic.rmw.cmpxchg"sv) {
auto ret = makeAtomicCmpxchg(ctx, pos, Type::i32, 4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'o':
if (op == "i32.atomic.rmw.or"sv) {
auto ret = makeAtomicRMW(ctx, pos, AtomicRMWOp::RMWOr, Type::i32, 4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 's':
if (op == "i32.atomic.rmw.sub"sv) {
auto ret = makeAtomicRMW(ctx, pos, AtomicRMWOp::RMWSub, Type::i32, 4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'x': {
switch (buf[16]) {
case 'c':
if (op == "i32.atomic.rmw.xchg"sv) {
auto ret = makeAtomicRMW(ctx, pos, AtomicRMWOp::RMWXchg, Type::i32, 4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'o':
if (op == "i32.atomic.rmw.xor"sv) {
auto ret = makeAtomicRMW(ctx, pos, AtomicRMWOp::RMWXor, Type::i32, 4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case '1': {
switch (buf[17]) {
case 'a': {
switch (buf[18]) {
case 'd':
if (op == "i32.atomic.rmw16.add_u"sv) {
auto ret = makeAtomicRMW(ctx, pos, AtomicRMWOp::RMWAdd, Type::i32, 2);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'n':
if (op == "i32.atomic.rmw16.and_u"sv) {
auto ret = makeAtomicRMW(ctx, pos, AtomicRMWOp::RMWAnd, Type::i32, 2);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'c':
if (op == "i32.atomic.rmw16.cmpxchg_u"sv) {
auto ret = makeAtomicCmpxchg(ctx, pos, Type::i32, 2);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'o':
if (op == "i32.atomic.rmw16.or_u"sv) {
auto ret = makeAtomicRMW(ctx, pos, AtomicRMWOp::RMWOr, Type::i32, 2);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 's':
if (op == "i32.atomic.rmw16.sub_u"sv) {
auto ret = makeAtomicRMW(ctx, pos, AtomicRMWOp::RMWSub, Type::i32, 2);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'x': {
switch (buf[18]) {
case 'c':
if (op == "i32.atomic.rmw16.xchg_u"sv) {
auto ret = makeAtomicRMW(ctx, pos, AtomicRMWOp::RMWXchg, Type::i32, 2);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'o':
if (op == "i32.atomic.rmw16.xor_u"sv) {
auto ret = makeAtomicRMW(ctx, pos, AtomicRMWOp::RMWXor, Type::i32, 2);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case '8': {
switch (buf[16]) {
case 'a': {
switch (buf[17]) {
case 'd':
if (op == "i32.atomic.rmw8.add_u"sv) {
auto ret = makeAtomicRMW(ctx, pos, AtomicRMWOp::RMWAdd, Type::i32, 1);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'n':
if (op == "i32.atomic.rmw8.and_u"sv) {
auto ret = makeAtomicRMW(ctx, pos, AtomicRMWOp::RMWAnd, Type::i32, 1);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'c':
if (op == "i32.atomic.rmw8.cmpxchg_u"sv) {
auto ret = makeAtomicCmpxchg(ctx, pos, Type::i32, 1);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'o':
if (op == "i32.atomic.rmw8.or_u"sv) {
auto ret = makeAtomicRMW(ctx, pos, AtomicRMWOp::RMWOr, Type::i32, 1);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 's':
if (op == "i32.atomic.rmw8.sub_u"sv) {
auto ret = makeAtomicRMW(ctx, pos, AtomicRMWOp::RMWSub, Type::i32, 1);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'x': {
switch (buf[17]) {
case 'c':
if (op == "i32.atomic.rmw8.xchg_u"sv) {
auto ret = makeAtomicRMW(ctx, pos, AtomicRMWOp::RMWXchg, Type::i32, 1);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'o':
if (op == "i32.atomic.rmw8.xor_u"sv) {
auto ret = makeAtomicRMW(ctx, pos, AtomicRMWOp::RMWXor, Type::i32, 1);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 's': {
switch (buf[16]) {
case '\0':
if (op == "i32.atomic.store"sv) {
auto ret = makeStore(ctx, pos, Type::i32, 4, /*isAtomic=*/true);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case '1':
if (op == "i32.atomic.store16"sv) {
auto ret = makeStore(ctx, pos, Type::i32, 2, /*isAtomic=*/true);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case '8':
if (op == "i32.atomic.store8"sv) {
auto ret = makeStore(ctx, pos, Type::i32, 1, /*isAtomic=*/true);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'c': {
switch (buf[5]) {
case 'l':
if (op == "i32.clz"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::ClzInt32);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'o':
if (op == "i32.const"sv) {
auto ret = makeConst(ctx, pos, Type::i32);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 't':
if (op == "i32.ctz"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::CtzInt32);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'd': {
switch (buf[8]) {
case 's':
if (op == "i32.div_s"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::DivSInt32);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "i32.div_u"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::DivUInt32);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'e': {
switch (buf[5]) {
case 'q': {
switch (buf[6]) {
case '\0':
if (op == "i32.eq"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::EqInt32);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'z':
if (op == "i32.eqz"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::EqZInt32);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'x': {
switch (buf[10]) {
case '1':
if (op == "i32.extend16_s"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::ExtendS16Int32);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case '8':
if (op == "i32.extend8_s"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::ExtendS8Int32);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'g': {
switch (buf[5]) {
case 'e': {
switch (buf[7]) {
case 's':
if (op == "i32.ge_s"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::GeSInt32);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "i32.ge_u"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::GeUInt32);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 't': {
switch (buf[7]) {
case 's':
if (op == "i32.gt_s"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::GtSInt32);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "i32.gt_u"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::GtUInt32);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'l': {
switch (buf[5]) {
case 'e': {
switch (buf[7]) {
case 's':
if (op == "i32.le_s"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::LeSInt32);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "i32.le_u"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::LeUInt32);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'o': {
switch (buf[8]) {
case '\0':
if (op == "i32.load"sv) {
auto ret = makeLoad(ctx, pos, Type::i32, /*signed=*/false, 4, /*isAtomic=*/false);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case '1': {
switch (buf[11]) {
case 's':
if (op == "i32.load16_s"sv) {
auto ret = makeLoad(ctx, pos, Type::i32, /*signed=*/true, 2, /*isAtomic=*/false);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "i32.load16_u"sv) {
auto ret = makeLoad(ctx, pos, Type::i32, /*signed=*/false, 2, /*isAtomic=*/false);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case '8': {
switch (buf[10]) {
case 's':
if (op == "i32.load8_s"sv) {
auto ret = makeLoad(ctx, pos, Type::i32, /*signed=*/true, 1, /*isAtomic=*/false);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "i32.load8_u"sv) {
auto ret = makeLoad(ctx, pos, Type::i32, /*signed=*/false, 1, /*isAtomic=*/false);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 't': {
switch (buf[7]) {
case 's':
if (op == "i32.lt_s"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::LtSInt32);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "i32.lt_u"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::LtUInt32);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'm':
if (op == "i32.mul"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::MulInt32);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'n':
if (op == "i32.ne"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::NeInt32);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'o':
if (op == "i32.or"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::OrInt32);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'p':
if (op == "i32.popcnt"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::PopcntInt32);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'r': {
switch (buf[5]) {
case 'e': {
switch (buf[6]) {
case 'i':
if (op == "i32.reinterpret_f32"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::ReinterpretFloat32);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'm': {
switch (buf[8]) {
case 's':
if (op == "i32.rem_s"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::RemSInt32);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "i32.rem_u"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::RemUInt32);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'o': {
switch (buf[7]) {
case 'l':
if (op == "i32.rotl"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::RotLInt32);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'r':
if (op == "i32.rotr"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::RotRInt32);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 's': {
switch (buf[5]) {
case 'h': {
switch (buf[6]) {
case 'l':
if (op == "i32.shl"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::ShlInt32);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'r': {
switch (buf[8]) {
case 's':
if (op == "i32.shr_s"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::ShrSInt32);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "i32.shr_u"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::ShrUInt32);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 't': {
switch (buf[9]) {
case '\0':
if (op == "i32.store"sv) {
auto ret = makeStore(ctx, pos, Type::i32, 4, /*isAtomic=*/false);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case '1':
if (op == "i32.store16"sv) {
auto ret = makeStore(ctx, pos, Type::i32, 2, /*isAtomic=*/false);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case '8':
if (op == "i32.store8"sv) {
auto ret = makeStore(ctx, pos, Type::i32, 1, /*isAtomic=*/false);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'u':
if (op == "i32.sub"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::SubInt32);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 't': {
switch (buf[10]) {
case 'f': {
switch (buf[11]) {
case '3': {
switch (buf[14]) {
case 's':
if (op == "i32.trunc_f32_s"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::TruncSFloat32ToInt32);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "i32.trunc_f32_u"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::TruncUFloat32ToInt32);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case '6': {
switch (buf[14]) {
case 's':
if (op == "i32.trunc_f64_s"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::TruncSFloat64ToInt32);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "i32.trunc_f64_u"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::TruncUFloat64ToInt32);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 's': {
switch (buf[15]) {
case '3': {
switch (buf[18]) {
case 's':
if (op == "i32.trunc_sat_f32_s"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::TruncSatSFloat32ToInt32);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "i32.trunc_sat_f32_u"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::TruncSatUFloat32ToInt32);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case '6': {
switch (buf[18]) {
case 's':
if (op == "i32.trunc_sat_f64_s"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::TruncSatSFloat64ToInt32);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "i32.trunc_sat_f64_u"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::TruncSatUFloat64ToInt32);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'w':
if (op == "i32.wrap_i64"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::WrapInt64);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'x':
if (op == "i32.xor"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::XorInt32);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'x': {
switch (buf[6]) {
case 'a': {
switch (buf[7]) {
case 'b':
if (op == "i32x4.abs"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::AbsVecI32x4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'd':
if (op == "i32x4.add"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::AddVecI32x4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'l':
if (op == "i32x4.all_true"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::AllTrueVecI32x4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'b':
if (op == "i32x4.bitmask"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::BitmaskVecI32x4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'd': {
switch (buf[11]) {
case '1':
if (op == "i32x4.dot_i16x8_s"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::DotSVecI16x8ToVecI32x4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case '8':
if (op == "i32x4.dot_i8x16_i7x16_add_s"sv) {
auto ret = makeSIMDTernary(ctx, pos, SIMDTernaryOp::DotI8x16I7x16AddSToVecI32x4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'e': {
switch (buf[7]) {
case 'q':
if (op == "i32x4.eq"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::EqVecI32x4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'x': {
switch (buf[9]) {
case 'a': {
switch (buf[28]) {
case 's':
if (op == "i32x4.extadd_pairwise_i16x8_s"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::ExtAddPairwiseSVecI16x8ToI32x4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "i32x4.extadd_pairwise_i16x8_u"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::ExtAddPairwiseUVecI16x8ToI32x4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'e': {
switch (buf[13]) {
case 'h': {
switch (buf[24]) {
case 's':
if (op == "i32x4.extend_high_i16x8_s"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::ExtendHighSVecI16x8ToVecI32x4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "i32x4.extend_high_i16x8_u"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::ExtendHighUVecI16x8ToVecI32x4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'l': {
switch (buf[23]) {
case 's':
if (op == "i32x4.extend_low_i16x8_s"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::ExtendLowSVecI16x8ToVecI32x4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "i32x4.extend_low_i16x8_u"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::ExtendLowUVecI16x8ToVecI32x4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'm': {
switch (buf[13]) {
case 'h': {
switch (buf[24]) {
case 's':
if (op == "i32x4.extmul_high_i16x8_s"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::ExtMulHighSVecI32x4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "i32x4.extmul_high_i16x8_u"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::ExtMulHighUVecI32x4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'l': {
switch (buf[23]) {
case 's':
if (op == "i32x4.extmul_low_i16x8_s"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::ExtMulLowSVecI32x4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "i32x4.extmul_low_i16x8_u"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::ExtMulLowUVecI32x4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'r':
if (op == "i32x4.extract_lane"sv) {
auto ret = makeSIMDExtract(ctx, pos, SIMDExtractOp::ExtractLaneVecI32x4, 4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'g': {
switch (buf[7]) {
case 'e': {
switch (buf[9]) {
case 's':
if (op == "i32x4.ge_s"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::GeSVecI32x4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "i32x4.ge_u"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::GeUVecI32x4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 't': {
switch (buf[9]) {
case 's':
if (op == "i32x4.gt_s"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::GtSVecI32x4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "i32x4.gt_u"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::GtUVecI32x4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'l': {
switch (buf[7]) {
case 'a':
if (op == "i32x4.laneselect"sv) {
auto ret = makeSIMDTernary(ctx, pos, SIMDTernaryOp::LaneselectI32x4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'e': {
switch (buf[9]) {
case 's':
if (op == "i32x4.le_s"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::LeSVecI32x4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "i32x4.le_u"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::LeUVecI32x4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 't': {
switch (buf[9]) {
case 's':
if (op == "i32x4.lt_s"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::LtSVecI32x4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "i32x4.lt_u"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::LtUVecI32x4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'm': {
switch (buf[7]) {
case 'a': {
switch (buf[10]) {
case 's':
if (op == "i32x4.max_s"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::MaxSVecI32x4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "i32x4.max_u"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::MaxUVecI32x4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'i': {
switch (buf[10]) {
case 's':
if (op == "i32x4.min_s"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::MinSVecI32x4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "i32x4.min_u"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::MinUVecI32x4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'u':
if (op == "i32x4.mul"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::MulVecI32x4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'n': {
switch (buf[8]) {
case '\0':
if (op == "i32x4.ne"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::NeVecI32x4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'g':
if (op == "i32x4.neg"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::NegVecI32x4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'r': {
switch (buf[8]) {
case 'l': {
switch (buf[21]) {
case '3': {
switch (buf[26]) {
case 's':
if (op == "i32x4.relaxed_trunc_f32x4_s"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::RelaxedTruncSVecF32x4ToVecI32x4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "i32x4.relaxed_trunc_f32x4_u"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::RelaxedTruncUVecF32x4ToVecI32x4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case '6': {
switch (buf[26]) {
case 's':
if (op == "i32x4.relaxed_trunc_f64x2_s_zero"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::RelaxedTruncZeroSVecF64x2ToVecI32x4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "i32x4.relaxed_trunc_f64x2_u_zero"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::RelaxedTruncZeroUVecF64x2ToVecI32x4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'p':
if (op == "i32x4.replace_lane"sv) {
auto ret = makeSIMDReplace(ctx, pos, SIMDReplaceOp::ReplaceLaneVecI32x4, 4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 's': {
switch (buf[7]) {
case 'h': {
switch (buf[8]) {
case 'l':
if (op == "i32x4.shl"sv) {
auto ret = makeSIMDShift(ctx, pos, SIMDShiftOp::ShlVecI32x4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'r': {
switch (buf[10]) {
case 's':
if (op == "i32x4.shr_s"sv) {
auto ret = makeSIMDShift(ctx, pos, SIMDShiftOp::ShrSVecI32x4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "i32x4.shr_u"sv) {
auto ret = makeSIMDShift(ctx, pos, SIMDShiftOp::ShrUVecI32x4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'p':
if (op == "i32x4.splat"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::SplatVecI32x4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "i32x4.sub"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::SubVecI32x4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 't': {
switch (buf[17]) {
case '3': {
switch (buf[22]) {
case 's':
if (op == "i32x4.trunc_sat_f32x4_s"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::TruncSatSVecF32x4ToVecI32x4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "i32x4.trunc_sat_f32x4_u"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::TruncSatUVecF32x4ToVecI32x4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case '6': {
switch (buf[22]) {
case 's':
if (op == "i32x4.trunc_sat_f64x2_s_zero"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::TruncSatZeroSVecF64x2ToVecI32x4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "i32x4.trunc_sat_f64x2_u_zero"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::TruncSatZeroUVecF64x2ToVecI32x4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
default: goto parse_error;
}
}
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case '6': {
switch (buf[3]) {
case '.': {
switch (buf[4]) {
case 'a': {
switch (buf[5]) {
case 'd':
if (op == "i64.add"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::AddInt64);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'n':
if (op == "i64.and"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::AndInt64);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 't': {
switch (buf[11]) {
case 'l': {
switch (buf[15]) {
case '\0':
if (op == "i64.atomic.load"sv) {
auto ret = makeLoad(ctx, pos, Type::i64, /*signed=*/false, 8, /*isAtomic=*/true);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case '1':
if (op == "i64.atomic.load16_u"sv) {
auto ret = makeLoad(ctx, pos, Type::i64, /*signed=*/false, 2, /*isAtomic=*/true);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case '3':
if (op == "i64.atomic.load32_u"sv) {
auto ret = makeLoad(ctx, pos, Type::i64, /*signed=*/false, 4, /*isAtomic=*/true);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case '8':
if (op == "i64.atomic.load8_u"sv) {
auto ret = makeLoad(ctx, pos, Type::i64, /*signed=*/false, 1, /*isAtomic=*/true);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'r': {
switch (buf[14]) {
case '.': {
switch (buf[15]) {
case 'a': {
switch (buf[16]) {
case 'd':
if (op == "i64.atomic.rmw.add"sv) {
auto ret = makeAtomicRMW(ctx, pos, AtomicRMWOp::RMWAdd, Type::i64, 8);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'n':
if (op == "i64.atomic.rmw.and"sv) {
auto ret = makeAtomicRMW(ctx, pos, AtomicRMWOp::RMWAnd, Type::i64, 8);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'c':
if (op == "i64.atomic.rmw.cmpxchg"sv) {
auto ret = makeAtomicCmpxchg(ctx, pos, Type::i64, 8);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'o':
if (op == "i64.atomic.rmw.or"sv) {
auto ret = makeAtomicRMW(ctx, pos, AtomicRMWOp::RMWOr, Type::i64, 8);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 's':
if (op == "i64.atomic.rmw.sub"sv) {
auto ret = makeAtomicRMW(ctx, pos, AtomicRMWOp::RMWSub, Type::i64, 8);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'x': {
switch (buf[16]) {
case 'c':
if (op == "i64.atomic.rmw.xchg"sv) {
auto ret = makeAtomicRMW(ctx, pos, AtomicRMWOp::RMWXchg, Type::i64, 8);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'o':
if (op == "i64.atomic.rmw.xor"sv) {
auto ret = makeAtomicRMW(ctx, pos, AtomicRMWOp::RMWXor, Type::i64, 8);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case '1': {
switch (buf[17]) {
case 'a': {
switch (buf[18]) {
case 'd':
if (op == "i64.atomic.rmw16.add_u"sv) {
auto ret = makeAtomicRMW(ctx, pos, AtomicRMWOp::RMWAdd, Type::i64, 2);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'n':
if (op == "i64.atomic.rmw16.and_u"sv) {
auto ret = makeAtomicRMW(ctx, pos, AtomicRMWOp::RMWAnd, Type::i64, 2);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'c':
if (op == "i64.atomic.rmw16.cmpxchg_u"sv) {
auto ret = makeAtomicCmpxchg(ctx, pos, Type::i64, 2);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'o':
if (op == "i64.atomic.rmw16.or_u"sv) {
auto ret = makeAtomicRMW(ctx, pos, AtomicRMWOp::RMWOr, Type::i64, 2);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 's':
if (op == "i64.atomic.rmw16.sub_u"sv) {
auto ret = makeAtomicRMW(ctx, pos, AtomicRMWOp::RMWSub, Type::i64, 2);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'x': {
switch (buf[18]) {
case 'c':
if (op == "i64.atomic.rmw16.xchg_u"sv) {
auto ret = makeAtomicRMW(ctx, pos, AtomicRMWOp::RMWXchg, Type::i64, 2);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'o':
if (op == "i64.atomic.rmw16.xor_u"sv) {
auto ret = makeAtomicRMW(ctx, pos, AtomicRMWOp::RMWXor, Type::i64, 2);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case '3': {
switch (buf[17]) {
case 'a': {
switch (buf[18]) {
case 'd':
if (op == "i64.atomic.rmw32.add_u"sv) {
auto ret = makeAtomicRMW(ctx, pos, AtomicRMWOp::RMWAdd, Type::i64, 4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'n':
if (op == "i64.atomic.rmw32.and_u"sv) {
auto ret = makeAtomicRMW(ctx, pos, AtomicRMWOp::RMWAnd, Type::i64, 4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'c':
if (op == "i64.atomic.rmw32.cmpxchg_u"sv) {
auto ret = makeAtomicCmpxchg(ctx, pos, Type::i64, 4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'o':
if (op == "i64.atomic.rmw32.or_u"sv) {
auto ret = makeAtomicRMW(ctx, pos, AtomicRMWOp::RMWOr, Type::i64, 4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 's':
if (op == "i64.atomic.rmw32.sub_u"sv) {
auto ret = makeAtomicRMW(ctx, pos, AtomicRMWOp::RMWSub, Type::i64, 4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'x': {
switch (buf[18]) {
case 'c':
if (op == "i64.atomic.rmw32.xchg_u"sv) {
auto ret = makeAtomicRMW(ctx, pos, AtomicRMWOp::RMWXchg, Type::i64, 4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'o':
if (op == "i64.atomic.rmw32.xor_u"sv) {
auto ret = makeAtomicRMW(ctx, pos, AtomicRMWOp::RMWXor, Type::i64, 4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case '8': {
switch (buf[16]) {
case 'a': {
switch (buf[17]) {
case 'd':
if (op == "i64.atomic.rmw8.add_u"sv) {
auto ret = makeAtomicRMW(ctx, pos, AtomicRMWOp::RMWAdd, Type::i64, 1);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'n':
if (op == "i64.atomic.rmw8.and_u"sv) {
auto ret = makeAtomicRMW(ctx, pos, AtomicRMWOp::RMWAnd, Type::i64, 1);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'c':
if (op == "i64.atomic.rmw8.cmpxchg_u"sv) {
auto ret = makeAtomicCmpxchg(ctx, pos, Type::i64, 1);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'o':
if (op == "i64.atomic.rmw8.or_u"sv) {
auto ret = makeAtomicRMW(ctx, pos, AtomicRMWOp::RMWOr, Type::i64, 1);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 's':
if (op == "i64.atomic.rmw8.sub_u"sv) {
auto ret = makeAtomicRMW(ctx, pos, AtomicRMWOp::RMWSub, Type::i64, 1);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'x': {
switch (buf[17]) {
case 'c':
if (op == "i64.atomic.rmw8.xchg_u"sv) {
auto ret = makeAtomicRMW(ctx, pos, AtomicRMWOp::RMWXchg, Type::i64, 1);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'o':
if (op == "i64.atomic.rmw8.xor_u"sv) {
auto ret = makeAtomicRMW(ctx, pos, AtomicRMWOp::RMWXor, Type::i64, 1);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 's': {
switch (buf[16]) {
case '\0':
if (op == "i64.atomic.store"sv) {
auto ret = makeStore(ctx, pos, Type::i64, 8, /*isAtomic=*/true);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case '1':
if (op == "i64.atomic.store16"sv) {
auto ret = makeStore(ctx, pos, Type::i64, 2, /*isAtomic=*/true);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case '3':
if (op == "i64.atomic.store32"sv) {
auto ret = makeStore(ctx, pos, Type::i64, 4, /*isAtomic=*/true);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case '8':
if (op == "i64.atomic.store8"sv) {
auto ret = makeStore(ctx, pos, Type::i64, 1, /*isAtomic=*/true);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'c': {
switch (buf[5]) {
case 'l':
if (op == "i64.clz"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::ClzInt64);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'o':
if (op == "i64.const"sv) {
auto ret = makeConst(ctx, pos, Type::i64);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 't':
if (op == "i64.ctz"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::CtzInt64);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'd': {
switch (buf[8]) {
case 's':
if (op == "i64.div_s"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::DivSInt64);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "i64.div_u"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::DivUInt64);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'e': {
switch (buf[5]) {
case 'q': {
switch (buf[6]) {
case '\0':
if (op == "i64.eq"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::EqInt64);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'z':
if (op == "i64.eqz"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::EqZInt64);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'x': {
switch (buf[10]) {
case '1':
if (op == "i64.extend16_s"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::ExtendS16Int64);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case '3':
if (op == "i64.extend32_s"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::ExtendS32Int64);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case '8':
if (op == "i64.extend8_s"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::ExtendS8Int64);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case '_': {
switch (buf[15]) {
case 's':
if (op == "i64.extend_i32_s"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::ExtendSInt32);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "i64.extend_i32_u"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::ExtendUInt32);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'g': {
switch (buf[5]) {
case 'e': {
switch (buf[7]) {
case 's':
if (op == "i64.ge_s"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::GeSInt64);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "i64.ge_u"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::GeUInt64);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 't': {
switch (buf[7]) {
case 's':
if (op == "i64.gt_s"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::GtSInt64);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "i64.gt_u"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::GtUInt64);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'l': {
switch (buf[5]) {
case 'e': {
switch (buf[7]) {
case 's':
if (op == "i64.le_s"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::LeSInt64);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "i64.le_u"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::LeUInt64);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'o': {
switch (buf[8]) {
case '\0':
if (op == "i64.load"sv) {
auto ret = makeLoad(ctx, pos, Type::i64, /*signed=*/false, 8, /*isAtomic=*/false);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case '1': {
switch (buf[11]) {
case 's':
if (op == "i64.load16_s"sv) {
auto ret = makeLoad(ctx, pos, Type::i64, /*signed=*/true, 2, /*isAtomic=*/false);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "i64.load16_u"sv) {
auto ret = makeLoad(ctx, pos, Type::i64, /*signed=*/false, 2, /*isAtomic=*/false);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case '3': {
switch (buf[11]) {
case 's':
if (op == "i64.load32_s"sv) {
auto ret = makeLoad(ctx, pos, Type::i64, /*signed=*/true, 4, /*isAtomic=*/false);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "i64.load32_u"sv) {
auto ret = makeLoad(ctx, pos, Type::i64, /*signed=*/false, 4, /*isAtomic=*/false);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case '8': {
switch (buf[10]) {
case 's':
if (op == "i64.load8_s"sv) {
auto ret = makeLoad(ctx, pos, Type::i64, /*signed=*/true, 1, /*isAtomic=*/false);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "i64.load8_u"sv) {
auto ret = makeLoad(ctx, pos, Type::i64, /*signed=*/false, 1, /*isAtomic=*/false);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 't': {
switch (buf[7]) {
case 's':
if (op == "i64.lt_s"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::LtSInt64);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "i64.lt_u"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::LtUInt64);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'm':
if (op == "i64.mul"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::MulInt64);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'n':
if (op == "i64.ne"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::NeInt64);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'o':
if (op == "i64.or"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::OrInt64);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'p':
if (op == "i64.popcnt"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::PopcntInt64);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'r': {
switch (buf[5]) {
case 'e': {
switch (buf[6]) {
case 'i':
if (op == "i64.reinterpret_f64"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::ReinterpretFloat64);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'm': {
switch (buf[8]) {
case 's':
if (op == "i64.rem_s"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::RemSInt64);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "i64.rem_u"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::RemUInt64);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'o': {
switch (buf[7]) {
case 'l':
if (op == "i64.rotl"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::RotLInt64);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'r':
if (op == "i64.rotr"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::RotRInt64);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 's': {
switch (buf[5]) {
case 'h': {
switch (buf[6]) {
case 'l':
if (op == "i64.shl"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::ShlInt64);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'r': {
switch (buf[8]) {
case 's':
if (op == "i64.shr_s"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::ShrSInt64);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "i64.shr_u"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::ShrUInt64);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 't': {
switch (buf[9]) {
case '\0':
if (op == "i64.store"sv) {
auto ret = makeStore(ctx, pos, Type::i64, 8, /*isAtomic=*/false);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case '1':
if (op == "i64.store16"sv) {
auto ret = makeStore(ctx, pos, Type::i64, 2, /*isAtomic=*/false);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case '3':
if (op == "i64.store32"sv) {
auto ret = makeStore(ctx, pos, Type::i64, 4, /*isAtomic=*/false);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case '8':
if (op == "i64.store8"sv) {
auto ret = makeStore(ctx, pos, Type::i64, 1, /*isAtomic=*/false);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'u':
if (op == "i64.sub"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::SubInt64);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 't': {
switch (buf[10]) {
case 'f': {
switch (buf[11]) {
case '3': {
switch (buf[14]) {
case 's':
if (op == "i64.trunc_f32_s"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::TruncSFloat32ToInt64);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "i64.trunc_f32_u"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::TruncUFloat32ToInt64);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case '6': {
switch (buf[14]) {
case 's':
if (op == "i64.trunc_f64_s"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::TruncSFloat64ToInt64);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "i64.trunc_f64_u"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::TruncUFloat64ToInt64);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 's': {
switch (buf[15]) {
case '3': {
switch (buf[18]) {
case 's':
if (op == "i64.trunc_sat_f32_s"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::TruncSatSFloat32ToInt64);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "i64.trunc_sat_f32_u"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::TruncSatUFloat32ToInt64);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case '6': {
switch (buf[18]) {
case 's':
if (op == "i64.trunc_sat_f64_s"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::TruncSatSFloat64ToInt64);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "i64.trunc_sat_f64_u"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::TruncSatUFloat64ToInt64);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'x':
if (op == "i64.xor"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::XorInt64);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'x': {
switch (buf[6]) {
case 'a': {
switch (buf[7]) {
case 'b':
if (op == "i64x2.abs"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::AbsVecI64x2);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'd':
if (op == "i64x2.add"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::AddVecI64x2);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'l':
if (op == "i64x2.all_true"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::AllTrueVecI64x2);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'b':
if (op == "i64x2.bitmask"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::BitmaskVecI64x2);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'e': {
switch (buf[7]) {
case 'q':
if (op == "i64x2.eq"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::EqVecI64x2);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'x': {
switch (buf[9]) {
case 'e': {
switch (buf[13]) {
case 'h': {
switch (buf[24]) {
case 's':
if (op == "i64x2.extend_high_i32x4_s"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::ExtendHighSVecI32x4ToVecI64x2);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "i64x2.extend_high_i32x4_u"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::ExtendHighUVecI32x4ToVecI64x2);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'l': {
switch (buf[23]) {
case 's':
if (op == "i64x2.extend_low_i32x4_s"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::ExtendLowSVecI32x4ToVecI64x2);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "i64x2.extend_low_i32x4_u"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::ExtendLowUVecI32x4ToVecI64x2);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'm': {
switch (buf[13]) {
case 'h': {
switch (buf[24]) {
case 's':
if (op == "i64x2.extmul_high_i32x4_s"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::ExtMulHighSVecI64x2);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "i64x2.extmul_high_i32x4_u"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::ExtMulHighUVecI64x2);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'l': {
switch (buf[23]) {
case 's':
if (op == "i64x2.extmul_low_i32x4_s"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::ExtMulLowSVecI64x2);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "i64x2.extmul_low_i32x4_u"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::ExtMulLowUVecI64x2);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'r':
if (op == "i64x2.extract_lane"sv) {
auto ret = makeSIMDExtract(ctx, pos, SIMDExtractOp::ExtractLaneVecI64x2, 2);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'g': {
switch (buf[7]) {
case 'e':
if (op == "i64x2.ge_s"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::GeSVecI64x2);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 't':
if (op == "i64x2.gt_s"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::GtSVecI64x2);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'l': {
switch (buf[7]) {
case 'a':
if (op == "i64x2.laneselect"sv) {
auto ret = makeSIMDTernary(ctx, pos, SIMDTernaryOp::LaneselectI64x2);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'e':
if (op == "i64x2.le_s"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::LeSVecI64x2);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 't':
if (op == "i64x2.lt_s"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::LtSVecI64x2);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'm':
if (op == "i64x2.mul"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::MulVecI64x2);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'n': {
switch (buf[8]) {
case '\0':
if (op == "i64x2.ne"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::NeVecI64x2);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'g':
if (op == "i64x2.neg"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::NegVecI64x2);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'r':
if (op == "i64x2.replace_lane"sv) {
auto ret = makeSIMDReplace(ctx, pos, SIMDReplaceOp::ReplaceLaneVecI64x2, 2);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 's': {
switch (buf[7]) {
case 'h': {
switch (buf[8]) {
case 'l':
if (op == "i64x2.shl"sv) {
auto ret = makeSIMDShift(ctx, pos, SIMDShiftOp::ShlVecI64x2);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'r': {
switch (buf[10]) {
case 's':
if (op == "i64x2.shr_s"sv) {
auto ret = makeSIMDShift(ctx, pos, SIMDShiftOp::ShrSVecI64x2);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "i64x2.shr_u"sv) {
auto ret = makeSIMDShift(ctx, pos, SIMDShiftOp::ShrUVecI64x2);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'p':
if (op == "i64x2.splat"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::SplatVecI64x2);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "i64x2.sub"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::SubVecI64x2);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case '8': {
switch (buf[6]) {
case 'a': {
switch (buf[7]) {
case 'b':
if (op == "i8x16.abs"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::AbsVecI8x16);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'd': {
switch (buf[9]) {
case '\0':
if (op == "i8x16.add"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::AddVecI8x16);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case '_': {
switch (buf[14]) {
case 's':
if (op == "i8x16.add_sat_s"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::AddSatSVecI8x16);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "i8x16.add_sat_u"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::AddSatUVecI8x16);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'l':
if (op == "i8x16.all_true"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::AllTrueVecI8x16);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'v':
if (op == "i8x16.avgr_u"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::AvgrUVecI8x16);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'b':
if (op == "i8x16.bitmask"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::BitmaskVecI8x16);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'e': {
switch (buf[7]) {
case 'q':
if (op == "i8x16.eq"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::EqVecI8x16);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'x': {
switch (buf[19]) {
case 's':
if (op == "i8x16.extract_lane_s"sv) {
auto ret = makeSIMDExtract(ctx, pos, SIMDExtractOp::ExtractLaneSVecI8x16, 16);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "i8x16.extract_lane_u"sv) {
auto ret = makeSIMDExtract(ctx, pos, SIMDExtractOp::ExtractLaneUVecI8x16, 16);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'g': {
switch (buf[7]) {
case 'e': {
switch (buf[9]) {
case 's':
if (op == "i8x16.ge_s"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::GeSVecI8x16);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "i8x16.ge_u"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::GeUVecI8x16);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 't': {
switch (buf[9]) {
case 's':
if (op == "i8x16.gt_s"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::GtSVecI8x16);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "i8x16.gt_u"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::GtUVecI8x16);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'l': {
switch (buf[7]) {
case 'a':
if (op == "i8x16.laneselect"sv) {
auto ret = makeSIMDTernary(ctx, pos, SIMDTernaryOp::LaneselectI8x16);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'e': {
switch (buf[9]) {
case 's':
if (op == "i8x16.le_s"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::LeSVecI8x16);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "i8x16.le_u"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::LeUVecI8x16);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 't': {
switch (buf[9]) {
case 's':
if (op == "i8x16.lt_s"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::LtSVecI8x16);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "i8x16.lt_u"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::LtUVecI8x16);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'm': {
switch (buf[7]) {
case 'a': {
switch (buf[10]) {
case 's':
if (op == "i8x16.max_s"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::MaxSVecI8x16);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "i8x16.max_u"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::MaxUVecI8x16);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'i': {
switch (buf[10]) {
case 's':
if (op == "i8x16.min_s"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::MinSVecI8x16);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "i8x16.min_u"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::MinUVecI8x16);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'n': {
switch (buf[7]) {
case 'a': {
switch (buf[19]) {
case 's':
if (op == "i8x16.narrow_i16x8_s"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::NarrowSVecI16x8ToVecI8x16);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "i8x16.narrow_i16x8_u"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::NarrowUVecI16x8ToVecI8x16);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'e': {
switch (buf[8]) {
case '\0':
if (op == "i8x16.ne"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::NeVecI8x16);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'g':
if (op == "i8x16.neg"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::NegVecI8x16);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'p':
if (op == "i8x16.popcnt"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::PopcntVecI8x16);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'r': {
switch (buf[8]) {
case 'l':
if (op == "i8x16.relaxed_swizzle"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::RelaxedSwizzleVecI8x16);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'p':
if (op == "i8x16.replace_lane"sv) {
auto ret = makeSIMDReplace(ctx, pos, SIMDReplaceOp::ReplaceLaneVecI8x16, 16);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 's': {
switch (buf[7]) {
case 'h': {
switch (buf[8]) {
case 'l':
if (op == "i8x16.shl"sv) {
auto ret = makeSIMDShift(ctx, pos, SIMDShiftOp::ShlVecI8x16);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'r': {
switch (buf[10]) {
case 's':
if (op == "i8x16.shr_s"sv) {
auto ret = makeSIMDShift(ctx, pos, SIMDShiftOp::ShrSVecI8x16);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "i8x16.shr_u"sv) {
auto ret = makeSIMDShift(ctx, pos, SIMDShiftOp::ShrUVecI8x16);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'u':
if (op == "i8x16.shuffle"sv) {
auto ret = makeSIMDShuffle(ctx, pos);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'p':
if (op == "i8x16.splat"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::SplatVecI8x16);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u': {
switch (buf[9]) {
case '\0':
if (op == "i8x16.sub"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::SubVecI8x16);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case '_': {
switch (buf[14]) {
case 's':
if (op == "i8x16.sub_sat_s"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::SubSatSVecI8x16);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "i8x16.sub_sat_u"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::SubSatUVecI8x16);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'w':
if (op == "i8x16.swizzle"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::SwizzleVecI8x16);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'f':
if (op == "if"sv) {
auto ret = makeIf(ctx, pos);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'l': {
switch (buf[2]) {
case 'c': {
switch (buf[6]) {
case 'g':
if (op == "local.get"sv) {
auto ret = makeLocalGet(ctx, pos);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 's':
if (op == "local.set"sv) {
auto ret = makeLocalSet(ctx, pos);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 't':
if (op == "local.tee"sv) {
auto ret = makeLocalTee(ctx, pos);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'o':
if (op == "loop"sv) {
auto ret = makeLoop(ctx, pos);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'm': {
switch (buf[7]) {
case 'a': {
switch (buf[14]) {
case 'n':
if (op == "memory.atomic.notify"sv) {
auto ret = makeAtomicNotify(ctx, pos);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'w': {
switch (buf[18]) {
case '3':
if (op == "memory.atomic.wait32"sv) {
auto ret = makeAtomicWait(ctx, pos, Type::i32);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case '6':
if (op == "memory.atomic.wait64"sv) {
auto ret = makeAtomicWait(ctx, pos, Type::i64);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'c':
if (op == "memory.copy"sv) {
auto ret = makeMemoryCopy(ctx, pos);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'f':
if (op == "memory.fill"sv) {
auto ret = makeMemoryFill(ctx, pos);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'g':
if (op == "memory.grow"sv) {
auto ret = makeMemoryGrow(ctx, pos);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'i':
if (op == "memory.init"sv) {
auto ret = makeMemoryInit(ctx, pos);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 's':
if (op == "memory.size"sv) {
auto ret = makeMemorySize(ctx, pos);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'n':
if (op == "nop"sv) {
auto ret = makeNop(ctx, pos);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'p':
if (op == "pop"sv) {
auto ret = makePop(ctx, pos);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'r': {
switch (buf[2]) {
case 'f': {
switch (buf[4]) {
case 'a':
if (op == "ref.as_non_null"sv) {
auto ret = makeRefAs(ctx, pos, RefAsNonNull);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'c':
if (op == "ref.cast"sv) {
auto ret = makeRefCast(ctx, pos);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'e':
if (op == "ref.eq"sv) {
auto ret = makeRefEq(ctx, pos);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'f':
if (op == "ref.func"sv) {
auto ret = makeRefFunc(ctx, pos);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'i':
if (op == "ref.is_null"sv) {
auto ret = makeRefIsNull(ctx, pos);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'n':
if (op == "ref.null"sv) {
auto ret = makeRefNull(ctx, pos);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 't':
if (op == "ref.test"sv) {
auto ret = makeRefTest(ctx, pos);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 't': {
switch (buf[3]) {
case 'h':
if (op == "rethrow"sv) {
auto ret = makeRethrow(ctx, pos);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u': {
switch (buf[6]) {
case '\0':
if (op == "return"sv) {
auto ret = makeReturn(ctx, pos);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case '_': {
switch (buf[11]) {
case '\0':
if (op == "return_call"sv) {
auto ret = makeCall(ctx, pos, /*isReturn=*/true);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case '_': {
switch (buf[12]) {
case 'i':
if (op == "return_call_indirect"sv) {
auto ret = makeCallIndirect(ctx, pos, /*isReturn=*/true);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'r':
if (op == "return_call_ref"sv) {
auto ret = makeCallRef(ctx, pos, /*isReturn=*/true);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
default: goto parse_error;
}
}
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 's': {
switch (buf[1]) {
case 'e':
if (op == "select"sv) {
auto ret = makeSelect(ctx, pos);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 't': {
switch (buf[3]) {
case 'i': {
switch (buf[6]) {
case '.': {
switch (buf[7]) {
case 'a': {
switch (buf[10]) {
case 'i':
if (op == "string.as_iter"sv) {
auto ret = makeStringAs(ctx, pos, StringAsIter);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'w': {
switch (buf[13]) {
case '1':
if (op == "string.as_wtf16"sv) {
auto ret = makeStringAs(ctx, pos, StringAsWTF16);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case '8':
if (op == "string.as_wtf8"sv) {
auto ret = makeStringAs(ctx, pos, StringAsWTF8);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'c': {
switch (buf[9]) {
case 'm':
if (op == "string.compare"sv) {
auto ret = makeStringEq(ctx, pos, StringEqCompare);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'n': {
switch (buf[10]) {
case 'c':
if (op == "string.concat"sv) {
auto ret = makeStringConcat(ctx, pos);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 's':
if (op == "string.const"sv) {
auto ret = makeStringConst(ctx, pos);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'e': {
switch (buf[8]) {
case 'n': {
switch (buf[14]) {
case 'l': {
switch (buf[24]) {
case '\0':
if (op == "string.encode_lossy_utf8"sv) {
auto ret = makeStringEncode(ctx, pos, StringEncodeLossyUTF8);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case '_':
if (op == "string.encode_lossy_utf8_array"sv) {
auto ret = makeStringEncode(ctx, pos, StringEncodeLossyUTF8Array);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'u': {
switch (buf[18]) {
case '\0':
if (op == "string.encode_utf8"sv) {
auto ret = makeStringEncode(ctx, pos, StringEncodeUTF8);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case '_':
if (op == "string.encode_utf8_array"sv) {
auto ret = makeStringEncode(ctx, pos, StringEncodeUTF8Array);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'w': {
switch (buf[17]) {
case '1': {
switch (buf[19]) {
case '\0':
if (op == "string.encode_wtf16"sv) {
auto ret = makeStringEncode(ctx, pos, StringEncodeWTF16);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case '_':
if (op == "string.encode_wtf16_array"sv) {
auto ret = makeStringEncode(ctx, pos, StringEncodeWTF16Array);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case '8': {
switch (buf[18]) {
case '\0':
if (op == "string.encode_wtf8"sv) {
auto ret = makeStringEncode(ctx, pos, StringEncodeWTF8);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case '_':
if (op == "string.encode_wtf8_array"sv) {
auto ret = makeStringEncode(ctx, pos, StringEncodeWTF8Array);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'q':
if (op == "string.eq"sv) {
auto ret = makeStringEq(ctx, pos, StringEqEqual);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'f':
if (op == "string.from_code_point"sv) {
auto ret = makeStringNew(ctx, pos, StringNewFromCodePoint, false);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'h':
if (op == "string.hash"sv) {
auto ret = makeStringMeasure(ctx, pos, StringMeasureHash);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'i':
if (op == "string.is_usv_sequence"sv) {
auto ret = makeStringMeasure(ctx, pos, StringMeasureIsUSV);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'm': {
switch (buf[15]) {
case 'u':
if (op == "string.measure_utf8"sv) {
auto ret = makeStringMeasure(ctx, pos, StringMeasureUTF8);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'w': {
switch (buf[18]) {
case '1':
if (op == "string.measure_wtf16"sv) {
auto ret = makeStringMeasure(ctx, pos, StringMeasureWTF16);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case '8':
if (op == "string.measure_wtf8"sv) {
auto ret = makeStringMeasure(ctx, pos, StringMeasureWTF8);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'n': {
switch (buf[11]) {
case 'l': {
switch (buf[21]) {
case '\0':
if (op == "string.new_lossy_utf8"sv) {
auto ret = makeStringNew(ctx, pos, StringNewLossyUTF8, false);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case '_':
if (op == "string.new_lossy_utf8_array"sv) {
auto ret = makeStringNew(ctx, pos, StringNewLossyUTF8Array, false);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'u': {
switch (buf[15]) {
case '\0':
if (op == "string.new_utf8"sv) {
auto ret = makeStringNew(ctx, pos, StringNewUTF8, false);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case '_': {
switch (buf[16]) {
case 'a': {
switch (buf[21]) {
case '\0':
if (op == "string.new_utf8_array"sv) {
auto ret = makeStringNew(ctx, pos, StringNewUTF8Array, false);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case '_':
if (op == "string.new_utf8_array_try"sv) {
auto ret = makeStringNew(ctx, pos, StringNewUTF8Array, true);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 't':
if (op == "string.new_utf8_try"sv) {
auto ret = makeStringNew(ctx, pos, StringNewUTF8, true);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'w': {
switch (buf[14]) {
case '1': {
switch (buf[16]) {
case '\0':
if (op == "string.new_wtf16"sv) {
auto ret = makeStringNew(ctx, pos, StringNewWTF16, false);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case '_':
if (op == "string.new_wtf16_array"sv) {
auto ret = makeStringNew(ctx, pos, StringNewWTF16Array, false);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case '8': {
switch (buf[15]) {
case '\0':
if (op == "string.new_wtf8"sv) {
auto ret = makeStringNew(ctx, pos, StringNewWTF8, false);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case '_':
if (op == "string.new_wtf8_array"sv) {
auto ret = makeStringNew(ctx, pos, StringNewWTF8Array, false);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'v': {
switch (buf[11]) {
case 'i': {
switch (buf[16]) {
case 'a':
if (op == "stringview_iter.advance"sv) {
auto ret = makeStringIterMove(ctx, pos, StringIterMoveAdvance);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'n':
if (op == "stringview_iter.next"sv) {
auto ret = makeStringIterNext(ctx, pos);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'r':
if (op == "stringview_iter.rewind"sv) {
auto ret = makeStringIterMove(ctx, pos, StringIterMoveRewind);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 's':
if (op == "stringview_iter.slice"sv) {
auto ret = makeStringSliceIter(ctx, pos);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'w': {
switch (buf[14]) {
case '1': {
switch (buf[17]) {
case 'g':
if (op == "stringview_wtf16.get_codeunit"sv) {
auto ret = makeStringWTF16Get(ctx, pos);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'l':
if (op == "stringview_wtf16.length"sv) {
auto ret = makeStringMeasure(ctx, pos, StringMeasureWTF16View);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 's':
if (op == "stringview_wtf16.slice"sv) {
auto ret = makeStringSliceWTF(ctx, pos, StringSliceWTF16);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case '8': {
switch (buf[16]) {
case 'a':
if (op == "stringview_wtf8.advance"sv) {
auto ret = makeStringWTF8Advance(ctx, pos);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 's':
if (op == "stringview_wtf8.slice"sv) {
auto ret = makeStringSliceWTF(ctx, pos, StringSliceWTF8);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'u': {
switch (buf[7]) {
case 'g': {
switch (buf[10]) {
case '\0':
if (op == "struct.get"sv) {
auto ret = makeStructGet(ctx, pos);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case '_': {
switch (buf[11]) {
case 's':
if (op == "struct.get_s"sv) {
auto ret = makeStructGet(ctx, pos, true);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "struct.get_u"sv) {
auto ret = makeStructGet(ctx, pos, false);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'n': {
switch (buf[10]) {
case '\0':
if (op == "struct.new"sv) {
auto ret = makeStructNew(ctx, pos, false);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case '_':
if (op == "struct.new_default"sv) {
auto ret = makeStructNew(ctx, pos, true);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 's':
if (op == "struct.set"sv) {
auto ret = makeStructSet(ctx, pos);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 't': {
switch (buf[1]) {
case 'a': {
switch (buf[6]) {
case 'g': {
switch (buf[7]) {
case 'e':
if (op == "table.get"sv) {
auto ret = makeTableGet(ctx, pos);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'r':
if (op == "table.grow"sv) {
auto ret = makeTableGrow(ctx, pos);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 's': {
switch (buf[7]) {
case 'e':
if (op == "table.set"sv) {
auto ret = makeTableSet(ctx, pos);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'i':
if (op == "table.size"sv) {
auto ret = makeTableSize(ctx, pos);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'h': {
switch (buf[2]) {
case 'e':
if (op == "then"sv) {
auto ret = makeThenOrElse(ctx, pos);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'r':
if (op == "throw"sv) {
auto ret = makeThrow(ctx, pos);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'r':
if (op == "try"sv) {
auto ret = makeTry(ctx, pos);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u': {
switch (buf[6]) {
case 'e':
if (op == "tuple.extract"sv) {
auto ret = makeTupleExtract(ctx, pos);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'm':
if (op == "tuple.make"sv) {
auto ret = makeTupleMake(ctx, pos);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'u':
if (op == "unreachable"sv) {
auto ret = makeUnreachable(ctx, pos);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'v': {
switch (buf[5]) {
case 'a': {
switch (buf[7]) {
case 'd': {
switch (buf[8]) {
case '\0':
if (op == "v128.and"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::AndVec128);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'n':
if (op == "v128.andnot"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::AndNotVec128);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'y':
if (op == "v128.any_true"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::AnyTrueVec128);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'b':
if (op == "v128.bitselect"sv) {
auto ret = makeSIMDTernary(ctx, pos, SIMDTernaryOp::Bitselect);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'c':
if (op == "v128.const"sv) {
auto ret = makeConst(ctx, pos, Type::v128);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'l': {
switch (buf[9]) {
case '\0':
if (op == "v128.load"sv) {
auto ret = makeLoad(ctx, pos, Type::v128, /*signed=*/false, 16, /*isAtomic=*/false);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case '1': {
switch (buf[11]) {
case '_': {
switch (buf[12]) {
case 'l':
if (op == "v128.load16_lane"sv) {
auto ret = makeSIMDLoadStoreLane(ctx, pos, SIMDLoadStoreLaneOp::Load16LaneVec128, 2);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 's':
if (op == "v128.load16_splat"sv) {
auto ret = makeSIMDLoad(ctx, pos, SIMDLoadOp::Load16SplatVec128, 2);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'x': {
switch (buf[14]) {
case 's':
if (op == "v128.load16x4_s"sv) {
auto ret = makeSIMDLoad(ctx, pos, SIMDLoadOp::Load16x4SVec128, 8);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "v128.load16x4_u"sv) {
auto ret = makeSIMDLoad(ctx, pos, SIMDLoadOp::Load16x4UVec128, 8);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case '3': {
switch (buf[11]) {
case '_': {
switch (buf[12]) {
case 'l':
if (op == "v128.load32_lane"sv) {
auto ret = makeSIMDLoadStoreLane(ctx, pos, SIMDLoadStoreLaneOp::Load32LaneVec128, 4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 's':
if (op == "v128.load32_splat"sv) {
auto ret = makeSIMDLoad(ctx, pos, SIMDLoadOp::Load32SplatVec128, 4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'z':
if (op == "v128.load32_zero"sv) {
auto ret = makeSIMDLoad(ctx, pos, SIMDLoadOp::Load32ZeroVec128, 4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'x': {
switch (buf[14]) {
case 's':
if (op == "v128.load32x2_s"sv) {
auto ret = makeSIMDLoad(ctx, pos, SIMDLoadOp::Load32x2SVec128, 8);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "v128.load32x2_u"sv) {
auto ret = makeSIMDLoad(ctx, pos, SIMDLoadOp::Load32x2UVec128, 8);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case '6': {
switch (buf[12]) {
case 'l':
if (op == "v128.load64_lane"sv) {
auto ret = makeSIMDLoadStoreLane(ctx, pos, SIMDLoadStoreLaneOp::Load64LaneVec128, 8);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 's':
if (op == "v128.load64_splat"sv) {
auto ret = makeSIMDLoad(ctx, pos, SIMDLoadOp::Load64SplatVec128, 8);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'z':
if (op == "v128.load64_zero"sv) {
auto ret = makeSIMDLoad(ctx, pos, SIMDLoadOp::Load64ZeroVec128, 8);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case '8': {
switch (buf[10]) {
case '_': {
switch (buf[11]) {
case 'l':
if (op == "v128.load8_lane"sv) {
auto ret = makeSIMDLoadStoreLane(ctx, pos, SIMDLoadStoreLaneOp::Load8LaneVec128, 1);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 's':
if (op == "v128.load8_splat"sv) {
auto ret = makeSIMDLoad(ctx, pos, SIMDLoadOp::Load8SplatVec128, 1);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'x': {
switch (buf[13]) {
case 's':
if (op == "v128.load8x8_s"sv) {
auto ret = makeSIMDLoad(ctx, pos, SIMDLoadOp::Load8x8SVec128, 8);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'u':
if (op == "v128.load8x8_u"sv) {
auto ret = makeSIMDLoad(ctx, pos, SIMDLoadOp::Load8x8UVec128, 8);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
}
default: goto parse_error;
}
}
case 'n':
if (op == "v128.not"sv) {
auto ret = makeUnary(ctx, pos, UnaryOp::NotVec128);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 'o':
if (op == "v128.or"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::OrVec128);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case 's': {
switch (buf[10]) {
case '\0':
if (op == "v128.store"sv) {
auto ret = makeStore(ctx, pos, Type::v128, 16, /*isAtomic=*/false);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case '1':
if (op == "v128.store16_lane"sv) {
auto ret = makeSIMDLoadStoreLane(ctx, pos, SIMDLoadStoreLaneOp::Store16LaneVec128, 2);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case '3':
if (op == "v128.store32_lane"sv) {
auto ret = makeSIMDLoadStoreLane(ctx, pos, SIMDLoadStoreLaneOp::Store32LaneVec128, 4);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case '6':
if (op == "v128.store64_lane"sv) {
auto ret = makeSIMDLoadStoreLane(ctx, pos, SIMDLoadStoreLaneOp::Store64LaneVec128, 8);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
case '8':
if (op == "v128.store8_lane"sv) {
auto ret = makeSIMDLoadStoreLane(ctx, pos, SIMDLoadStoreLaneOp::Store8LaneVec128, 1);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
case 'x':
if (op == "v128.xor"sv) {
auto ret = makeBinary(ctx, pos, BinaryOp::XorVec128);
CHECK_ERR(ret);
return *ret;
}
goto parse_error;
default: goto parse_error;
}
}
default: goto parse_error;
}
parse_error:
return ctx.in.err(pos, "unrecognized instruction");
#endif // NEW_INSTRUCTION_PARSER
// clang-format on