==> 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}