skip to content
==> tests/instr.c <==
1/* Instructions and immediates, and the malformed encodings that must be refused. */
2#include "mesh/check.h"
3#include "wasm/instr.h"
4
5static char err[256];
6
7static bool one(const uint8_t *b, size_t n, wasm_instr *in) {
8    wasm_reader r = wasm_reader_at(b, b, b + n, err, sizeof err);
9    bool ok = wasm_rd_instr(&r, in);
10    if (ok) CHECK(wasm_rd_eof(&r));
11    return ok;
12}
13
14#define ONE(in, ...) one((const uint8_t[]){__VA_ARGS__}, sizeof((const uint8_t[]){__VA_ARGS__}), (in))
15
16int main(void) {
17    wasm_instr in;
18    CHECK(ONE(&in, 0x41, 0x7f));
19    CHECK_U(in.op, WASM_OP_I32_CONST);
20    CHECK_I(in.i, -1);
21    CHECK(ONE(&in, 0x43, 0x00, 0x00, 0x80, 0x3f));
22    CHECK_U(in.f32, 0x3f800000u);
23    CHECK(ONE(&in, 0x44, 1, 2, 3, 4, 5, 6, 7, 8));
24    CHECK_U(in.f64, 0x0807060504030201ull);
25    CHECK(ONE(&in, 0x28, 0x02, 0x10));
26    CHECK_U(in.align, 2);
27    CHECK_U(in.moffset, 16);
28    CHECK_U(in.info.mem_bytes, 4);
29    /* Multi-memory memarg. */
30    CHECK(ONE(&in, 0x28, 0x42, 0x01, 0x08));
31    CHECK_U(in.align, 2);
32    CHECK_U(in.mem, 1);
33    CHECK_U(in.moffset, 8);
34    /* Block types. */
35    CHECK(ONE(&in, 0x02, 0x40));
36    CHECK_I(in.blocktype, WASM_BT_EMPTY);
37    CHECK(ONE(&in, 0x02, 0x7f));
38    CHECK_U(in.bt_val, WASM_I32);
39    CHECK(ONE(&in, 0x02, 0x05));
40    CHECK_I(in.blocktype, 5);
41    CHECK(!ONE(&in, 0x02, 0x60));
42    /* br_table. */
43    CHECK(ONE(&in, 0x0e, 0x03, 0x00, 0x01, 0x80, 0x01, 0x02));
44    uint32_t t[4];
45    wasm_instr_targets(&in, t);
46    CHECK_U(t[0], 0);
47    CHECK_U(t[1], 1);
48    CHECK_U(t[2], 128);
49    CHECK_U(t[3], 2);
50    CHECK(!ONE(&in, 0x0e, 0x7f, 0x00));
51    /* Prefixed. */
52    CHECK(ONE(&in, 0xfc, 0x0a, 0x00, 0x00));
53    CHECK_U(in.op, WASM_OP_MEMORY_COPY);
54    CHECK(ONE(&in, 0xfc, 0x80, 0x00));
55    CHECK_U(in.op, WASM_OP_FC(0));
56    CHECK(!ONE(&in, 0xfc, 0x12));
57    CHECK_S(err, "unknown 0xfc subopcode: 0x12 (at offset 0x0)");
58    CHECK(ONE(&in, 0xfd, 0x0c, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15));
59    CHECK_U(in.v128[15], 15);
60    CHECK(ONE(&in, 0xfd, 0x85, 0x02));
61    CHECK_S(in.info.name, "RelaxedSimd");
62    CHECK(ONE(&in, 0xfe, 0x03, 0x00));
63    CHECK(!ONE(&in, 0xfe, 0x03, 0x01));
64    /* Unknown, truncated. */
65    CHECK(!ONE(&in, 0x06));
66    CHECK_S(err, "illegal opcode: 0x6 (at offset 0x0)");
67    CHECK(!ONE(&in, 0x41));
68    CHECK_S(err, "unexpected end-of-file (at offset 0x1)");
69    CHECK(!ONE(&in, 0x1c, 0x02, 0x7f, 0x7f));
70    CHECK(ONE(&in, 0x1c, 0x01, 0x7e));
71    CHECK_U(in.select_type, WASM_I64);
72    CHECK(ONE(&in, 0xd0, 0x70));
73    CHECK_U(in.reftype, WASM_FUNCREF);
74    CHECK(!ONE(&in, 0xd0, 0x7f));
75    return mesh_check_done();
76}