blob: fe1011574966a1eff77edb779ded31ee1808a0fc [file] [log] [blame]
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001// Copyright 2015 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "test/unittests/test-utils.h"
6
7#include "src/v8.h"
8
9#include "test/cctest/wasm/test-signatures.h"
10
11#include "src/objects.h"
12
13#include "src/wasm/ast-decoder.h"
14#include "src/wasm/wasm-macro-gen.h"
15#include "src/wasm/wasm-module.h"
16
17namespace v8 {
18namespace internal {
19namespace wasm {
20
Ben Murdochc5610432016-08-08 18:44:38 +010021#define B1(a) kExprBlock, a, kExprEnd
22#define B2(a, b) kExprBlock, a, b, kExprEnd
23#define B3(a, b, c) kExprBlock, a, b, c, kExprEnd
24
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000025static const byte kCodeGetLocal0[] = {kExprGetLocal, 0};
26static const byte kCodeGetLocal1[] = {kExprGetLocal, 1};
Ben Murdochc5610432016-08-08 18:44:38 +010027static const byte kCodeSetLocal0[] = {WASM_SET_LOCAL(0, WASM_ZERO)};
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000028
29static const LocalType kLocalTypes[] = {kAstI32, kAstI64, kAstF32, kAstF64};
30static const MachineType machineTypes[] = {
31 MachineType::Int8(), MachineType::Uint8(), MachineType::Int16(),
32 MachineType::Uint16(), MachineType::Int32(), MachineType::Uint32(),
33 MachineType::Int64(), MachineType::Uint64(), MachineType::Float32(),
34 MachineType::Float64()};
35
36static const WasmOpcode kInt32BinopOpcodes[] = {
37 kExprI32Add, kExprI32Sub, kExprI32Mul, kExprI32DivS, kExprI32DivU,
38 kExprI32RemS, kExprI32RemU, kExprI32And, kExprI32Ior, kExprI32Xor,
39 kExprI32Shl, kExprI32ShrU, kExprI32ShrS, kExprI32Eq, kExprI32LtS,
40 kExprI32LeS, kExprI32LtU, kExprI32LeU};
41
Ben Murdoch097c5b22016-05-18 11:27:45 +010042#define WASM_BRV_IF_ZERO(depth, val) \
Ben Murdochc5610432016-08-08 18:44:38 +010043 val, WASM_ZERO, kExprBrIf, ARITY_1, static_cast<byte>(depth)
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000044
45#define EXPECT_VERIFIES(env, x) Verify(kSuccess, env, x, x + arraysize(x))
46
47#define EXPECT_FAILURE(env, x) Verify(kError, env, x, x + arraysize(x))
48
49#define EXPECT_VERIFIES_INLINE(env, ...) \
50 do { \
51 static byte code[] = {__VA_ARGS__}; \
52 Verify(kSuccess, env, code, code + arraysize(code)); \
53 } while (false)
54
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000055#define EXPECT_FAILURE_INLINE(env, ...) \
56 do { \
57 static byte code[] = {__VA_ARGS__}; \
58 Verify(kError, env, code, code + arraysize(code)); \
59 } while (false)
60
Ben Murdochda12d292016-06-02 14:46:10 +010061#define VERIFY(...) \
62 do { \
63 static const byte code[] = {__VA_ARGS__}; \
64 Verify(kSuccess, sigs.v_i(), code, code + sizeof(code)); \
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000065 } while (false)
66
Ben Murdochda12d292016-06-02 14:46:10 +010067class AstDecoderTest : public TestWithZone {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000068 public:
Ben Murdochda12d292016-06-02 14:46:10 +010069 typedef std::pair<uint32_t, LocalType> LocalsDecl;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000070
Ben Murdochc5610432016-08-08 18:44:38 +010071 AstDecoderTest() : module(nullptr), local_decls(zone()) {}
72
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000073 TestSignatures sigs;
Ben Murdochda12d292016-06-02 14:46:10 +010074 ModuleEnv* module;
75 LocalDeclEncoder local_decls;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000076
Ben Murdochda12d292016-06-02 14:46:10 +010077 void AddLocals(LocalType type, uint32_t count) {
78 local_decls.AddLocals(count, type);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000079 }
80
Ben Murdochc5610432016-08-08 18:44:38 +010081 // Prepends local variable declarations and renders nice error messages for
Ben Murdochda12d292016-06-02 14:46:10 +010082 // verification failures.
83 void Verify(ErrorCode expected, FunctionSig* sig, const byte* start,
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000084 const byte* end) {
Ben Murdochda12d292016-06-02 14:46:10 +010085 local_decls.Prepend(&start, &end);
86 // Verify the code.
87 TreeResult result =
88 VerifyWasmCode(zone()->allocator(), module, sig, start, end);
89
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000090 if (result.error_code != expected) {
91 ptrdiff_t pc = result.error_pc - result.start;
92 ptrdiff_t pt = result.error_pt - result.start;
93 std::ostringstream str;
94 if (expected == kSuccess) {
95 str << "Verification failed: " << result.error_code << " pc = +" << pc;
96 if (result.error_pt) str << ", pt = +" << pt;
97 str << ", msg = " << result.error_msg.get();
98 } else {
99 str << "Verification expected: " << expected << ", but got "
100 << result.error_code;
101 if (result.error_code != kSuccess) {
102 str << " pc = +" << pc;
103 if (result.error_pt) str << ", pt = +" << pt;
104 }
105 }
106 FATAL(str.str().c_str());
107 }
Ben Murdochda12d292016-06-02 14:46:10 +0100108
109 delete[] start; // local_decls.Prepend() allocated a new buffer.
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000110 }
111
112 void TestBinop(WasmOpcode opcode, FunctionSig* success) {
113 // op(local[0], local[1])
Ben Murdochc5610432016-08-08 18:44:38 +0100114 byte code[] = {WASM_BINOP(opcode, WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))};
Ben Murdochda12d292016-06-02 14:46:10 +0100115 EXPECT_VERIFIES(success, code);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000116
117 // Try all combinations of return and parameter types.
118 for (size_t i = 0; i < arraysize(kLocalTypes); i++) {
119 for (size_t j = 0; j < arraysize(kLocalTypes); j++) {
120 for (size_t k = 0; k < arraysize(kLocalTypes); k++) {
121 LocalType types[] = {kLocalTypes[i], kLocalTypes[j], kLocalTypes[k]};
122 if (types[0] != success->GetReturn(0) ||
123 types[1] != success->GetParam(0) ||
124 types[2] != success->GetParam(1)) {
125 // Test signature mismatch.
126 FunctionSig sig(1, 2, types);
Ben Murdochda12d292016-06-02 14:46:10 +0100127 EXPECT_FAILURE(&sig, code);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000128 }
129 }
130 }
131 }
132 }
133
134 void TestUnop(WasmOpcode opcode, FunctionSig* success) {
135 TestUnop(opcode, success->GetReturn(), success->GetParam(0));
136 }
137
138 void TestUnop(WasmOpcode opcode, LocalType ret_type, LocalType param_type) {
139 // Return(op(local[0]))
Ben Murdochc5610432016-08-08 18:44:38 +0100140 byte code[] = {WASM_UNOP(opcode, WASM_GET_LOCAL(0))};
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000141 {
142 LocalType types[] = {ret_type, param_type};
143 FunctionSig sig(1, 1, types);
Ben Murdochda12d292016-06-02 14:46:10 +0100144 EXPECT_VERIFIES(&sig, code);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000145 }
146
147 // Try all combinations of return and parameter types.
148 for (size_t i = 0; i < arraysize(kLocalTypes); i++) {
149 for (size_t j = 0; j < arraysize(kLocalTypes); j++) {
150 LocalType types[] = {kLocalTypes[i], kLocalTypes[j]};
151 if (types[0] != ret_type || types[1] != param_type) {
152 // Test signature mismatch.
153 FunctionSig sig(1, 1, types);
Ben Murdochda12d292016-06-02 14:46:10 +0100154 EXPECT_FAILURE(&sig, code);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000155 }
156 }
157 }
158 }
159};
160
Ben Murdochda12d292016-06-02 14:46:10 +0100161TEST_F(AstDecoderTest, Int8Const) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000162 byte code[] = {kExprI8Const, 0};
163 for (int i = -128; i < 128; i++) {
164 code[1] = static_cast<byte>(i);
Ben Murdochda12d292016-06-02 14:46:10 +0100165 EXPECT_VERIFIES(sigs.i_i(), code);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000166 }
167}
168
Ben Murdochda12d292016-06-02 14:46:10 +0100169TEST_F(AstDecoderTest, EmptyFunction) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000170 byte code[] = {0};
Ben Murdochda12d292016-06-02 14:46:10 +0100171 Verify(kSuccess, sigs.v_v(), code, code);
172 Verify(kError, sigs.i_i(), code, code);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000173}
174
Ben Murdochda12d292016-06-02 14:46:10 +0100175TEST_F(AstDecoderTest, IncompleteIf1) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000176 byte code[] = {kExprIf};
Ben Murdochda12d292016-06-02 14:46:10 +0100177 EXPECT_FAILURE(sigs.v_v(), code);
178 EXPECT_FAILURE(sigs.i_i(), code);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000179}
180
Ben Murdochda12d292016-06-02 14:46:10 +0100181TEST_F(AstDecoderTest, Int8Const_fallthru) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000182 byte code[] = {kExprI8Const, 0, kExprI8Const, 1};
Ben Murdochda12d292016-06-02 14:46:10 +0100183 EXPECT_VERIFIES(sigs.i_i(), code);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000184}
185
Ben Murdochda12d292016-06-02 14:46:10 +0100186TEST_F(AstDecoderTest, Int32Const) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000187 const int kInc = 4498211;
188 for (int32_t i = kMinInt; i < kMaxInt - kInc; i = i + kInc) {
Ben Murdochda12d292016-06-02 14:46:10 +0100189 // TODO(binji): expand test for other sized int32s; 1 through 5 bytes.
190 byte code[] = {WASM_I32V(i)};
191 EXPECT_VERIFIES(sigs.i_i(), code);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000192 }
193}
194
Ben Murdochda12d292016-06-02 14:46:10 +0100195TEST_F(AstDecoderTest, Int8Const_fallthru2) {
196 byte code[] = {WASM_I8(0), WASM_I32V_4(0x1122334)};
197 EXPECT_VERIFIES(sigs.i_i(), code);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000198}
199
Ben Murdochda12d292016-06-02 14:46:10 +0100200TEST_F(AstDecoderTest, Int64Const) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000201 const int kInc = 4498211;
202 for (int32_t i = kMinInt; i < kMaxInt - kInc; i = i + kInc) {
Ben Murdochda12d292016-06-02 14:46:10 +0100203 byte code[] = {WASM_I64V((static_cast<int64_t>(i) << 32) | i)};
204 EXPECT_VERIFIES(sigs.l_l(), code);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000205 }
206}
207
Ben Murdochda12d292016-06-02 14:46:10 +0100208TEST_F(AstDecoderTest, Float32Const) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000209 byte code[] = {kExprF32Const, 0, 0, 0, 0};
210 float* ptr = reinterpret_cast<float*>(code + 1);
211 for (int i = 0; i < 30; i++) {
212 *ptr = i * -7.75f;
Ben Murdochda12d292016-06-02 14:46:10 +0100213 EXPECT_VERIFIES(sigs.f_ff(), code);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000214 }
215}
216
Ben Murdochda12d292016-06-02 14:46:10 +0100217TEST_F(AstDecoderTest, Float64Const) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000218 byte code[] = {kExprF64Const, 0, 0, 0, 0, 0, 0, 0, 0};
219 double* ptr = reinterpret_cast<double*>(code + 1);
220 for (int i = 0; i < 30; i++) {
221 *ptr = i * 33.45;
Ben Murdochda12d292016-06-02 14:46:10 +0100222 EXPECT_VERIFIES(sigs.d_dd(), code);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000223 }
224}
225
Ben Murdochda12d292016-06-02 14:46:10 +0100226TEST_F(AstDecoderTest, Int32Const_off_end) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000227 byte code[] = {kExprI32Const, 0xaa, 0xbb, 0xcc, 0x44};
228
229 for (int size = 1; size <= 4; size++) {
Ben Murdochda12d292016-06-02 14:46:10 +0100230 Verify(kError, sigs.i_i(), code, code + size);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000231 }
232}
233
Ben Murdochda12d292016-06-02 14:46:10 +0100234TEST_F(AstDecoderTest, GetLocal0_param) {
235 EXPECT_VERIFIES(sigs.i_i(), kCodeGetLocal0);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000236}
237
Ben Murdochda12d292016-06-02 14:46:10 +0100238TEST_F(AstDecoderTest, GetLocal0_local) {
239 AddLocals(kAstI32, 1);
240 EXPECT_VERIFIES(sigs.i_v(), kCodeGetLocal0);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000241}
242
Ben Murdochda12d292016-06-02 14:46:10 +0100243TEST_F(AstDecoderTest, GetLocal0_param_n) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000244 FunctionSig* array[] = {sigs.i_i(), sigs.i_ii(), sigs.i_iii()};
245
246 for (size_t i = 0; i < arraysize(array); i++) {
Ben Murdochda12d292016-06-02 14:46:10 +0100247 EXPECT_VERIFIES(array[i], kCodeGetLocal0);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000248 }
249}
250
Ben Murdochda12d292016-06-02 14:46:10 +0100251TEST_F(AstDecoderTest, GetLocalN_local) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000252 for (byte i = 1; i < 8; i++) {
Ben Murdochda12d292016-06-02 14:46:10 +0100253 AddLocals(kAstI32, 1);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000254 for (byte j = 0; j < i; j++) {
255 byte code[] = {kExprGetLocal, j};
Ben Murdochda12d292016-06-02 14:46:10 +0100256 EXPECT_VERIFIES(sigs.i_v(), code);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000257 }
258 }
259}
260
Ben Murdochda12d292016-06-02 14:46:10 +0100261TEST_F(AstDecoderTest, GetLocal0_fail_no_params) {
262 EXPECT_FAILURE(sigs.i_v(), kCodeGetLocal0);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000263}
264
Ben Murdochda12d292016-06-02 14:46:10 +0100265TEST_F(AstDecoderTest, GetLocal1_fail_no_locals) {
266 EXPECT_FAILURE(sigs.i_i(), kCodeGetLocal1);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000267}
268
Ben Murdochda12d292016-06-02 14:46:10 +0100269TEST_F(AstDecoderTest, GetLocal_off_end) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000270 static const byte code[] = {kExprGetLocal};
Ben Murdochda12d292016-06-02 14:46:10 +0100271 EXPECT_FAILURE(sigs.i_i(), code);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000272}
273
Ben Murdochda12d292016-06-02 14:46:10 +0100274TEST_F(AstDecoderTest, GetLocal_varint) {
275 const int kMaxLocals = 8000000;
276 AddLocals(kAstI32, kMaxLocals);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000277
Ben Murdochda12d292016-06-02 14:46:10 +0100278 for (int index = 0; index < kMaxLocals; index = index * 11 + 5) {
279 EXPECT_VERIFIES_INLINE(sigs.i_i(), kExprGetLocal, U32V_1(index));
280 EXPECT_VERIFIES_INLINE(sigs.i_i(), kExprGetLocal, U32V_2(index));
281 EXPECT_VERIFIES_INLINE(sigs.i_i(), kExprGetLocal, U32V_3(index));
282 EXPECT_VERIFIES_INLINE(sigs.i_i(), kExprGetLocal, U32V_4(index));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000283 }
284
Ben Murdochda12d292016-06-02 14:46:10 +0100285 EXPECT_VERIFIES_INLINE(sigs.i_i(), kExprGetLocal, U32V_5(kMaxLocals - 1));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000286
Ben Murdochda12d292016-06-02 14:46:10 +0100287 EXPECT_VERIFIES_INLINE(sigs.i_i(), kExprGetLocal, U32V_4(kMaxLocals - 1));
288 EXPECT_VERIFIES_INLINE(sigs.i_i(), kExprGetLocal, U32V_4(kMaxLocals));
289 EXPECT_FAILURE_INLINE(sigs.i_i(), kExprGetLocal, U32V_4(kMaxLocals + 1));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000290
Ben Murdochda12d292016-06-02 14:46:10 +0100291 EXPECT_FAILURE_INLINE(sigs.i_v(), kExprGetLocal, U32V_4(kMaxLocals));
292 EXPECT_FAILURE_INLINE(sigs.i_v(), kExprGetLocal, U32V_4(kMaxLocals + 1));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000293}
294
Ben Murdochda12d292016-06-02 14:46:10 +0100295TEST_F(AstDecoderTest, Binops_off_end) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000296 byte code1[] = {0}; // [opcode]
297 for (size_t i = 0; i < arraysize(kInt32BinopOpcodes); i++) {
298 code1[0] = kInt32BinopOpcodes[i];
Ben Murdochda12d292016-06-02 14:46:10 +0100299 EXPECT_FAILURE(sigs.i_i(), code1);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000300 }
301
Ben Murdochc5610432016-08-08 18:44:38 +0100302 byte code3[] = {kExprGetLocal, 0, 0}; // [expr] [opcode]
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000303 for (size_t i = 0; i < arraysize(kInt32BinopOpcodes); i++) {
Ben Murdochc5610432016-08-08 18:44:38 +0100304 code3[2] = kInt32BinopOpcodes[i];
Ben Murdochda12d292016-06-02 14:46:10 +0100305 EXPECT_FAILURE(sigs.i_i(), code3);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000306 }
307
Ben Murdochc5610432016-08-08 18:44:38 +0100308 byte code4[] = {kExprGetLocal, 0, 0, 0}; // [expr] [opcode] [opcode]
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000309 for (size_t i = 0; i < arraysize(kInt32BinopOpcodes); i++) {
Ben Murdochc5610432016-08-08 18:44:38 +0100310 code4[2] = kInt32BinopOpcodes[i];
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000311 code4[3] = kInt32BinopOpcodes[i];
Ben Murdochda12d292016-06-02 14:46:10 +0100312 EXPECT_FAILURE(sigs.i_i(), code4);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000313 }
314}
315
Ben Murdochc5610432016-08-08 18:44:38 +0100316TEST_F(AstDecoderTest, BinopsAcrossBlock1) {
317 static const byte code[] = {WASM_ZERO, kExprBlock, WASM_ZERO, kExprI32Add,
318 kExprEnd};
319 EXPECT_FAILURE(sigs.i_i(), code);
320}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000321
Ben Murdochc5610432016-08-08 18:44:38 +0100322TEST_F(AstDecoderTest, BinopsAcrossBlock2) {
323 static const byte code[] = {WASM_ZERO, WASM_ZERO, kExprBlock, kExprI32Add,
324 kExprEnd};
325 EXPECT_FAILURE(sigs.i_i(), code);
326}
327
328TEST_F(AstDecoderTest, BinopsAcrossBlock3) {
329 static const byte code[] = {WASM_ZERO, WASM_ZERO, kExprIf, kExprI32Add,
330 kExprElse, kExprI32Add, kExprEnd};
331 EXPECT_FAILURE(sigs.i_i(), code);
332}
333
Ben Murdochda12d292016-06-02 14:46:10 +0100334TEST_F(AstDecoderTest, Nop) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000335 static const byte code[] = {kExprNop};
Ben Murdochda12d292016-06-02 14:46:10 +0100336 EXPECT_VERIFIES(sigs.v_v(), code);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000337}
338
Ben Murdochda12d292016-06-02 14:46:10 +0100339TEST_F(AstDecoderTest, SetLocal0_param) {
Ben Murdochc5610432016-08-08 18:44:38 +0100340 EXPECT_VERIFIES(sigs.i_i(), kCodeSetLocal0);
341 EXPECT_FAILURE(sigs.f_ff(), kCodeSetLocal0);
342 EXPECT_FAILURE(sigs.d_dd(), kCodeSetLocal0);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000343}
344
Ben Murdochda12d292016-06-02 14:46:10 +0100345TEST_F(AstDecoderTest, SetLocal0_local) {
Ben Murdochc5610432016-08-08 18:44:38 +0100346 EXPECT_FAILURE(sigs.i_v(), kCodeSetLocal0);
Ben Murdochda12d292016-06-02 14:46:10 +0100347 AddLocals(kAstI32, 1);
Ben Murdochc5610432016-08-08 18:44:38 +0100348 EXPECT_VERIFIES(sigs.i_v(), kCodeSetLocal0);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000349}
350
Ben Murdochda12d292016-06-02 14:46:10 +0100351TEST_F(AstDecoderTest, SetLocalN_local) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000352 for (byte i = 1; i < 8; i++) {
Ben Murdochda12d292016-06-02 14:46:10 +0100353 AddLocals(kAstI32, 1);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000354 for (byte j = 0; j < i; j++) {
Ben Murdochc5610432016-08-08 18:44:38 +0100355 EXPECT_VERIFIES_INLINE(sigs.v_v(), WASM_SET_LOCAL(j, WASM_I8(i)));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000356 }
357 }
358}
359
Ben Murdochc5610432016-08-08 18:44:38 +0100360TEST_F(AstDecoderTest, BlockN) {
361 const int kMaxSize = 200;
362 byte buffer[kMaxSize + 2];
363
364 for (int i = 0; i <= kMaxSize; i++) {
365 memset(buffer, kExprNop, sizeof(buffer));
366 buffer[0] = kExprBlock;
367 buffer[i + 1] = kExprEnd;
368 Verify(kSuccess, sigs.v_i(), buffer, buffer + i + 2);
369 }
370}
371
Ben Murdochda12d292016-06-02 14:46:10 +0100372TEST_F(AstDecoderTest, Block0) {
Ben Murdochc5610432016-08-08 18:44:38 +0100373 static const byte code[] = {kExprBlock, kExprEnd};
Ben Murdochda12d292016-06-02 14:46:10 +0100374 EXPECT_VERIFIES(sigs.v_v(), code);
Ben Murdochc5610432016-08-08 18:44:38 +0100375 EXPECT_FAILURE(sigs.i_i(), code);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000376}
377
Ben Murdochda12d292016-06-02 14:46:10 +0100378TEST_F(AstDecoderTest, Block0_fallthru1) {
Ben Murdochc5610432016-08-08 18:44:38 +0100379 static const byte code[] = {kExprBlock, kExprBlock, kExprEnd, kExprEnd};
Ben Murdochda12d292016-06-02 14:46:10 +0100380 EXPECT_VERIFIES(sigs.v_v(), code);
Ben Murdochc5610432016-08-08 18:44:38 +0100381 EXPECT_FAILURE(sigs.i_i(), code);
382}
383
384TEST_F(AstDecoderTest, Block0Block0) {
385 static const byte code[] = {kExprBlock, kExprEnd, kExprBlock, kExprEnd};
386 EXPECT_VERIFIES(sigs.v_v(), code);
387 EXPECT_FAILURE(sigs.i_i(), code);
388}
389
390TEST_F(AstDecoderTest, Block0_end_end) {
391 static const byte code[] = {kExprBlock, kExprEnd, kExprEnd};
392 EXPECT_FAILURE(sigs.v_v(), code);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000393}
394
Ben Murdochda12d292016-06-02 14:46:10 +0100395TEST_F(AstDecoderTest, Block1) {
Ben Murdochc5610432016-08-08 18:44:38 +0100396 byte code[] = {B1(WASM_SET_LOCAL(0, WASM_ZERO))};
Ben Murdochda12d292016-06-02 14:46:10 +0100397 EXPECT_VERIFIES(sigs.i_i(), code);
Ben Murdochc5610432016-08-08 18:44:38 +0100398 EXPECT_VERIFIES(sigs.v_i(), code);
399 EXPECT_FAILURE(sigs.d_dd(), code);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000400}
401
Ben Murdochc5610432016-08-08 18:44:38 +0100402TEST_F(AstDecoderTest, Block1_i) {
403 byte code[] = {B1(WASM_ZERO)};
Ben Murdochda12d292016-06-02 14:46:10 +0100404 EXPECT_VERIFIES(sigs.i_i(), code);
Ben Murdochc5610432016-08-08 18:44:38 +0100405 EXPECT_FAILURE(sigs.f_ff(), code);
406 EXPECT_FAILURE(sigs.d_dd(), code);
407 EXPECT_FAILURE(sigs.l_ll(), code);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000408}
409
Ben Murdochc5610432016-08-08 18:44:38 +0100410TEST_F(AstDecoderTest, Block1_f) {
411 byte code[] = {B1(WASM_F32(0))};
412 EXPECT_FAILURE(sigs.i_i(), code);
413 EXPECT_VERIFIES(sigs.f_ff(), code);
414 EXPECT_FAILURE(sigs.d_dd(), code);
415 EXPECT_FAILURE(sigs.l_ll(), code);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000416}
417
Ben Murdochda12d292016-06-02 14:46:10 +0100418TEST_F(AstDecoderTest, Block1_continue) {
Ben Murdochc5610432016-08-08 18:44:38 +0100419 EXPECT_VERIFIES_INLINE(sigs.v_v(), B1(WASM_BR(0)));
420 EXPECT_FAILURE_INLINE(sigs.v_v(), B1(WASM_BR(1)));
421 EXPECT_FAILURE_INLINE(sigs.v_v(), B1(WASM_BR(2)));
422 EXPECT_FAILURE_INLINE(sigs.v_v(), B1(WASM_BR(3)));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000423}
424
Ben Murdochc5610432016-08-08 18:44:38 +0100425TEST_F(AstDecoderTest, Block1_br) {
426 EXPECT_FAILURE_INLINE(sigs.v_v(), kExprBlock, kExprBr, ARITY_1, DEPTH_0,
427 kExprEnd);
428 EXPECT_VERIFIES_INLINE(sigs.v_v(), kExprBlock, kExprBr, ARITY_0, DEPTH_0,
429 kExprEnd);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000430}
431
Ben Murdochc5610432016-08-08 18:44:38 +0100432TEST_F(AstDecoderTest, Block2_br) {
433 EXPECT_VERIFIES_INLINE(sigs.v_v(), B2(WASM_NOP, WASM_BR(0)));
434 EXPECT_VERIFIES_INLINE(sigs.v_v(), B2(WASM_BR(0), WASM_NOP));
435 EXPECT_VERIFIES_INLINE(sigs.v_v(), B2(WASM_BR(0), WASM_BR(0)));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000436}
437
Ben Murdochc5610432016-08-08 18:44:38 +0100438TEST_F(AstDecoderTest, Block2) {
439 EXPECT_VERIFIES_INLINE(sigs.i_i(),
440 B2(WASM_NOP, WASM_SET_LOCAL(0, WASM_ZERO)));
441 EXPECT_FAILURE_INLINE(sigs.i_i(), B2(WASM_SET_LOCAL(0, WASM_ZERO), WASM_NOP));
442 EXPECT_VERIFIES_INLINE(sigs.i_i(), B2(WASM_SET_LOCAL(0, WASM_ZERO),
443 WASM_SET_LOCAL(0, WASM_ZERO)));
444}
445
446TEST_F(AstDecoderTest, Block2b) {
447 byte code[] = {B2(WASM_SET_LOCAL(0, WASM_ZERO), WASM_ZERO)};
Ben Murdochda12d292016-06-02 14:46:10 +0100448 EXPECT_VERIFIES(sigs.i_i(), code);
Ben Murdochc5610432016-08-08 18:44:38 +0100449 EXPECT_FAILURE(sigs.v_v(), code);
Ben Murdochda12d292016-06-02 14:46:10 +0100450 EXPECT_FAILURE(sigs.f_ff(), code);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000451}
452
Ben Murdochc5610432016-08-08 18:44:38 +0100453TEST_F(AstDecoderTest, Block2_fallthru) {
454 EXPECT_VERIFIES_INLINE(sigs.i_i(), B2(WASM_SET_LOCAL(0, WASM_ZERO),
455 WASM_SET_LOCAL(0, WASM_ZERO)),
456 WASM_I8(23));
457}
458
459TEST_F(AstDecoderTest, Block3) {
460 EXPECT_VERIFIES_INLINE(
461 sigs.i_i(), B3(WASM_SET_LOCAL(0, WASM_ZERO), WASM_SET_LOCAL(0, WASM_ZERO),
462 WASM_I8(11)));
463}
464
465TEST_F(AstDecoderTest, Block5) {
466 EXPECT_VERIFIES_INLINE(sigs.v_i(), B1(WASM_GET_LOCAL(0)));
467
468 EXPECT_VERIFIES_INLINE(sigs.v_i(), B2(WASM_GET_LOCAL(0), WASM_GET_LOCAL(0)));
469
470 EXPECT_VERIFIES_INLINE(
471 sigs.v_i(), B3(WASM_GET_LOCAL(0), WASM_GET_LOCAL(0), WASM_GET_LOCAL(0)));
472
473 EXPECT_VERIFIES_INLINE(sigs.v_i(),
474 WASM_BLOCK(4, WASM_GET_LOCAL(0), WASM_GET_LOCAL(0),
475 WASM_GET_LOCAL(0), WASM_GET_LOCAL(0)));
476
477 EXPECT_VERIFIES_INLINE(
478 sigs.v_i(),
479 WASM_BLOCK(5, WASM_GET_LOCAL(0), WASM_GET_LOCAL(0), WASM_GET_LOCAL(0),
480 WASM_GET_LOCAL(0), WASM_GET_LOCAL(0)));
481}
482
483TEST_F(AstDecoderTest, BlockF32) {
484 static const byte code[] = {kExprBlock, kExprF32Const, 0, 0, 0, 0, kExprEnd};
Ben Murdochda12d292016-06-02 14:46:10 +0100485 EXPECT_VERIFIES(sigs.f_ff(), code);
Ben Murdochc5610432016-08-08 18:44:38 +0100486 EXPECT_FAILURE(sigs.i_i(), code);
487 EXPECT_FAILURE(sigs.d_dd(), code);
488}
489
490TEST_F(AstDecoderTest, BlockN_off_end) {
491 byte code[] = {kExprBlock, kExprNop, kExprNop, kExprNop, kExprNop, kExprEnd};
492 EXPECT_VERIFIES(sigs.v_v(), code);
493 for (size_t i = 1; i < arraysize(code); i++) {
494 Verify(kError, sigs.v_v(), code, code + i);
495 }
496}
497
498TEST_F(AstDecoderTest, Block2_continue) {
499 static const byte code[] = {kExprBlock, kExprBr, ARITY_0,
500 DEPTH_1, kExprNop, kExprEnd};
501 EXPECT_FAILURE(sigs.v_v(), code);
502}
503
504TEST_F(AstDecoderTest, NestedBlock_return) {
505 EXPECT_VERIFIES_INLINE(sigs.i_i(), B1(B1(WASM_RETURN1(WASM_ZERO))));
506}
507
508TEST_F(AstDecoderTest, BlockBinop) {
509 EXPECT_VERIFIES_INLINE(sigs.i_i(), WASM_I32_AND(B1(WASM_I8(1)), WASM_I8(2)));
510}
511
512TEST_F(AstDecoderTest, BlockBrBinop) {
513 EXPECT_VERIFIES_INLINE(sigs.i_i(),
514 WASM_I32_AND(B1(WASM_BRV(0, WASM_I8(1))), WASM_I8(2)));
515}
516
517TEST_F(AstDecoderTest, If_empty1) {
518 EXPECT_VERIFIES_INLINE(sigs.v_v(), WASM_ZERO, kExprIf, kExprEnd);
519}
520
521TEST_F(AstDecoderTest, If_empty2) {
522 EXPECT_VERIFIES_INLINE(sigs.v_v(), WASM_ZERO, kExprIf, kExprElse, kExprEnd);
523}
524
525TEST_F(AstDecoderTest, If_empty3) {
526 EXPECT_VERIFIES_INLINE(sigs.v_v(), WASM_ZERO, kExprIf, WASM_ZERO, kExprElse,
527 kExprEnd);
528}
529
530TEST_F(AstDecoderTest, If_empty4) {
531 EXPECT_VERIFIES_INLINE(sigs.v_v(), WASM_ZERO, kExprIf, kExprElse, WASM_ZERO,
532 kExprEnd);
533}
534
535TEST_F(AstDecoderTest, If_empty_stack) {
536 byte code[] = {kExprIf};
537 EXPECT_FAILURE(sigs.v_v(), code);
538 EXPECT_FAILURE(sigs.i_i(), code);
539}
540
541TEST_F(AstDecoderTest, If_incomplete1) {
542 byte code[] = {kExprI8Const, 0, kExprIf};
543 EXPECT_FAILURE(sigs.v_v(), code);
544 EXPECT_FAILURE(sigs.i_i(), code);
545}
546
547TEST_F(AstDecoderTest, If_incomplete2) {
548 byte code[] = {kExprI8Const, 0, kExprIf, kExprNop};
549 EXPECT_FAILURE(sigs.v_v(), code);
550 EXPECT_FAILURE(sigs.i_i(), code);
551}
552
553TEST_F(AstDecoderTest, If_else_else) {
554 byte code[] = {kExprI8Const, 0, kExprIf, kExprElse, kExprElse, kExprEnd};
555 EXPECT_FAILURE(sigs.v_v(), code);
556 EXPECT_FAILURE(sigs.i_i(), code);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000557}
558
Ben Murdochda12d292016-06-02 14:46:10 +0100559TEST_F(AstDecoderTest, IfEmpty) {
Ben Murdochc5610432016-08-08 18:44:38 +0100560 EXPECT_VERIFIES_INLINE(sigs.v_i(), kExprGetLocal, 0, kExprIf, kExprEnd);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000561}
562
Ben Murdochda12d292016-06-02 14:46:10 +0100563TEST_F(AstDecoderTest, IfSet) {
Ben Murdochc5610432016-08-08 18:44:38 +0100564 EXPECT_VERIFIES_INLINE(
565 sigs.v_i(), WASM_IF(WASM_GET_LOCAL(0), WASM_SET_LOCAL(0, WASM_ZERO)));
566 EXPECT_VERIFIES_INLINE(
567 sigs.v_i(),
568 WASM_IF_ELSE(WASM_GET_LOCAL(0), WASM_SET_LOCAL(0, WASM_ZERO), WASM_NOP));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000569}
570
Ben Murdochda12d292016-06-02 14:46:10 +0100571TEST_F(AstDecoderTest, IfElseEmpty) {
Ben Murdochc5610432016-08-08 18:44:38 +0100572 EXPECT_VERIFIES_INLINE(sigs.v_i(), WASM_GET_LOCAL(0), kExprIf, kExprElse,
573 kExprEnd);
574 EXPECT_VERIFIES_INLINE(sigs.v_i(),
575 WASM_IF_ELSE(WASM_GET_LOCAL(0), WASM_NOP, WASM_NOP));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000576}
577
Ben Murdochc5610432016-08-08 18:44:38 +0100578TEST_F(AstDecoderTest, IfElseUnreachable1) {
579 EXPECT_VERIFIES_INLINE(
580 sigs.i_i(),
581 WASM_IF_ELSE(WASM_GET_LOCAL(0), WASM_UNREACHABLE, WASM_GET_LOCAL(0)));
582 EXPECT_VERIFIES_INLINE(
583 sigs.i_i(),
584 WASM_IF_ELSE(WASM_GET_LOCAL(0), WASM_GET_LOCAL(0), WASM_UNREACHABLE));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000585}
586
Ben Murdochc5610432016-08-08 18:44:38 +0100587TEST_F(AstDecoderTest, IfElseUnreachable2) {
588 static const byte code[] = {
589 WASM_IF_ELSE(WASM_GET_LOCAL(0), WASM_UNREACHABLE, WASM_GET_LOCAL(0))};
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000590
591 for (size_t i = 0; i < arraysize(kLocalTypes); i++) {
592 LocalType types[] = {kAstI32, kLocalTypes[i]};
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000593 FunctionSig sig(1, 1, types);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000594
595 if (kLocalTypes[i] == kAstI32) {
Ben Murdochda12d292016-06-02 14:46:10 +0100596 EXPECT_VERIFIES(&sig, code);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000597 } else {
Ben Murdochda12d292016-06-02 14:46:10 +0100598 EXPECT_FAILURE(&sig, code);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000599 }
600 }
601}
602
Ben Murdochc5610432016-08-08 18:44:38 +0100603TEST_F(AstDecoderTest, IfBreak) {
604 EXPECT_VERIFIES_INLINE(sigs.v_i(), WASM_IF(WASM_GET_LOCAL(0), WASM_BR(0)));
605 EXPECT_FAILURE_INLINE(sigs.v_i(), WASM_IF(WASM_GET_LOCAL(0), WASM_BR(1)));
606}
607
608TEST_F(AstDecoderTest, IfElseBreak) {
609 EXPECT_VERIFIES_INLINE(sigs.v_i(),
610 WASM_IF_ELSE(WASM_GET_LOCAL(0), WASM_NOP, WASM_BR(0)));
611 EXPECT_FAILURE_INLINE(sigs.v_i(),
612 WASM_IF_ELSE(WASM_GET_LOCAL(0), WASM_NOP, WASM_BR(1)));
613}
614
615TEST_F(AstDecoderTest, Block_else) {
616 byte code[] = {kExprI8Const, 0, kExprBlock, kExprElse, kExprEnd};
617 EXPECT_FAILURE(sigs.v_v(), code);
618 EXPECT_FAILURE(sigs.i_i(), code);
619}
620
621TEST_F(AstDecoderTest, IfNop) {
622 EXPECT_VERIFIES_INLINE(sigs.v_i(), WASM_IF(WASM_GET_LOCAL(0), WASM_NOP));
623}
624
625TEST_F(AstDecoderTest, IfNopElseNop) {
626 EXPECT_VERIFIES_INLINE(sigs.v_i(),
627 WASM_IF_ELSE(WASM_GET_LOCAL(0), WASM_NOP, WASM_NOP));
628}
629
630TEST_F(AstDecoderTest, If_end_end) {
631 static const byte code[] = {kExprGetLocal, 0, kExprIf, kExprEnd, kExprEnd};
632 EXPECT_FAILURE(sigs.v_i(), code);
633}
634
635TEST_F(AstDecoderTest, If_falloff) {
636 static const byte code[] = {kExprGetLocal, 0, kExprIf};
637 EXPECT_FAILURE(sigs.v_i(), code);
638}
639
640TEST_F(AstDecoderTest, IfElse_falloff) {
641 static const byte code[] = {kExprGetLocal, 0, kExprIf, kExprNop, kExprElse};
642 EXPECT_FAILURE(sigs.v_i(), code);
643}
644
645TEST_F(AstDecoderTest, IfElseNop) {
646 EXPECT_VERIFIES_INLINE(
647 sigs.v_i(),
648 WASM_IF_ELSE(WASM_GET_LOCAL(0), WASM_SET_LOCAL(0, WASM_ZERO), WASM_NOP));
649}
650
651TEST_F(AstDecoderTest, IfBlock1) {
652 EXPECT_VERIFIES_INLINE(
653 sigs.v_i(), WASM_IF_ELSE(WASM_GET_LOCAL(0),
654 B1(WASM_SET_LOCAL(0, WASM_ZERO)), WASM_NOP));
655}
656
657TEST_F(AstDecoderTest, IfBlock1b) {
658 EXPECT_VERIFIES_INLINE(
659 sigs.v_i(), WASM_IF(WASM_GET_LOCAL(0), B1(WASM_SET_LOCAL(0, WASM_ZERO))));
660}
661
662TEST_F(AstDecoderTest, IfBlock2a) {
663 EXPECT_VERIFIES_INLINE(
664 sigs.v_i(), WASM_IF(WASM_GET_LOCAL(0), B2(WASM_SET_LOCAL(0, WASM_ZERO),
665 WASM_SET_LOCAL(0, WASM_ZERO))));
666}
667
668TEST_F(AstDecoderTest, IfBlock2b) {
669 EXPECT_VERIFIES_INLINE(
670 sigs.v_i(),
671 WASM_IF_ELSE(WASM_GET_LOCAL(0), B2(WASM_SET_LOCAL(0, WASM_ZERO),
672 WASM_SET_LOCAL(0, WASM_ZERO)),
673 WASM_NOP));
674}
675
676TEST_F(AstDecoderTest, IfElseSet) {
677 EXPECT_VERIFIES_INLINE(
678 sigs.v_i(), WASM_IF_ELSE(WASM_GET_LOCAL(0), WASM_SET_LOCAL(0, WASM_ZERO),
679 WASM_SET_LOCAL(0, WASM_I8(1))));
680}
681
Ben Murdochda12d292016-06-02 14:46:10 +0100682TEST_F(AstDecoderTest, Loop0) {
Ben Murdochc5610432016-08-08 18:44:38 +0100683 static const byte code[] = {kExprLoop, kExprEnd};
Ben Murdochda12d292016-06-02 14:46:10 +0100684 EXPECT_VERIFIES(sigs.v_v(), code);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000685}
686
Ben Murdochda12d292016-06-02 14:46:10 +0100687TEST_F(AstDecoderTest, Loop1) {
Ben Murdochc5610432016-08-08 18:44:38 +0100688 static const byte code[] = {WASM_LOOP(1, WASM_SET_LOCAL(0, WASM_ZERO))};
Ben Murdochda12d292016-06-02 14:46:10 +0100689 EXPECT_VERIFIES(sigs.v_i(), code);
Ben Murdochc5610432016-08-08 18:44:38 +0100690 EXPECT_FAILURE(sigs.v_v(), code);
691 EXPECT_FAILURE(sigs.f_ff(), code);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000692}
693
Ben Murdochda12d292016-06-02 14:46:10 +0100694TEST_F(AstDecoderTest, Loop2) {
Ben Murdochc5610432016-08-08 18:44:38 +0100695 EXPECT_VERIFIES_INLINE(sigs.v_i(), WASM_LOOP(2, WASM_SET_LOCAL(0, WASM_ZERO),
696 WASM_SET_LOCAL(0, WASM_ZERO)));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000697}
698
Ben Murdochda12d292016-06-02 14:46:10 +0100699TEST_F(AstDecoderTest, Loop1_continue) {
Ben Murdochc5610432016-08-08 18:44:38 +0100700 EXPECT_VERIFIES_INLINE(sigs.v_v(), WASM_LOOP(1, WASM_BR(0)));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000701}
702
Ben Murdochda12d292016-06-02 14:46:10 +0100703TEST_F(AstDecoderTest, Loop1_break) {
Ben Murdochc5610432016-08-08 18:44:38 +0100704 EXPECT_VERIFIES_INLINE(sigs.v_v(), WASM_LOOP(1, WASM_BR(1)));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000705}
706
Ben Murdochda12d292016-06-02 14:46:10 +0100707TEST_F(AstDecoderTest, Loop2_continue) {
Ben Murdochc5610432016-08-08 18:44:38 +0100708 EXPECT_VERIFIES_INLINE(
709 sigs.v_i(), WASM_LOOP(2, WASM_SET_LOCAL(0, WASM_ZERO), WASM_BR(0)));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000710}
711
Ben Murdochda12d292016-06-02 14:46:10 +0100712TEST_F(AstDecoderTest, Loop2_break) {
Ben Murdochc5610432016-08-08 18:44:38 +0100713 EXPECT_VERIFIES_INLINE(
714 sigs.v_i(), WASM_LOOP(2, WASM_SET_LOCAL(0, WASM_ZERO), WASM_BR(1)));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000715}
716
Ben Murdochda12d292016-06-02 14:46:10 +0100717TEST_F(AstDecoderTest, ExprLoop0) {
Ben Murdochc5610432016-08-08 18:44:38 +0100718 static const byte code[] = {kExprLoop, kExprEnd};
Ben Murdochda12d292016-06-02 14:46:10 +0100719 EXPECT_VERIFIES(sigs.v_v(), code);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000720}
721
Ben Murdochda12d292016-06-02 14:46:10 +0100722TEST_F(AstDecoderTest, ExprLoop1a) {
Ben Murdochc5610432016-08-08 18:44:38 +0100723 EXPECT_VERIFIES_INLINE(sigs.i_i(), WASM_LOOP(1, WASM_BRV(0, WASM_ZERO)));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000724}
725
Ben Murdochda12d292016-06-02 14:46:10 +0100726TEST_F(AstDecoderTest, ExprLoop1b) {
Ben Murdochc5610432016-08-08 18:44:38 +0100727 EXPECT_VERIFIES_INLINE(sigs.i_i(), WASM_LOOP(1, WASM_BRV(1, WASM_ZERO)));
728 EXPECT_FAILURE_INLINE(sigs.f_ff(), WASM_LOOP(1, WASM_BRV(1, WASM_ZERO)));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000729}
730
Ben Murdochda12d292016-06-02 14:46:10 +0100731TEST_F(AstDecoderTest, ExprLoop2_unreachable) {
Ben Murdochc5610432016-08-08 18:44:38 +0100732 EXPECT_VERIFIES_INLINE(sigs.i_i(), WASM_LOOP(2, WASM_BR(0), WASM_NOP));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000733}
734
Ben Murdochda12d292016-06-02 14:46:10 +0100735TEST_F(AstDecoderTest, ReturnVoid1) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000736 static const byte code[] = {kExprNop};
Ben Murdochda12d292016-06-02 14:46:10 +0100737 EXPECT_VERIFIES(sigs.v_v(), code);
738 EXPECT_FAILURE(sigs.i_i(), code);
739 EXPECT_FAILURE(sigs.i_f(), code);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000740}
741
Ben Murdochda12d292016-06-02 14:46:10 +0100742TEST_F(AstDecoderTest, ReturnVoid2) {
Ben Murdochc5610432016-08-08 18:44:38 +0100743 static const byte code[] = {kExprBlock, kExprBr, ARITY_0, DEPTH_0, kExprEnd};
Ben Murdochda12d292016-06-02 14:46:10 +0100744 EXPECT_VERIFIES(sigs.v_v(), code);
745 EXPECT_FAILURE(sigs.i_i(), code);
746 EXPECT_FAILURE(sigs.i_f(), code);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000747}
748
Ben Murdochda12d292016-06-02 14:46:10 +0100749TEST_F(AstDecoderTest, ReturnVoid3) {
750 EXPECT_VERIFIES_INLINE(sigs.v_v(), kExprI8Const, 0);
751 EXPECT_VERIFIES_INLINE(sigs.v_v(), kExprI32Const, 0, 0, 0, 0);
752 EXPECT_VERIFIES_INLINE(sigs.v_v(), kExprI64Const, 0, 0, 0, 0, 0, 0, 0, 0);
753 EXPECT_VERIFIES_INLINE(sigs.v_v(), kExprF32Const, 0, 0, 0, 0);
754 EXPECT_VERIFIES_INLINE(sigs.v_v(), kExprF64Const, 0, 0, 0, 0, 0, 0, 0, 0);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000755
Ben Murdochda12d292016-06-02 14:46:10 +0100756 EXPECT_VERIFIES_INLINE(sigs.v_i(), kExprGetLocal, 0);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000757}
758
Ben Murdochda12d292016-06-02 14:46:10 +0100759TEST_F(AstDecoderTest, Unreachable1) {
760 EXPECT_VERIFIES_INLINE(sigs.v_v(), kExprUnreachable);
761 EXPECT_VERIFIES_INLINE(sigs.v_v(), kExprUnreachable, kExprUnreachable);
Ben Murdochc5610432016-08-08 18:44:38 +0100762 EXPECT_VERIFIES_INLINE(sigs.v_v(), B2(WASM_UNREACHABLE, WASM_ZERO));
763 EXPECT_VERIFIES_INLINE(sigs.v_v(), B2(WASM_BR(0), WASM_ZERO));
Ben Murdochda12d292016-06-02 14:46:10 +0100764 EXPECT_VERIFIES_INLINE(sigs.v_v(), WASM_LOOP(2, WASM_UNREACHABLE, WASM_ZERO));
765 EXPECT_VERIFIES_INLINE(sigs.v_v(), WASM_LOOP(2, WASM_BR(0), WASM_ZERO));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000766}
767
Ben Murdochc5610432016-08-08 18:44:38 +0100768TEST_F(AstDecoderTest, Unreachable_binop) {
769 EXPECT_VERIFIES_INLINE(sigs.i_i(), WASM_I32_AND(WASM_ZERO, WASM_UNREACHABLE));
770 EXPECT_VERIFIES_INLINE(sigs.i_i(), WASM_I32_AND(WASM_UNREACHABLE, WASM_ZERO));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000771}
772
Ben Murdochc5610432016-08-08 18:44:38 +0100773TEST_F(AstDecoderTest, Unreachable_select) {
774 EXPECT_VERIFIES_INLINE(sigs.i_i(),
775 WASM_SELECT(WASM_UNREACHABLE, WASM_ZERO, WASM_ZERO));
776 EXPECT_VERIFIES_INLINE(sigs.i_i(),
777 WASM_SELECT(WASM_ZERO, WASM_UNREACHABLE, WASM_ZERO));
778 EXPECT_VERIFIES_INLINE(sigs.i_i(),
779 WASM_SELECT(WASM_ZERO, WASM_ZERO, WASM_UNREACHABLE));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000780}
781
Ben Murdochc5610432016-08-08 18:44:38 +0100782TEST_F(AstDecoderTest, If1) {
783 EXPECT_VERIFIES_INLINE(
784 sigs.i_i(), WASM_IF_ELSE(WASM_GET_LOCAL(0), WASM_I8(9), WASM_I8(8)));
785 EXPECT_VERIFIES_INLINE(sigs.i_i(), WASM_IF_ELSE(WASM_GET_LOCAL(0), WASM_I8(9),
786 WASM_GET_LOCAL(0)));
787 EXPECT_VERIFIES_INLINE(
788 sigs.i_i(),
789 WASM_IF_ELSE(WASM_GET_LOCAL(0), WASM_GET_LOCAL(0), WASM_I8(8)));
790}
791
792TEST_F(AstDecoderTest, If_off_end) {
793 static const byte kCode[] = {
794 WASM_IF_ELSE(WASM_GET_LOCAL(0), WASM_GET_LOCAL(0), WASM_GET_LOCAL(0))};
795 for (size_t len = 3; len < arraysize(kCode); len++) {
Ben Murdochda12d292016-06-02 14:46:10 +0100796 Verify(kError, sigs.i_i(), kCode, kCode + len);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000797 }
798}
799
Ben Murdochc5610432016-08-08 18:44:38 +0100800TEST_F(AstDecoderTest, If_type1) {
801 // float|double ? 1 : 2
802 static const byte kCode[] = {
803 WASM_IF_ELSE(WASM_GET_LOCAL(0), WASM_I8(0), WASM_I8(2))};
804 EXPECT_VERIFIES(sigs.i_i(), kCode);
805 EXPECT_FAILURE(sigs.i_f(), kCode);
806 EXPECT_FAILURE(sigs.i_d(), kCode);
807}
808
809TEST_F(AstDecoderTest, If_type2) {
810 // 1 ? float|double : 2
811 static const byte kCode[] = {
812 WASM_IF_ELSE(WASM_I8(1), WASM_GET_LOCAL(0), WASM_I8(1))};
813 EXPECT_VERIFIES(sigs.i_i(), kCode);
814 EXPECT_FAILURE(sigs.i_f(), kCode);
815 EXPECT_FAILURE(sigs.i_d(), kCode);
816}
817
818TEST_F(AstDecoderTest, If_type3) {
819 // stmt ? 0 : 1
820 static const byte kCode[] = {WASM_IF_ELSE(WASM_NOP, WASM_I8(0), WASM_I8(1))};
821 EXPECT_FAILURE(sigs.i_i(), kCode);
822 EXPECT_FAILURE(sigs.i_f(), kCode);
823 EXPECT_FAILURE(sigs.i_d(), kCode);
824}
825
826TEST_F(AstDecoderTest, If_type4) {
827 // 0 ? stmt : 1
828 static const byte kCode[] = {
829 WASM_IF_ELSE(WASM_GET_LOCAL(0), WASM_NOP, WASM_I8(1))};
830 EXPECT_FAILURE(sigs.i_i(), kCode);
831 EXPECT_FAILURE(sigs.i_f(), kCode);
832 EXPECT_FAILURE(sigs.i_d(), kCode);
833}
834
835TEST_F(AstDecoderTest, If_type5) {
836 // 0 ? 1 : stmt
837 static const byte kCode[] = {WASM_IF_ELSE(WASM_ZERO, WASM_I8(1), WASM_NOP)};
838 EXPECT_FAILURE(sigs.i_i(), kCode);
839 EXPECT_FAILURE(sigs.i_f(), kCode);
840 EXPECT_FAILURE(sigs.i_d(), kCode);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000841}
842
Ben Murdochda12d292016-06-02 14:46:10 +0100843TEST_F(AstDecoderTest, Int64Local_param) {
844 EXPECT_VERIFIES(sigs.l_l(), kCodeGetLocal0);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000845}
846
Ben Murdochda12d292016-06-02 14:46:10 +0100847TEST_F(AstDecoderTest, Int64Locals) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000848 for (byte i = 1; i < 8; i++) {
Ben Murdochda12d292016-06-02 14:46:10 +0100849 AddLocals(kAstI64, 1);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000850 for (byte j = 0; j < i; j++) {
Ben Murdochc5610432016-08-08 18:44:38 +0100851 EXPECT_VERIFIES_INLINE(sigs.l_v(), WASM_GET_LOCAL(j));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000852 }
853 }
854}
855
Ben Murdochda12d292016-06-02 14:46:10 +0100856TEST_F(AstDecoderTest, Int32Binops) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000857 TestBinop(kExprI32Add, sigs.i_ii());
858 TestBinop(kExprI32Sub, sigs.i_ii());
859 TestBinop(kExprI32Mul, sigs.i_ii());
860 TestBinop(kExprI32DivS, sigs.i_ii());
861 TestBinop(kExprI32DivU, sigs.i_ii());
862 TestBinop(kExprI32RemS, sigs.i_ii());
863 TestBinop(kExprI32RemU, sigs.i_ii());
864 TestBinop(kExprI32And, sigs.i_ii());
865 TestBinop(kExprI32Ior, sigs.i_ii());
866 TestBinop(kExprI32Xor, sigs.i_ii());
867 TestBinop(kExprI32Shl, sigs.i_ii());
868 TestBinop(kExprI32ShrU, sigs.i_ii());
869 TestBinop(kExprI32ShrS, sigs.i_ii());
870 TestBinop(kExprI32Eq, sigs.i_ii());
871 TestBinop(kExprI32LtS, sigs.i_ii());
872 TestBinop(kExprI32LeS, sigs.i_ii());
873 TestBinop(kExprI32LtU, sigs.i_ii());
874 TestBinop(kExprI32LeU, sigs.i_ii());
875}
876
Ben Murdochda12d292016-06-02 14:46:10 +0100877TEST_F(AstDecoderTest, DoubleBinops) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000878 TestBinop(kExprF64Add, sigs.d_dd());
879 TestBinop(kExprF64Sub, sigs.d_dd());
880 TestBinop(kExprF64Mul, sigs.d_dd());
881 TestBinop(kExprF64Div, sigs.d_dd());
882
883 TestBinop(kExprF64Eq, sigs.i_dd());
884 TestBinop(kExprF64Lt, sigs.i_dd());
885 TestBinop(kExprF64Le, sigs.i_dd());
886}
887
Ben Murdochda12d292016-06-02 14:46:10 +0100888TEST_F(AstDecoderTest, FloatBinops) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000889 TestBinop(kExprF32Add, sigs.f_ff());
890 TestBinop(kExprF32Sub, sigs.f_ff());
891 TestBinop(kExprF32Mul, sigs.f_ff());
892 TestBinop(kExprF32Div, sigs.f_ff());
893
894 TestBinop(kExprF32Eq, sigs.i_ff());
895 TestBinop(kExprF32Lt, sigs.i_ff());
896 TestBinop(kExprF32Le, sigs.i_ff());
897}
898
Ben Murdochda12d292016-06-02 14:46:10 +0100899TEST_F(AstDecoderTest, TypeConversions) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000900 TestUnop(kExprI32SConvertF32, kAstI32, kAstF32);
901 TestUnop(kExprI32SConvertF64, kAstI32, kAstF64);
902 TestUnop(kExprI32UConvertF32, kAstI32, kAstF32);
903 TestUnop(kExprI32UConvertF64, kAstI32, kAstF64);
904 TestUnop(kExprF64SConvertI32, kAstF64, kAstI32);
905 TestUnop(kExprF64UConvertI32, kAstF64, kAstI32);
906 TestUnop(kExprF64ConvertF32, kAstF64, kAstF32);
907 TestUnop(kExprF32SConvertI32, kAstF32, kAstI32);
908 TestUnop(kExprF32UConvertI32, kAstF32, kAstI32);
909 TestUnop(kExprF32ConvertF64, kAstF32, kAstF64);
910}
911
Ben Murdochda12d292016-06-02 14:46:10 +0100912TEST_F(AstDecoderTest, MacrosStmt) {
913 VERIFY(WASM_SET_LOCAL(0, WASM_I32V_3(87348)));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000914 VERIFY(WASM_STORE_MEM(MachineType::Int32(), WASM_I8(24), WASM_I8(40)));
915 VERIFY(WASM_IF(WASM_GET_LOCAL(0), WASM_NOP));
916 VERIFY(WASM_IF_ELSE(WASM_GET_LOCAL(0), WASM_NOP, WASM_NOP));
917 VERIFY(WASM_NOP);
Ben Murdochc5610432016-08-08 18:44:38 +0100918 VERIFY(B1(WASM_NOP));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000919 VERIFY(WASM_LOOP(1, WASM_NOP));
920 VERIFY(WASM_LOOP(1, WASM_BREAK(0)));
921 VERIFY(WASM_LOOP(1, WASM_CONTINUE(0)));
922}
923
Ben Murdochda12d292016-06-02 14:46:10 +0100924TEST_F(AstDecoderTest, MacrosBreak) {
925 EXPECT_VERIFIES_INLINE(sigs.v_v(), WASM_LOOP(1, WASM_BREAK(0)));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000926
Ben Murdochda12d292016-06-02 14:46:10 +0100927 EXPECT_VERIFIES_INLINE(sigs.i_i(), WASM_LOOP(1, WASM_BREAKV(0, WASM_ZERO)));
928 EXPECT_VERIFIES_INLINE(sigs.l_l(),
929 WASM_LOOP(1, WASM_BREAKV(0, WASM_I64V_1(0))));
930 EXPECT_VERIFIES_INLINE(sigs.f_ff(),
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000931 WASM_LOOP(1, WASM_BREAKV(0, WASM_F32(0.0))));
Ben Murdochda12d292016-06-02 14:46:10 +0100932 EXPECT_VERIFIES_INLINE(sigs.d_dd(),
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000933 WASM_LOOP(1, WASM_BREAKV(0, WASM_F64(0.0))));
934}
935
Ben Murdochda12d292016-06-02 14:46:10 +0100936TEST_F(AstDecoderTest, MacrosContinue) {
937 EXPECT_VERIFIES_INLINE(sigs.v_v(), WASM_LOOP(1, WASM_CONTINUE(0)));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000938}
939
Ben Murdochda12d292016-06-02 14:46:10 +0100940TEST_F(AstDecoderTest, MacrosVariadic) {
Ben Murdochc5610432016-08-08 18:44:38 +0100941 VERIFY(B2(WASM_NOP, WASM_NOP));
942 VERIFY(B3(WASM_NOP, WASM_NOP, WASM_NOP));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000943 VERIFY(WASM_LOOP(2, WASM_NOP, WASM_NOP));
944 VERIFY(WASM_LOOP(3, WASM_NOP, WASM_NOP, WASM_NOP));
945}
946
Ben Murdochda12d292016-06-02 14:46:10 +0100947TEST_F(AstDecoderTest, MacrosNestedBlocks) {
Ben Murdochc5610432016-08-08 18:44:38 +0100948 VERIFY(B2(WASM_NOP, B2(WASM_NOP, WASM_NOP)));
949 VERIFY(B3(WASM_NOP, // --
950 B2(WASM_NOP, WASM_NOP), // --
951 B2(WASM_NOP, WASM_NOP))); // --
952 VERIFY(B1(B1(B2(WASM_NOP, WASM_NOP))));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000953}
954
Ben Murdochda12d292016-06-02 14:46:10 +0100955TEST_F(AstDecoderTest, MultipleReturn) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000956 static LocalType kIntTypes5[] = {kAstI32, kAstI32, kAstI32, kAstI32, kAstI32};
957 FunctionSig sig_ii_v(2, 0, kIntTypes5);
Ben Murdochc5610432016-08-08 18:44:38 +0100958 EXPECT_VERIFIES_INLINE(&sig_ii_v, WASM_RETURNN(2, WASM_ZERO, WASM_ONE));
959 EXPECT_FAILURE_INLINE(&sig_ii_v, WASM_RETURNN(1, WASM_ZERO));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000960
961 FunctionSig sig_iii_v(3, 0, kIntTypes5);
Ben Murdochda12d292016-06-02 14:46:10 +0100962 EXPECT_VERIFIES_INLINE(&sig_iii_v,
Ben Murdochc5610432016-08-08 18:44:38 +0100963 WASM_RETURNN(3, WASM_ZERO, WASM_ONE, WASM_I8(44)));
964 EXPECT_FAILURE_INLINE(&sig_iii_v, WASM_RETURNN(2, WASM_ZERO, WASM_ONE));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000965}
966
Ben Murdochda12d292016-06-02 14:46:10 +0100967TEST_F(AstDecoderTest, MultipleReturn_fallthru) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000968 static LocalType kIntTypes5[] = {kAstI32, kAstI32, kAstI32, kAstI32, kAstI32};
969 FunctionSig sig_ii_v(2, 0, kIntTypes5);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000970
Ben Murdochda12d292016-06-02 14:46:10 +0100971 EXPECT_VERIFIES_INLINE(&sig_ii_v, WASM_ZERO, WASM_ONE);
972 EXPECT_FAILURE_INLINE(&sig_ii_v, WASM_ZERO);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000973
974 FunctionSig sig_iii_v(3, 0, kIntTypes5);
Ben Murdochda12d292016-06-02 14:46:10 +0100975 EXPECT_VERIFIES_INLINE(&sig_iii_v, WASM_ZERO, WASM_ONE, WASM_I8(44));
976 EXPECT_FAILURE_INLINE(&sig_iii_v, WASM_ZERO, WASM_ONE);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000977}
978
Ben Murdochda12d292016-06-02 14:46:10 +0100979TEST_F(AstDecoderTest, MacrosInt32) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000980 VERIFY(WASM_I32_ADD(WASM_GET_LOCAL(0), WASM_I8(12)));
981 VERIFY(WASM_I32_SUB(WASM_GET_LOCAL(0), WASM_I8(13)));
982 VERIFY(WASM_I32_MUL(WASM_GET_LOCAL(0), WASM_I8(14)));
983 VERIFY(WASM_I32_DIVS(WASM_GET_LOCAL(0), WASM_I8(15)));
984 VERIFY(WASM_I32_DIVU(WASM_GET_LOCAL(0), WASM_I8(16)));
985 VERIFY(WASM_I32_REMS(WASM_GET_LOCAL(0), WASM_I8(17)));
986 VERIFY(WASM_I32_REMU(WASM_GET_LOCAL(0), WASM_I8(18)));
987 VERIFY(WASM_I32_AND(WASM_GET_LOCAL(0), WASM_I8(19)));
988 VERIFY(WASM_I32_IOR(WASM_GET_LOCAL(0), WASM_I8(20)));
989 VERIFY(WASM_I32_XOR(WASM_GET_LOCAL(0), WASM_I8(21)));
990 VERIFY(WASM_I32_SHL(WASM_GET_LOCAL(0), WASM_I8(22)));
991 VERIFY(WASM_I32_SHR(WASM_GET_LOCAL(0), WASM_I8(23)));
992 VERIFY(WASM_I32_SAR(WASM_GET_LOCAL(0), WASM_I8(24)));
Ben Murdochda12d292016-06-02 14:46:10 +0100993 VERIFY(WASM_I32_ROR(WASM_GET_LOCAL(0), WASM_I8(24)));
994 VERIFY(WASM_I32_ROL(WASM_GET_LOCAL(0), WASM_I8(24)));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000995 VERIFY(WASM_I32_EQ(WASM_GET_LOCAL(0), WASM_I8(25)));
996 VERIFY(WASM_I32_NE(WASM_GET_LOCAL(0), WASM_I8(25)));
997
998 VERIFY(WASM_I32_LTS(WASM_GET_LOCAL(0), WASM_I8(26)));
999 VERIFY(WASM_I32_LES(WASM_GET_LOCAL(0), WASM_I8(27)));
1000 VERIFY(WASM_I32_LTU(WASM_GET_LOCAL(0), WASM_I8(28)));
1001 VERIFY(WASM_I32_LEU(WASM_GET_LOCAL(0), WASM_I8(29)));
1002
1003 VERIFY(WASM_I32_GTS(WASM_GET_LOCAL(0), WASM_I8(26)));
1004 VERIFY(WASM_I32_GES(WASM_GET_LOCAL(0), WASM_I8(27)));
1005 VERIFY(WASM_I32_GTU(WASM_GET_LOCAL(0), WASM_I8(28)));
1006 VERIFY(WASM_I32_GEU(WASM_GET_LOCAL(0), WASM_I8(29)));
1007}
1008
Ben Murdochda12d292016-06-02 14:46:10 +01001009TEST_F(AstDecoderTest, MacrosInt64) {
1010#define VERIFY_L_LL(...) EXPECT_VERIFIES_INLINE(sigs.l_ll(), __VA_ARGS__)
1011#define VERIFY_I_LL(...) EXPECT_VERIFIES_INLINE(sigs.i_ll(), __VA_ARGS__)
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001012
Ben Murdochda12d292016-06-02 14:46:10 +01001013 VERIFY_L_LL(WASM_I64_ADD(WASM_GET_LOCAL(0), WASM_I64V_1(12)));
1014 VERIFY_L_LL(WASM_I64_SUB(WASM_GET_LOCAL(0), WASM_I64V_1(13)));
1015 VERIFY_L_LL(WASM_I64_MUL(WASM_GET_LOCAL(0), WASM_I64V_1(14)));
1016 VERIFY_L_LL(WASM_I64_DIVS(WASM_GET_LOCAL(0), WASM_I64V_1(15)));
1017 VERIFY_L_LL(WASM_I64_DIVU(WASM_GET_LOCAL(0), WASM_I64V_1(16)));
1018 VERIFY_L_LL(WASM_I64_REMS(WASM_GET_LOCAL(0), WASM_I64V_1(17)));
1019 VERIFY_L_LL(WASM_I64_REMU(WASM_GET_LOCAL(0), WASM_I64V_1(18)));
1020 VERIFY_L_LL(WASM_I64_AND(WASM_GET_LOCAL(0), WASM_I64V_1(19)));
1021 VERIFY_L_LL(WASM_I64_IOR(WASM_GET_LOCAL(0), WASM_I64V_1(20)));
1022 VERIFY_L_LL(WASM_I64_XOR(WASM_GET_LOCAL(0), WASM_I64V_1(21)));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001023
Ben Murdochda12d292016-06-02 14:46:10 +01001024 VERIFY_L_LL(WASM_I64_SHL(WASM_GET_LOCAL(0), WASM_I64V_1(22)));
1025 VERIFY_L_LL(WASM_I64_SHR(WASM_GET_LOCAL(0), WASM_I64V_1(23)));
1026 VERIFY_L_LL(WASM_I64_SAR(WASM_GET_LOCAL(0), WASM_I64V_1(24)));
1027 VERIFY_L_LL(WASM_I64_ROR(WASM_GET_LOCAL(0), WASM_I64V_1(24)));
1028 VERIFY_L_LL(WASM_I64_ROL(WASM_GET_LOCAL(0), WASM_I64V_1(24)));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001029
Ben Murdochda12d292016-06-02 14:46:10 +01001030 VERIFY_I_LL(WASM_I64_LTS(WASM_GET_LOCAL(0), WASM_I64V_1(26)));
1031 VERIFY_I_LL(WASM_I64_LES(WASM_GET_LOCAL(0), WASM_I64V_1(27)));
1032 VERIFY_I_LL(WASM_I64_LTU(WASM_GET_LOCAL(0), WASM_I64V_1(28)));
1033 VERIFY_I_LL(WASM_I64_LEU(WASM_GET_LOCAL(0), WASM_I64V_1(29)));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001034
Ben Murdochda12d292016-06-02 14:46:10 +01001035 VERIFY_I_LL(WASM_I64_GTS(WASM_GET_LOCAL(0), WASM_I64V_1(26)));
1036 VERIFY_I_LL(WASM_I64_GES(WASM_GET_LOCAL(0), WASM_I64V_1(27)));
1037 VERIFY_I_LL(WASM_I64_GTU(WASM_GET_LOCAL(0), WASM_I64V_1(28)));
1038 VERIFY_I_LL(WASM_I64_GEU(WASM_GET_LOCAL(0), WASM_I64V_1(29)));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001039
Ben Murdochda12d292016-06-02 14:46:10 +01001040 VERIFY_I_LL(WASM_I64_EQ(WASM_GET_LOCAL(0), WASM_I64V_1(25)));
1041 VERIFY_I_LL(WASM_I64_NE(WASM_GET_LOCAL(0), WASM_I64V_1(25)));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001042}
1043
Ben Murdochda12d292016-06-02 14:46:10 +01001044TEST_F(AstDecoderTest, AllSimpleExpressions) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001045// Test all simple expressions which are described by a signature.
1046#define DECODE_TEST(name, opcode, sig) \
1047 { \
1048 FunctionSig* sig = WasmOpcodes::Signature(kExpr##name); \
1049 if (sig->parameter_count() == 1) { \
1050 TestUnop(kExpr##name, sig); \
1051 } else { \
1052 TestBinop(kExpr##name, sig); \
1053 } \
1054 }
1055
1056 FOREACH_SIMPLE_OPCODE(DECODE_TEST);
1057
1058#undef DECODE_TEST
1059}
1060
Ben Murdochda12d292016-06-02 14:46:10 +01001061TEST_F(AstDecoderTest, MemorySize) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001062 byte code[] = {kExprMemorySize};
Ben Murdochda12d292016-06-02 14:46:10 +01001063 EXPECT_VERIFIES(sigs.i_i(), code);
1064 EXPECT_FAILURE(sigs.f_ff(), code);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001065}
1066
Ben Murdochda12d292016-06-02 14:46:10 +01001067TEST_F(AstDecoderTest, GrowMemory) {
Ben Murdochc5610432016-08-08 18:44:38 +01001068 byte code[] = {WASM_UNOP(kExprGrowMemory, WASM_GET_LOCAL(0))};
Ben Murdochda12d292016-06-02 14:46:10 +01001069 EXPECT_VERIFIES(sigs.i_i(), code);
1070 EXPECT_FAILURE(sigs.i_d(), code);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001071}
1072
Ben Murdochda12d292016-06-02 14:46:10 +01001073TEST_F(AstDecoderTest, LoadMemOffset) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001074 for (int offset = 0; offset < 128; offset += 7) {
Ben Murdochc5610432016-08-08 18:44:38 +01001075 byte code[] = {kExprI8Const, 0, kExprI32LoadMem, ZERO_ALIGNMENT,
1076 static_cast<byte>(offset)};
Ben Murdochda12d292016-06-02 14:46:10 +01001077 EXPECT_VERIFIES(sigs.i_i(), code);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001078 }
1079}
1080
Ben Murdochda12d292016-06-02 14:46:10 +01001081TEST_F(AstDecoderTest, StoreMemOffset) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001082 for (int offset = 0; offset < 128; offset += 7) {
Ben Murdochc5610432016-08-08 18:44:38 +01001083 byte code[] = {WASM_STORE_MEM_OFFSET(MachineType::Int32(), offset,
1084 WASM_ZERO, WASM_ZERO)};
Ben Murdochda12d292016-06-02 14:46:10 +01001085 EXPECT_VERIFIES(sigs.i_i(), code);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001086 }
1087}
1088
Ben Murdochc5610432016-08-08 18:44:38 +01001089#define BYTE0(x) ((x)&0x7F)
1090#define BYTE1(x) ((x >> 7) & 0x7F)
1091#define BYTE2(x) ((x >> 14) & 0x7F)
1092#define BYTE3(x) ((x >> 21) & 0x7F)
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001093
Ben Murdochc5610432016-08-08 18:44:38 +01001094#define VARINT1(x) BYTE0(x)
1095#define VARINT2(x) BYTE0(x) | 0x80, BYTE1(x)
1096#define VARINT3(x) BYTE0(x) | 0x80, BYTE1(x) | 0x80, BYTE2(x)
1097#define VARINT4(x) BYTE0(x) | 0x80, BYTE1(x) | 0x80, BYTE2(x) | 0x80, BYTE3(x)
1098
1099TEST_F(AstDecoderTest, LoadMemOffset_varint) {
1100 EXPECT_VERIFIES_INLINE(sigs.i_i(), WASM_ZERO, kExprI32LoadMem, ZERO_ALIGNMENT,
1101 VARINT1(0x45));
1102 EXPECT_VERIFIES_INLINE(sigs.i_i(), WASM_ZERO, kExprI32LoadMem, ZERO_ALIGNMENT,
1103 VARINT2(0x3999));
1104 EXPECT_VERIFIES_INLINE(sigs.i_i(), WASM_ZERO, kExprI32LoadMem, ZERO_ALIGNMENT,
1105 VARINT3(0x344445));
1106 EXPECT_VERIFIES_INLINE(sigs.i_i(), WASM_ZERO, kExprI32LoadMem, ZERO_ALIGNMENT,
1107 VARINT4(0x36666667));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001108}
1109
Ben Murdochda12d292016-06-02 14:46:10 +01001110TEST_F(AstDecoderTest, StoreMemOffset_varint) {
Ben Murdochc5610432016-08-08 18:44:38 +01001111 EXPECT_VERIFIES_INLINE(sigs.i_i(), WASM_ZERO, WASM_ZERO, kExprI32StoreMem,
1112 ZERO_ALIGNMENT, VARINT1(0x33));
1113 EXPECT_VERIFIES_INLINE(sigs.i_i(), WASM_ZERO, WASM_ZERO, kExprI32StoreMem,
1114 ZERO_ALIGNMENT, VARINT2(0x1111));
1115 EXPECT_VERIFIES_INLINE(sigs.i_i(), WASM_ZERO, WASM_ZERO, kExprI32StoreMem,
1116 ZERO_ALIGNMENT, VARINT3(0x222222));
1117 EXPECT_VERIFIES_INLINE(sigs.i_i(), WASM_ZERO, WASM_ZERO, kExprI32StoreMem,
1118 ZERO_ALIGNMENT, VARINT4(0x44444444));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001119}
1120
Ben Murdochda12d292016-06-02 14:46:10 +01001121TEST_F(AstDecoderTest, AllLoadMemCombinations) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001122 for (size_t i = 0; i < arraysize(kLocalTypes); i++) {
1123 LocalType local_type = kLocalTypes[i];
1124 for (size_t j = 0; j < arraysize(machineTypes); j++) {
1125 MachineType mem_type = machineTypes[j];
Ben Murdochc5610432016-08-08 18:44:38 +01001126 byte code[] = {WASM_LOAD_MEM(mem_type, WASM_ZERO)};
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001127 FunctionSig sig(1, 0, &local_type);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001128 if (local_type == WasmOpcodes::LocalTypeFor(mem_type)) {
Ben Murdochda12d292016-06-02 14:46:10 +01001129 EXPECT_VERIFIES(&sig, code);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001130 } else {
Ben Murdochda12d292016-06-02 14:46:10 +01001131 EXPECT_FAILURE(&sig, code);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001132 }
1133 }
1134 }
1135}
1136
Ben Murdochda12d292016-06-02 14:46:10 +01001137TEST_F(AstDecoderTest, AllStoreMemCombinations) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001138 for (size_t i = 0; i < arraysize(kLocalTypes); i++) {
1139 LocalType local_type = kLocalTypes[i];
1140 for (size_t j = 0; j < arraysize(machineTypes); j++) {
1141 MachineType mem_type = machineTypes[j];
Ben Murdochc5610432016-08-08 18:44:38 +01001142 byte code[] = {WASM_STORE_MEM(mem_type, WASM_ZERO, WASM_GET_LOCAL(0))};
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001143 FunctionSig sig(0, 1, &local_type);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001144 if (local_type == WasmOpcodes::LocalTypeFor(mem_type)) {
Ben Murdochda12d292016-06-02 14:46:10 +01001145 EXPECT_VERIFIES(&sig, code);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001146 } else {
Ben Murdochda12d292016-06-02 14:46:10 +01001147 EXPECT_FAILURE(&sig, code);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001148 }
1149 }
1150 }
1151}
1152
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001153namespace {
1154// A helper for tests that require a module environment for functions and
1155// globals.
1156class TestModuleEnv : public ModuleEnv {
1157 public:
1158 TestModuleEnv() {
Ben Murdoch097c5b22016-05-18 11:27:45 +01001159 instance = nullptr;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001160 module = &mod;
1161 linker = nullptr;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001162 }
1163 byte AddGlobal(MachineType mem_type) {
Ben Murdochda12d292016-06-02 14:46:10 +01001164 mod.globals.push_back({0, 0, mem_type, 0, false});
1165 CHECK(mod.globals.size() <= 127);
1166 return static_cast<byte>(mod.globals.size() - 1);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001167 }
1168 byte AddSignature(FunctionSig* sig) {
Ben Murdochda12d292016-06-02 14:46:10 +01001169 mod.signatures.push_back(sig);
1170 CHECK(mod.signatures.size() <= 127);
1171 return static_cast<byte>(mod.signatures.size() - 1);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001172 }
1173 byte AddFunction(FunctionSig* sig) {
Ben Murdochc5610432016-08-08 18:44:38 +01001174 mod.functions.push_back({sig, // sig
1175 0, // func_index
1176 0, // sig_index
1177 0, // name_offset
1178 0, // name_length
1179 0, // code_start_offset
1180 0, // code_end_offset
1181 false}); // exported
Ben Murdochda12d292016-06-02 14:46:10 +01001182 CHECK(mod.functions.size() <= 127);
1183 return static_cast<byte>(mod.functions.size() - 1);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001184 }
Ben Murdoch097c5b22016-05-18 11:27:45 +01001185 byte AddImport(FunctionSig* sig) {
Ben Murdochc5610432016-08-08 18:44:38 +01001186 mod.import_table.push_back({sig, // sig
1187 0, // sig_index
1188 0, // module_name_offset
1189 0, // module_name_length
1190 0, // function_name_offset
1191 0}); // function_name_length
Ben Murdochda12d292016-06-02 14:46:10 +01001192 CHECK(mod.import_table.size() <= 127);
1193 return static_cast<byte>(mod.import_table.size() - 1);
Ben Murdoch097c5b22016-05-18 11:27:45 +01001194 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001195
1196 private:
1197 WasmModule mod;
1198};
1199} // namespace
1200
Ben Murdochda12d292016-06-02 14:46:10 +01001201TEST_F(AstDecoderTest, SimpleCalls) {
1202 FunctionSig* sig = sigs.i_i();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001203 TestModuleEnv module_env;
Ben Murdochda12d292016-06-02 14:46:10 +01001204 module = &module_env;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001205
1206 module_env.AddFunction(sigs.i_v());
1207 module_env.AddFunction(sigs.i_i());
1208 module_env.AddFunction(sigs.i_ii());
1209
Ben Murdochc5610432016-08-08 18:44:38 +01001210 EXPECT_VERIFIES_INLINE(sig, WASM_CALL_FUNCTION0(0));
1211 EXPECT_VERIFIES_INLINE(sig, WASM_CALL_FUNCTION1(1, WASM_I8(27)));
1212 EXPECT_VERIFIES_INLINE(sig, WASM_CALL_FUNCTION2(2, WASM_I8(37), WASM_I8(77)));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001213}
1214
Ben Murdochda12d292016-06-02 14:46:10 +01001215TEST_F(AstDecoderTest, CallsWithTooFewArguments) {
1216 FunctionSig* sig = sigs.i_i();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001217 TestModuleEnv module_env;
Ben Murdochda12d292016-06-02 14:46:10 +01001218 module = &module_env;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001219
1220 module_env.AddFunction(sigs.i_i());
1221 module_env.AddFunction(sigs.i_ii());
1222 module_env.AddFunction(sigs.f_ff());
1223
Ben Murdochda12d292016-06-02 14:46:10 +01001224 EXPECT_FAILURE_INLINE(sig, WASM_CALL_FUNCTION0(0));
Ben Murdochc5610432016-08-08 18:44:38 +01001225 EXPECT_FAILURE_INLINE(sig, WASM_CALL_FUNCTION1(1, WASM_ZERO));
1226 EXPECT_FAILURE_INLINE(sig, WASM_CALL_FUNCTION1(2, WASM_GET_LOCAL(0)));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001227}
1228
Ben Murdochda12d292016-06-02 14:46:10 +01001229TEST_F(AstDecoderTest, CallsWithMismatchedSigs2) {
1230 FunctionSig* sig = sigs.i_i();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001231 TestModuleEnv module_env;
Ben Murdochda12d292016-06-02 14:46:10 +01001232 module = &module_env;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001233
1234 module_env.AddFunction(sigs.i_i());
1235
Ben Murdochc5610432016-08-08 18:44:38 +01001236 EXPECT_FAILURE_INLINE(sig, WASM_CALL_FUNCTION1(0, WASM_I64V_1(17)));
1237 EXPECT_FAILURE_INLINE(sig, WASM_CALL_FUNCTION1(0, WASM_F32(17.1)));
1238 EXPECT_FAILURE_INLINE(sig, WASM_CALL_FUNCTION1(0, WASM_F64(17.1)));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001239}
1240
Ben Murdochda12d292016-06-02 14:46:10 +01001241TEST_F(AstDecoderTest, CallsWithMismatchedSigs3) {
1242 FunctionSig* sig = sigs.i_i();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001243 TestModuleEnv module_env;
Ben Murdochda12d292016-06-02 14:46:10 +01001244 module = &module_env;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001245
1246 module_env.AddFunction(sigs.i_f());
1247
Ben Murdochc5610432016-08-08 18:44:38 +01001248 EXPECT_FAILURE_INLINE(sig, WASM_CALL_FUNCTION1(0, WASM_I8(17)));
1249 EXPECT_FAILURE_INLINE(sig, WASM_CALL_FUNCTION1(0, WASM_I64V_1(27)));
1250 EXPECT_FAILURE_INLINE(sig, WASM_CALL_FUNCTION1(0, WASM_F64(37.2)));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001251
1252 module_env.AddFunction(sigs.i_d());
1253
Ben Murdochc5610432016-08-08 18:44:38 +01001254 EXPECT_FAILURE_INLINE(sig, WASM_CALL_FUNCTION1(1, WASM_I8(16)));
1255 EXPECT_FAILURE_INLINE(sig, WASM_CALL_FUNCTION1(1, WASM_I64V_1(16)));
1256 EXPECT_FAILURE_INLINE(sig, WASM_CALL_FUNCTION1(1, WASM_F32(17.6)));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001257}
1258
Ben Murdochda12d292016-06-02 14:46:10 +01001259TEST_F(AstDecoderTest, SimpleIndirectCalls) {
1260 FunctionSig* sig = sigs.i_i();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001261 TestModuleEnv module_env;
Ben Murdochda12d292016-06-02 14:46:10 +01001262 module = &module_env;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001263
1264 byte f0 = module_env.AddSignature(sigs.i_v());
1265 byte f1 = module_env.AddSignature(sigs.i_i());
1266 byte f2 = module_env.AddSignature(sigs.i_ii());
1267
Ben Murdochda12d292016-06-02 14:46:10 +01001268 EXPECT_VERIFIES_INLINE(sig, WASM_CALL_INDIRECT0(f0, WASM_ZERO));
Ben Murdochc5610432016-08-08 18:44:38 +01001269 EXPECT_VERIFIES_INLINE(sig, WASM_CALL_INDIRECT1(f1, WASM_ZERO, WASM_I8(22)));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001270 EXPECT_VERIFIES_INLINE(
Ben Murdochc5610432016-08-08 18:44:38 +01001271 sig, WASM_CALL_INDIRECT2(f2, WASM_ZERO, WASM_I8(32), WASM_I8(72)));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001272}
1273
Ben Murdochda12d292016-06-02 14:46:10 +01001274TEST_F(AstDecoderTest, IndirectCallsOutOfBounds) {
1275 FunctionSig* sig = sigs.i_i();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001276 TestModuleEnv module_env;
Ben Murdochda12d292016-06-02 14:46:10 +01001277 module = &module_env;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001278
Ben Murdochda12d292016-06-02 14:46:10 +01001279 EXPECT_FAILURE_INLINE(sig, WASM_CALL_INDIRECT0(0, WASM_ZERO));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001280 module_env.AddSignature(sigs.i_v());
Ben Murdochda12d292016-06-02 14:46:10 +01001281 EXPECT_VERIFIES_INLINE(sig, WASM_CALL_INDIRECT0(0, WASM_ZERO));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001282
Ben Murdochc5610432016-08-08 18:44:38 +01001283 EXPECT_FAILURE_INLINE(sig, WASM_CALL_INDIRECT1(1, WASM_ZERO, WASM_I8(22)));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001284 module_env.AddSignature(sigs.i_i());
Ben Murdochc5610432016-08-08 18:44:38 +01001285 EXPECT_VERIFIES_INLINE(sig, WASM_CALL_INDIRECT1(1, WASM_ZERO, WASM_I8(27)));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001286
Ben Murdochc5610432016-08-08 18:44:38 +01001287 EXPECT_FAILURE_INLINE(sig, WASM_CALL_INDIRECT1(2, WASM_ZERO, WASM_I8(27)));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001288}
1289
Ben Murdochda12d292016-06-02 14:46:10 +01001290TEST_F(AstDecoderTest, IndirectCallsWithMismatchedSigs3) {
1291 FunctionSig* sig = sigs.i_i();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001292 TestModuleEnv module_env;
Ben Murdochda12d292016-06-02 14:46:10 +01001293 module = &module_env;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001294
1295 byte f0 = module_env.AddFunction(sigs.i_f());
1296
Ben Murdochc5610432016-08-08 18:44:38 +01001297 EXPECT_FAILURE_INLINE(sig, WASM_CALL_INDIRECT1(f0, WASM_ZERO, WASM_I8(17)));
Ben Murdochda12d292016-06-02 14:46:10 +01001298 EXPECT_FAILURE_INLINE(sig,
Ben Murdochc5610432016-08-08 18:44:38 +01001299 WASM_CALL_INDIRECT1(f0, WASM_ZERO, WASM_I64V_1(27)));
1300 EXPECT_FAILURE_INLINE(sig,
1301 WASM_CALL_INDIRECT1(f0, WASM_ZERO, WASM_F64(37.2)));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001302
Ben Murdochda12d292016-06-02 14:46:10 +01001303 EXPECT_FAILURE_INLINE(sig, WASM_CALL_INDIRECT0(f0, WASM_I8(17)));
1304 EXPECT_FAILURE_INLINE(sig, WASM_CALL_INDIRECT0(f0, WASM_I64V_1(27)));
1305 EXPECT_FAILURE_INLINE(sig, WASM_CALL_INDIRECT0(f0, WASM_F64(37.2)));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001306
1307 byte f1 = module_env.AddFunction(sigs.i_d());
1308
Ben Murdochc5610432016-08-08 18:44:38 +01001309 EXPECT_FAILURE_INLINE(sig, WASM_CALL_INDIRECT1(f1, WASM_ZERO, WASM_I8(16)));
Ben Murdochda12d292016-06-02 14:46:10 +01001310 EXPECT_FAILURE_INLINE(sig,
Ben Murdochc5610432016-08-08 18:44:38 +01001311 WASM_CALL_INDIRECT1(f1, WASM_ZERO, WASM_I64V_1(16)));
1312 EXPECT_FAILURE_INLINE(sig,
1313 WASM_CALL_INDIRECT1(f1, WASM_ZERO, WASM_F32(17.6)));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001314}
1315
Ben Murdochda12d292016-06-02 14:46:10 +01001316TEST_F(AstDecoderTest, SimpleImportCalls) {
1317 FunctionSig* sig = sigs.i_i();
Ben Murdoch097c5b22016-05-18 11:27:45 +01001318 TestModuleEnv module_env;
Ben Murdochda12d292016-06-02 14:46:10 +01001319 module = &module_env;
Ben Murdoch097c5b22016-05-18 11:27:45 +01001320
1321 byte f0 = module_env.AddImport(sigs.i_v());
1322 byte f1 = module_env.AddImport(sigs.i_i());
1323 byte f2 = module_env.AddImport(sigs.i_ii());
1324
Ben Murdochda12d292016-06-02 14:46:10 +01001325 EXPECT_VERIFIES_INLINE(sig, WASM_CALL_IMPORT0(f0));
Ben Murdochc5610432016-08-08 18:44:38 +01001326 EXPECT_VERIFIES_INLINE(sig, WASM_CALL_IMPORT1(f1, WASM_I8(22)));
1327 EXPECT_VERIFIES_INLINE(sig, WASM_CALL_IMPORT2(f2, WASM_I8(32), WASM_I8(72)));
Ben Murdoch097c5b22016-05-18 11:27:45 +01001328}
1329
Ben Murdochda12d292016-06-02 14:46:10 +01001330TEST_F(AstDecoderTest, ImportCallsWithMismatchedSigs3) {
1331 FunctionSig* sig = sigs.i_i();
Ben Murdoch097c5b22016-05-18 11:27:45 +01001332 TestModuleEnv module_env;
Ben Murdochda12d292016-06-02 14:46:10 +01001333 module = &module_env;
Ben Murdoch097c5b22016-05-18 11:27:45 +01001334
1335 byte f0 = module_env.AddImport(sigs.i_f());
1336
Ben Murdochda12d292016-06-02 14:46:10 +01001337 EXPECT_FAILURE_INLINE(sig, WASM_CALL_IMPORT0(f0));
Ben Murdochc5610432016-08-08 18:44:38 +01001338 EXPECT_FAILURE_INLINE(sig, WASM_CALL_IMPORT1(f0, WASM_I8(17)));
1339 EXPECT_FAILURE_INLINE(sig, WASM_CALL_IMPORT1(f0, WASM_I64V_1(27)));
1340 EXPECT_FAILURE_INLINE(sig, WASM_CALL_IMPORT1(f0, WASM_F64(37.2)));
Ben Murdoch097c5b22016-05-18 11:27:45 +01001341
1342 byte f1 = module_env.AddImport(sigs.i_d());
1343
Ben Murdochda12d292016-06-02 14:46:10 +01001344 EXPECT_FAILURE_INLINE(sig, WASM_CALL_IMPORT0(f1));
Ben Murdochc5610432016-08-08 18:44:38 +01001345 EXPECT_FAILURE_INLINE(sig, WASM_CALL_IMPORT1(f1, WASM_I8(16)));
1346 EXPECT_FAILURE_INLINE(sig, WASM_CALL_IMPORT1(f1, WASM_I64V_1(16)));
1347 EXPECT_FAILURE_INLINE(sig, WASM_CALL_IMPORT1(f1, WASM_F32(17.6)));
Ben Murdoch097c5b22016-05-18 11:27:45 +01001348}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001349
Ben Murdochda12d292016-06-02 14:46:10 +01001350TEST_F(AstDecoderTest, Int32Globals) {
1351 FunctionSig* sig = sigs.i_i();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001352 TestModuleEnv module_env;
Ben Murdochda12d292016-06-02 14:46:10 +01001353 module = &module_env;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001354
1355 module_env.AddGlobal(MachineType::Int8());
1356 module_env.AddGlobal(MachineType::Uint8());
1357 module_env.AddGlobal(MachineType::Int16());
1358 module_env.AddGlobal(MachineType::Uint16());
1359 module_env.AddGlobal(MachineType::Int32());
1360 module_env.AddGlobal(MachineType::Uint32());
1361
Ben Murdochda12d292016-06-02 14:46:10 +01001362 EXPECT_VERIFIES_INLINE(sig, WASM_LOAD_GLOBAL(0));
1363 EXPECT_VERIFIES_INLINE(sig, WASM_LOAD_GLOBAL(1));
1364 EXPECT_VERIFIES_INLINE(sig, WASM_LOAD_GLOBAL(2));
1365 EXPECT_VERIFIES_INLINE(sig, WASM_LOAD_GLOBAL(3));
1366 EXPECT_VERIFIES_INLINE(sig, WASM_LOAD_GLOBAL(4));
1367 EXPECT_VERIFIES_INLINE(sig, WASM_LOAD_GLOBAL(5));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001368
Ben Murdochda12d292016-06-02 14:46:10 +01001369 EXPECT_VERIFIES_INLINE(sig, WASM_STORE_GLOBAL(0, WASM_GET_LOCAL(0)));
1370 EXPECT_VERIFIES_INLINE(sig, WASM_STORE_GLOBAL(1, WASM_GET_LOCAL(0)));
1371 EXPECT_VERIFIES_INLINE(sig, WASM_STORE_GLOBAL(2, WASM_GET_LOCAL(0)));
1372 EXPECT_VERIFIES_INLINE(sig, WASM_STORE_GLOBAL(3, WASM_GET_LOCAL(0)));
1373 EXPECT_VERIFIES_INLINE(sig, WASM_STORE_GLOBAL(4, WASM_GET_LOCAL(0)));
1374 EXPECT_VERIFIES_INLINE(sig, WASM_STORE_GLOBAL(5, WASM_GET_LOCAL(0)));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001375}
1376
Ben Murdochda12d292016-06-02 14:46:10 +01001377TEST_F(AstDecoderTest, Int32Globals_fail) {
1378 FunctionSig* sig = sigs.i_i();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001379 TestModuleEnv module_env;
Ben Murdochda12d292016-06-02 14:46:10 +01001380 module = &module_env;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001381
1382 module_env.AddGlobal(MachineType::Int64());
1383 module_env.AddGlobal(MachineType::Uint64());
1384 module_env.AddGlobal(MachineType::Float32());
1385 module_env.AddGlobal(MachineType::Float64());
1386
Ben Murdochda12d292016-06-02 14:46:10 +01001387 EXPECT_FAILURE_INLINE(sig, WASM_LOAD_GLOBAL(0));
1388 EXPECT_FAILURE_INLINE(sig, WASM_LOAD_GLOBAL(1));
1389 EXPECT_FAILURE_INLINE(sig, WASM_LOAD_GLOBAL(2));
1390 EXPECT_FAILURE_INLINE(sig, WASM_LOAD_GLOBAL(3));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001391
Ben Murdochda12d292016-06-02 14:46:10 +01001392 EXPECT_FAILURE_INLINE(sig, WASM_STORE_GLOBAL(0, WASM_GET_LOCAL(0)));
1393 EXPECT_FAILURE_INLINE(sig, WASM_STORE_GLOBAL(1, WASM_GET_LOCAL(0)));
1394 EXPECT_FAILURE_INLINE(sig, WASM_STORE_GLOBAL(2, WASM_GET_LOCAL(0)));
1395 EXPECT_FAILURE_INLINE(sig, WASM_STORE_GLOBAL(3, WASM_GET_LOCAL(0)));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001396}
1397
Ben Murdochda12d292016-06-02 14:46:10 +01001398TEST_F(AstDecoderTest, Int64Globals) {
1399 FunctionSig* sig = sigs.l_l();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001400 TestModuleEnv module_env;
Ben Murdochda12d292016-06-02 14:46:10 +01001401 module = &module_env;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001402
1403 module_env.AddGlobal(MachineType::Int64());
1404 module_env.AddGlobal(MachineType::Uint64());
1405
Ben Murdochda12d292016-06-02 14:46:10 +01001406 EXPECT_VERIFIES_INLINE(sig, WASM_LOAD_GLOBAL(0));
1407 EXPECT_VERIFIES_INLINE(sig, WASM_LOAD_GLOBAL(1));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001408
Ben Murdochda12d292016-06-02 14:46:10 +01001409 EXPECT_VERIFIES_INLINE(sig, WASM_STORE_GLOBAL(0, WASM_GET_LOCAL(0)));
1410 EXPECT_VERIFIES_INLINE(sig, WASM_STORE_GLOBAL(1, WASM_GET_LOCAL(0)));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001411}
1412
Ben Murdochda12d292016-06-02 14:46:10 +01001413TEST_F(AstDecoderTest, Float32Globals) {
1414 FunctionSig* sig = sigs.f_ff();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001415 TestModuleEnv module_env;
Ben Murdochda12d292016-06-02 14:46:10 +01001416 module = &module_env;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001417
1418 module_env.AddGlobal(MachineType::Float32());
1419
Ben Murdochda12d292016-06-02 14:46:10 +01001420 EXPECT_VERIFIES_INLINE(sig, WASM_LOAD_GLOBAL(0));
1421 EXPECT_VERIFIES_INLINE(sig, WASM_STORE_GLOBAL(0, WASM_GET_LOCAL(0)));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001422}
1423
Ben Murdochda12d292016-06-02 14:46:10 +01001424TEST_F(AstDecoderTest, Float64Globals) {
1425 FunctionSig* sig = sigs.d_dd();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001426 TestModuleEnv module_env;
Ben Murdochda12d292016-06-02 14:46:10 +01001427 module = &module_env;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001428
1429 module_env.AddGlobal(MachineType::Float64());
1430
Ben Murdochda12d292016-06-02 14:46:10 +01001431 EXPECT_VERIFIES_INLINE(sig, WASM_LOAD_GLOBAL(0));
1432 EXPECT_VERIFIES_INLINE(sig, WASM_STORE_GLOBAL(0, WASM_GET_LOCAL(0)));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001433}
1434
Ben Murdochda12d292016-06-02 14:46:10 +01001435TEST_F(AstDecoderTest, AllLoadGlobalCombinations) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001436 for (size_t i = 0; i < arraysize(kLocalTypes); i++) {
1437 LocalType local_type = kLocalTypes[i];
1438 for (size_t j = 0; j < arraysize(machineTypes); j++) {
1439 MachineType mem_type = machineTypes[j];
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001440 FunctionSig sig(1, 0, &local_type);
1441 TestModuleEnv module_env;
Ben Murdochda12d292016-06-02 14:46:10 +01001442 module = &module_env;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001443 module_env.AddGlobal(mem_type);
1444 if (local_type == WasmOpcodes::LocalTypeFor(mem_type)) {
Ben Murdochda12d292016-06-02 14:46:10 +01001445 EXPECT_VERIFIES_INLINE(&sig, WASM_LOAD_GLOBAL(0));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001446 } else {
Ben Murdochda12d292016-06-02 14:46:10 +01001447 EXPECT_FAILURE_INLINE(&sig, WASM_LOAD_GLOBAL(0));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001448 }
1449 }
1450 }
1451}
1452
Ben Murdochda12d292016-06-02 14:46:10 +01001453TEST_F(AstDecoderTest, AllStoreGlobalCombinations) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001454 for (size_t i = 0; i < arraysize(kLocalTypes); i++) {
1455 LocalType local_type = kLocalTypes[i];
1456 for (size_t j = 0; j < arraysize(machineTypes); j++) {
1457 MachineType mem_type = machineTypes[j];
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001458 FunctionSig sig(0, 1, &local_type);
1459 TestModuleEnv module_env;
Ben Murdochda12d292016-06-02 14:46:10 +01001460 module = &module_env;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001461 module_env.AddGlobal(mem_type);
1462 if (local_type == WasmOpcodes::LocalTypeFor(mem_type)) {
Ben Murdochda12d292016-06-02 14:46:10 +01001463 EXPECT_VERIFIES_INLINE(&sig, WASM_STORE_GLOBAL(0, WASM_GET_LOCAL(0)));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001464 } else {
Ben Murdochda12d292016-06-02 14:46:10 +01001465 EXPECT_FAILURE_INLINE(&sig, WASM_STORE_GLOBAL(0, WASM_GET_LOCAL(0)));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001466 }
1467 }
1468 }
1469}
1470
Ben Murdochc5610432016-08-08 18:44:38 +01001471TEST_F(AstDecoderTest, BreakEnd) {
1472 EXPECT_VERIFIES_INLINE(sigs.i_i(),
1473 B1(WASM_I32_ADD(WASM_BRV(0, WASM_ZERO), WASM_ZERO)));
1474 EXPECT_VERIFIES_INLINE(sigs.i_i(),
1475 B1(WASM_I32_ADD(WASM_ZERO, WASM_BRV(0, WASM_ZERO))));
1476}
1477
1478TEST_F(AstDecoderTest, BreakIfBinop) {
1479 EXPECT_FAILURE_INLINE(
1480 sigs.i_i(),
1481 WASM_BLOCK(
1482 1, WASM_I32_ADD(WASM_BRV_IF(0, WASM_ZERO, WASM_ZERO), WASM_ZERO)));
1483 EXPECT_FAILURE_INLINE(
1484 sigs.i_i(),
1485 WASM_BLOCK(
1486 1, WASM_I32_ADD(WASM_ZERO, WASM_BRV_IF(0, WASM_ZERO, WASM_ZERO))));
1487}
1488
Ben Murdochda12d292016-06-02 14:46:10 +01001489TEST_F(AstDecoderTest, BreakNesting1) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001490 for (int i = 0; i < 5; i++) {
1491 // (block[2] (loop[2] (if (get p) break[N]) (set p 1)) p)
1492 byte code[] = {WASM_BLOCK(
Ben Murdochc5610432016-08-08 18:44:38 +01001493 2, WASM_LOOP(2, WASM_IF(WASM_GET_LOCAL(0), WASM_BRV(i + 1, WASM_ZERO)),
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001494 WASM_SET_LOCAL(0, WASM_I8(1))),
1495 WASM_GET_LOCAL(0))};
1496 if (i < 3) {
Ben Murdochda12d292016-06-02 14:46:10 +01001497 EXPECT_VERIFIES(sigs.i_i(), code);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001498 } else {
Ben Murdochda12d292016-06-02 14:46:10 +01001499 EXPECT_FAILURE(sigs.i_i(), code);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001500 }
1501 }
1502}
1503
Ben Murdochda12d292016-06-02 14:46:10 +01001504TEST_F(AstDecoderTest, BreakNesting2) {
1505 AddLocals(kAstI32, 1);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001506 for (int i = 0; i < 5; i++) {
Ben Murdochda12d292016-06-02 14:46:10 +01001507 // (block[2] (loop[2] (if 0 break[N]) (set p 1)) (return p)) (11)
Ben Murdochc5610432016-08-08 18:44:38 +01001508 byte code[] = {B1(WASM_LOOP(2, WASM_IF(WASM_ZERO, WASM_BREAK(i + 1)),
1509 WASM_SET_LOCAL(0, WASM_I8(1)))),
Ben Murdochda12d292016-06-02 14:46:10 +01001510 WASM_I8(11)};
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001511 if (i < 2) {
Ben Murdochda12d292016-06-02 14:46:10 +01001512 EXPECT_VERIFIES(sigs.v_v(), code);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001513 } else {
Ben Murdochda12d292016-06-02 14:46:10 +01001514 EXPECT_FAILURE(sigs.v_v(), code);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001515 }
1516 }
1517}
1518
Ben Murdochda12d292016-06-02 14:46:10 +01001519TEST_F(AstDecoderTest, BreakNesting3) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001520 for (int i = 0; i < 5; i++) {
Ben Murdochda12d292016-06-02 14:46:10 +01001521 // (block[1] (loop[1] (block[1] (if 0 break[N])
Ben Murdochc5610432016-08-08 18:44:38 +01001522 byte code[] = {
1523 WASM_BLOCK(1, WASM_LOOP(1, B1(WASM_IF(WASM_ZERO, WASM_BREAK(i + 1)))))};
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001524 if (i < 3) {
Ben Murdochda12d292016-06-02 14:46:10 +01001525 EXPECT_VERIFIES(sigs.v_v(), code);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001526 } else {
Ben Murdochda12d292016-06-02 14:46:10 +01001527 EXPECT_FAILURE(sigs.v_v(), code);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001528 }
1529 }
1530}
1531
Ben Murdochda12d292016-06-02 14:46:10 +01001532TEST_F(AstDecoderTest, BreaksWithMultipleTypes) {
Ben Murdochc5610432016-08-08 18:44:38 +01001533 EXPECT_FAILURE_INLINE(sigs.i_i(),
1534 B2(WASM_BRV_IF_ZERO(0, WASM_I8(7)), WASM_F32(7.7)));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001535
Ben Murdochc5610432016-08-08 18:44:38 +01001536 EXPECT_FAILURE_INLINE(sigs.i_i(), B2(WASM_BRV_IF_ZERO(0, WASM_I8(7)),
1537 WASM_BRV_IF_ZERO(0, WASM_F32(7.7))));
1538 EXPECT_FAILURE_INLINE(sigs.i_i(), B3(WASM_BRV_IF_ZERO(0, WASM_I8(8)),
1539 WASM_BRV_IF_ZERO(0, WASM_I8(0)),
1540 WASM_BRV_IF_ZERO(0, WASM_F32(7.7))));
1541 EXPECT_FAILURE_INLINE(sigs.i_i(), B3(WASM_BRV_IF_ZERO(0, WASM_I8(9)),
1542 WASM_BRV_IF_ZERO(0, WASM_F32(7.7)),
1543 WASM_BRV_IF_ZERO(0, WASM_I8(11))));
Ben Murdoch097c5b22016-05-18 11:27:45 +01001544}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001545
Ben Murdochda12d292016-06-02 14:46:10 +01001546TEST_F(AstDecoderTest, BreakNesting_6_levels) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001547 for (int mask = 0; mask < 64; mask++) {
1548 for (int i = 0; i < 14; i++) {
1549 byte code[] = {
Ben Murdochc5610432016-08-08 18:44:38 +01001550 kExprBlock, // --
1551 kExprBlock, // --
1552 kExprBlock, // --
1553 kExprBlock, // --
1554 kExprBlock, // --
1555 kExprBlock, // --
1556 kExprBr, ARITY_0, static_cast<byte>(i), // --
1557 kExprEnd, // --
1558 kExprEnd, // --
1559 kExprEnd, // --
1560 kExprEnd, // --
1561 kExprEnd, // --
1562 kExprEnd // --
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001563 };
1564
1565 int depth = 6;
1566 for (int l = 0; l < 6; l++) {
1567 if (mask & (1 << l)) {
Ben Murdochc5610432016-08-08 18:44:38 +01001568 code[l] = kExprLoop;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001569 depth++;
1570 }
1571 }
1572
1573 if (i < depth) {
Ben Murdochda12d292016-06-02 14:46:10 +01001574 EXPECT_VERIFIES(sigs.v_v(), code);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001575 } else {
Ben Murdochda12d292016-06-02 14:46:10 +01001576 EXPECT_FAILURE(sigs.v_v(), code);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001577 }
1578 }
1579 }
1580}
1581
Ben Murdochda12d292016-06-02 14:46:10 +01001582TEST_F(AstDecoderTest, ExprBreak_TypeCheck) {
1583 FunctionSig* sigarray[] = {sigs.i_i(), sigs.l_l(), sigs.f_ff(), sigs.d_dd()};
1584 for (size_t i = 0; i < arraysize(sigarray); i++) {
1585 FunctionSig* sig = sigarray[i];
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001586 // unify X and X => OK
1587 EXPECT_VERIFIES_INLINE(
Ben Murdochc5610432016-08-08 18:44:38 +01001588 sig, B2(WASM_IF(WASM_ZERO, WASM_BRV(0, WASM_GET_LOCAL(0))),
1589 WASM_GET_LOCAL(0)));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001590 }
1591
1592 // unify i32 and f32 => fail
1593 EXPECT_FAILURE_INLINE(
Ben Murdochda12d292016-06-02 14:46:10 +01001594 sigs.i_i(),
Ben Murdochc5610432016-08-08 18:44:38 +01001595 B2(WASM_IF(WASM_ZERO, WASM_BRV(0, WASM_ZERO)), WASM_F32(1.2)));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001596
1597 // unify f64 and f64 => OK
1598 EXPECT_VERIFIES_INLINE(
Ben Murdochda12d292016-06-02 14:46:10 +01001599 sigs.d_dd(),
Ben Murdochc5610432016-08-08 18:44:38 +01001600 B2(WASM_IF(WASM_ZERO, WASM_BRV(0, WASM_GET_LOCAL(0))), WASM_F64(1.2)));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001601}
1602
Ben Murdochda12d292016-06-02 14:46:10 +01001603TEST_F(AstDecoderTest, ExprBreak_TypeCheckAll) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001604 byte code1[] = {WASM_BLOCK(2,
1605 WASM_IF(WASM_ZERO, WASM_BRV(0, WASM_GET_LOCAL(0))),
1606 WASM_GET_LOCAL(1))};
Ben Murdochc5610432016-08-08 18:44:38 +01001607 byte code2[] = {B2(WASM_IF(WASM_ZERO, WASM_BRV_IF_ZERO(0, WASM_GET_LOCAL(0))),
1608 WASM_GET_LOCAL(1))};
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001609
1610 for (size_t i = 0; i < arraysize(kLocalTypes); i++) {
1611 for (size_t j = 0; j < arraysize(kLocalTypes); j++) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001612 LocalType storage[] = {kLocalTypes[i], kLocalTypes[i], kLocalTypes[j]};
1613 FunctionSig sig(1, 2, storage);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001614
1615 if (i == j) {
Ben Murdochda12d292016-06-02 14:46:10 +01001616 EXPECT_VERIFIES(&sig, code1);
1617 EXPECT_VERIFIES(&sig, code2);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001618 } else {
Ben Murdochda12d292016-06-02 14:46:10 +01001619 EXPECT_FAILURE(&sig, code1);
1620 EXPECT_FAILURE(&sig, code2);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001621 }
1622 }
1623 }
1624}
1625
Ben Murdochda12d292016-06-02 14:46:10 +01001626TEST_F(AstDecoderTest, ExprBr_Unify) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001627 for (int which = 0; which < 2; which++) {
1628 for (size_t i = 0; i < arraysize(kLocalTypes); i++) {
1629 LocalType type = kLocalTypes[i];
1630 LocalType storage[] = {kAstI32, kAstI32, type};
1631 FunctionSig sig(1, 2, storage);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001632
Ben Murdochc5610432016-08-08 18:44:38 +01001633 byte code1[] = {B2(WASM_IF(WASM_ZERO, WASM_BRV(1, WASM_GET_LOCAL(which))),
1634 WASM_GET_LOCAL(which ^ 1))};
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001635 byte code2[] = {
Ben Murdochc5610432016-08-08 18:44:38 +01001636 WASM_LOOP(2, WASM_IF(WASM_ZERO, WASM_BRV(2, WASM_GET_LOCAL(which))),
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001637 WASM_GET_LOCAL(which ^ 1))};
1638
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001639 if (type == kAstI32) {
Ben Murdochda12d292016-06-02 14:46:10 +01001640 EXPECT_VERIFIES(&sig, code1);
1641 EXPECT_VERIFIES(&sig, code2);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001642 } else {
Ben Murdochda12d292016-06-02 14:46:10 +01001643 EXPECT_FAILURE(&sig, code1);
1644 EXPECT_FAILURE(&sig, code2);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001645 }
1646 }
1647 }
1648}
1649
Ben Murdochda12d292016-06-02 14:46:10 +01001650TEST_F(AstDecoderTest, ExprBrIf_cond_type) {
Ben Murdochc5610432016-08-08 18:44:38 +01001651 byte code[] = {B1(WASM_BRV_IF(0, WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)))};
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001652 for (size_t i = 0; i < arraysize(kLocalTypes); i++) {
Ben Murdoch097c5b22016-05-18 11:27:45 +01001653 for (size_t j = 0; j < arraysize(kLocalTypes); j++) {
1654 LocalType types[] = {kLocalTypes[i], kLocalTypes[j]};
1655 FunctionSig sig(0, 2, types);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001656
Ben Murdoch097c5b22016-05-18 11:27:45 +01001657 if (types[1] == kAstI32) {
Ben Murdochda12d292016-06-02 14:46:10 +01001658 EXPECT_VERIFIES(&sig, code);
Ben Murdoch097c5b22016-05-18 11:27:45 +01001659 } else {
Ben Murdochda12d292016-06-02 14:46:10 +01001660 EXPECT_FAILURE(&sig, code);
Ben Murdoch097c5b22016-05-18 11:27:45 +01001661 }
1662 }
1663 }
1664}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001665
Ben Murdochda12d292016-06-02 14:46:10 +01001666TEST_F(AstDecoderTest, ExprBrIf_val_type) {
Ben Murdochc5610432016-08-08 18:44:38 +01001667 byte code[] = {B2(WASM_BRV_IF(0, WASM_GET_LOCAL(1), WASM_GET_LOCAL(2)),
1668 WASM_GET_LOCAL(0))};
Ben Murdoch097c5b22016-05-18 11:27:45 +01001669 for (size_t i = 0; i < arraysize(kLocalTypes); i++) {
1670 for (size_t j = 0; j < arraysize(kLocalTypes); j++) {
1671 LocalType types[] = {kLocalTypes[i], kLocalTypes[i], kLocalTypes[j],
1672 kAstI32};
1673 FunctionSig sig(1, 3, types);
Ben Murdoch097c5b22016-05-18 11:27:45 +01001674
1675 if (i == j) {
Ben Murdochda12d292016-06-02 14:46:10 +01001676 EXPECT_VERIFIES(&sig, code);
Ben Murdoch097c5b22016-05-18 11:27:45 +01001677 } else {
Ben Murdochda12d292016-06-02 14:46:10 +01001678 EXPECT_FAILURE(&sig, code);
Ben Murdoch097c5b22016-05-18 11:27:45 +01001679 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001680 }
1681 }
1682}
1683
Ben Murdochda12d292016-06-02 14:46:10 +01001684TEST_F(AstDecoderTest, ExprBrIf_Unify) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001685 for (int which = 0; which < 2; which++) {
1686 for (size_t i = 0; i < arraysize(kLocalTypes); i++) {
1687 LocalType type = kLocalTypes[i];
1688 LocalType storage[] = {kAstI32, kAstI32, type};
1689 FunctionSig sig(1, 2, storage);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001690
Ben Murdochc5610432016-08-08 18:44:38 +01001691 byte code1[] = {B2(WASM_BRV_IF_ZERO(0, WASM_GET_LOCAL(which)),
1692 WASM_GET_LOCAL(which ^ 1))};
Ben Murdoch097c5b22016-05-18 11:27:45 +01001693 byte code2[] = {WASM_LOOP(2, WASM_BRV_IF_ZERO(1, WASM_GET_LOCAL(which)),
1694 WASM_GET_LOCAL(which ^ 1))};
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001695
1696 if (type == kAstI32) {
Ben Murdochda12d292016-06-02 14:46:10 +01001697 EXPECT_VERIFIES(&sig, code1);
1698 EXPECT_VERIFIES(&sig, code2);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001699 } else {
Ben Murdochda12d292016-06-02 14:46:10 +01001700 EXPECT_FAILURE(&sig, code1);
1701 EXPECT_FAILURE(&sig, code2);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001702 }
1703 }
1704 }
1705}
1706
Ben Murdochda12d292016-06-02 14:46:10 +01001707TEST_F(AstDecoderTest, BrTable0) {
Ben Murdochc5610432016-08-08 18:44:38 +01001708 static byte code[] = {kExprNop, kExprBrTable, 0, 0};
Ben Murdochda12d292016-06-02 14:46:10 +01001709 EXPECT_FAILURE(sigs.v_v(), code);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001710}
1711
Ben Murdochda12d292016-06-02 14:46:10 +01001712TEST_F(AstDecoderTest, BrTable0b) {
Ben Murdochc5610432016-08-08 18:44:38 +01001713 static byte code[] = {kExprNop, kExprI32Const, 11, kExprBrTable, 0, 0};
Ben Murdochda12d292016-06-02 14:46:10 +01001714 EXPECT_FAILURE(sigs.v_v(), code);
1715 EXPECT_FAILURE(sigs.i_i(), code);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001716}
1717
Ben Murdochda12d292016-06-02 14:46:10 +01001718TEST_F(AstDecoderTest, BrTable0c) {
Ben Murdochc5610432016-08-08 18:44:38 +01001719 static byte code[] = {kExprNop, kExprI32Const, 11, kExprBrTable, 0, 1, 0, 0};
Ben Murdochda12d292016-06-02 14:46:10 +01001720 EXPECT_FAILURE(sigs.v_v(), code);
1721 EXPECT_FAILURE(sigs.i_i(), code);
1722}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001723
Ben Murdochda12d292016-06-02 14:46:10 +01001724TEST_F(AstDecoderTest, BrTable1a) {
Ben Murdochc5610432016-08-08 18:44:38 +01001725 static byte code[] = {B1(WASM_BR_TABLE(WASM_I8(67), 0, BR_TARGET(0)))};
Ben Murdochda12d292016-06-02 14:46:10 +01001726 EXPECT_VERIFIES(sigs.v_v(), code);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001727}
1728
Ben Murdochda12d292016-06-02 14:46:10 +01001729TEST_F(AstDecoderTest, BrTable1b) {
Ben Murdochc5610432016-08-08 18:44:38 +01001730 static byte code[] = {B1(WASM_BR_TABLE(WASM_ZERO, 0, BR_TARGET(0)))};
Ben Murdochda12d292016-06-02 14:46:10 +01001731 EXPECT_VERIFIES(sigs.v_v(), code);
1732 EXPECT_FAILURE(sigs.i_i(), code);
1733 EXPECT_FAILURE(sigs.f_ff(), code);
1734 EXPECT_FAILURE(sigs.d_dd(), code);
Ben Murdoch097c5b22016-05-18 11:27:45 +01001735}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001736
Ben Murdochda12d292016-06-02 14:46:10 +01001737TEST_F(AstDecoderTest, BrTable2a) {
1738 static byte code[] = {
Ben Murdochc5610432016-08-08 18:44:38 +01001739 B1(WASM_BR_TABLE(WASM_I8(67), 1, BR_TARGET(0), BR_TARGET(0)))};
Ben Murdochda12d292016-06-02 14:46:10 +01001740 EXPECT_VERIFIES(sigs.v_v(), code);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001741}
1742
Ben Murdochda12d292016-06-02 14:46:10 +01001743TEST_F(AstDecoderTest, BrTable2b) {
1744 static byte code[] = {WASM_BLOCK(
1745 1, WASM_BLOCK(
1746 1, WASM_BR_TABLE(WASM_I8(67), 1, BR_TARGET(0), BR_TARGET(1))))};
1747 EXPECT_VERIFIES(sigs.v_v(), code);
1748}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001749
Ben Murdochda12d292016-06-02 14:46:10 +01001750TEST_F(AstDecoderTest, BrTable_off_end) {
Ben Murdochc5610432016-08-08 18:44:38 +01001751 static byte code[] = {B1(WASM_BR_TABLE(WASM_GET_LOCAL(0), 0, BR_TARGET(0)))};
Ben Murdochda12d292016-06-02 14:46:10 +01001752 for (size_t len = 1; len < sizeof(code); len++) {
1753 Verify(kError, sigs.i_i(), code, code + len);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001754 }
1755}
1756
Ben Murdochda12d292016-06-02 14:46:10 +01001757TEST_F(AstDecoderTest, BrTable_invalid_br1) {
1758 for (int depth = 0; depth < 4; depth++) {
Ben Murdochc5610432016-08-08 18:44:38 +01001759 byte code[] = {B1(WASM_BR_TABLE(WASM_GET_LOCAL(0), 0, BR_TARGET(depth)))};
Ben Murdochda12d292016-06-02 14:46:10 +01001760 if (depth == 0) {
1761 EXPECT_VERIFIES(sigs.v_i(), code);
1762 } else {
1763 EXPECT_FAILURE(sigs.v_i(), code);
1764 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001765 }
1766}
1767
Ben Murdochda12d292016-06-02 14:46:10 +01001768TEST_F(AstDecoderTest, BrTable_invalid_br2) {
1769 for (int depth = 0; depth < 4; depth++) {
1770 byte code[] = {
1771 WASM_LOOP(1, WASM_BR_TABLE(WASM_GET_LOCAL(0), 0, BR_TARGET(depth)))};
1772 if (depth <= 1) {
1773 EXPECT_VERIFIES(sigs.v_i(), code);
1774 } else {
1775 EXPECT_FAILURE(sigs.v_i(), code);
1776 }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001777 }
1778}
1779
Ben Murdochda12d292016-06-02 14:46:10 +01001780TEST_F(AstDecoderTest, ExprBreakNesting1) {
Ben Murdochc5610432016-08-08 18:44:38 +01001781 EXPECT_VERIFIES_INLINE(sigs.v_v(), B1(WASM_BRV(0, WASM_ZERO)));
1782 EXPECT_VERIFIES_INLINE(sigs.v_v(), B1(WASM_BR(0)));
1783 EXPECT_VERIFIES_INLINE(sigs.v_v(), B1(WASM_BRV_IF(0, WASM_ZERO, WASM_ZERO)));
1784 EXPECT_VERIFIES_INLINE(sigs.v_v(), B1(WASM_BR_IF(0, WASM_ZERO)));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001785
Ben Murdochda12d292016-06-02 14:46:10 +01001786 EXPECT_VERIFIES_INLINE(sigs.v_v(), WASM_LOOP(1, WASM_BRV(0, WASM_ZERO)));
1787 EXPECT_VERIFIES_INLINE(sigs.v_v(), WASM_LOOP(1, WASM_BR(0)));
1788 EXPECT_VERIFIES_INLINE(sigs.v_v(),
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001789 WASM_LOOP(1, WASM_BRV_IF(0, WASM_ZERO, WASM_ZERO)));
Ben Murdochda12d292016-06-02 14:46:10 +01001790 EXPECT_VERIFIES_INLINE(sigs.v_v(), WASM_LOOP(1, WASM_BR_IF(0, WASM_ZERO)));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001791
Ben Murdochda12d292016-06-02 14:46:10 +01001792 EXPECT_VERIFIES_INLINE(sigs.v_v(), WASM_LOOP(1, WASM_BRV(1, WASM_ZERO)));
1793 EXPECT_VERIFIES_INLINE(sigs.v_v(), WASM_LOOP(1, WASM_BR(1)));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001794}
1795
Ben Murdochda12d292016-06-02 14:46:10 +01001796TEST_F(AstDecoderTest, Select) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001797 EXPECT_VERIFIES_INLINE(
Ben Murdochda12d292016-06-02 14:46:10 +01001798 sigs.i_i(), WASM_SELECT(WASM_GET_LOCAL(0), WASM_GET_LOCAL(0), WASM_ZERO));
1799 EXPECT_VERIFIES_INLINE(sigs.f_ff(),
Ben Murdoch097c5b22016-05-18 11:27:45 +01001800 WASM_SELECT(WASM_F32(0.0), WASM_F32(0.0), WASM_ZERO));
Ben Murdochda12d292016-06-02 14:46:10 +01001801 EXPECT_VERIFIES_INLINE(sigs.d_dd(),
Ben Murdoch097c5b22016-05-18 11:27:45 +01001802 WASM_SELECT(WASM_F64(0.0), WASM_F64(0.0), WASM_ZERO));
Ben Murdochda12d292016-06-02 14:46:10 +01001803 EXPECT_VERIFIES_INLINE(
1804 sigs.l_l(), WASM_SELECT(WASM_I64V_1(0), WASM_I64V_1(0), WASM_ZERO));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001805}
1806
Ben Murdochda12d292016-06-02 14:46:10 +01001807TEST_F(AstDecoderTest, Select_fail1) {
Ben Murdoch097c5b22016-05-18 11:27:45 +01001808 EXPECT_FAILURE_INLINE(
Ben Murdochda12d292016-06-02 14:46:10 +01001809 sigs.i_i(),
1810 WASM_SELECT(WASM_F32(0.0), WASM_GET_LOCAL(0), WASM_GET_LOCAL(0)));
1811 EXPECT_FAILURE_INLINE(
1812 sigs.i_i(),
1813 WASM_SELECT(WASM_GET_LOCAL(0), WASM_F32(0.0), WASM_GET_LOCAL(0)));
1814 EXPECT_FAILURE_INLINE(
1815 sigs.i_i(),
Ben Murdoch097c5b22016-05-18 11:27:45 +01001816 WASM_SELECT(WASM_GET_LOCAL(0), WASM_GET_LOCAL(0), WASM_F32(0.0)));
1817}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001818
Ben Murdochda12d292016-06-02 14:46:10 +01001819TEST_F(AstDecoderTest, Select_fail2) {
Ben Murdoch097c5b22016-05-18 11:27:45 +01001820 for (size_t i = 0; i < arraysize(kLocalTypes); i++) {
1821 LocalType type = kLocalTypes[i];
1822 if (type == kAstI32) continue;
1823
1824 LocalType types[] = {type, kAstI32, type};
1825 FunctionSig sig(1, 2, types);
Ben Murdoch097c5b22016-05-18 11:27:45 +01001826
1827 EXPECT_VERIFIES_INLINE(
Ben Murdochda12d292016-06-02 14:46:10 +01001828 &sig,
Ben Murdoch097c5b22016-05-18 11:27:45 +01001829 WASM_SELECT(WASM_GET_LOCAL(1), WASM_GET_LOCAL(1), WASM_GET_LOCAL(0)));
1830
1831 EXPECT_FAILURE_INLINE(
Ben Murdochda12d292016-06-02 14:46:10 +01001832 &sig,
Ben Murdoch097c5b22016-05-18 11:27:45 +01001833 WASM_SELECT(WASM_GET_LOCAL(1), WASM_GET_LOCAL(0), WASM_GET_LOCAL(0)));
1834
1835 EXPECT_FAILURE_INLINE(
Ben Murdochda12d292016-06-02 14:46:10 +01001836 &sig,
Ben Murdoch097c5b22016-05-18 11:27:45 +01001837 WASM_SELECT(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1), WASM_GET_LOCAL(0)));
1838
1839 EXPECT_FAILURE_INLINE(
Ben Murdochda12d292016-06-02 14:46:10 +01001840 &sig,
Ben Murdoch097c5b22016-05-18 11:27:45 +01001841 WASM_SELECT(WASM_GET_LOCAL(0), WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
1842 }
1843}
1844
Ben Murdochda12d292016-06-02 14:46:10 +01001845TEST_F(AstDecoderTest, Select_TypeCheck) {
1846 EXPECT_FAILURE_INLINE(
1847 sigs.i_i(),
1848 WASM_SELECT(WASM_F32(9.9), WASM_GET_LOCAL(0), WASM_GET_LOCAL(0)));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001849
1850 EXPECT_FAILURE_INLINE(
Ben Murdochda12d292016-06-02 14:46:10 +01001851 sigs.i_i(),
1852 WASM_SELECT(WASM_GET_LOCAL(0), WASM_F64(0.25), WASM_GET_LOCAL(0)));
1853
1854 EXPECT_FAILURE_INLINE(
1855 sigs.i_i(),
1856 WASM_SELECT(WASM_F32(9.9), WASM_GET_LOCAL(0), WASM_I64V_1(0)));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001857}
1858
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001859class WasmOpcodeLengthTest : public TestWithZone {
1860 public:
1861 WasmOpcodeLengthTest() : TestWithZone() {}
1862};
1863
Ben Murdoch097c5b22016-05-18 11:27:45 +01001864#define EXPECT_LENGTH(expected, opcode) \
1865 { \
1866 static const byte code[] = {opcode, 0, 0, 0, 0, 0, 0, 0, 0}; \
1867 EXPECT_EQ(expected, OpcodeLength(code, code + sizeof(code))); \
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001868 }
1869
Ben Murdochda12d292016-06-02 14:46:10 +01001870#define EXPECT_LENGTH_N(expected, ...) \
1871 { \
1872 static const byte code[] = {__VA_ARGS__}; \
1873 EXPECT_EQ(expected, OpcodeLength(code, code + sizeof(code))); \
1874 }
1875
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001876TEST_F(WasmOpcodeLengthTest, Statements) {
1877 EXPECT_LENGTH(1, kExprNop);
Ben Murdochc5610432016-08-08 18:44:38 +01001878 EXPECT_LENGTH(1, kExprBlock);
1879 EXPECT_LENGTH(1, kExprLoop);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001880 EXPECT_LENGTH(1, kExprIf);
Ben Murdochc5610432016-08-08 18:44:38 +01001881 EXPECT_LENGTH(1, kExprElse);
1882 EXPECT_LENGTH(1, kExprEnd);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001883 EXPECT_LENGTH(1, kExprSelect);
Ben Murdochc5610432016-08-08 18:44:38 +01001884 EXPECT_LENGTH(3, kExprBr);
1885 EXPECT_LENGTH(3, kExprBrIf);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001886}
1887
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001888TEST_F(WasmOpcodeLengthTest, MiscExpressions) {
1889 EXPECT_LENGTH(2, kExprI8Const);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001890 EXPECT_LENGTH(5, kExprF32Const);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001891 EXPECT_LENGTH(9, kExprF64Const);
1892 EXPECT_LENGTH(2, kExprGetLocal);
1893 EXPECT_LENGTH(2, kExprSetLocal);
1894 EXPECT_LENGTH(2, kExprLoadGlobal);
1895 EXPECT_LENGTH(2, kExprStoreGlobal);
Ben Murdochc5610432016-08-08 18:44:38 +01001896 EXPECT_LENGTH(3, kExprCallFunction);
1897 EXPECT_LENGTH(3, kExprCallImport);
1898 EXPECT_LENGTH(3, kExprCallIndirect);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001899 EXPECT_LENGTH(1, kExprIf);
Ben Murdochc5610432016-08-08 18:44:38 +01001900 EXPECT_LENGTH(1, kExprBlock);
1901 EXPECT_LENGTH(1, kExprLoop);
1902 EXPECT_LENGTH(3, kExprBr);
1903 EXPECT_LENGTH(3, kExprBrIf);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001904}
1905
Ben Murdochda12d292016-06-02 14:46:10 +01001906TEST_F(WasmOpcodeLengthTest, I32Const) {
1907 EXPECT_LENGTH_N(2, kExprI32Const, U32V_1(1));
1908 EXPECT_LENGTH_N(3, kExprI32Const, U32V_2(999));
1909 EXPECT_LENGTH_N(4, kExprI32Const, U32V_3(9999));
1910 EXPECT_LENGTH_N(5, kExprI32Const, U32V_4(999999));
1911 EXPECT_LENGTH_N(6, kExprI32Const, U32V_5(99999999));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001912}
1913
Ben Murdochda12d292016-06-02 14:46:10 +01001914TEST_F(WasmOpcodeLengthTest, I64Const) {
1915 EXPECT_LENGTH_N(2, kExprI64Const, U32V_1(1));
1916 EXPECT_LENGTH_N(3, kExprI64Const, U32V_2(99));
1917 EXPECT_LENGTH_N(4, kExprI64Const, U32V_3(9999));
1918 EXPECT_LENGTH_N(5, kExprI64Const, U32V_4(99999));
1919 EXPECT_LENGTH_N(6, kExprI64Const, U32V_5(9999999));
1920 EXPECT_LENGTH_N(7, WASM_I64V_6(777777));
1921 EXPECT_LENGTH_N(8, WASM_I64V_7(7777777));
1922 EXPECT_LENGTH_N(9, WASM_I64V_8(77777777));
1923 EXPECT_LENGTH_N(10, WASM_I64V_9(777777777));
1924}
1925
1926TEST_F(WasmOpcodeLengthTest, VariableLength) {
1927 EXPECT_LENGTH_N(2, kExprLoadGlobal, U32V_1(1));
1928 EXPECT_LENGTH_N(3, kExprLoadGlobal, U32V_2(33));
1929 EXPECT_LENGTH_N(4, kExprLoadGlobal, U32V_3(44));
1930 EXPECT_LENGTH_N(5, kExprLoadGlobal, U32V_4(66));
1931 EXPECT_LENGTH_N(6, kExprLoadGlobal, U32V_5(77));
1932}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001933
1934TEST_F(WasmOpcodeLengthTest, LoadsAndStores) {
Ben Murdochda12d292016-06-02 14:46:10 +01001935 EXPECT_LENGTH(3, kExprI32LoadMem8S);
1936 EXPECT_LENGTH(3, kExprI32LoadMem8U);
1937 EXPECT_LENGTH(3, kExprI32LoadMem16S);
1938 EXPECT_LENGTH(3, kExprI32LoadMem16U);
1939 EXPECT_LENGTH(3, kExprI32LoadMem);
1940 EXPECT_LENGTH(3, kExprI64LoadMem8S);
1941 EXPECT_LENGTH(3, kExprI64LoadMem8U);
1942 EXPECT_LENGTH(3, kExprI64LoadMem16S);
1943 EXPECT_LENGTH(3, kExprI64LoadMem16U);
1944 EXPECT_LENGTH(3, kExprI64LoadMem32S);
1945 EXPECT_LENGTH(3, kExprI64LoadMem32U);
1946 EXPECT_LENGTH(3, kExprI64LoadMem);
1947 EXPECT_LENGTH(3, kExprF32LoadMem);
1948 EXPECT_LENGTH(3, kExprF64LoadMem);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001949
Ben Murdochda12d292016-06-02 14:46:10 +01001950 EXPECT_LENGTH(3, kExprI32StoreMem8);
1951 EXPECT_LENGTH(3, kExprI32StoreMem16);
1952 EXPECT_LENGTH(3, kExprI32StoreMem);
1953 EXPECT_LENGTH(3, kExprI64StoreMem8);
1954 EXPECT_LENGTH(3, kExprI64StoreMem16);
1955 EXPECT_LENGTH(3, kExprI64StoreMem32);
1956 EXPECT_LENGTH(3, kExprI64StoreMem);
1957 EXPECT_LENGTH(3, kExprF32StoreMem);
1958 EXPECT_LENGTH(3, kExprF64StoreMem);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001959}
1960
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001961TEST_F(WasmOpcodeLengthTest, MiscMemExpressions) {
1962 EXPECT_LENGTH(1, kExprMemorySize);
1963 EXPECT_LENGTH(1, kExprGrowMemory);
1964}
1965
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001966TEST_F(WasmOpcodeLengthTest, SimpleExpressions) {
1967 EXPECT_LENGTH(1, kExprI32Add);
1968 EXPECT_LENGTH(1, kExprI32Sub);
1969 EXPECT_LENGTH(1, kExprI32Mul);
1970 EXPECT_LENGTH(1, kExprI32DivS);
1971 EXPECT_LENGTH(1, kExprI32DivU);
1972 EXPECT_LENGTH(1, kExprI32RemS);
1973 EXPECT_LENGTH(1, kExprI32RemU);
1974 EXPECT_LENGTH(1, kExprI32And);
1975 EXPECT_LENGTH(1, kExprI32Ior);
1976 EXPECT_LENGTH(1, kExprI32Xor);
1977 EXPECT_LENGTH(1, kExprI32Shl);
1978 EXPECT_LENGTH(1, kExprI32ShrU);
1979 EXPECT_LENGTH(1, kExprI32ShrS);
1980 EXPECT_LENGTH(1, kExprI32Eq);
1981 EXPECT_LENGTH(1, kExprI32Ne);
1982 EXPECT_LENGTH(1, kExprI32LtS);
1983 EXPECT_LENGTH(1, kExprI32LeS);
1984 EXPECT_LENGTH(1, kExprI32LtU);
1985 EXPECT_LENGTH(1, kExprI32LeU);
1986 EXPECT_LENGTH(1, kExprI32GtS);
1987 EXPECT_LENGTH(1, kExprI32GeS);
1988 EXPECT_LENGTH(1, kExprI32GtU);
1989 EXPECT_LENGTH(1, kExprI32GeU);
1990 EXPECT_LENGTH(1, kExprI32Clz);
1991 EXPECT_LENGTH(1, kExprI32Ctz);
1992 EXPECT_LENGTH(1, kExprI32Popcnt);
Ben Murdochda12d292016-06-02 14:46:10 +01001993 EXPECT_LENGTH(1, kExprI32Eqz);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00001994 EXPECT_LENGTH(1, kExprI64Add);
1995 EXPECT_LENGTH(1, kExprI64Sub);
1996 EXPECT_LENGTH(1, kExprI64Mul);
1997 EXPECT_LENGTH(1, kExprI64DivS);
1998 EXPECT_LENGTH(1, kExprI64DivU);
1999 EXPECT_LENGTH(1, kExprI64RemS);
2000 EXPECT_LENGTH(1, kExprI64RemU);
2001 EXPECT_LENGTH(1, kExprI64And);
2002 EXPECT_LENGTH(1, kExprI64Ior);
2003 EXPECT_LENGTH(1, kExprI64Xor);
2004 EXPECT_LENGTH(1, kExprI64Shl);
2005 EXPECT_LENGTH(1, kExprI64ShrU);
2006 EXPECT_LENGTH(1, kExprI64ShrS);
2007 EXPECT_LENGTH(1, kExprI64Eq);
2008 EXPECT_LENGTH(1, kExprI64Ne);
2009 EXPECT_LENGTH(1, kExprI64LtS);
2010 EXPECT_LENGTH(1, kExprI64LeS);
2011 EXPECT_LENGTH(1, kExprI64LtU);
2012 EXPECT_LENGTH(1, kExprI64LeU);
2013 EXPECT_LENGTH(1, kExprI64GtS);
2014 EXPECT_LENGTH(1, kExprI64GeS);
2015 EXPECT_LENGTH(1, kExprI64GtU);
2016 EXPECT_LENGTH(1, kExprI64GeU);
2017 EXPECT_LENGTH(1, kExprI64Clz);
2018 EXPECT_LENGTH(1, kExprI64Ctz);
2019 EXPECT_LENGTH(1, kExprI64Popcnt);
2020 EXPECT_LENGTH(1, kExprF32Add);
2021 EXPECT_LENGTH(1, kExprF32Sub);
2022 EXPECT_LENGTH(1, kExprF32Mul);
2023 EXPECT_LENGTH(1, kExprF32Div);
2024 EXPECT_LENGTH(1, kExprF32Min);
2025 EXPECT_LENGTH(1, kExprF32Max);
2026 EXPECT_LENGTH(1, kExprF32Abs);
2027 EXPECT_LENGTH(1, kExprF32Neg);
2028 EXPECT_LENGTH(1, kExprF32CopySign);
2029 EXPECT_LENGTH(1, kExprF32Ceil);
2030 EXPECT_LENGTH(1, kExprF32Floor);
2031 EXPECT_LENGTH(1, kExprF32Trunc);
2032 EXPECT_LENGTH(1, kExprF32NearestInt);
2033 EXPECT_LENGTH(1, kExprF32Sqrt);
2034 EXPECT_LENGTH(1, kExprF32Eq);
2035 EXPECT_LENGTH(1, kExprF32Ne);
2036 EXPECT_LENGTH(1, kExprF32Lt);
2037 EXPECT_LENGTH(1, kExprF32Le);
2038 EXPECT_LENGTH(1, kExprF32Gt);
2039 EXPECT_LENGTH(1, kExprF32Ge);
2040 EXPECT_LENGTH(1, kExprF64Add);
2041 EXPECT_LENGTH(1, kExprF64Sub);
2042 EXPECT_LENGTH(1, kExprF64Mul);
2043 EXPECT_LENGTH(1, kExprF64Div);
2044 EXPECT_LENGTH(1, kExprF64Min);
2045 EXPECT_LENGTH(1, kExprF64Max);
2046 EXPECT_LENGTH(1, kExprF64Abs);
2047 EXPECT_LENGTH(1, kExprF64Neg);
2048 EXPECT_LENGTH(1, kExprF64CopySign);
2049 EXPECT_LENGTH(1, kExprF64Ceil);
2050 EXPECT_LENGTH(1, kExprF64Floor);
2051 EXPECT_LENGTH(1, kExprF64Trunc);
2052 EXPECT_LENGTH(1, kExprF64NearestInt);
2053 EXPECT_LENGTH(1, kExprF64Sqrt);
2054 EXPECT_LENGTH(1, kExprF64Eq);
2055 EXPECT_LENGTH(1, kExprF64Ne);
2056 EXPECT_LENGTH(1, kExprF64Lt);
2057 EXPECT_LENGTH(1, kExprF64Le);
2058 EXPECT_LENGTH(1, kExprF64Gt);
2059 EXPECT_LENGTH(1, kExprF64Ge);
2060 EXPECT_LENGTH(1, kExprI32SConvertF32);
2061 EXPECT_LENGTH(1, kExprI32SConvertF64);
2062 EXPECT_LENGTH(1, kExprI32UConvertF32);
2063 EXPECT_LENGTH(1, kExprI32UConvertF64);
2064 EXPECT_LENGTH(1, kExprI32ConvertI64);
2065 EXPECT_LENGTH(1, kExprI64SConvertF32);
2066 EXPECT_LENGTH(1, kExprI64SConvertF64);
2067 EXPECT_LENGTH(1, kExprI64UConvertF32);
2068 EXPECT_LENGTH(1, kExprI64UConvertF64);
2069 EXPECT_LENGTH(1, kExprI64SConvertI32);
2070 EXPECT_LENGTH(1, kExprI64UConvertI32);
2071 EXPECT_LENGTH(1, kExprF32SConvertI32);
2072 EXPECT_LENGTH(1, kExprF32UConvertI32);
2073 EXPECT_LENGTH(1, kExprF32SConvertI64);
2074 EXPECT_LENGTH(1, kExprF32UConvertI64);
2075 EXPECT_LENGTH(1, kExprF32ConvertF64);
2076 EXPECT_LENGTH(1, kExprF32ReinterpretI32);
2077 EXPECT_LENGTH(1, kExprF64SConvertI32);
2078 EXPECT_LENGTH(1, kExprF64UConvertI32);
2079 EXPECT_LENGTH(1, kExprF64SConvertI64);
2080 EXPECT_LENGTH(1, kExprF64UConvertI64);
2081 EXPECT_LENGTH(1, kExprF64ConvertF32);
2082 EXPECT_LENGTH(1, kExprF64ReinterpretI64);
2083 EXPECT_LENGTH(1, kExprI32ReinterpretF32);
2084 EXPECT_LENGTH(1, kExprI64ReinterpretF64);
2085}
2086
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00002087class WasmOpcodeArityTest : public TestWithZone {
2088 public:
2089 WasmOpcodeArityTest() : TestWithZone() {}
2090};
2091
Ben Murdochc5610432016-08-08 18:44:38 +01002092#define EXPECT_ARITY(expected, ...) \
2093 { \
2094 static const byte code[] = {__VA_ARGS__}; \
2095 EXPECT_EQ(expected, OpcodeArity(code, code + sizeof(code))); \
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00002096 }
2097
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00002098TEST_F(WasmOpcodeArityTest, Control) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00002099 EXPECT_ARITY(0, kExprNop);
2100
2101 EXPECT_ARITY(0, kExprBlock, 0);
Ben Murdochc5610432016-08-08 18:44:38 +01002102 EXPECT_ARITY(0, kExprBlock, 1);
2103 EXPECT_ARITY(0, kExprBlock, 2);
2104 EXPECT_ARITY(0, kExprBlock, 5);
2105 EXPECT_ARITY(0, kExprBlock, 10);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00002106
2107 EXPECT_ARITY(0, kExprLoop, 0);
Ben Murdochc5610432016-08-08 18:44:38 +01002108 EXPECT_ARITY(0, kExprLoop, 1);
2109 EXPECT_ARITY(0, kExprLoop, 2);
2110 EXPECT_ARITY(0, kExprLoop, 7);
2111 EXPECT_ARITY(0, kExprLoop, 11);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00002112
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00002113 EXPECT_ARITY(3, kExprSelect);
2114
Ben Murdochc5610432016-08-08 18:44:38 +01002115 EXPECT_ARITY(0, kExprBr);
2116 EXPECT_ARITY(1, kExprBrIf);
2117 EXPECT_ARITY(1, kExprBrTable);
2118
2119 EXPECT_ARITY(1, kExprBr, ARITY_1);
2120 EXPECT_ARITY(2, kExprBrIf, ARITY_1);
2121 EXPECT_ARITY(2, kExprBrTable, ARITY_1);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00002122
2123 {
Ben Murdochc5610432016-08-08 18:44:38 +01002124 EXPECT_ARITY(0, kExprReturn, ARITY_0);
2125 EXPECT_ARITY(1, kExprReturn, ARITY_1);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00002126 }
2127}
2128
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00002129TEST_F(WasmOpcodeArityTest, Misc) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00002130 EXPECT_ARITY(0, kExprI8Const);
2131 EXPECT_ARITY(0, kExprI32Const);
2132 EXPECT_ARITY(0, kExprF32Const);
2133 EXPECT_ARITY(0, kExprI64Const);
2134 EXPECT_ARITY(0, kExprF64Const);
2135 EXPECT_ARITY(0, kExprGetLocal);
2136 EXPECT_ARITY(1, kExprSetLocal);
2137 EXPECT_ARITY(0, kExprLoadGlobal);
2138 EXPECT_ARITY(1, kExprStoreGlobal);
2139}
2140
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00002141TEST_F(WasmOpcodeArityTest, Calls) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00002142 {
Ben Murdochc5610432016-08-08 18:44:38 +01002143 EXPECT_ARITY(2, kExprCallFunction, 2, 0);
2144 EXPECT_ARITY(2, kExprCallImport, 2, 0);
2145 EXPECT_ARITY(3, kExprCallIndirect, 2, 0);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00002146
Ben Murdochc5610432016-08-08 18:44:38 +01002147 EXPECT_ARITY(1, kExprBr, ARITY_1);
2148 EXPECT_ARITY(2, kExprBrIf, ARITY_1);
2149 EXPECT_ARITY(2, kExprBrTable, ARITY_1);
2150
2151 EXPECT_ARITY(0, kExprBr, ARITY_0);
2152 EXPECT_ARITY(1, kExprBrIf, ARITY_0);
2153 EXPECT_ARITY(1, kExprBrTable, ARITY_0);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00002154 }
2155
2156 {
Ben Murdochc5610432016-08-08 18:44:38 +01002157 EXPECT_ARITY(1, kExprCallFunction, ARITY_1, 1);
2158 EXPECT_ARITY(1, kExprCallImport, ARITY_1, 1);
2159 EXPECT_ARITY(2, kExprCallIndirect, ARITY_1, 1);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00002160
Ben Murdochc5610432016-08-08 18:44:38 +01002161 EXPECT_ARITY(1, kExprBr, ARITY_1);
2162 EXPECT_ARITY(2, kExprBrIf, ARITY_1);
2163 EXPECT_ARITY(2, kExprBrTable, ARITY_1);
2164
2165 EXPECT_ARITY(0, kExprBr, ARITY_0);
2166 EXPECT_ARITY(1, kExprBrIf, ARITY_0);
2167 EXPECT_ARITY(1, kExprBrTable, ARITY_0);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00002168 }
2169}
2170
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00002171TEST_F(WasmOpcodeArityTest, LoadsAndStores) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00002172 EXPECT_ARITY(1, kExprI32LoadMem8S);
2173 EXPECT_ARITY(1, kExprI32LoadMem8U);
2174 EXPECT_ARITY(1, kExprI32LoadMem16S);
2175 EXPECT_ARITY(1, kExprI32LoadMem16U);
2176 EXPECT_ARITY(1, kExprI32LoadMem);
2177
2178 EXPECT_ARITY(1, kExprI64LoadMem8S);
2179 EXPECT_ARITY(1, kExprI64LoadMem8U);
2180 EXPECT_ARITY(1, kExprI64LoadMem16S);
2181 EXPECT_ARITY(1, kExprI64LoadMem16U);
2182 EXPECT_ARITY(1, kExprI64LoadMem32S);
2183 EXPECT_ARITY(1, kExprI64LoadMem32U);
2184 EXPECT_ARITY(1, kExprI64LoadMem);
2185 EXPECT_ARITY(1, kExprF32LoadMem);
2186 EXPECT_ARITY(1, kExprF64LoadMem);
2187
2188 EXPECT_ARITY(2, kExprI32StoreMem8);
2189 EXPECT_ARITY(2, kExprI32StoreMem16);
2190 EXPECT_ARITY(2, kExprI32StoreMem);
2191 EXPECT_ARITY(2, kExprI64StoreMem8);
2192 EXPECT_ARITY(2, kExprI64StoreMem16);
2193 EXPECT_ARITY(2, kExprI64StoreMem32);
2194 EXPECT_ARITY(2, kExprI64StoreMem);
2195 EXPECT_ARITY(2, kExprF32StoreMem);
2196 EXPECT_ARITY(2, kExprF64StoreMem);
2197}
2198
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00002199TEST_F(WasmOpcodeArityTest, MiscMemExpressions) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00002200 EXPECT_ARITY(0, kExprMemorySize);
2201 EXPECT_ARITY(1, kExprGrowMemory);
2202}
2203
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00002204TEST_F(WasmOpcodeArityTest, SimpleExpressions) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00002205 EXPECT_ARITY(2, kExprI32Add);
2206 EXPECT_ARITY(2, kExprI32Sub);
2207 EXPECT_ARITY(2, kExprI32Mul);
2208 EXPECT_ARITY(2, kExprI32DivS);
2209 EXPECT_ARITY(2, kExprI32DivU);
2210 EXPECT_ARITY(2, kExprI32RemS);
2211 EXPECT_ARITY(2, kExprI32RemU);
2212 EXPECT_ARITY(2, kExprI32And);
2213 EXPECT_ARITY(2, kExprI32Ior);
2214 EXPECT_ARITY(2, kExprI32Xor);
2215 EXPECT_ARITY(2, kExprI32Shl);
2216 EXPECT_ARITY(2, kExprI32ShrU);
2217 EXPECT_ARITY(2, kExprI32ShrS);
2218 EXPECT_ARITY(2, kExprI32Eq);
2219 EXPECT_ARITY(2, kExprI32Ne);
2220 EXPECT_ARITY(2, kExprI32LtS);
2221 EXPECT_ARITY(2, kExprI32LeS);
2222 EXPECT_ARITY(2, kExprI32LtU);
2223 EXPECT_ARITY(2, kExprI32LeU);
2224 EXPECT_ARITY(2, kExprI32GtS);
2225 EXPECT_ARITY(2, kExprI32GeS);
2226 EXPECT_ARITY(2, kExprI32GtU);
2227 EXPECT_ARITY(2, kExprI32GeU);
2228 EXPECT_ARITY(1, kExprI32Clz);
2229 EXPECT_ARITY(1, kExprI32Ctz);
2230 EXPECT_ARITY(1, kExprI32Popcnt);
Ben Murdochda12d292016-06-02 14:46:10 +01002231 EXPECT_ARITY(1, kExprI32Eqz);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00002232 EXPECT_ARITY(2, kExprI64Add);
2233 EXPECT_ARITY(2, kExprI64Sub);
2234 EXPECT_ARITY(2, kExprI64Mul);
2235 EXPECT_ARITY(2, kExprI64DivS);
2236 EXPECT_ARITY(2, kExprI64DivU);
2237 EXPECT_ARITY(2, kExprI64RemS);
2238 EXPECT_ARITY(2, kExprI64RemU);
2239 EXPECT_ARITY(2, kExprI64And);
2240 EXPECT_ARITY(2, kExprI64Ior);
2241 EXPECT_ARITY(2, kExprI64Xor);
2242 EXPECT_ARITY(2, kExprI64Shl);
2243 EXPECT_ARITY(2, kExprI64ShrU);
2244 EXPECT_ARITY(2, kExprI64ShrS);
2245 EXPECT_ARITY(2, kExprI64Eq);
2246 EXPECT_ARITY(2, kExprI64Ne);
2247 EXPECT_ARITY(2, kExprI64LtS);
2248 EXPECT_ARITY(2, kExprI64LeS);
2249 EXPECT_ARITY(2, kExprI64LtU);
2250 EXPECT_ARITY(2, kExprI64LeU);
2251 EXPECT_ARITY(2, kExprI64GtS);
2252 EXPECT_ARITY(2, kExprI64GeS);
2253 EXPECT_ARITY(2, kExprI64GtU);
2254 EXPECT_ARITY(2, kExprI64GeU);
2255 EXPECT_ARITY(1, kExprI64Clz);
2256 EXPECT_ARITY(1, kExprI64Ctz);
2257 EXPECT_ARITY(1, kExprI64Popcnt);
2258 EXPECT_ARITY(2, kExprF32Add);
2259 EXPECT_ARITY(2, kExprF32Sub);
2260 EXPECT_ARITY(2, kExprF32Mul);
2261 EXPECT_ARITY(2, kExprF32Div);
2262 EXPECT_ARITY(2, kExprF32Min);
2263 EXPECT_ARITY(2, kExprF32Max);
2264 EXPECT_ARITY(1, kExprF32Abs);
2265 EXPECT_ARITY(1, kExprF32Neg);
2266 EXPECT_ARITY(2, kExprF32CopySign);
2267 EXPECT_ARITY(1, kExprF32Ceil);
2268 EXPECT_ARITY(1, kExprF32Floor);
2269 EXPECT_ARITY(1, kExprF32Trunc);
2270 EXPECT_ARITY(1, kExprF32NearestInt);
2271 EXPECT_ARITY(1, kExprF32Sqrt);
2272 EXPECT_ARITY(2, kExprF32Eq);
2273 EXPECT_ARITY(2, kExprF32Ne);
2274 EXPECT_ARITY(2, kExprF32Lt);
2275 EXPECT_ARITY(2, kExprF32Le);
2276 EXPECT_ARITY(2, kExprF32Gt);
2277 EXPECT_ARITY(2, kExprF32Ge);
2278 EXPECT_ARITY(2, kExprF64Add);
2279 EXPECT_ARITY(2, kExprF64Sub);
2280 EXPECT_ARITY(2, kExprF64Mul);
2281 EXPECT_ARITY(2, kExprF64Div);
2282 EXPECT_ARITY(2, kExprF64Min);
2283 EXPECT_ARITY(2, kExprF64Max);
2284 EXPECT_ARITY(1, kExprF64Abs);
2285 EXPECT_ARITY(1, kExprF64Neg);
2286 EXPECT_ARITY(2, kExprF64CopySign);
2287 EXPECT_ARITY(1, kExprF64Ceil);
2288 EXPECT_ARITY(1, kExprF64Floor);
2289 EXPECT_ARITY(1, kExprF64Trunc);
2290 EXPECT_ARITY(1, kExprF64NearestInt);
2291 EXPECT_ARITY(1, kExprF64Sqrt);
2292 EXPECT_ARITY(2, kExprF64Eq);
2293 EXPECT_ARITY(2, kExprF64Ne);
2294 EXPECT_ARITY(2, kExprF64Lt);
2295 EXPECT_ARITY(2, kExprF64Le);
2296 EXPECT_ARITY(2, kExprF64Gt);
2297 EXPECT_ARITY(2, kExprF64Ge);
2298 EXPECT_ARITY(1, kExprI32SConvertF32);
2299 EXPECT_ARITY(1, kExprI32SConvertF64);
2300 EXPECT_ARITY(1, kExprI32UConvertF32);
2301 EXPECT_ARITY(1, kExprI32UConvertF64);
2302 EXPECT_ARITY(1, kExprI32ConvertI64);
2303 EXPECT_ARITY(1, kExprI64SConvertF32);
2304 EXPECT_ARITY(1, kExprI64SConvertF64);
2305 EXPECT_ARITY(1, kExprI64UConvertF32);
2306 EXPECT_ARITY(1, kExprI64UConvertF64);
2307 EXPECT_ARITY(1, kExprI64SConvertI32);
2308 EXPECT_ARITY(1, kExprI64UConvertI32);
2309 EXPECT_ARITY(1, kExprF32SConvertI32);
2310 EXPECT_ARITY(1, kExprF32UConvertI32);
2311 EXPECT_ARITY(1, kExprF32SConvertI64);
2312 EXPECT_ARITY(1, kExprF32UConvertI64);
2313 EXPECT_ARITY(1, kExprF32ConvertF64);
2314 EXPECT_ARITY(1, kExprF32ReinterpretI32);
2315 EXPECT_ARITY(1, kExprF64SConvertI32);
2316 EXPECT_ARITY(1, kExprF64UConvertI32);
2317 EXPECT_ARITY(1, kExprF64SConvertI64);
2318 EXPECT_ARITY(1, kExprF64UConvertI64);
2319 EXPECT_ARITY(1, kExprF64ConvertF32);
2320 EXPECT_ARITY(1, kExprF64ReinterpretI64);
2321 EXPECT_ARITY(1, kExprI32ReinterpretF32);
2322 EXPECT_ARITY(1, kExprI64ReinterpretF64);
2323}
Ben Murdochda12d292016-06-02 14:46:10 +01002324
2325typedef ZoneVector<LocalType> LocalTypeMap;
2326
2327class LocalDeclDecoderTest : public TestWithZone {
2328 public:
2329 base::AccountingAllocator allocator;
2330
2331 size_t ExpectRun(LocalTypeMap map, size_t pos, LocalType expected,
2332 size_t count) {
2333 for (size_t i = 0; i < count; i++) {
2334 EXPECT_EQ(expected, map[pos++]);
2335 }
2336 return pos;
2337 }
2338
2339 LocalTypeMap Expand(AstLocalDecls& decls) {
2340 ZoneVector<LocalType> map(zone());
2341 for (auto p : decls.local_types) {
2342 map.insert(map.end(), p.second, p.first);
2343 }
2344 return map;
2345 }
2346};
2347
2348TEST_F(LocalDeclDecoderTest, EmptyLocals) {
2349 AstLocalDecls decls(zone());
2350 bool result = DecodeLocalDecls(decls, nullptr, nullptr);
2351 EXPECT_FALSE(result);
2352}
2353
2354TEST_F(LocalDeclDecoderTest, NoLocals) {
2355 static const byte data[] = {0};
2356 AstLocalDecls decls(zone());
2357 bool result = DecodeLocalDecls(decls, data, data + sizeof(data));
2358 EXPECT_TRUE(result);
2359 EXPECT_EQ(0, decls.total_local_count);
2360}
2361
2362TEST_F(LocalDeclDecoderTest, OneLocal) {
2363 for (size_t i = 0; i < arraysize(kLocalTypes); i++) {
2364 LocalType type = kLocalTypes[i];
2365 const byte data[] = {
2366 1, 1, static_cast<byte>(WasmOpcodes::LocalTypeCodeFor(type))};
2367 AstLocalDecls decls(zone());
2368 bool result = DecodeLocalDecls(decls, data, data + sizeof(data));
2369 EXPECT_TRUE(result);
2370 EXPECT_EQ(1, decls.total_local_count);
2371
2372 LocalTypeMap map = Expand(decls);
2373 EXPECT_EQ(1, map.size());
Ben Murdochc5610432016-08-08 18:44:38 +01002374 EXPECT_EQ(type, map[0]);
Ben Murdochda12d292016-06-02 14:46:10 +01002375 }
2376}
2377
2378TEST_F(LocalDeclDecoderTest, FiveLocals) {
2379 for (size_t i = 0; i < arraysize(kLocalTypes); i++) {
2380 LocalType type = kLocalTypes[i];
2381 const byte data[] = {
2382 1, 5, static_cast<byte>(WasmOpcodes::LocalTypeCodeFor(type))};
2383 AstLocalDecls decls(zone());
2384 bool result = DecodeLocalDecls(decls, data, data + sizeof(data));
2385 EXPECT_TRUE(result);
2386 EXPECT_EQ(sizeof(data), decls.decls_encoded_size);
2387 EXPECT_EQ(5, decls.total_local_count);
2388
2389 LocalTypeMap map = Expand(decls);
2390 EXPECT_EQ(5, map.size());
2391 ExpectRun(map, 0, type, 5);
2392 }
2393}
2394
2395TEST_F(LocalDeclDecoderTest, MixedLocals) {
2396 for (byte a = 0; a < 3; a++) {
2397 for (byte b = 0; b < 3; b++) {
2398 for (byte c = 0; c < 3; c++) {
2399 for (byte d = 0; d < 3; d++) {
2400 const byte data[] = {4, a, kLocalI32, b, kLocalI64,
2401 c, kLocalF32, d, kLocalF64};
2402 AstLocalDecls decls(zone());
2403 bool result = DecodeLocalDecls(decls, data, data + sizeof(data));
2404 EXPECT_TRUE(result);
2405 EXPECT_EQ(sizeof(data), decls.decls_encoded_size);
2406 EXPECT_EQ(a + b + c + d, decls.total_local_count);
2407
2408 LocalTypeMap map = Expand(decls);
2409 EXPECT_EQ(a + b + c + d, map.size());
2410
2411 size_t pos = 0;
2412 pos = ExpectRun(map, pos, kAstI32, a);
2413 pos = ExpectRun(map, pos, kAstI64, b);
2414 pos = ExpectRun(map, pos, kAstF32, c);
2415 pos = ExpectRun(map, pos, kAstF64, d);
2416 }
2417 }
2418 }
2419 }
2420}
2421
2422TEST_F(LocalDeclDecoderTest, UseEncoder) {
2423 const byte* data = nullptr;
2424 const byte* end = nullptr;
Ben Murdochc5610432016-08-08 18:44:38 +01002425 LocalDeclEncoder local_decls(zone());
Ben Murdochda12d292016-06-02 14:46:10 +01002426
2427 local_decls.AddLocals(5, kAstF32);
2428 local_decls.AddLocals(1337, kAstI32);
2429 local_decls.AddLocals(212, kAstI64);
2430 local_decls.Prepend(&data, &end);
2431
2432 AstLocalDecls decls(zone());
2433 bool result = DecodeLocalDecls(decls, data, end);
2434 EXPECT_TRUE(result);
2435 EXPECT_EQ(5 + 1337 + 212, decls.total_local_count);
2436
2437 LocalTypeMap map = Expand(decls);
2438 size_t pos = 0;
2439 pos = ExpectRun(map, pos, kAstF32, 5);
2440 pos = ExpectRun(map, pos, kAstI32, 1337);
2441 pos = ExpectRun(map, pos, kAstI64, 212);
2442 delete[] data;
2443}
2444
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00002445} // namespace wasm
2446} // namespace internal
2447} // namespace v8