summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/binary-reader-nop.h41
-rw-r--r--src/binary-reader-objdump.cc15
-rw-r--r--src/binary-reader-objdump.h3
-rw-r--r--src/binary-reader.cc62
-rw-r--r--src/binary-reader.h13
-rw-r--r--src/binary-writer.cc7
-rw-r--r--src/feature.cc32
-rw-r--r--src/feature.def26
-rw-r--r--src/feature.h44
-rw-r--r--src/interpreter-opcode.def12
-rw-r--r--src/interpreter.cc68
-rw-r--r--src/interpreter.h3
-rw-r--r--src/opcode.cc51
-rw-r--r--src/opcode.def382
-rw-r--r--src/opcode.h26
-rw-r--r--src/prebuilt/wast-lexer-gen.cc1799
-rw-r--r--src/tools/wasm-interp.cc10
-rw-r--r--src/tools/wasm-objdump.cc8
-rw-r--r--src/tools/wasm2wast.cc19
-rw-r--r--src/tools/wast-desugar.cc13
-rw-r--r--src/tools/wast2wasm.cc24
-rw-r--r--src/wast-lexer.cc59
-rw-r--r--src/wast-parser.cc28
-rw-r--r--src/wast-parser.h7
24 files changed, 1610 insertions, 1142 deletions
diff --git a/src/binary-reader-nop.h b/src/binary-reader-nop.h
index 7bb0ec6a..a85e79aa 100644
--- a/src/binary-reader-nop.h
+++ b/src/binary-reader-nop.h
@@ -94,7 +94,7 @@ class BinaryReaderNop : public BinaryReaderDelegate {
string_view field_name,
Index except_index,
TypeVector& sig) override {
- return AllowIfFutureExceptions();
+ return Result::Ok;
}
Result EndImportSection() override { return Result::Ok; }
@@ -188,12 +188,8 @@ class BinaryReaderNop : public BinaryReaderDelegate {
}
Result OnCallExpr(Index func_index) override { return Result::Ok; }
Result OnCallIndirectExpr(Index sig_index) override { return Result::Ok; }
- Result OnCatchExpr(Index except_index) override {
- return AllowIfFutureExceptions();
- }
- Result OnCatchAllExpr() override {
- return AllowIfFutureExceptions();
- }
+ Result OnCatchExpr(Index except_index) override { return Result::Ok; }
+ Result OnCatchAllExpr() override { return Result::Ok; }
Result OnCompareExpr(Opcode opcode) override { return Result::Ok; }
Result OnConvertExpr(Opcode opcode) override { return Result::Ok; }
Result OnCurrentMemoryExpr() override { return Result::Ok; }
@@ -220,9 +216,7 @@ class BinaryReaderNop : public BinaryReaderDelegate {
return Result::Ok;
}
Result OnNopExpr() override { return Result::Ok; }
- Result OnRethrowExpr(Index depth) override {
- return AllowIfFutureExceptions();
- }
+ Result OnRethrowExpr(Index depth) override { return Result::Ok; }
Result OnReturnExpr() override { return Result::Ok; }
Result OnSelectExpr() override { return Result::Ok; }
Result OnSetGlobalExpr(Index global_index) override { return Result::Ok; }
@@ -233,11 +227,9 @@ class BinaryReaderNop : public BinaryReaderDelegate {
return Result::Ok;
}
Result OnTeeLocalExpr(Index local_index) override { return Result::Ok; }
- Result OnThrowExpr(Index depth) override {
- return AllowIfFutureExceptions();
- }
+ Result OnThrowExpr(Index depth) override { return Result::Ok; }
Result OnTryExpr(Index num_types, Type* sig_types) override {
- return AllowIfFutureExceptions();
+ return Result::Ok;
}
Result OnUnaryExpr(Opcode opcode) override { return Result::Ok; }
Result OnUnreachableExpr() override { return Result::Ok; }
@@ -326,18 +318,12 @@ class BinaryReaderNop : public BinaryReaderDelegate {
Result EndRelocSection() override { return Result::Ok; }
/* Exception section */
- Result BeginExceptionSection(Offset size) override {
- return AllowIfFutureExceptions();
- }
- Result OnExceptionCount(Index count) override {
- return AllowIfFutureExceptions();
- }
+ Result BeginExceptionSection(Offset size) override { return Result::Ok; }
+ Result OnExceptionCount(Index count) override { return Result::Ok; }
Result OnExceptionType(Index index, TypeVector& sig) override {
- return AllowIfFutureExceptions();
- }
- Result EndExceptionSection() override {
- return AllowIfFutureExceptions();
+ return Result::Ok;
}
+ Result EndExceptionSection() override { return Result::Ok; }
/* Linking section */
Result BeginLinkingSection(Offset size) override { return Result::Ok; }
@@ -365,13 +351,6 @@ class BinaryReaderNop : public BinaryReaderDelegate {
Result OnInitExprI64ConstExpr(Index index, uint64_t value) override {
return Result::Ok;
}
-
- bool allow_future_exceptions = false;
-
- private:
- Result AllowIfFutureExceptions() const {
- return allow_future_exceptions ? Result::Ok : Result::Error;
- }
};
} // namespace wabt
diff --git a/src/binary-reader-objdump.cc b/src/binary-reader-objdump.cc
index f295a020..ad8f600f 100644
--- a/src/binary-reader-objdump.cc
+++ b/src/binary-reader-objdump.cc
@@ -70,7 +70,6 @@ BinaryReaderObjdumpBase::BinaryReaderObjdumpBase(const uint8_t* data,
data(data),
size(size) {
ZeroMemory(section_starts);
- BinaryReaderNop::allow_future_exceptions = options->allow_future_exceptions;
}
Result BinaryReaderObjdumpBase::BeginSection(BinarySection section_code,
@@ -211,7 +210,7 @@ class BinaryReaderObjdumpDisassemble : public BinaryReaderObjdumpBase {
Opcode current_opcode = Opcode::Unreachable;
Offset current_opcode_offset = 0;
- size_t last_opcode_end = 0;
+ Offset last_opcode_end = 0;
int indent_level = 0;
Index next_reloc = 0;
};
@@ -223,7 +222,7 @@ Result BinaryReaderObjdumpDisassemble::OnOpcode(Opcode opcode) {
}
if (last_opcode_end) {
- if (state->offset != last_opcode_end + 1) {
+ if (state->offset != last_opcode_end + opcode.GetLength()) {
Opcode missing_opcode = Opcode::FromCode(data[last_opcode_end]);
const char* opcode_name = missing_opcode.GetName();
fprintf(stderr,
@@ -249,12 +248,16 @@ void BinaryReaderObjdumpDisassemble::LogOpcode(const uint8_t* data,
Offset offset = current_opcode_offset;
// Print binary data
- printf(" %06" PRIzx ": %02x", offset - 1, current_opcode.GetCode());
+ printf(" %06" PRIzx ":", offset - 1);
+ if (current_opcode.HasPrefix())
+ printf(" %02x", current_opcode.GetPrefix());
+ printf(" %02x", current_opcode.GetCode());
for (size_t i = 0; i < data_size && i < IMMEDIATE_OCTET_COUNT;
i++, offset++) {
printf(" %02x", data[offset]);
}
- for (size_t i = data_size + 1; i < IMMEDIATE_OCTET_COUNT; i++) {
+ for (size_t i = data_size + current_opcode.GetLength();
+ i < IMMEDIATE_OCTET_COUNT; i++) {
printf(" ");
}
printf(" | ");
@@ -1102,7 +1105,7 @@ Result ReadBinaryObjdump(const uint8_t* data,
ReadBinaryOptions read_options;
read_options.read_debug_names = true;
read_options.log_stream = options->log_stream;
- read_options.allow_future_exceptions = options->allow_future_exceptions;
+ read_options.features = options->features;
switch (options->mode) {
case ObjdumpMode::Prepass: {
diff --git a/src/binary-reader-objdump.h b/src/binary-reader-objdump.h
index fbda3ffb..32585995 100644
--- a/src/binary-reader-objdump.h
+++ b/src/binary-reader-objdump.h
@@ -21,6 +21,7 @@
#include <vector>
#include "common.h"
+#include "feature.h"
#include "stream.h"
namespace wabt {
@@ -44,7 +45,7 @@ struct ObjdumpOptions {
bool disassemble;
bool debug;
bool relocs;
- bool allow_future_exceptions = false;
+ Features features;
ObjdumpMode mode;
const char* filename;
const char* section_name;
diff --git a/src/binary-reader.cc b/src/binary-reader.cc
index 9bdbf153..07feafae 100644
--- a/src/binary-reader.cc
+++ b/src/binary-reader.cc
@@ -48,10 +48,10 @@
} \
} while (0)
-#define ERROR_UNLESS_FUTURE_EXCEPTIONS_OPCODE(opcode) \
- do { \
- if (!options_->allow_future_exceptions) \
- return ReportUnexpectedOpcode(opcode); \
+#define ERROR_UNLESS_OPCODE_ENABLED(opcode) \
+ do { \
+ if (!opcode.IsEnabled(options_->features)) \
+ return ReportUnexpectedOpcode(opcode); \
} while (0)
#define CALLBACK0(member) \
@@ -269,17 +269,28 @@ Result BinaryReader::ReportUnexpectedOpcode(Opcode opcode,
const char* maybe_space = " ";
if (!message)
message = maybe_space = "";
- PrintError("unexpected opcode%s%s: %d (0x%x)",
- maybe_space, message, opcode.GetCode(), opcode.GetCode());
+ if (opcode.HasPrefix()) {
+ PrintError("unexpected opcode%s%s: %d %d (0x%x 0x%x)", maybe_space, message,
+ opcode.GetPrefix(), opcode.GetCode(), opcode.GetPrefix(),
+ opcode.GetCode());
+ } else {
+ PrintError("unexpected opcode%s%s: %d (0x%x)",
+ maybe_space, message, opcode.GetCode(), opcode.GetCode());
+ }
return Result::Error;
}
Result BinaryReader::ReadOpcode(Opcode* out_value, const char* desc) {
uint8_t value = 0;
- if (Failed(ReadU8(&value, desc))) {
- return Result::Error;
+ CHECK_RESULT(ReadU8(&value, desc));
+
+ if (Opcode::IsPrefixByte(value)) {
+ uint32_t code;
+ CHECK_RESULT(ReadU32Leb128(&code, desc));
+ *out_value = Opcode::FromCode(value, code);
+ } else {
+ *out_value = Opcode::FromCode(value);
}
- *out_value = Opcode::FromCode(value);
return Result::Ok;
}
@@ -1009,7 +1020,7 @@ Result BinaryReader::ReadFunctionBody(Offset end_offset) {
break;
case Opcode::Try: {
- ERROR_UNLESS_FUTURE_EXCEPTIONS_OPCODE(opcode);
+ ERROR_UNLESS_OPCODE_ENABLED(opcode);
Type sig_type;
CHECK_RESULT(ReadType(&sig_type, "try signature type"));
ERROR_UNLESS(is_inline_sig_type(sig_type),
@@ -1021,7 +1032,7 @@ Result BinaryReader::ReadFunctionBody(Offset end_offset) {
}
case Opcode::Catch: {
- ERROR_UNLESS_FUTURE_EXCEPTIONS_OPCODE(opcode);
+ ERROR_UNLESS_OPCODE_ENABLED(opcode);
Index index;
CHECK_RESULT(ReadIndex(&index, "exception index"));
CALLBACK(OnCatchExpr, index);
@@ -1030,14 +1041,14 @@ Result BinaryReader::ReadFunctionBody(Offset end_offset) {
}
case Opcode::CatchAll: {
- ERROR_UNLESS_FUTURE_EXCEPTIONS_OPCODE(opcode);
+ ERROR_UNLESS_OPCODE_ENABLED(opcode);
CALLBACK(OnCatchAllExpr);
CALLBACK0(OnOpcodeBare);
break;
}
case Opcode::Rethrow: {
- ERROR_UNLESS_FUTURE_EXCEPTIONS_OPCODE(opcode);
+ ERROR_UNLESS_OPCODE_ENABLED(opcode);
Index depth;
CHECK_RESULT(ReadIndex(&depth, "catch depth"));
CALLBACK(OnRethrowExpr, depth);
@@ -1046,7 +1057,7 @@ Result BinaryReader::ReadFunctionBody(Offset end_offset) {
}
case Opcode::Throw: {
- ERROR_UNLESS_FUTURE_EXCEPTIONS_OPCODE(opcode);
+ ERROR_UNLESS_OPCODE_ENABLED(opcode);
Index index;
CHECK_RESULT(ReadIndex(&index, "exception index"));
CALLBACK(OnThrowExpr, index);
@@ -1054,6 +1065,19 @@ Result BinaryReader::ReadFunctionBody(Offset end_offset) {
break;
}
+ case Opcode::I32TruncSSatF32:
+ case Opcode::I32TruncUSatF32:
+ case Opcode::I32TruncSSatF64:
+ case Opcode::I32TruncUSatF64:
+ case Opcode::I64TruncSSatF32:
+ case Opcode::I64TruncUSatF32:
+ case Opcode::I64TruncSSatF64:
+ case Opcode::I64TruncUSatF64:
+ ERROR_UNLESS_OPCODE_ENABLED(opcode);
+ CALLBACK(OnConvertExpr, opcode);
+ CALLBACK0(OnOpcodeBare);
+ break;
+
default:
return ReportUnexpectedOpcode(opcode);
}
@@ -1291,7 +1315,7 @@ Result BinaryReader::ReadCustomSection(Offset section_size) {
CHECK_RESULT(ReadRelocSection(section_size));
} else if (section_name == WABT_BINARY_SECTION_LINKING) {
CHECK_RESULT(ReadLinkingSection(section_size));
- } else if (options_->allow_future_exceptions &&
+ } else if (options_->features.exceptions_enabled() &&
section_name == WABT_BINARY_SECTION_EXCEPTION) {
CHECK_RESULT(ReadExceptionSection(section_size));
} else {
@@ -1405,8 +1429,8 @@ Result BinaryReader::ReadImportSection(Offset section_size) {
}
case ExternalKind::Except: {
- if (!options_->allow_future_exceptions)
- PrintError("invalid import exception kind: exceptions not allowed");
+ ERROR_UNLESS(options_->features.exceptions_enabled(),
+ "invalid import exception kind: exceptions not allowed");
TypeVector sig;
CHECK_RESULT(ReadExceptionType(sig));
CALLBACK(OnImport, i, module_name, field_name);
@@ -1527,8 +1551,8 @@ Result BinaryReader::ReadExportSection(Offset section_size) {
break;
case ExternalKind::Except:
// Note: Can't check if index valid, exceptions section comes later.
- if (!options_->allow_future_exceptions)
- PrintError("invalid export exception kind: exceptions not allowed");
+ ERROR_UNLESS(options_->features.exceptions_enabled(),
+ "invalid export exception kind: exceptions not allowed");
break;
}
diff --git a/src/binary-reader.h b/src/binary-reader.h
index cc653197..b510bce8 100644
--- a/src/binary-reader.h
+++ b/src/binary-reader.h
@@ -22,6 +22,7 @@
#include "binary.h"
#include "common.h"
+#include "feature.h"
#include "opcode.h"
#include "string-view.h"
@@ -31,12 +32,16 @@ class Stream;
struct ReadBinaryOptions {
ReadBinaryOptions() = default;
- ReadBinaryOptions(Stream* log_stream, bool read_debug_names)
- : log_stream(log_stream), read_debug_names(read_debug_names) {}
-
+ ReadBinaryOptions(const Features& features,
+ Stream* log_stream,
+ bool read_debug_names)
+ : features(features),
+ log_stream(log_stream),
+ read_debug_names(read_debug_names) {}
+
+ Features features;
Stream* log_stream = nullptr;
bool read_debug_names = false;
- bool allow_future_exceptions = false;
};
class BinaryReaderDelegate {
diff --git a/src/binary-writer.cc b/src/binary-writer.cc
index 5705fc1f..2a8e04da 100644
--- a/src/binary-writer.cc
+++ b/src/binary-writer.cc
@@ -142,7 +142,12 @@ void WriteStr(Stream* stream,
}
void WriteOpcode(Stream* stream, Opcode opcode) {
- stream->WriteU8Enum(opcode.GetCode(), opcode.GetName());
+ if (opcode.HasPrefix()) {
+ stream->WriteU8(opcode.GetPrefix(), "prefix");
+ WriteU32Leb128(stream, opcode.GetCode(), opcode.GetName());
+ } else {
+ stream->WriteU8(opcode.GetCode(), opcode.GetName());
+ }
}
void WriteType(Stream* stream, Type type) {
diff --git a/src/feature.cc b/src/feature.cc
new file mode 100644
index 00000000..c6df92c2
--- /dev/null
+++ b/src/feature.cc
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2017 WebAssembly Community Group participants
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "feature.h"
+
+#include "option-parser.h"
+
+namespace wabt {
+
+void Features::AddOptions(OptionParser* parser) {
+#define WABT_FEATURE(variable, flag, help) \
+ parser->AddOption("enable-" flag, help, \
+ [this]() { variable##_enabled_ = true; });
+
+#include "feature.def"
+#undef WABT_FEATURE
+}
+
+} // namespace wabt
diff --git a/src/feature.def b/src/feature.def
new file mode 100644
index 00000000..eb2f2625
--- /dev/null
+++ b/src/feature.def
@@ -0,0 +1,26 @@
+/*
+ * Copyright 2017 WebAssembly Community Group participants
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef WABT_FEATURE
+#error "You must define WABT_FEATURE before including this file."
+#endif
+
+/*
+ * variable flag help
+ * ========================================================================= */
+
+WABT_FEATURE(exceptions, "exceptions", "Experimental exception handling")
+WABT_FEATURE(sat_float_to_int, "saturating-float-to-int", "Saturating float-to-int operators")
diff --git a/src/feature.h b/src/feature.h
new file mode 100644
index 00000000..b406ae1b
--- /dev/null
+++ b/src/feature.h
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2017 WebAssembly Community Group participants
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef WABT_FEATURE_H_
+#define WABT_FEATURE_H_
+
+#include "common.h"
+
+namespace wabt {
+
+class OptionParser;
+
+class Features {
+ public:
+ void AddOptions(OptionParser*);
+
+#define WABT_FEATURE(variable, flag, help) \
+ bool variable##_enabled() const { return variable##_enabled_; }
+#include "feature.def"
+#undef WABT_FEATURE
+
+ private:
+#define WABT_FEATURE(variable, flag, help) \
+ bool variable##_enabled_ = false;
+#include "feature.def"
+#undef WABT_FEATURE
+};
+
+} // namespace wabt
+
+#endif // WABT_FEATURE_H_
diff --git a/src/interpreter-opcode.def b/src/interpreter-opcode.def
index 72569337..78730704 100644
--- a/src/interpreter-opcode.def
+++ b/src/interpreter-opcode.def
@@ -27,12 +27,12 @@
* Name: used to generate the opcode enum
* text: a string of the opcode name in the text format
*
- * tr t1 t2 m code Name text
+ * tr t1 t2 m prefix code Name text
* ============================================================ */
#include "opcode.def"
-WABT_OPCODE(___, ___, ___, 0, 0xc0, Alloca, "alloca")
-WABT_OPCODE(___, ___, ___, 0, 0xc1, BrUnless, "br_unless")
-WABT_OPCODE(___, ___, ___, 0, 0xc2, CallHost, "call_host")
-WABT_OPCODE(___, ___, ___, 0, 0xc3, Data, "data")
-WABT_OPCODE(___, ___, ___, 0, 0xc4, DropKeep, "drop_keep")
+WABT_OPCODE(___, ___, ___, 0, 0, 0xc0, Alloca, "alloca")
+WABT_OPCODE(___, ___, ___, 0, 0, 0xc1, BrUnless, "br_unless")
+WABT_OPCODE(___, ___, ___, 0, 0, 0xc2, CallHost, "call_host")
+WABT_OPCODE(___, ___, ___, 0, 0, 0xc3, Data, "data")
+WABT_OPCODE(___, ___, ___, 0, 0, 0xc4, DropKeep, "drop_keep")
diff --git a/src/interpreter.cc b/src/interpreter.cc
index fdfc6ed5..793d1aef 100644
--- a/src/interpreter.cc
+++ b/src/interpreter.cc
@@ -30,7 +30,8 @@ namespace wabt {
namespace interpreter {
static const char* s_opcode_name[] = {
-#define WABT_OPCODE(rtype, type1, type2, mem_size, code, NAME, text) text,
+#define WABT_OPCODE(rtype, type1, type2, mem_size, prefix, code, NAME, text) \
+ text,
#include "interpreter-opcode.def"
#undef WABT_OPCODE
@@ -1053,6 +1054,23 @@ Result IntTrunc(ValueTypeRep<T> v_rep, ValueTypeRep<R>* out_result) {
return Result::Ok;
}
+// i{32,64}.trunc_{s,u}:sat/f{32,64}
+template <typename R, typename T>
+ValueTypeRep<R> IntTruncSat(ValueTypeRep<T> v_rep) {
+ typedef FloatTraits<T> Traits;
+ if (WABT_UNLIKELY(Traits::IsNan(v_rep))) {
+ return 0;
+ } else if (WABT_UNLIKELY((!IsConversionInRange<R, T>(v_rep)))) {
+ if (v_rep & Traits::kSignMask) {
+ return ToRep(std::numeric_limits<R>::min());
+ } else {
+ return ToRep(std::numeric_limits<R>::max());
+ }
+ } else {
+ return ToRep(static_cast<R>(FromRep<T>(v_rep)));
+ }
+}
+
bool Environment::FuncSignaturesAreEqual(Index sig_index_0,
Index sig_index_1) const {
if (sig_index_0 == sig_index_1)
@@ -1797,18 +1815,34 @@ Result Thread::Run(int num_instructions, IstreamOffset* call_stack_return_top) {
CHECK_TRAP(UnopTrap(IntTrunc<int32_t, float>));
break;
+ case Opcode::I32TruncSSatF32:
+ CHECK_TRAP(Unop(IntTruncSat<int32_t, float>));
+ break;
+
case Opcode::I32TruncSF64:
CHECK_TRAP(UnopTrap(IntTrunc<int32_t, double>));
break;
+ case Opcode::I32TruncSSatF64:
+ CHECK_TRAP(Unop(IntTruncSat<int32_t, double>));
+ break;
+
case Opcode::I32TruncUF32:
CHECK_TRAP(UnopTrap(IntTrunc<uint32_t, float>));
break;
+ case Opcode::I32TruncUSatF32:
+ CHECK_TRAP(Unop(IntTruncSat<uint32_t, float>));
+ break;
+
case Opcode::I32TruncUF64:
CHECK_TRAP(UnopTrap(IntTrunc<uint32_t, double>));
break;
+ case Opcode::I32TruncUSatF64:
+ CHECK_TRAP(Unop(IntTruncSat<uint32_t, double>));
+ break;
+
case Opcode::I32WrapI64:
CHECK_TRAP(Push<uint32_t>(Pop<uint64_t>()));
break;
@@ -1817,18 +1851,34 @@ Result Thread::Run(int num_instructions, IstreamOffset* call_stack_return_top) {
CHECK_TRAP(UnopTrap(IntTrunc<int64_t, float>));
break;
+ case Opcode::I64TruncSSatF32:
+ CHECK_TRAP(Unop(IntTruncSat<int64_t, float>));
+ break;
+
case Opcode::I64TruncSF64:
CHECK_TRAP(UnopTrap(IntTrunc<int64_t, double>));
break;
+ case Opcode::I64TruncSSatF64:
+ CHECK_TRAP(Unop(IntTruncSat<int64_t, double>));
+ break;
+
case Opcode::I64TruncUF32:
CHECK_TRAP(UnopTrap(IntTrunc<uint64_t, float>));
break;
+ case Opcode::I64TruncUSatF32:
+ CHECK_TRAP(Unop(IntTruncSat<uint64_t, float>));
+ break;
+
case Opcode::I64TruncUF64:
CHECK_TRAP(UnopTrap(IntTrunc<uint64_t, double>));
break;
+ case Opcode::I64TruncUSatF64:
+ CHECK_TRAP(Unop(IntTruncSat<uint64_t, double>));
+ break;
+
case Opcode::I64ExtendSI32:
CHECK_TRAP(Push<uint64_t>(Pop<int32_t>()));
break;
@@ -2270,6 +2320,10 @@ void Thread::Trace(Stream* stream) {
case Opcode::I64TruncUF32:
case Opcode::F64PromoteF32:
case Opcode::I32ReinterpretF32:
+ case Opcode::I32TruncSSatF32:
+ case Opcode::I32TruncUSatF32:
+ case Opcode::I64TruncSSatF32:
+ case Opcode::I64TruncUSatF32:
stream->Writef("%s %g\n", GetOpcodeName(opcode),
Bitcast<float>(Top().i32));
break;
@@ -2280,6 +2334,10 @@ void Thread::Trace(Stream* stream) {
case Opcode::I64TruncUF64:
case Opcode::F32DemoteF64:
case Opcode::I64ReinterpretF64:
+ case Opcode::I32TruncSSatF64:
+ case Opcode::I32TruncUSatF64:
+ case Opcode::I64TruncSSatF64:
+ case Opcode::I64TruncUSatF64:
stream->Writef("%s %g\n", GetOpcodeName(opcode),
Bitcast<double>(Top().i64));
break;
@@ -2586,6 +2644,14 @@ void Environment::Disassemble(Stream* stream,
case Opcode::F32ReinterpretI32:
case Opcode::F64ConvertSI32:
case Opcode::F64ConvertUI32:
+ case Opcode::I32TruncSSatF32:
+ case Opcode::I32TruncUSatF32:
+ case Opcode::I64TruncSSatF32:
+ case Opcode::I64TruncUSatF32:
+ case Opcode::I32TruncSSatF64:
+ case Opcode::I32TruncUSatF64:
+ case Opcode::I64TruncSSatF64:
+ case Opcode::I64TruncUSatF64:
stream->Writef("%s %%[-1]\n", GetOpcodeName(opcode));
break;
diff --git a/src/interpreter.h b/src/interpreter.h
index 1b91f5a1..fd1ac5e7 100644
--- a/src/interpreter.h
+++ b/src/interpreter.h
@@ -95,7 +95,8 @@ static const IstreamOffset kInvalidIstreamOffset = ~0;
// NOTE: These enumeration values do not match the standard binary encoding.
enum class Opcode {
-#define WABT_OPCODE(rtype, type1, type2, mem_size, code, Name, text) Name,
+#define WABT_OPCODE(rtype, type1, type2, mem_size, prefix, code, Name, text) \
+ Name,
#include "interpreter-opcode.def"
#undef WABT_OPCODE
Invalid,
diff --git a/src/opcode.cc b/src/opcode.cc
index bb68d576..aee21f01 100644
--- a/src/opcode.cc
+++ b/src/opcode.cc
@@ -18,33 +18,44 @@
#include <algorithm>
+#include "feature.h"
+
namespace wabt {
// static
Opcode::Info Opcode::infos_[] = {
-#define WABT_OPCODE(rtype, type1, type2, mem_size, code, Name, text) \
- {text, Type::rtype, Type::type1, Type::type2, mem_size, code},
+#define WABT_OPCODE(rtype, type1, type2, mem_size, prefix, code, Name, text) \
+ {text, Type::rtype, Type::type1, Type::type2, \
+ mem_size, prefix, code, PrefixCode(prefix, code)},
#include "opcode.def"
#undef WABT_OPCODE
};
-#define WABT_OPCODE(rtype, type1, type2, mem_size, code, Name, text) \
+#define WABT_OPCODE(rtype, type1, type2, mem_size, prefix, code, Name, text) \
/* static */ Opcode Opcode::Name##_Opcode(Opcode::Name);
#include "opcode.def"
#undef WABT_OPCODE
// static
Opcode::Info Opcode::invalid_info_ = {
- "<invalid>", Type::Void, Type::Void, Type::Void, 0, 0,
+ "<invalid>", Type::Void, Type::Void, Type::Void, 0, 0, 0, 0,
};
// static
Opcode Opcode::FromCode(uint32_t code) {
- auto iter = std::lower_bound(
- infos_, infos_ + WABT_ARRAY_SIZE(infos_), code,
- [](const Info& info, uint32_t code) { return info.code < code; });
+ return FromCode(0, code);
+}
+
+// static
+Opcode Opcode::FromCode(uint8_t prefix, uint32_t code) {
+ uint32_t prefix_code = PrefixCode(prefix, code);
+ auto iter =
+ std::lower_bound(infos_, infos_ + WABT_ARRAY_SIZE(infos_), prefix_code,
+ [](const Info& info, uint32_t prefix_code) {
+ return info.prefix_code < prefix_code;
+ });
- if (iter->code != code)
+ if (iter->prefix_code != prefix_code)
return Opcode(Invalid);
return Opcode(static_cast<Enum>(iter - infos_));
@@ -65,4 +76,28 @@ Address Opcode::GetAlignment(Address alignment) const {
return alignment;
}
+bool Opcode::IsEnabled(const Features& features) const {
+ switch (enum_) {
+ case Opcode::Try:
+ case Opcode::Catch:
+ case Opcode::Throw:
+ case Opcode::Rethrow:
+ case Opcode::CatchAll:
+ return features.exceptions_enabled();
+
+ case Opcode::I32TruncSSatF32:
+ case Opcode::I32TruncUSatF32:
+ case Opcode::I32TruncSSatF64:
+ case Opcode::I32TruncUSatF64:
+ case Opcode::I64TruncSSatF32:
+ case Opcode::I64TruncUSatF32:
+ case Opcode::I64TruncSSatF64:
+ case Opcode::I64TruncUSatF64:
+ return features.sat_float_to_int_enabled();
+
+ default:
+ return true;
+ }
+}
+
} // end anonymous namespace
diff --git a/src/opcode.def b/src/opcode.def
index a683c13c..9aa4c0ac 100644
--- a/src/opcode.def
+++ b/src/opcode.def
@@ -19,191 +19,201 @@
#endif
/*
- * tr: result type
- * t1: type of the 1st parameter
- * t2: type of the 2nd parameter
- * m: memory size of the operation, if any
- * code: opcode
- * Name: used to generate the opcode enum
- * text: a string of the opcode name in the text format
+ * tr: result type
+ * t1: type of the 1st parameter
+ * t2: type of the 2nd parameter
+ * m: memory size of the operation, if any
+ * prefix: the 1-byte opcode prefix, if any
+ * code: opcode
+ * Name: used to generate the opcode enum
+ * text: a string of the opcode name in the text format
*
- * tr t1 t2 m code Name text
- * ============================================================ */
+ * tr t1 t2 m prefix code Name text
+ * ===================================================== */
-WABT_OPCODE(___, ___, ___, 0, 0x00, Unreachable, "unreachable")
-WABT_OPCODE(___, ___, ___, 0, 0x01, Nop, "nop")
-WABT_OPCODE(___, ___, ___, 0, 0x02, Block, "block")
-WABT_OPCODE(___, ___, ___, 0, 0x03, Loop, "loop")
-WABT_OPCODE(___, ___, ___, 0, 0x04, If, "if")
-WABT_OPCODE(___, ___, ___, 0, 0x05, Else, "else")
-WABT_OPCODE(___, ___, ___, 0, 0x06, Try, "try")
-WABT_OPCODE(___, ___, ___, 0, 0x07, Catch, "catch")
-WABT_OPCODE(___, ___, ___, 0, 0x08, Throw, "throw")
-WABT_OPCODE(___, ___, ___, 0, 0x09, Rethrow, "rethrow")
-WABT_OPCODE(___, ___, ___, 0, 0x0a, CatchAll, "catch_all")
-WABT_OPCODE(___, ___, ___, 0, 0x0b, End, "end")
-WABT_OPCODE(___, ___, ___, 0, 0x0c, Br, "br")
-WABT_OPCODE(___, ___, ___, 0, 0x0d, BrIf, "br_if")
-WABT_OPCODE(___, ___, ___, 0, 0x0e, BrTable, "br_table")
-WABT_OPCODE(___, ___, ___, 0, 0x0f, Return, "return")
-WABT_OPCODE(___, ___, ___, 0, 0x10, Call, "call")
-WABT_OPCODE(___, ___, ___, 0, 0x11, CallIndirect, "call_indirect")
-WABT_OPCODE(___, ___, ___, 0, 0x1a, Drop, "drop")
-WABT_OPCODE(___, ___, ___, 0, 0x1b, Select, "select")
-WABT_OPCODE(___, ___, ___, 0, 0x20, GetLocal, "get_local")
-WABT_OPCODE(___, ___, ___, 0, 0x21, SetLocal, "set_local")
-WABT_OPCODE(___, ___, ___, 0, 0x22, TeeLocal, "tee_local")
-WABT_OPCODE(___, ___, ___, 0, 0x23, GetGlobal, "get_global")
-WABT_OPCODE(___, ___, ___, 0, 0x24, SetGlobal, "set_global")
-WABT_OPCODE(I32, I32, ___, 4, 0x28, I32Load, "i32.load")
-WABT_OPCODE(I64, I32, ___, 8, 0x29, I64Load, "i64.load")
-WABT_OPCODE(F32, I32, ___, 4, 0x2a, F32Load, "f32.load")
-WABT_OPCODE(F64, I32, ___, 8, 0x2b, F64Load, "f64.load")
-WABT_OPCODE(I32, I32, ___, 1, 0x2c, I32Load8S, "i32.load8_s")
-WABT_OPCODE(I32, I32, ___, 1, 0x2d, I32Load8U, "i32.load8_u")
-WABT_OPCODE(I32, I32, ___, 2, 0x2e, I32Load16S, "i32.load16_s")
-WABT_OPCODE(I32, I32, ___, 2, 0x2f, I32Load16U, "i32.load16_u")
-WABT_OPCODE(I64, I32, ___, 1, 0x30, I64Load8S, "i64.load8_s")
-WABT_OPCODE(I64, I32, ___, 1, 0x31, I64Load8U, "i64.load8_u")
-WABT_OPCODE(I64, I32, ___, 2, 0x32, I64Load16S, "i64.load16_s")
-WABT_OPCODE(I64, I32, ___, 2, 0x33, I64Load16U, "i64.load16_u")
-WABT_OPCODE(I64, I32, ___, 4, 0x34, I64Load32S, "i64.load32_s")
-WABT_OPCODE(I64, I32, ___, 4, 0x35, I64Load32U, "i64.load32_u")
-WABT_OPCODE(___, I32, I32, 4, 0x36, I32Store, "i32.store")
-WABT_OPCODE(___, I32, I64, 8, 0x37, I64Store, "i64.store")
-WABT_OPCODE(___, I32, F32, 4, 0x38, F32Store, "f32.store")
-WABT_OPCODE(___, I32, F64, 8, 0x39, F64Store, "f64.store")
-WABT_OPCODE(___, I32, I32, 1, 0x3a, I32Store8, "i32.store8")
-WABT_OPCODE(___, I32, I32, 2, 0x3b, I32Store16, "i32.store16")
-WABT_OPCODE(___, I32, I64, 1, 0x3c, I64Store8, "i64.store8")
-WABT_OPCODE(___, I32, I64, 2, 0x3d, I64Store16, "i64.store16")
-WABT_OPCODE(___, I32, I64, 4, 0x3e, I64Store32, "i64.store32")
-WABT_OPCODE(I32, ___, ___, 0, 0x3f, CurrentMemory, "current_memory")
-WABT_OPCODE(I32, I32, ___, 0, 0x40, GrowMemory, "grow_memory")
-WABT_OPCODE(I32, ___, ___, 0, 0x41, I32Const, "i32.const")
-WABT_OPCODE(I64, ___, ___, 0, 0x42, I64Const, "i64.const")
-WABT_OPCODE(F32, ___, ___, 0, 0x43, F32Const, "f32.const")
-WABT_OPCODE(F64, ___, ___, 0, 0x44, F64Const, "f64.const")
-WABT_OPCODE(I32, I32, ___, 0, 0x45, I32Eqz, "i32.eqz")
-WABT_OPCODE(I32, I32, I32, 0, 0x46, I32Eq, "i32.eq")
-WABT_OPCODE(I32, I32, I32, 0, 0x47, I32Ne, "i32.ne")
-WABT_OPCODE(I32, I32, I32, 0, 0x48, I32LtS, "i32.lt_s")
-WABT_OPCODE(I32, I32, I32, 0, 0x49, I32LtU, "i32.lt_u")
-WABT_OPCODE(I32, I32, I32, 0, 0x4a, I32GtS, "i32.gt_s")
-WABT_OPCODE(I32, I32, I32, 0, 0x4b, I32GtU, "i32.gt_u")
-WABT_OPCODE(I32, I32, I32, 0, 0x4c, I32LeS, "i32.le_s")
-WABT_OPCODE(I32, I32, I32, 0, 0x4d, I32LeU, "i32.le_u")
-WABT_OPCODE(I32, I32, I32, 0, 0x4e, I32GeS, "i32.ge_s")
-WABT_OPCODE(I32, I32, I32, 0, 0x4f, I32GeU, "i32.ge_u")
-WABT_OPCODE(I32, I64, ___, 0, 0x50, I64Eqz, "i64.eqz")
-WABT_OPCODE(I32, I64, I64, 0, 0x51, I64Eq, "i64.eq")
-WABT_OPCODE(I32, I64, I64, 0, 0x52, I64Ne, "i64.ne")
-WABT_OPCODE(I32, I64, I64, 0, 0x53, I64LtS, "i64.lt_s")
-WABT_OPCODE(I32, I64, I64, 0, 0x54, I64LtU, "i64.lt_u")
-WABT_OPCODE(I32, I64, I64, 0, 0x55, I64GtS, "i64.gt_s")
-WABT_OPCODE(I32, I64, I64, 0, 0x56, I64GtU, "i64.gt_u")
-WABT_OPCODE(I32, I64, I64, 0, 0x57, I64LeS, "i64.le_s")
-WABT_OPCODE(I32, I64, I64, 0, 0x58, I64LeU, "i64.le_u")
-WABT_OPCODE(I32, I64, I64, 0, 0x59, I64GeS, "i64.ge_s")
-WABT_OPCODE(I32, I64, I64, 0, 0x5a, I64GeU, "i64.ge_u")
-WABT_OPCODE(I32, F32, F32, 0, 0x5b, F32Eq, "f32.eq")
-WABT_OPCODE(I32, F32, F32, 0, 0x5c, F32Ne, "f32.ne")
-WABT_OPCODE(I32, F32, F32, 0, 0x5d, F32Lt, "f32.lt")
-WABT_OPCODE(I32, F32, F32, 0, 0x5e, F32Gt, "f32.gt")
-WABT_OPCODE(I32, F32, F32, 0, 0x5f, F32Le, "f32.le")
-WABT_OPCODE(I32, F32, F32, 0, 0x60, F32Ge, "f32.ge")
-WABT_OPCODE(I32, F64, F64, 0, 0x61, F64Eq, "f64.eq")
-WABT_OPCODE(I32, F64, F64, 0, 0x62, F64Ne, "f64.ne")
-WABT_OPCODE(I32, F64, F64, 0, 0x63, F64Lt, "f64.lt")
-WABT_OPCODE(I32, F64, F64, 0, 0x64, F64Gt, "f64.gt")
-WABT_OPCODE(I32, F64, F64, 0, 0x65, F64Le, "f64.le")
-WABT_OPCODE(I32, F64, F64, 0, 0x66, F64Ge, "f64.ge")
-WABT_OPCODE(I32, I32, ___, 0, 0x67, I32Clz, "i32.clz")
-WABT_OPCODE(I32, I32, ___, 0, 0x68, I32Ctz, "i32.ctz")
-WABT_OPCODE(I32, I32, ___, 0, 0x69, I32Popcnt, "i32.popcnt")
-WABT_OPCODE(I32, I32, I32, 0, 0x6a, I32Add, "i32.add")
-WABT_OPCODE(I32, I32, I32, 0, 0x6b, I32Sub, "i32.sub")
-WABT_OPCODE(I32, I32, I32, 0, 0x6c, I32Mul, "i32.mul")
-WABT_OPCODE(I32, I32, I32, 0, 0x6d, I32DivS, "i32.div_s")
-WABT_OPCODE(I32, I32, I32, 0, 0x6e, I32DivU, "i32.div_u")
-WABT_OPCODE(I32, I32, I32, 0, 0x6f, I32RemS, "i32.rem_s")
-WABT_OPCODE(I32, I32, I32, 0, 0x70, I32RemU, "i32.rem_u")
-WABT_OPCODE(I32, I32, I32, 0, 0x71, I32And, "i32.and")
-WABT_OPCODE(I32, I32, I32, 0, 0x72, I32Or, "i32.or")
-WABT_OPCODE(I32, I32, I32, 0, 0x73, I32Xor, "i32.xor")
-WABT_OPCODE(I32, I32, I32, 0, 0x74, I32Shl, "i32.shl")
-WABT_OPCODE(I32, I32, I32, 0, 0x75, I32ShrS, "i32.shr_s")
-WABT_OPCODE(I32, I32, I32, 0, 0x76, I32ShrU, "i32.shr_u")
-WABT_OPCODE(I32, I32, I32, 0, 0x77, I32Rotl, "i32.rotl")
-WABT_OPCODE(I32, I32, I32, 0, 0x78, I32Rotr, "i32.rotr")
-WABT_OPCODE(I64, I64, ___, 0, 0x79, I64Clz, "i64.clz")
-WABT_OPCODE(I64, I64, ___, 0, 0x7a, I64Ctz, "i64.ctz")
-WABT_OPCODE(I64, I64, ___, 0, 0x7b, I64Popcnt, "i64.popcnt")
-WABT_OPCODE(I64, I64, I64, 0, 0x7c, I64Add, "i64.add")
-WABT_OPCODE(I64, I64, I64, 0, 0x7d, I64Sub, "i64.sub")
-WABT_OPCODE(I64, I64, I64, 0, 0x7e, I64Mul, "i64.mul")
-WABT_OPCODE(I64, I64, I64, 0, 0x7f, I64DivS, "i64.div_s")
-WABT_OPCODE(I64, I64, I64, 0, 0x80, I64DivU, "i64.div_u")
-WABT_OPCODE(I64, I64, I64, 0, 0x81, I64RemS, "i64.rem_s")
-WABT_OPCODE(I64, I64, I64, 0, 0x82, I64RemU, "i64.rem_u")
-WABT_OPCODE(I64, I64, I64, 0, 0x83, I64And, "i64.and")
-WABT_OPCODE(I64, I64, I64, 0, 0x84, I64Or, "i64.or")
-WABT_OPCODE(I64, I64, I64, 0, 0x85, I64Xor, "i64.xor")
-WABT_OPCODE(I64, I64, I64, 0, 0x86, I64Shl, "i64.shl")
-WABT_OPCODE(I64, I64, I64, 0, 0x87, I64ShrS, "i64.shr_s")
-WABT_OPCODE(I64, I64, I64, 0, 0x88, I64ShrU, "i64.shr_u")
-WABT_OPCODE(I64, I64, I64, 0, 0x89, I64Rotl, "i64.rotl")
-WABT_OPCODE(I64, I64, I64, 0, 0x8a, I64Rotr, "i64.rotr")
-WABT_OPCODE(F32, F32, F32, 0, 0x8b, F32Abs, "f32.abs")
-WABT_OPCODE(F32, F32, F32, 0, 0x8c, F32Neg, "f32.neg")
-WABT_OPCODE(F32, F32, F32, 0, 0x8d, F32Ceil, "f32.ceil")
-WABT_OPCODE(F32, F32, F32, 0, 0x8e, F32Floor, "f32.floor")
-WABT_OPCODE(F32, F32, F32, 0, 0x8f, F32Trunc, "f32.trunc")
-WABT_OPCODE(F32, F32, F32, 0, 0x90, F32Nearest, "f32.nearest")
-WABT_OPCODE(F32, F32, F32, 0, 0x91, F32Sqrt, "f32.sqrt")
-WABT_OPCODE(F32, F32, F32, 0, 0x92, F32Add, "f32.add")
-WABT_OPCODE(F32, F32, F32, 0, 0x93, F32Sub, "f32.sub")
-WABT_OPCODE(F32, F32, F32, 0, 0x94, F32Mul, "f32.mul")
-WABT_OPCODE(F32, F32, F32, 0, 0x95, F32Div, "f32.div")
-WABT_OPCODE(F32, F32, F32, 0, 0x96, F32Min, "f32.min")
-WABT_OPCODE(F32, F32, F32, 0, 0x97, F32Max, "f32.max")
-WABT_OPCODE(F32, F32, F32, 0, 0x98, F32Copysign, "f32.copysign")
-WABT_OPCODE(F64, F64, F64, 0, 0x99, F64Abs, "f64.abs")
-WABT_OPCODE(F64, F64, F64, 0, 0x9a, F64Neg, "f64.neg")
-WABT_OPCODE(F64, F64, F64, 0, 0x9b, F64Ceil, "f64.ceil")
-WABT_OPCODE(F64, F64, F64, 0, 0x9c, F64Floor, "f64.floor")
-WABT_OPCODE(F64, F64, F64, 0, 0x9d, F64Trunc, "f64.trunc")
-WABT_OPCODE(F64, F64, F64, 0, 0x9e, F64Nearest, "f64.nearest")
-WABT_OPCODE(F64, F64, F64, 0, 0x9f, F64Sqrt, "f64.sqrt")
-WABT_OPCODE(F64, F64, F64, 0, 0xa0, F64Add, "f64.add")
-WABT_OPCODE(F64, F64, F64, 0, 0xa1, F64Sub, "f64.sub")
-WABT_OPCODE(F64, F64, F64, 0, 0xa2, F64Mul, "f64.mul")
-WABT_OPCODE(F64, F64, F64, 0, 0xa3, F64Div, "f64.div")
-WABT_OPCODE(F64, F64, F64, 0, 0xa4, F64Min, "f64.min")
-WABT_OPCODE(F64, F64, F64, 0, 0xa5, F64Max, "f64.max")
-WABT_OPCODE(F64, F64, F64, 0, 0xa6, F64Copysign, "f64.copysign")
-WABT_OPCODE(I32, I64, ___, 0, 0xa7, I32WrapI64, "i32.wrap/i64")
-WABT_OPCODE(I32, F32, ___, 0, 0xa8, I32TruncSF32, "i32.trunc_s/f32")
-WABT_OPCODE(I32, F32, ___, 0, 0xa9, I32TruncUF32, "i32.trunc_u/f32")
-WABT_OPCODE(I32, F64, ___, 0, 0xaa, I32TruncSF64, "i32.trunc_s/f64")
-WABT_OPCODE(I32, F64, ___, 0, 0xab, I32TruncUF64, "i32.trunc_u/f64")
-WABT_OPCODE(I64, I32, ___, 0, 0xac, I64ExtendSI32, "i64.extend_s/i32")
-WABT_OPCODE(I64, I32, ___, 0, 0xad, I64ExtendUI32, "i64.extend_u/i32")
-WABT_OPCODE(I64, F32, ___, 0, 0xae, I64TruncSF32, "i64.trunc_s/f32")
-WABT_OPCODE(I64, F32, ___, 0, 0xaf, I64TruncUF32, "i64.trunc_u/f32")
-WABT_OPCODE(I64, F64, ___, 0, 0xb0, I64TruncSF64, "i64.trunc_s/f64")
-WABT_OPCODE(I64, F64, ___, 0, 0xb1, I64TruncUF64, "i64.trunc_u/f64")
-WABT_OPCODE(F32, I32, ___, 0, 0xb2, F32ConvertSI32, "f32.convert_s/i32")
-WABT_OPCODE(F32, I32, ___, 0, 0xb3, F32ConvertUI32, "f32.convert_u/i32")
-WABT_OPCODE(F32, I64, ___, 0, 0xb4, F32ConvertSI64, "f32.convert_s/i64")
-WABT_OPCODE(F32, I64, ___, 0, 0xb5, F32ConvertUI64, "f32.convert_u/i64")
-WABT_OPCODE(F32, F64, ___, 0, 0xb6, F32DemoteF64, "f32.demote/f64")
-WABT_OPCODE(F64, I32, ___, 0, 0xb7, F64ConvertSI32, "f64.convert_s/i32")
-WABT_OPCODE(F64, I32, ___, 0, 0xb8, F64ConvertUI32, "f64.convert_u/i32")
-WABT_OPCODE(F64, I64, ___, 0, 0xb9, F64ConvertSI64, "f64.convert_s/i64")
-WABT_OPCODE(F64, I64, ___, 0, 0xba, F64ConvertUI64, "f64.convert_u/i64")
-WABT_OPCODE(F64, F32, ___, 0, 0xbb, F64PromoteF32, "f64.promote/f32")
-WABT_OPCODE(I32, F32, ___, 0, 0xbc, I32ReinterpretF32, "i32.reinterpret/f32")
-WABT_OPCODE(I64, F64, ___, 0, 0xbd, I64ReinterpretF64, "i64.reinterpret/f64")
-WABT_OPCODE(F32, I32, ___, 0, 0xbe, F32ReinterpretI32, "f32.reinterpret/i32")
-WABT_OPCODE(F64, I64, ___, 0, 0xbf, F64ReinterpretI64, "f64.reinterpret/i64")
+WABT_OPCODE(___, ___, ___, 0, 0, 0x00, Unreachable, "unreachable")
+WABT_OPCODE(___, ___, ___, 0, 0, 0x01, Nop, "nop")
+WABT_OPCODE(___, ___, ___, 0, 0, 0x02, Block, "block")
+WABT_OPCODE(___, ___, ___, 0, 0, 0x03, Loop, "loop")
+WABT_OPCODE(___, ___, ___, 0, 0, 0x04, If, "if")
+WABT_OPCODE(___, ___, ___, 0, 0, 0x05, Else, "else")
+WABT_OPCODE(___, ___, ___, 0, 0, 0x06, Try, "try")
+WABT_OPCODE(___, ___, ___, 0, 0, 0x07, Catch, "catch")
+WABT_OPCODE(___, ___, ___, 0, 0, 0x08, Throw, "throw")
+WABT_OPCODE(___, ___, ___, 0, 0, 0x09, Rethrow, "rethrow")
+WABT_OPCODE(___, ___, ___, 0, 0, 0x0a, CatchAll, "catch_all")
+WABT_OPCODE(___, ___, ___, 0, 0, 0x0b, End, "end")
+WABT_OPCODE(___, ___, ___, 0, 0, 0x0c, Br, "br")
+WABT_OPCODE(___, ___, ___, 0, 0, 0x0d, BrIf, "br_if")
+WABT_OPCODE(___, ___, ___, 0, 0, 0x0e, BrTable, "br_table")
+WABT_OPCODE(___, ___, ___, 0, 0, 0x0f, Return, "return")
+WABT_OPCODE(___, ___, ___, 0, 0, 0x10, Call, "call")
+WABT_OPCODE(___, ___, ___, 0, 0, 0x11, CallIndirect, "call_indirect")
+WABT_OPCODE(___, ___, ___, 0, 0, 0x1a, Drop, "drop")
+WABT_OPCODE(___, ___, ___, 0, 0, 0x1b, Select, "select")
+WABT_OPCODE(___, ___, ___, 0, 0, 0x20, GetLocal, "get_local")
+WABT_OPCODE(___, ___, ___, 0, 0, 0x21, SetLocal, "set_local")
+WABT_OPCODE(___, ___, ___, 0, 0, 0x22, TeeLocal, "tee_local")
+WABT_OPCODE(___, ___, ___, 0, 0, 0x23, GetGlobal, "get_global")
+WABT_OPCODE(___, ___, ___, 0, 0, 0x24, SetGlobal, "set_global")
+WABT_OPCODE(I32, I32, ___, 4, 0, 0x28, I32Load, "i32.load")
+WABT_OPCODE(I64, I32, ___, 8, 0, 0x29, I64Load, "i64.load")
+WABT_OPCODE(F32, I32, ___, 4, 0, 0x2a, F32Load, "f32.load")
+WABT_OPCODE(F64, I32, ___, 8, 0, 0x2b, F64Load, "f64.load")
+WABT_OPCODE(I32, I32, ___, 1, 0, 0x2c, I32Load8S, "i32.load8_s")
+WABT_OPCODE(I32, I32, ___, 1, 0, 0x2d, I32Load8U, "i32.load8_u")
+WABT_OPCODE(I32, I32, ___, 2, 0, 0x2e, I32Load16S, "i32.load16_s")
+WABT_OPCODE(I32, I32, ___, 2, 0, 0x2f, I32Load16U, "i32.load16_u")
+WABT_OPCODE(I64, I32, ___, 1, 0, 0x30, I64Load8S, "i64.load8_s")
+WABT_OPCODE(I64, I32, ___, 1, 0, 0x31, I64Load8U, "i64.load8_u")
+WABT_OPCODE(I64, I32, ___, 2, 0, 0x32, I64Load16S, "i64.load16_s")
+WABT_OPCODE(I64, I32, ___, 2, 0, 0x33, I64Load16U, "i64.load16_u")
+WABT_OPCODE(I64, I32, ___, 4, 0, 0x34, I64Load32S, "i64.load32_s")
+WABT_OPCODE(I64, I32, ___, 4, 0, 0x35, I64Load32U, "i64.load32_u")
+WABT_OPCODE(___, I32, I32, 4, 0, 0x36, I32Store, "i32.store")
+WABT_OPCODE(___, I32, I64, 8, 0, 0x37, I64Store, "i64.store")
+WABT_OPCODE(___, I32, F32, 4, 0, 0x38, F32Store, "f32.store")
+WABT_OPCODE(___, I32, F64, 8, 0, 0x39, F64Store, "f64.store")
+WABT_OPCODE(___, I32, I32, 1, 0, 0x3a, I32Store8, "i32.store8")
+WABT_OPCODE(___, I32, I32, 2, 0, 0x3b, I32Store16, "i32.store16")
+WABT_OPCODE(___, I32, I64, 1, 0, 0x3c, I64Store8, "i64.store8")
+WABT_OPCODE(___, I32, I64, 2, 0, 0x3d, I64Store16, "i64.store16")
+WABT_OPCODE(___, I32, I64, 4, 0, 0x3e, I64Store32, "i64.store32")
+WABT_OPCODE(I32, ___, ___, 0, 0, 0x3f, CurrentMemory, "current_memory")
+WABT_OPCODE(I32, I32, ___, 0, 0, 0x40, GrowMemory, "grow_memory")
+WABT_OPCODE(I32, ___, ___, 0, 0, 0x41, I32Const, "i32.const")
+WABT_OPCODE(I64, ___, ___, 0, 0, 0x42, I64Const, "i64.const")
+WABT_OPCODE(F32, ___, ___, 0, 0, 0x43, F32Const, "f32.const")
+WABT_OPCODE(F64, ___, ___, 0, 0, 0x44, F64Const, "f64.const")
+WABT_OPCODE(I32, I32, ___, 0, 0, 0x45, I32Eqz, "i32.eqz")
+WABT_OPCODE(I32, I32, I32, 0, 0, 0x46, I32Eq, "i32.eq")
+WABT_OPCODE(I32, I32, I32, 0, 0, 0x47, I32Ne, "i32.ne")
+WABT_OPCODE(I32, I32, I32, 0, 0, 0x48, I32LtS, "i32.lt_s")
+WABT_OPCODE(I32, I32, I32, 0, 0, 0x49, I32LtU, "i32.lt_u")
+WABT_OPCODE(I32, I32, I32, 0, 0, 0x4a, I32GtS, "i32.gt_s")
+WABT_OPCODE(I32, I32, I32, 0, 0, 0x4b, I32GtU, "i32.gt_u")
+WABT_OPCODE(I32, I32, I32, 0, 0, 0x4c, I32LeS, "i32.le_s")
+WABT_OPCODE(I32, I32, I32, 0, 0, 0x4d, I32LeU, "i32.le_u")
+WABT_OPCODE(I32, I32, I32, 0, 0, 0x4e, I32GeS, "i32.ge_s")
+WABT_OPCODE(I32, I32, I32, 0, 0, 0x4f, I32GeU, "i32.ge_u")
+WABT_OPCODE(I32, I64, ___, 0, 0, 0x50, I64Eqz, "i64.eqz")
+WABT_OPCODE(I32, I64, I64, 0, 0, 0x51, I64Eq, "i64.eq")
+WABT_OPCODE(I32, I64, I64, 0, 0, 0x52, I64Ne, "i64.ne")
+WABT_OPCODE(I32, I64, I64, 0, 0, 0x53, I64LtS, "i64.lt_s")
+WABT_OPCODE(I32, I64, I64, 0, 0, 0x54, I64LtU, "i64.lt_u")
+WABT_OPCODE(I32, I64, I64, 0, 0, 0x55, I64GtS, "i64.gt_s")
+WABT_OPCODE(I32, I64, I64, 0, 0, 0x56, I64GtU, "i64.gt_u")
+WABT_OPCODE(I32, I64, I64, 0, 0, 0x57, I64LeS, "i64.le_s")
+WABT_OPCODE(I32, I64, I64, 0, 0, 0x58, I64LeU, "i64.le_u")
+WABT_OPCODE(I32, I64, I64, 0, 0, 0x59, I64GeS, "i64.ge_s")
+WABT_OPCODE(I32, I64, I64, 0, 0, 0x5a, I64GeU, "i64.ge_u")
+WABT_OPCODE(I32, F32, F32, 0, 0, 0x5b, F32Eq, "f32.eq")
+WABT_OPCODE(I32, F32, F32, 0, 0, 0x5c, F32Ne, "f32.ne")
+WABT_OPCODE(I32, F32, F32, 0, 0, 0x5d, F32Lt, "f32.lt")
+WABT_OPCODE(I32, F32, F32, 0, 0, 0x5e, F32Gt, "f32.gt")
+WABT_OPCODE(I32, F32, F32, 0, 0, 0x5f, F32Le, "f32.le")
+WABT_OPCODE(I32, F32, F32, 0, 0, 0x60, F32Ge, "f32.ge")
+WABT_OPCODE(I32, F64, F64, 0, 0, 0x61, F64Eq, "f64.eq")
+WABT_OPCODE(I32, F64, F64, 0, 0, 0x62, F64Ne, "f64.ne")
+WABT_OPCODE(I32, F64, F64, 0, 0, 0x63, F64Lt, "f64.lt")
+WABT_OPCODE(I32, F64, F64, 0, 0, 0x64, F64Gt, "f64.gt")
+WABT_OPCODE(I32, F64, F64, 0, 0, 0x65, F64Le, "f64.le")
+WABT_OPCODE(I32, F64, F64, 0, 0, 0x66, F64Ge, "f64.ge")
+WABT_OPCODE(I32, I32, ___, 0, 0, 0x67, I32Clz, "i32.clz")
+WABT_OPCODE(I32, I32, ___, 0, 0, 0x68, I32Ctz, "i32.ctz")
+WABT_OPCODE(I32, I32, ___, 0, 0, 0x69, I32Popcnt, "i32.popcnt")
+WABT_OPCODE(I32, I32, I32, 0, 0, 0x6a, I32Add, "i32.add")
+WABT_OPCODE(I32, I32, I32, 0, 0, 0x6b, I32Sub, "i32.sub")
+WABT_OPCODE(I32, I32, I32, 0, 0, 0x6c, I32Mul, "i32.mul")
+WABT_OPCODE(I32, I32, I32, 0, 0, 0x6d, I32DivS, "i32.div_s")
+WABT_OPCODE(I32, I32, I32, 0, 0, 0x6e, I32DivU, "i32.div_u")
+WABT_OPCODE(I32, I32, I32, 0, 0, 0x6f, I32RemS, "i32.rem_s")
+WABT_OPCODE(I32, I32, I32, 0, 0, 0x70, I32RemU, "i32.rem_u")
+WABT_OPCODE(I32, I32, I32, 0, 0, 0x71, I32And, "i32.and")
+WABT_OPCODE(I32, I32, I32, 0, 0, 0x72, I32Or, "i32.or")
+WABT_OPCODE(I32, I32, I32, 0, 0, 0x73, I32Xor, "i32.xor")
+WABT_OPCODE(I32, I32, I32, 0, 0, 0x74, I32Shl, "i32.shl")
+WABT_OPCODE(I32, I32, I32, 0, 0, 0x75, I32ShrS, "i32.shr_s")
+WABT_OPCODE(I32, I32, I32, 0, 0, 0x76, I32ShrU, "i32.shr_u")
+WABT_OPCODE(I32, I32, I32, 0, 0, 0x77, I32Rotl, "i32.rotl")
+WABT_OPCODE(I32, I32, I32, 0, 0, 0x78, I32Rotr, "i32.rotr")
+WABT_OPCODE(I64, I64, ___, 0, 0, 0x79, I64Clz, "i64.clz")
+WABT_OPCODE(I64, I64, ___, 0, 0, 0x7a, I64Ctz, "i64.ctz")
+WABT_OPCODE(I64, I64, ___, 0, 0, 0x7b, I64Popcnt, "i64.popcnt")
+WABT_OPCODE(I64, I64, I64, 0, 0, 0x7c, I64Add, "i64.add")
+WABT_OPCODE(I64, I64, I64, 0, 0, 0x7d, I64Sub, "i64.sub")
+WABT_OPCODE(I64, I64, I64, 0, 0, 0x7e, I64Mul, "i64.mul")
+WABT_OPCODE(I64, I64, I64, 0, 0, 0x7f, I64DivS, "i64.div_s")
+WABT_OPCODE(I64, I64, I64, 0, 0, 0x80, I64DivU, "i64.div_u")
+WABT_OPCODE(I64, I64, I64, 0, 0, 0x81, I64RemS, "i64.rem_s")
+WABT_OPCODE(I64, I64, I64, 0, 0, 0x82, I64RemU, "i64.rem_u")
+WABT_OPCODE(I64, I64, I64, 0, 0, 0x83, I64And, "i64.and")
+WABT_OPCODE(I64, I64, I64, 0, 0, 0x84, I64Or, "i64.or")
+WABT_OPCODE(I64, I64, I64, 0, 0, 0x85, I64Xor, "i64.xor")
+WABT_OPCODE(I64, I64, I64, 0, 0, 0x86, I64Shl, "i64.shl")
+WABT_OPCODE(I64, I64, I64, 0, 0, 0x87, I64ShrS, "i64.shr_s")
+WABT_OPCODE(I64, I64, I64, 0, 0, 0x88, I64ShrU, "i64.shr_u")
+WABT_OPCODE(I64, I64, I64, 0, 0, 0x89, I64Rotl, "i64.rotl")
+WABT_OPCODE(I64, I64, I64, 0, 0, 0x8a, I64Rotr, "i64.rotr")
+WABT_OPCODE(F32, F32, F32, 0, 0, 0x8b, F32Abs, "f32.abs")
+WABT_OPCODE(F32, F32, F32, 0, 0, 0x8c, F32Neg, "f32.neg")
+WABT_OPCODE(F32, F32, F32, 0, 0, 0x8d, F32Ceil, "f32.ceil")
+WABT_OPCODE(F32, F32, F32, 0, 0, 0x8e, F32Floor, "f32.floor")
+WABT_OPCODE(F32, F32, F32, 0, 0, 0x8f, F32Trunc, "f32.trunc")
+WABT_OPCODE(F32, F32, F32, 0, 0, 0x90, F32Nearest, "f32.nearest")
+WABT_OPCODE(F32, F32, F32, 0, 0, 0x91, F32Sqrt, "f32.sqrt")
+WABT_OPCODE(F32, F32, F32, 0, 0, 0x92, F32Add, "f32.add")
+WABT_OPCODE(F32, F32, F32, 0, 0, 0x93, F32Sub, "f32.sub")
+WABT_OPCODE(F32, F32, F32, 0, 0, 0x94, F32Mul, "f32.mul")
+WABT_OPCODE(F32, F32, F32, 0, 0, 0x95, F32Div, "f32.div")
+WABT_OPCODE(F32, F32, F32, 0, 0, 0x96, F32Min, "f32.min")
+WABT_OPCODE(F32, F32, F32, 0, 0, 0x97, F32Max, "f32.max")
+WABT_OPCODE(F32, F32, F32, 0, 0, 0x98, F32Copysign, "f32.copysign")
+WABT_OPCODE(F64, F64, F64, 0, 0, 0x99, F64Abs, "f64.abs")
+WABT_OPCODE(F64, F64, F64, 0, 0, 0x9a, F64Neg, "f64.neg")
+WABT_OPCODE(F64, F64, F64, 0, 0, 0x9b, F64Ceil, "f64.ceil")
+WABT_OPCODE(F64, F64, F64, 0, 0, 0x9c, F64Floor, "f64.floor")
+WABT_OPCODE(F64, F64, F64, 0, 0, 0x9d, F64Trunc, "f64.trunc")
+WABT_OPCODE(F64, F64, F64, 0, 0, 0x9e, F64Nearest, "f64.nearest")
+WABT_OPCODE(F64, F64, F64, 0, 0, 0x9f, F64Sqrt, "f64.sqrt")
+WABT_OPCODE(F64, F64, F64, 0, 0, 0xa0, F64Add, "f64.add")
+WABT_OPCODE(F64, F64, F64, 0, 0, 0xa1, F64Sub, "f64.sub")
+WABT_OPCODE(F64, F64, F64, 0, 0, 0xa2, F64Mul, "f64.mul")
+WABT_OPCODE(F64, F64, F64, 0, 0, 0xa3, F64Div, "f64.div")
+WABT_OPCODE(F64, F64, F64, 0, 0, 0xa4, F64Min, "f64.min")
+WABT_OPCODE(F64, F64, F64, 0, 0, 0xa5, F64Max, "f64.max")
+WABT_OPCODE(F64, F64, F64, 0, 0, 0xa6, F64Copysign, "f64.copysign")
+WABT_OPCODE(I32, I64, ___, 0, 0, 0xa7, I32WrapI64, "i32.wrap/i64")
+WABT_OPCODE(I32, F32, ___, 0, 0, 0xa8, I32TruncSF32, "i32.trunc_s/f32")
+WABT_OPCODE(I32, F32, ___, 0, 0, 0xa9, I32TruncUF32, "i32.trunc_u/f32")
+WABT_OPCODE(I32, F64, ___, 0, 0, 0xaa, I32TruncSF64, "i32.trunc_s/f64")
+WABT_OPCODE(I32, F64, ___, 0, 0, 0xab, I32TruncUF64, "i32.trunc_u/f64")
+WABT_OPCODE(I64, I32, ___, 0, 0, 0xac, I64ExtendSI32, "i64.extend_s/i32")
+WABT_OPCODE(I64, I32, ___, 0, 0, 0xad, I64ExtendUI32, "i64.extend_u/i32")
+WABT_OPCODE(I64, F32, ___, 0, 0, 0xae, I64TruncSF32, "i64.trunc_s/f32")
+WABT_OPCODE(I64, F32, ___, 0, 0, 0xaf, I64TruncUF32, "i64.trunc_u/f32")
+WABT_OPCODE(I64, F64, ___, 0, 0, 0xb0, I64TruncSF64, "i64.trunc_s/f64")
+WABT_OPCODE(I64, F64, ___, 0, 0, 0xb1, I64TruncUF64, "i64.trunc_u/f64")
+WABT_OPCODE(F32, I32, ___, 0, 0, 0xb2, F32ConvertSI32, "f32.convert_s/i32")
+WABT_OPCODE(F32, I32, ___, 0, 0, 0xb3, F32ConvertUI32, "f32.convert_u/i32")
+WABT_OPCODE(F32, I64, ___, 0, 0, 0xb4, F32ConvertSI64, "f32.convert_s/i64")
+WABT_OPCODE(F32, I64, ___, 0, 0, 0xb5, F32ConvertUI64, "f32.convert_u/i64")
+WABT_OPCODE(F32, F64, ___, 0, 0, 0xb6, F32DemoteF64, "f32.demote/f64")
+WABT_OPCODE(F64, I32, ___, 0, 0, 0xb7, F64ConvertSI32, "f64.convert_s/i32")
+WABT_OPCODE(F64, I32, ___, 0, 0, 0xb8, F64ConvertUI32, "f64.convert_u/i32")
+WABT_OPCODE(F64, I64, ___, 0, 0, 0xb9, F64ConvertSI64, "f64.convert_s/i64")
+WABT_OPCODE(F64, I64, ___, 0, 0, 0xba, F64ConvertUI64, "f64.convert_u/i64")
+WABT_OPCODE(F64, F32, ___, 0, 0, 0xbb, F64PromoteF32, "f64.promote/f32")
+WABT_OPCODE(I32, F32, ___, 0, 0, 0xbc, I32ReinterpretF32, "i32.reinterpret/f32")
+WABT_OPCODE(I64, F64, ___, 0, 0, 0xbd, I64ReinterpretF64, "i64.reinterpret/f64")
+WABT_OPCODE(F32, I32, ___, 0, 0, 0xbe, F32ReinterpretI32, "f32.reinterpret/i32")
+WABT_OPCODE(F64, I64, ___, 0, 0, 0xbf, F64ReinterpretI64, "f64.reinterpret/i64")
+
+WABT_OPCODE(I32, F32, ___, 0, 0xfc, 0x00, I32TruncSSatF32, "i32.trunc_s:sat/f32")
+WABT_OPCODE(I32, F32, ___, 0, 0xfc, 0x01, I32TruncUSatF32, "i32.trunc_u:sat/f32")
+WABT_OPCODE(I32, F64, ___, 0, 0xfc, 0x02, I32TruncSSatF64, "i32.trunc_s:sat/f64")
+WABT_OPCODE(I32, F64, ___, 0, 0xfc, 0x03, I32TruncUSatF64, "i32.trunc_u:sat/f64")
+WABT_OPCODE(I64, F32, ___, 0, 0xfc, 0x04, I64TruncSSatF32, "i64.trunc_s:sat/f32")
+WABT_OPCODE(I64, F32, ___, 0, 0xfc, 0x05, I64TruncUSatF32, "i64.trunc_u:sat/f32")
+WABT_OPCODE(I64, F64, ___, 0, 0xfc, 0x06, I64TruncSSatF64, "i64.trunc_s:sat/f64")
+WABT_OPCODE(I64, F64, ___, 0, 0xfc, 0x07, I64TruncUSatF64, "i64.trunc_u:sat/f64")
diff --git a/src/opcode.h b/src/opcode.h
index 8ae7e160..fb876d94 100644
--- a/src/opcode.h
+++ b/src/opcode.h
@@ -21,21 +21,23 @@
namespace wabt {
+class Features;
+
struct Opcode {
// Opcode enumerations.
//
// NOTE: this enum does not match the binary encoding.
//
enum Enum {
-#define WABT_OPCODE(rtype, type1, type2, mem_size, code, Name, text) Name,
+#define WABT_OPCODE(rtype, type1, type2, mem_size, prefix, code, Name, text) \
+ Name,
#include "opcode.def"
#undef WABT_OPCODE
-
Invalid,
};
// Static opcode objects.
-#define WABT_OPCODE(rtype, type1, type2, mem_size, code, Name, text) \
+#define WABT_OPCODE(rtype, type1, type2, mem_size, prefix, code, Name, text) \
static Opcode Name##_Opcode;
#include "opcode.def"
#undef WABT_OPCODE
@@ -45,7 +47,11 @@ struct Opcode {
operator Enum() const { return enum_; }
static Opcode FromCode(uint32_t);
+ static Opcode FromCode(uint8_t prefix, uint32_t code);
+ bool HasPrefix() const { return GetInfo().prefix != 0; }
+ uint8_t GetPrefix() const { return GetInfo().prefix; }
uint32_t GetCode() const { return GetInfo().code; }
+ size_t GetLength() const { return HasPrefix() ? 2 : 1; }
const char* GetName() const { return GetInfo().name; }
Type GetResultType() const { return GetInfo().result_type; }
Type GetParamType1() const { return GetInfo().param1_type; }
@@ -60,16 +66,30 @@ struct Opcode {
// |opcode|, else return |alignment|.
Address GetAlignment(Address alignment) const;
+ static bool IsPrefixByte(uint8_t byte) { return byte >= kFirstPrefix; }
+
+ bool IsEnabled(const Features& features) const;
+
private:
+ static const uint32_t kFirstPrefix = 0xfc;
+
struct Info {
const char* name;
Type result_type;
Type param1_type;
Type param2_type;
Address memory_size;
+ uint8_t prefix;
uint32_t code;
+ uint32_t prefix_code; // See PrefixCode below. Used for fast lookup.
};
+ static uint32_t PrefixCode(uint8_t prefix, uint32_t code) {
+ // For now, 8 bits is enough for all codes.
+ assert(code < 0x100);
+ return (prefix << 8) | code;
+ }
+
Info GetInfo() const;
static Info infos_[];
static Info invalid_info_;
diff --git a/src/prebuilt/wast-lexer-gen.cc b/src/prebuilt/wast-lexer-gen.cc
index f82728d3..b312e09f 100644
--- a/src/prebuilt/wast-lexer-gen.cc
+++ b/src/prebuilt/wast-lexer-gen.cc
@@ -71,6 +71,9 @@
#define RETURN_TYPE(token, type) \
return Token(GetLocation(), TokenType::token, Type::type)
+#define RETURN_OPCODE0(token) \
+ return Token(GetLocation(), TokenType::token, Opcode::token)
+
#define RETURN_OPCODE(token, opcode) \
return Token(GetLocation(), TokenType::token, Opcode::opcode)
@@ -83,7 +86,7 @@
namespace wabt {
const char* GetTokenTypeName(TokenType token_type) {
- const char* s_names[] = {
+ static const char* s_names[] = {
"Invalid",
"Reserved",
"EOF",
@@ -321,7 +324,7 @@ Result WastLexer::Fill(size_t need) {
}
Token WastLexer::GetToken(WastParser* parser) {
-#line 325 "src/prebuilt/wast-lexer-gen.cc"
+#line 328 "src/prebuilt/wast-lexer-gen.cc"
enum YYCONDTYPE {
YYCOND_i,
@@ -330,13 +333,13 @@ enum YYCONDTYPE {
YYCOND_BLOCK_COMMENT,
};
-#line 322 "src/wast-lexer.cc"
+#line 325 "src/wast-lexer.cc"
YYCONDTYPE cond = YYCOND_i; // i is the initial state.
for (;;) {
next_pos_ = cursor_;
-#line 340 "src/prebuilt/wast-lexer-gen.cc"
+#line 343 "src/prebuilt/wast-lexer-gen.cc"
{
unsigned char yych;
unsigned int yyaccept = 0;
@@ -381,29 +384,29 @@ YYCOND_BAD_TEXT:
}
++cursor_;
yy4:
-#line 384 "src/wast-lexer.cc"
+#line 387 "src/wast-lexer.cc"
{ ERROR("illegal character in string");
continue; }
-#line 388 "src/prebuilt/wast-lexer-gen.cc"
+#line 391 "src/prebuilt/wast-lexer-gen.cc"
yy5:
++cursor_;
BEGIN(YYCOND_i);
-#line 377 "src/wast-lexer.cc"
+#line 380 "src/wast-lexer.cc"
{ ERROR("newline in string");
NEWLINE;
continue; }
-#line 396 "src/prebuilt/wast-lexer-gen.cc"
+#line 399 "src/prebuilt/wast-lexer-gen.cc"
yy7:
++cursor_;
-#line 376 "src/wast-lexer.cc"
+#line 379 "src/wast-lexer.cc"
{ continue; }
-#line 401 "src/prebuilt/wast-lexer-gen.cc"
+#line 404 "src/prebuilt/wast-lexer-gen.cc"
yy9:
++cursor_;
BEGIN(YYCOND_i);
-#line 383 "src/wast-lexer.cc"
+#line 386 "src/wast-lexer.cc"
{ RETURN_TEXT(Text); }
-#line 407 "src/prebuilt/wast-lexer-gen.cc"
+#line 410 "src/prebuilt/wast-lexer-gen.cc"
yy11:
yyaccept = 0;
yych = *(marker_ = ++cursor_);
@@ -455,9 +458,9 @@ yy11:
yy12:
++cursor_;
yy13:
-#line 386 "src/wast-lexer.cc"
+#line 389 "src/wast-lexer.cc"
{ MAYBE_MALFORMED_UTF8(" in string"); }
-#line 461 "src/prebuilt/wast-lexer-gen.cc"
+#line 464 "src/prebuilt/wast-lexer-gen.cc"
yy14:
yych = *++cursor_;
if (yych <= 0x7F) goto yy13;
@@ -496,11 +499,11 @@ yy19:
yy20:
++cursor_;
yy21:
-#line 380 "src/wast-lexer.cc"
+#line 383 "src/wast-lexer.cc"
{ ERROR("bad escape \"%.*s\"",
static_cast<int>(yyleng), yytext);
continue; }
-#line 504 "src/prebuilt/wast-lexer-gen.cc"
+#line 507 "src/prebuilt/wast-lexer-gen.cc"
yy22:
yych = *++cursor_;
if (yych <= '@') {
@@ -586,14 +589,14 @@ YYCOND_BLOCK_COMMENT:
yy34:
++cursor_;
yy35:
-#line 613 "src/wast-lexer.cc"
+#line 624 "src/wast-lexer.cc"
{ continue; }
-#line 592 "src/prebuilt/wast-lexer-gen.cc"
+#line 595 "src/prebuilt/wast-lexer-gen.cc"
yy36:
++cursor_;
-#line 612 "src/wast-lexer.cc"
+#line 623 "src/wast-lexer.cc"
{ NEWLINE; continue; }
-#line 597 "src/prebuilt/wast-lexer-gen.cc"
+#line 600 "src/prebuilt/wast-lexer-gen.cc"
yy38:
yych = *++cursor_;
if (yych == ';') goto yy48;
@@ -605,9 +608,9 @@ yy39:
yy40:
++cursor_;
yy41:
-#line 614 "src/wast-lexer.cc"
+#line 625 "src/wast-lexer.cc"
{ MAYBE_MALFORMED_UTF8(" in block comment"); }
-#line 611 "src/prebuilt/wast-lexer-gen.cc"
+#line 614 "src/prebuilt/wast-lexer-gen.cc"
yy42:
yych = *++cursor_;
if (yych <= 0x7F) goto yy41;
@@ -640,16 +643,16 @@ yy47:
goto yy41;
yy48:
++cursor_;
-#line 608 "src/wast-lexer.cc"
+#line 619 "src/wast-lexer.cc"
{ COMMENT_NESTING++; continue; }
-#line 646 "src/prebuilt/wast-lexer-gen.cc"
+#line 649 "src/prebuilt/wast-lexer-gen.cc"
yy50:
++cursor_;
-#line 609 "src/wast-lexer.cc"
+#line 620 "src/wast-lexer.cc"
{ if (--COMMENT_NESTING == 0)
BEGIN(YYCOND_i);
continue; }
-#line 653 "src/prebuilt/wast-lexer-gen.cc"
+#line 656 "src/prebuilt/wast-lexer-gen.cc"
yy52:
yych = *++cursor_;
if (yych <= 0x7F) goto yy53;
@@ -738,21 +741,21 @@ yy57:
if (yych <= 0xF4) goto yy76;
}
yy59:
-#line 606 "src/wast-lexer.cc"
+#line 617 "src/wast-lexer.cc"
{ continue; }
-#line 744 "src/prebuilt/wast-lexer-gen.cc"
+#line 747 "src/prebuilt/wast-lexer-gen.cc"
yy60:
++cursor_;
BEGIN(YYCOND_i);
-#line 605 "src/wast-lexer.cc"
+#line 616 "src/wast-lexer.cc"
{ NEWLINE; continue; }
-#line 750 "src/prebuilt/wast-lexer-gen.cc"
+#line 753 "src/prebuilt/wast-lexer-gen.cc"
yy62:
++cursor_;
yy63:
-#line 619 "src/wast-lexer.cc"
+#line 630 "src/wast-lexer.cc"
{ MAYBE_MALFORMED_UTF8(""); }
-#line 756 "src/prebuilt/wast-lexer-gen.cc"
+#line 759 "src/prebuilt/wast-lexer-gen.cc"
yy64:
yych = *++cursor_;
if (yych <= 0x7F) goto yy63;
@@ -973,9 +976,9 @@ YYCOND_i:
yy79:
++cursor_;
yy80:
-#line 618 "src/wast-lexer.cc"
+#line 629 "src/wast-lexer.cc"
{ ERROR("unexpected char"); continue; }
-#line 979 "src/prebuilt/wast-lexer-gen.cc"
+#line 982 "src/prebuilt/wast-lexer-gen.cc"
yy81:
++cursor_;
if (limit_ <= cursor_) FILL(1);
@@ -983,14 +986,14 @@ yy81:
if (yybm[0+yych] & 4) {
goto yy81;
}
-#line 616 "src/wast-lexer.cc"
+#line 627 "src/wast-lexer.cc"
{ continue; }
-#line 989 "src/prebuilt/wast-lexer-gen.cc"
+#line 992 "src/prebuilt/wast-lexer-gen.cc"
yy84:
++cursor_;
-#line 615 "src/wast-lexer.cc"
+#line 626 "src/wast-lexer.cc"
{ NEWLINE; continue; }
-#line 994 "src/prebuilt/wast-lexer-gen.cc"
+#line 997 "src/prebuilt/wast-lexer-gen.cc"
yy86:
++cursor_;
if (limit_ <= cursor_) FILL(1);
@@ -1000,9 +1003,9 @@ yy87:
goto yy86;
}
yy88:
-#line 617 "src/wast-lexer.cc"
+#line 628 "src/wast-lexer.cc"
{ RETURN_TEXT(Reserved); }
-#line 1006 "src/prebuilt/wast-lexer-gen.cc"
+#line 1009 "src/prebuilt/wast-lexer-gen.cc"
yy89:
yyaccept = 0;
yych = *(marker_ = ++cursor_);
@@ -1012,9 +1015,9 @@ yy89:
if (yych <= 0xF4) goto yy129;
yy90:
BEGIN(YYCOND_BAD_TEXT);
-#line 375 "src/wast-lexer.cc"
+#line 378 "src/wast-lexer.cc"
{ continue; }
-#line 1018 "src/prebuilt/wast-lexer-gen.cc"
+#line 1021 "src/prebuilt/wast-lexer-gen.cc"
yy91:
yych = *++cursor_;
if (yych <= '\'') {
@@ -1034,14 +1037,14 @@ yy91:
yy92:
++cursor_;
if ((yych = *cursor_) == ';') goto yy143;
-#line 366 "src/wast-lexer.cc"
+#line 369 "src/wast-lexer.cc"
{ RETURN(Lpar); }
-#line 1040 "src/prebuilt/wast-lexer-gen.cc"
+#line 1043 "src/prebuilt/wast-lexer-gen.cc"
yy94:
++cursor_;
-#line 367 "src/wast-lexer.cc"
+#line 370 "src/wast-lexer.cc"
{ RETURN(Rpar); }
-#line 1045 "src/prebuilt/wast-lexer-gen.cc"
+#line 1048 "src/prebuilt/wast-lexer-gen.cc"
yy96:
yych = *++cursor_;
if (yych <= 'h') {
@@ -1091,9 +1094,9 @@ yy97:
}
}
yy98:
-#line 368 "src/wast-lexer.cc"
+#line 371 "src/wast-lexer.cc"
{ RETURN_LITERAL(Nat, Int); }
-#line 1097 "src/prebuilt/wast-lexer-gen.cc"
+#line 1100 "src/prebuilt/wast-lexer-gen.cc"
yy99:
++cursor_;
if ((limit_ - cursor_) < 3) FILL(3);
@@ -1268,9 +1271,9 @@ yy119:
yy120:
++cursor_;
yy121:
-#line 619 "src/wast-lexer.cc"
+#line 630 "src/wast-lexer.cc"
{ MAYBE_MALFORMED_UTF8(""); }
-#line 1274 "src/prebuilt/wast-lexer-gen.cc"
+#line 1277 "src/prebuilt/wast-lexer-gen.cc"
yy122:
yych = *++cursor_;
if (yych <= 0x7F) goto yy121;
@@ -1340,9 +1343,9 @@ yy130:
}
yy131:
++cursor_;
-#line 374 "src/wast-lexer.cc"
+#line 377 "src/wast-lexer.cc"
{ RETURN_TEXT(Text); }
-#line 1346 "src/prebuilt/wast-lexer-gen.cc"
+#line 1349 "src/prebuilt/wast-lexer-gen.cc"
yy133:
++cursor_;
if (limit_ <= cursor_) FILL(1);
@@ -1437,15 +1440,15 @@ yy141:
if (yych <= ';') goto yy142;
if (yych <= '}') goto yy86;
yy142:
-#line 602 "src/wast-lexer.cc"
+#line 613 "src/wast-lexer.cc"
{ RETURN_TEXT(Var); }
-#line 1443 "src/prebuilt/wast-lexer-gen.cc"
+#line 1446 "src/prebuilt/wast-lexer-gen.cc"
yy143:
++cursor_;
BEGIN(YYCOND_BLOCK_COMMENT);
-#line 607 "src/wast-lexer.cc"
+#line 618 "src/wast-lexer.cc"
{ COMMENT_NESTING = 1; continue; }
-#line 1449 "src/prebuilt/wast-lexer-gen.cc"
+#line 1452 "src/prebuilt/wast-lexer-gen.cc"
yy145:
++cursor_;
if ((yych = *cursor_) <= ':') {
@@ -1486,9 +1489,9 @@ yy145:
}
}
yy146:
-#line 369 "src/wast-lexer.cc"
+#line 372 "src/wast-lexer.cc"
{ RETURN_LITERAL(Int, Int); }
-#line 1492 "src/prebuilt/wast-lexer-gen.cc"
+#line 1495 "src/prebuilt/wast-lexer-gen.cc"
yy147:
++cursor_;
if ((limit_ - cursor_) < 3) FILL(3);
@@ -1558,9 +1561,9 @@ yy151:
}
}
yy152:
-#line 370 "src/wast-lexer.cc"
+#line 373 "src/wast-lexer.cc"
{ RETURN_LITERAL(Float, Float); }
-#line 1564 "src/prebuilt/wast-lexer-gen.cc"
+#line 1567 "src/prebuilt/wast-lexer-gen.cc"
yy153:
yych = *++cursor_;
if (yych <= ',') {
@@ -1617,9 +1620,9 @@ yy155:
yy156:
++cursor_;
BEGIN(YYCOND_LINE_COMMENT);
-#line 604 "src/wast-lexer.cc"
+#line 615 "src/wast-lexer.cc"
{ continue; }
-#line 1623 "src/prebuilt/wast-lexer-gen.cc"
+#line 1626 "src/prebuilt/wast-lexer-gen.cc"
yy158:
yych = *++cursor_;
if (yych == 'i') goto yy215;
@@ -1658,9 +1661,9 @@ yy163:
}
}
yy164:
-#line 399 "src/wast-lexer.cc"
- { RETURN(Br); }
-#line 1664 "src/prebuilt/wast-lexer-gen.cc"
+#line 402 "src/wast-lexer.cc"
+ { RETURN_OPCODE0(Br); }
+#line 1667 "src/prebuilt/wast-lexer-gen.cc"
yy165:
yych = *++cursor_;
if (yych == 'l') goto yy221;
@@ -1729,9 +1732,9 @@ yy180:
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 395 "src/wast-lexer.cc"
- { RETURN(If); }
-#line 1735 "src/prebuilt/wast-lexer-gen.cc"
+#line 398 "src/wast-lexer.cc"
+ { RETURN_OPCODE0(If); }
+#line 1738 "src/prebuilt/wast-lexer-gen.cc"
yy182:
yych = *++cursor_;
if (yych == 'p') goto yy245;
@@ -2069,9 +2072,9 @@ yy228:
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 405 "src/wast-lexer.cc"
- { RETURN(End); }
-#line 2075 "src/prebuilt/wast-lexer-gen.cc"
+#line 408 "src/wast-lexer.cc"
+ { RETURN_OPCODE0(End); }
+#line 2078 "src/prebuilt/wast-lexer-gen.cc"
yy230:
yych = *++cursor_;
if (yych == 'e') goto yy301;
@@ -2099,9 +2102,9 @@ yy232:
}
}
yy233:
-#line 389 "src/wast-lexer.cc"
+#line 392 "src/wast-lexer.cc"
{ RETURN_TYPE(ValueType, F32); }
-#line 2105 "src/prebuilt/wast-lexer-gen.cc"
+#line 2108 "src/prebuilt/wast-lexer-gen.cc"
yy234:
++cursor_;
if ((yych = *cursor_) <= ')') {
@@ -2121,9 +2124,9 @@ yy234:
}
}
yy235:
-#line 390 "src/wast-lexer.cc"
+#line 393 "src/wast-lexer.cc"
{ RETURN_TYPE(ValueType, F64); }
-#line 2127 "src/prebuilt/wast-lexer-gen.cc"
+#line 2130 "src/prebuilt/wast-lexer-gen.cc"
yy236:
yych = *++cursor_;
if (yych == 'c') goto yy305;
@@ -2146,9 +2149,9 @@ yy237:
}
}
yy238:
-#line 588 "src/wast-lexer.cc"
+#line 599 "src/wast-lexer.cc"
{ RETURN(Get); }
-#line 2152 "src/prebuilt/wast-lexer-gen.cc"
+#line 2155 "src/prebuilt/wast-lexer-gen.cc"
yy239:
yych = *++cursor_;
if (yych == 'b') goto yy308;
@@ -2176,9 +2179,9 @@ yy241:
}
}
yy242:
-#line 387 "src/wast-lexer.cc"
+#line 390 "src/wast-lexer.cc"
{ RETURN_TYPE(ValueType, I32); }
-#line 2182 "src/prebuilt/wast-lexer-gen.cc"
+#line 2185 "src/prebuilt/wast-lexer-gen.cc"
yy243:
++cursor_;
if ((yych = *cursor_) <= ')') {
@@ -2198,9 +2201,9 @@ yy243:
}
}
yy244:
-#line 388 "src/wast-lexer.cc"
+#line 391 "src/wast-lexer.cc"
{ RETURN_TYPE(ValueType, I64); }
-#line 2204 "src/prebuilt/wast-lexer-gen.cc"
+#line 2207 "src/prebuilt/wast-lexer-gen.cc"
yy245:
yych = *++cursor_;
if (yych == 'o') goto yy312;
@@ -2210,9 +2213,9 @@ yy246:
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 372 "src/wast-lexer.cc"
+#line 375 "src/wast-lexer.cc"
{ RETURN_LITERAL(Float, Infinity); }
-#line 2216 "src/prebuilt/wast-lexer-gen.cc"
+#line 2219 "src/prebuilt/wast-lexer-gen.cc"
yy248:
yych = *++cursor_;
if (yych == 'o') goto yy313;
@@ -2238,9 +2241,9 @@ yy253:
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 392 "src/wast-lexer.cc"
+#line 395 "src/wast-lexer.cc"
{ RETURN(Mut); }
-#line 2244 "src/prebuilt/wast-lexer-gen.cc"
+#line 2247 "src/prebuilt/wast-lexer-gen.cc"
yy255:
++cursor_;
if ((yych = *cursor_) <= ')') {
@@ -2260,17 +2263,17 @@ yy255:
}
}
yy256:
-#line 373 "src/wast-lexer.cc"
+#line 376 "src/wast-lexer.cc"
{ RETURN_LITERAL(Float, Nan); }
-#line 2266 "src/prebuilt/wast-lexer-gen.cc"
+#line 2269 "src/prebuilt/wast-lexer-gen.cc"
yy257:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 393 "src/wast-lexer.cc"
+#line 396 "src/wast-lexer.cc"
{ RETURN(Nop); }
-#line 2274 "src/prebuilt/wast-lexer-gen.cc"
+#line 2277 "src/prebuilt/wast-lexer-gen.cc"
yy259:
yych = *++cursor_;
if (yych == 's') goto yy320;
@@ -2329,9 +2332,9 @@ yy272:
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 597 "src/wast-lexer.cc"
- { RETURN(Try); }
-#line 2335 "src/prebuilt/wast-lexer-gen.cc"
+#line 608 "src/wast-lexer.cc"
+ { RETURN_OPCODE0(Try); }
+#line 2338 "src/prebuilt/wast-lexer-gen.cc"
yy274:
yych = *++cursor_;
if (yych == 'e') goto yy335;
@@ -2445,9 +2448,9 @@ yy279:
}
}
yy280:
-#line 371 "src/wast-lexer.cc"
+#line 374 "src/wast-lexer.cc"
{ RETURN_LITERAL(Float, Hexfloat); }
-#line 2451 "src/prebuilt/wast-lexer-gen.cc"
+#line 2454 "src/prebuilt/wast-lexer-gen.cc"
yy281:
yych = *++cursor_;
if (yych <= ',') {
@@ -2505,9 +2508,9 @@ yy289:
}
}
yy290:
-#line 402 "src/wast-lexer.cc"
- { RETURN(Call); }
-#line 2511 "src/prebuilt/wast-lexer-gen.cc"
+#line 405 "src/wast-lexer.cc"
+ { RETURN_OPCODE0(Call); }
+#line 2514 "src/prebuilt/wast-lexer-gen.cc"
yy291:
yych = *++cursor_;
if (yych == 'h') goto yy353;
@@ -2521,33 +2524,33 @@ yy293:
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 581 "src/wast-lexer.cc"
+#line 592 "src/wast-lexer.cc"
{ RETURN(Data); }
-#line 2527 "src/prebuilt/wast-lexer-gen.cc"
+#line 2530 "src/prebuilt/wast-lexer-gen.cc"
yy295:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 404 "src/wast-lexer.cc"
- { RETURN(Drop); }
-#line 2535 "src/prebuilt/wast-lexer-gen.cc"
+#line 407 "src/wast-lexer.cc"
+ { RETURN_OPCODE0(Drop); }
+#line 2538 "src/prebuilt/wast-lexer-gen.cc"
yy297:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 580 "src/wast-lexer.cc"
+#line 591 "src/wast-lexer.cc"
{ RETURN(Elem); }
-#line 2543 "src/prebuilt/wast-lexer-gen.cc"
+#line 2546 "src/prebuilt/wast-lexer-gen.cc"
yy299:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 397 "src/wast-lexer.cc"
+#line 400 "src/wast-lexer.cc"
{ RETURN(Else); }
-#line 2551 "src/prebuilt/wast-lexer-gen.cc"
+#line 2554 "src/prebuilt/wast-lexer-gen.cc"
yy301:
yych = *++cursor_;
if (yych == 'p') goto yy356;
@@ -2596,9 +2599,9 @@ yy305:
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 569 "src/wast-lexer.cc"
+#line 580 "src/wast-lexer.cc"
{ RETURN(Func); }
-#line 2602 "src/prebuilt/wast-lexer-gen.cc"
+#line 2605 "src/prebuilt/wast-lexer-gen.cc"
yy307:
yych = *++cursor_;
if (yych == 'g') goto yy383;
@@ -2668,9 +2671,9 @@ yy315:
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 398 "src/wast-lexer.cc"
- { RETURN(Loop); }
-#line 2674 "src/prebuilt/wast-lexer-gen.cc"
+#line 401 "src/wast-lexer.cc"
+ { RETURN_OPCODE0(Loop); }
+#line 2677 "src/prebuilt/wast-lexer-gen.cc"
yy317:
yych = *++cursor_;
if (yych == 'r') goto yy420;
@@ -2737,9 +2740,9 @@ yy332:
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 396 "src/wast-lexer.cc"
+#line 399 "src/wast-lexer.cc"
{ RETURN(Then); }
-#line 2743 "src/prebuilt/wast-lexer-gen.cc"
+#line 2746 "src/prebuilt/wast-lexer-gen.cc"
yy334:
yych = *++cursor_;
if (yych == 'w') goto yy440;
@@ -2749,9 +2752,9 @@ yy335:
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 568 "src/wast-lexer.cc"
+#line 579 "src/wast-lexer.cc"
{ RETURN(Type); }
-#line 2755 "src/prebuilt/wast-lexer-gen.cc"
+#line 2758 "src/prebuilt/wast-lexer-gen.cc"
yy337:
yych = *++cursor_;
if (yych == 'a') goto yy442;
@@ -2869,17 +2872,17 @@ yy347:
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 394 "src/wast-lexer.cc"
+#line 397 "src/wast-lexer.cc"
{ RETURN(Block); }
-#line 2875 "src/prebuilt/wast-lexer-gen.cc"
+#line 2878 "src/prebuilt/wast-lexer-gen.cc"
yy349:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 400 "src/wast-lexer.cc"
- { RETURN(BrIf); }
-#line 2883 "src/prebuilt/wast-lexer-gen.cc"
+#line 403 "src/wast-lexer.cc"
+ { RETURN_OPCODE0(BrIf); }
+#line 2886 "src/prebuilt/wast-lexer-gen.cc"
yy351:
yych = *++cursor_;
if (yych == 'b') goto yy449;
@@ -2906,9 +2909,9 @@ yy353:
}
}
yy354:
-#line 598 "src/wast-lexer.cc"
- { RETURN(Catch); }
-#line 2912 "src/prebuilt/wast-lexer-gen.cc"
+#line 609 "src/wast-lexer.cc"
+ { RETURN_OPCODE0(Catch); }
+#line 2915 "src/prebuilt/wast-lexer-gen.cc"
yy355:
yych = *++cursor_;
if (yych == 'n') goto yy452;
@@ -3252,9 +3255,9 @@ yy418:
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 572 "src/wast-lexer.cc"
+#line 583 "src/wast-lexer.cc"
{ RETURN(Local); }
-#line 3258 "src/prebuilt/wast-lexer-gen.cc"
+#line 3261 "src/prebuilt/wast-lexer-gen.cc"
yy420:
yych = *++cursor_;
if (yych == 'y') goto yy576;
@@ -3276,17 +3279,17 @@ yy424:
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 570 "src/wast-lexer.cc"
+#line 581 "src/wast-lexer.cc"
{ RETURN(Param); }
-#line 3282 "src/prebuilt/wast-lexer-gen.cc"
+#line 3285 "src/prebuilt/wast-lexer-gen.cc"
yy426:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 576 "src/wast-lexer.cc"
+#line 587 "src/wast-lexer.cc"
{ RETURN(Quote); }
-#line 3290 "src/prebuilt/wast-lexer-gen.cc"
+#line 3293 "src/prebuilt/wast-lexer-gen.cc"
yy428:
yych = *++cursor_;
if (yych == 't') goto yy583;
@@ -3320,17 +3323,17 @@ yy435:
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 579 "src/wast-lexer.cc"
+#line 590 "src/wast-lexer.cc"
{ RETURN(Start); }
-#line 3326 "src/prebuilt/wast-lexer-gen.cc"
+#line 3329 "src/prebuilt/wast-lexer-gen.cc"
yy437:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 577 "src/wast-lexer.cc"
+#line 588 "src/wast-lexer.cc"
{ RETURN(Table); }
-#line 3334 "src/prebuilt/wast-lexer-gen.cc"
+#line 3337 "src/prebuilt/wast-lexer-gen.cc"
yy439:
yych = *++cursor_;
if (yych == 'o') goto yy593;
@@ -3340,9 +3343,9 @@ yy440:
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 600 "src/wast-lexer.cc"
- { RETURN(Throw); }
-#line 3346 "src/prebuilt/wast-lexer-gen.cc"
+#line 611 "src/wast-lexer.cc"
+ { RETURN_OPCODE0(Throw); }
+#line 3349 "src/prebuilt/wast-lexer-gen.cc"
yy442:
yych = *++cursor_;
if (yych == 'c') goto yy594;
@@ -3392,9 +3395,9 @@ yy447:
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 575 "src/wast-lexer.cc"
+#line 586 "src/wast-lexer.cc"
{ RETURN(Bin); }
-#line 3398 "src/prebuilt/wast-lexer-gen.cc"
+#line 3401 "src/prebuilt/wast-lexer-gen.cc"
yy449:
yych = *++cursor_;
if (yych == 'l') goto yy602;
@@ -3416,17 +3419,17 @@ yy453:
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 585 "src/wast-lexer.cc"
+#line 596 "src/wast-lexer.cc"
{ RETURN(Except); }
-#line 3422 "src/prebuilt/wast-lexer-gen.cc"
+#line 3425 "src/prebuilt/wast-lexer-gen.cc"
yy455:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 584 "src/wast-lexer.cc"
+#line 595 "src/wast-lexer.cc"
{ RETURN(Export); }
-#line 3430 "src/prebuilt/wast-lexer-gen.cc"
+#line 3433 "src/prebuilt/wast-lexer-gen.cc"
yy457:
yych = *++cursor_;
if (yych == 's') goto yy606;
@@ -3457,9 +3460,9 @@ yy463:
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 527 "src/wast-lexer.cc"
+#line 530 "src/wast-lexer.cc"
{ RETURN_OPCODE(Compare, F32Eq); }
-#line 3463 "src/prebuilt/wast-lexer-gen.cc"
+#line 3466 "src/prebuilt/wast-lexer-gen.cc"
yy465:
yych = *++cursor_;
if (yych == 'o') goto yy616;
@@ -3469,25 +3472,25 @@ yy466:
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 537 "src/wast-lexer.cc"
+#line 540 "src/wast-lexer.cc"
{ RETURN_OPCODE(Compare, F32Ge); }
-#line 3475 "src/prebuilt/wast-lexer-gen.cc"
+#line 3478 "src/prebuilt/wast-lexer-gen.cc"
yy468:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 535 "src/wast-lexer.cc"
+#line 538 "src/wast-lexer.cc"
{ RETURN_OPCODE(Compare, F32Gt); }
-#line 3483 "src/prebuilt/wast-lexer-gen.cc"
+#line 3486 "src/prebuilt/wast-lexer-gen.cc"
yy470:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 533 "src/wast-lexer.cc"
+#line 536 "src/wast-lexer.cc"
{ RETURN_OPCODE(Compare, F32Le); }
-#line 3491 "src/prebuilt/wast-lexer-gen.cc"
+#line 3494 "src/prebuilt/wast-lexer-gen.cc"
yy472:
yych = *++cursor_;
if (yych == 'a') goto yy617;
@@ -3497,9 +3500,9 @@ yy473:
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 531 "src/wast-lexer.cc"
+#line 534 "src/wast-lexer.cc"
{ RETURN_OPCODE(Compare, F32Lt); }
-#line 3503 "src/prebuilt/wast-lexer-gen.cc"
+#line 3506 "src/prebuilt/wast-lexer-gen.cc"
yy475:
yych = *++cursor_;
if (yych == 'x') goto yy618;
@@ -3532,9 +3535,9 @@ yy478:
}
}
yy479:
-#line 529 "src/wast-lexer.cc"
+#line 532 "src/wast-lexer.cc"
{ RETURN_OPCODE(Compare, F32Ne); }
-#line 3538 "src/prebuilt/wast-lexer-gen.cc"
+#line 3541 "src/prebuilt/wast-lexer-gen.cc"
yy480:
yych = *++cursor_;
if (yych == 'i') goto yy627;
@@ -3581,9 +3584,9 @@ yy490:
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 528 "src/wast-lexer.cc"
+#line 531 "src/wast-lexer.cc"
{ RETURN_OPCODE(Compare, F64Eq); }
-#line 3587 "src/prebuilt/wast-lexer-gen.cc"
+#line 3590 "src/prebuilt/wast-lexer-gen.cc"
yy492:
yych = *++cursor_;
if (yych == 'o') goto yy642;
@@ -3593,25 +3596,25 @@ yy493:
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 538 "src/wast-lexer.cc"
+#line 541 "src/wast-lexer.cc"
{ RETURN_OPCODE(Compare, F64Ge); }
-#line 3599 "src/prebuilt/wast-lexer-gen.cc"
+#line 3602 "src/prebuilt/wast-lexer-gen.cc"
yy495:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 536 "src/wast-lexer.cc"
+#line 539 "src/wast-lexer.cc"
{ RETURN_OPCODE(Compare, F64Gt); }
-#line 3607 "src/prebuilt/wast-lexer-gen.cc"
+#line 3610 "src/prebuilt/wast-lexer-gen.cc"
yy497:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 534 "src/wast-lexer.cc"
+#line 537 "src/wast-lexer.cc"
{ RETURN_OPCODE(Compare, F64Le); }
-#line 3615 "src/prebuilt/wast-lexer-gen.cc"
+#line 3618 "src/prebuilt/wast-lexer-gen.cc"
yy499:
yych = *++cursor_;
if (yych == 'a') goto yy643;
@@ -3621,9 +3624,9 @@ yy500:
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 532 "src/wast-lexer.cc"
+#line 535 "src/wast-lexer.cc"
{ RETURN_OPCODE(Compare, F64Lt); }
-#line 3627 "src/prebuilt/wast-lexer-gen.cc"
+#line 3630 "src/prebuilt/wast-lexer-gen.cc"
yy502:
yych = *++cursor_;
if (yych == 'x') goto yy644;
@@ -3656,9 +3659,9 @@ yy505:
}
}
yy506:
-#line 530 "src/wast-lexer.cc"
+#line 533 "src/wast-lexer.cc"
{ RETURN_OPCODE(Compare, F64Ne); }
-#line 3662 "src/prebuilt/wast-lexer-gen.cc"
+#line 3665 "src/prebuilt/wast-lexer-gen.cc"
yy507:
yych = *++cursor_;
if (yych == 'o') goto yy653;
@@ -3696,9 +3699,9 @@ yy515:
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 573 "src/wast-lexer.cc"
+#line 584 "src/wast-lexer.cc"
{ RETURN(Global); }
-#line 3702 "src/prebuilt/wast-lexer-gen.cc"
+#line 3705 "src/prebuilt/wast-lexer-gen.cc"
yy517:
yych = *++cursor_;
if (yych == 'e') goto yy662;
@@ -3745,9 +3748,9 @@ yy524:
}
}
yy525:
-#line 507 "src/wast-lexer.cc"
+#line 510 "src/wast-lexer.cc"
{ RETURN_OPCODE(Compare, I32Eq); }
-#line 3751 "src/prebuilt/wast-lexer-gen.cc"
+#line 3754 "src/prebuilt/wast-lexer-gen.cc"
yy526:
yych = *++cursor_;
if (yych == '_') goto yy675;
@@ -3777,17 +3780,17 @@ yy532:
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 509 "src/wast-lexer.cc"
+#line 512 "src/wast-lexer.cc"
{ RETURN_OPCODE(Compare, I32Ne); }
-#line 3783 "src/prebuilt/wast-lexer-gen.cc"
+#line 3786 "src/prebuilt/wast-lexer-gen.cc"
yy534:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 479 "src/wast-lexer.cc"
+#line 482 "src/wast-lexer.cc"
{ RETURN_OPCODE(Binary, I32Or); }
-#line 3791 "src/prebuilt/wast-lexer-gen.cc"
+#line 3794 "src/prebuilt/wast-lexer-gen.cc"
yy536:
yych = *++cursor_;
if (yych == 'p') goto yy682;
@@ -3868,9 +3871,9 @@ yy551:
}
}
yy552:
-#line 508 "src/wast-lexer.cc"
+#line 511 "src/wast-lexer.cc"
{ RETURN_OPCODE(Compare, I64Eq); }
-#line 3874 "src/prebuilt/wast-lexer-gen.cc"
+#line 3877 "src/prebuilt/wast-lexer-gen.cc"
yy553:
yych = *++cursor_;
if (yych == 't') goto yy708;
@@ -3904,17 +3907,17 @@ yy560:
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 510 "src/wast-lexer.cc"
+#line 513 "src/wast-lexer.cc"
{ RETURN_OPCODE(Compare, I64Ne); }
-#line 3910 "src/prebuilt/wast-lexer-gen.cc"
+#line 3913 "src/prebuilt/wast-lexer-gen.cc"
yy562:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 480 "src/wast-lexer.cc"
+#line 483 "src/wast-lexer.cc"
{ RETURN_OPCODE(Binary, I64Or); }
-#line 3918 "src/prebuilt/wast-lexer-gen.cc"
+#line 3921 "src/prebuilt/wast-lexer-gen.cc"
yy564:
yych = *++cursor_;
if (yych == 'p') goto yy716;
@@ -3954,33 +3957,33 @@ yy572:
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 583 "src/wast-lexer.cc"
+#line 594 "src/wast-lexer.cc"
{ RETURN(Import); }
-#line 3960 "src/prebuilt/wast-lexer-gen.cc"
+#line 3963 "src/prebuilt/wast-lexer-gen.cc"
yy574:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 587 "src/wast-lexer.cc"
+#line 598 "src/wast-lexer.cc"
{ RETURN(Invoke); }
-#line 3968 "src/prebuilt/wast-lexer-gen.cc"
+#line 3971 "src/prebuilt/wast-lexer-gen.cc"
yy576:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 578 "src/wast-lexer.cc"
+#line 589 "src/wast-lexer.cc"
{ RETURN(Memory); }
-#line 3976 "src/prebuilt/wast-lexer-gen.cc"
+#line 3979 "src/prebuilt/wast-lexer-gen.cc"
yy578:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 574 "src/wast-lexer.cc"
+#line 585 "src/wast-lexer.cc"
{ RETURN(Module); }
-#line 3984 "src/prebuilt/wast-lexer-gen.cc"
+#line 3987 "src/prebuilt/wast-lexer-gen.cc"
yy580:
++cursor_;
if (limit_ <= cursor_) FILL(1);
@@ -4025,9 +4028,9 @@ yy581:
}
}
yy582:
-#line 582 "src/wast-lexer.cc"
+#line 593 "src/wast-lexer.cc"
{ RETURN(Offset); }
-#line 4031 "src/prebuilt/wast-lexer-gen.cc"
+#line 4034 "src/prebuilt/wast-lexer-gen.cc"
yy583:
yych = *++cursor_;
if (yych == 'e') goto yy732;
@@ -4037,9 +4040,9 @@ yy584:
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 571 "src/wast-lexer.cc"
+#line 582 "src/wast-lexer.cc"
{ RETURN(Result); }
-#line 4043 "src/prebuilt/wast-lexer-gen.cc"
+#line 4046 "src/prebuilt/wast-lexer-gen.cc"
yy586:
yych = *++cursor_;
if (yych == 'w') goto yy733;
@@ -4049,17 +4052,17 @@ yy587:
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 406 "src/wast-lexer.cc"
- { RETURN(Return); }
-#line 4055 "src/prebuilt/wast-lexer-gen.cc"
+#line 409 "src/wast-lexer.cc"
+ { RETURN_OPCODE0(Return); }
+#line 4058 "src/prebuilt/wast-lexer-gen.cc"
yy589:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 564 "src/wast-lexer.cc"
- { RETURN(Select); }
-#line 4063 "src/prebuilt/wast-lexer-gen.cc"
+#line 575 "src/wast-lexer.cc"
+ { RETURN_OPCODE0(Select); }
+#line 4066 "src/prebuilt/wast-lexer-gen.cc"
yy591:
yych = *++cursor_;
if (yych == 'o') goto yy735;
@@ -4098,9 +4101,9 @@ yy595:
}
}
yy596:
-#line 436 "src/wast-lexer.cc"
+#line 439 "src/wast-lexer.cc"
{ RETURN_TEXT_AT(AlignEqNat, 6); }
-#line 4104 "src/prebuilt/wast-lexer-gen.cc"
+#line 4107 "src/prebuilt/wast-lexer-gen.cc"
yy597:
++cursor_;
if (limit_ <= cursor_) FILL(1);
@@ -4130,9 +4133,9 @@ yy599:
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 391 "src/wast-lexer.cc"
+#line 394 "src/wast-lexer.cc"
{ RETURN(Anyfunc); }
-#line 4136 "src/prebuilt/wast-lexer-gen.cc"
+#line 4139 "src/prebuilt/wast-lexer-gen.cc"
yy601:
yych = *++cursor_;
switch (yych) {
@@ -4165,17 +4168,17 @@ yy606:
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 451 "src/wast-lexer.cc"
+#line 454 "src/wast-lexer.cc"
{ RETURN_OPCODE(Unary, F32Abs); }
-#line 4171 "src/prebuilt/wast-lexer-gen.cc"
+#line 4174 "src/prebuilt/wast-lexer-gen.cc"
yy608:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 493 "src/wast-lexer.cc"
+#line 496 "src/wast-lexer.cc"
{ RETURN_OPCODE(Binary, F32Add); }
-#line 4179 "src/prebuilt/wast-lexer-gen.cc"
+#line 4182 "src/prebuilt/wast-lexer-gen.cc"
yy610:
yych = *++cursor_;
if (yych == 'l') goto yy752;
@@ -4198,9 +4201,9 @@ yy614:
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 499 "src/wast-lexer.cc"
+#line 502 "src/wast-lexer.cc"
{ RETURN_OPCODE(Binary, F32Div); }
-#line 4204 "src/prebuilt/wast-lexer-gen.cc"
+#line 4207 "src/prebuilt/wast-lexer-gen.cc"
yy616:
yych = *++cursor_;
if (yych == 'o') goto yy758;
@@ -4214,25 +4217,25 @@ yy618:
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 503 "src/wast-lexer.cc"
+#line 506 "src/wast-lexer.cc"
{ RETURN_OPCODE(Binary, F32Max); }
-#line 4220 "src/prebuilt/wast-lexer-gen.cc"
+#line 4223 "src/prebuilt/wast-lexer-gen.cc"
yy620:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 501 "src/wast-lexer.cc"
+#line 504 "src/wast-lexer.cc"
{ RETURN_OPCODE(Binary, F32Min); }
-#line 4228 "src/prebuilt/wast-lexer-gen.cc"
+#line 4231 "src/prebuilt/wast-lexer-gen.cc"
yy622:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 497 "src/wast-lexer.cc"
+#line 500 "src/wast-lexer.cc"
{ RETURN_OPCODE(Binary, F32Mul); }
-#line 4236 "src/prebuilt/wast-lexer-gen.cc"
+#line 4239 "src/prebuilt/wast-lexer-gen.cc"
yy624:
yych = *++cursor_;
if (yych == 'r') goto yy761;
@@ -4242,9 +4245,9 @@ yy625:
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 449 "src/wast-lexer.cc"
+#line 452 "src/wast-lexer.cc"
{ RETURN_OPCODE(Unary, F32Neg); }
-#line 4248 "src/prebuilt/wast-lexer-gen.cc"
+#line 4251 "src/prebuilt/wast-lexer-gen.cc"
yy627:
yych = *++cursor_;
if (yych == 'n') goto yy762;
@@ -4262,9 +4265,9 @@ yy630:
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 495 "src/wast-lexer.cc"
+#line 498 "src/wast-lexer.cc"
{ RETURN_OPCODE(Binary, F32Sub); }
-#line 4268 "src/prebuilt/wast-lexer-gen.cc"
+#line 4271 "src/prebuilt/wast-lexer-gen.cc"
yy632:
yych = *++cursor_;
if (yych == 'n') goto yy766;
@@ -4274,17 +4277,17 @@ yy633:
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 452 "src/wast-lexer.cc"
+#line 455 "src/wast-lexer.cc"
{ RETURN_OPCODE(Unary, F64Abs); }
-#line 4280 "src/prebuilt/wast-lexer-gen.cc"
+#line 4283 "src/prebuilt/wast-lexer-gen.cc"
yy635:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 494 "src/wast-lexer.cc"
+#line 497 "src/wast-lexer.cc"
{ RETURN_OPCODE(Binary, F64Add); }
-#line 4288 "src/prebuilt/wast-lexer-gen.cc"
+#line 4291 "src/prebuilt/wast-lexer-gen.cc"
yy637:
yych = *++cursor_;
if (yych == 'l') goto yy767;
@@ -4303,9 +4306,9 @@ yy640:
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 500 "src/wast-lexer.cc"
+#line 503 "src/wast-lexer.cc"
{ RETURN_OPCODE(Binary, F64Div); }
-#line 4309 "src/prebuilt/wast-lexer-gen.cc"
+#line 4312 "src/prebuilt/wast-lexer-gen.cc"
yy642:
yych = *++cursor_;
if (yych == 'o') goto yy772;
@@ -4319,25 +4322,25 @@ yy644:
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 504 "src/wast-lexer.cc"
+#line 507 "src/wast-lexer.cc"
{ RETURN_OPCODE(Binary, F64Max); }
-#line 4325 "src/prebuilt/wast-lexer-gen.cc"
+#line 4328 "src/prebuilt/wast-lexer-gen.cc"
yy646:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 502 "src/wast-lexer.cc"
+#line 505 "src/wast-lexer.cc"
{ RETURN_OPCODE(Binary, F64Min); }
-#line 4333 "src/prebuilt/wast-lexer-gen.cc"
+#line 4336 "src/prebuilt/wast-lexer-gen.cc"
yy648:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 498 "src/wast-lexer.cc"
+#line 501 "src/wast-lexer.cc"
{ RETURN_OPCODE(Binary, F64Mul); }
-#line 4341 "src/prebuilt/wast-lexer-gen.cc"
+#line 4344 "src/prebuilt/wast-lexer-gen.cc"
yy650:
yych = *++cursor_;
if (yych == 'r') goto yy775;
@@ -4347,9 +4350,9 @@ yy651:
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 450 "src/wast-lexer.cc"
+#line 453 "src/wast-lexer.cc"
{ RETURN_OPCODE(Unary, F64Neg); }
-#line 4353 "src/prebuilt/wast-lexer-gen.cc"
+#line 4356 "src/prebuilt/wast-lexer-gen.cc"
yy653:
yych = *++cursor_;
if (yych == 'm') goto yy776;
@@ -4371,9 +4374,9 @@ yy657:
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 496 "src/wast-lexer.cc"
+#line 499 "src/wast-lexer.cc"
{ RETURN_OPCODE(Binary, F64Sub); }
-#line 4377 "src/prebuilt/wast-lexer-gen.cc"
+#line 4380 "src/prebuilt/wast-lexer-gen.cc"
yy659:
yych = *++cursor_;
if (yych == 'n') goto yy781;
@@ -4395,25 +4398,25 @@ yy663:
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 463 "src/wast-lexer.cc"
+#line 466 "src/wast-lexer.cc"
{ RETURN_OPCODE(Binary, I32Add); }
-#line 4401 "src/prebuilt/wast-lexer-gen.cc"
+#line 4404 "src/prebuilt/wast-lexer-gen.cc"
yy665:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 477 "src/wast-lexer.cc"
+#line 480 "src/wast-lexer.cc"
{ RETURN_OPCODE(Binary, I32And); }
-#line 4409 "src/prebuilt/wast-lexer-gen.cc"
+#line 4412 "src/prebuilt/wast-lexer-gen.cc"
yy667:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 443 "src/wast-lexer.cc"
+#line 446 "src/wast-lexer.cc"
{ RETURN_OPCODE(Unary, I32Clz); }
-#line 4417 "src/prebuilt/wast-lexer-gen.cc"
+#line 4420 "src/prebuilt/wast-lexer-gen.cc"
yy669:
yych = *++cursor_;
if (yych == 's') goto yy785;
@@ -4423,9 +4426,9 @@ yy670:
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 445 "src/wast-lexer.cc"
+#line 448 "src/wast-lexer.cc"
{ RETURN_OPCODE(Unary, I32Ctz); }
-#line 4429 "src/prebuilt/wast-lexer-gen.cc"
+#line 4432 "src/prebuilt/wast-lexer-gen.cc"
yy672:
yych = *++cursor_;
if (yych == '_') goto yy786;
@@ -4435,9 +4438,9 @@ yy673:
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 441 "src/wast-lexer.cc"
+#line 444 "src/wast-lexer.cc"
{ RETURN_OPCODE(Convert, I32Eqz); }
-#line 4441 "src/prebuilt/wast-lexer-gen.cc"
+#line 4444 "src/prebuilt/wast-lexer-gen.cc"
yy675:
yych = *++cursor_;
if (yych == 's') goto yy787;
@@ -4467,9 +4470,9 @@ yy680:
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 467 "src/wast-lexer.cc"
+#line 470 "src/wast-lexer.cc"
{ RETURN_OPCODE(Binary, I32Mul); }
-#line 4473 "src/prebuilt/wast-lexer-gen.cc"
+#line 4476 "src/prebuilt/wast-lexer-gen.cc"
yy682:
yych = *++cursor_;
if (yych == 'c') goto yy805;
@@ -4492,9 +4495,9 @@ yy686:
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 483 "src/wast-lexer.cc"
+#line 486 "src/wast-lexer.cc"
{ RETURN_OPCODE(Binary, I32Shl); }
-#line 4498 "src/prebuilt/wast-lexer-gen.cc"
+#line 4501 "src/prebuilt/wast-lexer-gen.cc"
yy688:
yych = *++cursor_;
if (yych == '_') goto yy812;
@@ -4508,9 +4511,9 @@ yy690:
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 465 "src/wast-lexer.cc"
+#line 468 "src/wast-lexer.cc"
{ RETURN_OPCODE(Binary, I32Sub); }
-#line 4514 "src/prebuilt/wast-lexer-gen.cc"
+#line 4517 "src/prebuilt/wast-lexer-gen.cc"
yy692:
yych = *++cursor_;
if (yych == 'n') goto yy814;
@@ -4524,33 +4527,33 @@ yy694:
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 481 "src/wast-lexer.cc"
+#line 484 "src/wast-lexer.cc"
{ RETURN_OPCODE(Binary, I32Xor); }
-#line 4530 "src/prebuilt/wast-lexer-gen.cc"
+#line 4533 "src/prebuilt/wast-lexer-gen.cc"
yy696:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 464 "src/wast-lexer.cc"
+#line 467 "src/wast-lexer.cc"
{ RETURN_OPCODE(Binary, I64Add); }
-#line 4538 "src/prebuilt/wast-lexer-gen.cc"
+#line 4541 "src/prebuilt/wast-lexer-gen.cc"
yy698:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 478 "src/wast-lexer.cc"
+#line 481 "src/wast-lexer.cc"
{ RETURN_OPCODE(Binary, I64And); }
-#line 4546 "src/prebuilt/wast-lexer-gen.cc"
+#line 4549 "src/prebuilt/wast-lexer-gen.cc"
yy700:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 444 "src/wast-lexer.cc"
+#line 447 "src/wast-lexer.cc"
{ RETURN_OPCODE(Unary, I64Clz); }
-#line 4554 "src/prebuilt/wast-lexer-gen.cc"
+#line 4557 "src/prebuilt/wast-lexer-gen.cc"
yy702:
yych = *++cursor_;
if (yych == 's') goto yy816;
@@ -4560,9 +4563,9 @@ yy703:
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 446 "src/wast-lexer.cc"
+#line 449 "src/wast-lexer.cc"
{ RETURN_OPCODE(Unary, I64Ctz); }
-#line 4566 "src/prebuilt/wast-lexer-gen.cc"
+#line 4569 "src/prebuilt/wast-lexer-gen.cc"
yy705:
yych = *++cursor_;
if (yych == '_') goto yy817;
@@ -4572,9 +4575,9 @@ yy706:
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 442 "src/wast-lexer.cc"
+#line 445 "src/wast-lexer.cc"
{ RETURN_OPCODE(Convert, I64Eqz); }
-#line 4578 "src/prebuilt/wast-lexer-gen.cc"
+#line 4581 "src/prebuilt/wast-lexer-gen.cc"
yy708:
yych = *++cursor_;
if (yych == 'e') goto yy818;
@@ -4608,9 +4611,9 @@ yy714:
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 468 "src/wast-lexer.cc"
+#line 471 "src/wast-lexer.cc"
{ RETURN_OPCODE(Binary, I64Mul); }
-#line 4614 "src/prebuilt/wast-lexer-gen.cc"
+#line 4617 "src/prebuilt/wast-lexer-gen.cc"
yy716:
yych = *++cursor_;
if (yych == 'c') goto yy837;
@@ -4633,9 +4636,9 @@ yy720:
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 484 "src/wast-lexer.cc"
+#line 487 "src/wast-lexer.cc"
{ RETURN_OPCODE(Binary, I64Shl); }
-#line 4639 "src/prebuilt/wast-lexer-gen.cc"
+#line 4642 "src/prebuilt/wast-lexer-gen.cc"
yy722:
yych = *++cursor_;
if (yych == '_') goto yy844;
@@ -4649,9 +4652,9 @@ yy724:
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 466 "src/wast-lexer.cc"
+#line 469 "src/wast-lexer.cc"
{ RETURN_OPCODE(Binary, I64Sub); }
-#line 4655 "src/prebuilt/wast-lexer-gen.cc"
+#line 4658 "src/prebuilt/wast-lexer-gen.cc"
yy726:
yych = *++cursor_;
if (yych == 'n') goto yy846;
@@ -4661,9 +4664,9 @@ yy727:
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 482 "src/wast-lexer.cc"
+#line 485 "src/wast-lexer.cc"
{ RETURN_OPCODE(Binary, I64Xor); }
-#line 4667 "src/prebuilt/wast-lexer-gen.cc"
+#line 4670 "src/prebuilt/wast-lexer-gen.cc"
yy729:
++cursor_;
if (limit_ <= cursor_) FILL(1);
@@ -4711,9 +4714,9 @@ yy733:
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 601 "src/wast-lexer.cc"
- { RETURN(Rethrow); }
-#line 4717 "src/prebuilt/wast-lexer-gen.cc"
+#line 612 "src/wast-lexer.cc"
+ { RETURN_OPCODE0(Rethrow); }
+#line 4720 "src/prebuilt/wast-lexer-gen.cc"
yy735:
yych = *++cursor_;
if (yych == 'b') goto yy853;
@@ -4809,9 +4812,9 @@ yy747:
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 401 "src/wast-lexer.cc"
- { RETURN(BrTable); }
-#line 4815 "src/prebuilt/wast-lexer-gen.cc"
+#line 404 "src/wast-lexer.cc"
+ { RETURN_OPCODE0(BrTable); }
+#line 4818 "src/prebuilt/wast-lexer-gen.cc"
yy749:
yych = *++cursor_;
if (yych == 'i') goto yy865;
@@ -4829,9 +4832,9 @@ yy752:
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 455 "src/wast-lexer.cc"
+#line 458 "src/wast-lexer.cc"
{ RETURN_OPCODE(Unary, F32Ceil); }
-#line 4835 "src/prebuilt/wast-lexer-gen.cc"
+#line 4838 "src/prebuilt/wast-lexer-gen.cc"
yy754:
yych = *++cursor_;
if (yych == 't') goto yy869;
@@ -4857,9 +4860,9 @@ yy759:
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 414 "src/wast-lexer.cc"
+#line 417 "src/wast-lexer.cc"
{ RETURN_OPCODE(Load, F32Load); }
-#line 4863 "src/prebuilt/wast-lexer-gen.cc"
+#line 4866 "src/prebuilt/wast-lexer-gen.cc"
yy761:
yych = *++cursor_;
if (yych == 'e') goto yy876;
@@ -4873,9 +4876,9 @@ yy763:
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 453 "src/wast-lexer.cc"
+#line 456 "src/wast-lexer.cc"
{ RETURN_OPCODE(Unary, F32Sqrt); }
-#line 4879 "src/prebuilt/wast-lexer-gen.cc"
+#line 4882 "src/prebuilt/wast-lexer-gen.cc"
yy765:
yych = *++cursor_;
if (yych == 'e') goto yy878;
@@ -4889,9 +4892,9 @@ yy767:
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 456 "src/wast-lexer.cc"
+#line 459 "src/wast-lexer.cc"
{ RETURN_OPCODE(Unary, F64Ceil); }
-#line 4895 "src/prebuilt/wast-lexer-gen.cc"
+#line 4898 "src/prebuilt/wast-lexer-gen.cc"
yy769:
yych = *++cursor_;
if (yych == 't') goto yy882;
@@ -4913,9 +4916,9 @@ yy773:
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 415 "src/wast-lexer.cc"
+#line 418 "src/wast-lexer.cc"
{ RETURN_OPCODE(Load, F64Load); }
-#line 4919 "src/prebuilt/wast-lexer-gen.cc"
+#line 4922 "src/prebuilt/wast-lexer-gen.cc"
yy775:
yych = *++cursor_;
if (yych == 'e') goto yy888;
@@ -4933,9 +4936,9 @@ yy778:
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 454 "src/wast-lexer.cc"
+#line 457 "src/wast-lexer.cc"
{ RETURN_OPCODE(Unary, F64Sqrt); }
-#line 4939 "src/prebuilt/wast-lexer-gen.cc"
+#line 4942 "src/prebuilt/wast-lexer-gen.cc"
yy780:
yych = *++cursor_;
if (yych == 'e') goto yy891;
@@ -4970,49 +4973,49 @@ yy787:
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 523 "src/wast-lexer.cc"
+#line 526 "src/wast-lexer.cc"
{ RETURN_OPCODE(Compare, I32GeS); }
-#line 4976 "src/prebuilt/wast-lexer-gen.cc"
+#line 4979 "src/prebuilt/wast-lexer-gen.cc"
yy789:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 525 "src/wast-lexer.cc"
+#line 528 "src/wast-lexer.cc"
{ RETURN_OPCODE(Compare, I32GeU); }
-#line 4984 "src/prebuilt/wast-lexer-gen.cc"
+#line 4987 "src/prebuilt/wast-lexer-gen.cc"
yy791:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 519 "src/wast-lexer.cc"
+#line 522 "src/wast-lexer.cc"
{ RETURN_OPCODE(Compare, I32GtS); }
-#line 4992 "src/prebuilt/wast-lexer-gen.cc"
+#line 4995 "src/prebuilt/wast-lexer-gen.cc"
yy793:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 521 "src/wast-lexer.cc"
+#line 524 "src/wast-lexer.cc"
{ RETURN_OPCODE(Compare, I32GtU); }
-#line 5000 "src/prebuilt/wast-lexer-gen.cc"
+#line 5003 "src/prebuilt/wast-lexer-gen.cc"
yy795:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 515 "src/wast-lexer.cc"
+#line 518 "src/wast-lexer.cc"
{ RETURN_OPCODE(Compare, I32LeS); }
-#line 5008 "src/prebuilt/wast-lexer-gen.cc"
+#line 5011 "src/prebuilt/wast-lexer-gen.cc"
yy797:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 517 "src/wast-lexer.cc"
+#line 520 "src/wast-lexer.cc"
{ RETURN_OPCODE(Compare, I32LeU); }
-#line 5016 "src/prebuilt/wast-lexer-gen.cc"
+#line 5019 "src/prebuilt/wast-lexer-gen.cc"
yy799:
++cursor_;
if ((yych = *cursor_) <= '0') {
@@ -5033,25 +5036,25 @@ yy799:
}
}
yy800:
-#line 412 "src/wast-lexer.cc"
+#line 415 "src/wast-lexer.cc"
{ RETURN_OPCODE(Load, I32Load); }
-#line 5039 "src/prebuilt/wast-lexer-gen.cc"
+#line 5042 "src/prebuilt/wast-lexer-gen.cc"
yy801:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 511 "src/wast-lexer.cc"
+#line 514 "src/wast-lexer.cc"
{ RETURN_OPCODE(Compare, I32LtS); }
-#line 5047 "src/prebuilt/wast-lexer-gen.cc"
+#line 5050 "src/prebuilt/wast-lexer-gen.cc"
yy803:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 513 "src/wast-lexer.cc"
+#line 516 "src/wast-lexer.cc"
{ RETURN_OPCODE(Compare, I32LtU); }
-#line 5055 "src/prebuilt/wast-lexer-gen.cc"
+#line 5058 "src/prebuilt/wast-lexer-gen.cc"
yy805:
yych = *++cursor_;
if (yych == 'n') goto yy907;
@@ -5070,17 +5073,17 @@ yy808:
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 489 "src/wast-lexer.cc"
+#line 492 "src/wast-lexer.cc"
{ RETURN_OPCODE(Binary, I32Rotl); }
-#line 5076 "src/prebuilt/wast-lexer-gen.cc"
+#line 5079 "src/prebuilt/wast-lexer-gen.cc"
yy810:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 491 "src/wast-lexer.cc"
+#line 494 "src/wast-lexer.cc"
{ RETURN_OPCODE(Binary, I32Rotr); }
-#line 5084 "src/prebuilt/wast-lexer-gen.cc"
+#line 5087 "src/prebuilt/wast-lexer-gen.cc"
yy812:
yych = *++cursor_;
if (yych == 's') goto yy913;
@@ -5116,49 +5119,49 @@ yy819:
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 524 "src/wast-lexer.cc"
+#line 527 "src/wast-lexer.cc"
{ RETURN_OPCODE(Compare, I64GeS); }
-#line 5122 "src/prebuilt/wast-lexer-gen.cc"
+#line 5125 "src/prebuilt/wast-lexer-gen.cc"
yy821:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 526 "src/wast-lexer.cc"
+#line 529 "src/wast-lexer.cc"
{ RETURN_OPCODE(Compare, I64GeU); }
-#line 5130 "src/prebuilt/wast-lexer-gen.cc"
+#line 5133 "src/prebuilt/wast-lexer-gen.cc"
yy823:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 520 "src/wast-lexer.cc"
+#line 523 "src/wast-lexer.cc"
{ RETURN_OPCODE(Compare, I64GtS); }
-#line 5138 "src/prebuilt/wast-lexer-gen.cc"
+#line 5141 "src/prebuilt/wast-lexer-gen.cc"
yy825:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 522 "src/wast-lexer.cc"
+#line 525 "src/wast-lexer.cc"
{ RETURN_OPCODE(Compare, I64GtU); }
-#line 5146 "src/prebuilt/wast-lexer-gen.cc"
+#line 5149 "src/prebuilt/wast-lexer-gen.cc"
yy827:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 516 "src/wast-lexer.cc"
+#line 519 "src/wast-lexer.cc"
{ RETURN_OPCODE(Compare, I64LeS); }
-#line 5154 "src/prebuilt/wast-lexer-gen.cc"
+#line 5157 "src/prebuilt/wast-lexer-gen.cc"
yy829:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 518 "src/wast-lexer.cc"
+#line 521 "src/wast-lexer.cc"
{ RETURN_OPCODE(Compare, I64LeU); }
-#line 5162 "src/prebuilt/wast-lexer-gen.cc"
+#line 5165 "src/prebuilt/wast-lexer-gen.cc"
yy831:
++cursor_;
if ((yych = *cursor_) <= '1') {
@@ -5181,25 +5184,25 @@ yy831:
}
}
yy832:
-#line 413 "src/wast-lexer.cc"
+#line 416 "src/wast-lexer.cc"
{ RETURN_OPCODE(Load, I64Load); }
-#line 5187 "src/prebuilt/wast-lexer-gen.cc"
+#line 5190 "src/prebuilt/wast-lexer-gen.cc"
yy833:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 512 "src/wast-lexer.cc"
+#line 515 "src/wast-lexer.cc"
{ RETURN_OPCODE(Compare, I64LtS); }
-#line 5195 "src/prebuilt/wast-lexer-gen.cc"
+#line 5198 "src/prebuilt/wast-lexer-gen.cc"
yy835:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 514 "src/wast-lexer.cc"
+#line 517 "src/wast-lexer.cc"
{ RETURN_OPCODE(Compare, I64LtU); }
-#line 5203 "src/prebuilt/wast-lexer-gen.cc"
+#line 5206 "src/prebuilt/wast-lexer-gen.cc"
yy837:
yych = *++cursor_;
if (yych == 'n') goto yy931;
@@ -5218,17 +5221,17 @@ yy840:
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 490 "src/wast-lexer.cc"
+#line 493 "src/wast-lexer.cc"
{ RETURN_OPCODE(Binary, I64Rotl); }
-#line 5224 "src/prebuilt/wast-lexer-gen.cc"
+#line 5227 "src/prebuilt/wast-lexer-gen.cc"
yy842:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 492 "src/wast-lexer.cc"
+#line 495 "src/wast-lexer.cc"
{ RETURN_OPCODE(Binary, I64Rotr); }
-#line 5232 "src/prebuilt/wast-lexer-gen.cc"
+#line 5235 "src/prebuilt/wast-lexer-gen.cc"
yy844:
yych = *++cursor_;
if (yych == 's') goto yy937;
@@ -5264,9 +5267,9 @@ yy847:
}
}
yy848:
-#line 435 "src/wast-lexer.cc"
+#line 438 "src/wast-lexer.cc"
{ RETURN_TEXT_AT(OffsetEqNat, 7); }
-#line 5270 "src/prebuilt/wast-lexer-gen.cc"
+#line 5273 "src/prebuilt/wast-lexer-gen.cc"
yy849:
++cursor_;
if (limit_ <= cursor_) FILL(1);
@@ -5296,9 +5299,9 @@ yy851:
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 586 "src/wast-lexer.cc"
+#line 597 "src/wast-lexer.cc"
{ RETURN(Register); }
-#line 5302 "src/prebuilt/wast-lexer-gen.cc"
+#line 5305 "src/prebuilt/wast-lexer-gen.cc"
yy853:
yych = *++cursor_;
if (yych == 'a') goto yy946;
@@ -5380,9 +5383,9 @@ yy866:
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 599 "src/wast-lexer.cc"
- { RETURN(CatchAll); }
-#line 5386 "src/prebuilt/wast-lexer-gen.cc"
+#line 610 "src/wast-lexer.cc"
+ { RETURN_OPCODE0(CatchAll); }
+#line 5389 "src/prebuilt/wast-lexer-gen.cc"
yy868:
yych = *++cursor_;
if (yych == 'e') goto yy959;
@@ -5392,9 +5395,9 @@ yy869:
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 439 "src/wast-lexer.cc"
+#line 442 "src/wast-lexer.cc"
{ RETURN_OPCODE(Const, F32Const); }
-#line 5398 "src/prebuilt/wast-lexer-gen.cc"
+#line 5401 "src/prebuilt/wast-lexer-gen.cc"
yy871:
yych = *++cursor_;
if (yych == 'r') goto yy960;
@@ -5412,9 +5415,9 @@ yy874:
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 457 "src/wast-lexer.cc"
+#line 460 "src/wast-lexer.cc"
{ RETURN_OPCODE(Unary, F32Floor); }
-#line 5418 "src/prebuilt/wast-lexer-gen.cc"
+#line 5421 "src/prebuilt/wast-lexer-gen.cc"
yy876:
yych = *++cursor_;
if (yych == 's') goto yy963;
@@ -5428,25 +5431,25 @@ yy878:
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 418 "src/wast-lexer.cc"
+#line 421 "src/wast-lexer.cc"
{ RETURN_OPCODE(Store, F32Store); }
-#line 5434 "src/prebuilt/wast-lexer-gen.cc"
+#line 5437 "src/prebuilt/wast-lexer-gen.cc"
yy880:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 459 "src/wast-lexer.cc"
+#line 462 "src/wast-lexer.cc"
{ RETURN_OPCODE(Unary, F32Trunc); }
-#line 5442 "src/prebuilt/wast-lexer-gen.cc"
+#line 5445 "src/prebuilt/wast-lexer-gen.cc"
yy882:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 440 "src/wast-lexer.cc"
+#line 443 "src/wast-lexer.cc"
{ RETURN_OPCODE(Const, F64Const); }
-#line 5450 "src/prebuilt/wast-lexer-gen.cc"
+#line 5453 "src/prebuilt/wast-lexer-gen.cc"
yy884:
yych = *++cursor_;
if (yych == 'r') goto yy965;
@@ -5460,9 +5463,9 @@ yy886:
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 458 "src/wast-lexer.cc"
+#line 461 "src/wast-lexer.cc"
{ RETURN_OPCODE(Unary, F64Floor); }
-#line 5466 "src/prebuilt/wast-lexer-gen.cc"
+#line 5469 "src/prebuilt/wast-lexer-gen.cc"
yy888:
yych = *++cursor_;
if (yych == 's') goto yy967;
@@ -5480,17 +5483,17 @@ yy891:
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 419 "src/wast-lexer.cc"
+#line 422 "src/wast-lexer.cc"
{ RETURN_OPCODE(Store, F64Store); }
-#line 5486 "src/prebuilt/wast-lexer-gen.cc"
+#line 5489 "src/prebuilt/wast-lexer-gen.cc"
yy893:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 460 "src/wast-lexer.cc"
+#line 463 "src/wast-lexer.cc"
{ RETURN_OPCODE(Unary, F64Trunc); }
-#line 5494 "src/prebuilt/wast-lexer-gen.cc"
+#line 5497 "src/prebuilt/wast-lexer-gen.cc"
yy895:
yych = *++cursor_;
if (yych == 'l') goto yy970;
@@ -5500,9 +5503,9 @@ yy896:
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 407 "src/wast-lexer.cc"
- { RETURN(GetLocal); }
-#line 5506 "src/prebuilt/wast-lexer-gen.cc"
+#line 410 "src/wast-lexer.cc"
+ { RETURN_OPCODE0(GetLocal); }
+#line 5509 "src/prebuilt/wast-lexer-gen.cc"
yy898:
yych = *++cursor_;
if (yych == 'r') goto yy972;
@@ -5512,25 +5515,25 @@ yy899:
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 437 "src/wast-lexer.cc"
+#line 440 "src/wast-lexer.cc"
{ RETURN_OPCODE(Const, I32Const); }
-#line 5518 "src/prebuilt/wast-lexer-gen.cc"
+#line 5521 "src/prebuilt/wast-lexer-gen.cc"
yy901:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 469 "src/wast-lexer.cc"
+#line 472 "src/wast-lexer.cc"
{ RETURN_OPCODE(Binary, I32DivS); }
-#line 5526 "src/prebuilt/wast-lexer-gen.cc"
+#line 5529 "src/prebuilt/wast-lexer-gen.cc"
yy903:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 471 "src/wast-lexer.cc"
+#line 474 "src/wast-lexer.cc"
{ RETURN_OPCODE(Binary, I32DivU); }
-#line 5534 "src/prebuilt/wast-lexer-gen.cc"
+#line 5537 "src/prebuilt/wast-lexer-gen.cc"
yy905:
yych = *++cursor_;
if (yych == '6') goto yy973;
@@ -5552,33 +5555,33 @@ yy909:
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 473 "src/wast-lexer.cc"
+#line 476 "src/wast-lexer.cc"
{ RETURN_OPCODE(Binary, I32RemS); }
-#line 5558 "src/prebuilt/wast-lexer-gen.cc"
+#line 5561 "src/prebuilt/wast-lexer-gen.cc"
yy911:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 475 "src/wast-lexer.cc"
+#line 478 "src/wast-lexer.cc"
{ RETURN_OPCODE(Binary, I32RemU); }
-#line 5566 "src/prebuilt/wast-lexer-gen.cc"
+#line 5569 "src/prebuilt/wast-lexer-gen.cc"
yy913:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 485 "src/wast-lexer.cc"
+#line 488 "src/wast-lexer.cc"
{ RETURN_OPCODE(Binary, I32ShrS); }
-#line 5574 "src/prebuilt/wast-lexer-gen.cc"
+#line 5577 "src/prebuilt/wast-lexer-gen.cc"
yy915:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 487 "src/wast-lexer.cc"
+#line 490 "src/wast-lexer.cc"
{ RETURN_OPCODE(Binary, I32ShrU); }
-#line 5582 "src/prebuilt/wast-lexer-gen.cc"
+#line 5585 "src/prebuilt/wast-lexer-gen.cc"
yy917:
++cursor_;
if ((yych = *cursor_) <= '0') {
@@ -5599,9 +5602,9 @@ yy917:
}
}
yy918:
-#line 416 "src/wast-lexer.cc"
+#line 419 "src/wast-lexer.cc"
{ RETURN_OPCODE(Store, I32Store); }
-#line 5605 "src/prebuilt/wast-lexer-gen.cc"
+#line 5608 "src/prebuilt/wast-lexer-gen.cc"
yy919:
yych = *++cursor_;
if (yych == '_') goto yy981;
@@ -5615,25 +5618,25 @@ yy921:
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 438 "src/wast-lexer.cc"
+#line 441 "src/wast-lexer.cc"
{ RETURN_OPCODE(Const, I64Const); }
-#line 5621 "src/prebuilt/wast-lexer-gen.cc"
+#line 5624 "src/prebuilt/wast-lexer-gen.cc"
yy923:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 470 "src/wast-lexer.cc"
+#line 473 "src/wast-lexer.cc"
{ RETURN_OPCODE(Binary, I64DivS); }
-#line 5629 "src/prebuilt/wast-lexer-gen.cc"
+#line 5632 "src/prebuilt/wast-lexer-gen.cc"
yy925:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 472 "src/wast-lexer.cc"
+#line 475 "src/wast-lexer.cc"
{ RETURN_OPCODE(Binary, I64DivU); }
-#line 5637 "src/prebuilt/wast-lexer-gen.cc"
+#line 5640 "src/prebuilt/wast-lexer-gen.cc"
yy927:
yych = *++cursor_;
if (yych == 'd') goto yy983;
@@ -5663,33 +5666,33 @@ yy933:
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 474 "src/wast-lexer.cc"
+#line 477 "src/wast-lexer.cc"
{ RETURN_OPCODE(Binary, I64RemS); }
-#line 5669 "src/prebuilt/wast-lexer-gen.cc"
+#line 5672 "src/prebuilt/wast-lexer-gen.cc"
yy935:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 476 "src/wast-lexer.cc"
+#line 479 "src/wast-lexer.cc"
{ RETURN_OPCODE(Binary, I64RemU); }
-#line 5677 "src/prebuilt/wast-lexer-gen.cc"
+#line 5680 "src/prebuilt/wast-lexer-gen.cc"
yy937:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 486 "src/wast-lexer.cc"
+#line 489 "src/wast-lexer.cc"
{ RETURN_OPCODE(Binary, I64ShrS); }
-#line 5685 "src/prebuilt/wast-lexer-gen.cc"
+#line 5688 "src/prebuilt/wast-lexer-gen.cc"
yy939:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 488 "src/wast-lexer.cc"
+#line 491 "src/wast-lexer.cc"
{ RETURN_OPCODE(Binary, I64ShrU); }
-#line 5693 "src/prebuilt/wast-lexer-gen.cc"
+#line 5696 "src/prebuilt/wast-lexer-gen.cc"
yy941:
++cursor_;
if ((yych = *cursor_) <= '1') {
@@ -5712,9 +5715,9 @@ yy941:
}
}
yy942:
-#line 417 "src/wast-lexer.cc"
+#line 420 "src/wast-lexer.cc"
{ RETURN_OPCODE(Store, I64Store); }
-#line 5718 "src/prebuilt/wast-lexer-gen.cc"
+#line 5721 "src/prebuilt/wast-lexer-gen.cc"
yy943:
yych = *++cursor_;
if (yych == '_') goto yy994;
@@ -5778,17 +5781,17 @@ yy947:
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 408 "src/wast-lexer.cc"
- { RETURN(SetLocal); }
-#line 5784 "src/prebuilt/wast-lexer-gen.cc"
+#line 411 "src/wast-lexer.cc"
+ { RETURN_OPCODE0(SetLocal); }
+#line 5787 "src/prebuilt/wast-lexer-gen.cc"
yy949:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 409 "src/wast-lexer.cc"
- { RETURN(TeeLocal); }
-#line 5792 "src/prebuilt/wast-lexer-gen.cc"
+#line 412 "src/wast-lexer.cc"
+ { RETURN_OPCODE0(TeeLocal); }
+#line 5795 "src/prebuilt/wast-lexer-gen.cc"
yy951:
yych = *++cursor_;
if (yych == 'l') goto yy999;
@@ -5870,9 +5873,9 @@ yy970:
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 410 "src/wast-lexer.cc"
- { RETURN(GetGlobal); }
-#line 5876 "src/prebuilt/wast-lexer-gen.cc"
+#line 413 "src/wast-lexer.cc"
+ { RETURN_OPCODE0(GetGlobal); }
+#line 5879 "src/prebuilt/wast-lexer-gen.cc"
yy972:
yych = *++cursor_;
if (yych == 'y') goto yy1021;
@@ -5891,9 +5894,9 @@ yy975:
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 447 "src/wast-lexer.cc"
+#line 450 "src/wast-lexer.cc"
{ RETURN_OPCODE(Unary, I32Popcnt); }
-#line 5897 "src/prebuilt/wast-lexer-gen.cc"
+#line 5900 "src/prebuilt/wast-lexer-gen.cc"
yy977:
yych = *++cursor_;
if (yych == 'r') goto yy1028;
@@ -5907,9 +5910,9 @@ yy979:
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 430 "src/wast-lexer.cc"
+#line 433 "src/wast-lexer.cc"
{ RETURN_OPCODE(Store, I32Store8); }
-#line 5913 "src/prebuilt/wast-lexer-gen.cc"
+#line 5916 "src/prebuilt/wast-lexer-gen.cc"
yy981:
yych = *++cursor_;
if (yych == 's') goto yy1031;
@@ -5941,9 +5944,9 @@ yy987:
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 448 "src/wast-lexer.cc"
+#line 451 "src/wast-lexer.cc"
{ RETURN_OPCODE(Unary, I64Popcnt); }
-#line 5947 "src/prebuilt/wast-lexer-gen.cc"
+#line 5950 "src/prebuilt/wast-lexer-gen.cc"
yy989:
yych = *++cursor_;
if (yych == 'r') goto yy1041;
@@ -5961,9 +5964,9 @@ yy992:
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 431 "src/wast-lexer.cc"
+#line 434 "src/wast-lexer.cc"
{ RETURN_OPCODE(Store, I64Store8); }
-#line 5967 "src/prebuilt/wast-lexer-gen.cc"
+#line 5970 "src/prebuilt/wast-lexer-gen.cc"
yy994:
yych = *++cursor_;
if (yych == 's') goto yy1046;
@@ -6006,9 +6009,9 @@ yy997:
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 411 "src/wast-lexer.cc"
- { RETURN(SetGlobal); }
-#line 6012 "src/prebuilt/wast-lexer-gen.cc"
+#line 414 "src/wast-lexer.cc"
+ { RETURN_OPCODE0(SetGlobal); }
+#line 6015 "src/prebuilt/wast-lexer-gen.cc"
yy999:
yych = *++cursor_;
if (yych == 'e') goto yy1048;
@@ -6034,9 +6037,9 @@ yy1004:
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 595 "src/wast-lexer.cc"
+#line 606 "src/wast-lexer.cc"
{ RETURN(AssertTrap); }
-#line 6040 "src/prebuilt/wast-lexer-gen.cc"
+#line 6043 "src/prebuilt/wast-lexer-gen.cc"
yy1006:
yych = *++cursor_;
if (yych == 'n') goto yy1054;
@@ -6066,9 +6069,9 @@ yy1012:
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 461 "src/wast-lexer.cc"
+#line 464 "src/wast-lexer.cc"
{ RETURN_OPCODE(Unary, F32Nearest); }
-#line 6072 "src/prebuilt/wast-lexer-gen.cc"
+#line 6075 "src/prebuilt/wast-lexer-gen.cc"
yy1014:
yych = *++cursor_;
if (yych == 'p') goto yy1061;
@@ -6086,9 +6089,9 @@ yy1017:
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 462 "src/wast-lexer.cc"
+#line 465 "src/wast-lexer.cc"
{ RETURN_OPCODE(Unary, F64Nearest); }
-#line 6092 "src/prebuilt/wast-lexer-gen.cc"
+#line 6095 "src/prebuilt/wast-lexer-gen.cc"
yy1019:
yych = *++cursor_;
if (yych == '/') goto yy1065;
@@ -6102,9 +6105,9 @@ yy1021:
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 567 "src/wast-lexer.cc"
- { RETURN(GrowMemory); }
-#line 6108 "src/prebuilt/wast-lexer-gen.cc"
+#line 578 "src/wast-lexer.cc"
+ { RETURN_OPCODE0(GrowMemory); }
+#line 6111 "src/prebuilt/wast-lexer-gen.cc"
yy1023:
yych = *++cursor_;
if (yych == 's') goto yy1067;
@@ -6115,17 +6118,17 @@ yy1024:
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 420 "src/wast-lexer.cc"
+#line 423 "src/wast-lexer.cc"
{ RETURN_OPCODE(Load, I32Load8S); }
-#line 6121 "src/prebuilt/wast-lexer-gen.cc"
+#line 6124 "src/prebuilt/wast-lexer-gen.cc"
yy1026:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 422 "src/wast-lexer.cc"
+#line 425 "src/wast-lexer.cc"
{ RETURN_OPCODE(Load, I32Load8U); }
-#line 6129 "src/prebuilt/wast-lexer-gen.cc"
+#line 6132 "src/prebuilt/wast-lexer-gen.cc"
yy1028:
yych = *++cursor_;
if (yych == 'p') goto yy1071;
@@ -6135,459 +6138,463 @@ yy1029:
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 432 "src/wast-lexer.cc"
+#line 435 "src/wast-lexer.cc"
{ RETURN_OPCODE(Store, I32Store16); }
-#line 6141 "src/prebuilt/wast-lexer-gen.cc"
+#line 6144 "src/prebuilt/wast-lexer-gen.cc"
yy1031:
yych = *++cursor_;
if (yych == '/') goto yy1072;
+ if (yych == ':') goto yy1073;
goto yy87;
yy1032:
yych = *++cursor_;
- if (yych == '/') goto yy1073;
+ if (yych == '/') goto yy1074;
+ if (yych == ':') goto yy1075;
goto yy87;
yy1033:
yych = *++cursor_;
- if (yych == '4') goto yy1074;
+ if (yych == '4') goto yy1076;
goto yy87;
yy1034:
yych = *++cursor_;
- if (yych == 's') goto yy1076;
- if (yych == 'u') goto yy1077;
+ if (yych == 's') goto yy1078;
+ if (yych == 'u') goto yy1079;
goto yy87;
yy1035:
yych = *++cursor_;
- if (yych == 's') goto yy1078;
- if (yych == 'u') goto yy1080;
+ if (yych == 's') goto yy1080;
+ if (yych == 'u') goto yy1082;
goto yy87;
yy1036:
yych = *++cursor_;
- if (yych == 's') goto yy1082;
- if (yych == 'u') goto yy1084;
+ if (yych == 's') goto yy1084;
+ if (yych == 'u') goto yy1086;
goto yy87;
yy1037:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 421 "src/wast-lexer.cc"
+#line 424 "src/wast-lexer.cc"
{ RETURN_OPCODE(Load, I64Load8S); }
-#line 6176 "src/prebuilt/wast-lexer-gen.cc"
+#line 6181 "src/prebuilt/wast-lexer-gen.cc"
yy1039:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 423 "src/wast-lexer.cc"
+#line 426 "src/wast-lexer.cc"
{ RETURN_OPCODE(Load, I64Load8U); }
-#line 6184 "src/prebuilt/wast-lexer-gen.cc"
+#line 6189 "src/prebuilt/wast-lexer-gen.cc"
yy1041:
yych = *++cursor_;
- if (yych == 'p') goto yy1086;
+ if (yych == 'p') goto yy1088;
goto yy87;
yy1042:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 433 "src/wast-lexer.cc"
+#line 436 "src/wast-lexer.cc"
{ RETURN_OPCODE(Store, I64Store16); }
-#line 6196 "src/prebuilt/wast-lexer-gen.cc"
+#line 6201 "src/prebuilt/wast-lexer-gen.cc"
yy1044:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 434 "src/wast-lexer.cc"
+#line 437 "src/wast-lexer.cc"
{ RETURN_OPCODE(Store, I64Store32); }
-#line 6204 "src/prebuilt/wast-lexer-gen.cc"
+#line 6209 "src/prebuilt/wast-lexer-gen.cc"
yy1046:
yych = *++cursor_;
- if (yych == '/') goto yy1087;
+ if (yych == '/') goto yy1089;
+ if (yych == ':') goto yy1090;
goto yy87;
yy1047:
yych = *++cursor_;
- if (yych == '/') goto yy1088;
+ if (yych == '/') goto yy1091;
+ if (yych == ':') goto yy1092;
goto yy87;
yy1048:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 565 "src/wast-lexer.cc"
- { RETURN(Unreachable); }
-#line 6220 "src/prebuilt/wast-lexer-gen.cc"
+#line 576 "src/wast-lexer.cc"
+ { RETURN_OPCODE0(Unreachable); }
+#line 6227 "src/prebuilt/wast-lexer-gen.cc"
yy1050:
yych = *++cursor_;
- if (yych == 's') goto yy1089;
+ if (yych == 's') goto yy1093;
goto yy87;
yy1051:
yych = *++cursor_;
- if (yych == 'i') goto yy1090;
+ if (yych == 'i') goto yy1094;
goto yy87;
yy1052:
yych = *++cursor_;
- if (yych == 'r') goto yy1091;
+ if (yych == 'r') goto yy1095;
goto yy87;
yy1053:
yych = *++cursor_;
- if (yych == 'n') goto yy1092;
+ if (yych == 'n') goto yy1096;
goto yy87;
yy1054:
yych = *++cursor_;
- if (yych == 'k') goto yy1094;
+ if (yych == 'k') goto yy1098;
goto yy87;
yy1055:
yych = *++cursor_;
- if (yych == 't') goto yy1095;
+ if (yych == 't') goto yy1099;
goto yy87;
yy1056:
yych = *++cursor_;
- if (yych == 'r') goto yy1097;
+ if (yych == 'r') goto yy1101;
goto yy87;
yy1057:
yych = *++cursor_;
- if (yych == 's') goto yy1098;
- if (yych == 'u') goto yy1099;
+ if (yych == 's') goto yy1102;
+ if (yych == 'u') goto yy1103;
goto yy87;
yy1058:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 505 "src/wast-lexer.cc"
+#line 508 "src/wast-lexer.cc"
{ RETURN_OPCODE(Binary, F32Copysign); }
-#line 6261 "src/prebuilt/wast-lexer-gen.cc"
+#line 6268 "src/prebuilt/wast-lexer-gen.cc"
yy1060:
yych = *++cursor_;
- if (yych == '6') goto yy1100;
+ if (yych == '6') goto yy1104;
goto yy87;
yy1061:
yych = *++cursor_;
- if (yych == 'r') goto yy1101;
+ if (yych == 'r') goto yy1105;
goto yy87;
yy1062:
yych = *++cursor_;
- if (yych == 's') goto yy1102;
- if (yych == 'u') goto yy1103;
+ if (yych == 's') goto yy1106;
+ if (yych == 'u') goto yy1107;
goto yy87;
yy1063:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 506 "src/wast-lexer.cc"
+#line 509 "src/wast-lexer.cc"
{ RETURN_OPCODE(Binary, F64Copysign); }
-#line 6282 "src/prebuilt/wast-lexer-gen.cc"
+#line 6289 "src/prebuilt/wast-lexer-gen.cc"
yy1065:
yych = *++cursor_;
- if (yych == 'f') goto yy1104;
+ if (yych == 'f') goto yy1108;
goto yy87;
yy1066:
yych = *++cursor_;
- if (yych == 'r') goto yy1105;
+ if (yych == 'r') goto yy1109;
goto yy87;
yy1067:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 424 "src/wast-lexer.cc"
+#line 427 "src/wast-lexer.cc"
{ RETURN_OPCODE(Load, I32Load16S); }
-#line 6298 "src/prebuilt/wast-lexer-gen.cc"
+#line 6305 "src/prebuilt/wast-lexer-gen.cc"
yy1069:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 426 "src/wast-lexer.cc"
+#line 429 "src/wast-lexer.cc"
{ RETURN_OPCODE(Load, I32Load16U); }
-#line 6306 "src/prebuilt/wast-lexer-gen.cc"
+#line 6313 "src/prebuilt/wast-lexer-gen.cc"
yy1071:
yych = *++cursor_;
- if (yych == 'r') goto yy1106;
+ if (yych == 'r') goto yy1110;
goto yy87;
yy1072:
yych = *++cursor_;
- if (yych == 'f') goto yy1107;
+ if (yych == 'f') goto yy1111;
goto yy87;
yy1073:
yych = *++cursor_;
- if (yych == 'f') goto yy1108;
+ if (yych == 's') goto yy1112;
goto yy87;
yy1074:
+ yych = *++cursor_;
+ if (yych == 'f') goto yy1113;
+ goto yy87;
+yy1075:
+ yych = *++cursor_;
+ if (yych == 's') goto yy1114;
+ goto yy87;
+yy1076:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 541 "src/wast-lexer.cc"
+#line 544 "src/wast-lexer.cc"
{ RETURN_OPCODE(Convert, I32WrapI64); }
-#line 6326 "src/prebuilt/wast-lexer-gen.cc"
-yy1076:
+#line 6341 "src/prebuilt/wast-lexer-gen.cc"
+yy1078:
yych = *++cursor_;
- if (yych == '/') goto yy1109;
+ if (yych == '/') goto yy1115;
goto yy87;
-yy1077:
+yy1079:
yych = *++cursor_;
- if (yych == '/') goto yy1110;
+ if (yych == '/') goto yy1116;
goto yy87;
-yy1078:
+yy1080:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 425 "src/wast-lexer.cc"
+#line 428 "src/wast-lexer.cc"
{ RETURN_OPCODE(Load, I64Load16S); }
-#line 6342 "src/prebuilt/wast-lexer-gen.cc"
-yy1080:
+#line 6357 "src/prebuilt/wast-lexer-gen.cc"
+yy1082:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 427 "src/wast-lexer.cc"
+#line 430 "src/wast-lexer.cc"
{ RETURN_OPCODE(Load, I64Load16U); }
-#line 6350 "src/prebuilt/wast-lexer-gen.cc"
-yy1082:
+#line 6365 "src/prebuilt/wast-lexer-gen.cc"
+yy1084:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 428 "src/wast-lexer.cc"
+#line 431 "src/wast-lexer.cc"
{ RETURN_OPCODE(Load, I64Load32S); }
-#line 6358 "src/prebuilt/wast-lexer-gen.cc"
-yy1084:
+#line 6373 "src/prebuilt/wast-lexer-gen.cc"
+yy1086:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 429 "src/wast-lexer.cc"
+#line 432 "src/wast-lexer.cc"
{ RETURN_OPCODE(Load, I64Load32U); }
-#line 6366 "src/prebuilt/wast-lexer-gen.cc"
-yy1086:
- yych = *++cursor_;
- if (yych == 'r') goto yy1111;
- goto yy87;
-yy1087:
- yych = *++cursor_;
- if (yych == 'f') goto yy1112;
- goto yy87;
+#line 6381 "src/prebuilt/wast-lexer-gen.cc"
yy1088:
yych = *++cursor_;
- if (yych == 'f') goto yy1113;
+ if (yych == 'r') goto yy1117;
goto yy87;
yy1089:
yych = *++cursor_;
- if (yych == 't') goto yy1114;
+ if (yych == 'f') goto yy1118;
goto yy87;
yy1090:
yych = *++cursor_;
- if (yych == 'd') goto yy1115;
+ if (yych == 's') goto yy1119;
goto yy87;
yy1091:
yych = *++cursor_;
- if (yych == 'm') goto yy1117;
+ if (yych == 'f') goto yy1120;
goto yy87;
yy1092:
+ yych = *++cursor_;
+ if (yych == 's') goto yy1121;
+ goto yy87;
+yy1093:
+ yych = *++cursor_;
+ if (yych == 't') goto yy1122;
+ goto yy87;
+yy1094:
+ yych = *++cursor_;
+ if (yych == 'd') goto yy1123;
+ goto yy87;
+yy1095:
+ yych = *++cursor_;
+ if (yych == 'm') goto yy1125;
+ goto yy87;
+yy1096:
++cursor_;
if ((yych = *cursor_) <= ')') {
if (yych <= '!') {
if (yych >= '!') goto yy86;
} else {
- if (yych <= '"') goto yy1093;
+ if (yych <= '"') goto yy1097;
if (yych <= '\'') goto yy86;
}
} else {
if (yych <= '^') {
if (yych != ';') goto yy86;
} else {
- if (yych <= '_') goto yy1118;
+ if (yych <= '_') goto yy1126;
if (yych <= '~') goto yy86;
}
}
-yy1093:
-#line 592 "src/wast-lexer.cc"
+yy1097:
+#line 603 "src/wast-lexer.cc"
{ RETURN(AssertReturn); }
-#line 6411 "src/prebuilt/wast-lexer-gen.cc"
-yy1094:
+#line 6434 "src/prebuilt/wast-lexer-gen.cc"
+yy1098:
yych = *++cursor_;
- if (yych == 'a') goto yy1119;
+ if (yych == 'a') goto yy1127;
goto yy87;
-yy1095:
+yy1099:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 403 "src/wast-lexer.cc"
- { RETURN(CallIndirect); }
-#line 6423 "src/prebuilt/wast-lexer-gen.cc"
-yy1097:
- yych = *++cursor_;
- if (yych == 'y') goto yy1120;
- goto yy87;
-yy1098:
- yych = *++cursor_;
- if (yych == '/') goto yy1122;
- goto yy87;
-yy1099:
- yych = *++cursor_;
- if (yych == '/') goto yy1123;
- goto yy87;
-yy1100:
- yych = *++cursor_;
- if (yych == '4') goto yy1124;
- goto yy87;
+#line 406 "src/wast-lexer.cc"
+ { RETURN_OPCODE0(CallIndirect); }
+#line 6446 "src/prebuilt/wast-lexer-gen.cc"
yy1101:
yych = *++cursor_;
- if (yych == 'e') goto yy1126;
+ if (yych == 'y') goto yy1128;
goto yy87;
yy1102:
yych = *++cursor_;
- if (yych == '/') goto yy1127;
+ if (yych == '/') goto yy1130;
goto yy87;
yy1103:
yych = *++cursor_;
- if (yych == '/') goto yy1128;
+ if (yych == '/') goto yy1131;
goto yy87;
yy1104:
yych = *++cursor_;
- if (yych == '3') goto yy1129;
+ if (yych == '4') goto yy1132;
goto yy87;
yy1105:
yych = *++cursor_;
- if (yych == 'e') goto yy1130;
+ if (yych == 'e') goto yy1134;
goto yy87;
yy1106:
yych = *++cursor_;
- if (yych == 'e') goto yy1131;
+ if (yych == '/') goto yy1135;
goto yy87;
yy1107:
yych = *++cursor_;
- if (yych == '3') goto yy1132;
- if (yych == '6') goto yy1133;
+ if (yych == '/') goto yy1136;
goto yy87;
yy1108:
yych = *++cursor_;
- if (yych == '3') goto yy1134;
- if (yych == '6') goto yy1135;
+ if (yych == '3') goto yy1137;
goto yy87;
yy1109:
yych = *++cursor_;
- if (yych == 'i') goto yy1136;
+ if (yych == 'e') goto yy1138;
goto yy87;
yy1110:
yych = *++cursor_;
- if (yych == 'i') goto yy1137;
+ if (yych == 'e') goto yy1139;
goto yy87;
yy1111:
yych = *++cursor_;
- if (yych == 'e') goto yy1138;
+ if (yych == '3') goto yy1140;
+ if (yych == '6') goto yy1141;
goto yy87;
yy1112:
yych = *++cursor_;
- if (yych == '3') goto yy1139;
- if (yych == '6') goto yy1140;
+ if (yych == 'a') goto yy1142;
goto yy87;
yy1113:
yych = *++cursor_;
- if (yych == '3') goto yy1141;
- if (yych == '6') goto yy1142;
+ if (yych == '3') goto yy1143;
+ if (yych == '6') goto yy1144;
goto yy87;
yy1114:
yych = *++cursor_;
- if (yych == 'i') goto yy1143;
+ if (yych == 'a') goto yy1145;
goto yy87;
yy1115:
- ++cursor_;
- if (yybm[0+(yych = *cursor_)] & 8) {
- goto yy86;
- }
-#line 590 "src/wast-lexer.cc"
- { RETURN(AssertInvalid); }
-#line 6507 "src/prebuilt/wast-lexer-gen.cc"
+ yych = *++cursor_;
+ if (yych == 'i') goto yy1146;
+ goto yy87;
+yy1116:
+ yych = *++cursor_;
+ if (yych == 'i') goto yy1147;
+ goto yy87;
yy1117:
yych = *++cursor_;
- if (yych == 'e') goto yy1144;
+ if (yych == 'e') goto yy1148;
goto yy87;
yy1118:
yych = *++cursor_;
- if (yych == 'a') goto yy1145;
- if (yych == 'c') goto yy1146;
+ if (yych == '3') goto yy1149;
+ if (yych == '6') goto yy1150;
goto yy87;
yy1119:
yych = *++cursor_;
- if (yych == 'b') goto yy1147;
+ if (yych == 'a') goto yy1151;
goto yy87;
yy1120:
- ++cursor_;
- if (yybm[0+(yych = *cursor_)] & 8) {
- goto yy86;
- }
-#line 566 "src/wast-lexer.cc"
- { RETURN(CurrentMemory); }
-#line 6528 "src/prebuilt/wast-lexer-gen.cc"
-yy1122:
yych = *++cursor_;
- if (yych == 'i') goto yy1148;
+ if (yych == '3') goto yy1152;
+ if (yych == '6') goto yy1153;
goto yy87;
-yy1123:
+yy1121:
+ yych = *++cursor_;
+ if (yych == 'a') goto yy1154;
+ goto yy87;
+yy1122:
yych = *++cursor_;
- if (yych == 'i') goto yy1149;
+ if (yych == 'i') goto yy1155;
goto yy87;
-yy1124:
+yy1123:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 559 "src/wast-lexer.cc"
- { RETURN_OPCODE(Convert, F32DemoteF64); }
-#line 6544 "src/prebuilt/wast-lexer-gen.cc"
+#line 601 "src/wast-lexer.cc"
+ { RETURN(AssertInvalid); }
+#line 6546 "src/prebuilt/wast-lexer-gen.cc"
+yy1125:
+ yych = *++cursor_;
+ if (yych == 'e') goto yy1156;
+ goto yy87;
yy1126:
yych = *++cursor_;
- if (yych == 't') goto yy1150;
+ if (yych == 'a') goto yy1157;
+ if (yych == 'c') goto yy1158;
goto yy87;
yy1127:
yych = *++cursor_;
- if (yych == 'i') goto yy1151;
+ if (yych == 'b') goto yy1159;
goto yy87;
yy1128:
- yych = *++cursor_;
- if (yych == 'i') goto yy1152;
- goto yy87;
-yy1129:
- yych = *++cursor_;
- if (yych == '2') goto yy1153;
- goto yy87;
+ ++cursor_;
+ if (yybm[0+(yych = *cursor_)] & 8) {
+ goto yy86;
+ }
+#line 577 "src/wast-lexer.cc"
+ { RETURN_OPCODE0(CurrentMemory); }
+#line 6567 "src/prebuilt/wast-lexer-gen.cc"
yy1130:
yych = *++cursor_;
- if (yych == 't') goto yy1155;
+ if (yych == 'i') goto yy1160;
goto yy87;
yy1131:
yych = *++cursor_;
- if (yych == 't') goto yy1156;
+ if (yych == 'i') goto yy1161;
goto yy87;
yy1132:
- yych = *++cursor_;
- if (yych == '2') goto yy1157;
- goto yy87;
-yy1133:
- yych = *++cursor_;
- if (yych == '4') goto yy1159;
- goto yy87;
+ ++cursor_;
+ if (yybm[0+(yych = *cursor_)] & 8) {
+ goto yy86;
+ }
+#line 570 "src/wast-lexer.cc"
+ { RETURN_OPCODE(Convert, F32DemoteF64); }
+#line 6583 "src/prebuilt/wast-lexer-gen.cc"
yy1134:
yych = *++cursor_;
- if (yych == '2') goto yy1161;
+ if (yych == 't') goto yy1162;
goto yy87;
yy1135:
yych = *++cursor_;
- if (yych == '4') goto yy1163;
+ if (yych == 'i') goto yy1163;
goto yy87;
yy1136:
yych = *++cursor_;
- if (yych == '3') goto yy1165;
+ if (yych == 'i') goto yy1164;
goto yy87;
yy1137:
yych = *++cursor_;
- if (yych == '3') goto yy1166;
+ if (yych == '2') goto yy1165;
goto yy87;
yy1138:
yych = *++cursor_;
@@ -6595,491 +6602,687 @@ yy1138:
goto yy87;
yy1139:
yych = *++cursor_;
- if (yych == '2') goto yy1168;
+ if (yych == 't') goto yy1168;
goto yy87;
yy1140:
yych = *++cursor_;
- if (yych == '4') goto yy1170;
+ if (yych == '2') goto yy1169;
goto yy87;
yy1141:
yych = *++cursor_;
- if (yych == '2') goto yy1172;
+ if (yych == '4') goto yy1171;
goto yy87;
yy1142:
yych = *++cursor_;
- if (yych == '4') goto yy1174;
+ if (yych == 't') goto yy1173;
goto yy87;
yy1143:
yych = *++cursor_;
- if (yych == 'o') goto yy1176;
+ if (yych == '2') goto yy1174;
goto yy87;
yy1144:
yych = *++cursor_;
- if (yych == 'd') goto yy1177;
+ if (yych == '4') goto yy1176;
goto yy87;
yy1145:
yych = *++cursor_;
- if (yych == 'r') goto yy1179;
+ if (yych == 't') goto yy1178;
goto yy87;
yy1146:
yych = *++cursor_;
- if (yych == 'a') goto yy1180;
+ if (yych == '3') goto yy1179;
goto yy87;
yy1147:
yych = *++cursor_;
- if (yych == 'l') goto yy1181;
+ if (yych == '3') goto yy1180;
goto yy87;
yy1148:
yych = *++cursor_;
- if (yych == '3') goto yy1182;
- if (yych == '6') goto yy1183;
+ if (yych == 't') goto yy1181;
goto yy87;
yy1149:
yych = *++cursor_;
- if (yych == '3') goto yy1184;
- if (yych == '6') goto yy1185;
+ if (yych == '2') goto yy1182;
goto yy87;
yy1150:
yych = *++cursor_;
- if (yych == '/') goto yy1186;
+ if (yych == '4') goto yy1184;
goto yy87;
yy1151:
yych = *++cursor_;
- if (yych == '3') goto yy1187;
- if (yych == '6') goto yy1188;
+ if (yych == 't') goto yy1186;
goto yy87;
yy1152:
yych = *++cursor_;
- if (yych == '3') goto yy1189;
- if (yych == '6') goto yy1190;
+ if (yych == '2') goto yy1187;
goto yy87;
yy1153:
+ yych = *++cursor_;
+ if (yych == '4') goto yy1189;
+ goto yy87;
+yy1154:
+ yych = *++cursor_;
+ if (yych == 't') goto yy1191;
+ goto yy87;
+yy1155:
+ yych = *++cursor_;
+ if (yych == 'o') goto yy1192;
+ goto yy87;
+yy1156:
+ yych = *++cursor_;
+ if (yych == 'd') goto yy1193;
+ goto yy87;
+yy1157:
+ yych = *++cursor_;
+ if (yych == 'r') goto yy1195;
+ goto yy87;
+yy1158:
+ yych = *++cursor_;
+ if (yych == 'a') goto yy1196;
+ goto yy87;
+yy1159:
+ yych = *++cursor_;
+ if (yych == 'l') goto yy1197;
+ goto yy87;
+yy1160:
+ yych = *++cursor_;
+ if (yych == '3') goto yy1198;
+ if (yych == '6') goto yy1199;
+ goto yy87;
+yy1161:
+ yych = *++cursor_;
+ if (yych == '3') goto yy1200;
+ if (yych == '6') goto yy1201;
+ goto yy87;
+yy1162:
+ yych = *++cursor_;
+ if (yych == '/') goto yy1202;
+ goto yy87;
+yy1163:
+ yych = *++cursor_;
+ if (yych == '3') goto yy1203;
+ if (yych == '6') goto yy1204;
+ goto yy87;
+yy1164:
+ yych = *++cursor_;
+ if (yych == '3') goto yy1205;
+ if (yych == '6') goto yy1206;
+ goto yy87;
+yy1165:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 558 "src/wast-lexer.cc"
+#line 569 "src/wast-lexer.cc"
{ RETURN_OPCODE(Convert, F64PromoteF32); }
-#line 6664 "src/prebuilt/wast-lexer-gen.cc"
-yy1155:
+#line 6719 "src/prebuilt/wast-lexer-gen.cc"
+yy1167:
yych = *++cursor_;
- if (yych == '/') goto yy1191;
+ if (yych == '/') goto yy1207;
goto yy87;
-yy1156:
+yy1168:
yych = *++cursor_;
- if (yych == '/') goto yy1192;
+ if (yych == '/') goto yy1208;
goto yy87;
-yy1157:
+yy1169:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 542 "src/wast-lexer.cc"
+#line 545 "src/wast-lexer.cc"
{ RETURN_OPCODE(Convert, I32TruncSF32); }
-#line 6680 "src/prebuilt/wast-lexer-gen.cc"
-yy1159:
+#line 6735 "src/prebuilt/wast-lexer-gen.cc"
+yy1171:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 544 "src/wast-lexer.cc"
+#line 547 "src/wast-lexer.cc"
{ RETURN_OPCODE(Convert, I32TruncSF64); }
-#line 6688 "src/prebuilt/wast-lexer-gen.cc"
-yy1161:
+#line 6743 "src/prebuilt/wast-lexer-gen.cc"
+yy1173:
+ yych = *++cursor_;
+ if (yych == '/') goto yy1209;
+ goto yy87;
+yy1174:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 546 "src/wast-lexer.cc"
+#line 549 "src/wast-lexer.cc"
{ RETURN_OPCODE(Convert, I32TruncUF32); }
-#line 6696 "src/prebuilt/wast-lexer-gen.cc"
-yy1163:
+#line 6755 "src/prebuilt/wast-lexer-gen.cc"
+yy1176:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 548 "src/wast-lexer.cc"
+#line 551 "src/wast-lexer.cc"
{ RETURN_OPCODE(Convert, I32TruncUF64); }
-#line 6704 "src/prebuilt/wast-lexer-gen.cc"
-yy1165:
+#line 6763 "src/prebuilt/wast-lexer-gen.cc"
+yy1178:
+ yych = *++cursor_;
+ if (yych == '/') goto yy1210;
+ goto yy87;
+yy1179:
yych = *++cursor_;
- if (yych == '2') goto yy1193;
+ if (yych == '2') goto yy1211;
goto yy87;
-yy1166:
+yy1180:
yych = *++cursor_;
- if (yych == '2') goto yy1195;
+ if (yych == '2') goto yy1213;
goto yy87;
-yy1167:
+yy1181:
yych = *++cursor_;
- if (yych == '/') goto yy1197;
+ if (yych == '/') goto yy1215;
goto yy87;
-yy1168:
+yy1182:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 543 "src/wast-lexer.cc"
+#line 546 "src/wast-lexer.cc"
{ RETURN_OPCODE(Convert, I64TruncSF32); }
-#line 6724 "src/prebuilt/wast-lexer-gen.cc"
-yy1170:
+#line 6787 "src/prebuilt/wast-lexer-gen.cc"
+yy1184:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 545 "src/wast-lexer.cc"
+#line 548 "src/wast-lexer.cc"
{ RETURN_OPCODE(Convert, I64TruncSF64); }
-#line 6732 "src/prebuilt/wast-lexer-gen.cc"
-yy1172:
+#line 6795 "src/prebuilt/wast-lexer-gen.cc"
+yy1186:
+ yych = *++cursor_;
+ if (yych == '/') goto yy1216;
+ goto yy87;
+yy1187:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 547 "src/wast-lexer.cc"
+#line 550 "src/wast-lexer.cc"
{ RETURN_OPCODE(Convert, I64TruncUF32); }
-#line 6740 "src/prebuilt/wast-lexer-gen.cc"
-yy1174:
+#line 6807 "src/prebuilt/wast-lexer-gen.cc"
+yy1189:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 549 "src/wast-lexer.cc"
+#line 552 "src/wast-lexer.cc"
{ RETURN_OPCODE(Convert, I64TruncUF64); }
-#line 6748 "src/prebuilt/wast-lexer-gen.cc"
-yy1176:
+#line 6815 "src/prebuilt/wast-lexer-gen.cc"
+yy1191:
yych = *++cursor_;
- if (yych == 'n') goto yy1198;
+ if (yych == '/') goto yy1217;
goto yy87;
-yy1177:
+yy1192:
+ yych = *++cursor_;
+ if (yych == 'n') goto yy1218;
+ goto yy87;
+yy1193:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 589 "src/wast-lexer.cc"
+#line 600 "src/wast-lexer.cc"
{ RETURN(AssertMalformed); }
-#line 6760 "src/prebuilt/wast-lexer-gen.cc"
-yy1179:
+#line 6831 "src/prebuilt/wast-lexer-gen.cc"
+yy1195:
yych = *++cursor_;
- if (yych == 'i') goto yy1200;
+ if (yych == 'i') goto yy1220;
goto yy87;
-yy1180:
+yy1196:
yych = *++cursor_;
- if (yych == 'n') goto yy1201;
+ if (yych == 'n') goto yy1221;
goto yy87;
-yy1181:
+yy1197:
yych = *++cursor_;
- if (yych == 'e') goto yy1202;
+ if (yych == 'e') goto yy1222;
goto yy87;
-yy1182:
+yy1198:
yych = *++cursor_;
- if (yych == '2') goto yy1204;
+ if (yych == '2') goto yy1224;
goto yy87;
-yy1183:
+yy1199:
yych = *++cursor_;
- if (yych == '4') goto yy1206;
+ if (yych == '4') goto yy1226;
goto yy87;
-yy1184:
+yy1200:
yych = *++cursor_;
- if (yych == '2') goto yy1208;
+ if (yych == '2') goto yy1228;
goto yy87;
-yy1185:
+yy1201:
yych = *++cursor_;
- if (yych == '4') goto yy1210;
+ if (yych == '4') goto yy1230;
goto yy87;
-yy1186:
+yy1202:
yych = *++cursor_;
- if (yych == 'i') goto yy1212;
+ if (yych == 'i') goto yy1232;
goto yy87;
-yy1187:
+yy1203:
yych = *++cursor_;
- if (yych == '2') goto yy1213;
+ if (yych == '2') goto yy1233;
goto yy87;
-yy1188:
+yy1204:
yych = *++cursor_;
- if (yych == '4') goto yy1215;
+ if (yych == '4') goto yy1235;
goto yy87;
-yy1189:
+yy1205:
yych = *++cursor_;
- if (yych == '2') goto yy1217;
+ if (yych == '2') goto yy1237;
goto yy87;
-yy1190:
+yy1206:
yych = *++cursor_;
- if (yych == '4') goto yy1219;
+ if (yych == '4') goto yy1239;
goto yy87;
-yy1191:
+yy1207:
yych = *++cursor_;
- if (yych == 'i') goto yy1221;
+ if (yych == 'i') goto yy1241;
goto yy87;
-yy1192:
+yy1208:
yych = *++cursor_;
- if (yych == 'f') goto yy1222;
+ if (yych == 'f') goto yy1242;
goto yy87;
-yy1193:
+yy1209:
+ yych = *++cursor_;
+ if (yych == 'f') goto yy1243;
+ goto yy87;
+yy1210:
+ yych = *++cursor_;
+ if (yych == 'f') goto yy1244;
+ goto yy87;
+yy1211:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 539 "src/wast-lexer.cc"
+#line 542 "src/wast-lexer.cc"
{ RETURN_OPCODE(Convert, I64ExtendSI32); }
-#line 6824 "src/prebuilt/wast-lexer-gen.cc"
-yy1195:
+#line 6903 "src/prebuilt/wast-lexer-gen.cc"
+yy1213:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 540 "src/wast-lexer.cc"
+#line 543 "src/wast-lexer.cc"
{ RETURN_OPCODE(Convert, I64ExtendUI32); }
-#line 6832 "src/prebuilt/wast-lexer-gen.cc"
-yy1197:
+#line 6911 "src/prebuilt/wast-lexer-gen.cc"
+yy1215:
yych = *++cursor_;
- if (yych == 'f') goto yy1223;
+ if (yych == 'f') goto yy1245;
goto yy87;
-yy1198:
+yy1216:
+ yych = *++cursor_;
+ if (yych == 'f') goto yy1246;
+ goto yy87;
+yy1217:
+ yych = *++cursor_;
+ if (yych == 'f') goto yy1247;
+ goto yy87;
+yy1218:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 596 "src/wast-lexer.cc"
+#line 607 "src/wast-lexer.cc"
{ RETURN(AssertExhaustion); }
-#line 6844 "src/prebuilt/wast-lexer-gen.cc"
-yy1200:
+#line 6931 "src/prebuilt/wast-lexer-gen.cc"
+yy1220:
yych = *++cursor_;
- if (yych == 't') goto yy1224;
+ if (yych == 't') goto yy1248;
goto yy87;
-yy1201:
+yy1221:
yych = *++cursor_;
- if (yych == 'o') goto yy1225;
+ if (yych == 'o') goto yy1249;
goto yy87;
-yy1202:
+yy1222:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 591 "src/wast-lexer.cc"
+#line 602 "src/wast-lexer.cc"
{ RETURN(AssertUnlinkable); }
-#line 6860 "src/prebuilt/wast-lexer-gen.cc"
-yy1204:
+#line 6947 "src/prebuilt/wast-lexer-gen.cc"
+yy1224:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 550 "src/wast-lexer.cc"
+#line 561 "src/wast-lexer.cc"
{ RETURN_OPCODE(Convert, F32ConvertSI32); }
-#line 6868 "src/prebuilt/wast-lexer-gen.cc"
-yy1206:
+#line 6955 "src/prebuilt/wast-lexer-gen.cc"
+yy1226:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 552 "src/wast-lexer.cc"
+#line 563 "src/wast-lexer.cc"
{ RETURN_OPCODE(Convert, F32ConvertSI64); }
-#line 6876 "src/prebuilt/wast-lexer-gen.cc"
-yy1208:
+#line 6963 "src/prebuilt/wast-lexer-gen.cc"
+yy1228:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 554 "src/wast-lexer.cc"
+#line 565 "src/wast-lexer.cc"
{ RETURN_OPCODE(Convert, F32ConvertUI32); }
-#line 6884 "src/prebuilt/wast-lexer-gen.cc"
-yy1210:
+#line 6971 "src/prebuilt/wast-lexer-gen.cc"
+yy1230:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 556 "src/wast-lexer.cc"
+#line 567 "src/wast-lexer.cc"
{ RETURN_OPCODE(Convert, F32ConvertUI64); }
-#line 6892 "src/prebuilt/wast-lexer-gen.cc"
-yy1212:
+#line 6979 "src/prebuilt/wast-lexer-gen.cc"
+yy1232:
yych = *++cursor_;
- if (yych == '3') goto yy1226;
+ if (yych == '3') goto yy1250;
goto yy87;
-yy1213:
+yy1233:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 551 "src/wast-lexer.cc"
+#line 562 "src/wast-lexer.cc"
{ RETURN_OPCODE(Convert, F64ConvertSI32); }
-#line 6904 "src/prebuilt/wast-lexer-gen.cc"
-yy1215:
+#line 6991 "src/prebuilt/wast-lexer-gen.cc"
+yy1235:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 553 "src/wast-lexer.cc"
+#line 564 "src/wast-lexer.cc"
{ RETURN_OPCODE(Convert, F64ConvertSI64); }
-#line 6912 "src/prebuilt/wast-lexer-gen.cc"
-yy1217:
+#line 6999 "src/prebuilt/wast-lexer-gen.cc"
+yy1237:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 555 "src/wast-lexer.cc"
+#line 566 "src/wast-lexer.cc"
{ RETURN_OPCODE(Convert, F64ConvertUI32); }
-#line 6920 "src/prebuilt/wast-lexer-gen.cc"
-yy1219:
+#line 7007 "src/prebuilt/wast-lexer-gen.cc"
+yy1239:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 557 "src/wast-lexer.cc"
+#line 568 "src/wast-lexer.cc"
{ RETURN_OPCODE(Convert, F64ConvertUI64); }
-#line 6928 "src/prebuilt/wast-lexer-gen.cc"
-yy1221:
+#line 7015 "src/prebuilt/wast-lexer-gen.cc"
+yy1241:
yych = *++cursor_;
- if (yych == '6') goto yy1227;
+ if (yych == '6') goto yy1251;
goto yy87;
-yy1222:
+yy1242:
yych = *++cursor_;
- if (yych == '3') goto yy1228;
+ if (yych == '3') goto yy1252;
goto yy87;
-yy1223:
+yy1243:
yych = *++cursor_;
- if (yych == '6') goto yy1229;
+ if (yych == '3') goto yy1253;
+ if (yych == '6') goto yy1254;
goto yy87;
-yy1224:
+yy1244:
yych = *++cursor_;
- if (yych == 'h') goto yy1230;
+ if (yych == '3') goto yy1255;
+ if (yych == '6') goto yy1256;
goto yy87;
-yy1225:
+yy1245:
yych = *++cursor_;
- if (yych == 'n') goto yy1231;
+ if (yych == '6') goto yy1257;
goto yy87;
-yy1226:
+yy1246:
yych = *++cursor_;
- if (yych == '2') goto yy1232;
+ if (yych == '3') goto yy1258;
+ if (yych == '6') goto yy1259;
goto yy87;
-yy1227:
+yy1247:
yych = *++cursor_;
- if (yych == '4') goto yy1234;
+ if (yych == '3') goto yy1260;
+ if (yych == '6') goto yy1261;
goto yy87;
-yy1228:
+yy1248:
yych = *++cursor_;
- if (yych == '2') goto yy1236;
+ if (yych == 'h') goto yy1262;
goto yy87;
-yy1229:
+yy1249:
yych = *++cursor_;
- if (yych == '4') goto yy1238;
+ if (yych == 'n') goto yy1263;
goto yy87;
-yy1230:
+yy1250:
yych = *++cursor_;
- if (yych == 'm') goto yy1240;
+ if (yych == '2') goto yy1264;
goto yy87;
-yy1231:
+yy1251:
yych = *++cursor_;
- if (yych == 'i') goto yy1241;
+ if (yych == '4') goto yy1266;
goto yy87;
-yy1232:
+yy1252:
+ yych = *++cursor_;
+ if (yych == '2') goto yy1268;
+ goto yy87;
+yy1253:
+ yych = *++cursor_;
+ if (yych == '2') goto yy1270;
+ goto yy87;
+yy1254:
+ yych = *++cursor_;
+ if (yych == '4') goto yy1272;
+ goto yy87;
+yy1255:
+ yych = *++cursor_;
+ if (yych == '2') goto yy1274;
+ goto yy87;
+yy1256:
+ yych = *++cursor_;
+ if (yych == '4') goto yy1276;
+ goto yy87;
+yy1257:
+ yych = *++cursor_;
+ if (yych == '4') goto yy1278;
+ goto yy87;
+yy1258:
+ yych = *++cursor_;
+ if (yych == '2') goto yy1280;
+ goto yy87;
+yy1259:
+ yych = *++cursor_;
+ if (yych == '4') goto yy1282;
+ goto yy87;
+yy1260:
+ yych = *++cursor_;
+ if (yych == '2') goto yy1284;
+ goto yy87;
+yy1261:
+ yych = *++cursor_;
+ if (yych == '4') goto yy1286;
+ goto yy87;
+yy1262:
+ yych = *++cursor_;
+ if (yych == 'm') goto yy1288;
+ goto yy87;
+yy1263:
+ yych = *++cursor_;
+ if (yych == 'i') goto yy1289;
+ goto yy87;
+yy1264:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 560 "src/wast-lexer.cc"
+#line 571 "src/wast-lexer.cc"
{ RETURN_OPCODE(Convert, F32ReinterpretI32); }
-#line 6980 "src/prebuilt/wast-lexer-gen.cc"
-yy1234:
+#line 7119 "src/prebuilt/wast-lexer-gen.cc"
+yy1266:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 562 "src/wast-lexer.cc"
+#line 573 "src/wast-lexer.cc"
{ RETURN_OPCODE(Convert, F64ReinterpretI64); }
-#line 6988 "src/prebuilt/wast-lexer-gen.cc"
-yy1236:
+#line 7127 "src/prebuilt/wast-lexer-gen.cc"
+yy1268:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 561 "src/wast-lexer.cc"
+#line 572 "src/wast-lexer.cc"
{ RETURN_OPCODE(Convert, I32ReinterpretF32); }
-#line 6996 "src/prebuilt/wast-lexer-gen.cc"
-yy1238:
+#line 7135 "src/prebuilt/wast-lexer-gen.cc"
+yy1270:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 563 "src/wast-lexer.cc"
+#line 553 "src/wast-lexer.cc"
+ { RETURN_OPCODE(Convert, I32TruncSSatF32); }
+#line 7143 "src/prebuilt/wast-lexer-gen.cc"
+yy1272:
+ ++cursor_;
+ if (yybm[0+(yych = *cursor_)] & 8) {
+ goto yy86;
+ }
+#line 555 "src/wast-lexer.cc"
+ { RETURN_OPCODE(Convert, I32TruncSSatF64); }
+#line 7151 "src/prebuilt/wast-lexer-gen.cc"
+yy1274:
+ ++cursor_;
+ if (yybm[0+(yych = *cursor_)] & 8) {
+ goto yy86;
+ }
+#line 557 "src/wast-lexer.cc"
+ { RETURN_OPCODE(Convert, I32TruncUSatF32); }
+#line 7159 "src/prebuilt/wast-lexer-gen.cc"
+yy1276:
+ ++cursor_;
+ if (yybm[0+(yych = *cursor_)] & 8) {
+ goto yy86;
+ }
+#line 559 "src/wast-lexer.cc"
+ { RETURN_OPCODE(Convert, I32TruncUSatF64); }
+#line 7167 "src/prebuilt/wast-lexer-gen.cc"
+yy1278:
+ ++cursor_;
+ if (yybm[0+(yych = *cursor_)] & 8) {
+ goto yy86;
+ }
+#line 574 "src/wast-lexer.cc"
{ RETURN_OPCODE(Convert, I64ReinterpretF64); }
-#line 7004 "src/prebuilt/wast-lexer-gen.cc"
-yy1240:
+#line 7175 "src/prebuilt/wast-lexer-gen.cc"
+yy1280:
+ ++cursor_;
+ if (yybm[0+(yych = *cursor_)] & 8) {
+ goto yy86;
+ }
+#line 554 "src/wast-lexer.cc"
+ { RETURN_OPCODE(Convert, I64TruncSSatF32); }
+#line 7183 "src/prebuilt/wast-lexer-gen.cc"
+yy1282:
+ ++cursor_;
+ if (yybm[0+(yych = *cursor_)] & 8) {
+ goto yy86;
+ }
+#line 556 "src/wast-lexer.cc"
+ { RETURN_OPCODE(Convert, I64TruncSSatF64); }
+#line 7191 "src/prebuilt/wast-lexer-gen.cc"
+yy1284:
+ ++cursor_;
+ if (yybm[0+(yych = *cursor_)] & 8) {
+ goto yy86;
+ }
+#line 558 "src/wast-lexer.cc"
+ { RETURN_OPCODE(Convert, I64TruncUSatF32); }
+#line 7199 "src/prebuilt/wast-lexer-gen.cc"
+yy1286:
+ ++cursor_;
+ if (yybm[0+(yych = *cursor_)] & 8) {
+ goto yy86;
+ }
+#line 560 "src/wast-lexer.cc"
+ { RETURN_OPCODE(Convert, I64TruncUSatF64); }
+#line 7207 "src/prebuilt/wast-lexer-gen.cc"
+yy1288:
yych = *++cursor_;
- if (yych == 'e') goto yy1242;
+ if (yych == 'e') goto yy1290;
goto yy87;
-yy1241:
+yy1289:
yych = *++cursor_;
- if (yych == 'c') goto yy1243;
+ if (yych == 'c') goto yy1291;
goto yy87;
-yy1242:
+yy1290:
yych = *++cursor_;
- if (yych == 't') goto yy1244;
+ if (yych == 't') goto yy1292;
goto yy87;
-yy1243:
+yy1291:
yych = *++cursor_;
- if (yych == 'a') goto yy1245;
+ if (yych == 'a') goto yy1293;
goto yy87;
-yy1244:
+yy1292:
yych = *++cursor_;
- if (yych == 'i') goto yy1246;
+ if (yych == 'i') goto yy1294;
goto yy87;
-yy1245:
+yy1293:
yych = *++cursor_;
- if (yych == 'l') goto yy1247;
+ if (yych == 'l') goto yy1295;
goto yy87;
-yy1246:
+yy1294:
yych = *++cursor_;
- if (yych == 'c') goto yy1248;
+ if (yych == 'c') goto yy1296;
goto yy87;
-yy1247:
+yy1295:
yych = *++cursor_;
- if (yych == '_') goto yy1249;
+ if (yych == '_') goto yy1297;
goto yy87;
-yy1248:
+yy1296:
yych = *++cursor_;
- if (yych == '_') goto yy1250;
+ if (yych == '_') goto yy1298;
goto yy87;
-yy1249:
+yy1297:
yych = *++cursor_;
- if (yych == 'n') goto yy1251;
+ if (yych == 'n') goto yy1299;
goto yy87;
-yy1250:
+yy1298:
yych = *++cursor_;
- if (yych == 'n') goto yy1252;
+ if (yych == 'n') goto yy1300;
goto yy87;
-yy1251:
+yy1299:
yych = *++cursor_;
- if (yych == 'a') goto yy1253;
+ if (yych == 'a') goto yy1301;
goto yy87;
-yy1252:
+yy1300:
yych = *++cursor_;
- if (yych == 'a') goto yy1254;
+ if (yych == 'a') goto yy1302;
goto yy87;
-yy1253:
+yy1301:
yych = *++cursor_;
- if (yych == 'n') goto yy1255;
+ if (yych == 'n') goto yy1303;
goto yy87;
-yy1254:
+yy1302:
yych = *++cursor_;
- if (yych == 'n') goto yy1257;
+ if (yych == 'n') goto yy1305;
goto yy87;
-yy1255:
+yy1303:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 593 "src/wast-lexer.cc"
+#line 604 "src/wast-lexer.cc"
{ RETURN(AssertReturnCanonicalNan); }
-#line 7072 "src/prebuilt/wast-lexer-gen.cc"
-yy1257:
+#line 7275 "src/prebuilt/wast-lexer-gen.cc"
+yy1305:
++cursor_;
if (yybm[0+(yych = *cursor_)] & 8) {
goto yy86;
}
-#line 594 "src/wast-lexer.cc"
+#line 605 "src/wast-lexer.cc"
{ RETURN(AssertReturnArithmeticNan); }
-#line 7080 "src/prebuilt/wast-lexer-gen.cc"
+#line 7283 "src/prebuilt/wast-lexer-gen.cc"
}
}
-#line 620 "src/wast-lexer.cc"
+#line 631 "src/wast-lexer.cc"
}
}
diff --git a/src/tools/wasm-interp.cc b/src/tools/wasm-interp.cc
index 234f3c0a..df9f8e4c 100644
--- a/src/tools/wasm-interp.cc
+++ b/src/tools/wasm-interp.cc
@@ -26,6 +26,7 @@
#include "binary-reader-interpreter.h"
#include "binary-reader.h"
#include "error-handler.h"
+#include "feature.h"
#include "interpreter.h"
#include "literal.h"
#include "option-parser.h"
@@ -42,11 +43,11 @@ static const char* s_trap_strings[] = {FOREACH_INTERPRETER_RESULT(V)};
static int s_verbose;
static const char* s_infile;
-static ReadBinaryOptions s_read_binary_options;
static Thread::Options s_thread_options;
static bool s_trace;
static bool s_spec;
static bool s_run_all_exports;
+static Features s_features;
static std::unique_ptr<FileStream> s_log_stream;
static std::unique_ptr<FileStream> s_stdout_stream;
@@ -84,9 +85,9 @@ static void ParseOptions(int argc, char** argv) {
parser.AddOption('v', "verbose", "Use multiple times for more info", []() {
s_verbose++;
s_log_stream = FileStream::CreateStdout();
- s_read_binary_options.log_stream = s_log_stream.get();
});
parser.AddHelpOption();
+ s_features.AddOptions(&parser);
parser.AddOption('V', "value-stack-size", "SIZE",
"Size in elements of the value stack",
[](const std::string& argument) {
@@ -302,9 +303,10 @@ static wabt::Result ReadModule(const char* module_filename,
result = ReadFile(module_filename, &file_data);
if (Succeeded(result)) {
+ ReadBinaryOptions options(s_features, s_log_stream.get(),
+ true /* read_debug_names */);
result = ReadBinaryInterpreter(env, DataOrNull(file_data), file_data.size(),
- &s_read_binary_options, error_handler,
- out_module);
+ &options, error_handler, out_module);
if (Succeeded(result)) {
if (s_verbose)
diff --git a/src/tools/wasm-objdump.cc b/src/tools/wasm-objdump.cc
index bb08cf88..3739da7d 100644
--- a/src/tools/wasm-objdump.cc
+++ b/src/tools/wasm-objdump.cc
@@ -19,6 +19,7 @@
#include <cstring>
#include "common.h"
+#include "feature.h"
#include "option-parser.h"
#include "stream.h"
#include "writer.h"
@@ -35,6 +36,7 @@ examples:
)";
static ObjdumpOptions s_objdump_options;
+static Features s_features;
static std::vector<const char*> s_infiles;
@@ -57,10 +59,7 @@ static void ParseOptions(int argc, char** argv) {
s_log_stream = FileStream::CreateStdout();
s_objdump_options.log_stream = s_log_stream.get();
});
- parser.AddOption("future-exceptions",
- "Test future extension for exception handling",
- []() { s_objdump_options.allow_future_exceptions = true;
- });
+ s_features.AddOptions(&parser);
parser.AddOption('x', "details", "Show section details",
[]() { s_objdump_options.details = true; });
parser.AddOption('r', "reloc", "Show relocations inline with disassembly",
@@ -85,6 +84,7 @@ Result dump_file(const char* filename) {
// Perform serveral passed over the binary in order to print out different
// types of information.
s_objdump_options.filename = filename;
+ s_objdump_options.features = s_features;
printf("\n");
ObjdumpState state;
diff --git a/src/tools/wasm2wast.cc b/src/tools/wasm2wast.cc
index 27409fb1..ab8c4f9c 100644
--- a/src/tools/wasm2wast.cc
+++ b/src/tools/wasm2wast.cc
@@ -23,6 +23,7 @@
#include "binary-reader.h"
#include "binary-reader-ir.h"
#include "error-handler.h"
+#include "feature.h"
#include "generate-names.h"
#include "ir.h"
#include "option-parser.h"
@@ -37,9 +38,10 @@ using namespace wabt;
static int s_verbose;
static std::string s_infile;
static std::string s_outfile;
-static ReadBinaryOptions s_read_binary_options(nullptr, true);
+static Features s_features;
static WriteWatOptions s_write_wat_options;
static bool s_generate_names;
+static bool s_read_debug_names = true;
static std::unique_ptr<FileStream> s_log_stream;
static bool s_validate = true;
@@ -61,7 +63,6 @@ static void ParseOptions(int argc, char** argv) {
parser.AddOption('v', "verbose", "Use multiple times for more info", []() {
s_verbose++;
s_log_stream = FileStream::CreateStdout();
- s_read_binary_options.log_stream = s_log_stream.get();
});
parser.AddHelpOption();
parser.AddOption(
@@ -73,14 +74,11 @@ static void ParseOptions(int argc, char** argv) {
});
parser.AddOption('f', "fold-exprs", "Write folded expressions where possible",
[]() { s_write_wat_options.fold_exprs = true; });
- parser.AddOption("future-exceptions",
- "Test future extension for exception handling",
- []() { s_read_binary_options.allow_future_exceptions = true;
- });
+ s_features.AddOptions(&parser);
parser.AddOption("inline-exports", "Write all exports inline",
[]() { s_write_wat_options.inline_export = true; });
parser.AddOption("no-debug-names", "Ignore debug names in the binary file",
- []() { s_read_binary_options.read_debug_names = false; });
+ []() { s_read_debug_names = false; });
parser.AddOption(
"generate-names",
"Give auto-generated names to non-named functions, types, etc.",
@@ -106,9 +104,10 @@ int ProgramMain(int argc, char** argv) {
if (Succeeded(result)) {
ErrorHandlerFile error_handler(Location::Type::Binary);
Module module;
- result =
- ReadBinaryIr(s_infile.c_str(), DataOrNull(file_data), file_data.size(),
- &s_read_binary_options, &error_handler, &module);
+ ReadBinaryOptions options(s_features, s_log_stream.get(),
+ s_read_debug_names);
+ result = ReadBinaryIr(s_infile.c_str(), DataOrNull(file_data),
+ file_data.size(), &options, &error_handler, &module);
if (Succeeded(result)) {
if (Succeeded(result) && s_validate) {
WastLexer* lexer = nullptr;
diff --git a/src/tools/wast-desugar.cc b/src/tools/wast-desugar.cc
index e388ea6b..43246d19 100644
--- a/src/tools/wast-desugar.cc
+++ b/src/tools/wast-desugar.cc
@@ -24,6 +24,7 @@
#include "common.h"
#include "config.h"
#include "error-handler.h"
+#include "feature.h"
#include "generate-names.h"
#include "ir.h"
#include "option-parser.h"
@@ -38,7 +39,8 @@ static const char* s_infile;
static const char* s_outfile;
static WriteWatOptions s_write_wat_options;
static bool s_generate_names;
-static WastParseOptions s_parse_options;
+static bool s_debug_parsing;
+static Features s_features;
static const char s_description[] =
R"( read a file in the wasm s-expression format and format it.
@@ -61,12 +63,10 @@ static void ParseOptions(int argc, char** argv) {
parser.AddOption('o', "output", "FILE", "Output file for the formatted file",
[](const char* argument) { s_outfile = argument; });
parser.AddOption("debug-parser", "Turn on debugging the parser of wast files",
- []() { s_parse_options.debug_parsing = true; });
+ []() { s_debug_parsing = true; });
parser.AddOption('f', "fold-exprs", "Write folded expressions where possible",
[]() { s_write_wat_options.fold_exprs = true; });
- parser.AddOption("future-exceptions",
- "Test future extension for exception handling",
- []() { s_parse_options.allow_future_exceptions = true; });
+ s_features.AddOptions(&parser);
parser.AddOption(
"generate-names",
"Give auto-generated names to non-named functions, types, etc.",
@@ -87,8 +87,9 @@ int ProgramMain(int argc, char** argv) {
ErrorHandlerFile error_handler(Location::Type::Text);
Script* script;
+ WastParseOptions parse_wast_options(s_features);
Result result =
- ParseWast(lexer.get(), &script, &error_handler, &s_parse_options);
+ ParseWast(lexer.get(), &script, &error_handler, &parse_wast_options);
if (Succeeded(result)) {
Module* module = script->GetFirstModule();
diff --git a/src/tools/wast2wasm.cc b/src/tools/wast2wasm.cc
index c9b23083..1926ad83 100644
--- a/src/tools/wast2wasm.cc
+++ b/src/tools/wast2wasm.cc
@@ -27,6 +27,7 @@
#include "binary-writer-spec.h"
#include "common.h"
#include "error-handler.h"
+#include "feature.h"
#include "ir.h"
#include "option-parser.h"
#include "resolve-names.h"
@@ -42,10 +43,10 @@ static const char* s_outfile;
static bool s_dump_module;
static int s_verbose;
static WriteBinaryOptions s_write_binary_options;
-static WriteBinarySpecOptions s_write_binary_spec_options;
static bool s_spec;
static bool s_validate = true;
-static WastParseOptions s_parse_options;
+static bool s_debug_parsing;
+static Features s_features;
static std::unique_ptr<FileStream> s_log_stream;
@@ -79,13 +80,11 @@ static void ParseOptions(int argc, char* argv[]) {
});
parser.AddHelpOption();
parser.AddOption("debug-parser", "Turn on debugging the parser of wast files",
- []() { s_parse_options.debug_parsing = true; });
+ []() { s_debug_parsing = true; });
parser.AddOption('d', "dump-module",
"Print a hexdump of the module to stdout",
[]() { s_dump_module = true; });
- parser.AddOption("future-exceptions",
- "Test future extension for exception handling",
- []() { s_parse_options.allow_future_exceptions = true; });
+ s_features.AddOptions(&parser);
parser.AddOption('o', "output", "FILE", "output wasm binary file",
[](const char* argument) { s_outfile = argument; });
parser.AddOption(
@@ -137,8 +136,9 @@ int ProgramMain(int argc, char** argv) {
ErrorHandlerFile error_handler(Location::Type::Text);
Script* script;
+ WastParseOptions parse_wast_options(s_features);
Result result =
- ParseWast(lexer.get(), &script, &error_handler, &s_parse_options);
+ ParseWast(lexer.get(), &script, &error_handler, &parse_wast_options);
if (Succeeded(result)) {
result = ResolveNamesScript(lexer.get(), script, &error_handler);
@@ -148,11 +148,11 @@ int ProgramMain(int argc, char** argv) {
if (Succeeded(result)) {
if (s_spec) {
- s_write_binary_spec_options.json_filename = s_outfile;
- s_write_binary_spec_options.write_binary_options =
- s_write_binary_options;
- result = WriteBinarySpecScript(script, s_infile,
- &s_write_binary_spec_options);
+ WriteBinarySpecOptions write_binary_spec_options;
+ write_binary_spec_options.json_filename = s_outfile;
+ write_binary_spec_options.write_binary_options = s_write_binary_options;
+ result =
+ WriteBinarySpecScript(script, s_infile, &write_binary_spec_options);
} else {
MemoryWriter writer;
const Module* module = script->GetFirstModule();
diff --git a/src/wast-lexer.cc b/src/wast-lexer.cc
index ce929d81..05cdd60e 100644
--- a/src/wast-lexer.cc
+++ b/src/wast-lexer.cc
@@ -69,6 +69,9 @@
#define RETURN_TYPE(token, type) \
return Token(GetLocation(), TokenType::token, Type::type)
+#define RETURN_OPCODE0(token) \
+ return Token(GetLocation(), TokenType::token, Opcode::token)
+
#define RETURN_OPCODE(token, opcode) \
return Token(GetLocation(), TokenType::token, Opcode::opcode)
@@ -392,23 +395,23 @@ Token WastLexer::GetToken(WastParser* parser) {
<i> "mut" { RETURN(Mut); }
<i> "nop" { RETURN(Nop); }
<i> "block" { RETURN(Block); }
- <i> "if" { RETURN(If); }
+ <i> "if" { RETURN_OPCODE0(If); }
<i> "then" { RETURN(Then); }
<i> "else" { RETURN(Else); }
- <i> "loop" { RETURN(Loop); }
- <i> "br" { RETURN(Br); }
- <i> "br_if" { RETURN(BrIf); }
- <i> "br_table" { RETURN(BrTable); }
- <i> "call" { RETURN(Call); }
- <i> "call_indirect" { RETURN(CallIndirect); }
- <i> "drop" { RETURN(Drop); }
- <i> "end" { RETURN(End); }
- <i> "return" { RETURN(Return); }
- <i> "get_local" { RETURN(GetLocal); }
- <i> "set_local" { RETURN(SetLocal); }
- <i> "tee_local" { RETURN(TeeLocal); }
- <i> "get_global" { RETURN(GetGlobal); }
- <i> "set_global" { RETURN(SetGlobal); }
+ <i> "loop" { RETURN_OPCODE0(Loop); }
+ <i> "br" { RETURN_OPCODE0(Br); }
+ <i> "br_if" { RETURN_OPCODE0(BrIf); }
+ <i> "br_table" { RETURN_OPCODE0(BrTable); }
+ <i> "call" { RETURN_OPCODE0(Call); }
+ <i> "call_indirect" { RETURN_OPCODE0(CallIndirect); }
+ <i> "drop" { RETURN_OPCODE0(Drop); }
+ <i> "end" { RETURN_OPCODE0(End); }
+ <i> "return" { RETURN_OPCODE0(Return); }
+ <i> "get_local" { RETURN_OPCODE0(GetLocal); }
+ <i> "set_local" { RETURN_OPCODE0(SetLocal); }
+ <i> "tee_local" { RETURN_OPCODE0(TeeLocal); }
+ <i> "get_global" { RETURN_OPCODE0(GetGlobal); }
+ <i> "set_global" { RETURN_OPCODE0(SetGlobal); }
<i> "i32.load" { RETURN_OPCODE(Load, I32Load); }
<i> "i64.load" { RETURN_OPCODE(Load, I64Load); }
<i> "f32.load" { RETURN_OPCODE(Load, F32Load); }
@@ -547,6 +550,14 @@ Token WastLexer::GetToken(WastParser* parser) {
<i> "i64.trunc_u/f32" { RETURN_OPCODE(Convert, I64TruncUF32); }
<i> "i32.trunc_u/f64" { RETURN_OPCODE(Convert, I32TruncUF64); }
<i> "i64.trunc_u/f64" { RETURN_OPCODE(Convert, I64TruncUF64); }
+ <i> "i32.trunc_s:sat/f32" { RETURN_OPCODE(Convert, I32TruncSSatF32); }
+ <i> "i64.trunc_s:sat/f32" { RETURN_OPCODE(Convert, I64TruncSSatF32); }
+ <i> "i32.trunc_s:sat/f64" { RETURN_OPCODE(Convert, I32TruncSSatF64); }
+ <i> "i64.trunc_s:sat/f64" { RETURN_OPCODE(Convert, I64TruncSSatF64); }
+ <i> "i32.trunc_u:sat/f32" { RETURN_OPCODE(Convert, I32TruncUSatF32); }
+ <i> "i64.trunc_u:sat/f32" { RETURN_OPCODE(Convert, I64TruncUSatF32); }
+ <i> "i32.trunc_u:sat/f64" { RETURN_OPCODE(Convert, I32TruncUSatF64); }
+ <i> "i64.trunc_u:sat/f64" { RETURN_OPCODE(Convert, I64TruncUSatF64); }
<i> "f32.convert_s/i32" { RETURN_OPCODE(Convert, F32ConvertSI32); }
<i> "f64.convert_s/i32" { RETURN_OPCODE(Convert, F64ConvertSI32); }
<i> "f32.convert_s/i64" { RETURN_OPCODE(Convert, F32ConvertSI64); }
@@ -561,10 +572,10 @@ Token WastLexer::GetToken(WastParser* parser) {
<i> "i32.reinterpret/f32" { RETURN_OPCODE(Convert, I32ReinterpretF32); }
<i> "f64.reinterpret/i64" { RETURN_OPCODE(Convert, F64ReinterpretI64); }
<i> "i64.reinterpret/f64" { RETURN_OPCODE(Convert, I64ReinterpretF64); }
- <i> "select" { RETURN(Select); }
- <i> "unreachable" { RETURN(Unreachable); }
- <i> "current_memory" { RETURN(CurrentMemory); }
- <i> "grow_memory" { RETURN(GrowMemory); }
+ <i> "select" { RETURN_OPCODE0(Select); }
+ <i> "unreachable" { RETURN_OPCODE0(Unreachable); }
+ <i> "current_memory" { RETURN_OPCODE0(CurrentMemory); }
+ <i> "grow_memory" { RETURN_OPCODE0(GrowMemory); }
<i> "type" { RETURN(Type); }
<i> "func" { RETURN(Func); }
<i> "param" { RETURN(Param); }
@@ -594,11 +605,11 @@ Token WastLexer::GetToken(WastParser* parser) {
<i> "assert_return_arithmetic_nan" { RETURN(AssertReturnArithmeticNan); }
<i> "assert_trap" { RETURN(AssertTrap); }
<i> "assert_exhaustion" { RETURN(AssertExhaustion); }
- <i> "try" { RETURN(Try); }
- <i> "catch" { RETURN(Catch); }
- <i> "catch_all" { RETURN(CatchAll); }
- <i> "throw" { RETURN(Throw); }
- <i> "rethrow" { RETURN(Rethrow); }
+ <i> "try" { RETURN_OPCODE0(Try); }
+ <i> "catch" { RETURN_OPCODE0(Catch); }
+ <i> "catch_all" { RETURN_OPCODE0(CatchAll); }
+ <i> "throw" { RETURN_OPCODE0(Throw); }
+ <i> "rethrow" { RETURN_OPCODE0(Rethrow); }
<i> name { RETURN_TEXT(Var); }
<i> ";;" => LINE_COMMENT { continue; }
diff --git a/src/wast-parser.cc b/src/wast-parser.cc
index 5174d4a4..139f5a7a 100644
--- a/src/wast-parser.cc
+++ b/src/wast-parser.cc
@@ -396,11 +396,10 @@ Result WastParser::Synchronize(SynchronizeFunc func) {
return Result::Error;
}
-void WastParser::ErrorUnlessExceptionsAllowed() {
- if (!options_->allow_future_exceptions) {
- Error(GetLocation(), "opcode not allowed: %s",
- GetToken().to_string().c_str());
- }
+void WastParser::ErrorUnlessOpcodeEnabled(const Token& token) {
+ Opcode opcode = token.opcode;
+ if (!opcode.IsEnabled(options_->features))
+ Error(token.loc, "opcode not allowed: %s", opcode.GetName());
}
Result WastParser::ErrorExpected(const std::vector<std::string>& expected,
@@ -1288,9 +1287,12 @@ Result WastParser::ParsePlainInstr(std::unique_ptr<Expr>* out_expr) {
out_expr->reset(new CompareExpr(Consume().opcode, loc));
break;
- case TokenType::Convert:
- out_expr->reset(new ConvertExpr(Consume().opcode, loc));
+ case TokenType::Convert: {
+ auto token = Consume();
+ ErrorUnlessOpcodeEnabled(token);
+ out_expr->reset(new ConvertExpr(token.opcode, loc));
break;
+ }
case TokenType::CurrentMemory:
Consume();
@@ -1303,14 +1305,12 @@ Result WastParser::ParsePlainInstr(std::unique_ptr<Expr>* out_expr) {
break;
case TokenType::Throw:
- ErrorUnlessExceptionsAllowed();
- Consume();
+ ErrorUnlessOpcodeEnabled(Consume());
CHECK_RESULT(ParsePlainInstrVar<ThrowExpr>(loc, out_expr));
break;
case TokenType::Rethrow:
- ErrorUnlessExceptionsAllowed();
- Consume();
+ ErrorUnlessOpcodeEnabled(Consume());
CHECK_RESULT(ParsePlainInstrVar<RethrowExpr>(loc, out_expr));
break;
@@ -1438,8 +1438,7 @@ Result WastParser::ParseBlockInstr(std::unique_ptr<Expr>* out_expr) {
}
case TokenType::Try: {
- ErrorUnlessExceptionsAllowed();
- Consume();
+ ErrorUnlessOpcodeEnabled(Consume());
auto expr = make_unique<TryExpr>(loc);
expr->block = new Block();
CatchVector catches;
@@ -1585,8 +1584,7 @@ Result WastParser::ParseExpr(ExprList* exprs) {
case TokenType::Try: {
Consume();
- ErrorUnlessExceptionsAllowed();
- Consume();
+ ErrorUnlessOpcodeEnabled(Consume());
auto block = make_unique<Block>();
CHECK_RESULT(ParseLabelOpt(&block->label));
diff --git a/src/wast-parser.h b/src/wast-parser.h
index 8251df9d..9a5d99a1 100644
--- a/src/wast-parser.h
+++ b/src/wast-parser.h
@@ -20,6 +20,7 @@
#include <array>
#include "circular-array.h"
+#include "feature.h"
#include "ir.h"
#include "intrusive-list.h"
#include "wast-lexer.h"
@@ -29,7 +30,9 @@ namespace wabt {
class ErrorHandler;
struct WastParseOptions {
- bool allow_future_exceptions = false;
+ WastParseOptions(const Features& features) : features(features) {}
+
+ Features features;
bool debug_parsing = false;
};
@@ -43,7 +46,7 @@ class WastParser {
Result ParseScript(Script*);
private:
- void ErrorUnlessExceptionsAllowed();
+ void ErrorUnlessOpcodeEnabled(const Token&);
// Print an error message listing the expected tokens, as well as an example
// of expected input.