aboutsummaryrefslogtreecommitdiff
path: root/src/interp/ops.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/interp/ops.c')
-rw-r--r--src/interp/ops.c278
1 files changed, 278 insertions, 0 deletions
diff --git a/src/interp/ops.c b/src/interp/ops.c
new file mode 100644
index 0000000..6135f96
--- /dev/null
+++ b/src/interp/ops.c
@@ -0,0 +1,278 @@
+/*
+ * nanowasm, a tiny WebAssembly/Wasm interpreter
+ * Copyright (C) 2023-2025 Xavier Del Campo Romero
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/.
+ */
+
+#include <nanowasm/nw.h>
+#include <nw/opcodes.h>
+#include <nw/ops.h>
+#include <nw/interp.h>
+
+static void (*const ops[])(struct nw_interp *) =
+{
+ nwp_op_unreachable, /* OP_UNREACHABLE */
+ nwp_op_nop, /* OP_NOP */
+ nwp_op_block, /* OP_BLOCK */
+ nwp_op_loop, /* OP_LOOP */
+ NULL, /* OP_IF */
+ NULL, /* OP_ELSE */
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ nwp_op_end, /* OP_END */
+ nwp_op_br, /* OP_BR */
+ nwp_op_br_if, /* OP_BR_IF */
+ NULL, /* OP_BR_TABLE */
+ nwp_op_return, /* OP_RETURN */
+ nwp_op_call, /* OP_CALL */
+ nwp_op_call_indirect, /* OP_CALL_INDIRECT */
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ nwp_op_drop, /* OP_DROP */
+ NULL, /* OP_SELECT */
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ nwp_op_get_local, /* OP_GET_LOCAL */
+ nwp_op_set_local, /* OP_SET_LOCAL */
+ nwp_op_tee_local, /* OP_TEE_LOCAL */
+ nwp_op_get_global, /* OP_GET_GLOBAL */
+ nwp_op_set_global, /* OP_SET_GLOBAL */
+ NULL,
+ NULL,
+ NULL,
+ nwp_op_i32_load, /* OP_I32_LOAD */
+ NULL, /* OP_I64_LOAD */
+ NULL, /* OP_F32_LOAD */
+ NULL, /* OP_F64_LOAD */
+ NULL, /* OP_I32_LOAD8_S */
+ nwp_op_i32_load8_u, /* OP_I32_LOAD8_U */
+ NULL, /* OP_I32_LOAD16_S */
+ NULL, /* OP_I32_LOAD16_U */
+ NULL, /* OP_I64_LOAD8_S */
+ NULL, /* OP_I64_LOAD8_U */
+ NULL, /* OP_I64_LOAD16_S */
+ NULL, /* OP_I64_LOAD16_U */
+ NULL, /* OP_I64_LOAD32_S */
+ NULL, /* OP_I64_LOAD32_U */
+ nwp_op_i32_store, /* OP_I32_STORE */
+ nwp_op_i64_store, /* OP_I64_STORE */
+ NULL, /* OP_F32_STORE */
+ NULL, /* OP_F64_STORE */
+ NULL, /* OP_I32_STORE8 */
+ NULL, /* OP_I32_STORE16 */
+ NULL, /* OP_I64_STORE8 */
+ NULL, /* OP_I64_STORE16 */
+ NULL, /* OP_I64_STORE32 */
+ NULL, /* OP_CURRENT_MEMORY */
+ NULL, /* OP_GROW_MEMORY */
+ nwp_op_i32_const, /* OP_I32_CONST */
+ nwp_op_i64_const, /* OP_I64_CONST */
+ NULL, /* OP_F32_CONST */
+ NULL, /* OP_F64_CONST */
+ nwp_op_i32_eqz, /* OP_I32_EQZ */
+ nwp_op_i32_eq, /* OP_I32_EQ */
+ nwp_op_i32_ne, /* OP_I32_NE */
+ nwp_op_i32_lt_s, /* OP_I32_LT_S */
+ NULL, /* OP_I32_LT_U */
+ NULL, /* OP_I32_GT_S */
+ NULL, /* OP_I32_GT_U */
+ NULL, /* OP_I32_LE_S */
+ NULL, /* OP_I32_LE_U */
+ nwp_op_i32_ge_s, /* OP_I32_GE_S */
+ nwp_op_i32_ge_u, /* OP_I32_GE_U */
+ NULL, /* OP_I64_EQZ */
+ NULL, /* OP_I64_EQ */
+ NULL, /* OP_I64_NE */
+ NULL, /* OP_I64_LT_S */
+ NULL, /* OP_I64_LT_U */
+ NULL, /* OP_I64_GT_S */
+ NULL, /* OP_I64_GT_U */
+ NULL, /* OP_I64_LE_S */
+ NULL, /* OP_I64_LE_U */
+ NULL, /* OP_I64_GE_S */
+ NULL, /* OP_I64_GE_U */
+ NULL, /* OP_F32_EQ */
+ NULL, /* OP_F32_NE */
+ NULL, /* OP_F32_LT */
+ NULL, /* OP_F32_GT */
+ NULL, /* OP_F32_LE */
+ NULL, /* OP_F32_GE */
+ NULL, /* OP_F64_EQ */
+ NULL, /* OP_F64_NE */
+ NULL, /* OP_F64_LT */
+ NULL, /* OP_F64_GT */
+ NULL, /* OP_F64_LE */
+ NULL, /* OP_F64_GE */
+ NULL, /* OP_I32_CLZ */
+ NULL, /* OP_I32_CTZ */
+ NULL, /* OP_I32_POPCNT */
+ nwp_op_i32_add, /* OP_I32_ADD */
+ nwp_op_i32_sub, /* OP_I32_SUB */
+ nwp_op_i32_mul, /* OP_I32_MUL */
+ NULL, /* OP_I32_DIV_S */
+ NULL, /* OP_I32_DIV_U */
+ NULL, /* OP_I32_REM_S */
+ NULL, /* OP_I32_REM_U */
+ nwp_op_i32_and, /* OP_I32_AND */
+ nwp_op_i32_or, /* OP_I32_OR */
+ NULL, /* OP_I32_XOR */
+ NULL, /* OP_I32_SHL */
+ NULL, /* OP_I32_SHR_S */
+ NULL, /* OP_I32_SHR_U */
+ NULL, /* OP_I32_ROTL */
+ NULL, /* OP_I32_ROTR */
+ NULL, /* OP_I64_CLZ */
+ NULL, /* OP_I64_CTZ */
+ NULL, /* OP_I64_POPCNT */
+ NULL, /* OP_I64_ADD */
+ NULL, /* OP_I64_SUB */
+ NULL, /* OP_I64_MUL */
+ NULL, /* OP_I64_DIV_S */
+ NULL, /* OP_I64_DIV_U */
+ NULL, /* OP_I64_REM_S */
+ NULL, /* OP_I64_REM_U */
+ NULL, /* OP_I64_AND */
+ NULL, /* OP_I64_OR */
+ NULL, /* OP_I64_XOR */
+ NULL, /* OP_I64_SHL */
+ NULL, /* OP_I64_SHR_S */
+ NULL, /* OP_I64_SHR_U */
+ NULL, /* OP_I64_ROTL */
+ NULL, /* OP_I64_ROTR */
+ NULL, /* OP_F32_ABS */
+ NULL, /* OP_F32_NEG */
+ NULL, /* OP_F32_CEIL */
+ NULL, /* OP_F32_FLOOR */
+ NULL, /* OP_F32_TRUNC */
+ NULL, /* OP_F32_NEAREST */
+ NULL, /* OP_F32_SQRT */
+ NULL, /* OP_F32_ADD */
+ NULL, /* OP_F32_SUB */
+ NULL, /* OP_F32_MUL */
+ NULL, /* OP_F32_DIV */
+ NULL, /* OP_F32_MIN */
+ NULL, /* OP_F32_MAX */
+ NULL, /* OP_F32_COPYSIGN */
+ NULL, /* OP_F64_ABS */
+ NULL, /* OP_F64_NEG */
+ NULL, /* OP_F64_CEIL */
+ NULL, /* OP_F64_FLOOR */
+ NULL, /* OP_F64_TRUNC */
+ NULL, /* OP_F64_NEAREST */
+ NULL, /* OP_F64_SQRT */
+ NULL, /* OP_F64_ADD */
+ NULL, /* OP_F64_SUB */
+ NULL, /* OP_F64_MUL */
+ NULL, /* OP_F64_DIV */
+ NULL, /* OP_F64_MIN */
+ NULL, /* OP_F64_MAX */
+ NULL, /* OP_F64_COPYSIGN */
+ NULL, /* OP_I32_WRAP_I64 */
+ NULL, /* OP_I32_TRUNC_S_F32 */
+ NULL, /* OP_I32_TRUNC_U_F32 */
+ NULL, /* OP_I32_TRUNC_S_F64 */
+ NULL, /* OP_I32_TRUNC_U_F64 */
+ NULL, /* OP_I64_EXTEND_S_I32 */
+ NULL, /* OP_I64_EXTEND_U_I32 */
+ NULL, /* OP_I64_TRUNC_S_F32 */
+ NULL, /* OP_I64_TRUNC_U_F32 */
+ NULL, /* OP_I64_TRUNC_S_F64 */
+ NULL, /* OP_I64_TRUNC_U_F64 */
+ NULL, /* OP_F32_CONVERT_S_I32 */
+ NULL, /* OP_F32_CONVERT_U_I32 */
+ NULL, /* OP_F32_CONVERT_S_I64 */
+ NULL, /* OP_F32_CONVERT_U_I64 */
+ NULL, /* OP_F32_DEMOTE_F64 */
+ NULL, /* OP_F64_CONVERT_S_I32 */
+ NULL, /* OP_F64_CONVERT_U_I32 */
+ NULL, /* OP_F64_CONVERT_S_I64 */
+ NULL, /* OP_F64_CONVERT_U_I64 */
+ NULL, /* OP_F64_PROMOTE_F32 */
+ NULL, /* OP_I32_REINTERPRET_F32 */
+ NULL, /* OP_I64_REINTERPRET_F64 */
+ NULL, /* OP_F32_REINTERPRET_I32 */
+ NULL, /* OP_F64_REINTERPRET_I64 */
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL /* OP_MISC */
+};
+
+const struct nwp_ops nwp_ops =
+{
+ ops,
+ sizeof ops / sizeof *ops
+};