diff options
Diffstat (limited to 'src/interpreter.cc')
-rw-r--r-- | src/interpreter.cc | 1363 |
1 files changed, 659 insertions, 704 deletions
diff --git a/src/interpreter.cc b/src/interpreter.cc index 30aba1a9..f116eb25 100644 --- a/src/interpreter.cc +++ b/src/interpreter.cc @@ -25,8 +25,9 @@ #include "stream.h" namespace wabt { +namespace interpreter { -static const char* s_interpreter_opcode_name[256] = { +static const char* s_opcode_name[256] = { #define WABT_OPCODE(rtype, type1, type2, mem_size, code, NAME, text) text, #include "interpreter-opcode.def" @@ -40,14 +41,13 @@ static const char* s_interpreter_opcode_name[256] = { return Result::Error; \ } while (0) -static const char* get_interpreter_opcode_name(InterpreterOpcode opcode) { - return s_interpreter_opcode_name[static_cast<int>(opcode)]; +static const char* get_opcode_name(Opcode opcode) { + return s_opcode_name[static_cast<int>(opcode)]; } -InterpreterEnvironment::InterpreterEnvironment() - : istream(new OutputBuffer()) {} +Environment::Environment() : istream(new OutputBuffer()) {} -InterpreterThread::InterpreterThread() +Thread::Thread() : env(nullptr), value_stack_top(nullptr), value_stack_end(nullptr), @@ -55,18 +55,17 @@ InterpreterThread::InterpreterThread() call_stack_end(nullptr), pc(0) {} -InterpreterImport::InterpreterImport() - : kind(ExternalKind::Func) { +Import::Import() : kind(ExternalKind::Func) { WABT_ZERO_MEMORY(module_name); WABT_ZERO_MEMORY(field_name); WABT_ZERO_MEMORY(func.sig_index); } -InterpreterImport::InterpreterImport(InterpreterImport&& other) { +Import::Import(Import&& other) { *this = std::move(other); } -InterpreterImport& InterpreterImport::operator=(InterpreterImport&& other) { +Import& Import::operator=(Import&& other) { kind = other.kind; module_name = other.module_name; WABT_ZERO_MEMORY(other.module_name); @@ -90,20 +89,17 @@ InterpreterImport& InterpreterImport::operator=(InterpreterImport&& other) { return *this; } - -InterpreterImport::~InterpreterImport() { +Import::~Import() { destroy_string_slice(&module_name); destroy_string_slice(&field_name); } -InterpreterExport::InterpreterExport(InterpreterExport&& other) - : name(other.name), - kind(other.kind), - index(other.index) { +Export::Export(Export&& other) + : name(other.name), kind(other.kind), index(other.index) { WABT_ZERO_MEMORY(other.name); } -InterpreterExport& InterpreterExport::operator=(InterpreterExport&& other) { +Export& Export::operator=(Export&& other) { name = other.name; kind = other.kind; index = other.index; @@ -111,39 +107,37 @@ InterpreterExport& InterpreterExport::operator=(InterpreterExport&& other) { return *this; } -InterpreterExport::~InterpreterExport() { +Export::~Export() { destroy_string_slice(&name); } -InterpreterModule::InterpreterModule(bool is_host) +Module::Module(bool is_host) : memory_index(kInvalidIndex), table_index(kInvalidIndex), is_host(is_host) { WABT_ZERO_MEMORY(name); } -InterpreterModule::InterpreterModule(const StringSlice& name, bool is_host) +Module::Module(const StringSlice& name, bool is_host) : name(name), memory_index(kInvalidIndex), table_index(kInvalidIndex), is_host(is_host) {} -InterpreterModule::~InterpreterModule() { +Module::~Module() { destroy_string_slice(&name); } -DefinedInterpreterModule::DefinedInterpreterModule(size_t istream_start) - : InterpreterModule(false), +DefinedModule::DefinedModule(size_t istream_start) + : Module(false), start_func_index(kInvalidIndex), istream_start(istream_start), istream_end(istream_start) {} -HostInterpreterModule::HostInterpreterModule(const StringSlice& name) - : InterpreterModule(name, true) {} +HostModule::HostModule(const StringSlice& name) : Module(name, true) {} -InterpreterEnvironmentMark mark_interpreter_environment( - InterpreterEnvironment* env) { - InterpreterEnvironmentMark mark; +EnvironmentMark mark_environment(Environment* env) { + EnvironmentMark mark; WABT_ZERO_MEMORY(mark); mark.modules_size = env->modules.size(); mark.sigs_size = env->sigs.size(); @@ -155,8 +149,7 @@ InterpreterEnvironmentMark mark_interpreter_environment( return mark; } -void reset_interpreter_environment_to_mark(InterpreterEnvironment* env, - InterpreterEnvironmentMark mark) { +void reset_environment_to_mark(Environment* env, EnvironmentMark mark) { /* Destroy entries in the binding hash. */ for (size_t i = mark.modules_size; i < env->modules.size(); ++i) { const StringSlice* name = &env->modules[i]->name; @@ -187,19 +180,15 @@ void reset_interpreter_environment_to_mark(InterpreterEnvironment* env, env->istream->data.resize(mark.istream_size); } -HostInterpreterModule* append_host_module(InterpreterEnvironment* env, - StringSlice name) { - HostInterpreterModule* module = - new HostInterpreterModule(dup_string_slice(name)); +HostModule* append_host_module(Environment* env, StringSlice name) { + HostModule* module = new HostModule(dup_string_slice(name)); env->modules.emplace_back(module); env->registered_module_bindings.emplace(string_slice_to_string(name), Binding(env->modules.size() - 1)); return module; } -void init_interpreter_thread(InterpreterEnvironment* env, - InterpreterThread* thread, - InterpreterThreadOptions* options) { +void init_thread(Environment* env, Thread* thread, ThreadOptions* options) { thread->value_stack.resize(options->value_stack_size); thread->call_stack.resize(options->call_stack_size); thread->env = env; @@ -212,16 +201,14 @@ void init_interpreter_thread(InterpreterEnvironment* env, thread->pc = options->pc; } -InterpreterResult push_thread_value(InterpreterThread* thread, - InterpreterValue value) { +Result push_thread_value(Thread* thread, Value value) { if (thread->value_stack_top >= thread->value_stack_end) - return InterpreterResult::TrapValueStackExhausted; + return Result::TrapValueStackExhausted; *thread->value_stack_top++ = value; - return InterpreterResult::Ok; + return Result::Ok; } -InterpreterExport* get_interpreter_export_by_name(InterpreterModule* module, - const StringSlice* name) { +Export* get_export_by_name(Module* module, const StringSlice* name) { int field_index = module->export_bindings.find_index(*name); if (field_index < 0) return nullptr; @@ -475,7 +462,7 @@ DEFINE_BITCAST(bitcast_u64_to_f64, uint64_t, double) #define TYPE_FIELD_NAME_F32 f32_bits #define TYPE_FIELD_NAME_F64 f64_bits -#define TRAP(type) return InterpreterResult::Trap##type +#define TRAP(type) return Result::Trap##type #define TRAP_UNLESS(cond, type) TRAP_IF(!(cond), type) #define TRAP_IF(cond, type) \ do { \ @@ -539,7 +526,7 @@ DEFINE_BITCAST(bitcast_u64_to_f64, uint64_t, double) #define GET_MEMORY(var) \ Index memory_index = read_u32(&pc); \ - InterpreterMemory* var = &env->memories[memory_index] + Memory* var = &env->memories[memory_index] #define LOAD(type, mem_type) \ do { \ @@ -751,27 +738,26 @@ static WABT_INLINE void read_table_entry_at(const uint8_t* pc, *out_keep = *(pc + WABT_TABLE_ENTRY_KEEP_OFFSET); } -bool func_signatures_are_equal(InterpreterEnvironment* env, +bool func_signatures_are_equal(Environment* env, Index sig_index_0, Index sig_index_1) { if (sig_index_0 == sig_index_1) return true; - InterpreterFuncSignature* sig_0 = &env->sigs[sig_index_0]; - InterpreterFuncSignature* sig_1 = &env->sigs[sig_index_1]; + FuncSignature* sig_0 = &env->sigs[sig_index_0]; + FuncSignature* sig_1 = &env->sigs[sig_index_1]; return sig_0->param_types == sig_1->param_types && sig_0->result_types == sig_1->result_types; } -InterpreterResult call_host(InterpreterThread* thread, - HostInterpreterFunc* func) { - InterpreterFuncSignature* sig = &thread->env->sigs[func->sig_index]; +Result call_host(Thread* thread, HostFunc* func) { + FuncSignature* sig = &thread->env->sigs[func->sig_index]; size_t num_params = sig->param_types.size(); size_t num_results = sig->result_types.size(); // + 1 is a workaround for using data() below; UBSAN doesn't like calling // data() with an empty vector. - std::vector<InterpreterTypedValue> params(num_params + 1); - std::vector<InterpreterTypedValue> results(num_results + 1); + std::vector<TypedValue> params(num_params + 1); + std::vector<TypedValue> results(num_results + 1); for (size_t i = num_params; i > 0; --i) { params[i - 1].value = POP(); @@ -788,42 +774,42 @@ InterpreterResult call_host(InterpreterThread* thread, PUSH(results[i].value); } - return InterpreterResult::Ok; + return Result::Ok; } -InterpreterResult run_interpreter(InterpreterThread* thread, - int num_instructions, - IstreamOffset* call_stack_return_top) { - InterpreterResult result = InterpreterResult::Ok; +Result run_interpreter(Thread* thread, + int num_instructions, + IstreamOffset* call_stack_return_top) { + Result result = Result::Ok; assert(call_stack_return_top < thread->call_stack_end); - InterpreterEnvironment* env = thread->env; + Environment* env = thread->env; const uint8_t* istream = env->istream->data.data(); const uint8_t* pc = &istream[thread->pc]; for (int i = 0; i < num_instructions; ++i) { - InterpreterOpcode opcode = static_cast<InterpreterOpcode>(*pc++); + Opcode opcode = static_cast<Opcode>(*pc++); switch (opcode) { - case InterpreterOpcode::Select: { + case Opcode::Select: { VALUE_TYPE_I32 cond = POP_I32(); - InterpreterValue false_ = POP(); - InterpreterValue true_ = POP(); + Value false_ = POP(); + Value true_ = POP(); PUSH(cond ? true_ : false_); break; } - case InterpreterOpcode::Br: + case Opcode::Br: GOTO(read_u32(&pc)); break; - case InterpreterOpcode::BrIf: { + case Opcode::BrIf: { IstreamOffset new_pc = read_u32(&pc); if (POP_I32()) GOTO(new_pc); break; } - case InterpreterOpcode::BrTable: { + case Opcode::BrTable: { Index num_targets = read_u32(&pc); IstreamOffset table_offset = read_u32(&pc); VALUE_TYPE_I32 key = POP_I32(); @@ -839,80 +825,80 @@ InterpreterResult run_interpreter(InterpreterThread* thread, break; } - case InterpreterOpcode::Return: + case Opcode::Return: if (thread->call_stack_top == call_stack_return_top) { - result = InterpreterResult::Returned; + result = Result::Returned; goto exit_loop; } GOTO(POP_CALL()); break; - case InterpreterOpcode::Unreachable: + case Opcode::Unreachable: TRAP(Unreachable); break; - case InterpreterOpcode::I32Const: + case Opcode::I32Const: PUSH_I32(read_u32(&pc)); break; - case InterpreterOpcode::I64Const: + case Opcode::I64Const: PUSH_I64(read_u64(&pc)); break; - case InterpreterOpcode::F32Const: + case Opcode::F32Const: PUSH_F32(read_u32(&pc)); break; - case InterpreterOpcode::F64Const: + case Opcode::F64Const: PUSH_F64(read_u64(&pc)); break; - case InterpreterOpcode::GetGlobal: { + case Opcode::GetGlobal: { Index index = read_u32(&pc); assert(index < env->globals.size()); PUSH(env->globals[index].typed_value.value); break; } - case InterpreterOpcode::SetGlobal: { + case Opcode::SetGlobal: { Index index = read_u32(&pc); assert(index < env->globals.size()); env->globals[index].typed_value.value = POP(); break; } - case InterpreterOpcode::GetLocal: { - InterpreterValue value = PICK(read_u32(&pc)); + case Opcode::GetLocal: { + Value value = PICK(read_u32(&pc)); PUSH(value); break; } - case InterpreterOpcode::SetLocal: { - InterpreterValue value = POP(); + case Opcode::SetLocal: { + Value value = POP(); PICK(read_u32(&pc)) = value; break; } - case InterpreterOpcode::TeeLocal: + case Opcode::TeeLocal: PICK(read_u32(&pc)) = TOP(); break; - case InterpreterOpcode::Call: { + case Opcode::Call: { IstreamOffset offset = read_u32(&pc); PUSH_CALL(); GOTO(offset); break; } - case InterpreterOpcode::CallIndirect: { + case Opcode::CallIndirect: { Index table_index = read_u32(&pc); - InterpreterTable* table = &env->tables[table_index]; + Table* table = &env->tables[table_index]; Index sig_index = read_u32(&pc); VALUE_TYPE_I32 entry_index = POP_I32(); TRAP_IF(entry_index >= table->func_indexes.size(), UndefinedTableIndex); Index func_index = table->func_indexes[entry_index]; TRAP_IF(func_index == kInvalidIndex, UninitializedTableElement); - InterpreterFunc* func = env->funcs[func_index].get(); + Func* func = env->funcs[func_index].get(); TRAP_UNLESS(func_signatures_are_equal(env, func->sig_index, sig_index), IndirectCallSignatureMismatch); if (func->is_host) { @@ -924,111 +910,111 @@ InterpreterResult run_interpreter(InterpreterThread* thread, break; } - case InterpreterOpcode::CallHost: { + case Opcode::CallHost: { Index func_index = read_u32(&pc); call_host(thread, env->funcs[func_index]->as_host()); break; } - case InterpreterOpcode::I32Load8S: + case Opcode::I32Load8S: LOAD(I32, I8); break; - case InterpreterOpcode::I32Load8U: + case Opcode::I32Load8U: LOAD(I32, U8); break; - case InterpreterOpcode::I32Load16S: + case Opcode::I32Load16S: LOAD(I32, I16); break; - case InterpreterOpcode::I32Load16U: + case Opcode::I32Load16U: LOAD(I32, U16); break; - case InterpreterOpcode::I64Load8S: + case Opcode::I64Load8S: LOAD(I64, I8); break; - case InterpreterOpcode::I64Load8U: + case Opcode::I64Load8U: LOAD(I64, U8); break; - case InterpreterOpcode::I64Load16S: + case Opcode::I64Load16S: LOAD(I64, I16); break; - case InterpreterOpcode::I64Load16U: + case Opcode::I64Load16U: LOAD(I64, U16); break; - case InterpreterOpcode::I64Load32S: + case Opcode::I64Load32S: LOAD(I64, I32); break; - case InterpreterOpcode::I64Load32U: + case Opcode::I64Load32U: LOAD(I64, U32); break; - case InterpreterOpcode::I32Load: + case Opcode::I32Load: LOAD(I32, U32); break; - case InterpreterOpcode::I64Load: + case Opcode::I64Load: LOAD(I64, U64); break; - case InterpreterOpcode::F32Load: + case Opcode::F32Load: LOAD(F32, F32); break; - case InterpreterOpcode::F64Load: + case Opcode::F64Load: LOAD(F64, F64); break; - case InterpreterOpcode::I32Store8: + case Opcode::I32Store8: STORE(I32, U8); break; - case InterpreterOpcode::I32Store16: + case Opcode::I32Store16: STORE(I32, U16); break; - case InterpreterOpcode::I64Store8: + case Opcode::I64Store8: STORE(I64, U8); break; - case InterpreterOpcode::I64Store16: + case Opcode::I64Store16: STORE(I64, U16); break; - case InterpreterOpcode::I64Store32: + case Opcode::I64Store32: STORE(I64, U32); break; - case InterpreterOpcode::I32Store: + case Opcode::I32Store: STORE(I32, U32); break; - case InterpreterOpcode::I64Store: + case Opcode::I64Store: STORE(I64, U64); break; - case InterpreterOpcode::F32Store: + case Opcode::F32Store: STORE(F32, F32); break; - case InterpreterOpcode::F64Store: + case Opcode::F64Store: STORE(F64, F64); break; - case InterpreterOpcode::CurrentMemory: { + case Opcode::CurrentMemory: { GET_MEMORY(memory); PUSH_I32(memory->page_limits.initial); break; } - case InterpreterOpcode::GrowMemory: { + case Opcode::GrowMemory: { GET_MEMORY(memory); uint32_t old_page_size = memory->page_limits.initial; VALUE_TYPE_I32 grow_pages = POP_I32(); @@ -1045,399 +1031,399 @@ InterpreterResult run_interpreter(InterpreterThread* thread, break; } - case InterpreterOpcode::I32Add: + case Opcode::I32Add: BINOP(I32, I32, +); break; - case InterpreterOpcode::I32Sub: + case Opcode::I32Sub: BINOP(I32, I32, -); break; - case InterpreterOpcode::I32Mul: + case Opcode::I32Mul: BINOP(I32, I32, *); break; - case InterpreterOpcode::I32DivS: + case Opcode::I32DivS: BINOP_DIV_S(I32); break; - case InterpreterOpcode::I32DivU: + case Opcode::I32DivU: BINOP_DIV_REM_U(I32, /); break; - case InterpreterOpcode::I32RemS: + case Opcode::I32RemS: BINOP_REM_S(I32); break; - case InterpreterOpcode::I32RemU: + case Opcode::I32RemU: BINOP_DIV_REM_U(I32, %); break; - case InterpreterOpcode::I32And: + case Opcode::I32And: BINOP(I32, I32, &); break; - case InterpreterOpcode::I32Or: + case Opcode::I32Or: BINOP(I32, I32, |); break; - case InterpreterOpcode::I32Xor: + case Opcode::I32Xor: BINOP(I32, I32, ^); break; - case InterpreterOpcode::I32Shl: + case Opcode::I32Shl: BINOP_SHIFT(I32, <<, UNSIGNED); break; - case InterpreterOpcode::I32ShrU: + case Opcode::I32ShrU: BINOP_SHIFT(I32, >>, UNSIGNED); break; - case InterpreterOpcode::I32ShrS: + case Opcode::I32ShrS: BINOP_SHIFT(I32, >>, SIGNED); break; - case InterpreterOpcode::I32Eq: + case Opcode::I32Eq: BINOP(I32, I32, ==); break; - case InterpreterOpcode::I32Ne: + case Opcode::I32Ne: BINOP(I32, I32, !=); break; - case InterpreterOpcode::I32LtS: + case Opcode::I32LtS: BINOP_SIGNED(I32, I32, <); break; - case InterpreterOpcode::I32LeS: + case Opcode::I32LeS: BINOP_SIGNED(I32, I32, <=); break; - case InterpreterOpcode::I32LtU: + case Opcode::I32LtU: BINOP(I32, I32, <); break; - case InterpreterOpcode::I32LeU: + case Opcode::I32LeU: BINOP(I32, I32, <=); break; - case InterpreterOpcode::I32GtS: + case Opcode::I32GtS: BINOP_SIGNED(I32, I32, >); break; - case InterpreterOpcode::I32GeS: + case Opcode::I32GeS: BINOP_SIGNED(I32, I32, >=); break; - case InterpreterOpcode::I32GtU: + case Opcode::I32GtU: BINOP(I32, I32, >); break; - case InterpreterOpcode::I32GeU: + case Opcode::I32GeU: BINOP(I32, I32, >=); break; - case InterpreterOpcode::I32Clz: { + case Opcode::I32Clz: { VALUE_TYPE_I32 value = POP_I32(); PUSH_I32(value != 0 ? wabt_clz_u32(value) : 32); break; } - case InterpreterOpcode::I32Ctz: { + case Opcode::I32Ctz: { VALUE_TYPE_I32 value = POP_I32(); PUSH_I32(value != 0 ? wabt_ctz_u32(value) : 32); break; } - case InterpreterOpcode::I32Popcnt: { + case Opcode::I32Popcnt: { VALUE_TYPE_I32 value = POP_I32(); PUSH_I32(wabt_popcount_u32(value)); break; } - case InterpreterOpcode::I32Eqz: { + case Opcode::I32Eqz: { VALUE_TYPE_I32 value = POP_I32(); PUSH_I32(value == 0); break; } - case InterpreterOpcode::I64Add: + case Opcode::I64Add: BINOP(I64, I64, +); break; - case InterpreterOpcode::I64Sub: + case Opcode::I64Sub: BINOP(I64, I64, -); break; - case InterpreterOpcode::I64Mul: + case Opcode::I64Mul: BINOP(I64, I64, *); break; - case InterpreterOpcode::I64DivS: + case Opcode::I64DivS: BINOP_DIV_S(I64); break; - case InterpreterOpcode::I64DivU: + case Opcode::I64DivU: BINOP_DIV_REM_U(I64, /); break; - case InterpreterOpcode::I64RemS: + case Opcode::I64RemS: BINOP_REM_S(I64); break; - case InterpreterOpcode::I64RemU: + case Opcode::I64RemU: BINOP_DIV_REM_U(I64, %); break; - case InterpreterOpcode::I64And: + case Opcode::I64And: BINOP(I64, I64, &); break; - case InterpreterOpcode::I64Or: + case Opcode::I64Or: BINOP(I64, I64, |); break; - case InterpreterOpcode::I64Xor: + case Opcode::I64Xor: BINOP(I64, I64, ^); break; - case InterpreterOpcode::I64Shl: + case Opcode::I64Shl: BINOP_SHIFT(I64, <<, UNSIGNED); break; - case InterpreterOpcode::I64ShrU: + case Opcode::I64ShrU: BINOP_SHIFT(I64, >>, UNSIGNED); break; - case InterpreterOpcode::I64ShrS: + case Opcode::I64ShrS: BINOP_SHIFT(I64, >>, SIGNED); break; - case InterpreterOpcode::I64Eq: + case Opcode::I64Eq: BINOP(I32, I64, ==); break; - case InterpreterOpcode::I64Ne: + case Opcode::I64Ne: BINOP(I32, I64, !=); break; - case InterpreterOpcode::I64LtS: + case Opcode::I64LtS: BINOP_SIGNED(I32, I64, <); break; - case InterpreterOpcode::I64LeS: + case Opcode::I64LeS: BINOP_SIGNED(I32, I64, <=); break; - case InterpreterOpcode::I64LtU: + case Opcode::I64LtU: BINOP(I32, I64, <); break; - case InterpreterOpcode::I64LeU: + case Opcode::I64LeU: BINOP(I32, I64, <=); break; - case InterpreterOpcode::I64GtS: + case Opcode::I64GtS: BINOP_SIGNED(I32, I64, >); break; - case InterpreterOpcode::I64GeS: + case Opcode::I64GeS: BINOP_SIGNED(I32, I64, >=); break; - case InterpreterOpcode::I64GtU: + case Opcode::I64GtU: BINOP(I32, I64, >); break; - case InterpreterOpcode::I64GeU: + case Opcode::I64GeU: BINOP(I32, I64, >=); break; - case InterpreterOpcode::I64Clz: { + case Opcode::I64Clz: { VALUE_TYPE_I64 value = POP_I64(); PUSH_I64(value != 0 ? wabt_clz_u64(value) : 64); break; } - case InterpreterOpcode::I64Ctz: { + case Opcode::I64Ctz: { VALUE_TYPE_I64 value = POP_I64(); PUSH_I64(value != 0 ? wabt_ctz_u64(value) : 64); break; } - case InterpreterOpcode::I64Popcnt: { + case Opcode::I64Popcnt: { VALUE_TYPE_I64 value = POP_I64(); PUSH_I64(wabt_popcount_u64(value)); break; } - case InterpreterOpcode::F32Add: + case Opcode::F32Add: BINOP_FLOAT(F32, +); break; - case InterpreterOpcode::F32Sub: + case Opcode::F32Sub: BINOP_FLOAT(F32, -); break; - case InterpreterOpcode::F32Mul: + case Opcode::F32Mul: BINOP_FLOAT(F32, *); break; - case InterpreterOpcode::F32Div: + case Opcode::F32Div: BINOP_FLOAT_DIV(F32); break; - case InterpreterOpcode::F32Min: + case Opcode::F32Min: MINMAX_FLOAT(F32, MIN); break; - case InterpreterOpcode::F32Max: + case Opcode::F32Max: MINMAX_FLOAT(F32, MAX); break; - case InterpreterOpcode::F32Abs: + case Opcode::F32Abs: TOP().f32_bits &= ~F32_SIGN_MASK; break; - case InterpreterOpcode::F32Neg: + case Opcode::F32Neg: TOP().f32_bits ^= F32_SIGN_MASK; break; - case InterpreterOpcode::F32Copysign: { + case Opcode::F32Copysign: { VALUE_TYPE_F32 rhs = POP_F32(); VALUE_TYPE_F32 lhs = POP_F32(); PUSH_F32((lhs & ~F32_SIGN_MASK) | (rhs & F32_SIGN_MASK)); break; } - case InterpreterOpcode::F32Ceil: + case Opcode::F32Ceil: UNOP_FLOAT(F32, ceilf); break; - case InterpreterOpcode::F32Floor: + case Opcode::F32Floor: UNOP_FLOAT(F32, floorf); break; - case InterpreterOpcode::F32Trunc: + case Opcode::F32Trunc: UNOP_FLOAT(F32, truncf); break; - case InterpreterOpcode::F32Nearest: + case Opcode::F32Nearest: UNOP_FLOAT(F32, nearbyintf); break; - case InterpreterOpcode::F32Sqrt: + case Opcode::F32Sqrt: UNOP_FLOAT(F32, sqrtf); break; - case InterpreterOpcode::F32Eq: + case Opcode::F32Eq: BINOP_FLOAT_COMPARE(F32, ==); break; - case InterpreterOpcode::F32Ne: + case Opcode::F32Ne: BINOP_FLOAT_COMPARE(F32, !=); break; - case InterpreterOpcode::F32Lt: + case Opcode::F32Lt: BINOP_FLOAT_COMPARE(F32, <); break; - case InterpreterOpcode::F32Le: + case Opcode::F32Le: BINOP_FLOAT_COMPARE(F32, <=); break; - case InterpreterOpcode::F32Gt: + case Opcode::F32Gt: BINOP_FLOAT_COMPARE(F32, >); break; - case InterpreterOpcode::F32Ge: + case Opcode::F32Ge: BINOP_FLOAT_COMPARE(F32, >=); break; - case InterpreterOpcode::F64Add: + case Opcode::F64Add: BINOP_FLOAT(F64, +); break; - case InterpreterOpcode::F64Sub: + case Opcode::F64Sub: BINOP_FLOAT(F64, -); break; - case InterpreterOpcode::F64Mul: + case Opcode::F64Mul: BINOP_FLOAT(F64, *); break; - case InterpreterOpcode::F64Div: + case Opcode::F64Div: BINOP_FLOAT_DIV(F64); break; - case InterpreterOpcode::F64Min: + case Opcode::F64Min: MINMAX_FLOAT(F64, MIN); break; - case InterpreterOpcode::F64Max: + case Opcode::F64Max: MINMAX_FLOAT(F64, MAX); break; - case InterpreterOpcode::F64Abs: + case Opcode::F64Abs: TOP().f64_bits &= ~F64_SIGN_MASK; break; - case InterpreterOpcode::F64Neg: + case Opcode::F64Neg: TOP().f64_bits ^= F64_SIGN_MASK; break; - case InterpreterOpcode::F64Copysign: { + case Opcode::F64Copysign: { VALUE_TYPE_F64 rhs = POP_F64(); VALUE_TYPE_F64 lhs = POP_F64(); PUSH_F64((lhs & ~F64_SIGN_MASK) | (rhs & F64_SIGN_MASK)); break; } - case InterpreterOpcode::F64Ceil: + case Opcode::F64Ceil: UNOP_FLOAT(F64, ceil); break; - case InterpreterOpcode::F64Floor: + case Opcode::F64Floor: UNOP_FLOAT(F64, floor); break; - case InterpreterOpcode::F64Trunc: + case Opcode::F64Trunc: UNOP_FLOAT(F64, trunc); break; - case InterpreterOpcode::F64Nearest: + case Opcode::F64Nearest: UNOP_FLOAT(F64, nearbyint); break; - case InterpreterOpcode::F64Sqrt: + case Opcode::F64Sqrt: UNOP_FLOAT(F64, sqrt); break; - case InterpreterOpcode::F64Eq: + case Opcode::F64Eq: BINOP_FLOAT_COMPARE(F64, ==); break; - case InterpreterOpcode::F64Ne: + case Opcode::F64Ne: BINOP_FLOAT_COMPARE(F64, !=); break; - case InterpreterOpcode::F64Lt: + case Opcode::F64Lt: BINOP_FLOAT_COMPARE(F64, <); break; - case InterpreterOpcode::F64Le: + case Opcode::F64Le: BINOP_FLOAT_COMPARE(F64, <=); break; - case InterpreterOpcode::F64Gt: + case Opcode::F64Gt: BINOP_FLOAT_COMPARE(F64, >); break; - case InterpreterOpcode::F64Ge: + case Opcode::F64Ge: BINOP_FLOAT_COMPARE(F64, >=); break; - case InterpreterOpcode::I32TruncSF32: { + case Opcode::I32TruncSF32: { VALUE_TYPE_F32 value = POP_F32(); TRAP_IF(is_nan_f32(value), InvalidConversionToInteger); TRAP_UNLESS(is_in_range_i32_trunc_s_f32(value), IntegerOverflow); @@ -1445,7 +1431,7 @@ InterpreterResult run_interpreter(InterpreterThread* thread, break; } - case InterpreterOpcode::I32TruncSF64: { + case Opcode::I32TruncSF64: { VALUE_TYPE_F64 value = POP_F64(); TRAP_IF(is_nan_f64(value), InvalidConversionToInteger); TRAP_UNLESS(is_in_range_i32_trunc_s_f64(value), IntegerOverflow); @@ -1453,7 +1439,7 @@ InterpreterResult run_interpreter(InterpreterThread* thread, break; } - case InterpreterOpcode::I32TruncUF32: { + case Opcode::I32TruncUF32: { VALUE_TYPE_F32 value = POP_F32(); TRAP_IF(is_nan_f32(value), InvalidConversionToInteger); TRAP_UNLESS(is_in_range_i32_trunc_u_f32(value), IntegerOverflow); @@ -1461,7 +1447,7 @@ InterpreterResult run_interpreter(InterpreterThread* thread, break; } - case InterpreterOpcode::I32TruncUF64: { + case Opcode::I32TruncUF64: { VALUE_TYPE_F64 value = POP_F64(); TRAP_IF(is_nan_f64(value), InvalidConversionToInteger); TRAP_UNLESS(is_in_range_i32_trunc_u_f64(value), IntegerOverflow); @@ -1469,13 +1455,13 @@ InterpreterResult run_interpreter(InterpreterThread* thread, break; } - case InterpreterOpcode::I32WrapI64: { + case Opcode::I32WrapI64: { VALUE_TYPE_I64 value = POP_I64(); PUSH_I32(static_cast<uint32_t>(value)); break; } - case InterpreterOpcode::I64TruncSF32: { + case Opcode::I64TruncSF32: { VALUE_TYPE_F32 value = POP_F32(); TRAP_IF(is_nan_f32(value), InvalidConversionToInteger); TRAP_UNLESS(is_in_range_i64_trunc_s_f32(value), IntegerOverflow); @@ -1483,7 +1469,7 @@ InterpreterResult run_interpreter(InterpreterThread* thread, break; } - case InterpreterOpcode::I64TruncSF64: { + case Opcode::I64TruncSF64: { VALUE_TYPE_F64 value = POP_F64(); TRAP_IF(is_nan_f64(value), InvalidConversionToInteger); TRAP_UNLESS(is_in_range_i64_trunc_s_f64(value), IntegerOverflow); @@ -1491,7 +1477,7 @@ InterpreterResult run_interpreter(InterpreterThread* thread, break; } - case InterpreterOpcode::I64TruncUF32: { + case Opcode::I64TruncUF32: { VALUE_TYPE_F32 value = POP_F32(); TRAP_IF(is_nan_f32(value), InvalidConversionToInteger); TRAP_UNLESS(is_in_range_i64_trunc_u_f32(value), IntegerOverflow); @@ -1499,7 +1485,7 @@ InterpreterResult run_interpreter(InterpreterThread* thread, break; } - case InterpreterOpcode::I64TruncUF64: { + case Opcode::I64TruncUF64: { VALUE_TYPE_F64 value = POP_F64(); TRAP_IF(is_nan_f64(value), InvalidConversionToInteger); TRAP_UNLESS(is_in_range_i64_trunc_u_f64(value), IntegerOverflow); @@ -1507,45 +1493,45 @@ InterpreterResult run_interpreter(InterpreterThread* thread, break; } - case InterpreterOpcode::I64ExtendSI32: { + case Opcode::I64ExtendSI32: { VALUE_TYPE_I32 value = POP_I32(); PUSH_I64(static_cast<int64_t>(BITCAST_I32_TO_SIGNED(value))); break; } - case InterpreterOpcode::I64ExtendUI32: { + case Opcode::I64ExtendUI32: { VALUE_TYPE_I32 value = POP_I32(); PUSH_I64(static_cast<uint64_t>(value)); break; } - case InterpreterOpcode::F32ConvertSI32: { + case Opcode::F32ConvertSI32: { VALUE_TYPE_I32 value = POP_I32(); PUSH_F32( BITCAST_FROM_F32(static_cast<float>(BITCAST_I32_TO_SIGNED(value)))); break; } - case InterpreterOpcode::F32ConvertUI32: { + case Opcode::F32ConvertUI32: { VALUE_TYPE_I32 value = POP_I32(); PUSH_F32(BITCAST_FROM_F32(static_cast<float>(value))); break; } - case InterpreterOpcode::F32ConvertSI64: { + case Opcode::F32ConvertSI64: { VALUE_TYPE_I64 value = POP_I64(); PUSH_F32( BITCAST_FROM_F32(static_cast<float>(BITCAST_I64_TO_SIGNED(value)))); break; } - case InterpreterOpcode::F32ConvertUI64: { + case Opcode::F32ConvertUI64: { VALUE_TYPE_I64 value = POP_I64(); PUSH_F32(BITCAST_FROM_F32(wabt_convert_uint64_to_float(value))); break; } - case InterpreterOpcode::F32DemoteF64: { + case Opcode::F32DemoteF64: { VALUE_TYPE_F64 value = POP_F64(); if (WABT_LIKELY(is_in_range_f64_demote_f32(value))) { PUSH_F32(BITCAST_FROM_F32(static_cast<float>(BITCAST_TO_F64(value)))); @@ -1565,118 +1551,117 @@ InterpreterResult run_interpreter(InterpreterThread* thread, break; } - case InterpreterOpcode::F32ReinterpretI32: { + case Opcode::F32ReinterpretI32: { VALUE_TYPE_I32 value = POP_I32(); PUSH_F32(value); break; } - case InterpreterOpcode::F64ConvertSI32: { + case Opcode::F64ConvertSI32: { VALUE_TYPE_I32 value = POP_I32(); PUSH_F64(BITCAST_FROM_F64( static_cast<double>(BITCAST_I32_TO_SIGNED(value)))); break; } - case InterpreterOpcode::F64ConvertUI32: { + case Opcode::F64ConvertUI32: { VALUE_TYPE_I32 value = POP_I32(); PUSH_F64(BITCAST_FROM_F64(static_cast<double>(value))); break; } - case InterpreterOpcode::F64ConvertSI64: { + case Opcode::F64ConvertSI64: { VALUE_TYPE_I64 value = POP_I64(); PUSH_F64(BITCAST_FROM_F64( static_cast<double>(BITCAST_I64_TO_SIGNED(value)))); break; } - case InterpreterOpcode::F64ConvertUI64: { + case Opcode::F64ConvertUI64: { VALUE_TYPE_I64 value = POP_I64(); PUSH_F64(BITCAST_FROM_F64(wabt_convert_uint64_to_double(value))); break; } - case InterpreterOpcode::F64PromoteF32: { + case Opcode::F64PromoteF32: { VALUE_TYPE_F32 value = POP_F32(); PUSH_F64(BITCAST_FROM_F64(static_cast<double>(BITCAST_TO_F32(value)))); break; } - case InterpreterOpcode::F64ReinterpretI64: { + case Opcode::F64ReinterpretI64: { VALUE_TYPE_I64 value = POP_I64(); PUSH_F64(value); break; } - case InterpreterOpcode::I32ReinterpretF32: { + case Opcode::I32ReinterpretF32: { VALUE_TYPE_F32 value = POP_F32(); PUSH_I32(value); break; } - case InterpreterOpcode::I64ReinterpretF64: { + case Opcode::I64ReinterpretF64: { VALUE_TYPE_F64 value = POP_F64(); PUSH_I64(value); break; } - case InterpreterOpcode::I32Rotr: + case Opcode::I32Rotr: BINOP_ROT(I32, RIGHT); break; - case InterpreterOpcode::I32Rotl: + case Opcode::I32Rotl: BINOP_ROT(I32, LEFT); break; - case InterpreterOpcode::I64Rotr: + case Opcode::I64Rotr: BINOP_ROT(I64, RIGHT); break; - case InterpreterOpcode::I64Rotl: + case Opcode::I64Rotl: BINOP_ROT(I64, LEFT); break; - case InterpreterOpcode::I64Eqz: { + case Opcode::I64Eqz: { VALUE_TYPE_I64 value = POP_I64(); PUSH_I64(value == 0); break; } - case InterpreterOpcode::Alloca: { - InterpreterValue* old_value_stack_top = thread->value_stack_top; + case Opcode::Alloca: { + Value* old_value_stack_top = thread->value_stack_top; thread->value_stack_top += read_u32(&pc); CHECK_STACK(); memset(old_value_stack_top, 0, - (thread->value_stack_top - old_value_stack_top) * - sizeof(InterpreterValue)); + (thread->value_stack_top - old_value_stack_top) * sizeof(Value)); break; } - case InterpreterOpcode::BrUnless: { + case Opcode::BrUnless: { IstreamOffset new_pc = read_u32(&pc); if (!POP_I32()) GOTO(new_pc); break; } - case InterpreterOpcode::Drop: + case Opcode::Drop: (void)POP(); break; - case InterpreterOpcode::DropKeep: { + case Opcode::DropKeep: { uint32_t drop_count = read_u32(&pc); uint8_t keep_count = *pc++; DROP_KEEP(drop_count, keep_count); break; } - case InterpreterOpcode::Data: + case Opcode::Data: /* shouldn't ever execute this */ assert(0); break; - case InterpreterOpcode::Nop: + case Opcode::Nop: break; default: @@ -1690,7 +1675,7 @@ exit_loop: return result; } -void trace_pc(InterpreterThread* thread, Stream* stream) { +void trace_pc(Thread* thread, Stream* stream) { const uint8_t* istream = thread->env->istream->data.data(); const uint8_t* pc = &istream[thread->pc]; size_t value_stack_depth = @@ -1700,352 +1685,337 @@ void trace_pc(InterpreterThread* thread, Stream* stream) { stream->Writef("#%" PRIzd ". %4" PRIzd ": V:%-3" PRIzd "| ", call_stack_depth, pc - thread->env->istream->data.data(), value_stack_depth); - InterpreterOpcode opcode = static_cast<InterpreterOpcode>(*pc++); + Opcode opcode = static_cast<Opcode>(*pc++); switch (opcode) { - case InterpreterOpcode::Select: + case Opcode::Select: stream->Writef("%s %u, %" PRIu64 ", %" PRIu64 "\n", - get_interpreter_opcode_name(opcode), PICK(3).i32, - PICK(2).i64, PICK(1).i64); + get_opcode_name(opcode), PICK(3).i32, PICK(2).i64, + PICK(1).i64); break; - case InterpreterOpcode::Br: - stream->Writef("%s @%u\n", get_interpreter_opcode_name(opcode), - read_u32_at(pc)); + case Opcode::Br: + stream->Writef("%s @%u\n", get_opcode_name(opcode), read_u32_at(pc)); break; - case InterpreterOpcode::BrIf: - stream->Writef("%s @%u, %u\n", get_interpreter_opcode_name(opcode), - read_u32_at(pc), TOP().i32); + case Opcode::BrIf: + stream->Writef("%s @%u, %u\n", get_opcode_name(opcode), read_u32_at(pc), + TOP().i32); break; - case InterpreterOpcode::BrTable: { + case Opcode::BrTable: { Index num_targets = read_u32_at(pc); IstreamOffset table_offset = read_u32_at(pc + 4); VALUE_TYPE_I32 key = TOP().i32; stream->Writef("%s %u, $#%" PRIindex ", table:$%u\n", - get_interpreter_opcode_name(opcode), key, num_targets, - table_offset); + get_opcode_name(opcode), key, num_targets, table_offset); break; } - case InterpreterOpcode::Nop: - case InterpreterOpcode::Return: - case InterpreterOpcode::Unreachable: - case InterpreterOpcode::Drop: - stream->Writef("%s\n", get_interpreter_opcode_name(opcode)); + case Opcode::Nop: + case Opcode::Return: + case Opcode::Unreachable: + case Opcode::Drop: + stream->Writef("%s\n", get_opcode_name(opcode)); break; - case InterpreterOpcode::CurrentMemory: { + case Opcode::CurrentMemory: { Index memory_index = read_u32(&pc); - stream->Writef("%s $%" PRIindex "\n", get_interpreter_opcode_name(opcode), + stream->Writef("%s $%" PRIindex "\n", get_opcode_name(opcode), memory_index); break; } - case InterpreterOpcode::I32Const: - stream->Writef("%s $%u\n", get_interpreter_opcode_name(opcode), - read_u32_at(pc)); + case Opcode::I32Const: + stream->Writef("%s $%u\n", get_opcode_name(opcode), read_u32_at(pc)); break; - case InterpreterOpcode::I64Const: - stream->Writef("%s $%" PRIu64 "\n", get_interpreter_opcode_name(opcode), + case Opcode::I64Const: + stream->Writef("%s $%" PRIu64 "\n", get_opcode_name(opcode), read_u64_at(pc)); break; - case InterpreterOpcode::F32Const: - stream->Writef("%s $%g\n", get_interpreter_opcode_name(opcode), + case Opcode::F32Const: + stream->Writef("%s $%g\n", get_opcode_name(opcode), bitcast_u32_to_f32(read_u32_at(pc))); break; - case InterpreterOpcode::F64Const: - stream->Writef("%s $%g\n", get_interpreter_opcode_name(opcode), + case Opcode::F64Const: + stream->Writef("%s $%g\n", get_opcode_name(opcode), bitcast_u64_to_f64(read_u64_at(pc))); break; - case InterpreterOpcode::GetLocal: - case InterpreterOpcode::GetGlobal: - stream->Writef("%s $%u\n", get_interpreter_opcode_name(opcode), - read_u32_at(pc)); + case Opcode::GetLocal: + case Opcode::GetGlobal: + stream->Writef("%s $%u\n", get_opcode_name(opcode), read_u32_at(pc)); break; - case InterpreterOpcode::SetLocal: - case InterpreterOpcode::SetGlobal: - case InterpreterOpcode::TeeLocal: - stream->Writef("%s $%u, %u\n", get_interpreter_opcode_name(opcode), - read_u32_at(pc), TOP().i32); + case Opcode::SetLocal: + case Opcode::SetGlobal: + case Opcode::TeeLocal: + stream->Writef("%s $%u, %u\n", get_opcode_name(opcode), read_u32_at(pc), + TOP().i32); break; - case InterpreterOpcode::Call: - stream->Writef("%s @%u\n", get_interpreter_opcode_name(opcode), - read_u32_at(pc)); + case Opcode::Call: + stream->Writef("%s @%u\n", get_opcode_name(opcode), read_u32_at(pc)); break; - case InterpreterOpcode::CallIndirect: - stream->Writef("%s $%u, %u\n", get_interpreter_opcode_name(opcode), - read_u32_at(pc), TOP().i32); + case Opcode::CallIndirect: + stream->Writef("%s $%u, %u\n", get_opcode_name(opcode), read_u32_at(pc), + TOP().i32); break; - case InterpreterOpcode::CallHost: - stream->Writef("%s $%u\n", get_interpreter_opcode_name(opcode), - read_u32_at(pc)); + case Opcode::CallHost: + stream->Writef("%s $%u\n", get_opcode_name(opcode), read_u32_at(pc)); break; - case InterpreterOpcode::I32Load8S: - case InterpreterOpcode::I32Load8U: - case InterpreterOpcode::I32Load16S: - case InterpreterOpcode::I32Load16U: - case InterpreterOpcode::I64Load8S: - case InterpreterOpcode::I64Load8U: - case InterpreterOpcode::I64Load16S: - case InterpreterOpcode::I64Load16U: - case InterpreterOpcode::I64Load32S: - case InterpreterOpcode::I64Load32U: - case InterpreterOpcode::I32Load: - case InterpreterOpcode::I64Load: - case InterpreterOpcode::F32Load: - case InterpreterOpcode::F64Load: { + case Opcode::I32Load8S: + case Opcode::I32Load8U: + case Opcode::I32Load16S: + case Opcode::I32Load16U: + case Opcode::I64Load8S: + case Opcode::I64Load8U: + case Opcode::I64Load16S: + case Opcode::I64Load16U: + case Opcode::I64Load32S: + case Opcode::I64Load32U: + case Opcode::I32Load: + case Opcode::I64Load: + case Opcode::F32Load: + case Opcode::F64Load: { Index memory_index = read_u32(&pc); - stream->Writef("%s $%" PRIindex ":%u+$%u\n", - get_interpreter_opcode_name(opcode), memory_index, - TOP().i32, read_u32_at(pc)); + stream->Writef("%s $%" PRIindex ":%u+$%u\n", get_opcode_name(opcode), + memory_index, TOP().i32, read_u32_at(pc)); break; } - case InterpreterOpcode::I32Store8: - case InterpreterOpcode::I32Store16: - case InterpreterOpcode::I32Store: { + case Opcode::I32Store8: + case Opcode::I32Store16: + case Opcode::I32Store: { Index memory_index = read_u32(&pc); - stream->Writef("%s $%" PRIindex ":%u+$%u, %u\n", - get_interpreter_opcode_name(opcode), memory_index, - PICK(2).i32, read_u32_at(pc), PICK(1).i32); + stream->Writef("%s $%" PRIindex ":%u+$%u, %u\n", get_opcode_name(opcode), + memory_index, PICK(2).i32, read_u32_at(pc), PICK(1).i32); break; } - case InterpreterOpcode::I64Store8: - case InterpreterOpcode::I64Store16: - case InterpreterOpcode::I64Store32: - case InterpreterOpcode::I64Store: { + case Opcode::I64Store8: + case Opcode::I64Store16: + case Opcode::I64Store32: + case Opcode::I64Store: { Index memory_index = read_u32(&pc); stream->Writef("%s $%" PRIindex ":%u+$%u, %" PRIu64 "\n", - get_interpreter_opcode_name(opcode), memory_index, - PICK(2).i32, read_u32_at(pc), PICK(1).i64); + get_opcode_name(opcode), memory_index, PICK(2).i32, + read_u32_at(pc), PICK(1).i64); break; } - case InterpreterOpcode::F32Store: { + case Opcode::F32Store: { Index memory_index = read_u32(&pc); - stream->Writef("%s $%" PRIindex ":%u+$%u, %g\n", - get_interpreter_opcode_name(opcode), memory_index, - PICK(2).i32, read_u32_at(pc), + stream->Writef("%s $%" PRIindex ":%u+$%u, %g\n", get_opcode_name(opcode), + memory_index, PICK(2).i32, read_u32_at(pc), bitcast_u32_to_f32(PICK(1).f32_bits)); break; } - case InterpreterOpcode::F64Store: { + case Opcode::F64Store: { Index memory_index = read_u32(&pc); - stream->Writef("%s $%" PRIindex ":%u+$%u, %g\n", - get_interpreter_opcode_name(opcode), memory_index, - PICK(2).i32, read_u32_at(pc), + stream->Writef("%s $%" PRIindex ":%u+$%u, %g\n", get_opcode_name(opcode), + memory_index, PICK(2).i32, read_u32_at(pc), bitcast_u64_to_f64(PICK(1).f64_bits)); break; } - case InterpreterOpcode::GrowMemory: { + case Opcode::GrowMemory: { Index memory_index = read_u32(&pc); - stream->Writef("%s $%" PRIindex ":%u\n", - get_interpreter_opcode_name(opcode), memory_index, - TOP().i32); + stream->Writef("%s $%" PRIindex ":%u\n", get_opcode_name(opcode), + memory_index, TOP().i32); break; } - case InterpreterOpcode::I32Add: - case InterpreterOpcode::I32Sub: - case InterpreterOpcode::I32Mul: - case InterpreterOpcode::I32DivS: - case InterpreterOpcode::I32DivU: - case InterpreterOpcode::I32RemS: - case InterpreterOpcode::I32RemU: - case InterpreterOpcode::I32And: - case InterpreterOpcode::I32Or: - case InterpreterOpcode::I32Xor: - case InterpreterOpcode::I32Shl: - case InterpreterOpcode::I32ShrU: - case InterpreterOpcode::I32ShrS: - case InterpreterOpcode::I32Eq: - case InterpreterOpcode::I32Ne: - case InterpreterOpcode::I32LtS: - case InterpreterOpcode::I32LeS: - case InterpreterOpcode::I32LtU: - case InterpreterOpcode::I32LeU: - case InterpreterOpcode::I32GtS: - case InterpreterOpcode::I32GeS: - case InterpreterOpcode::I32GtU: - case InterpreterOpcode::I32GeU: - case InterpreterOpcode::I32Rotr: - case InterpreterOpcode::I32Rotl: - stream->Writef("%s %u, %u\n", get_interpreter_opcode_name(opcode), - PICK(2).i32, PICK(1).i32); + case Opcode::I32Add: + case Opcode::I32Sub: + case Opcode::I32Mul: + case Opcode::I32DivS: + case Opcode::I32DivU: + case Opcode::I32RemS: + case Opcode::I32RemU: + case Opcode::I32And: + case Opcode::I32Or: + case Opcode::I32Xor: + case Opcode::I32Shl: + case Opcode::I32ShrU: + case Opcode::I32ShrS: + case Opcode::I32Eq: + case Opcode::I32Ne: + case Opcode::I32LtS: + case Opcode::I32LeS: + case Opcode::I32LtU: + case Opcode::I32LeU: + case Opcode::I32GtS: + case Opcode::I32GeS: + case Opcode::I32GtU: + case Opcode::I32GeU: + case Opcode::I32Rotr: + case Opcode::I32Rotl: + stream->Writef("%s %u, %u\n", get_opcode_name(opcode), PICK(2).i32, + PICK(1).i32); break; - case InterpreterOpcode::I32Clz: - case InterpreterOpcode::I32Ctz: - case InterpreterOpcode::I32Popcnt: - case InterpreterOpcode::I32Eqz: - stream->Writef("%s %u\n", get_interpreter_opcode_name(opcode), TOP().i32); + case Opcode::I32Clz: + case Opcode::I32Ctz: + case Opcode::I32Popcnt: + case Opcode::I32Eqz: + stream->Writef("%s %u\n", get_opcode_name(opcode), TOP().i32); break; - case InterpreterOpcode::I64Add: - case InterpreterOpcode::I64Sub: - case InterpreterOpcode::I64Mul: - case InterpreterOpcode::I64DivS: - case InterpreterOpcode::I64DivU: - case InterpreterOpcode::I64RemS: - case InterpreterOpcode::I64RemU: - case InterpreterOpcode::I64And: - case InterpreterOpcode::I64Or: - case InterpreterOpcode::I64Xor: - case InterpreterOpcode::I64Shl: - case InterpreterOpcode::I64ShrU: - case InterpreterOpcode::I64ShrS: - case InterpreterOpcode::I64Eq: - case InterpreterOpcode::I64Ne: - case InterpreterOpcode::I64LtS: - case InterpreterOpcode::I64LeS: - case InterpreterOpcode::I64LtU: - case InterpreterOpcode::I64LeU: - case InterpreterOpcode::I64GtS: - case InterpreterOpcode::I64GeS: - case InterpreterOpcode::I64GtU: - case InterpreterOpcode::I64GeU: - case InterpreterOpcode::I64Rotr: - case InterpreterOpcode::I64Rotl: - stream->Writef("%s %" PRIu64 ", %" PRIu64 "\n", - get_interpreter_opcode_name(opcode), PICK(2).i64, - PICK(1).i64); + case Opcode::I64Add: + case Opcode::I64Sub: + case Opcode::I64Mul: + case Opcode::I64DivS: + case Opcode::I64DivU: + case Opcode::I64RemS: + case Opcode::I64RemU: + case Opcode::I64And: + case Opcode::I64Or: + case Opcode::I64Xor: + case Opcode::I64Shl: + case Opcode::I64ShrU: + case Opcode::I64ShrS: + case Opcode::I64Eq: + case Opcode::I64Ne: + case Opcode::I64LtS: + case Opcode::I64LeS: + case Opcode::I64LtU: + case Opcode::I64LeU: + case Opcode::I64GtS: + case Opcode::I64GeS: + case Opcode::I64GtU: + case Opcode::I64GeU: + case Opcode::I64Rotr: + case Opcode::I64Rotl: + stream->Writef("%s %" PRIu64 ", %" PRIu64 "\n", get_opcode_name(opcode), + PICK(2).i64, PICK(1).i64); break; - case InterpreterOpcode::I64Clz: - case InterpreterOpcode::I64Ctz: - case InterpreterOpcode::I64Popcnt: - case InterpreterOpcode::I64Eqz: - stream->Writef("%s %" PRIu64 "\n", get_interpreter_opcode_name(opcode), - TOP().i64); + case Opcode::I64Clz: + case Opcode::I64Ctz: + case Opcode::I64Popcnt: + case Opcode::I64Eqz: + stream->Writef("%s %" PRIu64 "\n", get_opcode_name(opcode), TOP().i64); break; - case InterpreterOpcode::F32Add: - case InterpreterOpcode::F32Sub: - case InterpreterOpcode::F32Mul: - case InterpreterOpcode::F32Div: - case InterpreterOpcode::F32Min: - case InterpreterOpcode::F32Max: - case InterpreterOpcode::F32Copysign: - case InterpreterOpcode::F32Eq: - case InterpreterOpcode::F32Ne: - case InterpreterOpcode::F32Lt: - case InterpreterOpcode::F32Le: - case InterpreterOpcode::F32Gt: - case InterpreterOpcode::F32Ge: - stream->Writef("%s %g, %g\n", get_interpreter_opcode_name(opcode), + case Opcode::F32Add: + case Opcode::F32Sub: + case Opcode::F32Mul: + case Opcode::F32Div: + case Opcode::F32Min: + case Opcode::F32Max: + case Opcode::F32Copysign: + case Opcode::F32Eq: + case Opcode::F32Ne: + case Opcode::F32Lt: + case Opcode::F32Le: + case Opcode::F32Gt: + case Opcode::F32Ge: + stream->Writef("%s %g, %g\n", get_opcode_name(opcode), bitcast_u32_to_f32(PICK(2).i32), bitcast_u32_to_f32(PICK(1).i32)); break; - case InterpreterOpcode::F32Abs: - case InterpreterOpcode::F32Neg: - case InterpreterOpcode::F32Ceil: - case InterpreterOpcode::F32Floor: - case InterpreterOpcode::F32Trunc: - case InterpreterOpcode::F32Nearest: - case InterpreterOpcode::F32Sqrt: - stream->Writef("%s %g\n", get_interpreter_opcode_name(opcode), + case Opcode::F32Abs: + case Opcode::F32Neg: + case Opcode::F32Ceil: + case Opcode::F32Floor: + case Opcode::F32Trunc: + case Opcode::F32Nearest: + case Opcode::F32Sqrt: + stream->Writef("%s %g\n", get_opcode_name(opcode), bitcast_u32_to_f32(TOP().i32)); break; - case InterpreterOpcode::F64Add: - case InterpreterOpcode::F64Sub: - case InterpreterOpcode::F64Mul: - case InterpreterOpcode::F64Div: - case InterpreterOpcode::F64Min: - case InterpreterOpcode::F64Max: - case InterpreterOpcode::F64Copysign: - case InterpreterOpcode::F64Eq: - case InterpreterOpcode::F64Ne: - case InterpreterOpcode::F64Lt: - case InterpreterOpcode::F64Le: - case InterpreterOpcode::F64Gt: - case InterpreterOpcode::F64Ge: - stream->Writef("%s %g, %g\n", get_interpreter_opcode_name(opcode), + case Opcode::F64Add: + case Opcode::F64Sub: + case Opcode::F64Mul: + case Opcode::F64Div: + case Opcode::F64Min: + case Opcode::F64Max: + case Opcode::F64Copysign: + case Opcode::F64Eq: + case Opcode::F64Ne: + case Opcode::F64Lt: + case Opcode::F64Le: + case Opcode::F64Gt: + case Opcode::F64Ge: + stream->Writef("%s %g, %g\n", get_opcode_name(opcode), bitcast_u64_to_f64(PICK(2).i64), bitcast_u64_to_f64(PICK(1).i64)); break; - case InterpreterOpcode::F64Abs: - case InterpreterOpcode::F64Neg: - case InterpreterOpcode::F64Ceil: - case InterpreterOpcode::F64Floor: - case InterpreterOpcode::F64Trunc: - case InterpreterOpcode::F64Nearest: - case InterpreterOpcode::F64Sqrt: - stream->Writef("%s %g\n", get_interpreter_opcode_name(opcode), + case Opcode::F64Abs: + case Opcode::F64Neg: + case Opcode::F64Ceil: + case Opcode::F64Floor: + case Opcode::F64Trunc: + case Opcode::F64Nearest: + case Opcode::F64Sqrt: + stream->Writef("%s %g\n", get_opcode_name(opcode), bitcast_u64_to_f64(TOP().i64)); break; - case InterpreterOpcode::I32TruncSF32: - case InterpreterOpcode::I32TruncUF32: - case InterpreterOpcode::I64TruncSF32: - case InterpreterOpcode::I64TruncUF32: - case InterpreterOpcode::F64PromoteF32: - case InterpreterOpcode::I32ReinterpretF32: - stream->Writef("%s %g\n", get_interpreter_opcode_name(opcode), + case Opcode::I32TruncSF32: + case Opcode::I32TruncUF32: + case Opcode::I64TruncSF32: + case Opcode::I64TruncUF32: + case Opcode::F64PromoteF32: + case Opcode::I32ReinterpretF32: + stream->Writef("%s %g\n", get_opcode_name(opcode), bitcast_u32_to_f32(TOP().i32)); break; - case InterpreterOpcode::I32TruncSF64: - case InterpreterOpcode::I32TruncUF64: - case InterpreterOpcode::I64TruncSF64: - case InterpreterOpcode::I64TruncUF64: - case InterpreterOpcode::F32DemoteF64: - case InterpreterOpcode::I64ReinterpretF64: - stream->Writef("%s %g\n", get_interpreter_opcode_name(opcode), + case Opcode::I32TruncSF64: + case Opcode::I32TruncUF64: + case Opcode::I64TruncSF64: + case Opcode::I64TruncUF64: + case Opcode::F32DemoteF64: + case Opcode::I64ReinterpretF64: + stream->Writef("%s %g\n", get_opcode_name(opcode), bitcast_u64_to_f64(TOP().i64)); break; - case InterpreterOpcode::I32WrapI64: - case InterpreterOpcode::F32ConvertSI64: - case InterpreterOpcode::F32ConvertUI64: - case InterpreterOpcode::F64ConvertSI64: - case InterpreterOpcode::F64ConvertUI64: - case InterpreterOpcode::F64ReinterpretI64: - stream->Writef("%s %" PRIu64 "\n", get_interpreter_opcode_name(opcode), - TOP().i64); + case Opcode::I32WrapI64: + case Opcode::F32ConvertSI64: + case Opcode::F32ConvertUI64: + case Opcode::F64ConvertSI64: + case Opcode::F64ConvertUI64: + case Opcode::F64ReinterpretI64: + stream->Writef("%s %" PRIu64 "\n", get_opcode_name(opcode), TOP().i64); break; - case InterpreterOpcode::I64ExtendSI32: - case InterpreterOpcode::I64ExtendUI32: - case InterpreterOpcode::F32ConvertSI32: - case InterpreterOpcode::F32ConvertUI32: - case InterpreterOpcode::F32ReinterpretI32: - case InterpreterOpcode::F64ConvertSI32: - case InterpreterOpcode::F64ConvertUI32: - stream->Writef("%s %u\n", get_interpreter_opcode_name(opcode), TOP().i32); + case Opcode::I64ExtendSI32: + case Opcode::I64ExtendUI32: + case Opcode::F32ConvertSI32: + case Opcode::F32ConvertUI32: + case Opcode::F32ReinterpretI32: + case Opcode::F64ConvertSI32: + case Opcode::F64ConvertUI32: + stream->Writef("%s %u\n", get_opcode_name(opcode), TOP().i32); break; - case InterpreterOpcode::Alloca: - stream->Writef("%s $%u\n", get_interpreter_opcode_name(opcode), - read_u32_at(pc)); + case Opcode::Alloca: + stream->Writef("%s $%u\n", get_opcode_name(opcode), read_u32_at(pc)); break; - case InterpreterOpcode::BrUnless: - stream->Writef("%s @%u, %u\n", get_interpreter_opcode_name(opcode), - read_u32_at(pc), TOP().i32); + case Opcode::BrUnless: + stream->Writef("%s @%u, %u\n", get_opcode_name(opcode), read_u32_at(pc), + TOP().i32); break; - case InterpreterOpcode::DropKeep: - stream->Writef("%s $%u $%u\n", get_interpreter_opcode_name(opcode), - read_u32_at(pc), *(pc + 4)); + case Opcode::DropKeep: + stream->Writef("%s $%u $%u\n", get_opcode_name(opcode), read_u32_at(pc), + *(pc + 4)); break; - case InterpreterOpcode::Data: + case Opcode::Data: /* shouldn't ever execute this */ assert(0); break; @@ -2056,7 +2026,7 @@ void trace_pc(InterpreterThread* thread, Stream* stream) { } } -void disassemble(InterpreterEnvironment* env, +void disassemble(Environment* env, Stream* stream, IstreamOffset from, IstreamOffset to) { @@ -2071,293 +2041,279 @@ void disassemble(InterpreterEnvironment* env, while (static_cast<IstreamOffset>(pc - istream) < to) { stream->Writef("%4" PRIzd "| ", pc - istream); - InterpreterOpcode opcode = static_cast<InterpreterOpcode>(*pc++); + Opcode opcode = static_cast<Opcode>(*pc++); switch (opcode) { - case InterpreterOpcode::Select: - stream->Writef("%s %%[-3], %%[-2], %%[-1]\n", - get_interpreter_opcode_name(opcode)); + case Opcode::Select: + stream->Writef("%s %%[-3], %%[-2], %%[-1]\n", get_opcode_name(opcode)); break; - case InterpreterOpcode::Br: - stream->Writef("%s @%u\n", get_interpreter_opcode_name(opcode), - read_u32(&pc)); + case Opcode::Br: + stream->Writef("%s @%u\n", get_opcode_name(opcode), read_u32(&pc)); break; - case InterpreterOpcode::BrIf: - stream->Writef("%s @%u, %%[-1]\n", get_interpreter_opcode_name(opcode), + case Opcode::BrIf: + stream->Writef("%s @%u, %%[-1]\n", get_opcode_name(opcode), read_u32(&pc)); break; - case InterpreterOpcode::BrTable: { + case Opcode::BrTable: { Index num_targets = read_u32(&pc); IstreamOffset table_offset = read_u32(&pc); stream->Writef("%s %%[-1], $#%" PRIindex ", table:$%u\n", - get_interpreter_opcode_name(opcode), num_targets, - table_offset); + get_opcode_name(opcode), num_targets, table_offset); break; } - case InterpreterOpcode::Nop: - case InterpreterOpcode::Return: - case InterpreterOpcode::Unreachable: - case InterpreterOpcode::Drop: - stream->Writef("%s\n", get_interpreter_opcode_name(opcode)); + case Opcode::Nop: + case Opcode::Return: + case Opcode::Unreachable: + case Opcode::Drop: + stream->Writef("%s\n", get_opcode_name(opcode)); break; - case InterpreterOpcode::CurrentMemory: { + case Opcode::CurrentMemory: { Index memory_index = read_u32(&pc); - stream->Writef("%s $%" PRIindex "\n", - get_interpreter_opcode_name(opcode), memory_index); + stream->Writef("%s $%" PRIindex "\n", get_opcode_name(opcode), + memory_index); break; } - case InterpreterOpcode::I32Const: - stream->Writef("%s $%u\n", get_interpreter_opcode_name(opcode), - read_u32(&pc)); + case Opcode::I32Const: + stream->Writef("%s $%u\n", get_opcode_name(opcode), read_u32(&pc)); break; - case InterpreterOpcode::I64Const: - stream->Writef("%s $%" PRIu64 "\n", get_interpreter_opcode_name(opcode), + case Opcode::I64Const: + stream->Writef("%s $%" PRIu64 "\n", get_opcode_name(opcode), read_u64(&pc)); break; - case InterpreterOpcode::F32Const: - stream->Writef("%s $%g\n", get_interpreter_opcode_name(opcode), + case Opcode::F32Const: + stream->Writef("%s $%g\n", get_opcode_name(opcode), bitcast_u32_to_f32(read_u32(&pc))); break; - case InterpreterOpcode::F64Const: - stream->Writef("%s $%g\n", get_interpreter_opcode_name(opcode), + case Opcode::F64Const: + stream->Writef("%s $%g\n", get_opcode_name(opcode), bitcast_u64_to_f64(read_u64(&pc))); break; - case InterpreterOpcode::GetLocal: - case InterpreterOpcode::GetGlobal: - stream->Writef("%s $%u\n", get_interpreter_opcode_name(opcode), - read_u32(&pc)); + case Opcode::GetLocal: + case Opcode::GetGlobal: + stream->Writef("%s $%u\n", get_opcode_name(opcode), read_u32(&pc)); break; - case InterpreterOpcode::SetLocal: - case InterpreterOpcode::SetGlobal: - case InterpreterOpcode::TeeLocal: - stream->Writef("%s $%u, %%[-1]\n", get_interpreter_opcode_name(opcode), + case Opcode::SetLocal: + case Opcode::SetGlobal: + case Opcode::TeeLocal: + stream->Writef("%s $%u, %%[-1]\n", get_opcode_name(opcode), read_u32(&pc)); break; - case InterpreterOpcode::Call: - stream->Writef("%s @%u\n", get_interpreter_opcode_name(opcode), - read_u32(&pc)); + case Opcode::Call: + stream->Writef("%s @%u\n", get_opcode_name(opcode), read_u32(&pc)); break; - case InterpreterOpcode::CallIndirect: { + case Opcode::CallIndirect: { Index table_index = read_u32(&pc); stream->Writef("%s $%" PRIindex ":%u, %%[-1]\n", - get_interpreter_opcode_name(opcode), table_index, - read_u32(&pc)); + get_opcode_name(opcode), table_index, read_u32(&pc)); break; } - case InterpreterOpcode::CallHost: - stream->Writef("%s $%u\n", get_interpreter_opcode_name(opcode), - read_u32(&pc)); - break; - - case InterpreterOpcode::I32Load8S: - case InterpreterOpcode::I32Load8U: - case InterpreterOpcode::I32Load16S: - case InterpreterOpcode::I32Load16U: - case InterpreterOpcode::I64Load8S: - case InterpreterOpcode::I64Load8U: - case InterpreterOpcode::I64Load16S: - case InterpreterOpcode::I64Load16U: - case InterpreterOpcode::I64Load32S: - case InterpreterOpcode::I64Load32U: - case InterpreterOpcode::I32Load: - case InterpreterOpcode::I64Load: - case InterpreterOpcode::F32Load: - case InterpreterOpcode::F64Load: { + case Opcode::CallHost: + stream->Writef("%s $%u\n", get_opcode_name(opcode), read_u32(&pc)); + break; + + case Opcode::I32Load8S: + case Opcode::I32Load8U: + case Opcode::I32Load16S: + case Opcode::I32Load16U: + case Opcode::I64Load8S: + case Opcode::I64Load8U: + case Opcode::I64Load16S: + case Opcode::I64Load16U: + case Opcode::I64Load32S: + case Opcode::I64Load32U: + case Opcode::I32Load: + case Opcode::I64Load: + case Opcode::F32Load: + case Opcode::F64Load: { Index memory_index = read_u32(&pc); stream->Writef("%s $%" PRIindex ":%%[-1]+$%u\n", - get_interpreter_opcode_name(opcode), memory_index, - read_u32(&pc)); + get_opcode_name(opcode), memory_index, read_u32(&pc)); break; } - case InterpreterOpcode::I32Store8: - case InterpreterOpcode::I32Store16: - case InterpreterOpcode::I32Store: - case InterpreterOpcode::I64Store8: - case InterpreterOpcode::I64Store16: - case InterpreterOpcode::I64Store32: - case InterpreterOpcode::I64Store: - case InterpreterOpcode::F32Store: - case InterpreterOpcode::F64Store: { + case Opcode::I32Store8: + case Opcode::I32Store16: + case Opcode::I32Store: + case Opcode::I64Store8: + case Opcode::I64Store16: + case Opcode::I64Store32: + case Opcode::I64Store: + case Opcode::F32Store: + case Opcode::F64Store: { Index memory_index = read_u32(&pc); stream->Writef("%s %%[-2]+$%" PRIindex ", $%u:%%[-1]\n", - get_interpreter_opcode_name(opcode), memory_index, - read_u32(&pc)); + get_opcode_name(opcode), memory_index, read_u32(&pc)); break; } - case InterpreterOpcode::I32Add: - case InterpreterOpcode::I32Sub: - case InterpreterOpcode::I32Mul: - case InterpreterOpcode::I32DivS: - case InterpreterOpcode::I32DivU: - case InterpreterOpcode::I32RemS: - case InterpreterOpcode::I32RemU: - case InterpreterOpcode::I32And: - case InterpreterOpcode::I32Or: - case InterpreterOpcode::I32Xor: - case InterpreterOpcode::I32Shl: - case InterpreterOpcode::I32ShrU: - case InterpreterOpcode::I32ShrS: - case InterpreterOpcode::I32Eq: - case InterpreterOpcode::I32Ne: - case InterpreterOpcode::I32LtS: - case InterpreterOpcode::I32LeS: - case InterpreterOpcode::I32LtU: - case InterpreterOpcode::I32LeU: - case InterpreterOpcode::I32GtS: - case InterpreterOpcode::I32GeS: - case InterpreterOpcode::I32GtU: - case InterpreterOpcode::I32GeU: - case InterpreterOpcode::I32Rotr: - case InterpreterOpcode::I32Rotl: - case InterpreterOpcode::F32Add: - case InterpreterOpcode::F32Sub: - case InterpreterOpcode::F32Mul: - case InterpreterOpcode::F32Div: - case InterpreterOpcode::F32Min: - case InterpreterOpcode::F32Max: - case InterpreterOpcode::F32Copysign: - case InterpreterOpcode::F32Eq: - case InterpreterOpcode::F32Ne: - case InterpreterOpcode::F32Lt: - case InterpreterOpcode::F32Le: - case InterpreterOpcode::F32Gt: - case InterpreterOpcode::F32Ge: - case InterpreterOpcode::I64Add: - case InterpreterOpcode::I64Sub: - case InterpreterOpcode::I64Mul: - case InterpreterOpcode::I64DivS: - case InterpreterOpcode::I64DivU: - case InterpreterOpcode::I64RemS: - case InterpreterOpcode::I64RemU: - case InterpreterOpcode::I64And: - case InterpreterOpcode::I64Or: - case InterpreterOpcode::I64Xor: - case InterpreterOpcode::I64Shl: - case InterpreterOpcode::I64ShrU: - case InterpreterOpcode::I64ShrS: - case InterpreterOpcode::I64Eq: - case InterpreterOpcode::I64Ne: - case InterpreterOpcode::I64LtS: - case InterpreterOpcode::I64LeS: - case InterpreterOpcode::I64LtU: - case InterpreterOpcode::I64LeU: - case InterpreterOpcode::I64GtS: - case InterpreterOpcode::I64GeS: - case InterpreterOpcode::I64GtU: - case InterpreterOpcode::I64GeU: - case InterpreterOpcode::I64Rotr: - case InterpreterOpcode::I64Rotl: - case InterpreterOpcode::F64Add: - case InterpreterOpcode::F64Sub: - case InterpreterOpcode::F64Mul: - case InterpreterOpcode::F64Div: - case InterpreterOpcode::F64Min: - case InterpreterOpcode::F64Max: - case InterpreterOpcode::F64Copysign: - case InterpreterOpcode::F64Eq: - case InterpreterOpcode::F64Ne: - case InterpreterOpcode::F64Lt: - case InterpreterOpcode::F64Le: - case InterpreterOpcode::F64Gt: - case InterpreterOpcode::F64Ge: - stream->Writef("%s %%[-2], %%[-1]\n", - get_interpreter_opcode_name(opcode)); - break; - - case InterpreterOpcode::I32Clz: - case InterpreterOpcode::I32Ctz: - case InterpreterOpcode::I32Popcnt: - case InterpreterOpcode::I32Eqz: - case InterpreterOpcode::I64Clz: - case InterpreterOpcode::I64Ctz: - case InterpreterOpcode::I64Popcnt: - case InterpreterOpcode::I64Eqz: - case InterpreterOpcode::F32Abs: - case InterpreterOpcode::F32Neg: - case InterpreterOpcode::F32Ceil: - case InterpreterOpcode::F32Floor: - case InterpreterOpcode::F32Trunc: - case InterpreterOpcode::F32Nearest: - case InterpreterOpcode::F32Sqrt: - case InterpreterOpcode::F64Abs: - case InterpreterOpcode::F64Neg: - case InterpreterOpcode::F64Ceil: - case InterpreterOpcode::F64Floor: - case InterpreterOpcode::F64Trunc: - case InterpreterOpcode::F64Nearest: - case InterpreterOpcode::F64Sqrt: - case InterpreterOpcode::I32TruncSF32: - case InterpreterOpcode::I32TruncUF32: - case InterpreterOpcode::I64TruncSF32: - case InterpreterOpcode::I64TruncUF32: - case InterpreterOpcode::F64PromoteF32: - case InterpreterOpcode::I32ReinterpretF32: - case InterpreterOpcode::I32TruncSF64: - case InterpreterOpcode::I32TruncUF64: - case InterpreterOpcode::I64TruncSF64: - case InterpreterOpcode::I64TruncUF64: - case InterpreterOpcode::F32DemoteF64: - case InterpreterOpcode::I64ReinterpretF64: - case InterpreterOpcode::I32WrapI64: - case InterpreterOpcode::F32ConvertSI64: - case InterpreterOpcode::F32ConvertUI64: - case InterpreterOpcode::F64ConvertSI64: - case InterpreterOpcode::F64ConvertUI64: - case InterpreterOpcode::F64ReinterpretI64: - case InterpreterOpcode::I64ExtendSI32: - case InterpreterOpcode::I64ExtendUI32: - case InterpreterOpcode::F32ConvertSI32: - case InterpreterOpcode::F32ConvertUI32: - case InterpreterOpcode::F32ReinterpretI32: - case InterpreterOpcode::F64ConvertSI32: - case InterpreterOpcode::F64ConvertUI32: - stream->Writef("%s %%[-1]\n", get_interpreter_opcode_name(opcode)); - break; - - case InterpreterOpcode::GrowMemory: { + case Opcode::I32Add: + case Opcode::I32Sub: + case Opcode::I32Mul: + case Opcode::I32DivS: + case Opcode::I32DivU: + case Opcode::I32RemS: + case Opcode::I32RemU: + case Opcode::I32And: + case Opcode::I32Or: + case Opcode::I32Xor: + case Opcode::I32Shl: + case Opcode::I32ShrU: + case Opcode::I32ShrS: + case Opcode::I32Eq: + case Opcode::I32Ne: + case Opcode::I32LtS: + case Opcode::I32LeS: + case Opcode::I32LtU: + case Opcode::I32LeU: + case Opcode::I32GtS: + case Opcode::I32GeS: + case Opcode::I32GtU: + case Opcode::I32GeU: + case Opcode::I32Rotr: + case Opcode::I32Rotl: + case Opcode::F32Add: + case Opcode::F32Sub: + case Opcode::F32Mul: + case Opcode::F32Div: + case Opcode::F32Min: + case Opcode::F32Max: + case Opcode::F32Copysign: + case Opcode::F32Eq: + case Opcode::F32Ne: + case Opcode::F32Lt: + case Opcode::F32Le: + case Opcode::F32Gt: + case Opcode::F32Ge: + case Opcode::I64Add: + case Opcode::I64Sub: + case Opcode::I64Mul: + case Opcode::I64DivS: + case Opcode::I64DivU: + case Opcode::I64RemS: + case Opcode::I64RemU: + case Opcode::I64And: + case Opcode::I64Or: + case Opcode::I64Xor: + case Opcode::I64Shl: + case Opcode::I64ShrU: + case Opcode::I64ShrS: + case Opcode::I64Eq: + case Opcode::I64Ne: + case Opcode::I64LtS: + case Opcode::I64LeS: + case Opcode::I64LtU: + case Opcode::I64LeU: + case Opcode::I64GtS: + case Opcode::I64GeS: + case Opcode::I64GtU: + case Opcode::I64GeU: + case Opcode::I64Rotr: + case Opcode::I64Rotl: + case Opcode::F64Add: + case Opcode::F64Sub: + case Opcode::F64Mul: + case Opcode::F64Div: + case Opcode::F64Min: + case Opcode::F64Max: + case Opcode::F64Copysign: + case Opcode::F64Eq: + case Opcode::F64Ne: + case Opcode::F64Lt: + case Opcode::F64Le: + case Opcode::F64Gt: + case Opcode::F64Ge: + stream->Writef("%s %%[-2], %%[-1]\n", get_opcode_name(opcode)); + break; + + case Opcode::I32Clz: + case Opcode::I32Ctz: + case Opcode::I32Popcnt: + case Opcode::I32Eqz: + case Opcode::I64Clz: + case Opcode::I64Ctz: + case Opcode::I64Popcnt: + case Opcode::I64Eqz: + case Opcode::F32Abs: + case Opcode::F32Neg: + case Opcode::F32Ceil: + case Opcode::F32Floor: + case Opcode::F32Trunc: + case Opcode::F32Nearest: + case Opcode::F32Sqrt: + case Opcode::F64Abs: + case Opcode::F64Neg: + case Opcode::F64Ceil: + case Opcode::F64Floor: + case Opcode::F64Trunc: + case Opcode::F64Nearest: + case Opcode::F64Sqrt: + case Opcode::I32TruncSF32: + case Opcode::I32TruncUF32: + case Opcode::I64TruncSF32: + case Opcode::I64TruncUF32: + case Opcode::F64PromoteF32: + case Opcode::I32ReinterpretF32: + case Opcode::I32TruncSF64: + case Opcode::I32TruncUF64: + case Opcode::I64TruncSF64: + case Opcode::I64TruncUF64: + case Opcode::F32DemoteF64: + case Opcode::I64ReinterpretF64: + case Opcode::I32WrapI64: + case Opcode::F32ConvertSI64: + case Opcode::F32ConvertUI64: + case Opcode::F64ConvertSI64: + case Opcode::F64ConvertUI64: + case Opcode::F64ReinterpretI64: + case Opcode::I64ExtendSI32: + case Opcode::I64ExtendUI32: + case Opcode::F32ConvertSI32: + case Opcode::F32ConvertUI32: + case Opcode::F32ReinterpretI32: + case Opcode::F64ConvertSI32: + case Opcode::F64ConvertUI32: + stream->Writef("%s %%[-1]\n", get_opcode_name(opcode)); + break; + + case Opcode::GrowMemory: { Index memory_index = read_u32(&pc); - stream->Writef("%s $%" PRIindex ":%%[-1]\n", - get_interpreter_opcode_name(opcode), memory_index); + stream->Writef("%s $%" PRIindex ":%%[-1]\n", get_opcode_name(opcode), + memory_index); break; } - case InterpreterOpcode::Alloca: - stream->Writef("%s $%u\n", get_interpreter_opcode_name(opcode), - read_u32(&pc)); + case Opcode::Alloca: + stream->Writef("%s $%u\n", get_opcode_name(opcode), read_u32(&pc)); break; - case InterpreterOpcode::BrUnless: - stream->Writef("%s @%u, %%[-1]\n", get_interpreter_opcode_name(opcode), + case Opcode::BrUnless: + stream->Writef("%s @%u, %%[-1]\n", get_opcode_name(opcode), read_u32(&pc)); break; - case InterpreterOpcode::DropKeep: { + case Opcode::DropKeep: { uint32_t drop = read_u32(&pc); uint8_t keep = *pc++; - stream->Writef("%s $%u $%u\n", get_interpreter_opcode_name(opcode), - drop, keep); + stream->Writef("%s $%u $%u\n", get_opcode_name(opcode), drop, keep); break; } - case InterpreterOpcode::Data: { + case Opcode::Data: { uint32_t num_bytes = read_u32(&pc); - stream->Writef("%s $%u\n", get_interpreter_opcode_name(opcode), - num_bytes); + stream->Writef("%s $%u\n", get_opcode_name(opcode), num_bytes); /* for now, the only reason this is emitted is for br_table, so display * it as a list of table entries */ if (num_bytes % WABT_TABLE_ENTRY_SIZE == 0) { @@ -2388,12 +2344,11 @@ void disassemble(InterpreterEnvironment* env, } } -void disassemble_module(InterpreterEnvironment* env, - Stream* stream, - InterpreterModule* module) { +void disassemble_module(Environment* env, Stream* stream, Module* module) { assert(!module->is_host); disassemble(env, stream, module->as_defined()->istream_start, module->as_defined()->istream_end); } +} // namespace interpreter } // namespace wabt |