1 package wazeroir
2
3 import (
4 "testing"
5
6 "github.com/tetratelabs/wazero/internal/testing/require"
7 "github.com/tetratelabs/wazero/internal/wasm"
8 )
9
10 func TestCompiler_wasmOpcodeSignature(t *testing.T) {
11 tests := []struct {
12 name string
13 body []byte
14 exp *signature
15 }{
16 {
17 name: "i32.trunc_sat_f32_s",
18 body: []byte{wasm.OpcodeMiscPrefix, wasm.OpcodeMiscI32TruncSatF32S},
19 exp: signature_F32_I32,
20 },
21 {
22 name: "i32.trunc_sat_f32_u",
23 body: []byte{wasm.OpcodeMiscPrefix, wasm.OpcodeMiscI32TruncSatF32U},
24 exp: signature_F32_I32,
25 },
26 {
27 name: "i32.trunc_sat_f64_s",
28 body: []byte{wasm.OpcodeMiscPrefix, wasm.OpcodeMiscI32TruncSatF64S},
29 exp: signature_F64_I32,
30 },
31 {
32 name: "i32.trunc_sat_f64_u",
33 body: []byte{wasm.OpcodeMiscPrefix, wasm.OpcodeMiscI32TruncSatF64U},
34 exp: signature_F64_I32,
35 },
36 {
37 name: "i64.trunc_sat_f32_s",
38 body: []byte{wasm.OpcodeMiscPrefix, wasm.OpcodeMiscI64TruncSatF32S},
39 exp: signature_F32_I64,
40 },
41 {
42 name: "i64.trunc_sat_f32_u",
43 body: []byte{wasm.OpcodeMiscPrefix, wasm.OpcodeMiscI64TruncSatF32U},
44 exp: signature_F32_I64,
45 },
46 {
47 name: "i64.trunc_sat_f64_s",
48 body: []byte{wasm.OpcodeMiscPrefix, wasm.OpcodeMiscI64TruncSatF64S},
49 exp: signature_F64_I64,
50 },
51 {
52 name: "i64.trunc_sat_f64_u",
53 body: []byte{wasm.OpcodeMiscPrefix, wasm.OpcodeMiscI64TruncSatF64U},
54 exp: signature_F64_I64,
55 },
56 {
57 name: "memory.init",
58 body: []byte{wasm.OpcodeMiscPrefix, wasm.OpcodeMiscMemoryInit},
59 exp: signature_I32I32I32_None,
60 },
61 {
62 name: "data.drop",
63 body: []byte{wasm.OpcodeMiscPrefix, wasm.OpcodeMiscDataDrop},
64 exp: signature_None_None,
65 },
66 {
67 name: "memory.copy",
68 body: []byte{wasm.OpcodeMiscPrefix, wasm.OpcodeMiscMemoryCopy},
69 exp: signature_I32I32I32_None,
70 },
71 {
72 name: "memory.fill",
73 body: []byte{wasm.OpcodeMiscPrefix, wasm.OpcodeMiscMemoryFill},
74 exp: signature_I32I32I32_None,
75 },
76 {
77 name: "table.init",
78 body: []byte{wasm.OpcodeMiscPrefix, wasm.OpcodeMiscTableInit},
79 exp: signature_I32I32I32_None,
80 },
81 {
82 name: "elem.drop",
83 body: []byte{wasm.OpcodeMiscPrefix, wasm.OpcodeMiscElemDrop},
84 exp: signature_None_None,
85 },
86 {
87 name: "table.copy",
88 body: []byte{wasm.OpcodeMiscPrefix, wasm.OpcodeMiscTableCopy},
89 exp: signature_I32I32I32_None,
90 },
91 }
92
93 for _, tt := range tests {
94 tc := tt
95 t.Run(tc.name, func(t *testing.T) {
96 c := &Compiler{body: tc.body}
97 actual, err := c.wasmOpcodeSignature(tc.body[0], 0)
98 require.NoError(t, err)
99 require.Equal(t, tc.exp, actual)
100 })
101 }
102 }
103
104 func Test_funcTypeToIRSignatures(t *testing.T) {
105 f := &funcTypeToIRSignatures{
106 wasmTypes: []wasm.FunctionType{v_v, i32_i32, v_f64f64},
107 directCalls: make([]*signature, 3),
108 indirectCalls: make([]*signature, 3),
109 }
110
111 require.Equal(t, &signature{in: make([]UnsignedType, 0), out: make([]UnsignedType, 0)}, f.get(0, false))
112 require.Equal(t, &signature{in: []UnsignedType{UnsignedTypeI32}, out: make([]UnsignedType, 0)}, f.get(0, true))
113 require.NotNil(t, f.directCalls[0])
114 require.NotNil(t, f.indirectCalls[0])
115 require.Equal(t, &signature{in: []UnsignedType{UnsignedTypeI32}, out: []UnsignedType{UnsignedTypeI32}}, f.get(1, false))
116 require.Equal(t, &signature{in: []UnsignedType{UnsignedTypeI32, UnsignedTypeI32}, out: []UnsignedType{UnsignedTypeI32}}, f.get(1, true))
117 require.NotNil(t, f.directCalls[1])
118 require.NotNil(t, f.indirectCalls[1])
119 require.Equal(t, &signature{in: make([]UnsignedType, 0), out: []UnsignedType{UnsignedTypeF64, UnsignedTypeF64}}, f.get(2, false))
120 require.Equal(t, &signature{in: []UnsignedType{UnsignedTypeI32}, out: []UnsignedType{UnsignedTypeF64, UnsignedTypeF64}}, f.get(2, true))
121 require.NotNil(t, f.directCalls[2])
122 require.NotNil(t, f.indirectCalls[2])
123 }
124
View as plain text