Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(202)

Side by Side Diff: test/unittests/wasm/ast-decoder-unittest.cc

Issue 2345593003: [wasm] Master CL for Binary 0xC changes. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Last comments update Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2015 the V8 project authors. All rights reserved. 1 // 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "test/unittests/test-utils.h" 5 #include "test/unittests/test-utils.h"
6 6
7 #include "src/v8.h" 7 #include "src/v8.h"
8 8
9 #include "test/cctest/wasm/test-signatures.h" 9 #include "test/cctest/wasm/test-signatures.h"
10 10
11 #include "src/objects.h" 11 #include "src/objects.h"
12 12
13 #include "src/wasm/ast-decoder.h" 13 #include "src/wasm/ast-decoder.h"
14 #include "src/wasm/wasm-macro-gen.h" 14 #include "src/wasm/wasm-macro-gen.h"
15 #include "src/wasm/wasm-module.h" 15 #include "src/wasm/wasm-module.h"
16 #include "src/wasm/wasm-opcodes.h" 16 #include "src/wasm/wasm-opcodes.h"
17 17
18 namespace v8 { 18 namespace v8 {
19 namespace internal { 19 namespace internal {
20 namespace wasm { 20 namespace wasm {
21 21
22 #define B1(a) kExprBlock, a, kExprEnd 22 #define B1(a) WASM_BLOCK(a)
23 #define B2(a, b) kExprBlock, a, b, kExprEnd 23 #define B2(a, b) WASM_BLOCK(a, b)
24 #define B3(a, b, c) kExprBlock, a, b, c, kExprEnd 24 #define B3(a, b, c) WASM_BLOCK(a, b, c)
25
26 #define WASM_IF_OP kExprIf, kLocalVoid
27 #define WASM_LOOP_OP kExprLoop, kLocalVoid
25 28
26 static const byte kCodeGetLocal0[] = {kExprGetLocal, 0}; 29 static const byte kCodeGetLocal0[] = {kExprGetLocal, 0};
27 static const byte kCodeGetLocal1[] = {kExprGetLocal, 1}; 30 static const byte kCodeGetLocal1[] = {kExprGetLocal, 1};
28 static const byte kCodeSetLocal0[] = {WASM_SET_LOCAL(0, WASM_ZERO)}; 31 static const byte kCodeSetLocal0[] = {WASM_SET_LOCAL(0, WASM_ZERO)};
32 static const byte kCodeTeeLocal0[] = {WASM_TEE_LOCAL(0, WASM_ZERO)};
29 33
30 static const LocalType kLocalTypes[] = {kAstI32, kAstI64, kAstF32, kAstF64}; 34 static const LocalType kLocalTypes[] = {kAstI32, kAstI64, kAstF32, kAstF64};
31 static const MachineType machineTypes[] = { 35 static const MachineType machineTypes[] = {
32 MachineType::Int8(), MachineType::Uint8(), MachineType::Int16(), 36 MachineType::Int8(), MachineType::Uint8(), MachineType::Int16(),
33 MachineType::Uint16(), MachineType::Int32(), MachineType::Uint32(), 37 MachineType::Uint16(), MachineType::Int32(), MachineType::Uint32(),
34 MachineType::Int64(), MachineType::Uint64(), MachineType::Float32(), 38 MachineType::Int64(), MachineType::Uint64(), MachineType::Float32(),
35 MachineType::Float64()}; 39 MachineType::Float64()};
36 40
37 static const WasmOpcode kInt32BinopOpcodes[] = { 41 static const WasmOpcode kInt32BinopOpcodes[] = {
38 kExprI32Add, kExprI32Sub, kExprI32Mul, kExprI32DivS, kExprI32DivU, 42 kExprI32Add, kExprI32Sub, kExprI32Mul, kExprI32DivS, kExprI32DivU,
39 kExprI32RemS, kExprI32RemU, kExprI32And, kExprI32Ior, kExprI32Xor, 43 kExprI32RemS, kExprI32RemU, kExprI32And, kExprI32Ior, kExprI32Xor,
40 kExprI32Shl, kExprI32ShrU, kExprI32ShrS, kExprI32Eq, kExprI32LtS, 44 kExprI32Shl, kExprI32ShrU, kExprI32ShrS, kExprI32Eq, kExprI32LtS,
41 kExprI32LeS, kExprI32LtU, kExprI32LeU}; 45 kExprI32LeS, kExprI32LtU, kExprI32LeU};
42 46
43 #define WASM_BRV_IF_ZERO(depth, val) \ 47 #define WASM_BRV_IF_ZERO(depth, val) \
44 val, WASM_ZERO, kExprBrIf, ARITY_1, static_cast<byte>(depth) 48 val, WASM_ZERO, kExprBrIf, static_cast<byte>(depth)
45 49
46 #define EXPECT_VERIFIES(env, x) Verify(kSuccess, env, x, x + arraysize(x)) 50 #define EXPECT_VERIFIES_C(sig, x) \
51 Verify(kSuccess, sigs.sig(), x, x + arraysize(x))
47 52
48 #define EXPECT_FAILURE(env, x) Verify(kError, env, x, x + arraysize(x)) 53 #define EXPECT_FAILURE_C(sig, x) Verify(kError, sigs.sig(), x, x + arraysize(x))
49 54
50 #define EXPECT_VERIFIES_INLINE(env, ...) \ 55 #define EXPECT_VERIFIES_SC(sig, x) Verify(kSuccess, sig, x, x + arraysize(x))
56
57 #define EXPECT_FAILURE_SC(sig, x) Verify(kError, sig, x, x + arraysize(x))
58
59 #define EXPECT_VERIFIES_S(env, ...) \
51 do { \ 60 do { \
52 static byte code[] = {__VA_ARGS__}; \ 61 static byte code[] = {__VA_ARGS__}; \
53 Verify(kSuccess, env, code, code + arraysize(code)); \ 62 Verify(kSuccess, env, code, code + arraysize(code)); \
54 } while (false) 63 } while (false)
55 64
56 #define EXPECT_FAILURE_INLINE(env, ...) \ 65 #define EXPECT_FAILURE_S(env, ...) \
57 do { \ 66 do { \
58 static byte code[] = {__VA_ARGS__}; \ 67 static byte code[] = {__VA_ARGS__}; \
59 Verify(kError, env, code, code + arraysize(code)); \ 68 Verify(kError, env, code, code + arraysize(code)); \
60 } while (false) 69 } while (false)
61 70
62 #define VERIFY(...) \ 71 #define EXPECT_VERIFIES(sig, ...) \
63 do { \ 72 do { \
64 static const byte code[] = {__VA_ARGS__}; \ 73 static const byte code[] = {__VA_ARGS__}; \
65 Verify(kSuccess, sigs.v_i(), code, code + sizeof(code)); \ 74 Verify(kSuccess, sigs.sig(), code, code + sizeof(code)); \
75 } while (false)
76
77 #define EXPECT_FAILURE(sig, ...) \
78 do { \
79 static const byte code[] = {__VA_ARGS__}; \
80 Verify(kError, sigs.sig(), code, code + sizeof(code)); \
66 } while (false) 81 } while (false)
67 82
68 class AstDecoderTest : public TestWithZone { 83 class AstDecoderTest : public TestWithZone {
69 public: 84 public:
70 typedef std::pair<uint32_t, LocalType> LocalsDecl; 85 typedef std::pair<uint32_t, LocalType> LocalsDecl;
71 86
72 AstDecoderTest() : module(nullptr), local_decls(zone()) {} 87 AstDecoderTest() : module(nullptr), local_decls(zone()) {}
73 88
74 TestSignatures sigs; 89 TestSignatures sigs;
75 ModuleEnv* module; 90 ModuleEnv* module;
(...skipping 21 matching lines...) Expand all
97 if (result.error_pt) str << ", pt = +" << pt; 112 if (result.error_pt) str << ", pt = +" << pt;
98 str << ", msg = " << result.error_msg.get(); 113 str << ", msg = " << result.error_msg.get();
99 } else { 114 } else {
100 str << "Verification expected: " << expected << ", but got " 115 str << "Verification expected: " << expected << ", but got "
101 << result.error_code; 116 << result.error_code;
102 if (result.error_code != kSuccess) { 117 if (result.error_code != kSuccess) {
103 str << " pc = +" << pc; 118 str << " pc = +" << pc;
104 if (result.error_pt) str << ", pt = +" << pt; 119 if (result.error_pt) str << ", pt = +" << pt;
105 } 120 }
106 } 121 }
107 FATAL(str.str().c_str()); 122 EXPECT_TRUE(false) << str.str().c_str();
108 } 123 }
109 } 124 }
110 125
111 void TestBinop(WasmOpcode opcode, FunctionSig* success) { 126 void TestBinop(WasmOpcode opcode, FunctionSig* success) {
112 // op(local[0], local[1]) 127 // op(local[0], local[1])
113 byte code[] = {WASM_BINOP(opcode, WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))}; 128 byte code[] = {WASM_BINOP(opcode, WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))};
114 EXPECT_VERIFIES(success, code); 129 EXPECT_VERIFIES_SC(success, code);
115 130
116 // Try all combinations of return and parameter types. 131 // Try all combinations of return and parameter types.
117 for (size_t i = 0; i < arraysize(kLocalTypes); i++) { 132 for (size_t i = 0; i < arraysize(kLocalTypes); i++) {
118 for (size_t j = 0; j < arraysize(kLocalTypes); j++) { 133 for (size_t j = 0; j < arraysize(kLocalTypes); j++) {
119 for (size_t k = 0; k < arraysize(kLocalTypes); k++) { 134 for (size_t k = 0; k < arraysize(kLocalTypes); k++) {
120 LocalType types[] = {kLocalTypes[i], kLocalTypes[j], kLocalTypes[k]}; 135 LocalType types[] = {kLocalTypes[i], kLocalTypes[j], kLocalTypes[k]};
121 if (types[0] != success->GetReturn(0) || 136 if (types[0] != success->GetReturn(0) ||
122 types[1] != success->GetParam(0) || 137 types[1] != success->GetParam(0) ||
123 types[2] != success->GetParam(1)) { 138 types[2] != success->GetParam(1)) {
124 // Test signature mismatch. 139 // Test signature mismatch.
125 FunctionSig sig(1, 2, types); 140 FunctionSig sig(1, 2, types);
126 EXPECT_FAILURE(&sig, code); 141 EXPECT_FAILURE_SC(&sig, code);
127 } 142 }
128 } 143 }
129 } 144 }
130 } 145 }
131 } 146 }
132 147
133 void TestUnop(WasmOpcode opcode, FunctionSig* success) { 148 void TestUnop(WasmOpcode opcode, FunctionSig* success) {
134 TestUnop(opcode, success->GetReturn(), success->GetParam(0)); 149 TestUnop(opcode, success->GetReturn(), success->GetParam(0));
135 } 150 }
136 151
137 void TestUnop(WasmOpcode opcode, LocalType ret_type, LocalType param_type) { 152 void TestUnop(WasmOpcode opcode, LocalType ret_type, LocalType param_type) {
138 // Return(op(local[0])) 153 // Return(op(local[0]))
139 byte code[] = {WASM_UNOP(opcode, WASM_GET_LOCAL(0))}; 154 byte code[] = {WASM_UNOP(opcode, WASM_GET_LOCAL(0))};
140 { 155 {
141 LocalType types[] = {ret_type, param_type}; 156 LocalType types[] = {ret_type, param_type};
142 FunctionSig sig(1, 1, types); 157 FunctionSig sig(1, 1, types);
143 EXPECT_VERIFIES(&sig, code); 158 EXPECT_VERIFIES_SC(&sig, code);
144 } 159 }
145 160
146 // Try all combinations of return and parameter types. 161 // Try all combinations of return and parameter types.
147 for (size_t i = 0; i < arraysize(kLocalTypes); i++) { 162 for (size_t i = 0; i < arraysize(kLocalTypes); i++) {
148 for (size_t j = 0; j < arraysize(kLocalTypes); j++) { 163 for (size_t j = 0; j < arraysize(kLocalTypes); j++) {
149 LocalType types[] = {kLocalTypes[i], kLocalTypes[j]}; 164 LocalType types[] = {kLocalTypes[i], kLocalTypes[j]};
150 if (types[0] != ret_type || types[1] != param_type) { 165 if (types[0] != ret_type || types[1] != param_type) {
151 // Test signature mismatch. 166 // Test signature mismatch.
152 FunctionSig sig(1, 1, types); 167 FunctionSig sig(1, 1, types);
153 EXPECT_FAILURE(&sig, code); 168 EXPECT_FAILURE_SC(&sig, code);
154 } 169 }
155 } 170 }
156 } 171 }
157 } 172 }
158 }; 173 };
159 174
160 TEST_F(AstDecoderTest, Int8Const) { 175 TEST_F(AstDecoderTest, Int8Const) {
161 byte code[] = {kExprI8Const, 0}; 176 byte code[] = {kExprI8Const, 0};
162 for (int i = -128; i < 128; i++) { 177 for (int i = -128; i < 128; i++) {
163 code[1] = static_cast<byte>(i); 178 code[1] = static_cast<byte>(i);
164 EXPECT_VERIFIES(sigs.i_i(), code); 179 EXPECT_VERIFIES_C(i_i, code);
165 } 180 }
166 } 181 }
167 182
168 TEST_F(AstDecoderTest, EmptyFunction) { 183 TEST_F(AstDecoderTest, EmptyFunction) {
169 byte code[] = {0}; 184 byte code[] = {0};
170 Verify(kSuccess, sigs.v_v(), code, code); 185 Verify(kSuccess, sigs.v_v(), code, code);
171 Verify(kError, sigs.i_i(), code, code); 186 Verify(kError, sigs.i_i(), code, code);
172 } 187 }
173 188
174 TEST_F(AstDecoderTest, IncompleteIf1) { 189 TEST_F(AstDecoderTest, IncompleteIf1) {
175 byte code[] = {kExprIf}; 190 byte code[] = {kExprIf};
176 EXPECT_FAILURE(sigs.v_v(), code); 191 EXPECT_FAILURE_C(v_v, code);
177 EXPECT_FAILURE(sigs.i_i(), code); 192 EXPECT_FAILURE_C(i_i, code);
178 } 193 }
179 194
180 TEST_F(AstDecoderTest, Int8Const_fallthru) { 195 TEST_F(AstDecoderTest, Int8Const_fallthru) {
181 byte code[] = {kExprI8Const, 0, kExprI8Const, 1}; 196 EXPECT_VERIFIES(i_i, WASM_I32V_1(0));
182 EXPECT_VERIFIES(sigs.i_i(), code); 197 }
198
199 TEST_F(AstDecoderTest, Int8Const_fallthru2) {
200 EXPECT_FAILURE(i_i, WASM_I32V_1(0), WASM_I32V_1(1));
183 } 201 }
184 202
185 TEST_F(AstDecoderTest, Int32Const) { 203 TEST_F(AstDecoderTest, Int32Const) {
186 const int kInc = 4498211; 204 const int kInc = 4498211;
187 for (int32_t i = kMinInt; i < kMaxInt - kInc; i = i + kInc) { 205 for (int32_t i = kMinInt; i < kMaxInt - kInc; i = i + kInc) {
188 // TODO(binji): expand test for other sized int32s; 1 through 5 bytes. 206 // TODO(binji): expand test for other sized int32s; 1 through 5 bytes.
189 byte code[] = {WASM_I32V(i)}; 207 byte code[] = {WASM_I32V(i)};
190 EXPECT_VERIFIES(sigs.i_i(), code); 208 EXPECT_VERIFIES_C(i_i, code);
191 } 209 }
192 } 210 }
193 211
194 TEST_F(AstDecoderTest, Int8Const_fallthru2) {
195 byte code[] = {WASM_I8(0), WASM_I32V_4(0x1122334)};
196 EXPECT_VERIFIES(sigs.i_i(), code);
197 }
198
199 TEST_F(AstDecoderTest, Int64Const) { 212 TEST_F(AstDecoderTest, Int64Const) {
200 const int kInc = 4498211; 213 const int kInc = 4498211;
201 for (int32_t i = kMinInt; i < kMaxInt - kInc; i = i + kInc) { 214 for (int32_t i = kMinInt; i < kMaxInt - kInc; i = i + kInc) {
202 byte code[] = {WASM_I64V((static_cast<int64_t>(i) << 32) | i)}; 215 byte code[] = {WASM_I64V((static_cast<int64_t>(i) << 32) | i)};
203 EXPECT_VERIFIES(sigs.l_l(), code); 216 EXPECT_VERIFIES_C(l_l, code);
204 } 217 }
205 } 218 }
206 219
207 TEST_F(AstDecoderTest, Float32Const) { 220 TEST_F(AstDecoderTest, Float32Const) {
208 byte code[] = {kExprF32Const, 0, 0, 0, 0}; 221 byte code[] = {kExprF32Const, 0, 0, 0, 0};
209 float* ptr = reinterpret_cast<float*>(code + 1); 222 float* ptr = reinterpret_cast<float*>(code + 1);
210 for (int i = 0; i < 30; i++) { 223 for (int i = 0; i < 30; i++) {
211 WriteLittleEndianValue<float>(ptr, i * -7.75f); 224 WriteLittleEndianValue<float>(ptr, i * -7.75f);
212 EXPECT_VERIFIES(sigs.f_ff(), code); 225 EXPECT_VERIFIES_C(f_ff, code);
213 } 226 }
214 } 227 }
215 228
216 TEST_F(AstDecoderTest, Float64Const) { 229 TEST_F(AstDecoderTest, Float64Const) {
217 byte code[] = {kExprF64Const, 0, 0, 0, 0, 0, 0, 0, 0}; 230 byte code[] = {kExprF64Const, 0, 0, 0, 0, 0, 0, 0, 0};
218 double* ptr = reinterpret_cast<double*>(code + 1); 231 double* ptr = reinterpret_cast<double*>(code + 1);
219 for (int i = 0; i < 30; i++) { 232 for (int i = 0; i < 30; i++) {
220 WriteLittleEndianValue<double>(ptr, i * 33.45); 233 WriteLittleEndianValue<double>(ptr, i * 33.45);
221 EXPECT_VERIFIES(sigs.d_dd(), code); 234 EXPECT_VERIFIES_C(d_dd, code);
222 } 235 }
223 } 236 }
224 237
225 TEST_F(AstDecoderTest, Int32Const_off_end) { 238 TEST_F(AstDecoderTest, Int32Const_off_end) {
226 byte code[] = {kExprI32Const, 0xaa, 0xbb, 0xcc, 0x44}; 239 byte code[] = {kExprI32Const, 0xaa, 0xbb, 0xcc, 0x44};
227 240
228 for (int size = 1; size <= 4; size++) { 241 for (int size = 1; size <= 4; size++) {
229 Verify(kError, sigs.i_i(), code, code + size); 242 Verify(kError, sigs.i_i(), code, code + size);
230 } 243 }
231 } 244 }
232 245
233 TEST_F(AstDecoderTest, GetLocal0_param) { 246 TEST_F(AstDecoderTest, GetLocal0_param) {
234 EXPECT_VERIFIES(sigs.i_i(), kCodeGetLocal0); 247 EXPECT_VERIFIES_C(i_i, kCodeGetLocal0);
235 } 248 }
236 249
237 TEST_F(AstDecoderTest, GetLocal0_local) { 250 TEST_F(AstDecoderTest, GetLocal0_local) {
238 AddLocals(kAstI32, 1); 251 AddLocals(kAstI32, 1);
239 EXPECT_VERIFIES(sigs.i_v(), kCodeGetLocal0); 252 EXPECT_VERIFIES_C(i_v, kCodeGetLocal0);
240 } 253 }
241 254
242 TEST_F(AstDecoderTest, TooManyLocals) { 255 TEST_F(AstDecoderTest, TooManyLocals) {
243 AddLocals(kAstI32, 4034986500); 256 AddLocals(kAstI32, 4034986500);
244 EXPECT_FAILURE(sigs.i_v(), kCodeGetLocal0); 257 EXPECT_FAILURE_C(i_v, kCodeGetLocal0);
245 } 258 }
246 259
247 TEST_F(AstDecoderTest, GetLocal0_param_n) { 260 TEST_F(AstDecoderTest, GetLocal0_param_n) {
248 FunctionSig* array[] = {sigs.i_i(), sigs.i_ii(), sigs.i_iii()}; 261 FunctionSig* array[] = {sigs.i_i(), sigs.i_ii(), sigs.i_iii()};
249 262
250 for (size_t i = 0; i < arraysize(array); i++) { 263 for (size_t i = 0; i < arraysize(array); i++) {
251 EXPECT_VERIFIES(array[i], kCodeGetLocal0); 264 EXPECT_VERIFIES_SC(array[i], kCodeGetLocal0);
252 } 265 }
253 } 266 }
254 267
255 TEST_F(AstDecoderTest, GetLocalN_local) { 268 TEST_F(AstDecoderTest, GetLocalN_local) {
256 for (byte i = 1; i < 8; i++) { 269 for (byte i = 1; i < 8; i++) {
257 AddLocals(kAstI32, 1); 270 AddLocals(kAstI32, 1);
258 for (byte j = 0; j < i; j++) { 271 for (byte j = 0; j < i; j++) {
259 byte code[] = {kExprGetLocal, j}; 272 byte code[] = {kExprGetLocal, j};
260 EXPECT_VERIFIES(sigs.i_v(), code); 273 EXPECT_VERIFIES_C(i_v, code);
261 } 274 }
262 } 275 }
263 } 276 }
264 277
265 TEST_F(AstDecoderTest, GetLocal0_fail_no_params) { 278 TEST_F(AstDecoderTest, GetLocal0_fail_no_params) {
266 EXPECT_FAILURE(sigs.i_v(), kCodeGetLocal0); 279 EXPECT_FAILURE_C(i_v, kCodeGetLocal0);
267 } 280 }
268 281
269 TEST_F(AstDecoderTest, GetLocal1_fail_no_locals) { 282 TEST_F(AstDecoderTest, GetLocal1_fail_no_locals) {
270 EXPECT_FAILURE(sigs.i_i(), kCodeGetLocal1); 283 EXPECT_FAILURE_C(i_i, kCodeGetLocal1);
271 } 284 }
272 285
273 TEST_F(AstDecoderTest, GetLocal_off_end) { 286 TEST_F(AstDecoderTest, GetLocal_off_end) {
274 static const byte code[] = {kExprGetLocal}; 287 static const byte code[] = {kExprGetLocal};
275 EXPECT_FAILURE(sigs.i_i(), code); 288 EXPECT_FAILURE_C(i_i, code);
276 } 289 }
277 290
278 TEST_F(AstDecoderTest, NumLocalBelowLimit) { 291 TEST_F(AstDecoderTest, NumLocalBelowLimit) {
279 AddLocals(kAstI32, kMaxNumWasmLocals - 1); 292 AddLocals(kAstI32, kMaxNumWasmLocals - 1);
280 EXPECT_VERIFIES_INLINE(sigs.v_v(), WASM_NOP); 293 EXPECT_VERIFIES(v_v, WASM_NOP);
281 } 294 }
282 295
283 TEST_F(AstDecoderTest, NumLocalAtLimit) { 296 TEST_F(AstDecoderTest, NumLocalAtLimit) {
284 AddLocals(kAstI32, kMaxNumWasmLocals); 297 AddLocals(kAstI32, kMaxNumWasmLocals);
285 EXPECT_VERIFIES_INLINE(sigs.v_v(), WASM_NOP); 298 EXPECT_VERIFIES(v_v, WASM_NOP);
286 } 299 }
287 300
288 TEST_F(AstDecoderTest, NumLocalAboveLimit) { 301 TEST_F(AstDecoderTest, NumLocalAboveLimit) {
289 AddLocals(kAstI32, kMaxNumWasmLocals + 1); 302 AddLocals(kAstI32, kMaxNumWasmLocals + 1);
290 EXPECT_FAILURE_INLINE(sigs.v_v(), WASM_NOP); 303 EXPECT_FAILURE(v_v, WASM_NOP);
291 } 304 }
292 305
293 TEST_F(AstDecoderTest, GetLocal_varint) { 306 TEST_F(AstDecoderTest, GetLocal_varint) {
294 const int kMaxLocals = kMaxNumWasmLocals; 307 const int kMaxLocals = kMaxNumWasmLocals;
295 AddLocals(kAstI32, kMaxLocals); 308 AddLocals(kAstI32, kMaxLocals);
296 309
297 for (int index = 0; index < kMaxLocals; index = index * 11 + 5) { 310 EXPECT_VERIFIES(i_i, kExprGetLocal, U32V_1(66));
298 EXPECT_VERIFIES_INLINE(sigs.i_i(), kExprGetLocal, U32V_1(index)); 311 EXPECT_VERIFIES(i_i, kExprGetLocal, U32V_2(7777));
299 EXPECT_VERIFIES_INLINE(sigs.i_i(), kExprGetLocal, U32V_2(index)); 312 EXPECT_VERIFIES(i_i, kExprGetLocal, U32V_3(888888));
300 EXPECT_VERIFIES_INLINE(sigs.i_i(), kExprGetLocal, U32V_3(index)); 313 EXPECT_VERIFIES(i_i, kExprGetLocal, U32V_4(3999999));
301 EXPECT_VERIFIES_INLINE(sigs.i_i(), kExprGetLocal, U32V_4(index)); 314
302 } 315 EXPECT_VERIFIES(i_i, kExprGetLocal, U32V_5(kMaxLocals - 1));
303 316
304 EXPECT_VERIFIES_INLINE(sigs.i_i(), kExprGetLocal, U32V_5(kMaxLocals - 1)); 317 EXPECT_FAILURE(i_i, kExprGetLocal, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF);
305 318
306 EXPECT_VERIFIES_INLINE(sigs.i_i(), kExprGetLocal, U32V_4(kMaxLocals - 1)); 319 EXPECT_VERIFIES(i_i, kExprGetLocal, U32V_4(kMaxLocals - 1));
307 EXPECT_VERIFIES_INLINE(sigs.i_i(), kExprGetLocal, U32V_4(kMaxLocals)); 320 EXPECT_VERIFIES(i_i, kExprGetLocal, U32V_4(kMaxLocals));
308 EXPECT_FAILURE_INLINE(sigs.i_i(), kExprGetLocal, U32V_4(kMaxLocals + 1)); 321 EXPECT_FAILURE(i_i, kExprGetLocal, U32V_4(kMaxLocals + 1));
309 322
310 EXPECT_FAILURE_INLINE(sigs.i_v(), kExprGetLocal, U32V_4(kMaxLocals)); 323 EXPECT_FAILURE(i_v, kExprGetLocal, U32V_4(kMaxLocals));
311 EXPECT_FAILURE_INLINE(sigs.i_v(), kExprGetLocal, U32V_4(kMaxLocals + 1)); 324 EXPECT_FAILURE(i_v, kExprGetLocal, U32V_4(kMaxLocals + 1));
312 } 325 }
313 326
314 TEST_F(AstDecoderTest, Binops_off_end) { 327 TEST_F(AstDecoderTest, Binops_off_end) {
315 byte code1[] = {0}; // [opcode] 328 byte code1[] = {0}; // [opcode]
316 for (size_t i = 0; i < arraysize(kInt32BinopOpcodes); i++) { 329 for (size_t i = 0; i < arraysize(kInt32BinopOpcodes); i++) {
317 code1[0] = kInt32BinopOpcodes[i]; 330 code1[0] = kInt32BinopOpcodes[i];
318 EXPECT_FAILURE(sigs.i_i(), code1); 331 EXPECT_FAILURE_C(i_i, code1);
319 } 332 }
320 333
321 byte code3[] = {kExprGetLocal, 0, 0}; // [expr] [opcode] 334 byte code3[] = {kExprGetLocal, 0, 0}; // [expr] [opcode]
322 for (size_t i = 0; i < arraysize(kInt32BinopOpcodes); i++) { 335 for (size_t i = 0; i < arraysize(kInt32BinopOpcodes); i++) {
323 code3[2] = kInt32BinopOpcodes[i]; 336 code3[2] = kInt32BinopOpcodes[i];
324 EXPECT_FAILURE(sigs.i_i(), code3); 337 EXPECT_FAILURE_C(i_i, code3);
325 } 338 }
326 339
327 byte code4[] = {kExprGetLocal, 0, 0, 0}; // [expr] [opcode] [opcode] 340 byte code4[] = {kExprGetLocal, 0, 0, 0}; // [expr] [opcode] [opcode]
328 for (size_t i = 0; i < arraysize(kInt32BinopOpcodes); i++) { 341 for (size_t i = 0; i < arraysize(kInt32BinopOpcodes); i++) {
329 code4[2] = kInt32BinopOpcodes[i]; 342 code4[2] = kInt32BinopOpcodes[i];
330 code4[3] = kInt32BinopOpcodes[i]; 343 code4[3] = kInt32BinopOpcodes[i];
331 EXPECT_FAILURE(sigs.i_i(), code4); 344 EXPECT_FAILURE_C(i_i, code4);
332 } 345 }
333 } 346 }
334 347
335 TEST_F(AstDecoderTest, BinopsAcrossBlock1) { 348 TEST_F(AstDecoderTest, BinopsAcrossBlock1) {
336 static const byte code[] = {WASM_ZERO, kExprBlock, WASM_ZERO, kExprI32Add, 349 static const byte code[] = {WASM_ZERO, kExprBlock, WASM_ZERO, kExprI32Add,
337 kExprEnd}; 350 kExprEnd};
338 EXPECT_FAILURE(sigs.i_i(), code); 351 EXPECT_FAILURE_C(i_i, code);
339 } 352 }
340 353
341 TEST_F(AstDecoderTest, BinopsAcrossBlock2) { 354 TEST_F(AstDecoderTest, BinopsAcrossBlock2) {
342 static const byte code[] = {WASM_ZERO, WASM_ZERO, kExprBlock, kExprI32Add, 355 static const byte code[] = {WASM_ZERO, WASM_ZERO, kExprBlock, kExprI32Add,
343 kExprEnd}; 356 kExprEnd};
344 EXPECT_FAILURE(sigs.i_i(), code); 357 EXPECT_FAILURE_C(i_i, code);
345 } 358 }
346 359
347 TEST_F(AstDecoderTest, BinopsAcrossBlock3) { 360 TEST_F(AstDecoderTest, BinopsAcrossBlock3) {
348 static const byte code[] = {WASM_ZERO, WASM_ZERO, kExprIf, kExprI32Add, 361 static const byte code[] = {WASM_ZERO, WASM_ZERO, kExprIf, kExprI32Add,
349 kExprElse, kExprI32Add, kExprEnd}; 362 kExprElse, kExprI32Add, kExprEnd};
350 EXPECT_FAILURE(sigs.i_i(), code); 363 EXPECT_FAILURE_C(i_i, code);
351 } 364 }
352 365
353 TEST_F(AstDecoderTest, Nop) { 366 TEST_F(AstDecoderTest, Nop) {
354 static const byte code[] = {kExprNop}; 367 static const byte code[] = {kExprNop};
355 EXPECT_VERIFIES(sigs.v_v(), code); 368 EXPECT_VERIFIES_C(v_v, code);
369 }
370
371 TEST_F(AstDecoderTest, SetLocal0_void) {
372 EXPECT_FAILURE(i_i, WASM_SET_LOCAL(0, WASM_ZERO));
356 } 373 }
357 374
358 TEST_F(AstDecoderTest, SetLocal0_param) { 375 TEST_F(AstDecoderTest, SetLocal0_param) {
359 EXPECT_VERIFIES(sigs.i_i(), kCodeSetLocal0); 376 EXPECT_FAILURE_C(i_i, kCodeSetLocal0);
360 EXPECT_FAILURE(sigs.f_ff(), kCodeSetLocal0); 377 EXPECT_FAILURE_C(f_ff, kCodeSetLocal0);
361 EXPECT_FAILURE(sigs.d_dd(), kCodeSetLocal0); 378 EXPECT_FAILURE_C(d_dd, kCodeSetLocal0);
379 }
380
381 TEST_F(AstDecoderTest, TeeLocal0_param) {
382 EXPECT_VERIFIES_C(i_i, kCodeTeeLocal0);
383 EXPECT_FAILURE_C(f_ff, kCodeTeeLocal0);
384 EXPECT_FAILURE_C(d_dd, kCodeTeeLocal0);
362 } 385 }
363 386
364 TEST_F(AstDecoderTest, SetLocal0_local) { 387 TEST_F(AstDecoderTest, SetLocal0_local) {
365 EXPECT_FAILURE(sigs.i_v(), kCodeSetLocal0); 388 EXPECT_FAILURE_C(i_v, kCodeSetLocal0);
389 EXPECT_FAILURE_C(v_v, kCodeSetLocal0);
366 AddLocals(kAstI32, 1); 390 AddLocals(kAstI32, 1);
367 EXPECT_VERIFIES(sigs.i_v(), kCodeSetLocal0); 391 EXPECT_FAILURE_C(i_v, kCodeSetLocal0);
368 } 392 EXPECT_VERIFIES_C(v_v, kCodeSetLocal0);
369 393 }
370 TEST_F(AstDecoderTest, SetLocalN_local) { 394
395 TEST_F(AstDecoderTest, TeeLocal0_local) {
396 EXPECT_FAILURE_C(i_v, kCodeTeeLocal0);
397 AddLocals(kAstI32, 1);
398 EXPECT_VERIFIES_C(i_v, kCodeTeeLocal0);
399 }
400
401 TEST_F(AstDecoderTest, TeeLocalN_local) {
371 for (byte i = 1; i < 8; i++) { 402 for (byte i = 1; i < 8; i++) {
372 AddLocals(kAstI32, 1); 403 AddLocals(kAstI32, 1);
373 for (byte j = 0; j < i; j++) { 404 for (byte j = 0; j < i; j++) {
374 EXPECT_VERIFIES_INLINE(sigs.v_v(), WASM_SET_LOCAL(j, WASM_I8(i))); 405 EXPECT_FAILURE(v_v, WASM_TEE_LOCAL(j, WASM_I8(i)));
406 EXPECT_VERIFIES(i_i, WASM_TEE_LOCAL(j, WASM_I8(i)));
375 } 407 }
376 } 408 }
377 } 409 }
378 410
379 TEST_F(AstDecoderTest, BlockN) { 411 TEST_F(AstDecoderTest, BlockN) {
380 const int kMaxSize = 200; 412 const int kMaxSize = 200;
381 byte buffer[kMaxSize + 2]; 413 byte buffer[kMaxSize + 3];
382 414
383 for (int i = 0; i <= kMaxSize; i++) { 415 for (int i = 0; i <= kMaxSize; i++) {
384 memset(buffer, kExprNop, sizeof(buffer)); 416 memset(buffer, kExprNop, sizeof(buffer));
385 buffer[0] = kExprBlock; 417 buffer[0] = kExprBlock;
386 buffer[i + 1] = kExprEnd; 418 buffer[1] = kLocalVoid;
387 Verify(kSuccess, sigs.v_i(), buffer, buffer + i + 2); 419 buffer[i + 2] = kExprEnd;
388 } 420 Verify(kSuccess, sigs.v_i(), buffer, buffer + i + 3);
389 } 421 }
422 }
423
424 #define WASM_EMPTY_BLOCK kExprBlock, kLocalVoid, kExprEnd
390 425
391 TEST_F(AstDecoderTest, Block0) { 426 TEST_F(AstDecoderTest, Block0) {
392 static const byte code[] = {kExprBlock, kExprEnd}; 427 static const byte code[] = {WASM_EMPTY_BLOCK};
393 EXPECT_VERIFIES(sigs.v_v(), code); 428 EXPECT_VERIFIES_C(v_v, code);
394 EXPECT_FAILURE(sigs.i_i(), code); 429 EXPECT_FAILURE_C(i_i, code);
395 } 430 }
396 431
397 TEST_F(AstDecoderTest, Block0_fallthru1) { 432 TEST_F(AstDecoderTest, Block0_fallthru1) {
398 static const byte code[] = {kExprBlock, kExprBlock, kExprEnd, kExprEnd}; 433 static const byte code[] = {WASM_BLOCK(WASM_EMPTY_BLOCK)};
399 EXPECT_VERIFIES(sigs.v_v(), code); 434 EXPECT_VERIFIES_C(v_v, code);
400 EXPECT_FAILURE(sigs.i_i(), code); 435 EXPECT_FAILURE_C(i_i, code);
401 } 436 }
402 437
403 TEST_F(AstDecoderTest, Block0Block0) { 438 TEST_F(AstDecoderTest, Block0Block0) {
404 static const byte code[] = {kExprBlock, kExprEnd, kExprBlock, kExprEnd}; 439 static const byte code[] = {WASM_EMPTY_BLOCK, WASM_EMPTY_BLOCK};
405 EXPECT_VERIFIES(sigs.v_v(), code); 440 EXPECT_VERIFIES_C(v_v, code);
406 EXPECT_FAILURE(sigs.i_i(), code); 441 EXPECT_FAILURE_C(i_i, code);
442 }
443
444 TEST_F(AstDecoderTest, Block0_end) {
445 EXPECT_VERIFIES(v_v, WASM_EMPTY_BLOCK, kExprEnd);
407 } 446 }
408 447
409 TEST_F(AstDecoderTest, Block0_end_end) { 448 TEST_F(AstDecoderTest, Block0_end_end) {
410 static const byte code[] = {kExprBlock, kExprEnd, kExprEnd}; 449 EXPECT_FAILURE(v_v, WASM_EMPTY_BLOCK, kExprEnd, kExprEnd);
411 EXPECT_FAILURE(sigs.v_v(), code);
412 } 450 }
413 451
414 TEST_F(AstDecoderTest, Block1) { 452 TEST_F(AstDecoderTest, Block1) {
415 byte code[] = {B1(WASM_SET_LOCAL(0, WASM_ZERO))}; 453 byte code[] = {WASM_BLOCK_I(WASM_GET_LOCAL(0))};
416 EXPECT_VERIFIES(sigs.i_i(), code); 454 EXPECT_VERIFIES_C(i_i, code);
417 EXPECT_VERIFIES(sigs.v_i(), code); 455 EXPECT_FAILURE_C(v_i, code);
418 EXPECT_FAILURE(sigs.d_dd(), code); 456 EXPECT_FAILURE_C(d_dd, code);
457 EXPECT_FAILURE_C(i_f, code);
458 EXPECT_FAILURE_C(i_d, code);
419 } 459 }
420 460
421 TEST_F(AstDecoderTest, Block1_i) { 461 TEST_F(AstDecoderTest, Block1_i) {
422 byte code[] = {B1(WASM_ZERO)}; 462 byte code[] = {WASM_BLOCK_I(WASM_ZERO)};
423 EXPECT_VERIFIES(sigs.i_i(), code); 463 EXPECT_VERIFIES_C(i_i, code);
424 EXPECT_FAILURE(sigs.f_ff(), code); 464 EXPECT_FAILURE_C(f_ff, code);
425 EXPECT_FAILURE(sigs.d_dd(), code); 465 EXPECT_FAILURE_C(d_dd, code);
426 EXPECT_FAILURE(sigs.l_ll(), code); 466 EXPECT_FAILURE_C(l_ll, code);
427 } 467 }
428 468
429 TEST_F(AstDecoderTest, Block1_f) { 469 TEST_F(AstDecoderTest, Block1_f) {
430 byte code[] = {B1(WASM_F32(0))}; 470 byte code[] = {WASM_BLOCK_F(WASM_F32(0))};
431 EXPECT_FAILURE(sigs.i_i(), code); 471 EXPECT_FAILURE_C(i_i, code);
432 EXPECT_VERIFIES(sigs.f_ff(), code); 472 EXPECT_VERIFIES_C(f_ff, code);
433 EXPECT_FAILURE(sigs.d_dd(), code); 473 EXPECT_FAILURE_C(d_dd, code);
434 EXPECT_FAILURE(sigs.l_ll(), code); 474 EXPECT_FAILURE_C(l_ll, code);
435 } 475 }
436 476
437 TEST_F(AstDecoderTest, Block1_continue) { 477 TEST_F(AstDecoderTest, Block1_continue) {
438 EXPECT_VERIFIES_INLINE(sigs.v_v(), B1(WASM_BR(0))); 478 EXPECT_VERIFIES(v_v, WASM_LOOP(WASM_BR(0)));
439 EXPECT_FAILURE_INLINE(sigs.v_v(), B1(WASM_BR(1)));
440 EXPECT_FAILURE_INLINE(sigs.v_v(), B1(WASM_BR(2)));
441 EXPECT_FAILURE_INLINE(sigs.v_v(), B1(WASM_BR(3)));
442 } 479 }
443 480
444 TEST_F(AstDecoderTest, Block1_br) { 481 TEST_F(AstDecoderTest, Block1_br) {
445 EXPECT_FAILURE_INLINE(sigs.v_v(), kExprBlock, kExprBr, ARITY_1, DEPTH_0, 482 EXPECT_VERIFIES(v_v, B1(WASM_BR(0)));
446 kExprEnd); 483 EXPECT_VERIFIES(v_v, B1(WASM_BR(1)));
447 EXPECT_VERIFIES_INLINE(sigs.v_v(), kExprBlock, kExprBr, ARITY_0, DEPTH_0, 484 EXPECT_FAILURE(v_v, B1(WASM_BR(2)));
448 kExprEnd);
449 } 485 }
450 486
451 TEST_F(AstDecoderTest, Block2_br) { 487 TEST_F(AstDecoderTest, Block2_br) {
452 EXPECT_VERIFIES_INLINE(sigs.v_v(), B2(WASM_NOP, WASM_BR(0))); 488 EXPECT_VERIFIES(v_v, B2(WASM_NOP, WASM_BR(0)));
453 EXPECT_VERIFIES_INLINE(sigs.v_v(), B2(WASM_BR(0), WASM_NOP)); 489 EXPECT_VERIFIES(v_v, B2(WASM_BR(0), WASM_NOP));
454 EXPECT_VERIFIES_INLINE(sigs.v_v(), B2(WASM_BR(0), WASM_BR(0))); 490 EXPECT_VERIFIES(v_v, B2(WASM_BR(0), WASM_BR(0)));
455 } 491 }
456 492
457 TEST_F(AstDecoderTest, Block2) { 493 TEST_F(AstDecoderTest, Block2) {
458 EXPECT_VERIFIES_INLINE(sigs.i_i(), 494 EXPECT_FAILURE(i_i, WASM_BLOCK(WASM_NOP, WASM_NOP));
459 B2(WASM_NOP, WASM_SET_LOCAL(0, WASM_ZERO))); 495 EXPECT_FAILURE(i_i, WASM_BLOCK_I(WASM_NOP, WASM_NOP));
460 EXPECT_FAILURE_INLINE(sigs.i_i(), B2(WASM_SET_LOCAL(0, WASM_ZERO), WASM_NOP)); 496 EXPECT_VERIFIES(i_i, WASM_BLOCK_I(WASM_NOP, WASM_ZERO));
461 EXPECT_VERIFIES_INLINE(sigs.i_i(), B2(WASM_SET_LOCAL(0, WASM_ZERO), 497 EXPECT_VERIFIES(i_i, WASM_BLOCK_I(WASM_ZERO, WASM_NOP));
462 WASM_SET_LOCAL(0, WASM_ZERO))); 498 EXPECT_FAILURE(i_i, WASM_BLOCK_I(WASM_ZERO, WASM_ZERO));
463 } 499 }
464 500
465 TEST_F(AstDecoderTest, Block2b) { 501 TEST_F(AstDecoderTest, Block2b) {
466 byte code[] = {B2(WASM_SET_LOCAL(0, WASM_ZERO), WASM_ZERO)}; 502 byte code[] = {WASM_BLOCK_I(WASM_SET_LOCAL(0, WASM_ZERO), WASM_ZERO)};
467 EXPECT_VERIFIES(sigs.i_i(), code); 503 EXPECT_VERIFIES_C(i_i, code);
468 EXPECT_FAILURE(sigs.v_v(), code); 504 EXPECT_FAILURE_C(v_v, code);
469 EXPECT_FAILURE(sigs.f_ff(), code); 505 EXPECT_FAILURE_C(f_ff, code);
470 } 506 }
471 507
472 TEST_F(AstDecoderTest, Block2_fallthru) { 508 TEST_F(AstDecoderTest, Block2_fallthru) {
473 EXPECT_VERIFIES_INLINE(sigs.i_i(), B2(WASM_SET_LOCAL(0, WASM_ZERO), 509 EXPECT_VERIFIES(
474 WASM_SET_LOCAL(0, WASM_ZERO)), 510 i_i, B2(WASM_SET_LOCAL(0, WASM_ZERO), WASM_SET_LOCAL(0, WASM_ZERO)),
475 WASM_I8(23)); 511 WASM_I8(23));
476 } 512 }
477 513
478 TEST_F(AstDecoderTest, Block3) { 514 TEST_F(AstDecoderTest, Block3) {
479 EXPECT_VERIFIES_INLINE( 515 EXPECT_VERIFIES(i_i, WASM_BLOCK_I(WASM_SET_LOCAL(0, WASM_ZERO),
480 sigs.i_i(), B3(WASM_SET_LOCAL(0, WASM_ZERO), WASM_SET_LOCAL(0, WASM_ZERO), 516 WASM_SET_LOCAL(0, WASM_ZERO), WASM_I8(11)));
481 WASM_I8(11)));
482 } 517 }
483 518
484 TEST_F(AstDecoderTest, Block5) { 519 TEST_F(AstDecoderTest, Block5) {
485 EXPECT_VERIFIES_INLINE(sigs.v_i(), B1(WASM_GET_LOCAL(0))); 520 EXPECT_FAILURE(v_i, WASM_BLOCK(WASM_ZERO));
486 521
487 EXPECT_VERIFIES_INLINE(sigs.v_i(), B2(WASM_GET_LOCAL(0), WASM_GET_LOCAL(0))); 522 EXPECT_FAILURE(v_i, WASM_BLOCK(WASM_ZERO, WASM_ZERO));
488 523
489 EXPECT_VERIFIES_INLINE( 524 EXPECT_FAILURE(v_i, WASM_BLOCK(WASM_ZERO, WASM_ZERO, WASM_ZERO));
490 sigs.v_i(), B3(WASM_GET_LOCAL(0), WASM_GET_LOCAL(0), WASM_GET_LOCAL(0))); 525
491 526 EXPECT_FAILURE(v_i, WASM_BLOCK(WASM_ZERO, WASM_ZERO, WASM_ZERO, WASM_ZERO));
492 EXPECT_VERIFIES_INLINE(sigs.v_i(), 527
493 WASM_BLOCK(WASM_GET_LOCAL(0), WASM_GET_LOCAL(0), 528 EXPECT_FAILURE(
494 WASM_GET_LOCAL(0), WASM_GET_LOCAL(0))); 529 v_i, WASM_BLOCK(WASM_ZERO, WASM_ZERO, WASM_ZERO, WASM_ZERO, WASM_ZERO));
495 530 }
496 EXPECT_VERIFIES_INLINE( 531
497 sigs.v_i(), 532 TEST_F(AstDecoderTest, BlockType) {
498 WASM_BLOCK(WASM_GET_LOCAL(0), WASM_GET_LOCAL(0), WASM_GET_LOCAL(0), 533 EXPECT_VERIFIES(i_i, WASM_BLOCK_I(WASM_GET_LOCAL(0)));
499 WASM_GET_LOCAL(0), WASM_GET_LOCAL(0))); 534 EXPECT_VERIFIES(l_l, WASM_BLOCK_L(WASM_GET_LOCAL(0)));
535 EXPECT_VERIFIES(f_f, WASM_BLOCK_F(WASM_GET_LOCAL(0)));
536 EXPECT_VERIFIES(d_d, WASM_BLOCK_D(WASM_GET_LOCAL(0)));
537 }
538
539 TEST_F(AstDecoderTest, BlockType_fail) {
540 EXPECT_FAILURE(i_i, WASM_BLOCK_L(WASM_I64V_1(0)));
541 EXPECT_FAILURE(i_i, WASM_BLOCK_F(WASM_F32(0.0)));
542 EXPECT_FAILURE(i_i, WASM_BLOCK_D(WASM_F64(1.1)));
543
544 EXPECT_FAILURE(l_l, WASM_BLOCK_I(WASM_ZERO));
545 EXPECT_FAILURE(l_l, WASM_BLOCK_F(WASM_F32(0.0)));
546 EXPECT_FAILURE(l_l, WASM_BLOCK_D(WASM_F64(1.1)));
547
548 EXPECT_FAILURE(f_ff, WASM_BLOCK_I(WASM_ZERO));
549 EXPECT_FAILURE(f_ff, WASM_BLOCK_L(WASM_I64V_1(0)));
550 EXPECT_FAILURE(f_ff, WASM_BLOCK_D(WASM_F64(1.1)));
551
552 EXPECT_FAILURE(d_dd, WASM_BLOCK_I(WASM_ZERO));
553 EXPECT_FAILURE(d_dd, WASM_BLOCK_L(WASM_I64V_1(0)));
554 EXPECT_FAILURE(d_dd, WASM_BLOCK_F(WASM_F32(0.0)));
500 } 555 }
501 556
502 TEST_F(AstDecoderTest, BlockF32) { 557 TEST_F(AstDecoderTest, BlockF32) {
503 static const byte code[] = {kExprBlock, kExprF32Const, 0, 0, 0, 0, kExprEnd}; 558 static const byte code[] = {WASM_BLOCK_F(kExprF32Const, 0, 0, 0, 0)};
504 EXPECT_VERIFIES(sigs.f_ff(), code); 559 EXPECT_VERIFIES_C(f_ff, code);
505 EXPECT_FAILURE(sigs.i_i(), code); 560 EXPECT_FAILURE_C(i_i, code);
506 EXPECT_FAILURE(sigs.d_dd(), code); 561 EXPECT_FAILURE_C(d_dd, code);
507 } 562 }
508 563
509 TEST_F(AstDecoderTest, BlockN_off_end) { 564 TEST_F(AstDecoderTest, BlockN_off_end) {
510 byte code[] = {kExprBlock, kExprNop, kExprNop, kExprNop, kExprNop, kExprEnd}; 565 byte code[] = {WASM_BLOCK(kExprNop, kExprNop, kExprNop, kExprNop)};
511 EXPECT_VERIFIES(sigs.v_v(), code); 566 EXPECT_VERIFIES_C(v_v, code);
512 for (size_t i = 1; i < arraysize(code); i++) { 567 for (size_t i = 1; i < arraysize(code); i++) {
513 Verify(kError, sigs.v_v(), code, code + i); 568 Verify(kError, sigs.v_v(), code, code + i);
514 } 569 }
515 } 570 }
516 571
517 TEST_F(AstDecoderTest, Block2_continue) { 572 TEST_F(AstDecoderTest, Block2_continue) {
518 static const byte code[] = {kExprBlock, kExprBr, ARITY_0, 573 EXPECT_VERIFIES(v_v, WASM_LOOP(WASM_NOP, WASM_BR(0)));
519 DEPTH_1, kExprNop, kExprEnd}; 574 EXPECT_VERIFIES(v_v, WASM_LOOP(WASM_NOP, WASM_BR(1)));
520 EXPECT_FAILURE(sigs.v_v(), code); 575 EXPECT_FAILURE(v_v, WASM_LOOP(WASM_NOP, WASM_BR(2)));
576 }
577
578 TEST_F(AstDecoderTest, Block3_continue) {
579 EXPECT_VERIFIES(v_v, B1(WASM_LOOP(WASM_NOP, WASM_BR(0))));
580 EXPECT_VERIFIES(v_v, B1(WASM_LOOP(WASM_NOP, WASM_BR(1))));
581 EXPECT_VERIFIES(v_v, B1(WASM_LOOP(WASM_NOP, WASM_BR(2))));
582 EXPECT_FAILURE(v_v, B1(WASM_LOOP(WASM_NOP, WASM_BR(3))));
521 } 583 }
522 584
523 TEST_F(AstDecoderTest, NestedBlock_return) { 585 TEST_F(AstDecoderTest, NestedBlock_return) {
524 EXPECT_VERIFIES_INLINE(sigs.i_i(), B1(B1(WASM_RETURN1(WASM_ZERO)))); 586 EXPECT_VERIFIES(i_i, B1(B1(WASM_RETURN1(WASM_ZERO))));
525 }
526
527 TEST_F(AstDecoderTest, BlockBinop) {
528 EXPECT_VERIFIES_INLINE(sigs.i_i(), WASM_I32_AND(B1(WASM_I8(1)), WASM_I8(2)));
529 } 587 }
530 588
531 TEST_F(AstDecoderTest, BlockBrBinop) { 589 TEST_F(AstDecoderTest, BlockBrBinop) {
532 EXPECT_VERIFIES_INLINE(sigs.i_i(), 590 EXPECT_VERIFIES(
533 WASM_I32_AND(B1(WASM_BRV(0, WASM_I8(1))), WASM_I8(2))); 591 i_i, WASM_I32_AND(WASM_BLOCK_I(WASM_BRV(0, WASM_I8(1))), WASM_I8(2)));
534 } 592 }
535 593
536 TEST_F(AstDecoderTest, If_empty1) { 594 TEST_F(AstDecoderTest, If_empty1) {
537 EXPECT_VERIFIES_INLINE(sigs.v_v(), WASM_ZERO, kExprIf, kExprEnd); 595 EXPECT_VERIFIES(v_v, WASM_ZERO, WASM_IF_OP, kExprEnd);
538 } 596 }
539 597
540 TEST_F(AstDecoderTest, If_empty2) { 598 TEST_F(AstDecoderTest, If_empty2) {
541 EXPECT_VERIFIES_INLINE(sigs.v_v(), WASM_ZERO, kExprIf, kExprElse, kExprEnd); 599 EXPECT_VERIFIES(v_v, WASM_ZERO, WASM_IF_OP, kExprElse, kExprEnd);
542 } 600 }
543 601
544 TEST_F(AstDecoderTest, If_empty3) { 602 TEST_F(AstDecoderTest, If_empty3) {
545 EXPECT_VERIFIES_INLINE(sigs.v_v(), WASM_ZERO, kExprIf, WASM_ZERO, kExprElse, 603 EXPECT_VERIFIES(v_v, WASM_ZERO, WASM_IF_OP, WASM_NOP, kExprElse, kExprEnd);
546 kExprEnd); 604 EXPECT_FAILURE(v_v, WASM_ZERO, WASM_IF_OP, WASM_ZERO, kExprElse, kExprEnd);
547 } 605 }
548 606
549 TEST_F(AstDecoderTest, If_empty4) { 607 TEST_F(AstDecoderTest, If_empty4) {
550 EXPECT_VERIFIES_INLINE(sigs.v_v(), WASM_ZERO, kExprIf, kExprElse, WASM_ZERO, 608 EXPECT_VERIFIES(v_v, WASM_ZERO, WASM_IF_OP, kExprElse, WASM_NOP, kExprEnd);
551 kExprEnd); 609 EXPECT_FAILURE(v_v, WASM_ZERO, WASM_IF_OP, kExprElse, WASM_ZERO, kExprEnd);
552 } 610 }
553 611
554 TEST_F(AstDecoderTest, If_empty_stack) { 612 TEST_F(AstDecoderTest, If_empty_stack) {
555 byte code[] = {kExprIf}; 613 byte code[] = {kExprIf};
556 EXPECT_FAILURE(sigs.v_v(), code); 614 EXPECT_FAILURE_C(v_v, code);
557 EXPECT_FAILURE(sigs.i_i(), code); 615 EXPECT_FAILURE_C(i_i, code);
558 } 616 }
559 617
560 TEST_F(AstDecoderTest, If_incomplete1) { 618 TEST_F(AstDecoderTest, If_incomplete1) {
561 byte code[] = {kExprI8Const, 0, kExprIf}; 619 byte code[] = {kExprI8Const, 0, kExprIf};
562 EXPECT_FAILURE(sigs.v_v(), code); 620 EXPECT_FAILURE_C(v_v, code);
563 EXPECT_FAILURE(sigs.i_i(), code); 621 EXPECT_FAILURE_C(i_i, code);
564 } 622 }
565 623
566 TEST_F(AstDecoderTest, If_incomplete2) { 624 TEST_F(AstDecoderTest, If_incomplete2) {
567 byte code[] = {kExprI8Const, 0, kExprIf, kExprNop}; 625 byte code[] = {kExprI8Const, 0, kExprIf, kExprNop};
568 EXPECT_FAILURE(sigs.v_v(), code); 626 EXPECT_FAILURE_C(v_v, code);
569 EXPECT_FAILURE(sigs.i_i(), code); 627 EXPECT_FAILURE_C(i_i, code);
570 } 628 }
571 629
572 TEST_F(AstDecoderTest, If_else_else) { 630 TEST_F(AstDecoderTest, If_else_else) {
573 byte code[] = {kExprI8Const, 0, kExprIf, kExprElse, kExprElse, kExprEnd}; 631 byte code[] = {kExprI8Const, 0, WASM_IF_OP, kExprElse, kExprElse, kExprEnd};
574 EXPECT_FAILURE(sigs.v_v(), code); 632 EXPECT_FAILURE_C(v_v, code);
575 EXPECT_FAILURE(sigs.i_i(), code); 633 EXPECT_FAILURE_C(i_i, code);
576 } 634 }
577 635
578 TEST_F(AstDecoderTest, IfEmpty) { 636 TEST_F(AstDecoderTest, IfEmpty) {
579 EXPECT_VERIFIES_INLINE(sigs.v_i(), kExprGetLocal, 0, kExprIf, kExprEnd); 637 EXPECT_VERIFIES(v_i, kExprGetLocal, 0, WASM_IF_OP, kExprEnd);
580 } 638 }
581 639
582 TEST_F(AstDecoderTest, IfSet) { 640 TEST_F(AstDecoderTest, IfSet) {
583 EXPECT_VERIFIES_INLINE( 641 EXPECT_VERIFIES(v_i,
584 sigs.v_i(), WASM_IF(WASM_GET_LOCAL(0), WASM_SET_LOCAL(0, WASM_ZERO))); 642 WASM_IF(WASM_GET_LOCAL(0), WASM_SET_LOCAL(0, WASM_ZERO)));
585 EXPECT_VERIFIES_INLINE( 643 EXPECT_VERIFIES(v_i, WASM_IF_ELSE(WASM_GET_LOCAL(0),
586 sigs.v_i(), 644 WASM_SET_LOCAL(0, WASM_ZERO), WASM_NOP));
587 WASM_IF_ELSE(WASM_GET_LOCAL(0), WASM_SET_LOCAL(0, WASM_ZERO), WASM_NOP));
588 } 645 }
589 646
590 TEST_F(AstDecoderTest, IfElseEmpty) { 647 TEST_F(AstDecoderTest, IfElseEmpty) {
591 EXPECT_VERIFIES_INLINE(sigs.v_i(), WASM_GET_LOCAL(0), kExprIf, kExprElse, 648 EXPECT_VERIFIES(v_i, WASM_GET_LOCAL(0), WASM_IF_OP, kExprElse, kExprEnd);
592 kExprEnd); 649 EXPECT_VERIFIES(v_i, WASM_IF_ELSE(WASM_GET_LOCAL(0), WASM_NOP, WASM_NOP));
593 EXPECT_VERIFIES_INLINE(sigs.v_i(),
594 WASM_IF_ELSE(WASM_GET_LOCAL(0), WASM_NOP, WASM_NOP));
595 } 650 }
596 651
597 TEST_F(AstDecoderTest, IfElseUnreachable1) { 652 TEST_F(AstDecoderTest, IfElseUnreachable1) {
598 EXPECT_VERIFIES_INLINE( 653 EXPECT_VERIFIES(i_i, WASM_IF_ELSE_I(WASM_GET_LOCAL(0), WASM_UNREACHABLE,
599 sigs.i_i(), 654 WASM_GET_LOCAL(0)));
600 WASM_IF_ELSE(WASM_GET_LOCAL(0), WASM_UNREACHABLE, WASM_GET_LOCAL(0))); 655 EXPECT_VERIFIES(i_i, WASM_IF_ELSE_I(WASM_GET_LOCAL(0), WASM_GET_LOCAL(0),
601 EXPECT_VERIFIES_INLINE( 656 WASM_UNREACHABLE));
602 sigs.i_i(),
603 WASM_IF_ELSE(WASM_GET_LOCAL(0), WASM_GET_LOCAL(0), WASM_UNREACHABLE));
604 } 657 }
605 658
606 TEST_F(AstDecoderTest, IfElseUnreachable2) { 659 TEST_F(AstDecoderTest, IfElseUnreachable2) {
607 static const byte code[] = { 660 static const byte code[] = {
608 WASM_IF_ELSE(WASM_GET_LOCAL(0), WASM_UNREACHABLE, WASM_GET_LOCAL(0))}; 661 WASM_IF_ELSE_I(WASM_GET_LOCAL(0), WASM_UNREACHABLE, WASM_GET_LOCAL(0))};
609 662
610 for (size_t i = 0; i < arraysize(kLocalTypes); i++) { 663 for (size_t i = 0; i < arraysize(kLocalTypes); i++) {
611 LocalType types[] = {kAstI32, kLocalTypes[i]}; 664 LocalType types[] = {kAstI32, kLocalTypes[i]};
612 FunctionSig sig(1, 1, types); 665 FunctionSig sig(1, 1, types);
613 666
614 if (kLocalTypes[i] == kAstI32) { 667 if (kLocalTypes[i] == kAstI32) {
615 EXPECT_VERIFIES(&sig, code); 668 EXPECT_VERIFIES_SC(&sig, code);
616 } else { 669 } else {
617 EXPECT_FAILURE(&sig, code); 670 EXPECT_FAILURE_SC(&sig, code);
618 } 671 }
619 } 672 }
620 } 673 }
621 674
622 TEST_F(AstDecoderTest, IfBreak) { 675 TEST_F(AstDecoderTest, IfBreak) {
623 EXPECT_VERIFIES_INLINE(sigs.v_i(), WASM_IF(WASM_GET_LOCAL(0), WASM_BR(0))); 676 EXPECT_VERIFIES(v_i, WASM_IF(WASM_GET_LOCAL(0), WASM_BR(0)));
624 EXPECT_FAILURE_INLINE(sigs.v_i(), WASM_IF(WASM_GET_LOCAL(0), WASM_BR(1))); 677 EXPECT_VERIFIES(v_i, WASM_IF(WASM_GET_LOCAL(0), WASM_BR(1)));
678 EXPECT_FAILURE(v_i, WASM_IF(WASM_GET_LOCAL(0), WASM_BR(2)));
625 } 679 }
626 680
627 TEST_F(AstDecoderTest, IfElseBreak) { 681 TEST_F(AstDecoderTest, IfElseBreak) {
628 EXPECT_VERIFIES_INLINE(sigs.v_i(), 682 EXPECT_VERIFIES(v_i, WASM_IF_ELSE(WASM_GET_LOCAL(0), WASM_NOP, WASM_BR(0)));
629 WASM_IF_ELSE(WASM_GET_LOCAL(0), WASM_NOP, WASM_BR(0))); 683 EXPECT_VERIFIES(v_i, WASM_IF_ELSE(WASM_GET_LOCAL(0), WASM_NOP, WASM_BR(1)));
630 EXPECT_FAILURE_INLINE(sigs.v_i(), 684 EXPECT_FAILURE(v_i, WASM_IF_ELSE(WASM_GET_LOCAL(0), WASM_NOP, WASM_BR(2)));
631 WASM_IF_ELSE(WASM_GET_LOCAL(0), WASM_NOP, WASM_BR(1)));
632 } 685 }
633 686
634 TEST_F(AstDecoderTest, Block_else) { 687 TEST_F(AstDecoderTest, Block_else) {
635 byte code[] = {kExprI8Const, 0, kExprBlock, kExprElse, kExprEnd}; 688 byte code[] = {kExprI8Const, 0, kExprBlock, kExprElse, kExprEnd};
636 EXPECT_FAILURE(sigs.v_v(), code); 689 EXPECT_FAILURE_C(v_v, code);
637 EXPECT_FAILURE(sigs.i_i(), code); 690 EXPECT_FAILURE_C(i_i, code);
638 } 691 }
639 692
640 TEST_F(AstDecoderTest, IfNop) { 693 TEST_F(AstDecoderTest, IfNop) {
641 EXPECT_VERIFIES_INLINE(sigs.v_i(), WASM_IF(WASM_GET_LOCAL(0), WASM_NOP)); 694 EXPECT_VERIFIES(v_i, WASM_IF(WASM_GET_LOCAL(0), WASM_NOP));
642 } 695 }
643 696
644 TEST_F(AstDecoderTest, IfNopElseNop) { 697 TEST_F(AstDecoderTest, IfNopElseNop) {
645 EXPECT_VERIFIES_INLINE(sigs.v_i(), 698 EXPECT_VERIFIES(v_i, WASM_IF_ELSE(WASM_GET_LOCAL(0), WASM_NOP, WASM_NOP));
646 WASM_IF_ELSE(WASM_GET_LOCAL(0), WASM_NOP, WASM_NOP));
647 } 699 }
648 700
649 TEST_F(AstDecoderTest, If_end_end) { 701 TEST_F(AstDecoderTest, If_end_end) {
650 static const byte code[] = {kExprGetLocal, 0, kExprIf, kExprEnd, kExprEnd}; 702 static const byte code[] = {kExprGetLocal, 0, WASM_IF_OP, kExprEnd, kExprEnd};
651 EXPECT_FAILURE(sigs.v_i(), code); 703 EXPECT_VERIFIES_C(v_i, code);
652 } 704 }
653 705
654 TEST_F(AstDecoderTest, If_falloff) { 706 TEST_F(AstDecoderTest, If_end_end_end) {
707 static const byte code[] = {kExprGetLocal, 0, WASM_IF_OP,
708 kExprEnd, kExprEnd, kExprEnd};
709 EXPECT_FAILURE_C(v_i, code);
710 }
711
712 TEST_F(AstDecoderTest, If_falloff1) {
655 static const byte code[] = {kExprGetLocal, 0, kExprIf}; 713 static const byte code[] = {kExprGetLocal, 0, kExprIf};
656 EXPECT_FAILURE(sigs.v_i(), code); 714 EXPECT_FAILURE_C(v_i, code);
715 }
716
717 TEST_F(AstDecoderTest, If_falloff2) {
718 static const byte code[] = {kExprGetLocal, 0, WASM_IF_OP};
719 EXPECT_FAILURE_C(v_i, code);
657 } 720 }
658 721
659 TEST_F(AstDecoderTest, IfElse_falloff) { 722 TEST_F(AstDecoderTest, IfElse_falloff) {
660 static const byte code[] = {kExprGetLocal, 0, kExprIf, kExprNop, kExprElse}; 723 static const byte code[] = {kExprGetLocal, 0, WASM_IF_OP, kExprNop,
661 EXPECT_FAILURE(sigs.v_i(), code); 724 kExprElse};
725 EXPECT_FAILURE_C(v_i, code);
662 } 726 }
663 727
664 TEST_F(AstDecoderTest, IfElseNop) { 728 TEST_F(AstDecoderTest, IfElseNop) {
665 EXPECT_VERIFIES_INLINE( 729 EXPECT_VERIFIES(v_i, WASM_IF_ELSE(WASM_GET_LOCAL(0),
666 sigs.v_i(), 730 WASM_SET_LOCAL(0, WASM_ZERO), WASM_NOP));
667 WASM_IF_ELSE(WASM_GET_LOCAL(0), WASM_SET_LOCAL(0, WASM_ZERO), WASM_NOP));
668 } 731 }
669 732
670 TEST_F(AstDecoderTest, IfBlock1) { 733 TEST_F(AstDecoderTest, IfBlock1) {
671 EXPECT_VERIFIES_INLINE( 734 EXPECT_VERIFIES(
672 sigs.v_i(), WASM_IF_ELSE(WASM_GET_LOCAL(0), 735 v_i, WASM_IF_ELSE(WASM_GET_LOCAL(0), B1(WASM_SET_LOCAL(0, WASM_ZERO)),
673 B1(WASM_SET_LOCAL(0, WASM_ZERO)), WASM_NOP)); 736 WASM_NOP));
674 } 737 }
675 738
676 TEST_F(AstDecoderTest, IfBlock1b) { 739 TEST_F(AstDecoderTest, IfBlock1b) {
677 EXPECT_VERIFIES_INLINE( 740 EXPECT_VERIFIES(v_i,
678 sigs.v_i(), WASM_IF(WASM_GET_LOCAL(0), B1(WASM_SET_LOCAL(0, WASM_ZERO)))); 741 WASM_IF(WASM_GET_LOCAL(0), B1(WASM_SET_LOCAL(0, WASM_ZERO))));
679 } 742 }
680 743
681 TEST_F(AstDecoderTest, IfBlock2a) { 744 TEST_F(AstDecoderTest, IfBlock2a) {
682 EXPECT_VERIFIES_INLINE( 745 EXPECT_VERIFIES(v_i,
683 sigs.v_i(), WASM_IF(WASM_GET_LOCAL(0), B2(WASM_SET_LOCAL(0, WASM_ZERO), 746 WASM_IF(WASM_GET_LOCAL(0), B2(WASM_SET_LOCAL(0, WASM_ZERO),
684 WASM_SET_LOCAL(0, WASM_ZERO)))); 747 WASM_SET_LOCAL(0, WASM_ZERO))));
685 } 748 }
686 749
687 TEST_F(AstDecoderTest, IfBlock2b) { 750 TEST_F(AstDecoderTest, IfBlock2b) {
688 EXPECT_VERIFIES_INLINE( 751 EXPECT_VERIFIES(
689 sigs.v_i(), 752 v_i, WASM_IF_ELSE(WASM_GET_LOCAL(0), B2(WASM_SET_LOCAL(0, WASM_ZERO),
690 WASM_IF_ELSE(WASM_GET_LOCAL(0), B2(WASM_SET_LOCAL(0, WASM_ZERO), 753 WASM_SET_LOCAL(0, WASM_ZERO)),
691 WASM_SET_LOCAL(0, WASM_ZERO)), 754 WASM_NOP));
692 WASM_NOP));
693 } 755 }
694 756
695 TEST_F(AstDecoderTest, IfElseSet) { 757 TEST_F(AstDecoderTest, IfElseSet) {
696 EXPECT_VERIFIES_INLINE( 758 EXPECT_VERIFIES(v_i,
697 sigs.v_i(), WASM_IF_ELSE(WASM_GET_LOCAL(0), WASM_SET_LOCAL(0, WASM_ZERO), 759 WASM_IF_ELSE(WASM_GET_LOCAL(0), WASM_SET_LOCAL(0, WASM_ZERO),
698 WASM_SET_LOCAL(0, WASM_I8(1)))); 760 WASM_SET_LOCAL(0, WASM_I8(1))));
699 } 761 }
700 762
701 TEST_F(AstDecoderTest, Loop0) { 763 TEST_F(AstDecoderTest, Loop0) { EXPECT_VERIFIES(v_v, WASM_LOOP_OP, kExprEnd); }
702 static const byte code[] = {kExprLoop, kExprEnd};
703 EXPECT_VERIFIES(sigs.v_v(), code);
704 }
705 764
706 TEST_F(AstDecoderTest, Loop1) { 765 TEST_F(AstDecoderTest, Loop1) {
707 static const byte code[] = {WASM_LOOP(WASM_SET_LOCAL(0, WASM_ZERO))}; 766 static const byte code[] = {WASM_LOOP(WASM_SET_LOCAL(0, WASM_ZERO))};
708 EXPECT_VERIFIES(sigs.v_i(), code); 767 EXPECT_VERIFIES_C(v_i, code);
709 EXPECT_FAILURE(sigs.v_v(), code); 768 EXPECT_FAILURE_C(v_v, code);
710 EXPECT_FAILURE(sigs.f_ff(), code); 769 EXPECT_FAILURE_C(f_ff, code);
711 } 770 }
712 771
713 TEST_F(AstDecoderTest, Loop2) { 772 TEST_F(AstDecoderTest, Loop2) {
714 EXPECT_VERIFIES_INLINE(sigs.v_i(), WASM_LOOP(WASM_SET_LOCAL(0, WASM_ZERO), 773 EXPECT_VERIFIES(v_i, WASM_LOOP(WASM_SET_LOCAL(0, WASM_ZERO),
715 WASM_SET_LOCAL(0, WASM_ZERO))); 774 WASM_SET_LOCAL(0, WASM_ZERO)));
716 } 775 }
717 776
718 TEST_F(AstDecoderTest, Loop1_continue) { 777 TEST_F(AstDecoderTest, Loop1_continue) {
719 EXPECT_VERIFIES_INLINE(sigs.v_v(), WASM_LOOP(WASM_BR(0))); 778 EXPECT_VERIFIES(v_v, WASM_LOOP(WASM_BR(0)));
720 } 779 }
721 780
722 TEST_F(AstDecoderTest, Loop1_break) { 781 TEST_F(AstDecoderTest, Loop1_break) {
723 EXPECT_VERIFIES_INLINE(sigs.v_v(), WASM_LOOP(WASM_BR(1))); 782 EXPECT_VERIFIES(v_v, WASM_LOOP(WASM_BR(1)));
724 } 783 }
725 784
726 TEST_F(AstDecoderTest, Loop2_continue) { 785 TEST_F(AstDecoderTest, Loop2_continue) {
727 EXPECT_VERIFIES_INLINE(sigs.v_i(), 786 EXPECT_VERIFIES(v_i, WASM_LOOP(WASM_SET_LOCAL(0, WASM_ZERO), WASM_BR(0)));
728 WASM_LOOP(WASM_SET_LOCAL(0, WASM_ZERO), WASM_BR(0)));
729 } 787 }
730 788
731 TEST_F(AstDecoderTest, Loop2_break) { 789 TEST_F(AstDecoderTest, Loop2_break) {
732 EXPECT_VERIFIES_INLINE(sigs.v_i(), 790 EXPECT_VERIFIES(v_i, WASM_LOOP(WASM_SET_LOCAL(0, WASM_ZERO), WASM_BR(1)));
733 WASM_LOOP(WASM_SET_LOCAL(0, WASM_ZERO), WASM_BR(1))); 791 }
734 } 792
735 793 TEST_F(AstDecoderTest, InfiniteLoop) {
736 TEST_F(AstDecoderTest, ExprLoop0) { 794 EXPECT_VERIFIES(i_i, WASM_LOOP(WASM_BR(0)));
737 static const byte code[] = {kExprLoop, kExprEnd}; 795 EXPECT_VERIFIES(i_i, WASM_LOOP(WASM_BRV(1, WASM_ZERO)));
738 EXPECT_VERIFIES(sigs.v_v(), code); 796 }
739 } 797
740 798 TEST_F(AstDecoderTest, Loop2_unreachable) {
741 TEST_F(AstDecoderTest, ExprLoop1a) { 799 EXPECT_VERIFIES(i_i, WASM_LOOP(WASM_BR(0), WASM_NOP));
742 EXPECT_VERIFIES_INLINE(sigs.i_i(), WASM_LOOP(WASM_BRV(0, WASM_ZERO))); 800 }
743 } 801
744 802 TEST_F(AstDecoderTest, LoopType) {
745 TEST_F(AstDecoderTest, ExprLoop1b) { 803 EXPECT_VERIFIES(i_i, WASM_LOOP_I(WASM_GET_LOCAL(0)));
746 EXPECT_VERIFIES_INLINE(sigs.i_i(), WASM_LOOP(WASM_BRV(1, WASM_ZERO))); 804 EXPECT_VERIFIES(l_l, WASM_LOOP_L(WASM_GET_LOCAL(0)));
747 EXPECT_FAILURE_INLINE(sigs.f_ff(), WASM_LOOP(WASM_BRV(1, WASM_ZERO))); 805 EXPECT_VERIFIES(f_f, WASM_LOOP_F(WASM_GET_LOCAL(0)));
748 } 806 EXPECT_VERIFIES(d_d, WASM_LOOP_D(WASM_GET_LOCAL(0)));
749 807 }
750 TEST_F(AstDecoderTest, ExprLoop2_unreachable) { 808
751 EXPECT_VERIFIES_INLINE(sigs.i_i(), WASM_LOOP(WASM_BR(0), WASM_NOP)); 809 TEST_F(AstDecoderTest, LoopType_void) {
810 EXPECT_FAILURE(v_v, WASM_LOOP_I(WASM_ZERO));
811 EXPECT_FAILURE(v_v, WASM_LOOP_L(WASM_I64V_1(0)));
812 EXPECT_FAILURE(v_v, WASM_LOOP_F(WASM_F32(0.0)));
813 EXPECT_FAILURE(v_v, WASM_LOOP_D(WASM_F64(1.1)));
814 }
815
816 TEST_F(AstDecoderTest, LoopType_fail) {
817 EXPECT_FAILURE(i_i, WASM_LOOP_L(WASM_I64V_1(0)));
818 EXPECT_FAILURE(i_i, WASM_LOOP_F(WASM_F32(0.0)));
819 EXPECT_FAILURE(i_i, WASM_LOOP_D(WASM_F64(1.1)));
820
821 EXPECT_FAILURE(l_l, WASM_LOOP_I(WASM_ZERO));
822 EXPECT_FAILURE(l_l, WASM_LOOP_F(WASM_F32(0.0)));
823 EXPECT_FAILURE(l_l, WASM_LOOP_D(WASM_F64(1.1)));
824
825 EXPECT_FAILURE(f_ff, WASM_LOOP_I(WASM_ZERO));
826 EXPECT_FAILURE(f_ff, WASM_LOOP_L(WASM_I64V_1(0)));
827 EXPECT_FAILURE(f_ff, WASM_LOOP_D(WASM_F64(1.1)));
828
829 EXPECT_FAILURE(d_dd, WASM_LOOP_I(WASM_ZERO));
830 EXPECT_FAILURE(d_dd, WASM_LOOP_L(WASM_I64V_1(0)));
831 EXPECT_FAILURE(d_dd, WASM_LOOP_F(WASM_F32(0.0)));
752 } 832 }
753 833
754 TEST_F(AstDecoderTest, ReturnVoid1) { 834 TEST_F(AstDecoderTest, ReturnVoid1) {
755 static const byte code[] = {kExprNop}; 835 static const byte code[] = {kExprNop};
756 EXPECT_VERIFIES(sigs.v_v(), code); 836 EXPECT_VERIFIES_C(v_v, code);
757 EXPECT_FAILURE(sigs.i_i(), code); 837 EXPECT_FAILURE_C(i_i, code);
758 EXPECT_FAILURE(sigs.i_f(), code); 838 EXPECT_FAILURE_C(i_f, code);
759 } 839 }
760 840
761 TEST_F(AstDecoderTest, ReturnVoid2) { 841 TEST_F(AstDecoderTest, ReturnVoid2) {
762 static const byte code[] = {kExprBlock, kExprBr, ARITY_0, DEPTH_0, kExprEnd}; 842 static const byte code[] = {WASM_BLOCK(WASM_BR(0))};
763 EXPECT_VERIFIES(sigs.v_v(), code); 843 EXPECT_VERIFIES_C(v_v, code);
764 EXPECT_FAILURE(sigs.i_i(), code); 844 EXPECT_FAILURE_C(i_i, code);
765 EXPECT_FAILURE(sigs.i_f(), code); 845 EXPECT_FAILURE_C(i_f, code);
766 } 846 }
767 847
768 TEST_F(AstDecoderTest, ReturnVoid3) { 848 TEST_F(AstDecoderTest, ReturnVoid3) {
769 EXPECT_VERIFIES_INLINE(sigs.v_v(), kExprI8Const, 0); 849 EXPECT_FAILURE(v_v, kExprI8Const, 0);
770 EXPECT_VERIFIES_INLINE(sigs.v_v(), kExprI32Const, 0, 0, 0, 0); 850 EXPECT_FAILURE(v_v, kExprI32Const, 0);
771 EXPECT_VERIFIES_INLINE(sigs.v_v(), kExprI64Const, 0, 0, 0, 0, 0, 0, 0, 0); 851 EXPECT_FAILURE(v_v, kExprI64Const, 0);
772 EXPECT_VERIFIES_INLINE(sigs.v_v(), kExprF32Const, 0, 0, 0, 0); 852 EXPECT_FAILURE(v_v, kExprF32Const, 0, 0, 0, 0);
773 EXPECT_VERIFIES_INLINE(sigs.v_v(), kExprF64Const, 0, 0, 0, 0, 0, 0, 0, 0); 853 EXPECT_FAILURE(v_v, kExprF64Const, 0, 0, 0, 0, 0, 0, 0, 0);
774 854
775 EXPECT_VERIFIES_INLINE(sigs.v_i(), kExprGetLocal, 0); 855 EXPECT_FAILURE(v_i, kExprGetLocal, 0);
776 } 856 }
777 857
778 TEST_F(AstDecoderTest, Unreachable1) { 858 TEST_F(AstDecoderTest, Unreachable1) {
779 EXPECT_VERIFIES_INLINE(sigs.v_v(), kExprUnreachable); 859 EXPECT_VERIFIES(v_v, kExprUnreachable);
780 EXPECT_VERIFIES_INLINE(sigs.v_v(), kExprUnreachable, kExprUnreachable); 860 EXPECT_VERIFIES(v_v, kExprUnreachable, kExprUnreachable);
781 EXPECT_VERIFIES_INLINE(sigs.v_v(), B2(WASM_UNREACHABLE, WASM_ZERO)); 861 EXPECT_VERIFIES(v_v, B2(WASM_UNREACHABLE, WASM_ZERO));
782 EXPECT_VERIFIES_INLINE(sigs.v_v(), B2(WASM_BR(0), WASM_ZERO)); 862 EXPECT_VERIFIES(v_v, B2(WASM_BR(0), WASM_ZERO));
783 EXPECT_VERIFIES_INLINE(sigs.v_v(), WASM_LOOP(WASM_UNREACHABLE, WASM_ZERO)); 863 EXPECT_VERIFIES(v_v, WASM_LOOP(WASM_UNREACHABLE, WASM_ZERO));
784 EXPECT_VERIFIES_INLINE(sigs.v_v(), WASM_LOOP(WASM_BR(0), WASM_ZERO)); 864 EXPECT_VERIFIES(v_v, WASM_LOOP(WASM_BR(0), WASM_ZERO));
785 } 865 }
786 866
787 TEST_F(AstDecoderTest, Unreachable_binop) { 867 TEST_F(AstDecoderTest, Unreachable_binop) {
788 EXPECT_VERIFIES_INLINE(sigs.i_i(), WASM_I32_AND(WASM_ZERO, WASM_UNREACHABLE)); 868 EXPECT_VERIFIES(i_i, WASM_I32_AND(WASM_ZERO, WASM_UNREACHABLE));
789 EXPECT_VERIFIES_INLINE(sigs.i_i(), WASM_I32_AND(WASM_UNREACHABLE, WASM_ZERO)); 869 EXPECT_VERIFIES(i_i, WASM_I32_AND(WASM_UNREACHABLE, WASM_ZERO));
790 } 870 }
791 871
792 TEST_F(AstDecoderTest, Unreachable_select) { 872 TEST_F(AstDecoderTest, Unreachable_select) {
793 EXPECT_VERIFIES_INLINE(sigs.i_i(), 873 EXPECT_VERIFIES(i_i, WASM_SELECT(WASM_UNREACHABLE, WASM_ZERO, WASM_ZERO));
794 WASM_SELECT(WASM_UNREACHABLE, WASM_ZERO, WASM_ZERO)); 874 EXPECT_VERIFIES(i_i, WASM_SELECT(WASM_ZERO, WASM_UNREACHABLE, WASM_ZERO));
795 EXPECT_VERIFIES_INLINE(sigs.i_i(), 875 EXPECT_VERIFIES(i_i, WASM_SELECT(WASM_ZERO, WASM_ZERO, WASM_UNREACHABLE));
796 WASM_SELECT(WASM_ZERO, WASM_UNREACHABLE, WASM_ZERO));
797 EXPECT_VERIFIES_INLINE(sigs.i_i(),
798 WASM_SELECT(WASM_ZERO, WASM_ZERO, WASM_UNREACHABLE));
799 } 876 }
800 877
801 TEST_F(AstDecoderTest, If1) { 878 TEST_F(AstDecoderTest, If1) {
802 EXPECT_VERIFIES_INLINE( 879 EXPECT_VERIFIES(i_i,
803 sigs.i_i(), WASM_IF_ELSE(WASM_GET_LOCAL(0), WASM_I8(9), WASM_I8(8))); 880 WASM_IF_ELSE_I(WASM_GET_LOCAL(0), WASM_I8(9), WASM_I8(8)));
804 EXPECT_VERIFIES_INLINE(sigs.i_i(), WASM_IF_ELSE(WASM_GET_LOCAL(0), WASM_I8(9), 881 EXPECT_VERIFIES(
805 WASM_GET_LOCAL(0))); 882 i_i, WASM_IF_ELSE_I(WASM_GET_LOCAL(0), WASM_I8(9), WASM_GET_LOCAL(0)));
806 EXPECT_VERIFIES_INLINE( 883 EXPECT_VERIFIES(
807 sigs.i_i(), 884 i_i, WASM_IF_ELSE_I(WASM_GET_LOCAL(0), WASM_GET_LOCAL(0), WASM_I8(8)));
808 WASM_IF_ELSE(WASM_GET_LOCAL(0), WASM_GET_LOCAL(0), WASM_I8(8)));
809 } 885 }
810 886
811 TEST_F(AstDecoderTest, If_off_end) { 887 TEST_F(AstDecoderTest, If_off_end) {
812 static const byte kCode[] = { 888 static const byte kCode[] = {
813 WASM_IF_ELSE(WASM_GET_LOCAL(0), WASM_GET_LOCAL(0), WASM_GET_LOCAL(0))}; 889 WASM_IF_ELSE(WASM_GET_LOCAL(0), WASM_GET_LOCAL(0), WASM_GET_LOCAL(0))};
814 for (size_t len = 3; len < arraysize(kCode); len++) { 890 for (size_t len = 3; len < arraysize(kCode); len++) {
815 Verify(kError, sigs.i_i(), kCode, kCode + len); 891 Verify(kError, sigs.i_i(), kCode, kCode + len);
816 } 892 }
817 } 893 }
818 894
819 TEST_F(AstDecoderTest, If_type1) { 895 TEST_F(AstDecoderTest, If_type1) {
820 // float|double ? 1 : 2 896 // float|double ? 1 : 2
821 static const byte kCode[] = { 897 static const byte kCode[] = {
822 WASM_IF_ELSE(WASM_GET_LOCAL(0), WASM_I8(0), WASM_I8(2))}; 898 WASM_IF_ELSE_I(WASM_GET_LOCAL(0), WASM_I8(0), WASM_I8(2))};
823 EXPECT_VERIFIES(sigs.i_i(), kCode); 899 EXPECT_VERIFIES_C(i_i, kCode);
824 EXPECT_FAILURE(sigs.i_f(), kCode); 900 EXPECT_FAILURE_C(i_f, kCode);
825 EXPECT_FAILURE(sigs.i_d(), kCode); 901 EXPECT_FAILURE_C(i_d, kCode);
826 } 902 }
827 903
828 TEST_F(AstDecoderTest, If_type2) { 904 TEST_F(AstDecoderTest, If_type2) {
829 // 1 ? float|double : 2 905 // 1 ? float|double : 2
830 static const byte kCode[] = { 906 static const byte kCode[] = {
831 WASM_IF_ELSE(WASM_I8(1), WASM_GET_LOCAL(0), WASM_I8(1))}; 907 WASM_IF_ELSE_I(WASM_I8(1), WASM_GET_LOCAL(0), WASM_I8(1))};
832 EXPECT_VERIFIES(sigs.i_i(), kCode); 908 EXPECT_VERIFIES_C(i_i, kCode);
833 EXPECT_FAILURE(sigs.i_f(), kCode); 909 EXPECT_FAILURE_C(i_f, kCode);
834 EXPECT_FAILURE(sigs.i_d(), kCode); 910 EXPECT_FAILURE_C(i_d, kCode);
835 } 911 }
836 912
837 TEST_F(AstDecoderTest, If_type3) { 913 TEST_F(AstDecoderTest, If_type3) {
838 // stmt ? 0 : 1 914 // stmt ? 0 : 1
839 static const byte kCode[] = {WASM_IF_ELSE(WASM_NOP, WASM_I8(0), WASM_I8(1))}; 915 static const byte kCode[] = {
840 EXPECT_FAILURE(sigs.i_i(), kCode); 916 WASM_IF_ELSE_I(WASM_NOP, WASM_I8(0), WASM_I8(1))};
841 EXPECT_FAILURE(sigs.i_f(), kCode); 917 EXPECT_FAILURE_C(i_i, kCode);
842 EXPECT_FAILURE(sigs.i_d(), kCode); 918 EXPECT_FAILURE_C(i_f, kCode);
919 EXPECT_FAILURE_C(i_d, kCode);
843 } 920 }
844 921
845 TEST_F(AstDecoderTest, If_type4) { 922 TEST_F(AstDecoderTest, If_type4) {
846 // 0 ? stmt : 1 923 // 0 ? stmt : 1
847 static const byte kCode[] = { 924 static const byte kCode[] = {
848 WASM_IF_ELSE(WASM_GET_LOCAL(0), WASM_NOP, WASM_I8(1))}; 925 WASM_IF_ELSE_I(WASM_GET_LOCAL(0), WASM_NOP, WASM_I8(1))};
849 EXPECT_FAILURE(sigs.i_i(), kCode); 926 EXPECT_FAILURE_C(i_i, kCode);
850 EXPECT_FAILURE(sigs.i_f(), kCode); 927 EXPECT_FAILURE_C(i_f, kCode);
851 EXPECT_FAILURE(sigs.i_d(), kCode); 928 EXPECT_FAILURE_C(i_d, kCode);
852 } 929 }
853 930
854 TEST_F(AstDecoderTest, If_type5) { 931 TEST_F(AstDecoderTest, If_type5) {
855 // 0 ? 1 : stmt 932 // 0 ? 1 : stmt
856 static const byte kCode[] = {WASM_IF_ELSE(WASM_ZERO, WASM_I8(1), WASM_NOP)}; 933 static const byte kCode[] = {WASM_IF_ELSE_I(WASM_ZERO, WASM_I8(1), WASM_NOP)};
857 EXPECT_FAILURE(sigs.i_i(), kCode); 934 EXPECT_FAILURE_C(i_i, kCode);
858 EXPECT_FAILURE(sigs.i_f(), kCode); 935 EXPECT_FAILURE_C(i_f, kCode);
859 EXPECT_FAILURE(sigs.i_d(), kCode); 936 EXPECT_FAILURE_C(i_d, kCode);
860 } 937 }
861 938
862 TEST_F(AstDecoderTest, Int64Local_param) { 939 TEST_F(AstDecoderTest, Int64Local_param) {
863 EXPECT_VERIFIES(sigs.l_l(), kCodeGetLocal0); 940 EXPECT_VERIFIES_C(l_l, kCodeGetLocal0);
864 } 941 }
865 942
866 TEST_F(AstDecoderTest, Int64Locals) { 943 TEST_F(AstDecoderTest, Int64Locals) {
867 for (byte i = 1; i < 8; i++) { 944 for (byte i = 1; i < 8; i++) {
868 AddLocals(kAstI64, 1); 945 AddLocals(kAstI64, 1);
869 for (byte j = 0; j < i; j++) { 946 for (byte j = 0; j < i; j++) {
870 EXPECT_VERIFIES_INLINE(sigs.l_v(), WASM_GET_LOCAL(j)); 947 EXPECT_VERIFIES(l_v, WASM_GET_LOCAL(j));
871 } 948 }
872 } 949 }
873 } 950 }
874 951
875 TEST_F(AstDecoderTest, Int32Binops) { 952 TEST_F(AstDecoderTest, Int32Binops) {
876 TestBinop(kExprI32Add, sigs.i_ii()); 953 TestBinop(kExprI32Add, sigs.i_ii());
877 TestBinop(kExprI32Sub, sigs.i_ii()); 954 TestBinop(kExprI32Sub, sigs.i_ii());
878 TestBinop(kExprI32Mul, sigs.i_ii()); 955 TestBinop(kExprI32Mul, sigs.i_ii());
879 TestBinop(kExprI32DivS, sigs.i_ii()); 956 TestBinop(kExprI32DivS, sigs.i_ii());
880 TestBinop(kExprI32DivU, sigs.i_ii()); 957 TestBinop(kExprI32DivU, sigs.i_ii());
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
922 TestUnop(kExprI32UConvertF64, kAstI32, kAstF64); 999 TestUnop(kExprI32UConvertF64, kAstI32, kAstF64);
923 TestUnop(kExprF64SConvertI32, kAstF64, kAstI32); 1000 TestUnop(kExprF64SConvertI32, kAstF64, kAstI32);
924 TestUnop(kExprF64UConvertI32, kAstF64, kAstI32); 1001 TestUnop(kExprF64UConvertI32, kAstF64, kAstI32);
925 TestUnop(kExprF64ConvertF32, kAstF64, kAstF32); 1002 TestUnop(kExprF64ConvertF32, kAstF64, kAstF32);
926 TestUnop(kExprF32SConvertI32, kAstF32, kAstI32); 1003 TestUnop(kExprF32SConvertI32, kAstF32, kAstI32);
927 TestUnop(kExprF32UConvertI32, kAstF32, kAstI32); 1004 TestUnop(kExprF32UConvertI32, kAstF32, kAstI32);
928 TestUnop(kExprF32ConvertF64, kAstF32, kAstF64); 1005 TestUnop(kExprF32ConvertF64, kAstF32, kAstF64);
929 } 1006 }
930 1007
931 TEST_F(AstDecoderTest, MacrosStmt) { 1008 TEST_F(AstDecoderTest, MacrosStmt) {
932 VERIFY(WASM_SET_LOCAL(0, WASM_I32V_3(87348))); 1009 EXPECT_VERIFIES(v_i, WASM_SET_LOCAL(0, WASM_I32V_3(87348)));
933 VERIFY(WASM_STORE_MEM(MachineType::Int32(), WASM_I8(24), WASM_I8(40))); 1010 EXPECT_VERIFIES(
934 VERIFY(WASM_IF(WASM_GET_LOCAL(0), WASM_NOP)); 1011 v_i, WASM_STORE_MEM(MachineType::Int32(), WASM_I8(24), WASM_I8(40)));
935 VERIFY(WASM_IF_ELSE(WASM_GET_LOCAL(0), WASM_NOP, WASM_NOP)); 1012 EXPECT_VERIFIES(v_i, WASM_IF(WASM_GET_LOCAL(0), WASM_NOP));
936 VERIFY(WASM_NOP); 1013 EXPECT_VERIFIES(v_i, WASM_IF_ELSE(WASM_GET_LOCAL(0), WASM_NOP, WASM_NOP));
937 VERIFY(B1(WASM_NOP)); 1014 EXPECT_VERIFIES(v_v, WASM_NOP);
938 VERIFY(WASM_LOOP(WASM_NOP)); 1015 EXPECT_VERIFIES(v_v, B1(WASM_NOP));
939 VERIFY(WASM_LOOP(WASM_BREAK(0))); 1016 EXPECT_VERIFIES(v_v, WASM_LOOP(WASM_NOP));
940 VERIFY(WASM_LOOP(WASM_CONTINUE(0))); 1017 EXPECT_VERIFIES(v_v, WASM_LOOP(WASM_BR(0)));
941 }
942
943 TEST_F(AstDecoderTest, MacrosBreak) {
944 EXPECT_VERIFIES_INLINE(sigs.v_v(), WASM_LOOP(WASM_BREAK(0)));
945
946 EXPECT_VERIFIES_INLINE(sigs.i_i(), WASM_LOOP(WASM_BREAKV(0, WASM_ZERO)));
947 EXPECT_VERIFIES_INLINE(sigs.l_l(), WASM_LOOP(WASM_BREAKV(0, WASM_I64V_1(0))));
948 EXPECT_VERIFIES_INLINE(sigs.f_ff(), WASM_LOOP(WASM_BREAKV(0, WASM_F32(0.0))));
949 EXPECT_VERIFIES_INLINE(sigs.d_dd(), WASM_LOOP(WASM_BREAKV(0, WASM_F64(0.0))));
950 } 1018 }
951 1019
952 TEST_F(AstDecoderTest, MacrosContinue) { 1020 TEST_F(AstDecoderTest, MacrosContinue) {
953 EXPECT_VERIFIES_INLINE(sigs.v_v(), WASM_LOOP(WASM_CONTINUE(0))); 1021 EXPECT_VERIFIES(v_v, WASM_LOOP(WASM_CONTINUE(0)));
954 } 1022 }
955 1023
956 TEST_F(AstDecoderTest, MacrosVariadic) { 1024 TEST_F(AstDecoderTest, MacrosVariadic) {
957 VERIFY(B2(WASM_NOP, WASM_NOP)); 1025 EXPECT_VERIFIES(v_v, B2(WASM_NOP, WASM_NOP));
958 VERIFY(B3(WASM_NOP, WASM_NOP, WASM_NOP)); 1026 EXPECT_VERIFIES(v_v, B3(WASM_NOP, WASM_NOP, WASM_NOP));
959 VERIFY(WASM_LOOP(WASM_NOP, WASM_NOP)); 1027 EXPECT_VERIFIES(v_v, WASM_LOOP(WASM_NOP, WASM_NOP));
960 VERIFY(WASM_LOOP(WASM_NOP, WASM_NOP, WASM_NOP)); 1028 EXPECT_VERIFIES(v_v, WASM_LOOP(WASM_NOP, WASM_NOP, WASM_NOP));
961 } 1029 }
962 1030
963 TEST_F(AstDecoderTest, MacrosNestedBlocks) { 1031 TEST_F(AstDecoderTest, MacrosNestedBlocks) {
964 VERIFY(B2(WASM_NOP, B2(WASM_NOP, WASM_NOP))); 1032 EXPECT_VERIFIES(v_v, B2(WASM_NOP, B2(WASM_NOP, WASM_NOP)));
965 VERIFY(B3(WASM_NOP, // -- 1033 EXPECT_VERIFIES(v_v, B3(WASM_NOP, // --
966 B2(WASM_NOP, WASM_NOP), // -- 1034 B2(WASM_NOP, WASM_NOP), // --
967 B2(WASM_NOP, WASM_NOP))); // -- 1035 B2(WASM_NOP, WASM_NOP))); // --
968 VERIFY(B1(B1(B2(WASM_NOP, WASM_NOP)))); 1036 EXPECT_VERIFIES(v_v, B1(B1(B2(WASM_NOP, WASM_NOP))));
969 } 1037 }
970 1038
971 TEST_F(AstDecoderTest, MultipleReturn) { 1039 TEST_F(AstDecoderTest, MultipleReturn) {
972 static LocalType kIntTypes5[] = {kAstI32, kAstI32, kAstI32, kAstI32, kAstI32}; 1040 static LocalType kIntTypes5[] = {kAstI32, kAstI32, kAstI32, kAstI32, kAstI32};
973 FunctionSig sig_ii_v(2, 0, kIntTypes5); 1041 FunctionSig sig_ii_v(2, 0, kIntTypes5);
974 EXPECT_VERIFIES_INLINE(&sig_ii_v, WASM_RETURNN(2, WASM_ZERO, WASM_ONE)); 1042 EXPECT_VERIFIES_S(&sig_ii_v, WASM_RETURNN(2, WASM_ZERO, WASM_ONE));
975 EXPECT_FAILURE_INLINE(&sig_ii_v, WASM_RETURNN(1, WASM_ZERO)); 1043 EXPECT_FAILURE_S(&sig_ii_v, WASM_RETURNN(1, WASM_ZERO));
976 1044
977 FunctionSig sig_iii_v(3, 0, kIntTypes5); 1045 FunctionSig sig_iii_v(3, 0, kIntTypes5);
978 EXPECT_VERIFIES_INLINE(&sig_iii_v, 1046 EXPECT_VERIFIES_S(&sig_iii_v,
979 WASM_RETURNN(3, WASM_ZERO, WASM_ONE, WASM_I8(44))); 1047 WASM_RETURNN(3, WASM_ZERO, WASM_ONE, WASM_I8(44)));
980 EXPECT_FAILURE_INLINE(&sig_iii_v, WASM_RETURNN(2, WASM_ZERO, WASM_ONE)); 1048 EXPECT_FAILURE_S(&sig_iii_v, WASM_RETURNN(2, WASM_ZERO, WASM_ONE));
981 } 1049 }
982 1050
983 TEST_F(AstDecoderTest, MultipleReturn_fallthru) { 1051 TEST_F(AstDecoderTest, MultipleReturn_fallthru) {
984 static LocalType kIntTypes5[] = {kAstI32, kAstI32, kAstI32, kAstI32, kAstI32}; 1052 static LocalType kIntTypes5[] = {kAstI32, kAstI32, kAstI32, kAstI32, kAstI32};
985 FunctionSig sig_ii_v(2, 0, kIntTypes5); 1053 FunctionSig sig_ii_v(2, 0, kIntTypes5);
986 1054
987 EXPECT_VERIFIES_INLINE(&sig_ii_v, WASM_ZERO, WASM_ONE); 1055 EXPECT_VERIFIES_S(&sig_ii_v, WASM_ZERO, WASM_ONE);
988 EXPECT_FAILURE_INLINE(&sig_ii_v, WASM_ZERO); 1056 EXPECT_FAILURE_S(&sig_ii_v, WASM_ZERO);
989 1057
990 FunctionSig sig_iii_v(3, 0, kIntTypes5); 1058 FunctionSig sig_iii_v(3, 0, kIntTypes5);
991 EXPECT_VERIFIES_INLINE(&sig_iii_v, WASM_ZERO, WASM_ONE, WASM_I8(44)); 1059 EXPECT_VERIFIES_S(&sig_iii_v, WASM_ZERO, WASM_ONE, WASM_I8(44));
992 EXPECT_FAILURE_INLINE(&sig_iii_v, WASM_ZERO, WASM_ONE); 1060 EXPECT_FAILURE_S(&sig_iii_v, WASM_ZERO, WASM_ONE);
993 } 1061 }
994 1062
995 TEST_F(AstDecoderTest, MacrosInt32) { 1063 TEST_F(AstDecoderTest, MacrosInt32) {
996 VERIFY(WASM_I32_ADD(WASM_GET_LOCAL(0), WASM_I8(12))); 1064 EXPECT_VERIFIES(i_i, WASM_I32_ADD(WASM_GET_LOCAL(0), WASM_I8(12)));
997 VERIFY(WASM_I32_SUB(WASM_GET_LOCAL(0), WASM_I8(13))); 1065 EXPECT_VERIFIES(i_i, WASM_I32_SUB(WASM_GET_LOCAL(0), WASM_I8(13)));
998 VERIFY(WASM_I32_MUL(WASM_GET_LOCAL(0), WASM_I8(14))); 1066 EXPECT_VERIFIES(i_i, WASM_I32_MUL(WASM_GET_LOCAL(0), WASM_I8(14)));
999 VERIFY(WASM_I32_DIVS(WASM_GET_LOCAL(0), WASM_I8(15))); 1067 EXPECT_VERIFIES(i_i, WASM_I32_DIVS(WASM_GET_LOCAL(0), WASM_I8(15)));
1000 VERIFY(WASM_I32_DIVU(WASM_GET_LOCAL(0), WASM_I8(16))); 1068 EXPECT_VERIFIES(i_i, WASM_I32_DIVU(WASM_GET_LOCAL(0), WASM_I8(16)));
1001 VERIFY(WASM_I32_REMS(WASM_GET_LOCAL(0), WASM_I8(17))); 1069 EXPECT_VERIFIES(i_i, WASM_I32_REMS(WASM_GET_LOCAL(0), WASM_I8(17)));
1002 VERIFY(WASM_I32_REMU(WASM_GET_LOCAL(0), WASM_I8(18))); 1070 EXPECT_VERIFIES(i_i, WASM_I32_REMU(WASM_GET_LOCAL(0), WASM_I8(18)));
1003 VERIFY(WASM_I32_AND(WASM_GET_LOCAL(0), WASM_I8(19))); 1071 EXPECT_VERIFIES(i_i, WASM_I32_AND(WASM_GET_LOCAL(0), WASM_I8(19)));
1004 VERIFY(WASM_I32_IOR(WASM_GET_LOCAL(0), WASM_I8(20))); 1072 EXPECT_VERIFIES(i_i, WASM_I32_IOR(WASM_GET_LOCAL(0), WASM_I8(20)));
1005 VERIFY(WASM_I32_XOR(WASM_GET_LOCAL(0), WASM_I8(21))); 1073 EXPECT_VERIFIES(i_i, WASM_I32_XOR(WASM_GET_LOCAL(0), WASM_I8(21)));
1006 VERIFY(WASM_I32_SHL(WASM_GET_LOCAL(0), WASM_I8(22))); 1074 EXPECT_VERIFIES(i_i, WASM_I32_SHL(WASM_GET_LOCAL(0), WASM_I8(22)));
1007 VERIFY(WASM_I32_SHR(WASM_GET_LOCAL(0), WASM_I8(23))); 1075 EXPECT_VERIFIES(i_i, WASM_I32_SHR(WASM_GET_LOCAL(0), WASM_I8(23)));
1008 VERIFY(WASM_I32_SAR(WASM_GET_LOCAL(0), WASM_I8(24))); 1076 EXPECT_VERIFIES(i_i, WASM_I32_SAR(WASM_GET_LOCAL(0), WASM_I8(24)));
1009 VERIFY(WASM_I32_ROR(WASM_GET_LOCAL(0), WASM_I8(24))); 1077 EXPECT_VERIFIES(i_i, WASM_I32_ROR(WASM_GET_LOCAL(0), WASM_I8(24)));
1010 VERIFY(WASM_I32_ROL(WASM_GET_LOCAL(0), WASM_I8(24))); 1078 EXPECT_VERIFIES(i_i, WASM_I32_ROL(WASM_GET_LOCAL(0), WASM_I8(24)));
1011 VERIFY(WASM_I32_EQ(WASM_GET_LOCAL(0), WASM_I8(25))); 1079 EXPECT_VERIFIES(i_i, WASM_I32_EQ(WASM_GET_LOCAL(0), WASM_I8(25)));
1012 VERIFY(WASM_I32_NE(WASM_GET_LOCAL(0), WASM_I8(25))); 1080 EXPECT_VERIFIES(i_i, WASM_I32_NE(WASM_GET_LOCAL(0), WASM_I8(25)));
1013 1081
1014 VERIFY(WASM_I32_LTS(WASM_GET_LOCAL(0), WASM_I8(26))); 1082 EXPECT_VERIFIES(i_i, WASM_I32_LTS(WASM_GET_LOCAL(0), WASM_I8(26)));
1015 VERIFY(WASM_I32_LES(WASM_GET_LOCAL(0), WASM_I8(27))); 1083 EXPECT_VERIFIES(i_i, WASM_I32_LES(WASM_GET_LOCAL(0), WASM_I8(27)));
1016 VERIFY(WASM_I32_LTU(WASM_GET_LOCAL(0), WASM_I8(28))); 1084 EXPECT_VERIFIES(i_i, WASM_I32_LTU(WASM_GET_LOCAL(0), WASM_I8(28)));
1017 VERIFY(WASM_I32_LEU(WASM_GET_LOCAL(0), WASM_I8(29))); 1085 EXPECT_VERIFIES(i_i, WASM_I32_LEU(WASM_GET_LOCAL(0), WASM_I8(29)));
1018 1086
1019 VERIFY(WASM_I32_GTS(WASM_GET_LOCAL(0), WASM_I8(26))); 1087 EXPECT_VERIFIES(i_i, WASM_I32_GTS(WASM_GET_LOCAL(0), WASM_I8(26)));
1020 VERIFY(WASM_I32_GES(WASM_GET_LOCAL(0), WASM_I8(27))); 1088 EXPECT_VERIFIES(i_i, WASM_I32_GES(WASM_GET_LOCAL(0), WASM_I8(27)));
1021 VERIFY(WASM_I32_GTU(WASM_GET_LOCAL(0), WASM_I8(28))); 1089 EXPECT_VERIFIES(i_i, WASM_I32_GTU(WASM_GET_LOCAL(0), WASM_I8(28)));
1022 VERIFY(WASM_I32_GEU(WASM_GET_LOCAL(0), WASM_I8(29))); 1090 EXPECT_VERIFIES(i_i, WASM_I32_GEU(WASM_GET_LOCAL(0), WASM_I8(29)));
1023 } 1091 }
1024 1092
1025 TEST_F(AstDecoderTest, MacrosInt64) { 1093 TEST_F(AstDecoderTest, MacrosInt64) {
1026 #define VERIFY_L_LL(...) EXPECT_VERIFIES_INLINE(sigs.l_ll(), __VA_ARGS__) 1094 EXPECT_VERIFIES(l_ll, WASM_I64_ADD(WASM_GET_LOCAL(0), WASM_I64V_1(12)));
1027 #define VERIFY_I_LL(...) EXPECT_VERIFIES_INLINE(sigs.i_ll(), __VA_ARGS__) 1095 EXPECT_VERIFIES(l_ll, WASM_I64_SUB(WASM_GET_LOCAL(0), WASM_I64V_1(13)));
1096 EXPECT_VERIFIES(l_ll, WASM_I64_MUL(WASM_GET_LOCAL(0), WASM_I64V_1(14)));
1097 EXPECT_VERIFIES(l_ll, WASM_I64_DIVS(WASM_GET_LOCAL(0), WASM_I64V_1(15)));
1098 EXPECT_VERIFIES(l_ll, WASM_I64_DIVU(WASM_GET_LOCAL(0), WASM_I64V_1(16)));
1099 EXPECT_VERIFIES(l_ll, WASM_I64_REMS(WASM_GET_LOCAL(0), WASM_I64V_1(17)));
1100 EXPECT_VERIFIES(l_ll, WASM_I64_REMU(WASM_GET_LOCAL(0), WASM_I64V_1(18)));
1101 EXPECT_VERIFIES(l_ll, WASM_I64_AND(WASM_GET_LOCAL(0), WASM_I64V_1(19)));
1102 EXPECT_VERIFIES(l_ll, WASM_I64_IOR(WASM_GET_LOCAL(0), WASM_I64V_1(20)));
1103 EXPECT_VERIFIES(l_ll, WASM_I64_XOR(WASM_GET_LOCAL(0), WASM_I64V_1(21)));
1028 1104
1029 VERIFY_L_LL(WASM_I64_ADD(WASM_GET_LOCAL(0), WASM_I64V_1(12))); 1105 EXPECT_VERIFIES(l_ll, WASM_I64_SHL(WASM_GET_LOCAL(0), WASM_I64V_1(22)));
1030 VERIFY_L_LL(WASM_I64_SUB(WASM_GET_LOCAL(0), WASM_I64V_1(13))); 1106 EXPECT_VERIFIES(l_ll, WASM_I64_SHR(WASM_GET_LOCAL(0), WASM_I64V_1(23)));
1031 VERIFY_L_LL(WASM_I64_MUL(WASM_GET_LOCAL(0), WASM_I64V_1(14))); 1107 EXPECT_VERIFIES(l_ll, WASM_I64_SAR(WASM_GET_LOCAL(0), WASM_I64V_1(24)));
1032 VERIFY_L_LL(WASM_I64_DIVS(WASM_GET_LOCAL(0), WASM_I64V_1(15))); 1108 EXPECT_VERIFIES(l_ll, WASM_I64_ROR(WASM_GET_LOCAL(0), WASM_I64V_1(24)));
1033 VERIFY_L_LL(WASM_I64_DIVU(WASM_GET_LOCAL(0), WASM_I64V_1(16))); 1109 EXPECT_VERIFIES(l_ll, WASM_I64_ROL(WASM_GET_LOCAL(0), WASM_I64V_1(24)));
1034 VERIFY_L_LL(WASM_I64_REMS(WASM_GET_LOCAL(0), WASM_I64V_1(17)));
1035 VERIFY_L_LL(WASM_I64_REMU(WASM_GET_LOCAL(0), WASM_I64V_1(18)));
1036 VERIFY_L_LL(WASM_I64_AND(WASM_GET_LOCAL(0), WASM_I64V_1(19)));
1037 VERIFY_L_LL(WASM_I64_IOR(WASM_GET_LOCAL(0), WASM_I64V_1(20)));
1038 VERIFY_L_LL(WASM_I64_XOR(WASM_GET_LOCAL(0), WASM_I64V_1(21)));
1039 1110
1040 VERIFY_L_LL(WASM_I64_SHL(WASM_GET_LOCAL(0), WASM_I64V_1(22))); 1111 EXPECT_VERIFIES(i_ll, WASM_I64_LTS(WASM_GET_LOCAL(0), WASM_I64V_1(26)));
1041 VERIFY_L_LL(WASM_I64_SHR(WASM_GET_LOCAL(0), WASM_I64V_1(23))); 1112 EXPECT_VERIFIES(i_ll, WASM_I64_LES(WASM_GET_LOCAL(0), WASM_I64V_1(27)));
1042 VERIFY_L_LL(WASM_I64_SAR(WASM_GET_LOCAL(0), WASM_I64V_1(24))); 1113 EXPECT_VERIFIES(i_ll, WASM_I64_LTU(WASM_GET_LOCAL(0), WASM_I64V_1(28)));
1043 VERIFY_L_LL(WASM_I64_ROR(WASM_GET_LOCAL(0), WASM_I64V_1(24))); 1114 EXPECT_VERIFIES(i_ll, WASM_I64_LEU(WASM_GET_LOCAL(0), WASM_I64V_1(29)));
1044 VERIFY_L_LL(WASM_I64_ROL(WASM_GET_LOCAL(0), WASM_I64V_1(24)));
1045 1115
1046 VERIFY_I_LL(WASM_I64_LTS(WASM_GET_LOCAL(0), WASM_I64V_1(26))); 1116 EXPECT_VERIFIES(i_ll, WASM_I64_GTS(WASM_GET_LOCAL(0), WASM_I64V_1(26)));
1047 VERIFY_I_LL(WASM_I64_LES(WASM_GET_LOCAL(0), WASM_I64V_1(27))); 1117 EXPECT_VERIFIES(i_ll, WASM_I64_GES(WASM_GET_LOCAL(0), WASM_I64V_1(27)));
1048 VERIFY_I_LL(WASM_I64_LTU(WASM_GET_LOCAL(0), WASM_I64V_1(28))); 1118 EXPECT_VERIFIES(i_ll, WASM_I64_GTU(WASM_GET_LOCAL(0), WASM_I64V_1(28)));
1049 VERIFY_I_LL(WASM_I64_LEU(WASM_GET_LOCAL(0), WASM_I64V_1(29))); 1119 EXPECT_VERIFIES(i_ll, WASM_I64_GEU(WASM_GET_LOCAL(0), WASM_I64V_1(29)));
1050 1120
1051 VERIFY_I_LL(WASM_I64_GTS(WASM_GET_LOCAL(0), WASM_I64V_1(26))); 1121 EXPECT_VERIFIES(i_ll, WASM_I64_EQ(WASM_GET_LOCAL(0), WASM_I64V_1(25)));
1052 VERIFY_I_LL(WASM_I64_GES(WASM_GET_LOCAL(0), WASM_I64V_1(27))); 1122 EXPECT_VERIFIES(i_ll, WASM_I64_NE(WASM_GET_LOCAL(0), WASM_I64V_1(25)));
1053 VERIFY_I_LL(WASM_I64_GTU(WASM_GET_LOCAL(0), WASM_I64V_1(28)));
1054 VERIFY_I_LL(WASM_I64_GEU(WASM_GET_LOCAL(0), WASM_I64V_1(29)));
1055
1056 VERIFY_I_LL(WASM_I64_EQ(WASM_GET_LOCAL(0), WASM_I64V_1(25)));
1057 VERIFY_I_LL(WASM_I64_NE(WASM_GET_LOCAL(0), WASM_I64V_1(25)));
1058 } 1123 }
1059 1124
1060 TEST_F(AstDecoderTest, AllSimpleExpressions) { 1125 TEST_F(AstDecoderTest, AllSimpleExpressions) {
1061 // Test all simple expressions which are described by a signature. 1126 // Test all simple expressions which are described by a signature.
1062 #define DECODE_TEST(name, opcode, sig) \ 1127 #define DECODE_TEST(name, opcode, sig) \
1063 { \ 1128 { \
1064 FunctionSig* sig = WasmOpcodes::Signature(kExpr##name); \ 1129 FunctionSig* sig = WasmOpcodes::Signature(kExpr##name); \
1065 if (sig->parameter_count() == 1) { \ 1130 if (sig->parameter_count() == 1) { \
1066 TestUnop(kExpr##name, sig); \ 1131 TestUnop(kExpr##name, sig); \
1067 } else { \ 1132 } else { \
1068 TestBinop(kExpr##name, sig); \ 1133 TestBinop(kExpr##name, sig); \
1069 } \ 1134 } \
1070 } 1135 }
1071 1136
1072 FOREACH_SIMPLE_OPCODE(DECODE_TEST); 1137 FOREACH_SIMPLE_OPCODE(DECODE_TEST);
1073 1138
1074 #undef DECODE_TEST 1139 #undef DECODE_TEST
1075 } 1140 }
1076 1141
1077 TEST_F(AstDecoderTest, MemorySize) { 1142 TEST_F(AstDecoderTest, MemorySize) {
1078 byte code[] = {kExprMemorySize}; 1143 byte code[] = {kExprMemorySize};
1079 EXPECT_VERIFIES(sigs.i_i(), code); 1144 EXPECT_VERIFIES_C(i_i, code);
1080 EXPECT_FAILURE(sigs.f_ff(), code); 1145 EXPECT_FAILURE_C(f_ff, code);
1081 } 1146 }
1082 1147
1083 TEST_F(AstDecoderTest, LoadMemOffset) { 1148 TEST_F(AstDecoderTest, LoadMemOffset) {
1084 for (int offset = 0; offset < 128; offset += 7) { 1149 for (int offset = 0; offset < 128; offset += 7) {
1085 byte code[] = {kExprI8Const, 0, kExprI32LoadMem, ZERO_ALIGNMENT, 1150 byte code[] = {kExprI8Const, 0, kExprI32LoadMem, ZERO_ALIGNMENT,
1086 static_cast<byte>(offset)}; 1151 static_cast<byte>(offset)};
1087 EXPECT_VERIFIES(sigs.i_i(), code); 1152 EXPECT_VERIFIES_C(i_i, code);
1088 } 1153 }
1089 } 1154 }
1090 1155
1091 TEST_F(AstDecoderTest, LoadMemAlignment) { 1156 TEST_F(AstDecoderTest, LoadMemAlignment) {
1092 struct { 1157 struct {
1093 WasmOpcode instruction; 1158 WasmOpcode instruction;
1094 uint32_t maximum_aligment; 1159 uint32_t maximum_aligment;
1095 } values[] = { 1160 } values[] = {
1096 {kExprI32LoadMem8U, 0}, // -- 1161 {kExprI32LoadMem8U, 0}, // --
1097 {kExprI32LoadMem8S, 0}, // -- 1162 {kExprI32LoadMem8S, 0}, // --
1098 {kExprI32LoadMem16U, 1}, // -- 1163 {kExprI32LoadMem16U, 1}, // --
1099 {kExprI32LoadMem16S, 1}, // -- 1164 {kExprI32LoadMem16S, 1}, // --
1100 {kExprI64LoadMem8U, 0}, // -- 1165 {kExprI64LoadMem8U, 0}, // --
1101 {kExprI64LoadMem8S, 0}, // -- 1166 {kExprI64LoadMem8S, 0}, // --
1102 {kExprI64LoadMem16U, 1}, // -- 1167 {kExprI64LoadMem16U, 1}, // --
1103 {kExprI64LoadMem16S, 1}, // -- 1168 {kExprI64LoadMem16S, 1}, // --
1104 {kExprI64LoadMem32U, 2}, // -- 1169 {kExprI64LoadMem32U, 2}, // --
1105 {kExprI64LoadMem32S, 2}, // -- 1170 {kExprI64LoadMem32S, 2}, // --
1106 {kExprI32LoadMem, 2}, // -- 1171 {kExprI32LoadMem, 2}, // --
1107 {kExprI64LoadMem, 3}, // -- 1172 {kExprI64LoadMem, 3}, // --
1108 {kExprF32LoadMem, 2}, // -- 1173 {kExprF32LoadMem, 2}, // --
1109 {kExprF64LoadMem, 3}, // -- 1174 {kExprF64LoadMem, 3}, // --
1110 }; 1175 };
1111 1176
1112 for (int i = 0; i < arraysize(values); i++) { 1177 for (int i = 0; i < arraysize(values); i++) {
1113 for (byte alignment = 0; alignment <= 4; alignment++) { 1178 for (byte alignment = 0; alignment <= 4; alignment++) {
1114 byte code[] = {kExprI8Const, 0, static_cast<byte>(values[i].instruction), 1179 byte code[] = {WASM_ZERO, static_cast<byte>(values[i].instruction),
1115 alignment, ZERO_OFFSET}; 1180 alignment, ZERO_OFFSET, WASM_DROP};
1116 if (static_cast<uint32_t>(alignment) <= values[i].maximum_aligment) { 1181 if (static_cast<uint32_t>(alignment) <= values[i].maximum_aligment) {
1117 EXPECT_VERIFIES(sigs.v_i(), code); 1182 EXPECT_VERIFIES_C(v_i, code);
1118 } else { 1183 } else {
1119 EXPECT_FAILURE(sigs.v_i(), code); 1184 EXPECT_FAILURE_C(v_i, code);
1120 } 1185 }
1121 } 1186 }
1122 } 1187 }
1123 } 1188 }
1124 1189
1125 TEST_F(AstDecoderTest, StoreMemOffset) { 1190 TEST_F(AstDecoderTest, StoreMemOffset) {
1126 for (int offset = 0; offset < 128; offset += 7) { 1191 for (int offset = 0; offset < 128; offset += 7) {
1127 byte code[] = {WASM_STORE_MEM_OFFSET(MachineType::Int32(), offset, 1192 byte code[] = {WASM_STORE_MEM_OFFSET(MachineType::Int32(), offset,
1128 WASM_ZERO, WASM_ZERO)}; 1193 WASM_ZERO, WASM_ZERO)};
1129 EXPECT_VERIFIES(sigs.i_i(), code); 1194 EXPECT_VERIFIES_C(v_i, code);
1130 } 1195 }
1131 } 1196 }
1132 1197
1198 TEST_F(AstDecoderTest, StoreMemOffset_void) {
1199 EXPECT_FAILURE(i_i, WASM_STORE_MEM_OFFSET(MachineType::Int32(), 0, WASM_ZERO,
1200 WASM_ZERO));
1201 }
1202
1133 #define BYTE0(x) ((x)&0x7F) 1203 #define BYTE0(x) ((x)&0x7F)
1134 #define BYTE1(x) ((x >> 7) & 0x7F) 1204 #define BYTE1(x) ((x >> 7) & 0x7F)
1135 #define BYTE2(x) ((x >> 14) & 0x7F) 1205 #define BYTE2(x) ((x >> 14) & 0x7F)
1136 #define BYTE3(x) ((x >> 21) & 0x7F) 1206 #define BYTE3(x) ((x >> 21) & 0x7F)
1137 1207
1138 #define VARINT1(x) BYTE0(x) 1208 #define VARINT1(x) BYTE0(x)
1139 #define VARINT2(x) BYTE0(x) | 0x80, BYTE1(x) 1209 #define VARINT2(x) BYTE0(x) | 0x80, BYTE1(x)
1140 #define VARINT3(x) BYTE0(x) | 0x80, BYTE1(x) | 0x80, BYTE2(x) 1210 #define VARINT3(x) BYTE0(x) | 0x80, BYTE1(x) | 0x80, BYTE2(x)
1141 #define VARINT4(x) BYTE0(x) | 0x80, BYTE1(x) | 0x80, BYTE2(x) | 0x80, BYTE3(x) 1211 #define VARINT4(x) BYTE0(x) | 0x80, BYTE1(x) | 0x80, BYTE2(x) | 0x80, BYTE3(x)
1142 1212
1143 TEST_F(AstDecoderTest, LoadMemOffset_varint) { 1213 TEST_F(AstDecoderTest, LoadMemOffset_varint) {
1144 EXPECT_VERIFIES_INLINE(sigs.i_i(), WASM_ZERO, kExprI32LoadMem, ZERO_ALIGNMENT, 1214 EXPECT_VERIFIES(i_i, WASM_ZERO, kExprI32LoadMem, ZERO_ALIGNMENT,
1145 VARINT1(0x45)); 1215 VARINT1(0x45));
1146 EXPECT_VERIFIES_INLINE(sigs.i_i(), WASM_ZERO, kExprI32LoadMem, ZERO_ALIGNMENT, 1216 EXPECT_VERIFIES(i_i, WASM_ZERO, kExprI32LoadMem, ZERO_ALIGNMENT,
1147 VARINT2(0x3999)); 1217 VARINT2(0x3999));
1148 EXPECT_VERIFIES_INLINE(sigs.i_i(), WASM_ZERO, kExprI32LoadMem, ZERO_ALIGNMENT, 1218 EXPECT_VERIFIES(i_i, WASM_ZERO, kExprI32LoadMem, ZERO_ALIGNMENT,
1149 VARINT3(0x344445)); 1219 VARINT3(0x344445));
1150 EXPECT_VERIFIES_INLINE(sigs.i_i(), WASM_ZERO, kExprI32LoadMem, ZERO_ALIGNMENT, 1220 EXPECT_VERIFIES(i_i, WASM_ZERO, kExprI32LoadMem, ZERO_ALIGNMENT,
1151 VARINT4(0x36666667)); 1221 VARINT4(0x36666667));
1152 } 1222 }
1153 1223
1154 TEST_F(AstDecoderTest, StoreMemOffset_varint) { 1224 TEST_F(AstDecoderTest, StoreMemOffset_varint) {
1155 EXPECT_VERIFIES_INLINE(sigs.i_i(), WASM_ZERO, WASM_ZERO, kExprI32StoreMem, 1225 EXPECT_VERIFIES(v_i, WASM_ZERO, WASM_ZERO, kExprI32StoreMem, ZERO_ALIGNMENT,
1156 ZERO_ALIGNMENT, VARINT1(0x33)); 1226 VARINT1(0x33));
1157 EXPECT_VERIFIES_INLINE(sigs.i_i(), WASM_ZERO, WASM_ZERO, kExprI32StoreMem, 1227 EXPECT_VERIFIES(v_i, WASM_ZERO, WASM_ZERO, kExprI32StoreMem, ZERO_ALIGNMENT,
1158 ZERO_ALIGNMENT, VARINT2(0x1111)); 1228 VARINT2(0x1111));
1159 EXPECT_VERIFIES_INLINE(sigs.i_i(), WASM_ZERO, WASM_ZERO, kExprI32StoreMem, 1229 EXPECT_VERIFIES(v_i, WASM_ZERO, WASM_ZERO, kExprI32StoreMem, ZERO_ALIGNMENT,
1160 ZERO_ALIGNMENT, VARINT3(0x222222)); 1230 VARINT3(0x222222));
1161 EXPECT_VERIFIES_INLINE(sigs.i_i(), WASM_ZERO, WASM_ZERO, kExprI32StoreMem, 1231 EXPECT_VERIFIES(v_i, WASM_ZERO, WASM_ZERO, kExprI32StoreMem, ZERO_ALIGNMENT,
1162 ZERO_ALIGNMENT, VARINT4(0x44444444)); 1232 VARINT4(0x44444444));
1163 } 1233 }
1164 1234
1165 TEST_F(AstDecoderTest, AllLoadMemCombinations) { 1235 TEST_F(AstDecoderTest, AllLoadMemCombinations) {
1166 for (size_t i = 0; i < arraysize(kLocalTypes); i++) { 1236 for (size_t i = 0; i < arraysize(kLocalTypes); i++) {
1167 LocalType local_type = kLocalTypes[i]; 1237 LocalType local_type = kLocalTypes[i];
1168 for (size_t j = 0; j < arraysize(machineTypes); j++) { 1238 for (size_t j = 0; j < arraysize(machineTypes); j++) {
1169 MachineType mem_type = machineTypes[j]; 1239 MachineType mem_type = machineTypes[j];
1170 byte code[] = {WASM_LOAD_MEM(mem_type, WASM_ZERO)}; 1240 byte code[] = {WASM_LOAD_MEM(mem_type, WASM_ZERO)};
1171 FunctionSig sig(1, 0, &local_type); 1241 FunctionSig sig(1, 0, &local_type);
1172 if (local_type == WasmOpcodes::LocalTypeFor(mem_type)) { 1242 if (local_type == WasmOpcodes::LocalTypeFor(mem_type)) {
1173 EXPECT_VERIFIES(&sig, code); 1243 EXPECT_VERIFIES_SC(&sig, code);
1174 } else { 1244 } else {
1175 EXPECT_FAILURE(&sig, code); 1245 EXPECT_FAILURE_SC(&sig, code);
1176 } 1246 }
1177 } 1247 }
1178 } 1248 }
1179 } 1249 }
1180 1250
1181 TEST_F(AstDecoderTest, AllStoreMemCombinations) { 1251 TEST_F(AstDecoderTest, AllStoreMemCombinations) {
1182 for (size_t i = 0; i < arraysize(kLocalTypes); i++) { 1252 for (size_t i = 0; i < arraysize(kLocalTypes); i++) {
1183 LocalType local_type = kLocalTypes[i]; 1253 LocalType local_type = kLocalTypes[i];
1184 for (size_t j = 0; j < arraysize(machineTypes); j++) { 1254 for (size_t j = 0; j < arraysize(machineTypes); j++) {
1185 MachineType mem_type = machineTypes[j]; 1255 MachineType mem_type = machineTypes[j];
1186 byte code[] = {WASM_STORE_MEM(mem_type, WASM_ZERO, WASM_GET_LOCAL(0))}; 1256 byte code[] = {WASM_STORE_MEM(mem_type, WASM_ZERO, WASM_GET_LOCAL(0))};
1187 FunctionSig sig(0, 1, &local_type); 1257 FunctionSig sig(0, 1, &local_type);
1188 if (local_type == WasmOpcodes::LocalTypeFor(mem_type)) { 1258 if (local_type == WasmOpcodes::LocalTypeFor(mem_type)) {
1189 EXPECT_VERIFIES(&sig, code); 1259 EXPECT_VERIFIES_SC(&sig, code);
1190 } else { 1260 } else {
1191 EXPECT_FAILURE(&sig, code); 1261 EXPECT_FAILURE_SC(&sig, code);
1192 } 1262 }
1193 } 1263 }
1194 } 1264 }
1195 } 1265 }
1196 1266
1197 namespace { 1267 namespace {
1198 // A helper for tests that require a module environment for functions and 1268 // A helper for tests that require a module environment for functions and
1199 // globals. 1269 // globals.
1200 class TestModuleEnv : public ModuleEnv { 1270 class TestModuleEnv : public ModuleEnv {
1201 public: 1271 public:
1202 TestModuleEnv() { 1272 TestModuleEnv() {
1203 instance = nullptr; 1273 instance = nullptr;
1204 module = &mod; 1274 module = &mod;
1205 } 1275 }
1206 byte AddGlobal(LocalType type) { 1276 byte AddGlobal(LocalType type, bool mutability = true) {
1207 mod.globals.push_back({0, 0, type, 0, false}); 1277 mod.globals.push_back({type, mutability, NO_INIT, 0, false, false});
1208 CHECK(mod.globals.size() <= 127); 1278 CHECK(mod.globals.size() <= 127);
1209 return static_cast<byte>(mod.globals.size() - 1); 1279 return static_cast<byte>(mod.globals.size() - 1);
1210 } 1280 }
1211 byte AddSignature(FunctionSig* sig) { 1281 byte AddSignature(FunctionSig* sig) {
1212 mod.signatures.push_back(sig); 1282 mod.signatures.push_back(sig);
1213 CHECK(mod.signatures.size() <= 127); 1283 CHECK(mod.signatures.size() <= 127);
1214 return static_cast<byte>(mod.signatures.size() - 1); 1284 return static_cast<byte>(mod.signatures.size() - 1);
1215 } 1285 }
1216 byte AddFunction(FunctionSig* sig) { 1286 byte AddFunction(FunctionSig* sig) {
1217 mod.functions.push_back({sig, // sig 1287 mod.functions.push_back({sig, // sig
1218 0, // func_index 1288 0, // func_index
1219 0, // sig_index 1289 0, // sig_index
1220 0, // name_offset 1290 0, // name_offset
1221 0, // name_length 1291 0, // name_length
1222 0, // code_start_offset 1292 0, // code_start_offset
1223 0}); // code_end_offset 1293 0, // code_end_offset
1294 false, // import
1295 false}); // export
1224 CHECK(mod.functions.size() <= 127); 1296 CHECK(mod.functions.size() <= 127);
1225 return static_cast<byte>(mod.functions.size() - 1); 1297 return static_cast<byte>(mod.functions.size() - 1);
1226 } 1298 }
1227 byte AddImport(FunctionSig* sig) { 1299 byte AddImport(FunctionSig* sig) {
1228 mod.import_table.push_back({sig, // sig 1300 byte result = AddFunction(sig);
1229 0, // sig_index 1301 mod.functions[result].imported = true;
1230 0, // module_name_offset 1302 return result;
1231 0, // module_name_length
1232 0, // function_name_offset
1233 0}); // function_name_length
1234 CHECK(mod.import_table.size() <= 127);
1235 return static_cast<byte>(mod.import_table.size() - 1);
1236 } 1303 }
1237 1304
1238 private: 1305 private:
1239 WasmModule mod; 1306 WasmModule mod;
1240 }; 1307 };
1241 } // namespace 1308 } // namespace
1242 1309
1243 TEST_F(AstDecoderTest, SimpleCalls) { 1310 TEST_F(AstDecoderTest, SimpleCalls) {
1244 FunctionSig* sig = sigs.i_i(); 1311 FunctionSig* sig = sigs.i_i();
1245 TestModuleEnv module_env; 1312 TestModuleEnv module_env;
1246 module = &module_env; 1313 module = &module_env;
1247 1314
1248 module_env.AddFunction(sigs.i_v()); 1315 module_env.AddFunction(sigs.i_v());
1249 module_env.AddFunction(sigs.i_i()); 1316 module_env.AddFunction(sigs.i_i());
1250 module_env.AddFunction(sigs.i_ii()); 1317 module_env.AddFunction(sigs.i_ii());
1251 1318
1252 EXPECT_VERIFIES_INLINE(sig, WASM_CALL_FUNCTION0(0)); 1319 EXPECT_VERIFIES_S(sig, WASM_CALL_FUNCTION0(0));
1253 EXPECT_VERIFIES_INLINE(sig, WASM_CALL_FUNCTION1(1, WASM_I8(27))); 1320 EXPECT_VERIFIES_S(sig, WASM_CALL_FUNCTION(1, WASM_I8(27)));
1254 EXPECT_VERIFIES_INLINE(sig, WASM_CALL_FUNCTION2(2, WASM_I8(37), WASM_I8(77))); 1321 EXPECT_VERIFIES_S(sig, WASM_CALL_FUNCTION(2, WASM_I8(37), WASM_I8(77)));
1255 } 1322 }
1256 1323
1257 TEST_F(AstDecoderTest, CallsWithTooFewArguments) { 1324 TEST_F(AstDecoderTest, CallsWithTooFewArguments) {
1258 FunctionSig* sig = sigs.i_i(); 1325 FunctionSig* sig = sigs.i_i();
1259 TestModuleEnv module_env; 1326 TestModuleEnv module_env;
1260 module = &module_env; 1327 module = &module_env;
1261 1328
1262 module_env.AddFunction(sigs.i_i()); 1329 module_env.AddFunction(sigs.i_i());
1263 module_env.AddFunction(sigs.i_ii()); 1330 module_env.AddFunction(sigs.i_ii());
1264 module_env.AddFunction(sigs.f_ff()); 1331 module_env.AddFunction(sigs.f_ff());
1265 1332
1266 EXPECT_FAILURE_INLINE(sig, WASM_CALL_FUNCTION0(0)); 1333 EXPECT_FAILURE_S(sig, WASM_CALL_FUNCTION0(0));
1267 EXPECT_FAILURE_INLINE(sig, WASM_CALL_FUNCTION1(1, WASM_ZERO)); 1334 EXPECT_FAILURE_S(sig, WASM_CALL_FUNCTION(1, WASM_ZERO));
1268 EXPECT_FAILURE_INLINE(sig, WASM_CALL_FUNCTION1(2, WASM_GET_LOCAL(0))); 1335 EXPECT_FAILURE_S(sig, WASM_CALL_FUNCTION(2, WASM_GET_LOCAL(0)));
1269 } 1336 }
1270 1337
1271 TEST_F(AstDecoderTest, CallsWithMismatchedSigs2) { 1338 TEST_F(AstDecoderTest, CallsWithMismatchedSigs2) {
1272 FunctionSig* sig = sigs.i_i(); 1339 FunctionSig* sig = sigs.i_i();
1273 TestModuleEnv module_env; 1340 TestModuleEnv module_env;
1274 module = &module_env; 1341 module = &module_env;
1275 1342
1276 module_env.AddFunction(sigs.i_i()); 1343 module_env.AddFunction(sigs.i_i());
1277 1344
1278 EXPECT_FAILURE_INLINE(sig, WASM_CALL_FUNCTION1(0, WASM_I64V_1(17))); 1345 EXPECT_FAILURE_S(sig, WASM_CALL_FUNCTION(0, WASM_I64V_1(17)));
1279 EXPECT_FAILURE_INLINE(sig, WASM_CALL_FUNCTION1(0, WASM_F32(17.1))); 1346 EXPECT_FAILURE_S(sig, WASM_CALL_FUNCTION(0, WASM_F32(17.1)));
1280 EXPECT_FAILURE_INLINE(sig, WASM_CALL_FUNCTION1(0, WASM_F64(17.1))); 1347 EXPECT_FAILURE_S(sig, WASM_CALL_FUNCTION(0, WASM_F64(17.1)));
1281 } 1348 }
1282 1349
1283 TEST_F(AstDecoderTest, CallsWithMismatchedSigs3) { 1350 TEST_F(AstDecoderTest, CallsWithMismatchedSigs3) {
1284 FunctionSig* sig = sigs.i_i(); 1351 FunctionSig* sig = sigs.i_i();
1285 TestModuleEnv module_env; 1352 TestModuleEnv module_env;
1286 module = &module_env; 1353 module = &module_env;
1287 1354
1288 module_env.AddFunction(sigs.i_f()); 1355 module_env.AddFunction(sigs.i_f());
1289 1356
1290 EXPECT_FAILURE_INLINE(sig, WASM_CALL_FUNCTION1(0, WASM_I8(17))); 1357 EXPECT_FAILURE_S(sig, WASM_CALL_FUNCTION(0, WASM_I8(17)));
1291 EXPECT_FAILURE_INLINE(sig, WASM_CALL_FUNCTION1(0, WASM_I64V_1(27))); 1358 EXPECT_FAILURE_S(sig, WASM_CALL_FUNCTION(0, WASM_I64V_1(27)));
1292 EXPECT_FAILURE_INLINE(sig, WASM_CALL_FUNCTION1(0, WASM_F64(37.2))); 1359 EXPECT_FAILURE_S(sig, WASM_CALL_FUNCTION(0, WASM_F64(37.2)));
1293 1360
1294 module_env.AddFunction(sigs.i_d()); 1361 module_env.AddFunction(sigs.i_d());
1295 1362
1296 EXPECT_FAILURE_INLINE(sig, WASM_CALL_FUNCTION1(1, WASM_I8(16))); 1363 EXPECT_FAILURE_S(sig, WASM_CALL_FUNCTION(1, WASM_I8(16)));
1297 EXPECT_FAILURE_INLINE(sig, WASM_CALL_FUNCTION1(1, WASM_I64V_1(16))); 1364 EXPECT_FAILURE_S(sig, WASM_CALL_FUNCTION(1, WASM_I64V_1(16)));
1298 EXPECT_FAILURE_INLINE(sig, WASM_CALL_FUNCTION1(1, WASM_F32(17.6))); 1365 EXPECT_FAILURE_S(sig, WASM_CALL_FUNCTION(1, WASM_F32(17.6)));
1366 }
1367
1368 TEST_F(AstDecoderTest, MultiReturn) {
1369 FLAG_wasm_mv_prototype = true;
1370 LocalType storage[] = {kAstI32, kAstI32};
1371 FunctionSig sig_ii_v(2, 0, storage);
1372 FunctionSig sig_v_ii(0, 2, storage);
1373 TestModuleEnv module_env;
1374 module = &module_env;
1375
1376 module_env.AddFunction(&sig_v_ii);
1377 module_env.AddFunction(&sig_ii_v);
1378
1379 EXPECT_VERIFIES_S(&sig_ii_v, WASM_CALL_FUNCTION0(1));
1380 EXPECT_VERIFIES(v_v, WASM_CALL_FUNCTION0(1), WASM_DROP, WASM_DROP);
1381 EXPECT_VERIFIES(v_v, WASM_CALL_FUNCTION0(1), kExprCallFunction, 0);
1382 }
1383
1384 TEST_F(AstDecoderTest, MultiReturnType) {
1385 FLAG_wasm_mv_prototype = true;
1386 for (size_t a = 0; a < arraysize(kLocalTypes); a++) {
1387 for (size_t b = 0; b < arraysize(kLocalTypes); b++) {
1388 for (size_t c = 0; c < arraysize(kLocalTypes); c++) {
1389 for (size_t d = 0; d < arraysize(kLocalTypes); d++) {
1390 LocalType storage_ab[] = {kLocalTypes[a], kLocalTypes[b]};
1391 FunctionSig sig_ab_v(2, 0, storage_ab);
1392 LocalType storage_cd[] = {kLocalTypes[c], kLocalTypes[d]};
1393 FunctionSig sig_cd_v(2, 0, storage_cd);
1394
1395 TestModuleEnv module_env;
1396 module = &module_env;
1397 module_env.AddFunction(&sig_cd_v);
1398
1399 EXPECT_VERIFIES_S(&sig_cd_v, WASM_CALL_FUNCTION0(0));
1400
1401 if (a == c && b == d) {
1402 EXPECT_VERIFIES_S(&sig_ab_v, WASM_CALL_FUNCTION0(0));
1403 } else {
1404 EXPECT_FAILURE_S(&sig_ab_v, WASM_CALL_FUNCTION0(0));
1405 }
1406 }
1407 }
1408 }
1409 }
1299 } 1410 }
1300 1411
1301 TEST_F(AstDecoderTest, SimpleIndirectCalls) { 1412 TEST_F(AstDecoderTest, SimpleIndirectCalls) {
1302 FunctionSig* sig = sigs.i_i(); 1413 FunctionSig* sig = sigs.i_i();
1303 TestModuleEnv module_env; 1414 TestModuleEnv module_env;
1304 module = &module_env; 1415 module = &module_env;
1305 1416
1306 byte f0 = module_env.AddSignature(sigs.i_v()); 1417 byte f0 = module_env.AddSignature(sigs.i_v());
1307 byte f1 = module_env.AddSignature(sigs.i_i()); 1418 byte f1 = module_env.AddSignature(sigs.i_i());
1308 byte f2 = module_env.AddSignature(sigs.i_ii()); 1419 byte f2 = module_env.AddSignature(sigs.i_ii());
1309 1420
1310 EXPECT_VERIFIES_INLINE(sig, WASM_CALL_INDIRECT0(f0, WASM_ZERO)); 1421 EXPECT_VERIFIES_S(sig, WASM_CALL_INDIRECT0(f0, WASM_ZERO));
1311 EXPECT_VERIFIES_INLINE(sig, WASM_CALL_INDIRECT1(f1, WASM_ZERO, WASM_I8(22))); 1422 EXPECT_VERIFIES_S(sig, WASM_CALL_INDIRECT1(f1, WASM_ZERO, WASM_I8(22)));
1312 EXPECT_VERIFIES_INLINE( 1423 EXPECT_VERIFIES_S(
1313 sig, WASM_CALL_INDIRECT2(f2, WASM_ZERO, WASM_I8(32), WASM_I8(72))); 1424 sig, WASM_CALL_INDIRECT2(f2, WASM_ZERO, WASM_I8(32), WASM_I8(72)));
1314 } 1425 }
1315 1426
1316 TEST_F(AstDecoderTest, IndirectCallsOutOfBounds) { 1427 TEST_F(AstDecoderTest, IndirectCallsOutOfBounds) {
1317 FunctionSig* sig = sigs.i_i(); 1428 FunctionSig* sig = sigs.i_i();
1318 TestModuleEnv module_env; 1429 TestModuleEnv module_env;
1319 module = &module_env; 1430 module = &module_env;
1320 1431
1321 EXPECT_FAILURE_INLINE(sig, WASM_CALL_INDIRECT0(0, WASM_ZERO)); 1432 EXPECT_FAILURE_S(sig, WASM_CALL_INDIRECT0(0, WASM_ZERO));
1322 module_env.AddSignature(sigs.i_v()); 1433 module_env.AddSignature(sigs.i_v());
1323 EXPECT_VERIFIES_INLINE(sig, WASM_CALL_INDIRECT0(0, WASM_ZERO)); 1434 EXPECT_VERIFIES_S(sig, WASM_CALL_INDIRECT0(0, WASM_ZERO));
1324 1435
1325 EXPECT_FAILURE_INLINE(sig, WASM_CALL_INDIRECT1(1, WASM_ZERO, WASM_I8(22))); 1436 EXPECT_FAILURE_S(sig, WASM_CALL_INDIRECT1(1, WASM_ZERO, WASM_I8(22)));
1326 module_env.AddSignature(sigs.i_i()); 1437 module_env.AddSignature(sigs.i_i());
1327 EXPECT_VERIFIES_INLINE(sig, WASM_CALL_INDIRECT1(1, WASM_ZERO, WASM_I8(27))); 1438 EXPECT_VERIFIES_S(sig, WASM_CALL_INDIRECT1(1, WASM_ZERO, WASM_I8(27)));
1328 1439
1329 EXPECT_FAILURE_INLINE(sig, WASM_CALL_INDIRECT1(2, WASM_ZERO, WASM_I8(27))); 1440 EXPECT_FAILURE_S(sig, WASM_CALL_INDIRECT1(2, WASM_ZERO, WASM_I8(27)));
1330 } 1441 }
1331 1442
1332 TEST_F(AstDecoderTest, IndirectCallsWithMismatchedSigs3) { 1443 TEST_F(AstDecoderTest, IndirectCallsWithMismatchedSigs3) {
1333 FunctionSig* sig = sigs.i_i(); 1444 FunctionSig* sig = sigs.i_i();
1334 TestModuleEnv module_env; 1445 TestModuleEnv module_env;
1335 module = &module_env; 1446 module = &module_env;
1336 1447
1337 byte f0 = module_env.AddFunction(sigs.i_f()); 1448 byte f0 = module_env.AddFunction(sigs.i_f());
1338 1449
1339 EXPECT_FAILURE_INLINE(sig, WASM_CALL_INDIRECT1(f0, WASM_ZERO, WASM_I8(17))); 1450 EXPECT_FAILURE_S(sig, WASM_CALL_INDIRECT1(f0, WASM_ZERO, WASM_I8(17)));
1340 EXPECT_FAILURE_INLINE(sig, 1451 EXPECT_FAILURE_S(sig, WASM_CALL_INDIRECT1(f0, WASM_ZERO, WASM_I64V_1(27)));
1341 WASM_CALL_INDIRECT1(f0, WASM_ZERO, WASM_I64V_1(27))); 1452 EXPECT_FAILURE_S(sig, WASM_CALL_INDIRECT1(f0, WASM_ZERO, WASM_F64(37.2)));
1342 EXPECT_FAILURE_INLINE(sig,
1343 WASM_CALL_INDIRECT1(f0, WASM_ZERO, WASM_F64(37.2)));
1344 1453
1345 EXPECT_FAILURE_INLINE(sig, WASM_CALL_INDIRECT0(f0, WASM_I8(17))); 1454 EXPECT_FAILURE_S(sig, WASM_CALL_INDIRECT0(f0, WASM_I8(17)));
1346 EXPECT_FAILURE_INLINE(sig, WASM_CALL_INDIRECT0(f0, WASM_I64V_1(27))); 1455 EXPECT_FAILURE_S(sig, WASM_CALL_INDIRECT0(f0, WASM_I64V_1(27)));
1347 EXPECT_FAILURE_INLINE(sig, WASM_CALL_INDIRECT0(f0, WASM_F64(37.2))); 1456 EXPECT_FAILURE_S(sig, WASM_CALL_INDIRECT0(f0, WASM_F64(37.2)));
1348 1457
1349 byte f1 = module_env.AddFunction(sigs.i_d()); 1458 byte f1 = module_env.AddFunction(sigs.i_d());
1350 1459
1351 EXPECT_FAILURE_INLINE(sig, WASM_CALL_INDIRECT1(f1, WASM_ZERO, WASM_I8(16))); 1460 EXPECT_FAILURE_S(sig, WASM_CALL_INDIRECT1(f1, WASM_ZERO, WASM_I8(16)));
1352 EXPECT_FAILURE_INLINE(sig, 1461 EXPECT_FAILURE_S(sig, WASM_CALL_INDIRECT1(f1, WASM_ZERO, WASM_I64V_1(16)));
1353 WASM_CALL_INDIRECT1(f1, WASM_ZERO, WASM_I64V_1(16))); 1462 EXPECT_FAILURE_S(sig, WASM_CALL_INDIRECT1(f1, WASM_ZERO, WASM_F32(17.6)));
1354 EXPECT_FAILURE_INLINE(sig,
1355 WASM_CALL_INDIRECT1(f1, WASM_ZERO, WASM_F32(17.6)));
1356 } 1463 }
1357 1464
1358 TEST_F(AstDecoderTest, SimpleImportCalls) { 1465 TEST_F(AstDecoderTest, SimpleImportCalls) {
1359 FunctionSig* sig = sigs.i_i(); 1466 FunctionSig* sig = sigs.i_i();
1360 TestModuleEnv module_env; 1467 TestModuleEnv module_env;
1361 module = &module_env; 1468 module = &module_env;
1362 1469
1363 byte f0 = module_env.AddImport(sigs.i_v()); 1470 byte f0 = module_env.AddImport(sigs.i_v());
1364 byte f1 = module_env.AddImport(sigs.i_i()); 1471 byte f1 = module_env.AddImport(sigs.i_i());
1365 byte f2 = module_env.AddImport(sigs.i_ii()); 1472 byte f2 = module_env.AddImport(sigs.i_ii());
1366 1473
1367 EXPECT_VERIFIES_INLINE(sig, WASM_CALL_IMPORT0(f0)); 1474 EXPECT_VERIFIES_S(sig, WASM_CALL_FUNCTION0(f0));
1368 EXPECT_VERIFIES_INLINE(sig, WASM_CALL_IMPORT1(f1, WASM_I8(22))); 1475 EXPECT_VERIFIES_S(sig, WASM_CALL_FUNCTION(f1, WASM_I8(22)));
1369 EXPECT_VERIFIES_INLINE(sig, WASM_CALL_IMPORT2(f2, WASM_I8(32), WASM_I8(72))); 1476 EXPECT_VERIFIES_S(sig, WASM_CALL_FUNCTION(f2, WASM_I8(32), WASM_I8(72)));
1370 } 1477 }
1371 1478
1372 TEST_F(AstDecoderTest, ImportCallsWithMismatchedSigs3) { 1479 TEST_F(AstDecoderTest, ImportCallsWithMismatchedSigs3) {
1373 FunctionSig* sig = sigs.i_i(); 1480 FunctionSig* sig = sigs.i_i();
1374 TestModuleEnv module_env; 1481 TestModuleEnv module_env;
1375 module = &module_env; 1482 module = &module_env;
1376 1483
1377 byte f0 = module_env.AddImport(sigs.i_f()); 1484 byte f0 = module_env.AddImport(sigs.i_f());
1378 1485
1379 EXPECT_FAILURE_INLINE(sig, WASM_CALL_IMPORT0(f0)); 1486 EXPECT_FAILURE_S(sig, WASM_CALL_FUNCTION0(f0));
1380 EXPECT_FAILURE_INLINE(sig, WASM_CALL_IMPORT1(f0, WASM_I8(17))); 1487 EXPECT_FAILURE_S(sig, WASM_CALL_FUNCTION(f0, WASM_I8(17)));
1381 EXPECT_FAILURE_INLINE(sig, WASM_CALL_IMPORT1(f0, WASM_I64V_1(27))); 1488 EXPECT_FAILURE_S(sig, WASM_CALL_FUNCTION(f0, WASM_I64V_1(27)));
1382 EXPECT_FAILURE_INLINE(sig, WASM_CALL_IMPORT1(f0, WASM_F64(37.2))); 1489 EXPECT_FAILURE_S(sig, WASM_CALL_FUNCTION(f0, WASM_F64(37.2)));
1383 1490
1384 byte f1 = module_env.AddImport(sigs.i_d()); 1491 byte f1 = module_env.AddImport(sigs.i_d());
1385 1492
1386 EXPECT_FAILURE_INLINE(sig, WASM_CALL_IMPORT0(f1)); 1493 EXPECT_FAILURE_S(sig, WASM_CALL_FUNCTION0(f1));
1387 EXPECT_FAILURE_INLINE(sig, WASM_CALL_IMPORT1(f1, WASM_I8(16))); 1494 EXPECT_FAILURE_S(sig, WASM_CALL_FUNCTION(f1, WASM_I8(16)));
1388 EXPECT_FAILURE_INLINE(sig, WASM_CALL_IMPORT1(f1, WASM_I64V_1(16))); 1495 EXPECT_FAILURE_S(sig, WASM_CALL_FUNCTION(f1, WASM_I64V_1(16)));
1389 EXPECT_FAILURE_INLINE(sig, WASM_CALL_IMPORT1(f1, WASM_F32(17.6))); 1496 EXPECT_FAILURE_S(sig, WASM_CALL_FUNCTION(f1, WASM_F32(17.6)));
1390 } 1497 }
1391 1498
1392 TEST_F(AstDecoderTest, Int32Globals) { 1499 TEST_F(AstDecoderTest, Int32Globals) {
1393 FunctionSig* sig = sigs.i_i(); 1500 FunctionSig* sig = sigs.i_i();
1394 TestModuleEnv module_env; 1501 TestModuleEnv module_env;
1395 module = &module_env; 1502 module = &module_env;
1396 1503
1397 module_env.AddGlobal(kAstI32); 1504 module_env.AddGlobal(kAstI32);
1398 1505
1399 EXPECT_VERIFIES_INLINE(sig, WASM_GET_GLOBAL(0)); 1506 EXPECT_VERIFIES_S(sig, WASM_GET_GLOBAL(0));
1400 EXPECT_VERIFIES_INLINE(sig, WASM_SET_GLOBAL(0, WASM_GET_LOCAL(0))); 1507 EXPECT_FAILURE_S(sig, WASM_SET_GLOBAL(0, WASM_GET_LOCAL(0)));
1508 EXPECT_VERIFIES_S(sig, WASM_SET_GLOBAL(0, WASM_GET_LOCAL(0)), WASM_ZERO);
1509 }
1510
1511 TEST_F(AstDecoderTest, ImmutableGlobal) {
1512 FunctionSig* sig = sigs.v_v();
1513 TestModuleEnv module_env;
1514 module = &module_env;
1515
1516 uint32_t g0 = module_env.AddGlobal(kAstI32, true);
1517 uint32_t g1 = module_env.AddGlobal(kAstI32, false);
1518
1519 EXPECT_VERIFIES_S(sig, WASM_SET_GLOBAL(g0, WASM_ZERO));
1520 EXPECT_FAILURE_S(sig, WASM_SET_GLOBAL(g1, WASM_ZERO));
1401 } 1521 }
1402 1522
1403 TEST_F(AstDecoderTest, Int32Globals_fail) { 1523 TEST_F(AstDecoderTest, Int32Globals_fail) {
1404 FunctionSig* sig = sigs.i_i(); 1524 FunctionSig* sig = sigs.i_i();
1405 TestModuleEnv module_env; 1525 TestModuleEnv module_env;
1406 module = &module_env; 1526 module = &module_env;
1407 1527
1408 module_env.AddGlobal(kAstI64); 1528 module_env.AddGlobal(kAstI64);
1409 module_env.AddGlobal(kAstI64); 1529 module_env.AddGlobal(kAstI64);
1410 module_env.AddGlobal(kAstF32); 1530 module_env.AddGlobal(kAstF32);
1411 module_env.AddGlobal(kAstF64); 1531 module_env.AddGlobal(kAstF64);
1412 1532
1413 EXPECT_FAILURE_INLINE(sig, WASM_GET_GLOBAL(0)); 1533 EXPECT_FAILURE_S(sig, WASM_GET_GLOBAL(0));
1414 EXPECT_FAILURE_INLINE(sig, WASM_GET_GLOBAL(1)); 1534 EXPECT_FAILURE_S(sig, WASM_GET_GLOBAL(1));
1415 EXPECT_FAILURE_INLINE(sig, WASM_GET_GLOBAL(2)); 1535 EXPECT_FAILURE_S(sig, WASM_GET_GLOBAL(2));
1416 EXPECT_FAILURE_INLINE(sig, WASM_GET_GLOBAL(3)); 1536 EXPECT_FAILURE_S(sig, WASM_GET_GLOBAL(3));
1417 1537
1418 EXPECT_FAILURE_INLINE(sig, WASM_SET_GLOBAL(0, WASM_GET_LOCAL(0))); 1538 EXPECT_FAILURE_S(sig, WASM_SET_GLOBAL(0, WASM_GET_LOCAL(0)), WASM_ZERO);
1419 EXPECT_FAILURE_INLINE(sig, WASM_SET_GLOBAL(1, WASM_GET_LOCAL(0))); 1539 EXPECT_FAILURE_S(sig, WASM_SET_GLOBAL(1, WASM_GET_LOCAL(0)), WASM_ZERO);
1420 EXPECT_FAILURE_INLINE(sig, WASM_SET_GLOBAL(2, WASM_GET_LOCAL(0))); 1540 EXPECT_FAILURE_S(sig, WASM_SET_GLOBAL(2, WASM_GET_LOCAL(0)), WASM_ZERO);
1421 EXPECT_FAILURE_INLINE(sig, WASM_SET_GLOBAL(3, WASM_GET_LOCAL(0))); 1541 EXPECT_FAILURE_S(sig, WASM_SET_GLOBAL(3, WASM_GET_LOCAL(0)), WASM_ZERO);
1422 } 1542 }
1423 1543
1424 TEST_F(AstDecoderTest, Int64Globals) { 1544 TEST_F(AstDecoderTest, Int64Globals) {
1425 FunctionSig* sig = sigs.l_l(); 1545 FunctionSig* sig = sigs.l_l();
1426 TestModuleEnv module_env; 1546 TestModuleEnv module_env;
1427 module = &module_env; 1547 module = &module_env;
1428 1548
1429 module_env.AddGlobal(kAstI64); 1549 module_env.AddGlobal(kAstI64);
1430 module_env.AddGlobal(kAstI64); 1550 module_env.AddGlobal(kAstI64);
1431 1551
1432 EXPECT_VERIFIES_INLINE(sig, WASM_GET_GLOBAL(0)); 1552 EXPECT_VERIFIES_S(sig, WASM_GET_GLOBAL(0));
1433 EXPECT_VERIFIES_INLINE(sig, WASM_GET_GLOBAL(1)); 1553 EXPECT_VERIFIES_S(sig, WASM_GET_GLOBAL(1));
1434 1554
1435 EXPECT_VERIFIES_INLINE(sig, WASM_SET_GLOBAL(0, WASM_GET_LOCAL(0))); 1555 EXPECT_VERIFIES_S(sig, WASM_SET_GLOBAL(0, WASM_GET_LOCAL(0)),
1436 EXPECT_VERIFIES_INLINE(sig, WASM_SET_GLOBAL(1, WASM_GET_LOCAL(0))); 1556 WASM_GET_LOCAL(0));
1557 EXPECT_VERIFIES_S(sig, WASM_SET_GLOBAL(1, WASM_GET_LOCAL(0)),
1558 WASM_GET_LOCAL(0));
1437 } 1559 }
1438 1560
1439 TEST_F(AstDecoderTest, Float32Globals) { 1561 TEST_F(AstDecoderTest, Float32Globals) {
1440 FunctionSig* sig = sigs.f_ff(); 1562 FunctionSig* sig = sigs.f_ff();
1441 TestModuleEnv module_env; 1563 TestModuleEnv module_env;
1442 module = &module_env; 1564 module = &module_env;
1443 1565
1444 module_env.AddGlobal(kAstF32); 1566 module_env.AddGlobal(kAstF32);
1445 1567
1446 EXPECT_VERIFIES_INLINE(sig, WASM_GET_GLOBAL(0)); 1568 EXPECT_VERIFIES_S(sig, WASM_GET_GLOBAL(0));
1447 EXPECT_VERIFIES_INLINE(sig, WASM_SET_GLOBAL(0, WASM_GET_LOCAL(0))); 1569 EXPECT_VERIFIES_S(sig, WASM_SET_GLOBAL(0, WASM_GET_LOCAL(0)),
1570 WASM_GET_LOCAL(0));
1448 } 1571 }
1449 1572
1450 TEST_F(AstDecoderTest, Float64Globals) { 1573 TEST_F(AstDecoderTest, Float64Globals) {
1451 FunctionSig* sig = sigs.d_dd(); 1574 FunctionSig* sig = sigs.d_dd();
1452 TestModuleEnv module_env; 1575 TestModuleEnv module_env;
1453 module = &module_env; 1576 module = &module_env;
1454 1577
1455 module_env.AddGlobal(kAstF64); 1578 module_env.AddGlobal(kAstF64);
1456 1579
1457 EXPECT_VERIFIES_INLINE(sig, WASM_GET_GLOBAL(0)); 1580 EXPECT_VERIFIES_S(sig, WASM_GET_GLOBAL(0));
1458 EXPECT_VERIFIES_INLINE(sig, WASM_SET_GLOBAL(0, WASM_GET_LOCAL(0))); 1581 EXPECT_VERIFIES_S(sig, WASM_SET_GLOBAL(0, WASM_GET_LOCAL(0)),
1582 WASM_GET_LOCAL(0));
1459 } 1583 }
1460 1584
1461 TEST_F(AstDecoderTest, AllGetGlobalCombinations) { 1585 TEST_F(AstDecoderTest, AllGetGlobalCombinations) {
1462 for (size_t i = 0; i < arraysize(kLocalTypes); i++) { 1586 for (size_t i = 0; i < arraysize(kLocalTypes); i++) {
1463 LocalType local_type = kLocalTypes[i]; 1587 LocalType local_type = kLocalTypes[i];
1464 for (size_t j = 0; j < arraysize(kLocalTypes); j++) { 1588 for (size_t j = 0; j < arraysize(kLocalTypes); j++) {
1465 LocalType global_type = kLocalTypes[j]; 1589 LocalType global_type = kLocalTypes[j];
1466 FunctionSig sig(1, 0, &local_type); 1590 FunctionSig sig(1, 0, &local_type);
1467 TestModuleEnv module_env; 1591 TestModuleEnv module_env;
1468 module = &module_env; 1592 module = &module_env;
1469 module_env.AddGlobal(global_type); 1593 module_env.AddGlobal(global_type);
1470 if (local_type == global_type) { 1594 if (local_type == global_type) {
1471 EXPECT_VERIFIES_INLINE(&sig, WASM_GET_GLOBAL(0)); 1595 EXPECT_VERIFIES_S(&sig, WASM_GET_GLOBAL(0));
1472 } else { 1596 } else {
1473 EXPECT_FAILURE_INLINE(&sig, WASM_GET_GLOBAL(0)); 1597 EXPECT_FAILURE_S(&sig, WASM_GET_GLOBAL(0));
1474 } 1598 }
1475 } 1599 }
1476 } 1600 }
1477 } 1601 }
1478 1602
1479 TEST_F(AstDecoderTest, AllSetGlobalCombinations) { 1603 TEST_F(AstDecoderTest, AllSetGlobalCombinations) {
1480 for (size_t i = 0; i < arraysize(kLocalTypes); i++) { 1604 for (size_t i = 0; i < arraysize(kLocalTypes); i++) {
1481 LocalType local_type = kLocalTypes[i]; 1605 LocalType local_type = kLocalTypes[i];
1482 for (size_t j = 0; j < arraysize(kLocalTypes); j++) { 1606 for (size_t j = 0; j < arraysize(kLocalTypes); j++) {
1483 LocalType global_type = kLocalTypes[j]; 1607 LocalType global_type = kLocalTypes[j];
1484 FunctionSig sig(0, 1, &local_type); 1608 FunctionSig sig(0, 1, &local_type);
1485 TestModuleEnv module_env; 1609 TestModuleEnv module_env;
1486 module = &module_env; 1610 module = &module_env;
1487 module_env.AddGlobal(global_type); 1611 module_env.AddGlobal(global_type);
1488 if (local_type == global_type) { 1612 if (local_type == global_type) {
1489 EXPECT_VERIFIES_INLINE(&sig, WASM_SET_GLOBAL(0, WASM_GET_LOCAL(0))); 1613 EXPECT_VERIFIES_S(&sig, WASM_SET_GLOBAL(0, WASM_GET_LOCAL(0)));
1490 } else { 1614 } else {
1491 EXPECT_FAILURE_INLINE(&sig, WASM_SET_GLOBAL(0, WASM_GET_LOCAL(0))); 1615 EXPECT_FAILURE_S(&sig, WASM_SET_GLOBAL(0, WASM_GET_LOCAL(0)));
1492 } 1616 }
1493 } 1617 }
1494 } 1618 }
1495 } 1619 }
1496 1620
1497 TEST_F(AstDecoderTest, WasmGrowMemory) { 1621 TEST_F(AstDecoderTest, WasmGrowMemory) {
1498 TestModuleEnv module_env; 1622 TestModuleEnv module_env;
1499 module = &module_env; 1623 module = &module_env;
1500 module->origin = kWasmOrigin; 1624 module->origin = kWasmOrigin;
1501 1625
1502 byte code[] = {WASM_UNOP(kExprGrowMemory, WASM_GET_LOCAL(0))}; 1626 byte code[] = {WASM_UNOP(kExprGrowMemory, WASM_GET_LOCAL(0))};
1503 EXPECT_VERIFIES(sigs.i_i(), code); 1627 EXPECT_VERIFIES_C(i_i, code);
1504 EXPECT_FAILURE(sigs.i_d(), code); 1628 EXPECT_FAILURE_C(i_d, code);
1505 } 1629 }
1506 1630
1507 TEST_F(AstDecoderTest, AsmJsGrowMemory) { 1631 TEST_F(AstDecoderTest, AsmJsGrowMemory) {
1508 TestModuleEnv module_env; 1632 TestModuleEnv module_env;
1509 module = &module_env; 1633 module = &module_env;
1510 module->origin = kAsmJsOrigin; 1634 module->origin = kAsmJsOrigin;
1511 1635
1512 byte code[] = {WASM_UNOP(kExprGrowMemory, WASM_GET_LOCAL(0))}; 1636 byte code[] = {WASM_UNOP(kExprGrowMemory, WASM_GET_LOCAL(0))};
1513 EXPECT_FAILURE(sigs.i_i(), code); 1637 EXPECT_FAILURE_C(i_i, code);
1514 } 1638 }
1515 1639
1516 TEST_F(AstDecoderTest, AsmJsBinOpsCheckOrigin) { 1640 TEST_F(AstDecoderTest, AsmJsBinOpsCheckOrigin) {
1517 LocalType float32int32float32[] = {kAstF32, kAstI32, kAstF32}; 1641 LocalType float32int32float32[] = {kAstF32, kAstI32, kAstF32};
1518 FunctionSig sig_f_if(1, 2, float32int32float32); 1642 FunctionSig sig_f_if(1, 2, float32int32float32);
1519 LocalType float64int32float64[] = {kAstF64, kAstI32, kAstF64}; 1643 LocalType float64int32float64[] = {kAstF64, kAstI32, kAstF64};
1520 FunctionSig sig_d_id(1, 2, float64int32float64); 1644 FunctionSig sig_d_id(1, 2, float64int32float64);
1521 struct { 1645 struct {
1522 WasmOpcode op; 1646 WasmOpcode op;
1523 FunctionSig* sig; 1647 FunctionSig* sig;
(...skipping 21 matching lines...) Expand all
1545 } 1669 }
1546 } 1670 }
1547 1671
1548 { 1672 {
1549 TestModuleEnv module_env; 1673 TestModuleEnv module_env;
1550 module = &module_env; 1674 module = &module_env;
1551 module->origin = kWasmOrigin; 1675 module->origin = kWasmOrigin;
1552 for (int i = 0; i < arraysize(AsmJsBinOps); i++) { 1676 for (int i = 0; i < arraysize(AsmJsBinOps); i++) {
1553 byte code[] = { 1677 byte code[] = {
1554 WASM_BINOP(AsmJsBinOps[i].op, WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))}; 1678 WASM_BINOP(AsmJsBinOps[i].op, WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))};
1555 EXPECT_FAILURE(AsmJsBinOps[i].sig, code); 1679 EXPECT_FAILURE_SC(AsmJsBinOps[i].sig, code);
1556 } 1680 }
1557 } 1681 }
1558 } 1682 }
1559 1683
1560 TEST_F(AstDecoderTest, AsmJsUnOpsCheckOrigin) { 1684 TEST_F(AstDecoderTest, AsmJsUnOpsCheckOrigin) {
1561 LocalType float32int32[] = {kAstF32, kAstI32}; 1685 LocalType float32int32[] = {kAstF32, kAstI32};
1562 FunctionSig sig_f_i(1, 2, float32int32); 1686 FunctionSig sig_f_i(1, 2, float32int32);
1563 LocalType float64int32[] = {kAstF64, kAstI32}; 1687 LocalType float64int32[] = {kAstF64, kAstI32};
1564 FunctionSig sig_d_i(1, 2, float64int32); 1688 FunctionSig sig_d_i(1, 2, float64int32);
1565 struct { 1689 struct {
(...skipping 26 matching lines...) Expand all
1592 TestUnop(AsmJsUnOps[i].op, AsmJsUnOps[i].sig); 1716 TestUnop(AsmJsUnOps[i].op, AsmJsUnOps[i].sig);
1593 } 1717 }
1594 } 1718 }
1595 1719
1596 { 1720 {
1597 TestModuleEnv module_env; 1721 TestModuleEnv module_env;
1598 module = &module_env; 1722 module = &module_env;
1599 module->origin = kWasmOrigin; 1723 module->origin = kWasmOrigin;
1600 for (int i = 0; i < arraysize(AsmJsUnOps); i++) { 1724 for (int i = 0; i < arraysize(AsmJsUnOps); i++) {
1601 byte code[] = {WASM_UNOP(AsmJsUnOps[i].op, WASM_GET_LOCAL(0))}; 1725 byte code[] = {WASM_UNOP(AsmJsUnOps[i].op, WASM_GET_LOCAL(0))};
1602 EXPECT_FAILURE(AsmJsUnOps[i].sig, code); 1726 EXPECT_FAILURE_SC(AsmJsUnOps[i].sig, code);
1603 } 1727 }
1604 } 1728 }
1605 } 1729 }
1606 1730
1607 TEST_F(AstDecoderTest, BreakEnd) { 1731 TEST_F(AstDecoderTest, BreakEnd) {
1608 EXPECT_VERIFIES_INLINE(sigs.i_i(), 1732 EXPECT_VERIFIES(
1609 B1(WASM_I32_ADD(WASM_BRV(0, WASM_ZERO), WASM_ZERO))); 1733 i_i, WASM_BLOCK_I(WASM_I32_ADD(WASM_BRV(0, WASM_ZERO), WASM_ZERO)));
1610 EXPECT_VERIFIES_INLINE(sigs.i_i(), 1734 EXPECT_VERIFIES(
1611 B1(WASM_I32_ADD(WASM_ZERO, WASM_BRV(0, WASM_ZERO)))); 1735 i_i, WASM_BLOCK_I(WASM_I32_ADD(WASM_ZERO, WASM_BRV(0, WASM_ZERO))));
1612 } 1736 }
1613 1737
1614 TEST_F(AstDecoderTest, BreakIfBinop) { 1738 TEST_F(AstDecoderTest, BreakIfBinop) {
1615 EXPECT_FAILURE_INLINE( 1739 EXPECT_VERIFIES(i_i, WASM_BLOCK_I(WASM_I32_ADD(
1616 sigs.i_i(), WASM_BLOCK(WASM_I32_ADD(WASM_BRV_IF(0, WASM_ZERO, WASM_ZERO), 1740 WASM_BRV_IF(0, WASM_ZERO, WASM_ZERO), WASM_ZERO)));
1617 WASM_ZERO))); 1741 EXPECT_VERIFIES(i_i, WASM_BLOCK_I(WASM_I32_ADD(
1618 EXPECT_FAILURE_INLINE(sigs.i_i(), 1742 WASM_ZERO, WASM_BRV_IF(0, WASM_ZERO, WASM_ZERO))));
1619 WASM_BLOCK(WASM_I32_ADD( 1743 EXPECT_VERIFIES_S(
1620 WASM_ZERO, WASM_BRV_IF(0, WASM_ZERO, WASM_ZERO)))); 1744 sigs.f_ff(),
1745 WASM_BLOCK_F(WASM_F32_ABS(WASM_BRV_IF(0, WASM_F32(0.0f), WASM_ZERO))));
1746 }
1747
1748 TEST_F(AstDecoderTest, BreakIfBinop_fail) {
1749 EXPECT_FAILURE_S(
1750 sigs.f_ff(),
1751 WASM_BLOCK_F(WASM_F32_ABS(WASM_BRV_IF(0, WASM_ZERO, WASM_ZERO))));
1752 EXPECT_FAILURE_S(
1753 sigs.i_i(),
1754 WASM_BLOCK_I(WASM_F32_ABS(WASM_BRV_IF(0, WASM_F32(0.0f), WASM_ZERO))));
1621 } 1755 }
1622 1756
1623 TEST_F(AstDecoderTest, BreakNesting1) { 1757 TEST_F(AstDecoderTest, BreakNesting1) {
1624 for (int i = 0; i < 5; i++) { 1758 for (int i = 0; i < 5; i++) {
1625 // (block[2] (loop[2] (if (get p) break[N]) (set p 1)) p) 1759 // (block[2] (loop[2] (if (get p) break[N]) (set p 1)) p)
1626 byte code[] = {WASM_BLOCK( 1760 byte code[] = {WASM_BLOCK_I(
1627 WASM_LOOP(WASM_IF(WASM_GET_LOCAL(0), WASM_BRV(i + 1, WASM_ZERO)), 1761 WASM_LOOP(WASM_IF(WASM_GET_LOCAL(0), WASM_BRV(i + 1, WASM_ZERO)),
1628 WASM_SET_LOCAL(0, WASM_I8(1))), 1762 WASM_SET_LOCAL(0, WASM_I8(1))),
1629 WASM_GET_LOCAL(0))}; 1763 WASM_ZERO)};
1630 if (i < 3) { 1764 if (i < 3) {
1631 EXPECT_VERIFIES(sigs.i_i(), code); 1765 EXPECT_VERIFIES_C(i_i, code);
1632 } else { 1766 } else {
1633 EXPECT_FAILURE(sigs.i_i(), code); 1767 EXPECT_FAILURE_C(i_i, code);
1634 } 1768 }
1635 } 1769 }
1636 } 1770 }
1637 1771
1638 TEST_F(AstDecoderTest, BreakNesting2) { 1772 TEST_F(AstDecoderTest, BreakNesting2) {
1639 AddLocals(kAstI32, 1); 1773 for (int i = 0; i < 7; i++) {
1640 for (int i = 0; i < 5; i++) { 1774 byte code[] = {B1(WASM_LOOP(WASM_IF(WASM_ZERO, WASM_BR(i)), WASM_NOP))};
1641 // (block[2] (loop[2] (if 0 break[N]) (set p 1)) (return p)) (11) 1775 if (i <= 3) {
1642 byte code[] = {B1(WASM_LOOP(WASM_IF(WASM_ZERO, WASM_BREAK(i + 1)), 1776 EXPECT_VERIFIES_C(v_v, code);
1643 WASM_SET_LOCAL(0, WASM_I8(1)))),
1644 WASM_I8(11)};
1645 if (i < 2) {
1646 EXPECT_VERIFIES(sigs.v_v(), code);
1647 } else { 1777 } else {
1648 EXPECT_FAILURE(sigs.v_v(), code); 1778 EXPECT_FAILURE_C(v_v, code);
1649 } 1779 }
1650 } 1780 }
1651 } 1781 }
1652 1782
1653 TEST_F(AstDecoderTest, BreakNesting3) { 1783 TEST_F(AstDecoderTest, BreakNesting3) {
1654 for (int i = 0; i < 5; i++) { 1784 for (int i = 0; i < 7; i++) {
1655 // (block[1] (loop[1] (block[1] (if 0 break[N]) 1785 // (block[1] (loop[1] (block[1] (if 0 break[N])
1656 byte code[] = { 1786 byte code[] = {
1657 WASM_BLOCK(WASM_LOOP(B1(WASM_IF(WASM_ZERO, WASM_BREAK(i + 1)))))}; 1787 WASM_BLOCK(WASM_LOOP(B1(WASM_IF(WASM_ZERO, WASM_BR(i + 1)))))};
1658 if (i < 3) { 1788 if (i < 4) {
1659 EXPECT_VERIFIES(sigs.v_v(), code); 1789 EXPECT_VERIFIES_C(v_v, code);
1660 } else { 1790 } else {
1661 EXPECT_FAILURE(sigs.v_v(), code); 1791 EXPECT_FAILURE_C(v_v, code);
1662 } 1792 }
1663 } 1793 }
1664 } 1794 }
1665 1795
1666 TEST_F(AstDecoderTest, BreaksWithMultipleTypes) { 1796 TEST_F(AstDecoderTest, BreaksWithMultipleTypes) {
1667 EXPECT_FAILURE_INLINE(sigs.i_i(), 1797 EXPECT_FAILURE(i_i, B2(WASM_BRV_IF_ZERO(0, WASM_I8(7)), WASM_F32(7.7)));
1668 B2(WASM_BRV_IF_ZERO(0, WASM_I8(7)), WASM_F32(7.7))); 1798
1669 1799 EXPECT_FAILURE(i_i, B2(WASM_BRV_IF_ZERO(0, WASM_I8(7)),
1670 EXPECT_FAILURE_INLINE(sigs.i_i(), B2(WASM_BRV_IF_ZERO(0, WASM_I8(7)), 1800 WASM_BRV_IF_ZERO(0, WASM_F32(7.7))));
1671 WASM_BRV_IF_ZERO(0, WASM_F32(7.7)))); 1801 EXPECT_FAILURE(
1672 EXPECT_FAILURE_INLINE(sigs.i_i(), B3(WASM_BRV_IF_ZERO(0, WASM_I8(8)), 1802 i_i, B3(WASM_BRV_IF_ZERO(0, WASM_I8(8)), WASM_BRV_IF_ZERO(0, WASM_I8(0)),
1673 WASM_BRV_IF_ZERO(0, WASM_I8(0)), 1803 WASM_BRV_IF_ZERO(0, WASM_F32(7.7))));
1674 WASM_BRV_IF_ZERO(0, WASM_F32(7.7)))); 1804 EXPECT_FAILURE(i_i, B3(WASM_BRV_IF_ZERO(0, WASM_I8(9)),
1675 EXPECT_FAILURE_INLINE(sigs.i_i(), B3(WASM_BRV_IF_ZERO(0, WASM_I8(9)), 1805 WASM_BRV_IF_ZERO(0, WASM_F32(7.7)),
1676 WASM_BRV_IF_ZERO(0, WASM_F32(7.7)), 1806 WASM_BRV_IF_ZERO(0, WASM_I8(11))));
1677 WASM_BRV_IF_ZERO(0, WASM_I8(11))));
1678 } 1807 }
1679 1808
1680 TEST_F(AstDecoderTest, BreakNesting_6_levels) { 1809 TEST_F(AstDecoderTest, BreakNesting_6_levels) {
1681 for (int mask = 0; mask < 64; mask++) { 1810 for (int mask = 0; mask < 64; mask++) {
1682 for (int i = 0; i < 14; i++) { 1811 for (int i = 0; i < 14; i++) {
1683 byte code[] = { 1812 byte code[] = {WASM_BLOCK(WASM_BLOCK(
1684 kExprBlock, // -- 1813 WASM_BLOCK(WASM_BLOCK(WASM_BLOCK(WASM_BLOCK(WASM_BR(i)))))))};
1685 kExprBlock, // --
1686 kExprBlock, // --
1687 kExprBlock, // --
1688 kExprBlock, // --
1689 kExprBlock, // --
1690 kExprBr, ARITY_0, static_cast<byte>(i), // --
1691 kExprEnd, // --
1692 kExprEnd, // --
1693 kExprEnd, // --
1694 kExprEnd, // --
1695 kExprEnd, // --
1696 kExprEnd // --
1697 };
1698 1814
1699 int depth = 6; 1815 int depth = 6;
1700 for (int l = 0; l < 6; l++) { 1816 int m = mask;
1701 if (mask & (1 << l)) { 1817 for (size_t pos = 0; pos < sizeof(code); pos++) {
1702 code[l] = kExprLoop; 1818 if (code[pos] != kExprBlock) continue;
1703 depth++; 1819 if (m & 1) {
1820 code[pos] = kExprLoop;
1821 code[pos + 1] = kLocalVoid;
1704 } 1822 }
1705 } 1823 m >>= 1;
1706 1824 }
1707 if (i < depth) { 1825
1708 EXPECT_VERIFIES(sigs.v_v(), code); 1826 if (i <= depth) {
1709 } else { 1827 EXPECT_VERIFIES_C(v_v, code);
1710 EXPECT_FAILURE(sigs.v_v(), code); 1828 } else {
1711 } 1829 EXPECT_FAILURE_C(v_v, code);
1712 } 1830 }
1713 } 1831 }
1714 } 1832 }
1715 1833 }
1716 TEST_F(AstDecoderTest, ExprBreak_TypeCheck) { 1834
1835 TEST_F(AstDecoderTest, Break_TypeCheck) {
1717 FunctionSig* sigarray[] = {sigs.i_i(), sigs.l_l(), sigs.f_ff(), sigs.d_dd()}; 1836 FunctionSig* sigarray[] = {sigs.i_i(), sigs.l_l(), sigs.f_ff(), sigs.d_dd()};
1718 for (size_t i = 0; i < arraysize(sigarray); i++) { 1837 for (size_t i = 0; i < arraysize(sigarray); i++) {
1719 FunctionSig* sig = sigarray[i]; 1838 FunctionSig* sig = sigarray[i];
1720 // unify X and X => OK 1839 // unify X and X => OK
1721 EXPECT_VERIFIES_INLINE( 1840 byte code[] = {WASM_BLOCK_T(
1722 sig, B2(WASM_IF(WASM_ZERO, WASM_BRV(0, WASM_GET_LOCAL(0))), 1841 sig->GetReturn(), WASM_IF(WASM_ZERO, WASM_BRV(0, WASM_GET_LOCAL(0))),
1723 WASM_GET_LOCAL(0))); 1842 WASM_GET_LOCAL(0))};
1843 EXPECT_VERIFIES_SC(sig, code);
1724 } 1844 }
1725 1845
1726 // unify i32 and f32 => fail 1846 // unify i32 and f32 => fail
1727 EXPECT_FAILURE_INLINE( 1847 EXPECT_FAILURE(i_i, WASM_BLOCK_I(WASM_IF(WASM_ZERO, WASM_BRV(0, WASM_ZERO)),
1728 sigs.i_i(), 1848 WASM_F32(1.2)));
1729 B2(WASM_IF(WASM_ZERO, WASM_BRV(0, WASM_ZERO)), WASM_F32(1.2)));
1730 1849
1731 // unify f64 and f64 => OK 1850 // unify f64 and f64 => OK
1732 EXPECT_VERIFIES_INLINE( 1851 EXPECT_VERIFIES(
1733 sigs.d_dd(), 1852 d_dd, WASM_BLOCK_D(WASM_IF(WASM_ZERO, WASM_BRV(0, WASM_GET_LOCAL(0))),
1734 B2(WASM_IF(WASM_ZERO, WASM_BRV(0, WASM_GET_LOCAL(0))), WASM_F64(1.2))); 1853 WASM_F64(1.2)));
1735 } 1854 }
1736 1855
1737 TEST_F(AstDecoderTest, ExprBreak_TypeCheckAll) { 1856 TEST_F(AstDecoderTest, Break_TypeCheckAll1) {
1738 byte code1[] = {WASM_BLOCK(WASM_IF(WASM_ZERO, WASM_BRV(0, WASM_GET_LOCAL(0))),
1739 WASM_GET_LOCAL(1))};
1740 byte code2[] = {B2(WASM_IF(WASM_ZERO, WASM_BRV_IF_ZERO(0, WASM_GET_LOCAL(0))),
1741 WASM_GET_LOCAL(1))};
1742
1743 for (size_t i = 0; i < arraysize(kLocalTypes); i++) { 1857 for (size_t i = 0; i < arraysize(kLocalTypes); i++) {
1744 for (size_t j = 0; j < arraysize(kLocalTypes); j++) { 1858 for (size_t j = 0; j < arraysize(kLocalTypes); j++) {
1745 LocalType storage[] = {kLocalTypes[i], kLocalTypes[i], kLocalTypes[j]}; 1859 LocalType storage[] = {kLocalTypes[i], kLocalTypes[i], kLocalTypes[j]};
1746 FunctionSig sig(1, 2, storage); 1860 FunctionSig sig(1, 2, storage);
1861 byte code[] = {WASM_BLOCK_T(
1862 sig.GetReturn(), WASM_IF(WASM_ZERO, WASM_BRV(0, WASM_GET_LOCAL(0))),
1863 WASM_GET_LOCAL(1))};
1747 1864
1748 if (i == j) { 1865 if (i == j) {
1749 EXPECT_VERIFIES(&sig, code1); 1866 EXPECT_VERIFIES_SC(&sig, code);
1750 EXPECT_VERIFIES(&sig, code2); 1867 } else {
1751 } else { 1868 EXPECT_FAILURE_SC(&sig, code);
1752 EXPECT_FAILURE(&sig, code1); 1869 }
1753 EXPECT_FAILURE(&sig, code2); 1870 }
1754 } 1871 }
1755 } 1872 }
1756 } 1873
1757 } 1874 TEST_F(AstDecoderTest, Break_TypeCheckAll2) {
1758 1875 for (size_t i = 0; i < arraysize(kLocalTypes); i++) {
1759 TEST_F(AstDecoderTest, ExprBr_Unify) { 1876 for (size_t j = 0; j < arraysize(kLocalTypes); j++) {
1877 LocalType storage[] = {kLocalTypes[i], kLocalTypes[i], kLocalTypes[j]};
1878 FunctionSig sig(1, 2, storage);
1879 byte code[] = {WASM_IF_ELSE_T(sig.GetReturn(0), WASM_ZERO,
1880 WASM_BRV_IF_ZERO(0, WASM_GET_LOCAL(0)),
1881 WASM_GET_LOCAL(1))};
1882
1883 if (i == j) {
1884 EXPECT_VERIFIES_SC(&sig, code);
1885 } else {
1886 EXPECT_FAILURE_SC(&sig, code);
1887 }
1888 }
1889 }
1890 }
1891
1892 TEST_F(AstDecoderTest, Break_TypeCheckAll3) {
1893 for (size_t i = 0; i < arraysize(kLocalTypes); i++) {
1894 for (size_t j = 0; j < arraysize(kLocalTypes); j++) {
1895 LocalType storage[] = {kLocalTypes[i], kLocalTypes[i], kLocalTypes[j]};
1896 FunctionSig sig(1, 2, storage);
1897 byte code[] = {WASM_IF_ELSE_T(sig.GetReturn(), WASM_ZERO,
1898 WASM_GET_LOCAL(1),
1899 WASM_BRV_IF_ZERO(0, WASM_GET_LOCAL(0)))};
1900
1901 if (i == j) {
1902 EXPECT_VERIFIES_SC(&sig, code);
1903 } else {
1904 EXPECT_FAILURE_SC(&sig, code);
1905 }
1906 }
1907 }
1908 }
1909
1910 TEST_F(AstDecoderTest, Break_Unify) {
1760 for (int which = 0; which < 2; which++) { 1911 for (int which = 0; which < 2; which++) {
1761 for (size_t i = 0; i < arraysize(kLocalTypes); i++) { 1912 for (size_t i = 0; i < arraysize(kLocalTypes); i++) {
1762 LocalType type = kLocalTypes[i]; 1913 LocalType type = kLocalTypes[i];
1763 LocalType storage[] = {kAstI32, kAstI32, type}; 1914 LocalType storage[] = {kAstI32, kAstI32, type};
1764 FunctionSig sig(1, 2, storage); 1915 FunctionSig sig(1, 2, storage);
1765 1916
1766 byte code1[] = {B2(WASM_IF(WASM_ZERO, WASM_BRV(1, WASM_GET_LOCAL(which))), 1917 byte code1[] = {WASM_BLOCK_T(
1767 WASM_GET_LOCAL(which ^ 1))}; 1918 type, WASM_IF(WASM_ZERO, WASM_BRV(1, WASM_GET_LOCAL(which))),
1768 byte code2[] = { 1919 WASM_GET_LOCAL(which ^ 1))};
1769 WASM_LOOP(WASM_IF(WASM_ZERO, WASM_BRV(2, WASM_GET_LOCAL(which))),
1770 WASM_GET_LOCAL(which ^ 1))};
1771 1920
1772 if (type == kAstI32) { 1921 if (type == kAstI32) {
1773 EXPECT_VERIFIES(&sig, code1); 1922 EXPECT_VERIFIES_SC(&sig, code1);
1774 EXPECT_VERIFIES(&sig, code2); 1923 } else {
1775 } else { 1924 EXPECT_FAILURE_SC(&sig, code1);
1776 EXPECT_FAILURE(&sig, code1); 1925 }
1777 EXPECT_FAILURE(&sig, code2); 1926 }
1778 } 1927 }
1779 } 1928 }
1780 } 1929
1781 } 1930 TEST_F(AstDecoderTest, BreakIf_cond_type) {
1782 1931 for (size_t i = 0; i < arraysize(kLocalTypes); i++) {
1783 TEST_F(AstDecoderTest, ExprBrIf_cond_type) { 1932 for (size_t j = 0; j < arraysize(kLocalTypes); j++) {
1784 byte code[] = {B1(WASM_BRV_IF(0, WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)))}; 1933 LocalType types[] = {kLocalTypes[i], kLocalTypes[i], kLocalTypes[j]};
1785 for (size_t i = 0; i < arraysize(kLocalTypes); i++) { 1934 FunctionSig sig(1, 2, types);
1786 for (size_t j = 0; j < arraysize(kLocalTypes); j++) { 1935 byte code[] = {WASM_BLOCK_T(
1787 LocalType types[] = {kLocalTypes[i], kLocalTypes[j]}; 1936 types[0], WASM_BRV_IF(0, WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)))};
1788 FunctionSig sig(0, 2, types); 1937
1789 1938 if (types[2] == kAstI32) {
1790 if (types[1] == kAstI32) { 1939 EXPECT_VERIFIES_SC(&sig, code);
1791 EXPECT_VERIFIES(&sig, code); 1940 } else {
1792 } else { 1941 EXPECT_FAILURE_SC(&sig, code);
1793 EXPECT_FAILURE(&sig, code); 1942 }
1794 } 1943 }
1795 } 1944 }
1796 } 1945 }
1797 } 1946
1798 1947 TEST_F(AstDecoderTest, BreakIf_val_type) {
1799 TEST_F(AstDecoderTest, ExprBrIf_val_type) {
1800 byte code[] = {B2(WASM_BRV_IF(0, WASM_GET_LOCAL(1), WASM_GET_LOCAL(2)),
1801 WASM_GET_LOCAL(0))};
1802 for (size_t i = 0; i < arraysize(kLocalTypes); i++) { 1948 for (size_t i = 0; i < arraysize(kLocalTypes); i++) {
1803 for (size_t j = 0; j < arraysize(kLocalTypes); j++) { 1949 for (size_t j = 0; j < arraysize(kLocalTypes); j++) {
1804 LocalType types[] = {kLocalTypes[i], kLocalTypes[i], kLocalTypes[j], 1950 LocalType types[] = {kLocalTypes[i], kLocalTypes[i], kLocalTypes[j],
1805 kAstI32}; 1951 kAstI32};
1806 FunctionSig sig(1, 3, types); 1952 FunctionSig sig(1, 3, types);
1953 byte code[] = {WASM_BLOCK_T(
1954 types[1], WASM_BRV_IF(0, WASM_GET_LOCAL(1), WASM_GET_LOCAL(2)),
1955 WASM_DROP, WASM_GET_LOCAL(0))};
1807 1956
1808 if (i == j) { 1957 if (i == j) {
1809 EXPECT_VERIFIES(&sig, code); 1958 EXPECT_VERIFIES_SC(&sig, code);
1810 } else { 1959 } else {
1811 EXPECT_FAILURE(&sig, code); 1960 EXPECT_FAILURE_SC(&sig, code);
1812 } 1961 }
1813 } 1962 }
1814 } 1963 }
1815 } 1964 }
1816 1965
1817 TEST_F(AstDecoderTest, ExprBrIf_Unify) { 1966 TEST_F(AstDecoderTest, BreakIf_Unify) {
1818 for (int which = 0; which < 2; which++) { 1967 for (int which = 0; which < 2; which++) {
1819 for (size_t i = 0; i < arraysize(kLocalTypes); i++) { 1968 for (size_t i = 0; i < arraysize(kLocalTypes); i++) {
1820 LocalType type = kLocalTypes[i]; 1969 LocalType type = kLocalTypes[i];
1821 LocalType storage[] = {kAstI32, kAstI32, type}; 1970 LocalType storage[] = {kAstI32, kAstI32, type};
1822 FunctionSig sig(1, 2, storage); 1971 FunctionSig sig(1, 2, storage);
1823 1972 byte code[] = {WASM_BLOCK_I(WASM_BRV_IF_ZERO(0, WASM_GET_LOCAL(which)),
1824 byte code1[] = {B2(WASM_BRV_IF_ZERO(0, WASM_GET_LOCAL(which)), 1973 WASM_DROP, WASM_GET_LOCAL(which ^ 1))};
1825 WASM_GET_LOCAL(which ^ 1))};
1826 byte code2[] = {WASM_LOOP(WASM_BRV_IF_ZERO(1, WASM_GET_LOCAL(which)),
1827 WASM_GET_LOCAL(which ^ 1))};
1828 1974
1829 if (type == kAstI32) { 1975 if (type == kAstI32) {
1830 EXPECT_VERIFIES(&sig, code1); 1976 EXPECT_VERIFIES_SC(&sig, code);
1831 EXPECT_VERIFIES(&sig, code2); 1977 } else {
1832 } else { 1978 EXPECT_FAILURE_SC(&sig, code);
1833 EXPECT_FAILURE(&sig, code1);
1834 EXPECT_FAILURE(&sig, code2);
1835 } 1979 }
1836 } 1980 }
1837 } 1981 }
1838 } 1982 }
1839 1983
1840 TEST_F(AstDecoderTest, BrTable0) { 1984 TEST_F(AstDecoderTest, BrTable0) {
1841 static byte code[] = {kExprNop, kExprBrTable, 0, 0}; 1985 static byte code[] = {kExprBrTable, 0, BR_TARGET(0)};
1842 EXPECT_FAILURE(sigs.v_v(), code); 1986 EXPECT_FAILURE_C(v_v, code);
1843 } 1987 }
1844 1988
1845 TEST_F(AstDecoderTest, BrTable0b) { 1989 TEST_F(AstDecoderTest, BrTable0b) {
1846 static byte code[] = {kExprNop, kExprI32Const, 11, kExprBrTable, 0, 0}; 1990 static byte code[] = {kExprI32Const, 11, kExprBrTable, 0, BR_TARGET(0)};
1847 EXPECT_FAILURE(sigs.v_v(), code); 1991 EXPECT_VERIFIES_C(v_v, code);
1848 EXPECT_FAILURE(sigs.i_i(), code); 1992 EXPECT_FAILURE_C(i_i, code);
1849 } 1993 }
1850 1994
1851 TEST_F(AstDecoderTest, BrTable0c) { 1995 TEST_F(AstDecoderTest, BrTable0c) {
1852 static byte code[] = {kExprNop, kExprI32Const, 11, kExprBrTable, 0, 1, 0, 0}; 1996 static byte code[] = {kExprI32Const, 11, kExprBrTable, 0, BR_TARGET(1)};
1853 EXPECT_FAILURE(sigs.v_v(), code); 1997 EXPECT_FAILURE_C(v_v, code);
1854 EXPECT_FAILURE(sigs.i_i(), code); 1998 EXPECT_FAILURE_C(i_i, code);
1855 } 1999 }
1856 2000
1857 TEST_F(AstDecoderTest, BrTable1a) { 2001 TEST_F(AstDecoderTest, BrTable1a) {
1858 static byte code[] = {B1(WASM_BR_TABLE(WASM_I8(67), 0, BR_TARGET(0)))}; 2002 static byte code[] = {B1(WASM_BR_TABLE(WASM_I8(67), 0, BR_TARGET(0)))};
1859 EXPECT_VERIFIES(sigs.v_v(), code); 2003 EXPECT_VERIFIES_C(v_v, code);
1860 } 2004 }
1861 2005
1862 TEST_F(AstDecoderTest, BrTable1b) { 2006 TEST_F(AstDecoderTest, BrTable1b) {
1863 static byte code[] = {B1(WASM_BR_TABLE(WASM_ZERO, 0, BR_TARGET(0)))}; 2007 static byte code[] = {B1(WASM_BR_TABLE(WASM_ZERO, 0, BR_TARGET(0)))};
1864 EXPECT_VERIFIES(sigs.v_v(), code); 2008 EXPECT_VERIFIES_C(v_v, code);
1865 EXPECT_FAILURE(sigs.i_i(), code); 2009 EXPECT_FAILURE_C(i_i, code);
1866 EXPECT_FAILURE(sigs.f_ff(), code); 2010 EXPECT_FAILURE_C(f_ff, code);
1867 EXPECT_FAILURE(sigs.d_dd(), code); 2011 EXPECT_FAILURE_C(d_dd, code);
1868 } 2012 }
1869 2013
1870 TEST_F(AstDecoderTest, BrTable2a) { 2014 TEST_F(AstDecoderTest, BrTable2a) {
1871 static byte code[] = { 2015 static byte code[] = {
1872 B1(WASM_BR_TABLE(WASM_I8(67), 1, BR_TARGET(0), BR_TARGET(0)))}; 2016 B1(WASM_BR_TABLE(WASM_I8(67), 1, BR_TARGET(0), BR_TARGET(0)))};
1873 EXPECT_VERIFIES(sigs.v_v(), code); 2017 EXPECT_VERIFIES_C(v_v, code);
1874 } 2018 }
1875 2019
1876 TEST_F(AstDecoderTest, BrTable2b) { 2020 TEST_F(AstDecoderTest, BrTable2b) {
1877 static byte code[] = {WASM_BLOCK( 2021 static byte code[] = {WASM_BLOCK(
1878 WASM_BLOCK(WASM_BR_TABLE(WASM_I8(67), 1, BR_TARGET(0), BR_TARGET(1))))}; 2022 WASM_BLOCK(WASM_BR_TABLE(WASM_I8(67), 1, BR_TARGET(0), BR_TARGET(1))))};
1879 EXPECT_VERIFIES(sigs.v_v(), code); 2023 EXPECT_VERIFIES_C(v_v, code);
1880 } 2024 }
1881 2025
1882 TEST_F(AstDecoderTest, BrTable_off_end) { 2026 TEST_F(AstDecoderTest, BrTable_off_end) {
1883 static byte code[] = {B1(WASM_BR_TABLE(WASM_GET_LOCAL(0), 0, BR_TARGET(0)))}; 2027 static byte code[] = {B1(WASM_BR_TABLE(WASM_GET_LOCAL(0), 0, BR_TARGET(0)))};
1884 for (size_t len = 1; len < sizeof(code); len++) { 2028 for (size_t len = 1; len < sizeof(code); len++) {
1885 Verify(kError, sigs.i_i(), code, code + len); 2029 Verify(kError, sigs.i_i(), code, code + len);
1886 } 2030 }
1887 } 2031 }
1888 2032
1889 TEST_F(AstDecoderTest, BrTable_invalid_br1) { 2033 TEST_F(AstDecoderTest, BrTable_invalid_br1) {
1890 for (int depth = 0; depth < 4; depth++) { 2034 for (int depth = 0; depth < 4; depth++) {
1891 byte code[] = {B1(WASM_BR_TABLE(WASM_GET_LOCAL(0), 0, BR_TARGET(depth)))}; 2035 byte code[] = {B1(WASM_BR_TABLE(WASM_GET_LOCAL(0), 0, BR_TARGET(depth)))};
1892 if (depth == 0) { 2036 if (depth <= 1) {
1893 EXPECT_VERIFIES(sigs.v_i(), code); 2037 EXPECT_VERIFIES_C(v_i, code);
1894 } else { 2038 } else {
1895 EXPECT_FAILURE(sigs.v_i(), code); 2039 EXPECT_FAILURE_C(v_i, code);
1896 } 2040 }
1897 } 2041 }
1898 } 2042 }
1899 2043
1900 TEST_F(AstDecoderTest, BrTable_invalid_br2) { 2044 TEST_F(AstDecoderTest, BrTable_invalid_br2) {
1901 for (int depth = 0; depth < 4; depth++) { 2045 for (int depth = 0; depth < 7; depth++) {
1902 byte code[] = { 2046 byte code[] = {
1903 WASM_LOOP(WASM_BR_TABLE(WASM_GET_LOCAL(0), 0, BR_TARGET(depth)))}; 2047 WASM_LOOP(WASM_BR_TABLE(WASM_GET_LOCAL(0), 0, BR_TARGET(depth)))};
1904 if (depth <= 1) { 2048 if (depth < 2) {
1905 EXPECT_VERIFIES(sigs.v_i(), code); 2049 EXPECT_VERIFIES_C(v_i, code);
1906 } else { 2050 } else {
1907 EXPECT_FAILURE(sigs.v_i(), code); 2051 EXPECT_FAILURE_C(v_i, code);
1908 } 2052 }
1909 } 2053 }
1910 } 2054 }
1911 2055
1912 TEST_F(AstDecoderTest, ExprBreakNesting1) { 2056 TEST_F(AstDecoderTest, Brv1) {
1913 EXPECT_VERIFIES_INLINE(sigs.v_v(), B1(WASM_BRV(0, WASM_ZERO))); 2057 EXPECT_VERIFIES(i_i, WASM_BLOCK_I(WASM_BRV(0, WASM_ZERO)));
1914 EXPECT_VERIFIES_INLINE(sigs.v_v(), B1(WASM_BR(0))); 2058 EXPECT_VERIFIES(i_i, WASM_BLOCK_I(WASM_LOOP(WASM_BRV(2, WASM_ZERO))));
1915 EXPECT_VERIFIES_INLINE(sigs.v_v(), B1(WASM_BRV_IF(0, WASM_ZERO, WASM_ZERO))); 2059 }
1916 EXPECT_VERIFIES_INLINE(sigs.v_v(), B1(WASM_BR_IF(0, WASM_ZERO)));
1917 2060
1918 EXPECT_VERIFIES_INLINE(sigs.v_v(), WASM_LOOP(WASM_BRV(0, WASM_ZERO))); 2061 TEST_F(AstDecoderTest, Brv1_type) {
1919 EXPECT_VERIFIES_INLINE(sigs.v_v(), WASM_LOOP(WASM_BR(0))); 2062 EXPECT_VERIFIES(i_ii, WASM_BLOCK_I(WASM_BRV(0, WASM_GET_LOCAL(0))));
1920 EXPECT_VERIFIES_INLINE(sigs.v_v(), 2063 EXPECT_VERIFIES(l_ll, WASM_BLOCK_L(WASM_BRV(0, WASM_GET_LOCAL(0))));
1921 WASM_LOOP(WASM_BRV_IF(0, WASM_ZERO, WASM_ZERO))); 2064 EXPECT_VERIFIES(f_ff, WASM_BLOCK_F(WASM_BRV(0, WASM_GET_LOCAL(0))));
1922 EXPECT_VERIFIES_INLINE(sigs.v_v(), WASM_LOOP(WASM_BR_IF(0, WASM_ZERO))); 2065 EXPECT_VERIFIES(d_dd, WASM_BLOCK_D(WASM_BRV(0, WASM_GET_LOCAL(0))));
2066 }
1923 2067
1924 EXPECT_VERIFIES_INLINE(sigs.v_v(), WASM_LOOP(WASM_BRV(1, WASM_ZERO))); 2068 TEST_F(AstDecoderTest, Brv1_type_n) {
1925 EXPECT_VERIFIES_INLINE(sigs.v_v(), WASM_LOOP(WASM_BR(1))); 2069 EXPECT_FAILURE(i_f, WASM_BLOCK_I(WASM_BRV(0, WASM_GET_LOCAL(0))));
2070 EXPECT_FAILURE(i_d, WASM_BLOCK_I(WASM_BRV(0, WASM_GET_LOCAL(0))));
2071 }
2072
2073 TEST_F(AstDecoderTest, BrvIf1) {
2074 EXPECT_VERIFIES(i_v, WASM_BLOCK_I(WASM_BRV_IF_ZERO(0, WASM_ZERO)));
2075 }
2076
2077 TEST_F(AstDecoderTest, BrvIf1_type) {
2078 EXPECT_VERIFIES(i_i, WASM_BLOCK_I(WASM_BRV_IF_ZERO(0, WASM_GET_LOCAL(0))));
2079 EXPECT_VERIFIES(l_l, WASM_BLOCK_L(WASM_BRV_IF_ZERO(0, WASM_GET_LOCAL(0))));
2080 EXPECT_VERIFIES(f_ff, WASM_BLOCK_F(WASM_BRV_IF_ZERO(0, WASM_GET_LOCAL(0))));
2081 EXPECT_VERIFIES(d_dd, WASM_BLOCK_D(WASM_BRV_IF_ZERO(0, WASM_GET_LOCAL(0))));
2082 }
2083
2084 TEST_F(AstDecoderTest, BrvIf1_type_n) {
2085 EXPECT_FAILURE(i_f, WASM_BLOCK_I(WASM_BRV_IF_ZERO(0, WASM_GET_LOCAL(0))));
2086 EXPECT_FAILURE(i_d, WASM_BLOCK_I(WASM_BRV_IF_ZERO(0, WASM_GET_LOCAL(0))));
1926 } 2087 }
1927 2088
1928 TEST_F(AstDecoderTest, Select) { 2089 TEST_F(AstDecoderTest, Select) {
1929 EXPECT_VERIFIES_INLINE( 2090 EXPECT_VERIFIES(i_i,
1930 sigs.i_i(), WASM_SELECT(WASM_GET_LOCAL(0), WASM_GET_LOCAL(0), WASM_ZERO)); 2091 WASM_SELECT(WASM_GET_LOCAL(0), WASM_GET_LOCAL(0), WASM_ZERO));
1931 EXPECT_VERIFIES_INLINE(sigs.f_ff(), 2092 EXPECT_VERIFIES(f_ff, WASM_SELECT(WASM_F32(0.0), WASM_F32(0.0), WASM_ZERO));
1932 WASM_SELECT(WASM_F32(0.0), WASM_F32(0.0), WASM_ZERO)); 2093 EXPECT_VERIFIES(d_dd, WASM_SELECT(WASM_F64(0.0), WASM_F64(0.0), WASM_ZERO));
1933 EXPECT_VERIFIES_INLINE(sigs.d_dd(), 2094 EXPECT_VERIFIES(l_l, WASM_SELECT(WASM_I64V_1(0), WASM_I64V_1(0), WASM_ZERO));
1934 WASM_SELECT(WASM_F64(0.0), WASM_F64(0.0), WASM_ZERO));
1935 EXPECT_VERIFIES_INLINE(
1936 sigs.l_l(), WASM_SELECT(WASM_I64V_1(0), WASM_I64V_1(0), WASM_ZERO));
1937 } 2095 }
1938 2096
1939 TEST_F(AstDecoderTest, Select_fail1) { 2097 TEST_F(AstDecoderTest, Select_fail1) {
1940 EXPECT_FAILURE_INLINE( 2098 EXPECT_FAILURE(
1941 sigs.i_i(), 2099 i_i, WASM_SELECT(WASM_F32(0.0), WASM_GET_LOCAL(0), WASM_GET_LOCAL(0)));
1942 WASM_SELECT(WASM_F32(0.0), WASM_GET_LOCAL(0), WASM_GET_LOCAL(0))); 2100 EXPECT_FAILURE(
1943 EXPECT_FAILURE_INLINE( 2101 i_i, WASM_SELECT(WASM_GET_LOCAL(0), WASM_F32(0.0), WASM_GET_LOCAL(0)));
1944 sigs.i_i(), 2102 EXPECT_FAILURE(
1945 WASM_SELECT(WASM_GET_LOCAL(0), WASM_F32(0.0), WASM_GET_LOCAL(0))); 2103 i_i, WASM_SELECT(WASM_GET_LOCAL(0), WASM_GET_LOCAL(0), WASM_F32(0.0)));
1946 EXPECT_FAILURE_INLINE(
1947 sigs.i_i(),
1948 WASM_SELECT(WASM_GET_LOCAL(0), WASM_GET_LOCAL(0), WASM_F32(0.0)));
1949 } 2104 }
1950 2105
1951 TEST_F(AstDecoderTest, Select_fail2) { 2106 TEST_F(AstDecoderTest, Select_fail2) {
1952 for (size_t i = 0; i < arraysize(kLocalTypes); i++) { 2107 for (size_t i = 0; i < arraysize(kLocalTypes); i++) {
1953 LocalType type = kLocalTypes[i]; 2108 LocalType type = kLocalTypes[i];
1954 if (type == kAstI32) continue; 2109 if (type == kAstI32) continue;
1955 2110
1956 LocalType types[] = {type, kAstI32, type}; 2111 LocalType types[] = {type, kAstI32, type};
1957 FunctionSig sig(1, 2, types); 2112 FunctionSig sig(1, 2, types);
1958 2113
1959 EXPECT_VERIFIES_INLINE( 2114 EXPECT_VERIFIES_S(&sig, WASM_SELECT(WASM_GET_LOCAL(1), WASM_GET_LOCAL(1),
1960 &sig, 2115 WASM_GET_LOCAL(0)));
1961 WASM_SELECT(WASM_GET_LOCAL(1), WASM_GET_LOCAL(1), WASM_GET_LOCAL(0)));
1962 2116
1963 EXPECT_FAILURE_INLINE( 2117 EXPECT_FAILURE_S(&sig, WASM_SELECT(WASM_GET_LOCAL(1), WASM_GET_LOCAL(0),
1964 &sig, 2118 WASM_GET_LOCAL(0)));
1965 WASM_SELECT(WASM_GET_LOCAL(1), WASM_GET_LOCAL(0), WASM_GET_LOCAL(0)));
1966 2119
1967 EXPECT_FAILURE_INLINE( 2120 EXPECT_FAILURE_S(&sig, WASM_SELECT(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1),
1968 &sig, 2121 WASM_GET_LOCAL(0)));
1969 WASM_SELECT(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1), WASM_GET_LOCAL(0)));
1970 2122
1971 EXPECT_FAILURE_INLINE( 2123 EXPECT_FAILURE_S(&sig, WASM_SELECT(WASM_GET_LOCAL(0), WASM_GET_LOCAL(0),
1972 &sig, 2124 WASM_GET_LOCAL(1)));
1973 WASM_SELECT(WASM_GET_LOCAL(0), WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
1974 } 2125 }
1975 } 2126 }
1976 2127
1977 TEST_F(AstDecoderTest, Select_TypeCheck) { 2128 TEST_F(AstDecoderTest, Select_TypeCheck) {
1978 EXPECT_FAILURE_INLINE( 2129 EXPECT_FAILURE(
1979 sigs.i_i(), 2130 i_i, WASM_SELECT(WASM_F32(9.9), WASM_GET_LOCAL(0), WASM_GET_LOCAL(0)));
1980 WASM_SELECT(WASM_F32(9.9), WASM_GET_LOCAL(0), WASM_GET_LOCAL(0)));
1981 2131
1982 EXPECT_FAILURE_INLINE( 2132 EXPECT_FAILURE(
1983 sigs.i_i(), 2133 i_i, WASM_SELECT(WASM_GET_LOCAL(0), WASM_F64(0.25), WASM_GET_LOCAL(0)));
1984 WASM_SELECT(WASM_GET_LOCAL(0), WASM_F64(0.25), WASM_GET_LOCAL(0)));
1985 2134
1986 EXPECT_FAILURE_INLINE( 2135 EXPECT_FAILURE(i_i,
1987 sigs.i_i(), 2136 WASM_SELECT(WASM_F32(9.9), WASM_GET_LOCAL(0), WASM_I64V_1(0)));
1988 WASM_SELECT(WASM_F32(9.9), WASM_GET_LOCAL(0), WASM_I64V_1(0)));
1989 } 2137 }
1990 2138
1991 TEST_F(AstDecoderTest, Throw) { 2139 TEST_F(AstDecoderTest, Throw) {
1992 FLAG_wasm_eh_prototype = true; 2140 FLAG_wasm_eh_prototype = true;
1993 EXPECT_VERIFIES_INLINE(sigs.v_i(), WASM_GET_LOCAL(0), kExprThrow); 2141 EXPECT_VERIFIES(v_i, WASM_GET_LOCAL(0), kExprThrow);
1994 2142
1995 EXPECT_FAILURE_INLINE(sigs.i_d(), WASM_GET_LOCAL(0), kExprThrow, 2143 EXPECT_FAILURE(i_d, WASM_GET_LOCAL(0), kExprThrow, WASM_I32V(0));
1996 WASM_I32V(0)); 2144 EXPECT_FAILURE(i_f, WASM_GET_LOCAL(0), kExprThrow, WASM_I32V(0));
1997 EXPECT_FAILURE_INLINE(sigs.i_f(), WASM_GET_LOCAL(0), kExprThrow, 2145 EXPECT_FAILURE(l_l, WASM_GET_LOCAL(0), kExprThrow, WASM_I64V(0));
1998 WASM_I32V(0));
1999 EXPECT_FAILURE_INLINE(sigs.l_l(), WASM_GET_LOCAL(0), kExprThrow,
2000 WASM_I64V(0));
2001 } 2146 }
2002 2147
2148 #define WASM_TRY_OP kExprTry, kLocalVoid
2149
2003 #define WASM_CATCH(local) kExprCatch, static_cast<byte>(local) 2150 #define WASM_CATCH(local) kExprCatch, static_cast<byte>(local)
2151
2004 TEST_F(AstDecoderTest, TryCatch) { 2152 TEST_F(AstDecoderTest, TryCatch) {
2005 FLAG_wasm_eh_prototype = true; 2153 FLAG_wasm_eh_prototype = true;
2006 EXPECT_VERIFIES_INLINE(sigs.v_i(), kExprTry, WASM_CATCH(0), kExprEnd); 2154 EXPECT_VERIFIES(v_i, WASM_TRY_OP, WASM_CATCH(0), kExprEnd);
2007 2155
2008 // Missing catch. 2156 // Missing catch.
2009 EXPECT_FAILURE_INLINE(sigs.v_v(), kExprTry, kExprEnd); 2157 EXPECT_FAILURE(v_v, WASM_TRY_OP, kExprEnd);
2010 2158
2011 // Missing end. 2159 // Missing end.
2012 EXPECT_FAILURE_INLINE(sigs.v_i(), kExprTry, WASM_CATCH(0)); 2160 EXPECT_FAILURE(v_i, WASM_TRY_OP, WASM_CATCH(0));
2013 2161
2014 // Double catch. 2162 // Double catch.
2015 EXPECT_FAILURE_INLINE(sigs.v_i(), kExprTry, WASM_CATCH(0), WASM_CATCH(0), 2163 EXPECT_FAILURE(v_i, WASM_TRY_OP, WASM_CATCH(0), WASM_CATCH(0), kExprEnd);
2016 kExprEnd); 2164 }
2165
2166 TEST_F(AstDecoderTest, MultiValBlock1) {
2167 FLAG_wasm_mv_prototype = true;
2168 EXPECT_VERIFIES(i_ii, WASM_BLOCK_TT(kAstI32, kAstI32, WASM_GET_LOCAL(0),
2169 WASM_GET_LOCAL(1)),
2170 kExprI32Add);
2171 }
2172
2173 TEST_F(AstDecoderTest, MultiValBlock2) {
2174 FLAG_wasm_mv_prototype = true;
2175 EXPECT_VERIFIES(i_ii, WASM_BLOCK_TT(kAstI32, kAstI32, WASM_GET_LOCAL(0),
2176 WASM_GET_LOCAL(1)),
2177 WASM_I32_ADD(WASM_NOP, WASM_NOP));
2178 }
2179
2180 TEST_F(AstDecoderTest, MultiValBlockBr1) {
2181 FLAG_wasm_mv_prototype = true;
2182 EXPECT_FAILURE(i_ii,
2183 WASM_BLOCK_TT(kAstI32, kAstI32, WASM_GET_LOCAL(0), WASM_BR(0)),
2184 kExprI32Add);
2185 EXPECT_VERIFIES(i_ii, WASM_BLOCK_TT(kAstI32, kAstI32, WASM_GET_LOCAL(0),
2186 WASM_GET_LOCAL(1), WASM_BR(0)),
2187 kExprI32Add);
2188 }
2189
2190 TEST_F(AstDecoderTest, MultiValIf1) {
2191 FLAG_wasm_mv_prototype = true;
2192 EXPECT_FAILURE(
2193 i_ii, WASM_IF_ELSE_TT(kAstI32, kAstI32, WASM_GET_LOCAL(0),
2194 WASM_SEQ(WASM_GET_LOCAL(0)),
2195 WASM_SEQ(WASM_GET_LOCAL(1), WASM_GET_LOCAL(0))),
2196 kExprI32Add);
2197 EXPECT_FAILURE(i_ii,
2198 WASM_IF_ELSE_TT(kAstI32, kAstI32, WASM_GET_LOCAL(0),
2199 WASM_SEQ(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)),
2200 WASM_SEQ(WASM_GET_LOCAL(1))),
2201 kExprI32Add);
2202 EXPECT_VERIFIES(
2203 i_ii, WASM_IF_ELSE_TT(kAstI32, kAstI32, WASM_GET_LOCAL(0),
2204 WASM_SEQ(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)),
2205 WASM_SEQ(WASM_GET_LOCAL(1), WASM_GET_LOCAL(0))),
2206 kExprI32Add);
2207 }
2208
2209 class BranchTableIteratorTest : public TestWithZone {
2210 public:
2211 BranchTableIteratorTest() : TestWithZone() {}
2212 void CheckBrTableSize(const byte* start, const byte* end) {
2213 Decoder decoder(start, end);
2214 BranchTableOperand operand(&decoder, start);
2215 BranchTableIterator iterator(&decoder, operand);
2216 EXPECT_EQ(end - start - 1, iterator.length());
2217 EXPECT_TRUE(decoder.ok());
2218 }
2219 void CheckBrTableError(const byte* start, const byte* end) {
2220 Decoder decoder(start, end);
2221 BranchTableOperand operand(&decoder, start);
2222 BranchTableIterator iterator(&decoder, operand);
2223 iterator.length();
2224 EXPECT_FALSE(decoder.ok());
2225 }
2226 };
2227
2228 #define CHECK_BR_TABLE_LENGTH(...) \
2229 { \
2230 static byte code[] = {kExprBrTable, __VA_ARGS__}; \
2231 CheckBrTableSize(code, code + sizeof(code)); \
2232 }
2233
2234 #define CHECK_BR_TABLE_ERROR(...) \
2235 { \
2236 static byte code[] = {kExprBrTable, __VA_ARGS__}; \
2237 CheckBrTableError(code, code + sizeof(code)); \
2238 }
2239
2240 TEST_F(BranchTableIteratorTest, count0) {
2241 CHECK_BR_TABLE_LENGTH(0, U32V_1(1));
2242 CHECK_BR_TABLE_LENGTH(0, U32V_2(200));
2243 CHECK_BR_TABLE_LENGTH(0, U32V_3(30000));
2244 CHECK_BR_TABLE_LENGTH(0, U32V_4(400000));
2245
2246 CHECK_BR_TABLE_LENGTH(0, U32V_1(2));
2247 CHECK_BR_TABLE_LENGTH(0, U32V_2(300));
2248 CHECK_BR_TABLE_LENGTH(0, U32V_3(40000));
2249 CHECK_BR_TABLE_LENGTH(0, U32V_4(500000));
2250 }
2251
2252 TEST_F(BranchTableIteratorTest, count1) {
2253 CHECK_BR_TABLE_LENGTH(1, U32V_1(1), U32V_1(6));
2254 CHECK_BR_TABLE_LENGTH(1, U32V_2(200), U32V_1(8));
2255 CHECK_BR_TABLE_LENGTH(1, U32V_3(30000), U32V_1(9));
2256 CHECK_BR_TABLE_LENGTH(1, U32V_4(400000), U32V_1(11));
2257
2258 CHECK_BR_TABLE_LENGTH(1, U32V_1(2), U32V_2(6));
2259 CHECK_BR_TABLE_LENGTH(1, U32V_2(300), U32V_2(7));
2260 CHECK_BR_TABLE_LENGTH(1, U32V_3(40000), U32V_2(8));
2261 CHECK_BR_TABLE_LENGTH(1, U32V_4(500000), U32V_2(9));
2262 }
2263
2264 TEST_F(BranchTableIteratorTest, error0) {
2265 CHECK_BR_TABLE_ERROR(0);
2266 CHECK_BR_TABLE_ERROR(1, U32V_1(33));
2017 } 2267 }
2018 2268
2019 class WasmOpcodeLengthTest : public TestWithZone { 2269 class WasmOpcodeLengthTest : public TestWithZone {
2020 public: 2270 public:
2021 WasmOpcodeLengthTest() : TestWithZone() {} 2271 WasmOpcodeLengthTest() : TestWithZone() {}
2022 }; 2272 };
2023 2273
2024 #define EXPECT_LENGTH(expected, opcode) \ 2274 #define EXPECT_LENGTH(expected, opcode) \
2025 { \ 2275 { \
2026 static const byte code[] = {opcode, 0, 0, 0, 0, 0, 0, 0, 0}; \ 2276 static const byte code[] = {opcode, 0, 0, 0, 0, 0, 0, 0, 0}; \
2027 EXPECT_EQ(expected, OpcodeLength(code, code + sizeof(code))); \ 2277 EXPECT_EQ(expected, OpcodeLength(code, code + sizeof(code))); \
2028 } 2278 }
2029 2279
2030 #define EXPECT_LENGTH_N(expected, ...) \ 2280 #define EXPECT_LENGTH_N(expected, ...) \
2031 { \ 2281 { \
2032 static const byte code[] = {__VA_ARGS__}; \ 2282 static const byte code[] = {__VA_ARGS__}; \
2033 EXPECT_EQ(expected, OpcodeLength(code, code + sizeof(code))); \ 2283 EXPECT_EQ(expected, OpcodeLength(code, code + sizeof(code))); \
2034 } 2284 }
2035 2285
2036 TEST_F(WasmOpcodeLengthTest, Statements) { 2286 TEST_F(WasmOpcodeLengthTest, Statements) {
2037 EXPECT_LENGTH(1, kExprNop); 2287 EXPECT_LENGTH(1, kExprNop);
2038 EXPECT_LENGTH(1, kExprBlock); 2288 EXPECT_LENGTH(2, kExprBlock);
2039 EXPECT_LENGTH(1, kExprLoop); 2289 EXPECT_LENGTH(2, kExprLoop);
2040 EXPECT_LENGTH(1, kExprIf); 2290 EXPECT_LENGTH(2, kExprIf);
2041 EXPECT_LENGTH(1, kExprElse); 2291 EXPECT_LENGTH(1, kExprElse);
2042 EXPECT_LENGTH(1, kExprEnd); 2292 EXPECT_LENGTH(1, kExprEnd);
2043 EXPECT_LENGTH(1, kExprSelect); 2293 EXPECT_LENGTH(1, kExprSelect);
2044 EXPECT_LENGTH(3, kExprBr); 2294 EXPECT_LENGTH(2, kExprBr);
2045 EXPECT_LENGTH(3, kExprBrIf); 2295 EXPECT_LENGTH(2, kExprBrIf);
2046 EXPECT_LENGTH(1, kExprThrow); 2296 EXPECT_LENGTH(1, kExprThrow);
2047 EXPECT_LENGTH(1, kExprTry); 2297 EXPECT_LENGTH(2, kExprTry);
2048 EXPECT_LENGTH(2, kExprCatch); 2298 EXPECT_LENGTH(2, kExprCatch);
2049 } 2299 }
2050 2300
2051 TEST_F(WasmOpcodeLengthTest, MiscExpressions) { 2301 TEST_F(WasmOpcodeLengthTest, MiscExpressions) {
2052 EXPECT_LENGTH(2, kExprI8Const); 2302 EXPECT_LENGTH(2, kExprI8Const);
2053 EXPECT_LENGTH(5, kExprF32Const); 2303 EXPECT_LENGTH(5, kExprF32Const);
2054 EXPECT_LENGTH(9, kExprF64Const); 2304 EXPECT_LENGTH(9, kExprF64Const);
2055 EXPECT_LENGTH(2, kExprGetLocal); 2305 EXPECT_LENGTH(2, kExprGetLocal);
2056 EXPECT_LENGTH(2, kExprSetLocal); 2306 EXPECT_LENGTH(2, kExprSetLocal);
2057 EXPECT_LENGTH(2, kExprGetGlobal); 2307 EXPECT_LENGTH(2, kExprGetGlobal);
2058 EXPECT_LENGTH(2, kExprSetGlobal); 2308 EXPECT_LENGTH(2, kExprSetGlobal);
2059 EXPECT_LENGTH(3, kExprCallFunction); 2309 EXPECT_LENGTH(2, kExprCallFunction);
2060 EXPECT_LENGTH(3, kExprCallImport); 2310 EXPECT_LENGTH(2, kExprCallIndirect);
2061 EXPECT_LENGTH(3, kExprCallIndirect);
2062 EXPECT_LENGTH(1, kExprIf);
2063 EXPECT_LENGTH(1, kExprBlock);
2064 EXPECT_LENGTH(1, kExprLoop);
2065 EXPECT_LENGTH(3, kExprBr);
2066 EXPECT_LENGTH(3, kExprBrIf);
2067 } 2311 }
2068 2312
2069 TEST_F(WasmOpcodeLengthTest, I32Const) { 2313 TEST_F(WasmOpcodeLengthTest, I32Const) {
2070 EXPECT_LENGTH_N(2, kExprI32Const, U32V_1(1)); 2314 EXPECT_LENGTH_N(2, kExprI32Const, U32V_1(1));
2071 EXPECT_LENGTH_N(3, kExprI32Const, U32V_2(999)); 2315 EXPECT_LENGTH_N(3, kExprI32Const, U32V_2(999));
2072 EXPECT_LENGTH_N(4, kExprI32Const, U32V_3(9999)); 2316 EXPECT_LENGTH_N(4, kExprI32Const, U32V_3(9999));
2073 EXPECT_LENGTH_N(5, kExprI32Const, U32V_4(999999)); 2317 EXPECT_LENGTH_N(5, kExprI32Const, U32V_4(999999));
2074 EXPECT_LENGTH_N(6, kExprI32Const, U32V_5(99999999)); 2318 EXPECT_LENGTH_N(6, kExprI32Const, U32V_5(99999999));
2075 } 2319 }
2076 2320
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after
2240 EXPECT_LENGTH(1, kExprF64SConvertI32); 2484 EXPECT_LENGTH(1, kExprF64SConvertI32);
2241 EXPECT_LENGTH(1, kExprF64UConvertI32); 2485 EXPECT_LENGTH(1, kExprF64UConvertI32);
2242 EXPECT_LENGTH(1, kExprF64SConvertI64); 2486 EXPECT_LENGTH(1, kExprF64SConvertI64);
2243 EXPECT_LENGTH(1, kExprF64UConvertI64); 2487 EXPECT_LENGTH(1, kExprF64UConvertI64);
2244 EXPECT_LENGTH(1, kExprF64ConvertF32); 2488 EXPECT_LENGTH(1, kExprF64ConvertF32);
2245 EXPECT_LENGTH(1, kExprF64ReinterpretI64); 2489 EXPECT_LENGTH(1, kExprF64ReinterpretI64);
2246 EXPECT_LENGTH(1, kExprI32ReinterpretF32); 2490 EXPECT_LENGTH(1, kExprI32ReinterpretF32);
2247 EXPECT_LENGTH(1, kExprI64ReinterpretF64); 2491 EXPECT_LENGTH(1, kExprI64ReinterpretF64);
2248 } 2492 }
2249 2493
2250 class WasmOpcodeArityTest : public TestWithZone {
2251 public:
2252 WasmOpcodeArityTest() : TestWithZone() {}
2253 };
2254
2255 #define EXPECT_ARITY(expected, ...) \
2256 { \
2257 static const byte code[] = {__VA_ARGS__}; \
2258 EXPECT_EQ(expected, OpcodeArity(code, code + sizeof(code))); \
2259 }
2260
2261 TEST_F(WasmOpcodeArityTest, Control) {
2262 EXPECT_ARITY(0, kExprNop);
2263
2264 EXPECT_ARITY(0, kExprBlock, 0);
2265 EXPECT_ARITY(0, kExprBlock, 1);
2266 EXPECT_ARITY(0, kExprBlock, 2);
2267 EXPECT_ARITY(0, kExprBlock, 5);
2268 EXPECT_ARITY(0, kExprBlock, 10);
2269
2270 EXPECT_ARITY(0, kExprLoop, 0);
2271 EXPECT_ARITY(0, kExprLoop, 1);
2272 EXPECT_ARITY(0, kExprLoop, 2);
2273 EXPECT_ARITY(0, kExprLoop, 7);
2274 EXPECT_ARITY(0, kExprLoop, 11);
2275
2276 EXPECT_ARITY(3, kExprSelect);
2277
2278 EXPECT_ARITY(0, kExprBr);
2279 EXPECT_ARITY(1, kExprBrIf);
2280 EXPECT_ARITY(1, kExprBrTable);
2281
2282 EXPECT_ARITY(1, kExprBr, ARITY_1);
2283 EXPECT_ARITY(2, kExprBrIf, ARITY_1);
2284 EXPECT_ARITY(2, kExprBrTable, ARITY_1);
2285
2286 {
2287 EXPECT_ARITY(0, kExprReturn, ARITY_0);
2288 EXPECT_ARITY(1, kExprReturn, ARITY_1);
2289 }
2290
2291 EXPECT_ARITY(0, kExprThrow);
2292 EXPECT_ARITY(0, kExprTry);
2293 EXPECT_ARITY(1, kExprCatch, 2);
2294 }
2295
2296 TEST_F(WasmOpcodeArityTest, Misc) {
2297 EXPECT_ARITY(0, kExprI8Const);
2298 EXPECT_ARITY(0, kExprI32Const);
2299 EXPECT_ARITY(0, kExprF32Const);
2300 EXPECT_ARITY(0, kExprI64Const);
2301 EXPECT_ARITY(0, kExprF64Const);
2302 EXPECT_ARITY(0, kExprGetLocal);
2303 EXPECT_ARITY(1, kExprSetLocal);
2304 EXPECT_ARITY(0, kExprGetGlobal);
2305 EXPECT_ARITY(1, kExprSetGlobal);
2306 }
2307
2308 TEST_F(WasmOpcodeArityTest, Calls) {
2309 {
2310 EXPECT_ARITY(2, kExprCallFunction, 2, 0);
2311 EXPECT_ARITY(2, kExprCallImport, 2, 0);
2312 EXPECT_ARITY(3, kExprCallIndirect, 2, 0);
2313
2314 EXPECT_ARITY(1, kExprBr, ARITY_1);
2315 EXPECT_ARITY(2, kExprBrIf, ARITY_1);
2316 EXPECT_ARITY(2, kExprBrTable, ARITY_1);
2317
2318 EXPECT_ARITY(0, kExprBr, ARITY_0);
2319 EXPECT_ARITY(1, kExprBrIf, ARITY_0);
2320 EXPECT_ARITY(1, kExprBrTable, ARITY_0);
2321 }
2322
2323 {
2324 EXPECT_ARITY(1, kExprCallFunction, ARITY_1, 1);
2325 EXPECT_ARITY(1, kExprCallImport, ARITY_1, 1);
2326 EXPECT_ARITY(2, kExprCallIndirect, ARITY_1, 1);
2327
2328 EXPECT_ARITY(1, kExprBr, ARITY_1);
2329 EXPECT_ARITY(2, kExprBrIf, ARITY_1);
2330 EXPECT_ARITY(2, kExprBrTable, ARITY_1);
2331
2332 EXPECT_ARITY(0, kExprBr, ARITY_0);
2333 EXPECT_ARITY(1, kExprBrIf, ARITY_0);
2334 EXPECT_ARITY(1, kExprBrTable, ARITY_0);
2335 }
2336 }
2337
2338 TEST_F(WasmOpcodeArityTest, LoadsAndStores) {
2339 EXPECT_ARITY(1, kExprI32LoadMem8S);
2340 EXPECT_ARITY(1, kExprI32LoadMem8U);
2341 EXPECT_ARITY(1, kExprI32LoadMem16S);
2342 EXPECT_ARITY(1, kExprI32LoadMem16U);
2343 EXPECT_ARITY(1, kExprI32LoadMem);
2344
2345 EXPECT_ARITY(1, kExprI64LoadMem8S);
2346 EXPECT_ARITY(1, kExprI64LoadMem8U);
2347 EXPECT_ARITY(1, kExprI64LoadMem16S);
2348 EXPECT_ARITY(1, kExprI64LoadMem16U);
2349 EXPECT_ARITY(1, kExprI64LoadMem32S);
2350 EXPECT_ARITY(1, kExprI64LoadMem32U);
2351 EXPECT_ARITY(1, kExprI64LoadMem);
2352 EXPECT_ARITY(1, kExprF32LoadMem);
2353 EXPECT_ARITY(1, kExprF64LoadMem);
2354
2355 EXPECT_ARITY(2, kExprI32StoreMem8);
2356 EXPECT_ARITY(2, kExprI32StoreMem16);
2357 EXPECT_ARITY(2, kExprI32StoreMem);
2358 EXPECT_ARITY(2, kExprI64StoreMem8);
2359 EXPECT_ARITY(2, kExprI64StoreMem16);
2360 EXPECT_ARITY(2, kExprI64StoreMem32);
2361 EXPECT_ARITY(2, kExprI64StoreMem);
2362 EXPECT_ARITY(2, kExprF32StoreMem);
2363 EXPECT_ARITY(2, kExprF64StoreMem);
2364 }
2365
2366 TEST_F(WasmOpcodeArityTest, MiscMemExpressions) {
2367 EXPECT_ARITY(0, kExprMemorySize);
2368 EXPECT_ARITY(1, kExprGrowMemory);
2369 }
2370
2371 TEST_F(WasmOpcodeArityTest, SimpleExpressions) {
2372 EXPECT_ARITY(2, kExprI32Add);
2373 EXPECT_ARITY(2, kExprI32Sub);
2374 EXPECT_ARITY(2, kExprI32Mul);
2375 EXPECT_ARITY(2, kExprI32DivS);
2376 EXPECT_ARITY(2, kExprI32DivU);
2377 EXPECT_ARITY(2, kExprI32RemS);
2378 EXPECT_ARITY(2, kExprI32RemU);
2379 EXPECT_ARITY(2, kExprI32And);
2380 EXPECT_ARITY(2, kExprI32Ior);
2381 EXPECT_ARITY(2, kExprI32Xor);
2382 EXPECT_ARITY(2, kExprI32Shl);
2383 EXPECT_ARITY(2, kExprI32ShrU);
2384 EXPECT_ARITY(2, kExprI32ShrS);
2385 EXPECT_ARITY(2, kExprI32Eq);
2386 EXPECT_ARITY(2, kExprI32Ne);
2387 EXPECT_ARITY(2, kExprI32LtS);
2388 EXPECT_ARITY(2, kExprI32LeS);
2389 EXPECT_ARITY(2, kExprI32LtU);
2390 EXPECT_ARITY(2, kExprI32LeU);
2391 EXPECT_ARITY(2, kExprI32GtS);
2392 EXPECT_ARITY(2, kExprI32GeS);
2393 EXPECT_ARITY(2, kExprI32GtU);
2394 EXPECT_ARITY(2, kExprI32GeU);
2395 EXPECT_ARITY(1, kExprI32Clz);
2396 EXPECT_ARITY(1, kExprI32Ctz);
2397 EXPECT_ARITY(1, kExprI32Popcnt);
2398 EXPECT_ARITY(1, kExprI32Eqz);
2399 EXPECT_ARITY(2, kExprI64Add);
2400 EXPECT_ARITY(2, kExprI64Sub);
2401 EXPECT_ARITY(2, kExprI64Mul);
2402 EXPECT_ARITY(2, kExprI64DivS);
2403 EXPECT_ARITY(2, kExprI64DivU);
2404 EXPECT_ARITY(2, kExprI64RemS);
2405 EXPECT_ARITY(2, kExprI64RemU);
2406 EXPECT_ARITY(2, kExprI64And);
2407 EXPECT_ARITY(2, kExprI64Ior);
2408 EXPECT_ARITY(2, kExprI64Xor);
2409 EXPECT_ARITY(2, kExprI64Shl);
2410 EXPECT_ARITY(2, kExprI64ShrU);
2411 EXPECT_ARITY(2, kExprI64ShrS);
2412 EXPECT_ARITY(2, kExprI64Eq);
2413 EXPECT_ARITY(2, kExprI64Ne);
2414 EXPECT_ARITY(2, kExprI64LtS);
2415 EXPECT_ARITY(2, kExprI64LeS);
2416 EXPECT_ARITY(2, kExprI64LtU);
2417 EXPECT_ARITY(2, kExprI64LeU);
2418 EXPECT_ARITY(2, kExprI64GtS);
2419 EXPECT_ARITY(2, kExprI64GeS);
2420 EXPECT_ARITY(2, kExprI64GtU);
2421 EXPECT_ARITY(2, kExprI64GeU);
2422 EXPECT_ARITY(1, kExprI64Clz);
2423 EXPECT_ARITY(1, kExprI64Ctz);
2424 EXPECT_ARITY(1, kExprI64Popcnt);
2425 EXPECT_ARITY(2, kExprF32Add);
2426 EXPECT_ARITY(2, kExprF32Sub);
2427 EXPECT_ARITY(2, kExprF32Mul);
2428 EXPECT_ARITY(2, kExprF32Div);
2429 EXPECT_ARITY(2, kExprF32Min);
2430 EXPECT_ARITY(2, kExprF32Max);
2431 EXPECT_ARITY(1, kExprF32Abs);
2432 EXPECT_ARITY(1, kExprF32Neg);
2433 EXPECT_ARITY(2, kExprF32CopySign);
2434 EXPECT_ARITY(1, kExprF32Ceil);
2435 EXPECT_ARITY(1, kExprF32Floor);
2436 EXPECT_ARITY(1, kExprF32Trunc);
2437 EXPECT_ARITY(1, kExprF32NearestInt);
2438 EXPECT_ARITY(1, kExprF32Sqrt);
2439 EXPECT_ARITY(2, kExprF32Eq);
2440 EXPECT_ARITY(2, kExprF32Ne);
2441 EXPECT_ARITY(2, kExprF32Lt);
2442 EXPECT_ARITY(2, kExprF32Le);
2443 EXPECT_ARITY(2, kExprF32Gt);
2444 EXPECT_ARITY(2, kExprF32Ge);
2445 EXPECT_ARITY(2, kExprF64Add);
2446 EXPECT_ARITY(2, kExprF64Sub);
2447 EXPECT_ARITY(2, kExprF64Mul);
2448 EXPECT_ARITY(2, kExprF64Div);
2449 EXPECT_ARITY(2, kExprF64Min);
2450 EXPECT_ARITY(2, kExprF64Max);
2451 EXPECT_ARITY(1, kExprF64Abs);
2452 EXPECT_ARITY(1, kExprF64Neg);
2453 EXPECT_ARITY(2, kExprF64CopySign);
2454 EXPECT_ARITY(1, kExprF64Ceil);
2455 EXPECT_ARITY(1, kExprF64Floor);
2456 EXPECT_ARITY(1, kExprF64Trunc);
2457 EXPECT_ARITY(1, kExprF64NearestInt);
2458 EXPECT_ARITY(1, kExprF64Sqrt);
2459 EXPECT_ARITY(2, kExprF64Eq);
2460 EXPECT_ARITY(2, kExprF64Ne);
2461 EXPECT_ARITY(2, kExprF64Lt);
2462 EXPECT_ARITY(2, kExprF64Le);
2463 EXPECT_ARITY(2, kExprF64Gt);
2464 EXPECT_ARITY(2, kExprF64Ge);
2465 EXPECT_ARITY(1, kExprI32SConvertF32);
2466 EXPECT_ARITY(1, kExprI32SConvertF64);
2467 EXPECT_ARITY(1, kExprI32UConvertF32);
2468 EXPECT_ARITY(1, kExprI32UConvertF64);
2469 EXPECT_ARITY(1, kExprI32ConvertI64);
2470 EXPECT_ARITY(1, kExprI64SConvertF32);
2471 EXPECT_ARITY(1, kExprI64SConvertF64);
2472 EXPECT_ARITY(1, kExprI64UConvertF32);
2473 EXPECT_ARITY(1, kExprI64UConvertF64);
2474 EXPECT_ARITY(1, kExprI64SConvertI32);
2475 EXPECT_ARITY(1, kExprI64UConvertI32);
2476 EXPECT_ARITY(1, kExprF32SConvertI32);
2477 EXPECT_ARITY(1, kExprF32UConvertI32);
2478 EXPECT_ARITY(1, kExprF32SConvertI64);
2479 EXPECT_ARITY(1, kExprF32UConvertI64);
2480 EXPECT_ARITY(1, kExprF32ConvertF64);
2481 EXPECT_ARITY(1, kExprF32ReinterpretI32);
2482 EXPECT_ARITY(1, kExprF64SConvertI32);
2483 EXPECT_ARITY(1, kExprF64UConvertI32);
2484 EXPECT_ARITY(1, kExprF64SConvertI64);
2485 EXPECT_ARITY(1, kExprF64UConvertI64);
2486 EXPECT_ARITY(1, kExprF64ConvertF32);
2487 EXPECT_ARITY(1, kExprF64ReinterpretI64);
2488 EXPECT_ARITY(1, kExprI32ReinterpretF32);
2489 EXPECT_ARITY(1, kExprI64ReinterpretF64);
2490 }
2491
2492 typedef ZoneVector<LocalType> LocalTypeMap; 2494 typedef ZoneVector<LocalType> LocalTypeMap;
2493 2495
2494 class LocalDeclDecoderTest : public TestWithZone { 2496 class LocalDeclDecoderTest : public TestWithZone {
2495 public: 2497 public:
2496 base::AccountingAllocator allocator; 2498 base::AccountingAllocator allocator;
2497 2499
2498 size_t ExpectRun(LocalTypeMap map, size_t pos, LocalType expected, 2500 size_t ExpectRun(LocalTypeMap map, size_t pos, LocalType expected,
2499 size_t count) { 2501 size_t count) {
2500 for (size_t i = 0; i < count; i++) { 2502 for (size_t i = 0; i < count; i++) {
2501 EXPECT_EQ(expected, map[pos++]); 2503 EXPECT_EQ(expected, map[pos++]);
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after
2658 iter.next(); 2660 iter.next();
2659 EXPECT_TRUE(iter.has_next()); 2661 EXPECT_TRUE(iter.has_next());
2660 EXPECT_EQ(kExprI8Const, iter.current()); 2662 EXPECT_EQ(kExprI8Const, iter.current());
2661 iter.next(); 2663 iter.next();
2662 EXPECT_FALSE(iter.has_next()); 2664 EXPECT_FALSE(iter.has_next());
2663 } 2665 }
2664 2666
2665 } // namespace wasm 2667 } // namespace wasm
2666 } // namespace internal 2668 } // namespace internal
2667 } // namespace v8 2669 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698