skip to content
==> tests/opcodes.c <==
1/* The table: every MVP opcode is known with a consistent signature, the gaps aren't, names match
2 * wasmparser's, and prefixed opcodes resolve by rule. */
3#include "mesh/check.h"
4#include "wasm/opcodes.h"
5
6#include <string.h>
7
8int main(void) {
9    wasm_opinfo o;
10    int known = 0;
11    for (uint32_t op = 0; op < 256; op++) {
12        if (!wasm_op_info(op, &o)) continue;
13        known++;
14        CHECK_U(o.op, op);
15        if (o.sig) {
16            const char *gt = strchr(o.sig, '>');
17            CHECK(gt != NULL);
18            for (const char *c = o.sig; *c; c++) CHECK(*c == '>' || wasm_sig_type(*c) != 0);
19        }
20        if (o.imm == WASM_IMM_MEMARG) CHECK(o.mem_bytes == 1 || o.mem_bytes == 2 || o.mem_bytes == 4 || o.mem_bytes == 8);
21    }
22    /* 0x00-0x05, 0x0b-0x11, 0x1a-0x1c, 0x20-0x26, 0x28-0xc4, 0xd0-0xd2 */
23    CHECK_I(known, 6 + 7 + 3 + 7 + (0xc4 - 0x28 + 1) + 3);
24    CHECK(!wasm_op_info(0x06, &o));
25    CHECK(!wasm_op_info(0x27, &o));
26    CHECK(!wasm_op_info(0xc5, &o));
27    CHECK(wasm_op_info(0x92, &o));
28    CHECK_S(o.name, "F32Add");
29    CHECK_S(o.sig, "ff>f");
30    CHECK(wasm_op_info(0xb6, &o));
31    CHECK_S(o.name, "F32DemoteF64");
32    CHECK(wasm_op_info(0xbb, &o));
33    CHECK_S(o.name, "F64PromoteF32");
34    CHECK(wasm_op_info(WASM_OP_FC(7), &o));
35    CHECK_S(o.name, "I64TruncSatF64U");
36    CHECK_U(o.feature, WASM_F_SAT_FLOAT_TO_INT);
37    CHECK(wasm_op_info(WASM_OP_MEMORY_COPY, &o));
38    CHECK_U(o.imm, WASM_IMM_MEMORY_COPY);
39    CHECK(!wasm_op_info(WASM_OP_FC(18), &o));
40    /* SIMD by rule. */
41    CHECK(wasm_op_info(WASM_OP_SIMD(0x0c), &o));
42    CHECK_U(o.imm, WASM_IMM_V128);
43    CHECK(wasm_op_info(WASM_OP_SIMD(0x0d), &o));
44    CHECK_U(o.imm, WASM_IMM_SHUFFLE);
45    CHECK(wasm_op_info(WASM_OP_SIMD(0x15), &o));
46    CHECK_U(o.imm, WASM_IMM_LANE);
47    CHECK(wasm_op_info(WASM_OP_SIMD(0x54), &o));
48    CHECK_U(o.imm, WASM_IMM_MEMARG_LANE);
49    CHECK(wasm_op_info(WASM_OP_SIMD(0xe4), &o));
50    CHECK_U(o.imm, WASM_IMM_NONE);
51    CHECK_U(o.feature, WASM_F_SIMD);
52    CHECK(!wasm_op_info(WASM_OP_SIMD(0x9a), &o));
53    CHECK(wasm_op_info(WASM_OP_SIMD(0x105), &o));
54    CHECK_U(o.feature, WASM_F_RELAXED_SIMD);
55    CHECK(!wasm_op_info(WASM_OP_SIMD(0x114), &o));
56    /* Atomics by rule. */
57    CHECK(wasm_op_info(WASM_OP_ATOMIC(0x03), &o));
58    CHECK_U(o.imm, WASM_IMM_ZERO_BYTE);
59    CHECK(wasm_op_info(WASM_OP_ATOMIC(0x4e), &o));
60    CHECK_U(o.feature, WASM_F_THREADS);
61    CHECK(!wasm_op_info(WASM_OP_ATOMIC(0x04), &o));
62    CHECK(!wasm_op_info(WASM_OP_ATOMIC(0x4f), &o));
63    CHECK(!wasm_op_info(0xff0000, &o));
64    return mesh_check_done();
65}