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

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: [wasm] Master CL for Binary 0xC changes. 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) \
ahaas 2016/09/19 11:02:38 What does the C stand for?
titzer 2016/09/19 11:37:03 _C = "with code", as opposed to within inline byte
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
ahaas 2016/09/19 11:02:38 Add a test with an oob leb?
titzer 2016/09/19 11:37:03 Did you mean an LEB that doesn't encode correctly
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_VERIFIES(i_i, kExprGetLocal, U32V_4(kMaxLocals - 1));
305 318 EXPECT_VERIFIES(i_i, kExprGetLocal, U32V_4(kMaxLocals));
306 EXPECT_VERIFIES_INLINE(sigs.i_i(), kExprGetLocal, U32V_4(kMaxLocals - 1)); 319 EXPECT_FAILURE(i_i, kExprGetLocal, U32V_4(kMaxLocals + 1));
307 EXPECT_VERIFIES_INLINE(sigs.i_i(), kExprGetLocal, U32V_4(kMaxLocals)); 320
308 EXPECT_FAILURE_INLINE(sigs.i_i(), kExprGetLocal, U32V_4(kMaxLocals + 1)); 321 EXPECT_FAILURE(i_v, kExprGetLocal, U32V_4(kMaxLocals));
309 322 EXPECT_FAILURE(i_v, kExprGetLocal, U32V_4(kMaxLocals + 1));
310 EXPECT_FAILURE_INLINE(sigs.i_v(), kExprGetLocal, U32V_4(kMaxLocals));
311 EXPECT_FAILURE_INLINE(sigs.i_v(), kExprGetLocal, U32V_4(kMaxLocals + 1));
312 } 323 }
313 324
314 TEST_F(AstDecoderTest, Binops_off_end) { 325 TEST_F(AstDecoderTest, Binops_off_end) {
315 byte code1[] = {0}; // [opcode] 326 byte code1[] = {0}; // [opcode]
316 for (size_t i = 0; i < arraysize(kInt32BinopOpcodes); i++) { 327 for (size_t i = 0; i < arraysize(kInt32BinopOpcodes); i++) {
317 code1[0] = kInt32BinopOpcodes[i]; 328 code1[0] = kInt32BinopOpcodes[i];
318 EXPECT_FAILURE(sigs.i_i(), code1); 329 EXPECT_FAILURE_C(i_i, code1);
319 } 330 }
320 331
321 byte code3[] = {kExprGetLocal, 0, 0}; // [expr] [opcode] 332 byte code3[] = {kExprGetLocal, 0, 0}; // [expr] [opcode]
322 for (size_t i = 0; i < arraysize(kInt32BinopOpcodes); i++) { 333 for (size_t i = 0; i < arraysize(kInt32BinopOpcodes); i++) {
323 code3[2] = kInt32BinopOpcodes[i]; 334 code3[2] = kInt32BinopOpcodes[i];
324 EXPECT_FAILURE(sigs.i_i(), code3); 335 EXPECT_FAILURE_C(i_i, code3);
325 } 336 }
326 337
327 byte code4[] = {kExprGetLocal, 0, 0, 0}; // [expr] [opcode] [opcode] 338 byte code4[] = {kExprGetLocal, 0, 0, 0}; // [expr] [opcode] [opcode]
328 for (size_t i = 0; i < arraysize(kInt32BinopOpcodes); i++) { 339 for (size_t i = 0; i < arraysize(kInt32BinopOpcodes); i++) {
329 code4[2] = kInt32BinopOpcodes[i]; 340 code4[2] = kInt32BinopOpcodes[i];
330 code4[3] = kInt32BinopOpcodes[i]; 341 code4[3] = kInt32BinopOpcodes[i];
331 EXPECT_FAILURE(sigs.i_i(), code4); 342 EXPECT_FAILURE_C(i_i, code4);
332 } 343 }
333 } 344 }
334 345
335 TEST_F(AstDecoderTest, BinopsAcrossBlock1) { 346 TEST_F(AstDecoderTest, BinopsAcrossBlock1) {
336 static const byte code[] = {WASM_ZERO, kExprBlock, WASM_ZERO, kExprI32Add, 347 static const byte code[] = {WASM_ZERO, kExprBlock, WASM_ZERO, kExprI32Add,
337 kExprEnd}; 348 kExprEnd};
338 EXPECT_FAILURE(sigs.i_i(), code); 349 EXPECT_FAILURE_C(i_i, code);
339 } 350 }
340 351
341 TEST_F(AstDecoderTest, BinopsAcrossBlock2) { 352 TEST_F(AstDecoderTest, BinopsAcrossBlock2) {
342 static const byte code[] = {WASM_ZERO, WASM_ZERO, kExprBlock, kExprI32Add, 353 static const byte code[] = {WASM_ZERO, WASM_ZERO, kExprBlock, kExprI32Add,
343 kExprEnd}; 354 kExprEnd};
344 EXPECT_FAILURE(sigs.i_i(), code); 355 EXPECT_FAILURE_C(i_i, code);
345 } 356 }
346 357
347 TEST_F(AstDecoderTest, BinopsAcrossBlock3) { 358 TEST_F(AstDecoderTest, BinopsAcrossBlock3) {
348 static const byte code[] = {WASM_ZERO, WASM_ZERO, kExprIf, kExprI32Add, 359 static const byte code[] = {WASM_ZERO, WASM_ZERO, kExprIf, kExprI32Add,
349 kExprElse, kExprI32Add, kExprEnd}; 360 kExprElse, kExprI32Add, kExprEnd};
350 EXPECT_FAILURE(sigs.i_i(), code); 361 EXPECT_FAILURE_C(i_i, code);
351 } 362 }
352 363
353 TEST_F(AstDecoderTest, Nop) { 364 TEST_F(AstDecoderTest, Nop) {
354 static const byte code[] = {kExprNop}; 365 static const byte code[] = {kExprNop};
355 EXPECT_VERIFIES(sigs.v_v(), code); 366 EXPECT_VERIFIES_C(v_v, code);
367 }
368
369 TEST_F(AstDecoderTest, SetLocal0_void) {
370 EXPECT_FAILURE(i_i, WASM_SET_LOCAL(0, WASM_ZERO));
356 } 371 }
357 372
358 TEST_F(AstDecoderTest, SetLocal0_param) { 373 TEST_F(AstDecoderTest, SetLocal0_param) {
359 EXPECT_VERIFIES(sigs.i_i(), kCodeSetLocal0); 374 EXPECT_FAILURE_C(i_i, kCodeSetLocal0);
360 EXPECT_FAILURE(sigs.f_ff(), kCodeSetLocal0); 375 EXPECT_FAILURE_C(f_ff, kCodeSetLocal0);
361 EXPECT_FAILURE(sigs.d_dd(), kCodeSetLocal0); 376 EXPECT_FAILURE_C(d_dd, kCodeSetLocal0);
377 }
378
379 TEST_F(AstDecoderTest, TeeLocal0_param) {
380 EXPECT_VERIFIES_C(i_i, kCodeTeeLocal0);
381 EXPECT_FAILURE_C(f_ff, kCodeTeeLocal0);
382 EXPECT_FAILURE_C(d_dd, kCodeTeeLocal0);
362 } 383 }
363 384
364 TEST_F(AstDecoderTest, SetLocal0_local) { 385 TEST_F(AstDecoderTest, SetLocal0_local) {
365 EXPECT_FAILURE(sigs.i_v(), kCodeSetLocal0); 386 EXPECT_FAILURE_C(i_v, kCodeSetLocal0);
387 EXPECT_FAILURE_C(v_v, kCodeSetLocal0);
366 AddLocals(kAstI32, 1); 388 AddLocals(kAstI32, 1);
367 EXPECT_VERIFIES(sigs.i_v(), kCodeSetLocal0); 389 EXPECT_FAILURE_C(i_v, kCodeSetLocal0);
368 } 390 EXPECT_VERIFIES_C(v_v, kCodeSetLocal0);
369 391 }
370 TEST_F(AstDecoderTest, SetLocalN_local) { 392
393 TEST_F(AstDecoderTest, TeeLocal0_local) {
394 EXPECT_FAILURE_C(i_v, kCodeTeeLocal0);
395 AddLocals(kAstI32, 1);
396 EXPECT_VERIFIES_C(i_v, kCodeTeeLocal0);
397 }
398
399 TEST_F(AstDecoderTest, TeeLocalN_local) {
371 for (byte i = 1; i < 8; i++) { 400 for (byte i = 1; i < 8; i++) {
372 AddLocals(kAstI32, 1); 401 AddLocals(kAstI32, 1);
373 for (byte j = 0; j < i; j++) { 402 for (byte j = 0; j < i; j++) {
374 EXPECT_VERIFIES_INLINE(sigs.v_v(), WASM_SET_LOCAL(j, WASM_I8(i))); 403 EXPECT_FAILURE(v_v, WASM_TEE_LOCAL(j, WASM_I8(i)));
404 EXPECT_VERIFIES(i_i, WASM_TEE_LOCAL(j, WASM_I8(i)));
375 } 405 }
376 } 406 }
377 } 407 }
378 408
379 TEST_F(AstDecoderTest, BlockN) { 409 TEST_F(AstDecoderTest, BlockN) {
380 const int kMaxSize = 200; 410 const int kMaxSize = 200;
381 byte buffer[kMaxSize + 2]; 411 byte buffer[kMaxSize + 3];
382 412
383 for (int i = 0; i <= kMaxSize; i++) { 413 for (int i = 0; i <= kMaxSize; i++) {
384 memset(buffer, kExprNop, sizeof(buffer)); 414 memset(buffer, kExprNop, sizeof(buffer));
385 buffer[0] = kExprBlock; 415 buffer[0] = kExprBlock;
386 buffer[i + 1] = kExprEnd; 416 buffer[1] = kLocalVoid;
387 Verify(kSuccess, sigs.v_i(), buffer, buffer + i + 2); 417 buffer[i + 2] = kExprEnd;
388 } 418 Verify(kSuccess, sigs.v_i(), buffer, buffer + i + 3);
389 } 419 }
420 }
421
422 #define WASM_EMPTY_BLOCK kExprBlock, kLocalVoid, kExprEnd
390 423
391 TEST_F(AstDecoderTest, Block0) { 424 TEST_F(AstDecoderTest, Block0) {
392 static const byte code[] = {kExprBlock, kExprEnd}; 425 static const byte code[] = {WASM_EMPTY_BLOCK};
393 EXPECT_VERIFIES(sigs.v_v(), code); 426 EXPECT_VERIFIES_C(v_v, code);
394 EXPECT_FAILURE(sigs.i_i(), code); 427 EXPECT_FAILURE_C(i_i, code);
395 } 428 }
396 429
397 TEST_F(AstDecoderTest, Block0_fallthru1) { 430 TEST_F(AstDecoderTest, Block0_fallthru1) {
398 static const byte code[] = {kExprBlock, kExprBlock, kExprEnd, kExprEnd}; 431 static const byte code[] = {WASM_BLOCK(WASM_EMPTY_BLOCK)};
399 EXPECT_VERIFIES(sigs.v_v(), code); 432 EXPECT_VERIFIES_C(v_v, code);
400 EXPECT_FAILURE(sigs.i_i(), code); 433 EXPECT_FAILURE_C(i_i, code);
401 } 434 }
402 435
403 TEST_F(AstDecoderTest, Block0Block0) { 436 TEST_F(AstDecoderTest, Block0Block0) {
404 static const byte code[] = {kExprBlock, kExprEnd, kExprBlock, kExprEnd}; 437 static const byte code[] = {WASM_EMPTY_BLOCK, WASM_EMPTY_BLOCK};
405 EXPECT_VERIFIES(sigs.v_v(), code); 438 EXPECT_VERIFIES_C(v_v, code);
406 EXPECT_FAILURE(sigs.i_i(), code); 439 EXPECT_FAILURE_C(i_i, code);
440 }
441
442 TEST_F(AstDecoderTest, Block0_end) {
443 EXPECT_VERIFIES(v_v, WASM_EMPTY_BLOCK, kExprEnd);
407 } 444 }
408 445
409 TEST_F(AstDecoderTest, Block0_end_end) { 446 TEST_F(AstDecoderTest, Block0_end_end) {
410 static const byte code[] = {kExprBlock, kExprEnd, kExprEnd}; 447 EXPECT_FAILURE(v_v, WASM_EMPTY_BLOCK, kExprEnd, kExprEnd);
411 EXPECT_FAILURE(sigs.v_v(), code);
412 } 448 }
413 449
414 TEST_F(AstDecoderTest, Block1) { 450 TEST_F(AstDecoderTest, Block1) {
415 byte code[] = {B1(WASM_SET_LOCAL(0, WASM_ZERO))}; 451 byte code[] = {WASM_BLOCK_I(WASM_GET_LOCAL(0))};
416 EXPECT_VERIFIES(sigs.i_i(), code); 452 EXPECT_VERIFIES_C(i_i, code);
417 EXPECT_VERIFIES(sigs.v_i(), code); 453 EXPECT_FAILURE_C(v_i, code);
418 EXPECT_FAILURE(sigs.d_dd(), code); 454 EXPECT_FAILURE_C(d_dd, code);
455 EXPECT_FAILURE_C(i_f, code);
456 EXPECT_FAILURE_C(i_d, code);
419 } 457 }
420 458
421 TEST_F(AstDecoderTest, Block1_i) { 459 TEST_F(AstDecoderTest, Block1_i) {
422 byte code[] = {B1(WASM_ZERO)}; 460 byte code[] = {WASM_BLOCK_I(WASM_ZERO)};
423 EXPECT_VERIFIES(sigs.i_i(), code); 461 EXPECT_VERIFIES_C(i_i, code);
424 EXPECT_FAILURE(sigs.f_ff(), code); 462 EXPECT_FAILURE_C(f_ff, code);
425 EXPECT_FAILURE(sigs.d_dd(), code); 463 EXPECT_FAILURE_C(d_dd, code);
426 EXPECT_FAILURE(sigs.l_ll(), code); 464 EXPECT_FAILURE_C(l_ll, code);
427 } 465 }
428 466
429 TEST_F(AstDecoderTest, Block1_f) { 467 TEST_F(AstDecoderTest, Block1_f) {
430 byte code[] = {B1(WASM_F32(0))}; 468 byte code[] = {WASM_BLOCK_F(WASM_F32(0))};
431 EXPECT_FAILURE(sigs.i_i(), code); 469 EXPECT_FAILURE_C(i_i, code);
432 EXPECT_VERIFIES(sigs.f_ff(), code); 470 EXPECT_VERIFIES_C(f_ff, code);
433 EXPECT_FAILURE(sigs.d_dd(), code); 471 EXPECT_FAILURE_C(d_dd, code);
434 EXPECT_FAILURE(sigs.l_ll(), code); 472 EXPECT_FAILURE_C(l_ll, code);
435 } 473 }
436 474
437 TEST_F(AstDecoderTest, Block1_continue) { 475 TEST_F(AstDecoderTest, Block1_continue) {
438 EXPECT_VERIFIES_INLINE(sigs.v_v(), B1(WASM_BR(0))); 476 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 } 477 }
443 478
444 TEST_F(AstDecoderTest, Block1_br) { 479 TEST_F(AstDecoderTest, Block1_br) {
445 EXPECT_FAILURE_INLINE(sigs.v_v(), kExprBlock, kExprBr, ARITY_1, DEPTH_0, 480 EXPECT_VERIFIES(v_v, B1(WASM_BR(0)));
446 kExprEnd); 481 EXPECT_VERIFIES(v_v, B1(WASM_BR(1)));
447 EXPECT_VERIFIES_INLINE(sigs.v_v(), kExprBlock, kExprBr, ARITY_0, DEPTH_0, 482 EXPECT_FAILURE(v_v, B1(WASM_BR(2)));
448 kExprEnd);
449 } 483 }
450 484
451 TEST_F(AstDecoderTest, Block2_br) { 485 TEST_F(AstDecoderTest, Block2_br) {
452 EXPECT_VERIFIES_INLINE(sigs.v_v(), B2(WASM_NOP, WASM_BR(0))); 486 EXPECT_VERIFIES(v_v, B2(WASM_NOP, WASM_BR(0)));
453 EXPECT_VERIFIES_INLINE(sigs.v_v(), B2(WASM_BR(0), WASM_NOP)); 487 EXPECT_VERIFIES(v_v, B2(WASM_BR(0), WASM_NOP));
454 EXPECT_VERIFIES_INLINE(sigs.v_v(), B2(WASM_BR(0), WASM_BR(0))); 488 EXPECT_VERIFIES(v_v, B2(WASM_BR(0), WASM_BR(0)));
455 } 489 }
456 490
457 TEST_F(AstDecoderTest, Block2) { 491 TEST_F(AstDecoderTest, Block2) {
458 EXPECT_VERIFIES_INLINE(sigs.i_i(), 492 EXPECT_FAILURE(i_i, WASM_BLOCK(WASM_NOP, WASM_NOP));
459 B2(WASM_NOP, WASM_SET_LOCAL(0, WASM_ZERO))); 493 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)); 494 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), 495 EXPECT_VERIFIES(i_i, WASM_BLOCK_I(WASM_ZERO, WASM_NOP));
462 WASM_SET_LOCAL(0, WASM_ZERO))); 496 EXPECT_FAILURE(i_i, WASM_BLOCK_I(WASM_ZERO, WASM_ZERO));
463 } 497 }
464 498
465 TEST_F(AstDecoderTest, Block2b) { 499 TEST_F(AstDecoderTest, Block2b) {
466 byte code[] = {B2(WASM_SET_LOCAL(0, WASM_ZERO), WASM_ZERO)}; 500 byte code[] = {WASM_BLOCK_I(WASM_SET_LOCAL(0, WASM_ZERO), WASM_ZERO)};
467 EXPECT_VERIFIES(sigs.i_i(), code); 501 EXPECT_VERIFIES_C(i_i, code);
468 EXPECT_FAILURE(sigs.v_v(), code); 502 EXPECT_FAILURE_C(v_v, code);
469 EXPECT_FAILURE(sigs.f_ff(), code); 503 EXPECT_FAILURE_C(f_ff, code);
470 } 504 }
471 505
472 TEST_F(AstDecoderTest, Block2_fallthru) { 506 TEST_F(AstDecoderTest, Block2_fallthru) {
473 EXPECT_VERIFIES_INLINE(sigs.i_i(), B2(WASM_SET_LOCAL(0, WASM_ZERO), 507 EXPECT_VERIFIES(
474 WASM_SET_LOCAL(0, WASM_ZERO)), 508 i_i, B2(WASM_SET_LOCAL(0, WASM_ZERO), WASM_SET_LOCAL(0, WASM_ZERO)),
475 WASM_I8(23)); 509 WASM_I8(23));
476 } 510 }
477 511
478 TEST_F(AstDecoderTest, Block3) { 512 TEST_F(AstDecoderTest, Block3) {
479 EXPECT_VERIFIES_INLINE( 513 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), 514 WASM_SET_LOCAL(0, WASM_ZERO), WASM_I8(11)));
481 WASM_I8(11)));
482 } 515 }
483 516
484 TEST_F(AstDecoderTest, Block5) { 517 TEST_F(AstDecoderTest, Block5) {
485 EXPECT_VERIFIES_INLINE(sigs.v_i(), B1(WASM_GET_LOCAL(0))); 518 EXPECT_FAILURE(v_i, WASM_BLOCK(WASM_ZERO));
486 519
487 EXPECT_VERIFIES_INLINE(sigs.v_i(), B2(WASM_GET_LOCAL(0), WASM_GET_LOCAL(0))); 520 EXPECT_FAILURE(v_i, WASM_BLOCK(WASM_ZERO, WASM_ZERO));
488 521
489 EXPECT_VERIFIES_INLINE( 522 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))); 523
491 524 EXPECT_FAILURE(v_i, WASM_BLOCK(WASM_ZERO, WASM_ZERO, WASM_ZERO, WASM_ZERO));
492 EXPECT_VERIFIES_INLINE(sigs.v_i(), 525
493 WASM_BLOCK(WASM_GET_LOCAL(0), WASM_GET_LOCAL(0), 526 EXPECT_FAILURE(
494 WASM_GET_LOCAL(0), WASM_GET_LOCAL(0))); 527 v_i, WASM_BLOCK(WASM_ZERO, WASM_ZERO, WASM_ZERO, WASM_ZERO, WASM_ZERO));
495 528 }
496 EXPECT_VERIFIES_INLINE( 529
497 sigs.v_i(), 530 TEST_F(AstDecoderTest, BlockType) {
498 WASM_BLOCK(WASM_GET_LOCAL(0), WASM_GET_LOCAL(0), WASM_GET_LOCAL(0), 531 EXPECT_VERIFIES(i_i, WASM_BLOCK_I(WASM_GET_LOCAL(0)));
499 WASM_GET_LOCAL(0), WASM_GET_LOCAL(0))); 532 EXPECT_VERIFIES(l_l, WASM_BLOCK_L(WASM_GET_LOCAL(0)));
533 EXPECT_VERIFIES(f_f, WASM_BLOCK_F(WASM_GET_LOCAL(0)));
534 EXPECT_VERIFIES(d_d, WASM_BLOCK_D(WASM_GET_LOCAL(0)));
535 }
536
537 TEST_F(AstDecoderTest, BlockType_fail) {
538 EXPECT_FAILURE(i_i, WASM_BLOCK_L(WASM_I64V_1(0)));
539 EXPECT_FAILURE(i_i, WASM_BLOCK_F(WASM_F32(0.0)));
540 EXPECT_FAILURE(i_i, WASM_BLOCK_D(WASM_F64(1.1)));
541
542 EXPECT_FAILURE(l_l, WASM_BLOCK_I(WASM_ZERO));
543 EXPECT_FAILURE(l_l, WASM_BLOCK_F(WASM_F32(0.0)));
544 EXPECT_FAILURE(l_l, WASM_BLOCK_D(WASM_F64(1.1)));
545
546 EXPECT_FAILURE(f_ff, WASM_BLOCK_I(WASM_ZERO));
547 EXPECT_FAILURE(f_ff, WASM_BLOCK_L(WASM_I64V_1(0)));
548 EXPECT_FAILURE(f_ff, WASM_BLOCK_D(WASM_F64(1.1)));
549
550 EXPECT_FAILURE(d_dd, WASM_BLOCK_I(WASM_ZERO));
551 EXPECT_FAILURE(d_dd, WASM_BLOCK_L(WASM_I64V_1(0)));
552 EXPECT_FAILURE(d_dd, WASM_BLOCK_F(WASM_F32(0.0)));
500 } 553 }
501 554
502 TEST_F(AstDecoderTest, BlockF32) { 555 TEST_F(AstDecoderTest, BlockF32) {
503 static const byte code[] = {kExprBlock, kExprF32Const, 0, 0, 0, 0, kExprEnd}; 556 static const byte code[] = {WASM_BLOCK_F(kExprF32Const, 0, 0, 0, 0)};
504 EXPECT_VERIFIES(sigs.f_ff(), code); 557 EXPECT_VERIFIES_C(f_ff, code);
505 EXPECT_FAILURE(sigs.i_i(), code); 558 EXPECT_FAILURE_C(i_i, code);
506 EXPECT_FAILURE(sigs.d_dd(), code); 559 EXPECT_FAILURE_C(d_dd, code);
507 } 560 }
508 561
509 TEST_F(AstDecoderTest, BlockN_off_end) { 562 TEST_F(AstDecoderTest, BlockN_off_end) {
510 byte code[] = {kExprBlock, kExprNop, kExprNop, kExprNop, kExprNop, kExprEnd}; 563 byte code[] = {WASM_BLOCK(kExprNop, kExprNop, kExprNop, kExprNop)};
511 EXPECT_VERIFIES(sigs.v_v(), code); 564 EXPECT_VERIFIES_C(v_v, code);
512 for (size_t i = 1; i < arraysize(code); i++) { 565 for (size_t i = 1; i < arraysize(code); i++) {
513 Verify(kError, sigs.v_v(), code, code + i); 566 Verify(kError, sigs.v_v(), code, code + i);
514 } 567 }
515 } 568 }
516 569
517 TEST_F(AstDecoderTest, Block2_continue) { 570 TEST_F(AstDecoderTest, Block2_continue) {
518 static const byte code[] = {kExprBlock, kExprBr, ARITY_0, 571 EXPECT_VERIFIES(v_v, WASM_LOOP(WASM_NOP, WASM_BR(0)));
519 DEPTH_1, kExprNop, kExprEnd}; 572 EXPECT_VERIFIES(v_v, WASM_LOOP(WASM_NOP, WASM_BR(1)));
520 EXPECT_FAILURE(sigs.v_v(), code); 573 EXPECT_FAILURE(v_v, WASM_LOOP(WASM_NOP, WASM_BR(2)));
574 }
575
576 TEST_F(AstDecoderTest, Block3_continue) {
577 EXPECT_VERIFIES(v_v, B1(WASM_LOOP(WASM_NOP, WASM_BR(0))));
578 EXPECT_VERIFIES(v_v, B1(WASM_LOOP(WASM_NOP, WASM_BR(1))));
579 EXPECT_VERIFIES(v_v, B1(WASM_LOOP(WASM_NOP, WASM_BR(2))));
580 EXPECT_FAILURE(v_v, B1(WASM_LOOP(WASM_NOP, WASM_BR(3))));
521 } 581 }
522 582
523 TEST_F(AstDecoderTest, NestedBlock_return) { 583 TEST_F(AstDecoderTest, NestedBlock_return) {
524 EXPECT_VERIFIES_INLINE(sigs.i_i(), B1(B1(WASM_RETURN1(WASM_ZERO)))); 584 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 } 585 }
530 586
531 TEST_F(AstDecoderTest, BlockBrBinop) { 587 TEST_F(AstDecoderTest, BlockBrBinop) {
532 EXPECT_VERIFIES_INLINE(sigs.i_i(), 588 EXPECT_VERIFIES(
533 WASM_I32_AND(B1(WASM_BRV(0, WASM_I8(1))), WASM_I8(2))); 589 i_i, WASM_I32_AND(WASM_BLOCK_I(WASM_BRV(0, WASM_I8(1))), WASM_I8(2)));
534 } 590 }
535 591
536 TEST_F(AstDecoderTest, If_empty1) { 592 TEST_F(AstDecoderTest, If_empty1) {
537 EXPECT_VERIFIES_INLINE(sigs.v_v(), WASM_ZERO, kExprIf, kExprEnd); 593 EXPECT_VERIFIES(v_v, WASM_ZERO, WASM_IF_OP, kExprEnd);
538 } 594 }
539 595
540 TEST_F(AstDecoderTest, If_empty2) { 596 TEST_F(AstDecoderTest, If_empty2) {
541 EXPECT_VERIFIES_INLINE(sigs.v_v(), WASM_ZERO, kExprIf, kExprElse, kExprEnd); 597 EXPECT_VERIFIES(v_v, WASM_ZERO, WASM_IF_OP, kExprElse, kExprEnd);
542 } 598 }
543 599
544 TEST_F(AstDecoderTest, If_empty3) { 600 TEST_F(AstDecoderTest, If_empty3) {
545 EXPECT_VERIFIES_INLINE(sigs.v_v(), WASM_ZERO, kExprIf, WASM_ZERO, kExprElse, 601 EXPECT_VERIFIES(v_v, WASM_ZERO, WASM_IF_OP, WASM_NOP, kExprElse, kExprEnd);
546 kExprEnd); 602 EXPECT_FAILURE(v_v, WASM_ZERO, WASM_IF_OP, WASM_ZERO, kExprElse, kExprEnd);
547 } 603 }
548 604
549 TEST_F(AstDecoderTest, If_empty4) { 605 TEST_F(AstDecoderTest, If_empty4) {
550 EXPECT_VERIFIES_INLINE(sigs.v_v(), WASM_ZERO, kExprIf, kExprElse, WASM_ZERO, 606 EXPECT_VERIFIES(v_v, WASM_ZERO, WASM_IF_OP, kExprElse, WASM_NOP, kExprEnd);
551 kExprEnd); 607 EXPECT_FAILURE(v_v, WASM_ZERO, WASM_IF_OP, kExprElse, WASM_ZERO, kExprEnd);
552 } 608 }
553 609
554 TEST_F(AstDecoderTest, If_empty_stack) { 610 TEST_F(AstDecoderTest, If_empty_stack) {
555 byte code[] = {kExprIf}; 611 byte code[] = {kExprIf};
556 EXPECT_FAILURE(sigs.v_v(), code); 612 EXPECT_FAILURE_C(v_v, code);
557 EXPECT_FAILURE(sigs.i_i(), code); 613 EXPECT_FAILURE_C(i_i, code);
558 } 614 }
559 615
560 TEST_F(AstDecoderTest, If_incomplete1) { 616 TEST_F(AstDecoderTest, If_incomplete1) {
561 byte code[] = {kExprI8Const, 0, kExprIf}; 617 byte code[] = {kExprI8Const, 0, kExprIf};
562 EXPECT_FAILURE(sigs.v_v(), code); 618 EXPECT_FAILURE_C(v_v, code);
563 EXPECT_FAILURE(sigs.i_i(), code); 619 EXPECT_FAILURE_C(i_i, code);
564 } 620 }
565 621
566 TEST_F(AstDecoderTest, If_incomplete2) { 622 TEST_F(AstDecoderTest, If_incomplete2) {
567 byte code[] = {kExprI8Const, 0, kExprIf, kExprNop}; 623 byte code[] = {kExprI8Const, 0, kExprIf, kExprNop};
568 EXPECT_FAILURE(sigs.v_v(), code); 624 EXPECT_FAILURE_C(v_v, code);
569 EXPECT_FAILURE(sigs.i_i(), code); 625 EXPECT_FAILURE_C(i_i, code);
570 } 626 }
571 627
572 TEST_F(AstDecoderTest, If_else_else) { 628 TEST_F(AstDecoderTest, If_else_else) {
573 byte code[] = {kExprI8Const, 0, kExprIf, kExprElse, kExprElse, kExprEnd}; 629 byte code[] = {kExprI8Const, 0, WASM_IF_OP, kExprElse, kExprElse, kExprEnd};
574 EXPECT_FAILURE(sigs.v_v(), code); 630 EXPECT_FAILURE_C(v_v, code);
575 EXPECT_FAILURE(sigs.i_i(), code); 631 EXPECT_FAILURE_C(i_i, code);
576 } 632 }
577 633
578 TEST_F(AstDecoderTest, IfEmpty) { 634 TEST_F(AstDecoderTest, IfEmpty) {
579 EXPECT_VERIFIES_INLINE(sigs.v_i(), kExprGetLocal, 0, kExprIf, kExprEnd); 635 EXPECT_VERIFIES(v_i, kExprGetLocal, 0, WASM_IF_OP, kExprEnd);
580 } 636 }
581 637
582 TEST_F(AstDecoderTest, IfSet) { 638 TEST_F(AstDecoderTest, IfSet) {
583 EXPECT_VERIFIES_INLINE( 639 EXPECT_VERIFIES(v_i,
584 sigs.v_i(), WASM_IF(WASM_GET_LOCAL(0), WASM_SET_LOCAL(0, WASM_ZERO))); 640 WASM_IF(WASM_GET_LOCAL(0), WASM_SET_LOCAL(0, WASM_ZERO)));
585 EXPECT_VERIFIES_INLINE( 641 EXPECT_VERIFIES(v_i, WASM_IF_ELSE(WASM_GET_LOCAL(0),
586 sigs.v_i(), 642 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 } 643 }
589 644
590 TEST_F(AstDecoderTest, IfElseEmpty) { 645 TEST_F(AstDecoderTest, IfElseEmpty) {
591 EXPECT_VERIFIES_INLINE(sigs.v_i(), WASM_GET_LOCAL(0), kExprIf, kExprElse, 646 EXPECT_VERIFIES(v_i, WASM_GET_LOCAL(0), WASM_IF_OP, kExprElse, kExprEnd);
592 kExprEnd); 647 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 } 648 }
596 649
597 TEST_F(AstDecoderTest, IfElseUnreachable1) { 650 TEST_F(AstDecoderTest, IfElseUnreachable1) {
598 EXPECT_VERIFIES_INLINE( 651 EXPECT_VERIFIES(i_i, WASM_IF_ELSE_I(WASM_GET_LOCAL(0), WASM_UNREACHABLE,
599 sigs.i_i(), 652 WASM_GET_LOCAL(0)));
600 WASM_IF_ELSE(WASM_GET_LOCAL(0), WASM_UNREACHABLE, WASM_GET_LOCAL(0))); 653 EXPECT_VERIFIES(i_i, WASM_IF_ELSE_I(WASM_GET_LOCAL(0), WASM_GET_LOCAL(0),
601 EXPECT_VERIFIES_INLINE( 654 WASM_UNREACHABLE));
602 sigs.i_i(),
603 WASM_IF_ELSE(WASM_GET_LOCAL(0), WASM_GET_LOCAL(0), WASM_UNREACHABLE));
604 } 655 }
605 656
606 TEST_F(AstDecoderTest, IfElseUnreachable2) { 657 TEST_F(AstDecoderTest, IfElseUnreachable2) {
607 static const byte code[] = { 658 static const byte code[] = {
608 WASM_IF_ELSE(WASM_GET_LOCAL(0), WASM_UNREACHABLE, WASM_GET_LOCAL(0))}; 659 WASM_IF_ELSE_I(WASM_GET_LOCAL(0), WASM_UNREACHABLE, WASM_GET_LOCAL(0))};
609 660
610 for (size_t i = 0; i < arraysize(kLocalTypes); i++) { 661 for (size_t i = 0; i < arraysize(kLocalTypes); i++) {
611 LocalType types[] = {kAstI32, kLocalTypes[i]}; 662 LocalType types[] = {kAstI32, kLocalTypes[i]};
612 FunctionSig sig(1, 1, types); 663 FunctionSig sig(1, 1, types);
613 664
614 if (kLocalTypes[i] == kAstI32) { 665 if (kLocalTypes[i] == kAstI32) {
615 EXPECT_VERIFIES(&sig, code); 666 EXPECT_VERIFIES_SC(&sig, code);
616 } else { 667 } else {
617 EXPECT_FAILURE(&sig, code); 668 EXPECT_FAILURE_SC(&sig, code);
618 } 669 }
619 } 670 }
620 } 671 }
621 672
622 TEST_F(AstDecoderTest, IfBreak) { 673 TEST_F(AstDecoderTest, IfBreak) {
623 EXPECT_VERIFIES_INLINE(sigs.v_i(), WASM_IF(WASM_GET_LOCAL(0), WASM_BR(0))); 674 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))); 675 EXPECT_VERIFIES(v_i, WASM_IF(WASM_GET_LOCAL(0), WASM_BR(1)));
676 EXPECT_FAILURE(v_i, WASM_IF(WASM_GET_LOCAL(0), WASM_BR(2)));
625 } 677 }
626 678
627 TEST_F(AstDecoderTest, IfElseBreak) { 679 TEST_F(AstDecoderTest, IfElseBreak) {
628 EXPECT_VERIFIES_INLINE(sigs.v_i(), 680 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))); 681 EXPECT_VERIFIES(v_i, WASM_IF_ELSE(WASM_GET_LOCAL(0), WASM_NOP, WASM_BR(1)));
630 EXPECT_FAILURE_INLINE(sigs.v_i(), 682 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 } 683 }
633 684
634 TEST_F(AstDecoderTest, Block_else) { 685 TEST_F(AstDecoderTest, Block_else) {
635 byte code[] = {kExprI8Const, 0, kExprBlock, kExprElse, kExprEnd}; 686 byte code[] = {kExprI8Const, 0, kExprBlock, kExprElse, kExprEnd};
636 EXPECT_FAILURE(sigs.v_v(), code); 687 EXPECT_FAILURE_C(v_v, code);
637 EXPECT_FAILURE(sigs.i_i(), code); 688 EXPECT_FAILURE_C(i_i, code);
638 } 689 }
639 690
640 TEST_F(AstDecoderTest, IfNop) { 691 TEST_F(AstDecoderTest, IfNop) {
641 EXPECT_VERIFIES_INLINE(sigs.v_i(), WASM_IF(WASM_GET_LOCAL(0), WASM_NOP)); 692 EXPECT_VERIFIES(v_i, WASM_IF(WASM_GET_LOCAL(0), WASM_NOP));
642 } 693 }
643 694
644 TEST_F(AstDecoderTest, IfNopElseNop) { 695 TEST_F(AstDecoderTest, IfNopElseNop) {
645 EXPECT_VERIFIES_INLINE(sigs.v_i(), 696 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 } 697 }
648 698
649 TEST_F(AstDecoderTest, If_end_end) { 699 TEST_F(AstDecoderTest, If_end_end) {
650 static const byte code[] = {kExprGetLocal, 0, kExprIf, kExprEnd, kExprEnd}; 700 static const byte code[] = {kExprGetLocal, 0, WASM_IF_OP, kExprEnd, kExprEnd};
651 EXPECT_FAILURE(sigs.v_i(), code); 701 EXPECT_VERIFIES_C(v_i, code);
652 } 702 }
653 703
654 TEST_F(AstDecoderTest, If_falloff) { 704 TEST_F(AstDecoderTest, If_end_end_end) {
705 static const byte code[] = {kExprGetLocal, 0, WASM_IF_OP,
706 kExprEnd, kExprEnd, kExprEnd};
707 EXPECT_FAILURE_C(v_i, code);
708 }
709
710 TEST_F(AstDecoderTest, If_falloff1) {
655 static const byte code[] = {kExprGetLocal, 0, kExprIf}; 711 static const byte code[] = {kExprGetLocal, 0, kExprIf};
656 EXPECT_FAILURE(sigs.v_i(), code); 712 EXPECT_FAILURE_C(v_i, code);
713 }
714
715 TEST_F(AstDecoderTest, If_falloff2) {
716 static const byte code[] = {kExprGetLocal, 0, WASM_IF_OP};
717 EXPECT_FAILURE_C(v_i, code);
657 } 718 }
658 719
659 TEST_F(AstDecoderTest, IfElse_falloff) { 720 TEST_F(AstDecoderTest, IfElse_falloff) {
660 static const byte code[] = {kExprGetLocal, 0, kExprIf, kExprNop, kExprElse}; 721 static const byte code[] = {kExprGetLocal, 0, WASM_IF_OP, kExprNop,
661 EXPECT_FAILURE(sigs.v_i(), code); 722 kExprElse};
723 EXPECT_FAILURE_C(v_i, code);
662 } 724 }
663 725
664 TEST_F(AstDecoderTest, IfElseNop) { 726 TEST_F(AstDecoderTest, IfElseNop) {
665 EXPECT_VERIFIES_INLINE( 727 EXPECT_VERIFIES(v_i, WASM_IF_ELSE(WASM_GET_LOCAL(0),
666 sigs.v_i(), 728 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 } 729 }
669 730
670 TEST_F(AstDecoderTest, IfBlock1) { 731 TEST_F(AstDecoderTest, IfBlock1) {
671 EXPECT_VERIFIES_INLINE( 732 EXPECT_VERIFIES(
672 sigs.v_i(), WASM_IF_ELSE(WASM_GET_LOCAL(0), 733 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)); 734 WASM_NOP));
674 } 735 }
675 736
676 TEST_F(AstDecoderTest, IfBlock1b) { 737 TEST_F(AstDecoderTest, IfBlock1b) {
677 EXPECT_VERIFIES_INLINE( 738 EXPECT_VERIFIES(v_i,
678 sigs.v_i(), WASM_IF(WASM_GET_LOCAL(0), B1(WASM_SET_LOCAL(0, WASM_ZERO)))); 739 WASM_IF(WASM_GET_LOCAL(0), B1(WASM_SET_LOCAL(0, WASM_ZERO))));
679 } 740 }
680 741
681 TEST_F(AstDecoderTest, IfBlock2a) { 742 TEST_F(AstDecoderTest, IfBlock2a) {
682 EXPECT_VERIFIES_INLINE( 743 EXPECT_VERIFIES(v_i,
683 sigs.v_i(), WASM_IF(WASM_GET_LOCAL(0), B2(WASM_SET_LOCAL(0, WASM_ZERO), 744 WASM_IF(WASM_GET_LOCAL(0), B2(WASM_SET_LOCAL(0, WASM_ZERO),
684 WASM_SET_LOCAL(0, WASM_ZERO)))); 745 WASM_SET_LOCAL(0, WASM_ZERO))));
685 } 746 }
686 747
687 TEST_F(AstDecoderTest, IfBlock2b) { 748 TEST_F(AstDecoderTest, IfBlock2b) {
688 EXPECT_VERIFIES_INLINE( 749 EXPECT_VERIFIES(
689 sigs.v_i(), 750 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), 751 WASM_SET_LOCAL(0, WASM_ZERO)),
691 WASM_SET_LOCAL(0, WASM_ZERO)), 752 WASM_NOP));
692 WASM_NOP));
693 } 753 }
694 754
695 TEST_F(AstDecoderTest, IfElseSet) { 755 TEST_F(AstDecoderTest, IfElseSet) {
696 EXPECT_VERIFIES_INLINE( 756 EXPECT_VERIFIES(v_i,
697 sigs.v_i(), WASM_IF_ELSE(WASM_GET_LOCAL(0), WASM_SET_LOCAL(0, WASM_ZERO), 757 WASM_IF_ELSE(WASM_GET_LOCAL(0), WASM_SET_LOCAL(0, WASM_ZERO),
698 WASM_SET_LOCAL(0, WASM_I8(1)))); 758 WASM_SET_LOCAL(0, WASM_I8(1))));
699 } 759 }
700 760
701 TEST_F(AstDecoderTest, Loop0) { 761 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 762
706 TEST_F(AstDecoderTest, Loop1) { 763 TEST_F(AstDecoderTest, Loop1) {
707 static const byte code[] = {WASM_LOOP(WASM_SET_LOCAL(0, WASM_ZERO))}; 764 static const byte code[] = {WASM_LOOP(WASM_SET_LOCAL(0, WASM_ZERO))};
708 EXPECT_VERIFIES(sigs.v_i(), code); 765 EXPECT_VERIFIES_C(v_i, code);
709 EXPECT_FAILURE(sigs.v_v(), code); 766 EXPECT_FAILURE_C(v_v, code);
710 EXPECT_FAILURE(sigs.f_ff(), code); 767 EXPECT_FAILURE_C(f_ff, code);
711 } 768 }
712 769
713 TEST_F(AstDecoderTest, Loop2) { 770 TEST_F(AstDecoderTest, Loop2) {
714 EXPECT_VERIFIES_INLINE(sigs.v_i(), WASM_LOOP(WASM_SET_LOCAL(0, WASM_ZERO), 771 EXPECT_VERIFIES(v_i, WASM_LOOP(WASM_SET_LOCAL(0, WASM_ZERO),
715 WASM_SET_LOCAL(0, WASM_ZERO))); 772 WASM_SET_LOCAL(0, WASM_ZERO)));
716 } 773 }
717 774
718 TEST_F(AstDecoderTest, Loop1_continue) { 775 TEST_F(AstDecoderTest, Loop1_continue) {
719 EXPECT_VERIFIES_INLINE(sigs.v_v(), WASM_LOOP(WASM_BR(0))); 776 EXPECT_VERIFIES(v_v, WASM_LOOP(WASM_BR(0)));
720 } 777 }
721 778
722 TEST_F(AstDecoderTest, Loop1_break) { 779 TEST_F(AstDecoderTest, Loop1_break) {
723 EXPECT_VERIFIES_INLINE(sigs.v_v(), WASM_LOOP(WASM_BR(1))); 780 EXPECT_VERIFIES(v_v, WASM_LOOP(WASM_BR(1)));
724 } 781 }
725 782
726 TEST_F(AstDecoderTest, Loop2_continue) { 783 TEST_F(AstDecoderTest, Loop2_continue) {
727 EXPECT_VERIFIES_INLINE(sigs.v_i(), 784 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 } 785 }
730 786
731 TEST_F(AstDecoderTest, Loop2_break) { 787 TEST_F(AstDecoderTest, Loop2_break) {
732 EXPECT_VERIFIES_INLINE(sigs.v_i(), 788 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))); 789 }
734 } 790
735 791 TEST_F(AstDecoderTest, InfiniteLoop) {
736 TEST_F(AstDecoderTest, ExprLoop0) { 792 EXPECT_VERIFIES(i_i, WASM_LOOP(WASM_BR(0)));
737 static const byte code[] = {kExprLoop, kExprEnd}; 793 EXPECT_VERIFIES(i_i, WASM_LOOP(WASM_BRV(1, WASM_ZERO)));
738 EXPECT_VERIFIES(sigs.v_v(), code); 794 }
739 } 795
740 796 TEST_F(AstDecoderTest, Loop2_unreachable) {
741 TEST_F(AstDecoderTest, ExprLoop1a) { 797 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))); 798 }
743 } 799
744 800 TEST_F(AstDecoderTest, LoopType) {
745 TEST_F(AstDecoderTest, ExprLoop1b) { 801 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))); 802 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))); 803 EXPECT_VERIFIES(f_f, WASM_LOOP_F(WASM_GET_LOCAL(0)));
748 } 804 EXPECT_VERIFIES(d_d, WASM_LOOP_D(WASM_GET_LOCAL(0)));
749 805 }
750 TEST_F(AstDecoderTest, ExprLoop2_unreachable) { 806
751 EXPECT_VERIFIES_INLINE(sigs.i_i(), WASM_LOOP(WASM_BR(0), WASM_NOP)); 807 TEST_F(AstDecoderTest, LoopType_void) {
808 EXPECT_FAILURE(v_v, WASM_LOOP_I(WASM_ZERO));
809 EXPECT_FAILURE(v_v, WASM_LOOP_L(WASM_I64V_1(0)));
810 EXPECT_FAILURE(v_v, WASM_LOOP_F(WASM_F32(0.0)));
811 EXPECT_FAILURE(v_v, WASM_LOOP_D(WASM_F64(1.1)));
812 }
813
814 TEST_F(AstDecoderTest, LoopType_fail) {
815 EXPECT_FAILURE(i_i, WASM_LOOP_L(WASM_I64V_1(0)));
816 EXPECT_FAILURE(i_i, WASM_LOOP_F(WASM_F32(0.0)));
817 EXPECT_FAILURE(i_i, WASM_LOOP_D(WASM_F64(1.1)));
818
819 EXPECT_FAILURE(l_l, WASM_LOOP_I(WASM_ZERO));
820 EXPECT_FAILURE(l_l, WASM_LOOP_F(WASM_F32(0.0)));
821 EXPECT_FAILURE(l_l, WASM_LOOP_D(WASM_F64(1.1)));
822
823 EXPECT_FAILURE(f_ff, WASM_LOOP_I(WASM_ZERO));
824 EXPECT_FAILURE(f_ff, WASM_LOOP_L(WASM_I64V_1(0)));
825 EXPECT_FAILURE(f_ff, WASM_LOOP_D(WASM_F64(1.1)));
826
827 EXPECT_FAILURE(d_dd, WASM_LOOP_I(WASM_ZERO));
828 EXPECT_FAILURE(d_dd, WASM_LOOP_L(WASM_I64V_1(0)));
829 EXPECT_FAILURE(d_dd, WASM_LOOP_F(WASM_F32(0.0)));
752 } 830 }
753 831
754 TEST_F(AstDecoderTest, ReturnVoid1) { 832 TEST_F(AstDecoderTest, ReturnVoid1) {
755 static const byte code[] = {kExprNop}; 833 static const byte code[] = {kExprNop};
756 EXPECT_VERIFIES(sigs.v_v(), code); 834 EXPECT_VERIFIES_C(v_v, code);
757 EXPECT_FAILURE(sigs.i_i(), code); 835 EXPECT_FAILURE_C(i_i, code);
758 EXPECT_FAILURE(sigs.i_f(), code); 836 EXPECT_FAILURE_C(i_f, code);
759 } 837 }
760 838
761 TEST_F(AstDecoderTest, ReturnVoid2) { 839 TEST_F(AstDecoderTest, ReturnVoid2) {
762 static const byte code[] = {kExprBlock, kExprBr, ARITY_0, DEPTH_0, kExprEnd}; 840 static const byte code[] = {WASM_BLOCK(WASM_BR(0))};
763 EXPECT_VERIFIES(sigs.v_v(), code); 841 EXPECT_VERIFIES_C(v_v, code);
764 EXPECT_FAILURE(sigs.i_i(), code); 842 EXPECT_FAILURE_C(i_i, code);
765 EXPECT_FAILURE(sigs.i_f(), code); 843 EXPECT_FAILURE_C(i_f, code);
766 } 844 }
767 845
768 TEST_F(AstDecoderTest, ReturnVoid3) { 846 TEST_F(AstDecoderTest, ReturnVoid3) {
769 EXPECT_VERIFIES_INLINE(sigs.v_v(), kExprI8Const, 0); 847 EXPECT_FAILURE(v_v, kExprI8Const, 0);
770 EXPECT_VERIFIES_INLINE(sigs.v_v(), kExprI32Const, 0, 0, 0, 0); 848 EXPECT_FAILURE(v_v, kExprI32Const, 0);
771 EXPECT_VERIFIES_INLINE(sigs.v_v(), kExprI64Const, 0, 0, 0, 0, 0, 0, 0, 0); 849 EXPECT_FAILURE(v_v, kExprI64Const, 0);
772 EXPECT_VERIFIES_INLINE(sigs.v_v(), kExprF32Const, 0, 0, 0, 0); 850 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); 851 EXPECT_FAILURE(v_v, kExprF64Const, 0, 0, 0, 0, 0, 0, 0, 0);
774 852
775 EXPECT_VERIFIES_INLINE(sigs.v_i(), kExprGetLocal, 0); 853 EXPECT_FAILURE(v_i, kExprGetLocal, 0);
776 } 854 }
777 855
778 TEST_F(AstDecoderTest, Unreachable1) { 856 TEST_F(AstDecoderTest, Unreachable1) {
779 EXPECT_VERIFIES_INLINE(sigs.v_v(), kExprUnreachable); 857 EXPECT_VERIFIES(v_v, kExprUnreachable);
780 EXPECT_VERIFIES_INLINE(sigs.v_v(), kExprUnreachable, kExprUnreachable); 858 EXPECT_VERIFIES(v_v, kExprUnreachable, kExprUnreachable);
781 EXPECT_VERIFIES_INLINE(sigs.v_v(), B2(WASM_UNREACHABLE, WASM_ZERO)); 859 EXPECT_VERIFIES(v_v, B2(WASM_UNREACHABLE, WASM_ZERO));
782 EXPECT_VERIFIES_INLINE(sigs.v_v(), B2(WASM_BR(0), WASM_ZERO)); 860 EXPECT_VERIFIES(v_v, B2(WASM_BR(0), WASM_ZERO));
783 EXPECT_VERIFIES_INLINE(sigs.v_v(), WASM_LOOP(WASM_UNREACHABLE, WASM_ZERO)); 861 EXPECT_VERIFIES(v_v, WASM_LOOP(WASM_UNREACHABLE, WASM_ZERO));
784 EXPECT_VERIFIES_INLINE(sigs.v_v(), WASM_LOOP(WASM_BR(0), WASM_ZERO)); 862 EXPECT_VERIFIES(v_v, WASM_LOOP(WASM_BR(0), WASM_ZERO));
785 } 863 }
786 864
787 TEST_F(AstDecoderTest, Unreachable_binop) { 865 TEST_F(AstDecoderTest, Unreachable_binop) {
788 EXPECT_VERIFIES_INLINE(sigs.i_i(), WASM_I32_AND(WASM_ZERO, WASM_UNREACHABLE)); 866 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)); 867 EXPECT_VERIFIES(i_i, WASM_I32_AND(WASM_UNREACHABLE, WASM_ZERO));
790 } 868 }
791 869
792 TEST_F(AstDecoderTest, Unreachable_select) { 870 TEST_F(AstDecoderTest, Unreachable_select) {
793 EXPECT_VERIFIES_INLINE(sigs.i_i(), 871 EXPECT_VERIFIES(i_i, WASM_SELECT(WASM_UNREACHABLE, WASM_ZERO, WASM_ZERO));
794 WASM_SELECT(WASM_UNREACHABLE, WASM_ZERO, WASM_ZERO)); 872 EXPECT_VERIFIES(i_i, WASM_SELECT(WASM_ZERO, WASM_UNREACHABLE, WASM_ZERO));
795 EXPECT_VERIFIES_INLINE(sigs.i_i(), 873 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 } 874 }
800 875
801 TEST_F(AstDecoderTest, If1) { 876 TEST_F(AstDecoderTest, If1) {
802 EXPECT_VERIFIES_INLINE( 877 EXPECT_VERIFIES(i_i,
803 sigs.i_i(), WASM_IF_ELSE(WASM_GET_LOCAL(0), WASM_I8(9), WASM_I8(8))); 878 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), 879 EXPECT_VERIFIES(
805 WASM_GET_LOCAL(0))); 880 i_i, WASM_IF_ELSE_I(WASM_GET_LOCAL(0), WASM_I8(9), WASM_GET_LOCAL(0)));
806 EXPECT_VERIFIES_INLINE( 881 EXPECT_VERIFIES(
807 sigs.i_i(), 882 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 } 883 }
810 884
811 TEST_F(AstDecoderTest, If_off_end) { 885 TEST_F(AstDecoderTest, If_off_end) {
812 static const byte kCode[] = { 886 static const byte kCode[] = {
813 WASM_IF_ELSE(WASM_GET_LOCAL(0), WASM_GET_LOCAL(0), WASM_GET_LOCAL(0))}; 887 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++) { 888 for (size_t len = 3; len < arraysize(kCode); len++) {
815 Verify(kError, sigs.i_i(), kCode, kCode + len); 889 Verify(kError, sigs.i_i(), kCode, kCode + len);
816 } 890 }
817 } 891 }
818 892
819 TEST_F(AstDecoderTest, If_type1) { 893 TEST_F(AstDecoderTest, If_type1) {
820 // float|double ? 1 : 2 894 // float|double ? 1 : 2
821 static const byte kCode[] = { 895 static const byte kCode[] = {
822 WASM_IF_ELSE(WASM_GET_LOCAL(0), WASM_I8(0), WASM_I8(2))}; 896 WASM_IF_ELSE_I(WASM_GET_LOCAL(0), WASM_I8(0), WASM_I8(2))};
823 EXPECT_VERIFIES(sigs.i_i(), kCode); 897 EXPECT_VERIFIES_C(i_i, kCode);
824 EXPECT_FAILURE(sigs.i_f(), kCode); 898 EXPECT_FAILURE_C(i_f, kCode);
825 EXPECT_FAILURE(sigs.i_d(), kCode); 899 EXPECT_FAILURE_C(i_d, kCode);
826 } 900 }
827 901
828 TEST_F(AstDecoderTest, If_type2) { 902 TEST_F(AstDecoderTest, If_type2) {
829 // 1 ? float|double : 2 903 // 1 ? float|double : 2
830 static const byte kCode[] = { 904 static const byte kCode[] = {
831 WASM_IF_ELSE(WASM_I8(1), WASM_GET_LOCAL(0), WASM_I8(1))}; 905 WASM_IF_ELSE_I(WASM_I8(1), WASM_GET_LOCAL(0), WASM_I8(1))};
832 EXPECT_VERIFIES(sigs.i_i(), kCode); 906 EXPECT_VERIFIES_C(i_i, kCode);
833 EXPECT_FAILURE(sigs.i_f(), kCode); 907 EXPECT_FAILURE_C(i_f, kCode);
834 EXPECT_FAILURE(sigs.i_d(), kCode); 908 EXPECT_FAILURE_C(i_d, kCode);
835 } 909 }
836 910
837 TEST_F(AstDecoderTest, If_type3) { 911 TEST_F(AstDecoderTest, If_type3) {
838 // stmt ? 0 : 1 912 // stmt ? 0 : 1
839 static const byte kCode[] = {WASM_IF_ELSE(WASM_NOP, WASM_I8(0), WASM_I8(1))}; 913 static const byte kCode[] = {
840 EXPECT_FAILURE(sigs.i_i(), kCode); 914 WASM_IF_ELSE_I(WASM_NOP, WASM_I8(0), WASM_I8(1))};
841 EXPECT_FAILURE(sigs.i_f(), kCode); 915 EXPECT_FAILURE_C(i_i, kCode);
842 EXPECT_FAILURE(sigs.i_d(), kCode); 916 EXPECT_FAILURE_C(i_f, kCode);
917 EXPECT_FAILURE_C(i_d, kCode);
843 } 918 }
844 919
845 TEST_F(AstDecoderTest, If_type4) { 920 TEST_F(AstDecoderTest, If_type4) {
846 // 0 ? stmt : 1 921 // 0 ? stmt : 1
847 static const byte kCode[] = { 922 static const byte kCode[] = {
848 WASM_IF_ELSE(WASM_GET_LOCAL(0), WASM_NOP, WASM_I8(1))}; 923 WASM_IF_ELSE_I(WASM_GET_LOCAL(0), WASM_NOP, WASM_I8(1))};
849 EXPECT_FAILURE(sigs.i_i(), kCode); 924 EXPECT_FAILURE_C(i_i, kCode);
850 EXPECT_FAILURE(sigs.i_f(), kCode); 925 EXPECT_FAILURE_C(i_f, kCode);
851 EXPECT_FAILURE(sigs.i_d(), kCode); 926 EXPECT_FAILURE_C(i_d, kCode);
852 } 927 }
853 928
854 TEST_F(AstDecoderTest, If_type5) { 929 TEST_F(AstDecoderTest, If_type5) {
855 // 0 ? 1 : stmt 930 // 0 ? 1 : stmt
856 static const byte kCode[] = {WASM_IF_ELSE(WASM_ZERO, WASM_I8(1), WASM_NOP)}; 931 static const byte kCode[] = {WASM_IF_ELSE_I(WASM_ZERO, WASM_I8(1), WASM_NOP)};
857 EXPECT_FAILURE(sigs.i_i(), kCode); 932 EXPECT_FAILURE_C(i_i, kCode);
858 EXPECT_FAILURE(sigs.i_f(), kCode); 933 EXPECT_FAILURE_C(i_f, kCode);
859 EXPECT_FAILURE(sigs.i_d(), kCode); 934 EXPECT_FAILURE_C(i_d, kCode);
860 } 935 }
861 936
862 TEST_F(AstDecoderTest, Int64Local_param) { 937 TEST_F(AstDecoderTest, Int64Local_param) {
863 EXPECT_VERIFIES(sigs.l_l(), kCodeGetLocal0); 938 EXPECT_VERIFIES_C(l_l, kCodeGetLocal0);
864 } 939 }
865 940
866 TEST_F(AstDecoderTest, Int64Locals) { 941 TEST_F(AstDecoderTest, Int64Locals) {
867 for (byte i = 1; i < 8; i++) { 942 for (byte i = 1; i < 8; i++) {
868 AddLocals(kAstI64, 1); 943 AddLocals(kAstI64, 1);
869 for (byte j = 0; j < i; j++) { 944 for (byte j = 0; j < i; j++) {
870 EXPECT_VERIFIES_INLINE(sigs.l_v(), WASM_GET_LOCAL(j)); 945 EXPECT_VERIFIES(l_v, WASM_GET_LOCAL(j));
871 } 946 }
872 } 947 }
873 } 948 }
874 949
875 TEST_F(AstDecoderTest, Int32Binops) { 950 TEST_F(AstDecoderTest, Int32Binops) {
876 TestBinop(kExprI32Add, sigs.i_ii()); 951 TestBinop(kExprI32Add, sigs.i_ii());
877 TestBinop(kExprI32Sub, sigs.i_ii()); 952 TestBinop(kExprI32Sub, sigs.i_ii());
878 TestBinop(kExprI32Mul, sigs.i_ii()); 953 TestBinop(kExprI32Mul, sigs.i_ii());
879 TestBinop(kExprI32DivS, sigs.i_ii()); 954 TestBinop(kExprI32DivS, sigs.i_ii());
880 TestBinop(kExprI32DivU, sigs.i_ii()); 955 TestBinop(kExprI32DivU, sigs.i_ii());
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
922 TestUnop(kExprI32UConvertF64, kAstI32, kAstF64); 997 TestUnop(kExprI32UConvertF64, kAstI32, kAstF64);
923 TestUnop(kExprF64SConvertI32, kAstF64, kAstI32); 998 TestUnop(kExprF64SConvertI32, kAstF64, kAstI32);
924 TestUnop(kExprF64UConvertI32, kAstF64, kAstI32); 999 TestUnop(kExprF64UConvertI32, kAstF64, kAstI32);
925 TestUnop(kExprF64ConvertF32, kAstF64, kAstF32); 1000 TestUnop(kExprF64ConvertF32, kAstF64, kAstF32);
926 TestUnop(kExprF32SConvertI32, kAstF32, kAstI32); 1001 TestUnop(kExprF32SConvertI32, kAstF32, kAstI32);
927 TestUnop(kExprF32UConvertI32, kAstF32, kAstI32); 1002 TestUnop(kExprF32UConvertI32, kAstF32, kAstI32);
928 TestUnop(kExprF32ConvertF64, kAstF32, kAstF64); 1003 TestUnop(kExprF32ConvertF64, kAstF32, kAstF64);
929 } 1004 }
930 1005
931 TEST_F(AstDecoderTest, MacrosStmt) { 1006 TEST_F(AstDecoderTest, MacrosStmt) {
932 VERIFY(WASM_SET_LOCAL(0, WASM_I32V_3(87348))); 1007 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))); 1008 EXPECT_VERIFIES(
934 VERIFY(WASM_IF(WASM_GET_LOCAL(0), WASM_NOP)); 1009 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)); 1010 EXPECT_VERIFIES(v_i, WASM_IF(WASM_GET_LOCAL(0), WASM_NOP));
936 VERIFY(WASM_NOP); 1011 EXPECT_VERIFIES(v_i, WASM_IF_ELSE(WASM_GET_LOCAL(0), WASM_NOP, WASM_NOP));
937 VERIFY(B1(WASM_NOP)); 1012 EXPECT_VERIFIES(v_v, WASM_NOP);
938 VERIFY(WASM_LOOP(WASM_NOP)); 1013 EXPECT_VERIFIES(v_v, B1(WASM_NOP));
939 VERIFY(WASM_LOOP(WASM_BREAK(0))); 1014 EXPECT_VERIFIES(v_v, WASM_LOOP(WASM_NOP));
940 VERIFY(WASM_LOOP(WASM_CONTINUE(0))); 1015 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 } 1016 }
951 1017
952 TEST_F(AstDecoderTest, MacrosContinue) { 1018 TEST_F(AstDecoderTest, MacrosContinue) {
953 EXPECT_VERIFIES_INLINE(sigs.v_v(), WASM_LOOP(WASM_CONTINUE(0))); 1019 EXPECT_VERIFIES(v_v, WASM_LOOP(WASM_CONTINUE(0)));
954 } 1020 }
955 1021
956 TEST_F(AstDecoderTest, MacrosVariadic) { 1022 TEST_F(AstDecoderTest, MacrosVariadic) {
957 VERIFY(B2(WASM_NOP, WASM_NOP)); 1023 EXPECT_VERIFIES(v_v, B2(WASM_NOP, WASM_NOP));
958 VERIFY(B3(WASM_NOP, WASM_NOP, WASM_NOP)); 1024 EXPECT_VERIFIES(v_v, B3(WASM_NOP, WASM_NOP, WASM_NOP));
959 VERIFY(WASM_LOOP(WASM_NOP, WASM_NOP)); 1025 EXPECT_VERIFIES(v_v, WASM_LOOP(WASM_NOP, WASM_NOP));
960 VERIFY(WASM_LOOP(WASM_NOP, WASM_NOP, WASM_NOP)); 1026 EXPECT_VERIFIES(v_v, WASM_LOOP(WASM_NOP, WASM_NOP, WASM_NOP));
961 } 1027 }
962 1028
963 TEST_F(AstDecoderTest, MacrosNestedBlocks) { 1029 TEST_F(AstDecoderTest, MacrosNestedBlocks) {
964 VERIFY(B2(WASM_NOP, B2(WASM_NOP, WASM_NOP))); 1030 EXPECT_VERIFIES(v_v, B2(WASM_NOP, B2(WASM_NOP, WASM_NOP)));
965 VERIFY(B3(WASM_NOP, // -- 1031 EXPECT_VERIFIES(v_v, B3(WASM_NOP, // --
966 B2(WASM_NOP, WASM_NOP), // -- 1032 B2(WASM_NOP, WASM_NOP), // --
967 B2(WASM_NOP, WASM_NOP))); // -- 1033 B2(WASM_NOP, WASM_NOP))); // --
968 VERIFY(B1(B1(B2(WASM_NOP, WASM_NOP)))); 1034 EXPECT_VERIFIES(v_v, B1(B1(B2(WASM_NOP, WASM_NOP))));
969 } 1035 }
970 1036
971 TEST_F(AstDecoderTest, MultipleReturn) { 1037 TEST_F(AstDecoderTest, MultipleReturn) {
972 static LocalType kIntTypes5[] = {kAstI32, kAstI32, kAstI32, kAstI32, kAstI32}; 1038 static LocalType kIntTypes5[] = {kAstI32, kAstI32, kAstI32, kAstI32, kAstI32};
973 FunctionSig sig_ii_v(2, 0, kIntTypes5); 1039 FunctionSig sig_ii_v(2, 0, kIntTypes5);
974 EXPECT_VERIFIES_INLINE(&sig_ii_v, WASM_RETURNN(2, WASM_ZERO, WASM_ONE)); 1040 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)); 1041 EXPECT_FAILURE_S(&sig_ii_v, WASM_RETURNN(1, WASM_ZERO));
976 1042
977 FunctionSig sig_iii_v(3, 0, kIntTypes5); 1043 FunctionSig sig_iii_v(3, 0, kIntTypes5);
978 EXPECT_VERIFIES_INLINE(&sig_iii_v, 1044 EXPECT_VERIFIES_S(&sig_iii_v,
979 WASM_RETURNN(3, WASM_ZERO, WASM_ONE, WASM_I8(44))); 1045 WASM_RETURNN(3, WASM_ZERO, WASM_ONE, WASM_I8(44)));
980 EXPECT_FAILURE_INLINE(&sig_iii_v, WASM_RETURNN(2, WASM_ZERO, WASM_ONE)); 1046 EXPECT_FAILURE_S(&sig_iii_v, WASM_RETURNN(2, WASM_ZERO, WASM_ONE));
981 } 1047 }
982 1048
983 TEST_F(AstDecoderTest, MultipleReturn_fallthru) { 1049 TEST_F(AstDecoderTest, MultipleReturn_fallthru) {
984 static LocalType kIntTypes5[] = {kAstI32, kAstI32, kAstI32, kAstI32, kAstI32}; 1050 static LocalType kIntTypes5[] = {kAstI32, kAstI32, kAstI32, kAstI32, kAstI32};
985 FunctionSig sig_ii_v(2, 0, kIntTypes5); 1051 FunctionSig sig_ii_v(2, 0, kIntTypes5);
986 1052
987 EXPECT_VERIFIES_INLINE(&sig_ii_v, WASM_ZERO, WASM_ONE); 1053 EXPECT_VERIFIES_S(&sig_ii_v, WASM_ZERO, WASM_ONE);
988 EXPECT_FAILURE_INLINE(&sig_ii_v, WASM_ZERO); 1054 EXPECT_FAILURE_S(&sig_ii_v, WASM_ZERO);
989 1055
990 FunctionSig sig_iii_v(3, 0, kIntTypes5); 1056 FunctionSig sig_iii_v(3, 0, kIntTypes5);
991 EXPECT_VERIFIES_INLINE(&sig_iii_v, WASM_ZERO, WASM_ONE, WASM_I8(44)); 1057 EXPECT_VERIFIES_S(&sig_iii_v, WASM_ZERO, WASM_ONE, WASM_I8(44));
992 EXPECT_FAILURE_INLINE(&sig_iii_v, WASM_ZERO, WASM_ONE); 1058 EXPECT_FAILURE_S(&sig_iii_v, WASM_ZERO, WASM_ONE);
993 } 1059 }
994 1060
995 TEST_F(AstDecoderTest, MacrosInt32) { 1061 TEST_F(AstDecoderTest, MacrosInt32) {
996 VERIFY(WASM_I32_ADD(WASM_GET_LOCAL(0), WASM_I8(12))); 1062 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))); 1063 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))); 1064 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))); 1065 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))); 1066 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))); 1067 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))); 1068 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))); 1069 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))); 1070 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))); 1071 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))); 1072 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))); 1073 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))); 1074 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))); 1075 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))); 1076 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))); 1077 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))); 1078 EXPECT_VERIFIES(i_i, WASM_I32_NE(WASM_GET_LOCAL(0), WASM_I8(25)));
1013 1079
1014 VERIFY(WASM_I32_LTS(WASM_GET_LOCAL(0), WASM_I8(26))); 1080 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))); 1081 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))); 1082 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))); 1083 EXPECT_VERIFIES(i_i, WASM_I32_LEU(WASM_GET_LOCAL(0), WASM_I8(29)));
1018 1084
1019 VERIFY(WASM_I32_GTS(WASM_GET_LOCAL(0), WASM_I8(26))); 1085 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))); 1086 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))); 1087 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))); 1088 EXPECT_VERIFIES(i_i, WASM_I32_GEU(WASM_GET_LOCAL(0), WASM_I8(29)));
1023 } 1089 }
1024 1090
1025 TEST_F(AstDecoderTest, MacrosInt64) { 1091 TEST_F(AstDecoderTest, MacrosInt64) {
1026 #define VERIFY_L_LL(...) EXPECT_VERIFIES_INLINE(sigs.l_ll(), __VA_ARGS__) 1092 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__) 1093 EXPECT_VERIFIES(l_ll, WASM_I64_SUB(WASM_GET_LOCAL(0), WASM_I64V_1(13)));
1094 EXPECT_VERIFIES(l_ll, WASM_I64_MUL(WASM_GET_LOCAL(0), WASM_I64V_1(14)));
1095 EXPECT_VERIFIES(l_ll, WASM_I64_DIVS(WASM_GET_LOCAL(0), WASM_I64V_1(15)));
1096 EXPECT_VERIFIES(l_ll, WASM_I64_DIVU(WASM_GET_LOCAL(0), WASM_I64V_1(16)));
1097 EXPECT_VERIFIES(l_ll, WASM_I64_REMS(WASM_GET_LOCAL(0), WASM_I64V_1(17)));
1098 EXPECT_VERIFIES(l_ll, WASM_I64_REMU(WASM_GET_LOCAL(0), WASM_I64V_1(18)));
1099 EXPECT_VERIFIES(l_ll, WASM_I64_AND(WASM_GET_LOCAL(0), WASM_I64V_1(19)));
1100 EXPECT_VERIFIES(l_ll, WASM_I64_IOR(WASM_GET_LOCAL(0), WASM_I64V_1(20)));
1101 EXPECT_VERIFIES(l_ll, WASM_I64_XOR(WASM_GET_LOCAL(0), WASM_I64V_1(21)));
1028 1102
1029 VERIFY_L_LL(WASM_I64_ADD(WASM_GET_LOCAL(0), WASM_I64V_1(12))); 1103 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))); 1104 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))); 1105 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))); 1106 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))); 1107 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 1108
1040 VERIFY_L_LL(WASM_I64_SHL(WASM_GET_LOCAL(0), WASM_I64V_1(22))); 1109 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))); 1110 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))); 1111 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))); 1112 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 1113
1046 VERIFY_I_LL(WASM_I64_LTS(WASM_GET_LOCAL(0), WASM_I64V_1(26))); 1114 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))); 1115 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))); 1116 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))); 1117 EXPECT_VERIFIES(i_ll, WASM_I64_GEU(WASM_GET_LOCAL(0), WASM_I64V_1(29)));
1050 1118
1051 VERIFY_I_LL(WASM_I64_GTS(WASM_GET_LOCAL(0), WASM_I64V_1(26))); 1119 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))); 1120 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 } 1121 }
1059 1122
1060 TEST_F(AstDecoderTest, AllSimpleExpressions) { 1123 TEST_F(AstDecoderTest, AllSimpleExpressions) {
1061 // Test all simple expressions which are described by a signature. 1124 // Test all simple expressions which are described by a signature.
1062 #define DECODE_TEST(name, opcode, sig) \ 1125 #define DECODE_TEST(name, opcode, sig) \
1063 { \ 1126 { \
1064 FunctionSig* sig = WasmOpcodes::Signature(kExpr##name); \ 1127 FunctionSig* sig = WasmOpcodes::Signature(kExpr##name); \
1065 if (sig->parameter_count() == 1) { \ 1128 if (sig->parameter_count() == 1) { \
1066 TestUnop(kExpr##name, sig); \ 1129 TestUnop(kExpr##name, sig); \
1067 } else { \ 1130 } else { \
1068 TestBinop(kExpr##name, sig); \ 1131 TestBinop(kExpr##name, sig); \
1069 } \ 1132 } \
1070 } 1133 }
1071 1134
1072 FOREACH_SIMPLE_OPCODE(DECODE_TEST); 1135 FOREACH_SIMPLE_OPCODE(DECODE_TEST);
1073 1136
1074 #undef DECODE_TEST 1137 #undef DECODE_TEST
1075 } 1138 }
1076 1139
1077 TEST_F(AstDecoderTest, MemorySize) { 1140 TEST_F(AstDecoderTest, MemorySize) {
1078 byte code[] = {kExprMemorySize}; 1141 byte code[] = {kExprMemorySize};
1079 EXPECT_VERIFIES(sigs.i_i(), code); 1142 EXPECT_VERIFIES_C(i_i, code);
1080 EXPECT_FAILURE(sigs.f_ff(), code); 1143 EXPECT_FAILURE_C(f_ff, code);
1081 } 1144 }
1082 1145
1083 TEST_F(AstDecoderTest, LoadMemOffset) { 1146 TEST_F(AstDecoderTest, LoadMemOffset) {
1084 for (int offset = 0; offset < 128; offset += 7) { 1147 for (int offset = 0; offset < 128; offset += 7) {
1085 byte code[] = {kExprI8Const, 0, kExprI32LoadMem, ZERO_ALIGNMENT, 1148 byte code[] = {kExprI8Const, 0, kExprI32LoadMem, ZERO_ALIGNMENT,
1086 static_cast<byte>(offset)}; 1149 static_cast<byte>(offset)};
1087 EXPECT_VERIFIES(sigs.i_i(), code); 1150 EXPECT_VERIFIES_C(i_i, code);
1088 } 1151 }
1089 } 1152 }
1090 1153
1091 TEST_F(AstDecoderTest, LoadMemAlignment) { 1154 TEST_F(AstDecoderTest, LoadMemAlignment) {
1092 struct { 1155 struct {
1093 WasmOpcode instruction; 1156 WasmOpcode instruction;
1094 uint32_t maximum_aligment; 1157 uint32_t maximum_aligment;
1095 } values[] = { 1158 } values[] = {
1096 {kExprI32LoadMem8U, 0}, // -- 1159 {kExprI32LoadMem8U, 0}, // --
1097 {kExprI32LoadMem8S, 0}, // -- 1160 {kExprI32LoadMem8S, 0}, // --
1098 {kExprI32LoadMem16U, 1}, // -- 1161 {kExprI32LoadMem16U, 1}, // --
1099 {kExprI32LoadMem16S, 1}, // -- 1162 {kExprI32LoadMem16S, 1}, // --
1100 {kExprI64LoadMem8U, 0}, // -- 1163 {kExprI64LoadMem8U, 0}, // --
1101 {kExprI64LoadMem8S, 0}, // -- 1164 {kExprI64LoadMem8S, 0}, // --
1102 {kExprI64LoadMem16U, 1}, // -- 1165 {kExprI64LoadMem16U, 1}, // --
1103 {kExprI64LoadMem16S, 1}, // -- 1166 {kExprI64LoadMem16S, 1}, // --
1104 {kExprI64LoadMem32U, 2}, // -- 1167 {kExprI64LoadMem32U, 2}, // --
1105 {kExprI64LoadMem32S, 2}, // -- 1168 {kExprI64LoadMem32S, 2}, // --
1106 {kExprI32LoadMem, 2}, // -- 1169 {kExprI32LoadMem, 2}, // --
1107 {kExprI64LoadMem, 3}, // -- 1170 {kExprI64LoadMem, 3}, // --
1108 {kExprF32LoadMem, 2}, // -- 1171 {kExprF32LoadMem, 2}, // --
1109 {kExprF64LoadMem, 3}, // -- 1172 {kExprF64LoadMem, 3}, // --
1110 }; 1173 };
1111 1174
1112 for (int i = 0; i < arraysize(values); i++) { 1175 for (int i = 0; i < arraysize(values); i++) {
1113 for (byte alignment = 0; alignment <= 4; alignment++) { 1176 for (byte alignment = 0; alignment <= 4; alignment++) {
1114 byte code[] = {kExprI8Const, 0, static_cast<byte>(values[i].instruction), 1177 byte code[] = {WASM_ZERO, static_cast<byte>(values[i].instruction),
1115 alignment, ZERO_OFFSET}; 1178 alignment, ZERO_OFFSET, WASM_DROP};
1116 if (static_cast<uint32_t>(alignment) <= values[i].maximum_aligment) { 1179 if (static_cast<uint32_t>(alignment) <= values[i].maximum_aligment) {
1117 EXPECT_VERIFIES(sigs.v_i(), code); 1180 EXPECT_VERIFIES_C(v_i, code);
1118 } else { 1181 } else {
1119 EXPECT_FAILURE(sigs.v_i(), code); 1182 EXPECT_FAILURE_C(v_i, code);
1120 } 1183 }
1121 } 1184 }
1122 } 1185 }
1123 } 1186 }
1124 1187
1125 TEST_F(AstDecoderTest, StoreMemOffset) { 1188 TEST_F(AstDecoderTest, StoreMemOffset) {
1126 for (int offset = 0; offset < 128; offset += 7) { 1189 for (int offset = 0; offset < 128; offset += 7) {
1127 byte code[] = {WASM_STORE_MEM_OFFSET(MachineType::Int32(), offset, 1190 byte code[] = {WASM_STORE_MEM_OFFSET(MachineType::Int32(), offset,
1128 WASM_ZERO, WASM_ZERO)}; 1191 WASM_ZERO, WASM_ZERO)};
1129 EXPECT_VERIFIES(sigs.i_i(), code); 1192 EXPECT_VERIFIES_C(v_i, code);
1130 } 1193 }
1131 } 1194 }
1132 1195
1196 TEST_F(AstDecoderTest, StoreMemOffset_void) {
1197 EXPECT_FAILURE(i_i, WASM_STORE_MEM_OFFSET(MachineType::Int32(), 0, WASM_ZERO,
1198 WASM_ZERO));
1199 }
1200
1133 #define BYTE0(x) ((x)&0x7F) 1201 #define BYTE0(x) ((x)&0x7F)
1134 #define BYTE1(x) ((x >> 7) & 0x7F) 1202 #define BYTE1(x) ((x >> 7) & 0x7F)
1135 #define BYTE2(x) ((x >> 14) & 0x7F) 1203 #define BYTE2(x) ((x >> 14) & 0x7F)
1136 #define BYTE3(x) ((x >> 21) & 0x7F) 1204 #define BYTE3(x) ((x >> 21) & 0x7F)
1137 1205
1138 #define VARINT1(x) BYTE0(x) 1206 #define VARINT1(x) BYTE0(x)
1139 #define VARINT2(x) BYTE0(x) | 0x80, BYTE1(x) 1207 #define VARINT2(x) BYTE0(x) | 0x80, BYTE1(x)
1140 #define VARINT3(x) BYTE0(x) | 0x80, BYTE1(x) | 0x80, BYTE2(x) 1208 #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) 1209 #define VARINT4(x) BYTE0(x) | 0x80, BYTE1(x) | 0x80, BYTE2(x) | 0x80, BYTE3(x)
1142 1210
1143 TEST_F(AstDecoderTest, LoadMemOffset_varint) { 1211 TEST_F(AstDecoderTest, LoadMemOffset_varint) {
1144 EXPECT_VERIFIES_INLINE(sigs.i_i(), WASM_ZERO, kExprI32LoadMem, ZERO_ALIGNMENT, 1212 EXPECT_VERIFIES(i_i, WASM_ZERO, kExprI32LoadMem, ZERO_ALIGNMENT,
1145 VARINT1(0x45)); 1213 VARINT1(0x45));
1146 EXPECT_VERIFIES_INLINE(sigs.i_i(), WASM_ZERO, kExprI32LoadMem, ZERO_ALIGNMENT, 1214 EXPECT_VERIFIES(i_i, WASM_ZERO, kExprI32LoadMem, ZERO_ALIGNMENT,
1147 VARINT2(0x3999)); 1215 VARINT2(0x3999));
1148 EXPECT_VERIFIES_INLINE(sigs.i_i(), WASM_ZERO, kExprI32LoadMem, ZERO_ALIGNMENT, 1216 EXPECT_VERIFIES(i_i, WASM_ZERO, kExprI32LoadMem, ZERO_ALIGNMENT,
1149 VARINT3(0x344445)); 1217 VARINT3(0x344445));
1150 EXPECT_VERIFIES_INLINE(sigs.i_i(), WASM_ZERO, kExprI32LoadMem, ZERO_ALIGNMENT, 1218 EXPECT_VERIFIES(i_i, WASM_ZERO, kExprI32LoadMem, ZERO_ALIGNMENT,
1151 VARINT4(0x36666667)); 1219 VARINT4(0x36666667));
1152 } 1220 }
1153 1221
1154 TEST_F(AstDecoderTest, StoreMemOffset_varint) { 1222 TEST_F(AstDecoderTest, StoreMemOffset_varint) {
1155 EXPECT_VERIFIES_INLINE(sigs.i_i(), WASM_ZERO, WASM_ZERO, kExprI32StoreMem, 1223 EXPECT_VERIFIES(v_i, WASM_ZERO, WASM_ZERO, kExprI32StoreMem, ZERO_ALIGNMENT,
1156 ZERO_ALIGNMENT, VARINT1(0x33)); 1224 VARINT1(0x33));
1157 EXPECT_VERIFIES_INLINE(sigs.i_i(), WASM_ZERO, WASM_ZERO, kExprI32StoreMem, 1225 EXPECT_VERIFIES(v_i, WASM_ZERO, WASM_ZERO, kExprI32StoreMem, ZERO_ALIGNMENT,
1158 ZERO_ALIGNMENT, VARINT2(0x1111)); 1226 VARINT2(0x1111));
1159 EXPECT_VERIFIES_INLINE(sigs.i_i(), WASM_ZERO, WASM_ZERO, kExprI32StoreMem, 1227 EXPECT_VERIFIES(v_i, WASM_ZERO, WASM_ZERO, kExprI32StoreMem, ZERO_ALIGNMENT,
1160 ZERO_ALIGNMENT, VARINT3(0x222222)); 1228 VARINT3(0x222222));
1161 EXPECT_VERIFIES_INLINE(sigs.i_i(), WASM_ZERO, WASM_ZERO, kExprI32StoreMem, 1229 EXPECT_VERIFIES(v_i, WASM_ZERO, WASM_ZERO, kExprI32StoreMem, ZERO_ALIGNMENT,
1162 ZERO_ALIGNMENT, VARINT4(0x44444444)); 1230 VARINT4(0x44444444));
1163 } 1231 }
1164 1232
1165 TEST_F(AstDecoderTest, AllLoadMemCombinations) { 1233 TEST_F(AstDecoderTest, AllLoadMemCombinations) {
1166 for (size_t i = 0; i < arraysize(kLocalTypes); i++) { 1234 for (size_t i = 0; i < arraysize(kLocalTypes); i++) {
1167 LocalType local_type = kLocalTypes[i]; 1235 LocalType local_type = kLocalTypes[i];
1168 for (size_t j = 0; j < arraysize(machineTypes); j++) { 1236 for (size_t j = 0; j < arraysize(machineTypes); j++) {
1169 MachineType mem_type = machineTypes[j]; 1237 MachineType mem_type = machineTypes[j];
1170 byte code[] = {WASM_LOAD_MEM(mem_type, WASM_ZERO)}; 1238 byte code[] = {WASM_LOAD_MEM(mem_type, WASM_ZERO)};
1171 FunctionSig sig(1, 0, &local_type); 1239 FunctionSig sig(1, 0, &local_type);
1172 if (local_type == WasmOpcodes::LocalTypeFor(mem_type)) { 1240 if (local_type == WasmOpcodes::LocalTypeFor(mem_type)) {
1173 EXPECT_VERIFIES(&sig, code); 1241 EXPECT_VERIFIES_SC(&sig, code);
1174 } else { 1242 } else {
1175 EXPECT_FAILURE(&sig, code); 1243 EXPECT_FAILURE_SC(&sig, code);
1176 } 1244 }
1177 } 1245 }
1178 } 1246 }
1179 } 1247 }
1180 1248
1181 TEST_F(AstDecoderTest, AllStoreMemCombinations) { 1249 TEST_F(AstDecoderTest, AllStoreMemCombinations) {
1182 for (size_t i = 0; i < arraysize(kLocalTypes); i++) { 1250 for (size_t i = 0; i < arraysize(kLocalTypes); i++) {
1183 LocalType local_type = kLocalTypes[i]; 1251 LocalType local_type = kLocalTypes[i];
1184 for (size_t j = 0; j < arraysize(machineTypes); j++) { 1252 for (size_t j = 0; j < arraysize(machineTypes); j++) {
1185 MachineType mem_type = machineTypes[j]; 1253 MachineType mem_type = machineTypes[j];
1186 byte code[] = {WASM_STORE_MEM(mem_type, WASM_ZERO, WASM_GET_LOCAL(0))}; 1254 byte code[] = {WASM_STORE_MEM(mem_type, WASM_ZERO, WASM_GET_LOCAL(0))};
1187 FunctionSig sig(0, 1, &local_type); 1255 FunctionSig sig(0, 1, &local_type);
1188 if (local_type == WasmOpcodes::LocalTypeFor(mem_type)) { 1256 if (local_type == WasmOpcodes::LocalTypeFor(mem_type)) {
1189 EXPECT_VERIFIES(&sig, code); 1257 EXPECT_VERIFIES_SC(&sig, code);
1190 } else { 1258 } else {
1191 EXPECT_FAILURE(&sig, code); 1259 EXPECT_FAILURE_SC(&sig, code);
1192 } 1260 }
1193 } 1261 }
1194 } 1262 }
1195 } 1263 }
1196 1264
1197 namespace { 1265 namespace {
1198 // A helper for tests that require a module environment for functions and 1266 // A helper for tests that require a module environment for functions and
1199 // globals. 1267 // globals.
1200 class TestModuleEnv : public ModuleEnv { 1268 class TestModuleEnv : public ModuleEnv {
1201 public: 1269 public:
1202 TestModuleEnv() { 1270 TestModuleEnv() {
1203 instance = nullptr; 1271 instance = nullptr;
1204 module = &mod; 1272 module = &mod;
1205 } 1273 }
1206 byte AddGlobal(LocalType type) { 1274 byte AddGlobal(LocalType type, bool mutability = true) {
1207 mod.globals.push_back({0, 0, type, 0, false}); 1275 mod.globals.push_back({type, mutability, NO_INIT, 0, false, false});
1208 CHECK(mod.globals.size() <= 127); 1276 CHECK(mod.globals.size() <= 127);
1209 return static_cast<byte>(mod.globals.size() - 1); 1277 return static_cast<byte>(mod.globals.size() - 1);
1210 } 1278 }
1211 byte AddSignature(FunctionSig* sig) { 1279 byte AddSignature(FunctionSig* sig) {
1212 mod.signatures.push_back(sig); 1280 mod.signatures.push_back(sig);
1213 CHECK(mod.signatures.size() <= 127); 1281 CHECK(mod.signatures.size() <= 127);
1214 return static_cast<byte>(mod.signatures.size() - 1); 1282 return static_cast<byte>(mod.signatures.size() - 1);
1215 } 1283 }
1216 byte AddFunction(FunctionSig* sig) { 1284 byte AddFunction(FunctionSig* sig) {
1217 mod.functions.push_back({sig, // sig 1285 mod.functions.push_back({sig, // sig
1218 0, // func_index 1286 0, // func_index
1219 0, // sig_index 1287 0, // sig_index
1220 0, // name_offset 1288 0, // name_offset
1221 0, // name_length 1289 0, // name_length
1222 0, // code_start_offset 1290 0, // code_start_offset
1223 0}); // code_end_offset 1291 0, // code_end_offset
1292 false, // import
1293 false}); // export
1224 CHECK(mod.functions.size() <= 127); 1294 CHECK(mod.functions.size() <= 127);
1225 return static_cast<byte>(mod.functions.size() - 1); 1295 return static_cast<byte>(mod.functions.size() - 1);
1226 } 1296 }
1227 byte AddImport(FunctionSig* sig) { 1297 byte AddImport(FunctionSig* sig) {
1228 mod.import_table.push_back({sig, // sig 1298 byte result = AddFunction(sig);
1229 0, // sig_index 1299 mod.functions[result].imported = true;
1230 0, // module_name_offset 1300 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 } 1301 }
1237 1302
1238 private: 1303 private:
1239 WasmModule mod; 1304 WasmModule mod;
1240 }; 1305 };
1241 } // namespace 1306 } // namespace
1242 1307
1243 TEST_F(AstDecoderTest, SimpleCalls) { 1308 TEST_F(AstDecoderTest, SimpleCalls) {
1244 FunctionSig* sig = sigs.i_i(); 1309 FunctionSig* sig = sigs.i_i();
1245 TestModuleEnv module_env; 1310 TestModuleEnv module_env;
1246 module = &module_env; 1311 module = &module_env;
1247 1312
1248 module_env.AddFunction(sigs.i_v()); 1313 module_env.AddFunction(sigs.i_v());
1249 module_env.AddFunction(sigs.i_i()); 1314 module_env.AddFunction(sigs.i_i());
1250 module_env.AddFunction(sigs.i_ii()); 1315 module_env.AddFunction(sigs.i_ii());
1251 1316
1252 EXPECT_VERIFIES_INLINE(sig, WASM_CALL_FUNCTION0(0)); 1317 EXPECT_VERIFIES_S(sig, WASM_CALL_FUNCTION0(0));
1253 EXPECT_VERIFIES_INLINE(sig, WASM_CALL_FUNCTION1(1, WASM_I8(27))); 1318 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))); 1319 EXPECT_VERIFIES_S(sig, WASM_CALL_FUNCTION(2, WASM_I8(37), WASM_I8(77)));
1255 } 1320 }
1256 1321
1257 TEST_F(AstDecoderTest, CallsWithTooFewArguments) { 1322 TEST_F(AstDecoderTest, CallsWithTooFewArguments) {
1258 FunctionSig* sig = sigs.i_i(); 1323 FunctionSig* sig = sigs.i_i();
1259 TestModuleEnv module_env; 1324 TestModuleEnv module_env;
1260 module = &module_env; 1325 module = &module_env;
1261 1326
1262 module_env.AddFunction(sigs.i_i()); 1327 module_env.AddFunction(sigs.i_i());
1263 module_env.AddFunction(sigs.i_ii()); 1328 module_env.AddFunction(sigs.i_ii());
1264 module_env.AddFunction(sigs.f_ff()); 1329 module_env.AddFunction(sigs.f_ff());
1265 1330
1266 EXPECT_FAILURE_INLINE(sig, WASM_CALL_FUNCTION0(0)); 1331 EXPECT_FAILURE_S(sig, WASM_CALL_FUNCTION0(0));
1267 EXPECT_FAILURE_INLINE(sig, WASM_CALL_FUNCTION1(1, WASM_ZERO)); 1332 EXPECT_FAILURE_S(sig, WASM_CALL_FUNCTION(1, WASM_ZERO));
1268 EXPECT_FAILURE_INLINE(sig, WASM_CALL_FUNCTION1(2, WASM_GET_LOCAL(0))); 1333 EXPECT_FAILURE_S(sig, WASM_CALL_FUNCTION(2, WASM_GET_LOCAL(0)));
1269 } 1334 }
1270 1335
1271 TEST_F(AstDecoderTest, CallsWithMismatchedSigs2) { 1336 TEST_F(AstDecoderTest, CallsWithMismatchedSigs2) {
1272 FunctionSig* sig = sigs.i_i(); 1337 FunctionSig* sig = sigs.i_i();
1273 TestModuleEnv module_env; 1338 TestModuleEnv module_env;
1274 module = &module_env; 1339 module = &module_env;
1275 1340
1276 module_env.AddFunction(sigs.i_i()); 1341 module_env.AddFunction(sigs.i_i());
1277 1342
1278 EXPECT_FAILURE_INLINE(sig, WASM_CALL_FUNCTION1(0, WASM_I64V_1(17))); 1343 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))); 1344 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))); 1345 EXPECT_FAILURE_S(sig, WASM_CALL_FUNCTION(0, WASM_F64(17.1)));
1281 } 1346 }
1282 1347
1283 TEST_F(AstDecoderTest, CallsWithMismatchedSigs3) { 1348 TEST_F(AstDecoderTest, CallsWithMismatchedSigs3) {
1284 FunctionSig* sig = sigs.i_i(); 1349 FunctionSig* sig = sigs.i_i();
1285 TestModuleEnv module_env; 1350 TestModuleEnv module_env;
1286 module = &module_env; 1351 module = &module_env;
1287 1352
1288 module_env.AddFunction(sigs.i_f()); 1353 module_env.AddFunction(sigs.i_f());
1289 1354
1290 EXPECT_FAILURE_INLINE(sig, WASM_CALL_FUNCTION1(0, WASM_I8(17))); 1355 EXPECT_FAILURE_S(sig, WASM_CALL_FUNCTION(0, WASM_I8(17)));
1291 EXPECT_FAILURE_INLINE(sig, WASM_CALL_FUNCTION1(0, WASM_I64V_1(27))); 1356 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))); 1357 EXPECT_FAILURE_S(sig, WASM_CALL_FUNCTION(0, WASM_F64(37.2)));
1293 1358
1294 module_env.AddFunction(sigs.i_d()); 1359 module_env.AddFunction(sigs.i_d());
1295 1360
1296 EXPECT_FAILURE_INLINE(sig, WASM_CALL_FUNCTION1(1, WASM_I8(16))); 1361 EXPECT_FAILURE_S(sig, WASM_CALL_FUNCTION(1, WASM_I8(16)));
1297 EXPECT_FAILURE_INLINE(sig, WASM_CALL_FUNCTION1(1, WASM_I64V_1(16))); 1362 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))); 1363 EXPECT_FAILURE_S(sig, WASM_CALL_FUNCTION(1, WASM_F32(17.6)));
1364 }
1365
1366 TEST_F(AstDecoderTest, MultiReturn) {
1367 FLAG_wasm_mv_prototype = true;
1368 LocalType storage[] = {kAstI32, kAstI32};
1369 FunctionSig sig_ii_v(2, 0, storage);
1370 FunctionSig sig_v_ii(0, 2, storage);
1371 TestModuleEnv module_env;
1372 module = &module_env;
1373
1374 module_env.AddFunction(&sig_v_ii);
1375 module_env.AddFunction(&sig_ii_v);
1376
1377 EXPECT_VERIFIES_S(&sig_ii_v, WASM_CALL_FUNCTION0(1));
1378 EXPECT_VERIFIES(v_v, WASM_CALL_FUNCTION0(1), WASM_DROP, WASM_DROP);
1379 EXPECT_VERIFIES(v_v, WASM_CALL_FUNCTION0(1), kExprCallFunction, 0);
1380 }
1381
1382 TEST_F(AstDecoderTest, MultiReturnType) {
1383 FLAG_wasm_mv_prototype = true;
1384 for (size_t a = 0; a < arraysize(kLocalTypes); a++) {
1385 for (size_t b = 0; b < arraysize(kLocalTypes); b++) {
1386 for (size_t c = 0; c < arraysize(kLocalTypes); c++) {
1387 for (size_t d = 0; d < arraysize(kLocalTypes); d++) {
1388 LocalType storage_ab[] = {kLocalTypes[a], kLocalTypes[b]};
1389 FunctionSig sig_ab_v(2, 0, storage_ab);
1390 LocalType storage_cd[] = {kLocalTypes[c], kLocalTypes[d]};
1391 FunctionSig sig_cd_v(2, 0, storage_cd);
1392
1393 TestModuleEnv module_env;
1394 module = &module_env;
1395 module_env.AddFunction(&sig_cd_v);
1396
1397 EXPECT_VERIFIES_S(&sig_cd_v, WASM_CALL_FUNCTION0(0));
1398
1399 if (a == c && b == d) {
1400 EXPECT_VERIFIES_S(&sig_ab_v, WASM_CALL_FUNCTION0(0));
1401 } else {
1402 EXPECT_FAILURE_S(&sig_ab_v, WASM_CALL_FUNCTION0(0));
1403 }
1404 }
1405 }
1406 }
1407 }
1299 } 1408 }
1300 1409
1301 TEST_F(AstDecoderTest, SimpleIndirectCalls) { 1410 TEST_F(AstDecoderTest, SimpleIndirectCalls) {
1302 FunctionSig* sig = sigs.i_i(); 1411 FunctionSig* sig = sigs.i_i();
1303 TestModuleEnv module_env; 1412 TestModuleEnv module_env;
1304 module = &module_env; 1413 module = &module_env;
1305 1414
1306 byte f0 = module_env.AddSignature(sigs.i_v()); 1415 byte f0 = module_env.AddSignature(sigs.i_v());
1307 byte f1 = module_env.AddSignature(sigs.i_i()); 1416 byte f1 = module_env.AddSignature(sigs.i_i());
1308 byte f2 = module_env.AddSignature(sigs.i_ii()); 1417 byte f2 = module_env.AddSignature(sigs.i_ii());
1309 1418
1310 EXPECT_VERIFIES_INLINE(sig, WASM_CALL_INDIRECT0(f0, WASM_ZERO)); 1419 EXPECT_VERIFIES_S(sig, WASM_CALL_INDIRECT0(f0, WASM_ZERO));
1311 EXPECT_VERIFIES_INLINE(sig, WASM_CALL_INDIRECT1(f1, WASM_ZERO, WASM_I8(22))); 1420 EXPECT_VERIFIES_S(sig, WASM_CALL_INDIRECT1(f1, WASM_ZERO, WASM_I8(22)));
1312 EXPECT_VERIFIES_INLINE( 1421 EXPECT_VERIFIES_S(
1313 sig, WASM_CALL_INDIRECT2(f2, WASM_ZERO, WASM_I8(32), WASM_I8(72))); 1422 sig, WASM_CALL_INDIRECT2(f2, WASM_ZERO, WASM_I8(32), WASM_I8(72)));
1314 } 1423 }
1315 1424
1316 TEST_F(AstDecoderTest, IndirectCallsOutOfBounds) { 1425 TEST_F(AstDecoderTest, IndirectCallsOutOfBounds) {
1317 FunctionSig* sig = sigs.i_i(); 1426 FunctionSig* sig = sigs.i_i();
1318 TestModuleEnv module_env; 1427 TestModuleEnv module_env;
1319 module = &module_env; 1428 module = &module_env;
1320 1429
1321 EXPECT_FAILURE_INLINE(sig, WASM_CALL_INDIRECT0(0, WASM_ZERO)); 1430 EXPECT_FAILURE_S(sig, WASM_CALL_INDIRECT0(0, WASM_ZERO));
1322 module_env.AddSignature(sigs.i_v()); 1431 module_env.AddSignature(sigs.i_v());
1323 EXPECT_VERIFIES_INLINE(sig, WASM_CALL_INDIRECT0(0, WASM_ZERO)); 1432 EXPECT_VERIFIES_S(sig, WASM_CALL_INDIRECT0(0, WASM_ZERO));
1324 1433
1325 EXPECT_FAILURE_INLINE(sig, WASM_CALL_INDIRECT1(1, WASM_ZERO, WASM_I8(22))); 1434 EXPECT_FAILURE_S(sig, WASM_CALL_INDIRECT1(1, WASM_ZERO, WASM_I8(22)));
1326 module_env.AddSignature(sigs.i_i()); 1435 module_env.AddSignature(sigs.i_i());
1327 EXPECT_VERIFIES_INLINE(sig, WASM_CALL_INDIRECT1(1, WASM_ZERO, WASM_I8(27))); 1436 EXPECT_VERIFIES_S(sig, WASM_CALL_INDIRECT1(1, WASM_ZERO, WASM_I8(27)));
1328 1437
1329 EXPECT_FAILURE_INLINE(sig, WASM_CALL_INDIRECT1(2, WASM_ZERO, WASM_I8(27))); 1438 EXPECT_FAILURE_S(sig, WASM_CALL_INDIRECT1(2, WASM_ZERO, WASM_I8(27)));
1330 } 1439 }
1331 1440
1332 TEST_F(AstDecoderTest, IndirectCallsWithMismatchedSigs3) { 1441 TEST_F(AstDecoderTest, IndirectCallsWithMismatchedSigs3) {
1333 FunctionSig* sig = sigs.i_i(); 1442 FunctionSig* sig = sigs.i_i();
1334 TestModuleEnv module_env; 1443 TestModuleEnv module_env;
1335 module = &module_env; 1444 module = &module_env;
1336 1445
1337 byte f0 = module_env.AddFunction(sigs.i_f()); 1446 byte f0 = module_env.AddFunction(sigs.i_f());
1338 1447
1339 EXPECT_FAILURE_INLINE(sig, WASM_CALL_INDIRECT1(f0, WASM_ZERO, WASM_I8(17))); 1448 EXPECT_FAILURE_S(sig, WASM_CALL_INDIRECT1(f0, WASM_ZERO, WASM_I8(17)));
1340 EXPECT_FAILURE_INLINE(sig, 1449 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))); 1450 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 1451
1345 EXPECT_FAILURE_INLINE(sig, WASM_CALL_INDIRECT0(f0, WASM_I8(17))); 1452 EXPECT_FAILURE_S(sig, WASM_CALL_INDIRECT0(f0, WASM_I8(17)));
1346 EXPECT_FAILURE_INLINE(sig, WASM_CALL_INDIRECT0(f0, WASM_I64V_1(27))); 1453 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))); 1454 EXPECT_FAILURE_S(sig, WASM_CALL_INDIRECT0(f0, WASM_F64(37.2)));
1348 1455
1349 byte f1 = module_env.AddFunction(sigs.i_d()); 1456 byte f1 = module_env.AddFunction(sigs.i_d());
1350 1457
1351 EXPECT_FAILURE_INLINE(sig, WASM_CALL_INDIRECT1(f1, WASM_ZERO, WASM_I8(16))); 1458 EXPECT_FAILURE_S(sig, WASM_CALL_INDIRECT1(f1, WASM_ZERO, WASM_I8(16)));
1352 EXPECT_FAILURE_INLINE(sig, 1459 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))); 1460 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 } 1461 }
1357 1462
1358 TEST_F(AstDecoderTest, SimpleImportCalls) { 1463 TEST_F(AstDecoderTest, SimpleImportCalls) {
1359 FunctionSig* sig = sigs.i_i(); 1464 FunctionSig* sig = sigs.i_i();
1360 TestModuleEnv module_env; 1465 TestModuleEnv module_env;
1361 module = &module_env; 1466 module = &module_env;
1362 1467
1363 byte f0 = module_env.AddImport(sigs.i_v()); 1468 byte f0 = module_env.AddImport(sigs.i_v());
1364 byte f1 = module_env.AddImport(sigs.i_i()); 1469 byte f1 = module_env.AddImport(sigs.i_i());
1365 byte f2 = module_env.AddImport(sigs.i_ii()); 1470 byte f2 = module_env.AddImport(sigs.i_ii());
1366 1471
1367 EXPECT_VERIFIES_INLINE(sig, WASM_CALL_IMPORT0(f0)); 1472 EXPECT_VERIFIES_S(sig, WASM_CALL_FUNCTION0(f0));
1368 EXPECT_VERIFIES_INLINE(sig, WASM_CALL_IMPORT1(f1, WASM_I8(22))); 1473 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))); 1474 EXPECT_VERIFIES_S(sig, WASM_CALL_FUNCTION(f2, WASM_I8(32), WASM_I8(72)));
1370 } 1475 }
1371 1476
1372 TEST_F(AstDecoderTest, ImportCallsWithMismatchedSigs3) { 1477 TEST_F(AstDecoderTest, ImportCallsWithMismatchedSigs3) {
1373 FunctionSig* sig = sigs.i_i(); 1478 FunctionSig* sig = sigs.i_i();
1374 TestModuleEnv module_env; 1479 TestModuleEnv module_env;
1375 module = &module_env; 1480 module = &module_env;
1376 1481
1377 byte f0 = module_env.AddImport(sigs.i_f()); 1482 byte f0 = module_env.AddImport(sigs.i_f());
1378 1483
1379 EXPECT_FAILURE_INLINE(sig, WASM_CALL_IMPORT0(f0)); 1484 EXPECT_FAILURE_S(sig, WASM_CALL_FUNCTION0(f0));
1380 EXPECT_FAILURE_INLINE(sig, WASM_CALL_IMPORT1(f0, WASM_I8(17))); 1485 EXPECT_FAILURE_S(sig, WASM_CALL_FUNCTION(f0, WASM_I8(17)));
1381 EXPECT_FAILURE_INLINE(sig, WASM_CALL_IMPORT1(f0, WASM_I64V_1(27))); 1486 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))); 1487 EXPECT_FAILURE_S(sig, WASM_CALL_FUNCTION(f0, WASM_F64(37.2)));
1383 1488
1384 byte f1 = module_env.AddImport(sigs.i_d()); 1489 byte f1 = module_env.AddImport(sigs.i_d());
1385 1490
1386 EXPECT_FAILURE_INLINE(sig, WASM_CALL_IMPORT0(f1)); 1491 EXPECT_FAILURE_S(sig, WASM_CALL_FUNCTION0(f1));
1387 EXPECT_FAILURE_INLINE(sig, WASM_CALL_IMPORT1(f1, WASM_I8(16))); 1492 EXPECT_FAILURE_S(sig, WASM_CALL_FUNCTION(f1, WASM_I8(16)));
1388 EXPECT_FAILURE_INLINE(sig, WASM_CALL_IMPORT1(f1, WASM_I64V_1(16))); 1493 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))); 1494 EXPECT_FAILURE_S(sig, WASM_CALL_FUNCTION(f1, WASM_F32(17.6)));
1390 } 1495 }
1391 1496
1392 TEST_F(AstDecoderTest, Int32Globals) { 1497 TEST_F(AstDecoderTest, Int32Globals) {
1393 FunctionSig* sig = sigs.i_i(); 1498 FunctionSig* sig = sigs.i_i();
1394 TestModuleEnv module_env; 1499 TestModuleEnv module_env;
1395 module = &module_env; 1500 module = &module_env;
1396 1501
1397 module_env.AddGlobal(kAstI32); 1502 module_env.AddGlobal(kAstI32);
1398 1503
1399 EXPECT_VERIFIES_INLINE(sig, WASM_GET_GLOBAL(0)); 1504 EXPECT_VERIFIES_S(sig, WASM_GET_GLOBAL(0));
1400 EXPECT_VERIFIES_INLINE(sig, WASM_SET_GLOBAL(0, WASM_GET_LOCAL(0))); 1505 EXPECT_FAILURE_S(sig, WASM_SET_GLOBAL(0, WASM_GET_LOCAL(0)));
1506 EXPECT_VERIFIES_S(sig, WASM_SET_GLOBAL(0, WASM_GET_LOCAL(0)), WASM_ZERO);
1507 }
1508
1509 TEST_F(AstDecoderTest, ImmutableGlobal) {
1510 FunctionSig* sig = sigs.v_v();
1511 TestModuleEnv module_env;
1512 module = &module_env;
1513
1514 uint32_t g0 = module_env.AddGlobal(kAstI32, true);
1515 uint32_t g1 = module_env.AddGlobal(kAstI32, false);
1516
1517 EXPECT_VERIFIES_S(sig, WASM_SET_GLOBAL(g0, WASM_ZERO));
1518 EXPECT_FAILURE_S(sig, WASM_SET_GLOBAL(g1, WASM_ZERO));
1401 } 1519 }
1402 1520
1403 TEST_F(AstDecoderTest, Int32Globals_fail) { 1521 TEST_F(AstDecoderTest, Int32Globals_fail) {
1404 FunctionSig* sig = sigs.i_i(); 1522 FunctionSig* sig = sigs.i_i();
1405 TestModuleEnv module_env; 1523 TestModuleEnv module_env;
1406 module = &module_env; 1524 module = &module_env;
1407 1525
1408 module_env.AddGlobal(kAstI64); 1526 module_env.AddGlobal(kAstI64);
1409 module_env.AddGlobal(kAstI64); 1527 module_env.AddGlobal(kAstI64);
1410 module_env.AddGlobal(kAstF32); 1528 module_env.AddGlobal(kAstF32);
1411 module_env.AddGlobal(kAstF64); 1529 module_env.AddGlobal(kAstF64);
1412 1530
1413 EXPECT_FAILURE_INLINE(sig, WASM_GET_GLOBAL(0)); 1531 EXPECT_FAILURE_S(sig, WASM_GET_GLOBAL(0));
1414 EXPECT_FAILURE_INLINE(sig, WASM_GET_GLOBAL(1)); 1532 EXPECT_FAILURE_S(sig, WASM_GET_GLOBAL(1));
1415 EXPECT_FAILURE_INLINE(sig, WASM_GET_GLOBAL(2)); 1533 EXPECT_FAILURE_S(sig, WASM_GET_GLOBAL(2));
1416 EXPECT_FAILURE_INLINE(sig, WASM_GET_GLOBAL(3)); 1534 EXPECT_FAILURE_S(sig, WASM_GET_GLOBAL(3));
1417 1535
1418 EXPECT_FAILURE_INLINE(sig, WASM_SET_GLOBAL(0, WASM_GET_LOCAL(0))); 1536 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))); 1537 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))); 1538 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))); 1539 EXPECT_FAILURE_S(sig, WASM_SET_GLOBAL(3, WASM_GET_LOCAL(0)), WASM_ZERO);
1422 } 1540 }
1423 1541
1424 TEST_F(AstDecoderTest, Int64Globals) { 1542 TEST_F(AstDecoderTest, Int64Globals) {
1425 FunctionSig* sig = sigs.l_l(); 1543 FunctionSig* sig = sigs.l_l();
1426 TestModuleEnv module_env; 1544 TestModuleEnv module_env;
1427 module = &module_env; 1545 module = &module_env;
1428 1546
1429 module_env.AddGlobal(kAstI64); 1547 module_env.AddGlobal(kAstI64);
1430 module_env.AddGlobal(kAstI64); 1548 module_env.AddGlobal(kAstI64);
1431 1549
1432 EXPECT_VERIFIES_INLINE(sig, WASM_GET_GLOBAL(0)); 1550 EXPECT_VERIFIES_S(sig, WASM_GET_GLOBAL(0));
1433 EXPECT_VERIFIES_INLINE(sig, WASM_GET_GLOBAL(1)); 1551 EXPECT_VERIFIES_S(sig, WASM_GET_GLOBAL(1));
1434 1552
1435 EXPECT_VERIFIES_INLINE(sig, WASM_SET_GLOBAL(0, WASM_GET_LOCAL(0))); 1553 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))); 1554 WASM_GET_LOCAL(0));
1555 EXPECT_VERIFIES_S(sig, WASM_SET_GLOBAL(1, WASM_GET_LOCAL(0)),
1556 WASM_GET_LOCAL(0));
1437 } 1557 }
1438 1558
1439 TEST_F(AstDecoderTest, Float32Globals) { 1559 TEST_F(AstDecoderTest, Float32Globals) {
1440 FunctionSig* sig = sigs.f_ff(); 1560 FunctionSig* sig = sigs.f_ff();
1441 TestModuleEnv module_env; 1561 TestModuleEnv module_env;
1442 module = &module_env; 1562 module = &module_env;
1443 1563
1444 module_env.AddGlobal(kAstF32); 1564 module_env.AddGlobal(kAstF32);
1445 1565
1446 EXPECT_VERIFIES_INLINE(sig, WASM_GET_GLOBAL(0)); 1566 EXPECT_VERIFIES_S(sig, WASM_GET_GLOBAL(0));
1447 EXPECT_VERIFIES_INLINE(sig, WASM_SET_GLOBAL(0, WASM_GET_LOCAL(0))); 1567 EXPECT_VERIFIES_S(sig, WASM_SET_GLOBAL(0, WASM_GET_LOCAL(0)),
1568 WASM_GET_LOCAL(0));
1448 } 1569 }
1449 1570
1450 TEST_F(AstDecoderTest, Float64Globals) { 1571 TEST_F(AstDecoderTest, Float64Globals) {
1451 FunctionSig* sig = sigs.d_dd(); 1572 FunctionSig* sig = sigs.d_dd();
1452 TestModuleEnv module_env; 1573 TestModuleEnv module_env;
1453 module = &module_env; 1574 module = &module_env;
1454 1575
1455 module_env.AddGlobal(kAstF64); 1576 module_env.AddGlobal(kAstF64);
1456 1577
1457 EXPECT_VERIFIES_INLINE(sig, WASM_GET_GLOBAL(0)); 1578 EXPECT_VERIFIES_S(sig, WASM_GET_GLOBAL(0));
1458 EXPECT_VERIFIES_INLINE(sig, WASM_SET_GLOBAL(0, WASM_GET_LOCAL(0))); 1579 EXPECT_VERIFIES_S(sig, WASM_SET_GLOBAL(0, WASM_GET_LOCAL(0)),
1580 WASM_GET_LOCAL(0));
1459 } 1581 }
1460 1582
1461 TEST_F(AstDecoderTest, AllGetGlobalCombinations) { 1583 TEST_F(AstDecoderTest, AllGetGlobalCombinations) {
1462 for (size_t i = 0; i < arraysize(kLocalTypes); i++) { 1584 for (size_t i = 0; i < arraysize(kLocalTypes); i++) {
1463 LocalType local_type = kLocalTypes[i]; 1585 LocalType local_type = kLocalTypes[i];
1464 for (size_t j = 0; j < arraysize(kLocalTypes); j++) { 1586 for (size_t j = 0; j < arraysize(kLocalTypes); j++) {
1465 LocalType global_type = kLocalTypes[j]; 1587 LocalType global_type = kLocalTypes[j];
1466 FunctionSig sig(1, 0, &local_type); 1588 FunctionSig sig(1, 0, &local_type);
1467 TestModuleEnv module_env; 1589 TestModuleEnv module_env;
1468 module = &module_env; 1590 module = &module_env;
1469 module_env.AddGlobal(global_type); 1591 module_env.AddGlobal(global_type);
1470 if (local_type == global_type) { 1592 if (local_type == global_type) {
1471 EXPECT_VERIFIES_INLINE(&sig, WASM_GET_GLOBAL(0)); 1593 EXPECT_VERIFIES_S(&sig, WASM_GET_GLOBAL(0));
1472 } else { 1594 } else {
1473 EXPECT_FAILURE_INLINE(&sig, WASM_GET_GLOBAL(0)); 1595 EXPECT_FAILURE_S(&sig, WASM_GET_GLOBAL(0));
1474 } 1596 }
1475 } 1597 }
1476 } 1598 }
1477 } 1599 }
1478 1600
1479 TEST_F(AstDecoderTest, AllSetGlobalCombinations) { 1601 TEST_F(AstDecoderTest, AllSetGlobalCombinations) {
1480 for (size_t i = 0; i < arraysize(kLocalTypes); i++) { 1602 for (size_t i = 0; i < arraysize(kLocalTypes); i++) {
1481 LocalType local_type = kLocalTypes[i]; 1603 LocalType local_type = kLocalTypes[i];
1482 for (size_t j = 0; j < arraysize(kLocalTypes); j++) { 1604 for (size_t j = 0; j < arraysize(kLocalTypes); j++) {
1483 LocalType global_type = kLocalTypes[j]; 1605 LocalType global_type = kLocalTypes[j];
1484 FunctionSig sig(0, 1, &local_type); 1606 FunctionSig sig(0, 1, &local_type);
1485 TestModuleEnv module_env; 1607 TestModuleEnv module_env;
1486 module = &module_env; 1608 module = &module_env;
1487 module_env.AddGlobal(global_type); 1609 module_env.AddGlobal(global_type);
1488 if (local_type == global_type) { 1610 if (local_type == global_type) {
1489 EXPECT_VERIFIES_INLINE(&sig, WASM_SET_GLOBAL(0, WASM_GET_LOCAL(0))); 1611 EXPECT_VERIFIES_S(&sig, WASM_SET_GLOBAL(0, WASM_GET_LOCAL(0)));
1490 } else { 1612 } else {
1491 EXPECT_FAILURE_INLINE(&sig, WASM_SET_GLOBAL(0, WASM_GET_LOCAL(0))); 1613 EXPECT_FAILURE_S(&sig, WASM_SET_GLOBAL(0, WASM_GET_LOCAL(0)));
1492 } 1614 }
1493 } 1615 }
1494 } 1616 }
1495 } 1617 }
1496 1618
1497 TEST_F(AstDecoderTest, WasmGrowMemory) { 1619 TEST_F(AstDecoderTest, WasmGrowMemory) {
1498 TestModuleEnv module_env; 1620 TestModuleEnv module_env;
1499 module = &module_env; 1621 module = &module_env;
1500 module->origin = kWasmOrigin; 1622 module->origin = kWasmOrigin;
1501 1623
1502 byte code[] = {WASM_UNOP(kExprGrowMemory, WASM_GET_LOCAL(0))}; 1624 byte code[] = {WASM_UNOP(kExprGrowMemory, WASM_GET_LOCAL(0))};
1503 EXPECT_VERIFIES(sigs.i_i(), code); 1625 EXPECT_VERIFIES_C(i_i, code);
1504 EXPECT_FAILURE(sigs.i_d(), code); 1626 EXPECT_FAILURE_C(i_d, code);
1505 } 1627 }
1506 1628
1507 TEST_F(AstDecoderTest, AsmJsGrowMemory) { 1629 TEST_F(AstDecoderTest, AsmJsGrowMemory) {
1508 TestModuleEnv module_env; 1630 TestModuleEnv module_env;
1509 module = &module_env; 1631 module = &module_env;
1510 module->origin = kAsmJsOrigin; 1632 module->origin = kAsmJsOrigin;
1511 1633
1512 byte code[] = {WASM_UNOP(kExprGrowMemory, WASM_GET_LOCAL(0))}; 1634 byte code[] = {WASM_UNOP(kExprGrowMemory, WASM_GET_LOCAL(0))};
1513 EXPECT_FAILURE(sigs.i_i(), code); 1635 EXPECT_FAILURE_C(i_i, code);
1514 } 1636 }
1515 1637
1516 TEST_F(AstDecoderTest, AsmJsBinOpsCheckOrigin) { 1638 TEST_F(AstDecoderTest, AsmJsBinOpsCheckOrigin) {
1517 LocalType float32int32float32[] = {kAstF32, kAstI32, kAstF32}; 1639 LocalType float32int32float32[] = {kAstF32, kAstI32, kAstF32};
1518 FunctionSig sig_f_if(1, 2, float32int32float32); 1640 FunctionSig sig_f_if(1, 2, float32int32float32);
1519 LocalType float64int32float64[] = {kAstF64, kAstI32, kAstF64}; 1641 LocalType float64int32float64[] = {kAstF64, kAstI32, kAstF64};
1520 FunctionSig sig_d_id(1, 2, float64int32float64); 1642 FunctionSig sig_d_id(1, 2, float64int32float64);
1521 struct { 1643 struct {
1522 WasmOpcode op; 1644 WasmOpcode op;
1523 FunctionSig* sig; 1645 FunctionSig* sig;
(...skipping 21 matching lines...) Expand all
1545 } 1667 }
1546 } 1668 }
1547 1669
1548 { 1670 {
1549 TestModuleEnv module_env; 1671 TestModuleEnv module_env;
1550 module = &module_env; 1672 module = &module_env;
1551 module->origin = kWasmOrigin; 1673 module->origin = kWasmOrigin;
1552 for (int i = 0; i < arraysize(AsmJsBinOps); i++) { 1674 for (int i = 0; i < arraysize(AsmJsBinOps); i++) {
1553 byte code[] = { 1675 byte code[] = {
1554 WASM_BINOP(AsmJsBinOps[i].op, WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))}; 1676 WASM_BINOP(AsmJsBinOps[i].op, WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))};
1555 EXPECT_FAILURE(AsmJsBinOps[i].sig, code); 1677 EXPECT_FAILURE_SC(AsmJsBinOps[i].sig, code);
1556 } 1678 }
1557 } 1679 }
1558 } 1680 }
1559 1681
1560 TEST_F(AstDecoderTest, AsmJsUnOpsCheckOrigin) { 1682 TEST_F(AstDecoderTest, AsmJsUnOpsCheckOrigin) {
1561 LocalType float32int32[] = {kAstF32, kAstI32}; 1683 LocalType float32int32[] = {kAstF32, kAstI32};
1562 FunctionSig sig_f_i(1, 2, float32int32); 1684 FunctionSig sig_f_i(1, 2, float32int32);
1563 LocalType float64int32[] = {kAstF64, kAstI32}; 1685 LocalType float64int32[] = {kAstF64, kAstI32};
1564 FunctionSig sig_d_i(1, 2, float64int32); 1686 FunctionSig sig_d_i(1, 2, float64int32);
1565 struct { 1687 struct {
(...skipping 26 matching lines...) Expand all
1592 TestUnop(AsmJsUnOps[i].op, AsmJsUnOps[i].sig); 1714 TestUnop(AsmJsUnOps[i].op, AsmJsUnOps[i].sig);
1593 } 1715 }
1594 } 1716 }
1595 1717
1596 { 1718 {
1597 TestModuleEnv module_env; 1719 TestModuleEnv module_env;
1598 module = &module_env; 1720 module = &module_env;
1599 module->origin = kWasmOrigin; 1721 module->origin = kWasmOrigin;
1600 for (int i = 0; i < arraysize(AsmJsUnOps); i++) { 1722 for (int i = 0; i < arraysize(AsmJsUnOps); i++) {
1601 byte code[] = {WASM_UNOP(AsmJsUnOps[i].op, WASM_GET_LOCAL(0))}; 1723 byte code[] = {WASM_UNOP(AsmJsUnOps[i].op, WASM_GET_LOCAL(0))};
1602 EXPECT_FAILURE(AsmJsUnOps[i].sig, code); 1724 EXPECT_FAILURE_SC(AsmJsUnOps[i].sig, code);
1603 } 1725 }
1604 } 1726 }
1605 } 1727 }
1606 1728
1607 TEST_F(AstDecoderTest, BreakEnd) { 1729 TEST_F(AstDecoderTest, BreakEnd) {
1608 EXPECT_VERIFIES_INLINE(sigs.i_i(), 1730 EXPECT_VERIFIES(
1609 B1(WASM_I32_ADD(WASM_BRV(0, WASM_ZERO), WASM_ZERO))); 1731 i_i, WASM_BLOCK_I(WASM_I32_ADD(WASM_BRV(0, WASM_ZERO), WASM_ZERO)));
1610 EXPECT_VERIFIES_INLINE(sigs.i_i(), 1732 EXPECT_VERIFIES(
1611 B1(WASM_I32_ADD(WASM_ZERO, WASM_BRV(0, WASM_ZERO)))); 1733 i_i, WASM_BLOCK_I(WASM_I32_ADD(WASM_ZERO, WASM_BRV(0, WASM_ZERO))));
1612 } 1734 }
1613 1735
1614 TEST_F(AstDecoderTest, BreakIfBinop) { 1736 TEST_F(AstDecoderTest, BreakIfBinop) {
1615 EXPECT_FAILURE_INLINE( 1737 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), 1738 WASM_BRV_IF(0, WASM_ZERO, WASM_ZERO), WASM_ZERO)));
1617 WASM_ZERO))); 1739 EXPECT_VERIFIES(i_i, WASM_BLOCK_I(WASM_I32_ADD(
1618 EXPECT_FAILURE_INLINE(sigs.i_i(), 1740 WASM_ZERO, WASM_BRV_IF(0, WASM_ZERO, WASM_ZERO))));
1619 WASM_BLOCK(WASM_I32_ADD( 1741 EXPECT_VERIFIES_S(
1620 WASM_ZERO, WASM_BRV_IF(0, WASM_ZERO, WASM_ZERO)))); 1742 sigs.f_ff(),
1743 WASM_BLOCK_F(WASM_F32_ABS(WASM_BRV_IF(0, WASM_F32(0.0f), WASM_ZERO))));
1744 }
1745
1746 TEST_F(AstDecoderTest, BreakIfBinop_fail) {
1747 EXPECT_FAILURE_S(
1748 sigs.f_ff(),
1749 WASM_BLOCK_F(WASM_F32_ABS(WASM_BRV_IF(0, WASM_ZERO, WASM_ZERO))));
1750 EXPECT_FAILURE_S(
1751 sigs.i_i(),
1752 WASM_BLOCK_I(WASM_F32_ABS(WASM_BRV_IF(0, WASM_F32(0.0f), WASM_ZERO))));
1621 } 1753 }
1622 1754
1623 TEST_F(AstDecoderTest, BreakNesting1) { 1755 TEST_F(AstDecoderTest, BreakNesting1) {
1624 for (int i = 0; i < 5; i++) { 1756 for (int i = 0; i < 5; i++) {
1625 // (block[2] (loop[2] (if (get p) break[N]) (set p 1)) p) 1757 // (block[2] (loop[2] (if (get p) break[N]) (set p 1)) p)
1626 byte code[] = {WASM_BLOCK( 1758 byte code[] = {WASM_BLOCK_I(
1627 WASM_LOOP(WASM_IF(WASM_GET_LOCAL(0), WASM_BRV(i + 1, WASM_ZERO)), 1759 WASM_LOOP(WASM_IF(WASM_GET_LOCAL(0), WASM_BRV(i + 1, WASM_ZERO)),
1628 WASM_SET_LOCAL(0, WASM_I8(1))), 1760 WASM_SET_LOCAL(0, WASM_I8(1))),
1629 WASM_GET_LOCAL(0))}; 1761 WASM_ZERO)};
1630 if (i < 3) { 1762 if (i < 3) {
1631 EXPECT_VERIFIES(sigs.i_i(), code); 1763 EXPECT_VERIFIES_C(i_i, code);
1632 } else { 1764 } else {
1633 EXPECT_FAILURE(sigs.i_i(), code); 1765 EXPECT_FAILURE_C(i_i, code);
1634 } 1766 }
1635 } 1767 }
1636 } 1768 }
1637 1769
1638 TEST_F(AstDecoderTest, BreakNesting2) { 1770 TEST_F(AstDecoderTest, BreakNesting2) {
1639 AddLocals(kAstI32, 1); 1771 for (int i = 0; i < 7; i++) {
1640 for (int i = 0; i < 5; i++) { 1772 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) 1773 if (i <= 3) {
1642 byte code[] = {B1(WASM_LOOP(WASM_IF(WASM_ZERO, WASM_BREAK(i + 1)), 1774 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 { 1775 } else {
1648 EXPECT_FAILURE(sigs.v_v(), code); 1776 EXPECT_FAILURE_C(v_v, code);
1649 } 1777 }
1650 } 1778 }
1651 } 1779 }
1652 1780
1653 TEST_F(AstDecoderTest, BreakNesting3) { 1781 TEST_F(AstDecoderTest, BreakNesting3) {
1654 for (int i = 0; i < 5; i++) { 1782 for (int i = 0; i < 7; i++) {
1655 // (block[1] (loop[1] (block[1] (if 0 break[N]) 1783 // (block[1] (loop[1] (block[1] (if 0 break[N])
1656 byte code[] = { 1784 byte code[] = {
1657 WASM_BLOCK(WASM_LOOP(B1(WASM_IF(WASM_ZERO, WASM_BREAK(i + 1)))))}; 1785 WASM_BLOCK(WASM_LOOP(B1(WASM_IF(WASM_ZERO, WASM_BR(i + 1)))))};
1658 if (i < 3) { 1786 if (i < 4) {
1659 EXPECT_VERIFIES(sigs.v_v(), code); 1787 EXPECT_VERIFIES_C(v_v, code);
1660 } else { 1788 } else {
1661 EXPECT_FAILURE(sigs.v_v(), code); 1789 EXPECT_FAILURE_C(v_v, code);
1662 } 1790 }
1663 } 1791 }
1664 } 1792 }
1665 1793
1666 TEST_F(AstDecoderTest, BreaksWithMultipleTypes) { 1794 TEST_F(AstDecoderTest, BreaksWithMultipleTypes) {
1667 EXPECT_FAILURE_INLINE(sigs.i_i(), 1795 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))); 1796
1669 1797 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)), 1798 WASM_BRV_IF_ZERO(0, WASM_F32(7.7))));
1671 WASM_BRV_IF_ZERO(0, WASM_F32(7.7)))); 1799 EXPECT_FAILURE(
1672 EXPECT_FAILURE_INLINE(sigs.i_i(), B3(WASM_BRV_IF_ZERO(0, WASM_I8(8)), 1800 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)), 1801 WASM_BRV_IF_ZERO(0, WASM_F32(7.7))));
1674 WASM_BRV_IF_ZERO(0, WASM_F32(7.7)))); 1802 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)), 1803 WASM_BRV_IF_ZERO(0, WASM_F32(7.7)),
1676 WASM_BRV_IF_ZERO(0, WASM_F32(7.7)), 1804 WASM_BRV_IF_ZERO(0, WASM_I8(11))));
1677 WASM_BRV_IF_ZERO(0, WASM_I8(11))));
1678 } 1805 }
1679 1806
1680 TEST_F(AstDecoderTest, BreakNesting_6_levels) { 1807 TEST_F(AstDecoderTest, BreakNesting_6_levels) {
1681 for (int mask = 0; mask < 64; mask++) { 1808 for (int mask = 0; mask < 64; mask++) {
1682 for (int i = 0; i < 14; i++) { 1809 for (int i = 0; i < 14; i++) {
1683 byte code[] = { 1810 byte code[] = {WASM_BLOCK(WASM_BLOCK(
1684 kExprBlock, // -- 1811 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 1812
1699 int depth = 6; 1813 int depth = 6;
1700 for (int l = 0; l < 6; l++) { 1814 int m = mask;
1701 if (mask & (1 << l)) { 1815 for (size_t pos = 0; pos < sizeof(code); pos++) {
1702 code[l] = kExprLoop; 1816 if (code[pos] != kExprBlock) continue;
1703 depth++; 1817 if (m & 1) {
1818 code[pos] = kExprLoop;
1819 code[pos + 1] = kLocalVoid;
1704 } 1820 }
1705 } 1821 m >>= 1;
1706 1822 }
1707 if (i < depth) { 1823
1708 EXPECT_VERIFIES(sigs.v_v(), code); 1824 if (i <= depth) {
1709 } else { 1825 EXPECT_VERIFIES_C(v_v, code);
1710 EXPECT_FAILURE(sigs.v_v(), code); 1826 } else {
1711 } 1827 EXPECT_FAILURE_C(v_v, code);
1712 } 1828 }
1713 } 1829 }
1714 } 1830 }
1715 1831 }
1716 TEST_F(AstDecoderTest, ExprBreak_TypeCheck) { 1832
1833 TEST_F(AstDecoderTest, Break_TypeCheck) {
1717 FunctionSig* sigarray[] = {sigs.i_i(), sigs.l_l(), sigs.f_ff(), sigs.d_dd()}; 1834 FunctionSig* sigarray[] = {sigs.i_i(), sigs.l_l(), sigs.f_ff(), sigs.d_dd()};
1718 for (size_t i = 0; i < arraysize(sigarray); i++) { 1835 for (size_t i = 0; i < arraysize(sigarray); i++) {
1719 FunctionSig* sig = sigarray[i]; 1836 FunctionSig* sig = sigarray[i];
1720 // unify X and X => OK 1837 // unify X and X => OK
1721 EXPECT_VERIFIES_INLINE( 1838 byte code[] = {WASM_BLOCK_T(
1722 sig, B2(WASM_IF(WASM_ZERO, WASM_BRV(0, WASM_GET_LOCAL(0))), 1839 sig->GetReturn(), WASM_IF(WASM_ZERO, WASM_BRV(0, WASM_GET_LOCAL(0))),
1723 WASM_GET_LOCAL(0))); 1840 WASM_GET_LOCAL(0))};
1841 EXPECT_VERIFIES_SC(sig, code);
1724 } 1842 }
1725 1843
1726 // unify i32 and f32 => fail 1844 // unify i32 and f32 => fail
1727 EXPECT_FAILURE_INLINE( 1845 EXPECT_FAILURE(i_i, WASM_BLOCK_I(WASM_IF(WASM_ZERO, WASM_BRV(0, WASM_ZERO)),
1728 sigs.i_i(), 1846 WASM_F32(1.2)));
1729 B2(WASM_IF(WASM_ZERO, WASM_BRV(0, WASM_ZERO)), WASM_F32(1.2)));
1730 1847
1731 // unify f64 and f64 => OK 1848 // unify f64 and f64 => OK
1732 EXPECT_VERIFIES_INLINE( 1849 EXPECT_VERIFIES(
1733 sigs.d_dd(), 1850 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))); 1851 WASM_F64(1.2)));
1735 } 1852 }
1736 1853
1737 TEST_F(AstDecoderTest, ExprBreak_TypeCheckAll) { 1854 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++) { 1855 for (size_t i = 0; i < arraysize(kLocalTypes); i++) {
1744 for (size_t j = 0; j < arraysize(kLocalTypes); j++) { 1856 for (size_t j = 0; j < arraysize(kLocalTypes); j++) {
1745 LocalType storage[] = {kLocalTypes[i], kLocalTypes[i], kLocalTypes[j]}; 1857 LocalType storage[] = {kLocalTypes[i], kLocalTypes[i], kLocalTypes[j]};
1746 FunctionSig sig(1, 2, storage); 1858 FunctionSig sig(1, 2, storage);
1859 byte code[] = {WASM_BLOCK_T(
1860 sig.GetReturn(), WASM_IF(WASM_ZERO, WASM_BRV(0, WASM_GET_LOCAL(0))),
1861 WASM_GET_LOCAL(1))};
1747 1862
1748 if (i == j) { 1863 if (i == j) {
1749 EXPECT_VERIFIES(&sig, code1); 1864 EXPECT_VERIFIES_SC(&sig, code);
1750 EXPECT_VERIFIES(&sig, code2); 1865 } else {
1751 } else { 1866 EXPECT_FAILURE_SC(&sig, code);
1752 EXPECT_FAILURE(&sig, code1); 1867 }
1753 EXPECT_FAILURE(&sig, code2); 1868 }
1754 } 1869 }
1755 } 1870 }
1756 } 1871
1757 } 1872 TEST_F(AstDecoderTest, Break_TypeCheckAll2) {
1758 1873 for (size_t i = 0; i < arraysize(kLocalTypes); i++) {
1759 TEST_F(AstDecoderTest, ExprBr_Unify) { 1874 for (size_t j = 0; j < arraysize(kLocalTypes); j++) {
1875 LocalType storage[] = {kLocalTypes[i], kLocalTypes[i], kLocalTypes[j]};
1876 FunctionSig sig(1, 2, storage);
1877 byte code[] = {WASM_IF_ELSE_T(sig.GetReturn(0), WASM_ZERO,
1878 WASM_BRV_IF_ZERO(0, WASM_GET_LOCAL(0)),
1879 WASM_GET_LOCAL(1))};
1880
1881 if (i == j) {
1882 EXPECT_VERIFIES_SC(&sig, code);
1883 } else {
1884 EXPECT_FAILURE_SC(&sig, code);
1885 }
1886 }
1887 }
1888 }
1889
1890 TEST_F(AstDecoderTest, Break_TypeCheckAll3) {
1891 for (size_t i = 0; i < arraysize(kLocalTypes); i++) {
1892 for (size_t j = 0; j < arraysize(kLocalTypes); j++) {
1893 LocalType storage[] = {kLocalTypes[i], kLocalTypes[i], kLocalTypes[j]};
1894 FunctionSig sig(1, 2, storage);
1895 byte code[] = {WASM_IF_ELSE_T(sig.GetReturn(), WASM_ZERO,
1896 WASM_GET_LOCAL(1),
1897 WASM_BRV_IF_ZERO(0, WASM_GET_LOCAL(0)))};
1898
1899 if (i == j) {
1900 EXPECT_VERIFIES_SC(&sig, code);
1901 } else {
1902 EXPECT_FAILURE_SC(&sig, code);
1903 }
1904 }
1905 }
1906 }
1907
1908 TEST_F(AstDecoderTest, Break_Unify) {
1760 for (int which = 0; which < 2; which++) { 1909 for (int which = 0; which < 2; which++) {
1761 for (size_t i = 0; i < arraysize(kLocalTypes); i++) { 1910 for (size_t i = 0; i < arraysize(kLocalTypes); i++) {
1762 LocalType type = kLocalTypes[i]; 1911 LocalType type = kLocalTypes[i];
1763 LocalType storage[] = {kAstI32, kAstI32, type}; 1912 LocalType storage[] = {kAstI32, kAstI32, type};
1764 FunctionSig sig(1, 2, storage); 1913 FunctionSig sig(1, 2, storage);
1765 1914
1766 byte code1[] = {B2(WASM_IF(WASM_ZERO, WASM_BRV(1, WASM_GET_LOCAL(which))), 1915 byte code1[] = {WASM_BLOCK_T(
1767 WASM_GET_LOCAL(which ^ 1))}; 1916 type, WASM_IF(WASM_ZERO, WASM_BRV(1, WASM_GET_LOCAL(which))),
1768 byte code2[] = { 1917 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 1918
1772 if (type == kAstI32) { 1919 if (type == kAstI32) {
1773 EXPECT_VERIFIES(&sig, code1); 1920 EXPECT_VERIFIES_SC(&sig, code1);
1774 EXPECT_VERIFIES(&sig, code2); 1921 } else {
1775 } else { 1922 EXPECT_FAILURE_SC(&sig, code1);
1776 EXPECT_FAILURE(&sig, code1); 1923 }
1777 EXPECT_FAILURE(&sig, code2); 1924 }
1778 } 1925 }
1779 } 1926 }
1780 } 1927
1781 } 1928 TEST_F(AstDecoderTest, BreakIf_cond_type) {
1782 1929 for (size_t i = 0; i < arraysize(kLocalTypes); i++) {
1783 TEST_F(AstDecoderTest, ExprBrIf_cond_type) { 1930 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)))}; 1931 LocalType types[] = {kLocalTypes[i], kLocalTypes[i], kLocalTypes[j]};
1785 for (size_t i = 0; i < arraysize(kLocalTypes); i++) { 1932 FunctionSig sig(1, 2, types);
1786 for (size_t j = 0; j < arraysize(kLocalTypes); j++) { 1933 byte code[] = {WASM_BLOCK_T(
1787 LocalType types[] = {kLocalTypes[i], kLocalTypes[j]}; 1934 types[0], WASM_BRV_IF(0, WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)))};
1788 FunctionSig sig(0, 2, types); 1935
1789 1936 if (types[2] == kAstI32) {
1790 if (types[1] == kAstI32) { 1937 EXPECT_VERIFIES_SC(&sig, code);
1791 EXPECT_VERIFIES(&sig, code); 1938 } else {
1792 } else { 1939 EXPECT_FAILURE_SC(&sig, code);
1793 EXPECT_FAILURE(&sig, code); 1940 }
1794 } 1941 }
1795 } 1942 }
1796 } 1943 }
1797 } 1944
1798 1945 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++) { 1946 for (size_t i = 0; i < arraysize(kLocalTypes); i++) {
1803 for (size_t j = 0; j < arraysize(kLocalTypes); j++) { 1947 for (size_t j = 0; j < arraysize(kLocalTypes); j++) {
1804 LocalType types[] = {kLocalTypes[i], kLocalTypes[i], kLocalTypes[j], 1948 LocalType types[] = {kLocalTypes[i], kLocalTypes[i], kLocalTypes[j],
1805 kAstI32}; 1949 kAstI32};
1806 FunctionSig sig(1, 3, types); 1950 FunctionSig sig(1, 3, types);
1951 byte code[] = {WASM_BLOCK_T(
1952 types[1], WASM_BRV_IF(0, WASM_GET_LOCAL(1), WASM_GET_LOCAL(2)),
1953 WASM_DROP, WASM_GET_LOCAL(0))};
1807 1954
1808 if (i == j) { 1955 if (i == j) {
1809 EXPECT_VERIFIES(&sig, code); 1956 EXPECT_VERIFIES_SC(&sig, code);
1810 } else { 1957 } else {
1811 EXPECT_FAILURE(&sig, code); 1958 EXPECT_FAILURE_SC(&sig, code);
1812 } 1959 }
1813 } 1960 }
1814 } 1961 }
1815 } 1962 }
1816 1963
1817 TEST_F(AstDecoderTest, ExprBrIf_Unify) { 1964 TEST_F(AstDecoderTest, BreakIf_Unify) {
1818 for (int which = 0; which < 2; which++) { 1965 for (int which = 0; which < 2; which++) {
1819 for (size_t i = 0; i < arraysize(kLocalTypes); i++) { 1966 for (size_t i = 0; i < arraysize(kLocalTypes); i++) {
1820 LocalType type = kLocalTypes[i]; 1967 LocalType type = kLocalTypes[i];
1821 LocalType storage[] = {kAstI32, kAstI32, type}; 1968 LocalType storage[] = {kAstI32, kAstI32, type};
1822 FunctionSig sig(1, 2, storage); 1969 FunctionSig sig(1, 2, storage);
1823 1970 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)), 1971 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 1972
1829 if (type == kAstI32) { 1973 if (type == kAstI32) {
1830 EXPECT_VERIFIES(&sig, code1); 1974 EXPECT_VERIFIES_SC(&sig, code);
1831 EXPECT_VERIFIES(&sig, code2); 1975 } else {
1832 } else { 1976 EXPECT_FAILURE_SC(&sig, code);
1833 EXPECT_FAILURE(&sig, code1);
1834 EXPECT_FAILURE(&sig, code2);
1835 } 1977 }
1836 } 1978 }
1837 } 1979 }
1838 } 1980 }
1839 1981
1840 TEST_F(AstDecoderTest, BrTable0) { 1982 TEST_F(AstDecoderTest, BrTable0) {
1841 static byte code[] = {kExprNop, kExprBrTable, 0, 0}; 1983 static byte code[] = {kExprBrTable, 0, BR_TARGET(0)};
1842 EXPECT_FAILURE(sigs.v_v(), code); 1984 EXPECT_FAILURE_C(v_v, code);
1843 } 1985 }
1844 1986
1845 TEST_F(AstDecoderTest, BrTable0b) { 1987 TEST_F(AstDecoderTest, BrTable0b) {
1846 static byte code[] = {kExprNop, kExprI32Const, 11, kExprBrTable, 0, 0}; 1988 static byte code[] = {kExprI32Const, 11, kExprBrTable, 0, BR_TARGET(0)};
1847 EXPECT_FAILURE(sigs.v_v(), code); 1989 EXPECT_VERIFIES_C(v_v, code);
1848 EXPECT_FAILURE(sigs.i_i(), code); 1990 EXPECT_FAILURE_C(i_i, code);
1849 } 1991 }
1850 1992
1851 TEST_F(AstDecoderTest, BrTable0c) { 1993 TEST_F(AstDecoderTest, BrTable0c) {
1852 static byte code[] = {kExprNop, kExprI32Const, 11, kExprBrTable, 0, 1, 0, 0}; 1994 static byte code[] = {kExprI32Const, 11, kExprBrTable, 0, BR_TARGET(1)};
1853 EXPECT_FAILURE(sigs.v_v(), code); 1995 EXPECT_FAILURE_C(v_v, code);
1854 EXPECT_FAILURE(sigs.i_i(), code); 1996 EXPECT_FAILURE_C(i_i, code);
1855 } 1997 }
1856 1998
1857 TEST_F(AstDecoderTest, BrTable1a) { 1999 TEST_F(AstDecoderTest, BrTable1a) {
1858 static byte code[] = {B1(WASM_BR_TABLE(WASM_I8(67), 0, BR_TARGET(0)))}; 2000 static byte code[] = {B1(WASM_BR_TABLE(WASM_I8(67), 0, BR_TARGET(0)))};
1859 EXPECT_VERIFIES(sigs.v_v(), code); 2001 EXPECT_VERIFIES_C(v_v, code);
1860 } 2002 }
1861 2003
1862 TEST_F(AstDecoderTest, BrTable1b) { 2004 TEST_F(AstDecoderTest, BrTable1b) {
1863 static byte code[] = {B1(WASM_BR_TABLE(WASM_ZERO, 0, BR_TARGET(0)))}; 2005 static byte code[] = {B1(WASM_BR_TABLE(WASM_ZERO, 0, BR_TARGET(0)))};
1864 EXPECT_VERIFIES(sigs.v_v(), code); 2006 EXPECT_VERIFIES_C(v_v, code);
1865 EXPECT_FAILURE(sigs.i_i(), code); 2007 EXPECT_FAILURE_C(i_i, code);
1866 EXPECT_FAILURE(sigs.f_ff(), code); 2008 EXPECT_FAILURE_C(f_ff, code);
1867 EXPECT_FAILURE(sigs.d_dd(), code); 2009 EXPECT_FAILURE_C(d_dd, code);
1868 } 2010 }
1869 2011
1870 TEST_F(AstDecoderTest, BrTable2a) { 2012 TEST_F(AstDecoderTest, BrTable2a) {
1871 static byte code[] = { 2013 static byte code[] = {
1872 B1(WASM_BR_TABLE(WASM_I8(67), 1, BR_TARGET(0), BR_TARGET(0)))}; 2014 B1(WASM_BR_TABLE(WASM_I8(67), 1, BR_TARGET(0), BR_TARGET(0)))};
1873 EXPECT_VERIFIES(sigs.v_v(), code); 2015 EXPECT_VERIFIES_C(v_v, code);
1874 } 2016 }
1875 2017
1876 TEST_F(AstDecoderTest, BrTable2b) { 2018 TEST_F(AstDecoderTest, BrTable2b) {
1877 static byte code[] = {WASM_BLOCK( 2019 static byte code[] = {WASM_BLOCK(
1878 WASM_BLOCK(WASM_BR_TABLE(WASM_I8(67), 1, BR_TARGET(0), BR_TARGET(1))))}; 2020 WASM_BLOCK(WASM_BR_TABLE(WASM_I8(67), 1, BR_TARGET(0), BR_TARGET(1))))};
1879 EXPECT_VERIFIES(sigs.v_v(), code); 2021 EXPECT_VERIFIES_C(v_v, code);
1880 } 2022 }
1881 2023
1882 TEST_F(AstDecoderTest, BrTable_off_end) { 2024 TEST_F(AstDecoderTest, BrTable_off_end) {
1883 static byte code[] = {B1(WASM_BR_TABLE(WASM_GET_LOCAL(0), 0, BR_TARGET(0)))}; 2025 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++) { 2026 for (size_t len = 1; len < sizeof(code); len++) {
1885 Verify(kError, sigs.i_i(), code, code + len); 2027 Verify(kError, sigs.i_i(), code, code + len);
1886 } 2028 }
1887 } 2029 }
1888 2030
1889 TEST_F(AstDecoderTest, BrTable_invalid_br1) { 2031 TEST_F(AstDecoderTest, BrTable_invalid_br1) {
1890 for (int depth = 0; depth < 4; depth++) { 2032 for (int depth = 0; depth < 4; depth++) {
1891 byte code[] = {B1(WASM_BR_TABLE(WASM_GET_LOCAL(0), 0, BR_TARGET(depth)))}; 2033 byte code[] = {B1(WASM_BR_TABLE(WASM_GET_LOCAL(0), 0, BR_TARGET(depth)))};
1892 if (depth == 0) { 2034 if (depth <= 1) {
1893 EXPECT_VERIFIES(sigs.v_i(), code); 2035 EXPECT_VERIFIES_C(v_i, code);
1894 } else { 2036 } else {
1895 EXPECT_FAILURE(sigs.v_i(), code); 2037 EXPECT_FAILURE_C(v_i, code);
1896 } 2038 }
1897 } 2039 }
1898 } 2040 }
1899 2041
1900 TEST_F(AstDecoderTest, BrTable_invalid_br2) { 2042 TEST_F(AstDecoderTest, BrTable_invalid_br2) {
1901 for (int depth = 0; depth < 4; depth++) { 2043 for (int depth = 0; depth < 7; depth++) {
1902 byte code[] = { 2044 byte code[] = {
1903 WASM_LOOP(WASM_BR_TABLE(WASM_GET_LOCAL(0), 0, BR_TARGET(depth)))}; 2045 WASM_LOOP(WASM_BR_TABLE(WASM_GET_LOCAL(0), 0, BR_TARGET(depth)))};
1904 if (depth <= 1) { 2046 if (depth < 2) {
1905 EXPECT_VERIFIES(sigs.v_i(), code); 2047 EXPECT_VERIFIES_C(v_i, code);
1906 } else { 2048 } else {
1907 EXPECT_FAILURE(sigs.v_i(), code); 2049 EXPECT_FAILURE_C(v_i, code);
1908 } 2050 }
1909 } 2051 }
1910 } 2052 }
1911 2053
1912 TEST_F(AstDecoderTest, ExprBreakNesting1) { 2054 TEST_F(AstDecoderTest, Brv1) {
1913 EXPECT_VERIFIES_INLINE(sigs.v_v(), B1(WASM_BRV(0, WASM_ZERO))); 2055 EXPECT_VERIFIES(i_i, WASM_BLOCK_I(WASM_BRV(0, WASM_ZERO)));
1914 EXPECT_VERIFIES_INLINE(sigs.v_v(), B1(WASM_BR(0))); 2056 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))); 2057 }
1916 EXPECT_VERIFIES_INLINE(sigs.v_v(), B1(WASM_BR_IF(0, WASM_ZERO)));
1917 2058
1918 EXPECT_VERIFIES_INLINE(sigs.v_v(), WASM_LOOP(WASM_BRV(0, WASM_ZERO))); 2059 TEST_F(AstDecoderTest, Brv1_type) {
1919 EXPECT_VERIFIES_INLINE(sigs.v_v(), WASM_LOOP(WASM_BR(0))); 2060 EXPECT_VERIFIES(i_ii, WASM_BLOCK_I(WASM_BRV(0, WASM_GET_LOCAL(0))));
1920 EXPECT_VERIFIES_INLINE(sigs.v_v(), 2061 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))); 2062 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))); 2063 EXPECT_VERIFIES(d_dd, WASM_BLOCK_D(WASM_BRV(0, WASM_GET_LOCAL(0))));
2064 }
1923 2065
1924 EXPECT_VERIFIES_INLINE(sigs.v_v(), WASM_LOOP(WASM_BRV(1, WASM_ZERO))); 2066 TEST_F(AstDecoderTest, Brv1_type_n) {
1925 EXPECT_VERIFIES_INLINE(sigs.v_v(), WASM_LOOP(WASM_BR(1))); 2067 EXPECT_FAILURE(i_f, WASM_BLOCK_I(WASM_BRV(0, WASM_GET_LOCAL(0))));
2068 EXPECT_FAILURE(i_d, WASM_BLOCK_I(WASM_BRV(0, WASM_GET_LOCAL(0))));
2069 }
2070
2071 TEST_F(AstDecoderTest, BrvIf1) {
2072 EXPECT_VERIFIES(i_v, WASM_BLOCK_I(WASM_BRV_IF_ZERO(0, WASM_ZERO)));
2073 }
2074
2075 TEST_F(AstDecoderTest, BrvIf1_type) {
2076 EXPECT_VERIFIES(i_i, WASM_BLOCK_I(WASM_BRV_IF_ZERO(0, WASM_GET_LOCAL(0))));
2077 EXPECT_VERIFIES(l_l, WASM_BLOCK_L(WASM_BRV_IF_ZERO(0, WASM_GET_LOCAL(0))));
2078 EXPECT_VERIFIES(f_ff, WASM_BLOCK_F(WASM_BRV_IF_ZERO(0, WASM_GET_LOCAL(0))));
2079 EXPECT_VERIFIES(d_dd, WASM_BLOCK_D(WASM_BRV_IF_ZERO(0, WASM_GET_LOCAL(0))));
2080 }
2081
2082 TEST_F(AstDecoderTest, BrvIf1_type_n) {
2083 EXPECT_FAILURE(i_f, WASM_BLOCK_I(WASM_BRV_IF_ZERO(0, WASM_GET_LOCAL(0))));
2084 EXPECT_FAILURE(i_d, WASM_BLOCK_I(WASM_BRV_IF_ZERO(0, WASM_GET_LOCAL(0))));
1926 } 2085 }
1927 2086
1928 TEST_F(AstDecoderTest, Select) { 2087 TEST_F(AstDecoderTest, Select) {
1929 EXPECT_VERIFIES_INLINE( 2088 EXPECT_VERIFIES(i_i,
1930 sigs.i_i(), WASM_SELECT(WASM_GET_LOCAL(0), WASM_GET_LOCAL(0), WASM_ZERO)); 2089 WASM_SELECT(WASM_GET_LOCAL(0), WASM_GET_LOCAL(0), WASM_ZERO));
1931 EXPECT_VERIFIES_INLINE(sigs.f_ff(), 2090 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)); 2091 EXPECT_VERIFIES(d_dd, WASM_SELECT(WASM_F64(0.0), WASM_F64(0.0), WASM_ZERO));
1933 EXPECT_VERIFIES_INLINE(sigs.d_dd(), 2092 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 } 2093 }
1938 2094
1939 TEST_F(AstDecoderTest, Select_fail1) { 2095 TEST_F(AstDecoderTest, Select_fail1) {
1940 EXPECT_FAILURE_INLINE( 2096 EXPECT_FAILURE(
1941 sigs.i_i(), 2097 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))); 2098 EXPECT_FAILURE(
1943 EXPECT_FAILURE_INLINE( 2099 i_i, WASM_SELECT(WASM_GET_LOCAL(0), WASM_F32(0.0), WASM_GET_LOCAL(0)));
1944 sigs.i_i(), 2100 EXPECT_FAILURE(
1945 WASM_SELECT(WASM_GET_LOCAL(0), WASM_F32(0.0), WASM_GET_LOCAL(0))); 2101 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 } 2102 }
1950 2103
1951 TEST_F(AstDecoderTest, Select_fail2) { 2104 TEST_F(AstDecoderTest, Select_fail2) {
1952 for (size_t i = 0; i < arraysize(kLocalTypes); i++) { 2105 for (size_t i = 0; i < arraysize(kLocalTypes); i++) {
1953 LocalType type = kLocalTypes[i]; 2106 LocalType type = kLocalTypes[i];
1954 if (type == kAstI32) continue; 2107 if (type == kAstI32) continue;
1955 2108
1956 LocalType types[] = {type, kAstI32, type}; 2109 LocalType types[] = {type, kAstI32, type};
1957 FunctionSig sig(1, 2, types); 2110 FunctionSig sig(1, 2, types);
1958 2111
1959 EXPECT_VERIFIES_INLINE( 2112 EXPECT_VERIFIES_S(&sig, WASM_SELECT(WASM_GET_LOCAL(1), WASM_GET_LOCAL(1),
1960 &sig, 2113 WASM_GET_LOCAL(0)));
1961 WASM_SELECT(WASM_GET_LOCAL(1), WASM_GET_LOCAL(1), WASM_GET_LOCAL(0)));
1962 2114
1963 EXPECT_FAILURE_INLINE( 2115 EXPECT_FAILURE_S(&sig, WASM_SELECT(WASM_GET_LOCAL(1), WASM_GET_LOCAL(0),
1964 &sig, 2116 WASM_GET_LOCAL(0)));
1965 WASM_SELECT(WASM_GET_LOCAL(1), WASM_GET_LOCAL(0), WASM_GET_LOCAL(0)));
1966 2117
1967 EXPECT_FAILURE_INLINE( 2118 EXPECT_FAILURE_S(&sig, WASM_SELECT(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1),
1968 &sig, 2119 WASM_GET_LOCAL(0)));
1969 WASM_SELECT(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1), WASM_GET_LOCAL(0)));
1970 2120
1971 EXPECT_FAILURE_INLINE( 2121 EXPECT_FAILURE_S(&sig, WASM_SELECT(WASM_GET_LOCAL(0), WASM_GET_LOCAL(0),
1972 &sig, 2122 WASM_GET_LOCAL(1)));
1973 WASM_SELECT(WASM_GET_LOCAL(0), WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
1974 } 2123 }
1975 } 2124 }
1976 2125
1977 TEST_F(AstDecoderTest, Select_TypeCheck) { 2126 TEST_F(AstDecoderTest, Select_TypeCheck) {
1978 EXPECT_FAILURE_INLINE( 2127 EXPECT_FAILURE(
1979 sigs.i_i(), 2128 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 2129
1982 EXPECT_FAILURE_INLINE( 2130 EXPECT_FAILURE(
1983 sigs.i_i(), 2131 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 2132
1986 EXPECT_FAILURE_INLINE( 2133 EXPECT_FAILURE(i_i,
1987 sigs.i_i(), 2134 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 } 2135 }
1990 2136
1991 TEST_F(AstDecoderTest, Throw) { 2137 TEST_F(AstDecoderTest, Throw) {
1992 FLAG_wasm_eh_prototype = true; 2138 FLAG_wasm_eh_prototype = true;
1993 EXPECT_VERIFIES_INLINE(sigs.v_i(), WASM_GET_LOCAL(0), kExprThrow); 2139 EXPECT_VERIFIES(v_i, WASM_GET_LOCAL(0), kExprThrow);
1994 2140
1995 EXPECT_FAILURE_INLINE(sigs.i_d(), WASM_GET_LOCAL(0), kExprThrow, 2141 EXPECT_FAILURE(i_d, WASM_GET_LOCAL(0), kExprThrow, WASM_I32V(0));
1996 WASM_I32V(0)); 2142 EXPECT_FAILURE(i_f, WASM_GET_LOCAL(0), kExprThrow, WASM_I32V(0));
1997 EXPECT_FAILURE_INLINE(sigs.i_f(), WASM_GET_LOCAL(0), kExprThrow, 2143 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 } 2144 }
2002 2145
2146 #define WASM_TRY_OP kExprTry, kLocalVoid
2147
2003 #define WASM_CATCH(local) kExprCatch, static_cast<byte>(local) 2148 #define WASM_CATCH(local) kExprCatch, static_cast<byte>(local)
2149
2004 TEST_F(AstDecoderTest, TryCatch) { 2150 TEST_F(AstDecoderTest, TryCatch) {
2005 FLAG_wasm_eh_prototype = true; 2151 FLAG_wasm_eh_prototype = true;
2006 EXPECT_VERIFIES_INLINE(sigs.v_i(), kExprTry, WASM_CATCH(0), kExprEnd); 2152 EXPECT_VERIFIES(v_i, WASM_TRY_OP, WASM_CATCH(0), kExprEnd);
2007 2153
2008 // Missing catch. 2154 // Missing catch.
2009 EXPECT_FAILURE_INLINE(sigs.v_v(), kExprTry, kExprEnd); 2155 EXPECT_FAILURE(v_v, WASM_TRY_OP, kExprEnd);
2010 2156
2011 // Missing end. 2157 // Missing end.
2012 EXPECT_FAILURE_INLINE(sigs.v_i(), kExprTry, WASM_CATCH(0)); 2158 EXPECT_FAILURE(v_i, WASM_TRY_OP, WASM_CATCH(0));
2013 2159
2014 // Double catch. 2160 // Double catch.
2015 EXPECT_FAILURE_INLINE(sigs.v_i(), kExprTry, WASM_CATCH(0), WASM_CATCH(0), 2161 EXPECT_FAILURE(v_i, WASM_TRY_OP, WASM_CATCH(0), WASM_CATCH(0), kExprEnd);
2016 kExprEnd); 2162 }
2163
2164 TEST_F(AstDecoderTest, MultiValBlock1) {
2165 FLAG_wasm_mv_prototype = true;
2166 EXPECT_VERIFIES(i_ii, WASM_BLOCK_TT(kAstI32, kAstI32, WASM_GET_LOCAL(0),
2167 WASM_GET_LOCAL(1)),
2168 kExprI32Add);
2169 }
2170
2171 TEST_F(AstDecoderTest, MultiValBlock2) {
2172 FLAG_wasm_mv_prototype = true;
2173 EXPECT_VERIFIES(i_ii, WASM_BLOCK_TT(kAstI32, kAstI32, WASM_GET_LOCAL(0),
2174 WASM_GET_LOCAL(1)),
2175 WASM_I32_ADD(WASM_NOP, WASM_NOP));
2176 }
2177
2178 TEST_F(AstDecoderTest, MultiValBlockBr1) {
2179 FLAG_wasm_mv_prototype = true;
2180 EXPECT_FAILURE(i_ii,
2181 WASM_BLOCK_TT(kAstI32, kAstI32, WASM_GET_LOCAL(0), WASM_BR(0)),
2182 kExprI32Add);
2183 EXPECT_VERIFIES(i_ii, WASM_BLOCK_TT(kAstI32, kAstI32, WASM_GET_LOCAL(0),
2184 WASM_GET_LOCAL(1), WASM_BR(0)),
2185 kExprI32Add);
2186 }
2187
2188 TEST_F(AstDecoderTest, MultiValIf1) {
2189 FLAG_wasm_mv_prototype = true;
2190 EXPECT_FAILURE(
2191 i_ii, WASM_IF_ELSE_TT(kAstI32, kAstI32, WASM_GET_LOCAL(0),
2192 WASM_SEQ(WASM_GET_LOCAL(0)),
2193 WASM_SEQ(WASM_GET_LOCAL(1), WASM_GET_LOCAL(0))),
2194 kExprI32Add);
2195 EXPECT_FAILURE(i_ii,
2196 WASM_IF_ELSE_TT(kAstI32, kAstI32, WASM_GET_LOCAL(0),
2197 WASM_SEQ(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)),
2198 WASM_SEQ(WASM_GET_LOCAL(1))),
2199 kExprI32Add);
2200 EXPECT_VERIFIES(
2201 i_ii, WASM_IF_ELSE_TT(kAstI32, kAstI32, WASM_GET_LOCAL(0),
2202 WASM_SEQ(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)),
2203 WASM_SEQ(WASM_GET_LOCAL(1), WASM_GET_LOCAL(0))),
2204 kExprI32Add);
2205 }
2206
2207 class BranchTableIteratorTest : public TestWithZone {
2208 public:
2209 BranchTableIteratorTest() : TestWithZone() {}
2210 void CheckBrTableSize(const byte* start, const byte* end) {
2211 Decoder decoder(start, end);
2212 BranchTableOperand operand(&decoder, start);
2213 BranchTableIterator iterator(&decoder, operand);
2214 EXPECT_EQ(end - start - 1, iterator.length());
2215 EXPECT_TRUE(decoder.ok());
2216 }
2217 void CheckBrTableError(const byte* start, const byte* end) {
2218 Decoder decoder(start, end);
2219 BranchTableOperand operand(&decoder, start);
2220 BranchTableIterator iterator(&decoder, operand);
2221 iterator.length();
2222 EXPECT_FALSE(decoder.ok());
2223 }
2224 };
2225
2226 #define CHECK_BR_TABLE_LENGTH(...) \
2227 { \
2228 static byte code[] = {kExprBrTable, __VA_ARGS__}; \
2229 CheckBrTableSize(code, code + sizeof(code)); \
2230 }
2231
2232 #define CHECK_BR_TABLE_ERROR(...) \
2233 { \
2234 static byte code[] = {kExprBrTable, __VA_ARGS__}; \
2235 CheckBrTableError(code, code + sizeof(code)); \
2236 }
2237
2238 TEST_F(BranchTableIteratorTest, count0) {
2239 CHECK_BR_TABLE_LENGTH(0, U32V_1(1));
2240 CHECK_BR_TABLE_LENGTH(0, U32V_2(200));
2241 CHECK_BR_TABLE_LENGTH(0, U32V_3(30000));
2242 CHECK_BR_TABLE_LENGTH(0, U32V_4(400000));
2243
2244 CHECK_BR_TABLE_LENGTH(0, U32V_1(2));
2245 CHECK_BR_TABLE_LENGTH(0, U32V_2(300));
2246 CHECK_BR_TABLE_LENGTH(0, U32V_3(40000));
2247 CHECK_BR_TABLE_LENGTH(0, U32V_4(500000));
2248 }
2249
2250 TEST_F(BranchTableIteratorTest, count1) {
2251 CHECK_BR_TABLE_LENGTH(1, U32V_1(1), U32V_1(6));
2252 CHECK_BR_TABLE_LENGTH(1, U32V_2(200), U32V_1(8));
2253 CHECK_BR_TABLE_LENGTH(1, U32V_3(30000), U32V_1(9));
2254 CHECK_BR_TABLE_LENGTH(1, U32V_4(400000), U32V_1(11));
2255
2256 CHECK_BR_TABLE_LENGTH(1, U32V_1(2), U32V_2(6));
2257 CHECK_BR_TABLE_LENGTH(1, U32V_2(300), U32V_2(7));
2258 CHECK_BR_TABLE_LENGTH(1, U32V_3(40000), U32V_2(8));
2259 CHECK_BR_TABLE_LENGTH(1, U32V_4(500000), U32V_2(9));
2260 }
2261
2262 TEST_F(BranchTableIteratorTest, error0) {
2263 CHECK_BR_TABLE_ERROR(0);
2264 CHECK_BR_TABLE_ERROR(1, U32V_1(33));
2017 } 2265 }
2018 2266
2019 class WasmOpcodeLengthTest : public TestWithZone { 2267 class WasmOpcodeLengthTest : public TestWithZone {
2020 public: 2268 public:
2021 WasmOpcodeLengthTest() : TestWithZone() {} 2269 WasmOpcodeLengthTest() : TestWithZone() {}
2022 }; 2270 };
2023 2271
2024 #define EXPECT_LENGTH(expected, opcode) \ 2272 #define EXPECT_LENGTH(expected, opcode) \
2025 { \ 2273 { \
2026 static const byte code[] = {opcode, 0, 0, 0, 0, 0, 0, 0, 0}; \ 2274 static const byte code[] = {opcode, 0, 0, 0, 0, 0, 0, 0, 0}; \
2027 EXPECT_EQ(expected, OpcodeLength(code, code + sizeof(code))); \ 2275 EXPECT_EQ(expected, OpcodeLength(code, code + sizeof(code))); \
2028 } 2276 }
2029 2277
2030 #define EXPECT_LENGTH_N(expected, ...) \ 2278 #define EXPECT_LENGTH_N(expected, ...) \
2031 { \ 2279 { \
2032 static const byte code[] = {__VA_ARGS__}; \ 2280 static const byte code[] = {__VA_ARGS__}; \
2033 EXPECT_EQ(expected, OpcodeLength(code, code + sizeof(code))); \ 2281 EXPECT_EQ(expected, OpcodeLength(code, code + sizeof(code))); \
2034 } 2282 }
2035 2283
2036 TEST_F(WasmOpcodeLengthTest, Statements) { 2284 TEST_F(WasmOpcodeLengthTest, Statements) {
2037 EXPECT_LENGTH(1, kExprNop); 2285 EXPECT_LENGTH(1, kExprNop);
2038 EXPECT_LENGTH(1, kExprBlock); 2286 EXPECT_LENGTH(2, kExprBlock);
2039 EXPECT_LENGTH(1, kExprLoop); 2287 EXPECT_LENGTH(2, kExprLoop);
2040 EXPECT_LENGTH(1, kExprIf); 2288 EXPECT_LENGTH(2, kExprIf);
2041 EXPECT_LENGTH(1, kExprElse); 2289 EXPECT_LENGTH(1, kExprElse);
2042 EXPECT_LENGTH(1, kExprEnd); 2290 EXPECT_LENGTH(1, kExprEnd);
2043 EXPECT_LENGTH(1, kExprSelect); 2291 EXPECT_LENGTH(1, kExprSelect);
2044 EXPECT_LENGTH(3, kExprBr); 2292 EXPECT_LENGTH(2, kExprBr);
2045 EXPECT_LENGTH(3, kExprBrIf); 2293 EXPECT_LENGTH(2, kExprBrIf);
2046 EXPECT_LENGTH(1, kExprThrow); 2294 EXPECT_LENGTH(1, kExprThrow);
2047 EXPECT_LENGTH(1, kExprTry); 2295 EXPECT_LENGTH(2, kExprTry);
2048 EXPECT_LENGTH(2, kExprCatch); 2296 EXPECT_LENGTH(2, kExprCatch);
2049 } 2297 }
2050 2298
2051 TEST_F(WasmOpcodeLengthTest, MiscExpressions) { 2299 TEST_F(WasmOpcodeLengthTest, MiscExpressions) {
2052 EXPECT_LENGTH(2, kExprI8Const); 2300 EXPECT_LENGTH(2, kExprI8Const);
2053 EXPECT_LENGTH(5, kExprF32Const); 2301 EXPECT_LENGTH(5, kExprF32Const);
2054 EXPECT_LENGTH(9, kExprF64Const); 2302 EXPECT_LENGTH(9, kExprF64Const);
2055 EXPECT_LENGTH(2, kExprGetLocal); 2303 EXPECT_LENGTH(2, kExprGetLocal);
2056 EXPECT_LENGTH(2, kExprSetLocal); 2304 EXPECT_LENGTH(2, kExprSetLocal);
2057 EXPECT_LENGTH(2, kExprGetGlobal); 2305 EXPECT_LENGTH(2, kExprGetGlobal);
2058 EXPECT_LENGTH(2, kExprSetGlobal); 2306 EXPECT_LENGTH(2, kExprSetGlobal);
2059 EXPECT_LENGTH(3, kExprCallFunction); 2307 EXPECT_LENGTH(2, kExprCallFunction);
2060 EXPECT_LENGTH(3, kExprCallImport); 2308 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 } 2309 }
2068 2310
2069 TEST_F(WasmOpcodeLengthTest, I32Const) { 2311 TEST_F(WasmOpcodeLengthTest, I32Const) {
2070 EXPECT_LENGTH_N(2, kExprI32Const, U32V_1(1)); 2312 EXPECT_LENGTH_N(2, kExprI32Const, U32V_1(1));
2071 EXPECT_LENGTH_N(3, kExprI32Const, U32V_2(999)); 2313 EXPECT_LENGTH_N(3, kExprI32Const, U32V_2(999));
2072 EXPECT_LENGTH_N(4, kExprI32Const, U32V_3(9999)); 2314 EXPECT_LENGTH_N(4, kExprI32Const, U32V_3(9999));
2073 EXPECT_LENGTH_N(5, kExprI32Const, U32V_4(999999)); 2315 EXPECT_LENGTH_N(5, kExprI32Const, U32V_4(999999));
2074 EXPECT_LENGTH_N(6, kExprI32Const, U32V_5(99999999)); 2316 EXPECT_LENGTH_N(6, kExprI32Const, U32V_5(99999999));
2075 } 2317 }
2076 2318
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after
2240 EXPECT_LENGTH(1, kExprF64SConvertI32); 2482 EXPECT_LENGTH(1, kExprF64SConvertI32);
2241 EXPECT_LENGTH(1, kExprF64UConvertI32); 2483 EXPECT_LENGTH(1, kExprF64UConvertI32);
2242 EXPECT_LENGTH(1, kExprF64SConvertI64); 2484 EXPECT_LENGTH(1, kExprF64SConvertI64);
2243 EXPECT_LENGTH(1, kExprF64UConvertI64); 2485 EXPECT_LENGTH(1, kExprF64UConvertI64);
2244 EXPECT_LENGTH(1, kExprF64ConvertF32); 2486 EXPECT_LENGTH(1, kExprF64ConvertF32);
2245 EXPECT_LENGTH(1, kExprF64ReinterpretI64); 2487 EXPECT_LENGTH(1, kExprF64ReinterpretI64);
2246 EXPECT_LENGTH(1, kExprI32ReinterpretF32); 2488 EXPECT_LENGTH(1, kExprI32ReinterpretF32);
2247 EXPECT_LENGTH(1, kExprI64ReinterpretF64); 2489 EXPECT_LENGTH(1, kExprI64ReinterpretF64);
2248 } 2490 }
2249 2491
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; 2492 typedef ZoneVector<LocalType> LocalTypeMap;
2493 2493
2494 class LocalDeclDecoderTest : public TestWithZone { 2494 class LocalDeclDecoderTest : public TestWithZone {
2495 public: 2495 public:
2496 base::AccountingAllocator allocator; 2496 base::AccountingAllocator allocator;
2497 2497
2498 size_t ExpectRun(LocalTypeMap map, size_t pos, LocalType expected, 2498 size_t ExpectRun(LocalTypeMap map, size_t pos, LocalType expected,
2499 size_t count) { 2499 size_t count) {
2500 for (size_t i = 0; i < count; i++) { 2500 for (size_t i = 0; i < count; i++) {
2501 EXPECT_EQ(expected, map[pos++]); 2501 EXPECT_EQ(expected, map[pos++]);
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after
2658 iter.next(); 2658 iter.next();
2659 EXPECT_TRUE(iter.has_next()); 2659 EXPECT_TRUE(iter.has_next());
2660 EXPECT_EQ(kExprI8Const, iter.current()); 2660 EXPECT_EQ(kExprI8Const, iter.current());
2661 iter.next(); 2661 iter.next();
2662 EXPECT_FALSE(iter.has_next()); 2662 EXPECT_FALSE(iter.has_next());
2663 } 2663 }
2664 2664
2665 } // namespace wasm 2665 } // namespace wasm
2666 } // namespace internal 2666 } // namespace internal
2667 } // namespace v8 2667 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698