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

Side by Side Diff: test/cctest/wasm/test-run-wasm-64.cc

Issue 2583543002: Revert of [wasm] Make WasmRunner the central test structure (Closed)
Patch Set: Created 4 years 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
« no previous file with comments | « test/cctest/wasm/test-run-wasm.cc ('k') | test/cctest/wasm/test-run-wasm-asmjs.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 <stdint.h> 5 #include <stdint.h>
6 #include <stdlib.h> 6 #include <stdlib.h>
7 #include <string.h> 7 #include <string.h>
8 8
9 #include "src/base/bits.h" 9 #include "src/base/bits.h"
10 #include "src/wasm/wasm-macro-gen.h" 10 #include "src/wasm/wasm-macro-gen.h"
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
113 const int64_t kExpectedValue = (static_cast<int64_t>(*i) << 32) | cntr; 113 const int64_t kExpectedValue = (static_cast<int64_t>(*i) << 32) | cntr;
114 // return(kExpectedValue) 114 // return(kExpectedValue)
115 BUILD(r, WASM_I64V(kExpectedValue)); 115 BUILD(r, WASM_I64V(kExpectedValue));
116 CHECK_EQ(kExpectedValue, r.Call()); 116 CHECK_EQ(kExpectedValue, r.Call());
117 cntr++; 117 cntr++;
118 } 118 }
119 } 119 }
120 120
121 WASM_EXEC_TEST(Return_I64) { 121 WASM_EXEC_TEST(Return_I64) {
122 REQUIRE(I64Return); 122 REQUIRE(I64Return);
123 WasmRunner<int64_t, int64_t> r(execution_mode); 123 WasmRunner<int64_t> r(execution_mode, MachineType::Int64());
124 124
125 BUILD(r, WASM_RETURN1(WASM_GET_LOCAL(0))); 125 BUILD(r, WASM_RETURN1(WASM_GET_LOCAL(0)));
126 126
127 FOR_INT64_INPUTS(i) { CHECK_EQ(*i, r.Call(*i)); } 127 FOR_INT64_INPUTS(i) { CHECK_EQ(*i, r.Call(*i)); }
128 } 128 }
129 129
130 WASM_EXEC_TEST(I64Add) { 130 WASM_EXEC_TEST(I64Add) {
131 REQUIRE(I64Add); 131 REQUIRE(I64Add);
132 WasmRunner<int64_t, int64_t, int64_t> r(execution_mode); 132 WasmRunner<int64_t> r(execution_mode, MachineType::Int64(),
133 MachineType::Int64());
133 BUILD(r, WASM_I64_ADD(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 134 BUILD(r, WASM_I64_ADD(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
134 FOR_INT64_INPUTS(i) { 135 FOR_INT64_INPUTS(i) {
135 FOR_INT64_INPUTS(j) { CHECK_EQ(*i + *j, r.Call(*i, *j)); } 136 FOR_INT64_INPUTS(j) { CHECK_EQ(*i + *j, r.Call(*i, *j)); }
136 } 137 }
137 } 138 }
138 139
139 WASM_EXEC_TEST(I64Sub) { 140 WASM_EXEC_TEST(I64Sub) {
140 REQUIRE(I64Sub); 141 REQUIRE(I64Sub);
141 WasmRunner<int64_t, int64_t, int64_t> r(execution_mode); 142 WasmRunner<int64_t> r(execution_mode, MachineType::Int64(),
143 MachineType::Int64());
142 BUILD(r, WASM_I64_SUB(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 144 BUILD(r, WASM_I64_SUB(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
143 FOR_INT64_INPUTS(i) { 145 FOR_INT64_INPUTS(i) {
144 FOR_INT64_INPUTS(j) { CHECK_EQ(*i - *j, r.Call(*i, *j)); } 146 FOR_INT64_INPUTS(j) { CHECK_EQ(*i - *j, r.Call(*i, *j)); }
145 } 147 }
146 } 148 }
147 149
148 WASM_EXEC_TEST(I64AddUseOnlyLowWord) { 150 WASM_EXEC_TEST(I64AddUseOnlyLowWord) {
149 REQUIRE(I64Add); 151 REQUIRE(I64Add);
150 REQUIRE(I32ConvertI64); 152 REQUIRE(I32ConvertI64);
151 WasmRunner<int32_t, int64_t, int64_t> r(execution_mode); 153 WasmRunner<int32_t> r(execution_mode, MachineType::Int64(),
154 MachineType::Int64());
152 BUILD(r, WASM_I32_CONVERT_I64( 155 BUILD(r, WASM_I32_CONVERT_I64(
153 WASM_I64_ADD(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)))); 156 WASM_I64_ADD(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))));
154 FOR_INT64_INPUTS(i) { 157 FOR_INT64_INPUTS(i) {
155 FOR_INT64_INPUTS(j) { 158 FOR_INT64_INPUTS(j) {
156 CHECK_EQ(static_cast<int32_t>(*i + *j), r.Call(*i, *j)); 159 CHECK_EQ(static_cast<int32_t>(*i + *j), r.Call(*i, *j));
157 } 160 }
158 } 161 }
159 } 162 }
160 163
161 WASM_EXEC_TEST(I64SubUseOnlyLowWord) { 164 WASM_EXEC_TEST(I64SubUseOnlyLowWord) {
162 REQUIRE(I64Sub); 165 REQUIRE(I64Sub);
163 REQUIRE(I32ConvertI64); 166 REQUIRE(I32ConvertI64);
164 WasmRunner<int32_t, int64_t, int64_t> r(execution_mode); 167 WasmRunner<int32_t> r(execution_mode, MachineType::Int64(),
168 MachineType::Int64());
165 BUILD(r, WASM_I32_CONVERT_I64( 169 BUILD(r, WASM_I32_CONVERT_I64(
166 WASM_I64_SUB(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)))); 170 WASM_I64_SUB(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))));
167 FOR_INT64_INPUTS(i) { 171 FOR_INT64_INPUTS(i) {
168 FOR_INT64_INPUTS(j) { 172 FOR_INT64_INPUTS(j) {
169 CHECK_EQ(static_cast<int32_t>(*i - *j), r.Call(*i, *j)); 173 CHECK_EQ(static_cast<int32_t>(*i - *j), r.Call(*i, *j));
170 } 174 }
171 } 175 }
172 } 176 }
173 177
174 WASM_EXEC_TEST(I64MulUseOnlyLowWord) { 178 WASM_EXEC_TEST(I64MulUseOnlyLowWord) {
175 REQUIRE(I64Mul); 179 REQUIRE(I64Mul);
176 REQUIRE(I32ConvertI64); 180 REQUIRE(I32ConvertI64);
177 WasmRunner<int32_t, int64_t, int64_t> r(execution_mode); 181 WasmRunner<int32_t> r(execution_mode, MachineType::Int64(),
182 MachineType::Int64());
178 BUILD(r, WASM_I32_CONVERT_I64( 183 BUILD(r, WASM_I32_CONVERT_I64(
179 WASM_I64_MUL(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)))); 184 WASM_I64_MUL(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))));
180 FOR_INT64_INPUTS(i) { 185 FOR_INT64_INPUTS(i) {
181 FOR_INT64_INPUTS(j) { 186 FOR_INT64_INPUTS(j) {
182 CHECK_EQ(static_cast<int32_t>(*i * *j), r.Call(*i, *j)); 187 CHECK_EQ(static_cast<int32_t>(*i * *j), r.Call(*i, *j));
183 } 188 }
184 } 189 }
185 } 190 }
186 191
187 WASM_EXEC_TEST(I64ShlUseOnlyLowWord) { 192 WASM_EXEC_TEST(I64ShlUseOnlyLowWord) {
188 REQUIRE(I64Shl); 193 REQUIRE(I64Shl);
189 REQUIRE(I32ConvertI64); 194 REQUIRE(I32ConvertI64);
190 WasmRunner<int32_t, int64_t, int64_t> r(execution_mode); 195 WasmRunner<int32_t> r(execution_mode, MachineType::Int64(),
196 MachineType::Int64());
191 BUILD(r, WASM_I32_CONVERT_I64( 197 BUILD(r, WASM_I32_CONVERT_I64(
192 WASM_I64_SHL(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)))); 198 WASM_I64_SHL(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))));
193 FOR_INT64_INPUTS(i) { 199 FOR_INT64_INPUTS(i) {
194 FOR_INT64_INPUTS(j) { 200 FOR_INT64_INPUTS(j) {
195 int32_t expected = static_cast<int32_t>((*i) << (*j & 0x3f)); 201 int32_t expected = static_cast<int32_t>((*i) << (*j & 0x3f));
196 CHECK_EQ(expected, r.Call(*i, *j)); 202 CHECK_EQ(expected, r.Call(*i, *j));
197 } 203 }
198 } 204 }
199 } 205 }
200 206
201 WASM_EXEC_TEST(I64ShrUseOnlyLowWord) { 207 WASM_EXEC_TEST(I64ShrUseOnlyLowWord) {
202 REQUIRE(I64ShrU); 208 REQUIRE(I64ShrU);
203 REQUIRE(I32ConvertI64); 209 REQUIRE(I32ConvertI64);
204 WasmRunner<int32_t, int64_t, int64_t> r(execution_mode); 210 WasmRunner<int32_t> r(execution_mode, MachineType::Int64(),
211 MachineType::Int64());
205 BUILD(r, WASM_I32_CONVERT_I64( 212 BUILD(r, WASM_I32_CONVERT_I64(
206 WASM_I64_SHR(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)))); 213 WASM_I64_SHR(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))));
207 FOR_UINT64_INPUTS(i) { 214 FOR_UINT64_INPUTS(i) {
208 FOR_UINT64_INPUTS(j) { 215 FOR_UINT64_INPUTS(j) {
209 int32_t expected = static_cast<int32_t>((*i) >> (*j & 0x3f)); 216 int32_t expected = static_cast<int32_t>((*i) >> (*j & 0x3f));
210 CHECK_EQ(expected, r.Call(*i, *j)); 217 CHECK_EQ(expected, r.Call(*i, *j));
211 } 218 }
212 } 219 }
213 } 220 }
214 221
215 WASM_EXEC_TEST(I64SarUseOnlyLowWord) { 222 WASM_EXEC_TEST(I64SarUseOnlyLowWord) {
216 REQUIRE(I64ShrS); 223 REQUIRE(I64ShrS);
217 REQUIRE(I32ConvertI64); 224 REQUIRE(I32ConvertI64);
218 WasmRunner<int32_t, int64_t, int64_t> r(execution_mode); 225 WasmRunner<int32_t> r(execution_mode, MachineType::Int64(),
226 MachineType::Int64());
219 BUILD(r, WASM_I32_CONVERT_I64( 227 BUILD(r, WASM_I32_CONVERT_I64(
220 WASM_I64_SAR(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)))); 228 WASM_I64_SAR(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))));
221 FOR_INT64_INPUTS(i) { 229 FOR_INT64_INPUTS(i) {
222 FOR_INT64_INPUTS(j) { 230 FOR_INT64_INPUTS(j) {
223 int32_t expected = static_cast<int32_t>((*i) >> (*j & 0x3f)); 231 int32_t expected = static_cast<int32_t>((*i) >> (*j & 0x3f));
224 CHECK_EQ(expected, r.Call(*i, *j)); 232 CHECK_EQ(expected, r.Call(*i, *j));
225 } 233 }
226 } 234 }
227 } 235 }
228 236
229 WASM_EXEC_TEST_WITH_TRAP(I64DivS) { 237 WASM_EXEC_TEST_WITH_TRAP(I64DivS) {
230 REQUIRE(I64DivS); 238 REQUIRE(I64DivS);
231 WasmRunner<int64_t, int64_t, int64_t> r(execution_mode); 239 WasmRunner<int64_t> r(execution_mode, MachineType::Int64(),
240 MachineType::Int64());
232 BUILD(r, WASM_I64_DIVS(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 241 BUILD(r, WASM_I64_DIVS(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
233 FOR_INT64_INPUTS(i) { 242 FOR_INT64_INPUTS(i) {
234 FOR_INT64_INPUTS(j) { 243 FOR_INT64_INPUTS(j) {
235 if (*j == 0) { 244 if (*j == 0) {
236 CHECK_TRAP64(r.Call(*i, *j)); 245 CHECK_TRAP64(r.Call(*i, *j));
237 } else if (*j == -1 && *i == std::numeric_limits<int64_t>::min()) { 246 } else if (*j == -1 && *i == std::numeric_limits<int64_t>::min()) {
238 CHECK_TRAP64(r.Call(*i, *j)); 247 CHECK_TRAP64(r.Call(*i, *j));
239 } else { 248 } else {
240 CHECK_EQ(*i / *j, r.Call(*i, *j)); 249 CHECK_EQ(*i / *j, r.Call(*i, *j));
241 } 250 }
242 } 251 }
243 } 252 }
244 } 253 }
245 254
246 WASM_EXEC_TEST_WITH_TRAP(I64DivS_Trap) { 255 WASM_EXEC_TEST_WITH_TRAP(I64DivS_Trap) {
247 REQUIRE(I64DivS); 256 REQUIRE(I64DivS);
248 WasmRunner<int64_t, int64_t, int64_t> r(execution_mode); 257 WasmRunner<int64_t> r(execution_mode, MachineType::Int64(),
258 MachineType::Int64());
249 BUILD(r, WASM_I64_DIVS(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 259 BUILD(r, WASM_I64_DIVS(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
250 CHECK_EQ(0, r.Call(asi64(0), asi64(100))); 260 CHECK_EQ(0, r.Call(asi64(0), asi64(100)));
251 CHECK_TRAP64(r.Call(asi64(100), asi64(0))); 261 CHECK_TRAP64(r.Call(asi64(100), asi64(0)));
252 CHECK_TRAP64(r.Call(asi64(-1001), asi64(0))); 262 CHECK_TRAP64(r.Call(asi64(-1001), asi64(0)));
253 CHECK_TRAP64(r.Call(std::numeric_limits<int64_t>::min(), asi64(-1))); 263 CHECK_TRAP64(r.Call(std::numeric_limits<int64_t>::min(), asi64(-1)));
254 CHECK_TRAP64(r.Call(std::numeric_limits<int64_t>::min(), asi64(0))); 264 CHECK_TRAP64(r.Call(std::numeric_limits<int64_t>::min(), asi64(0)));
255 } 265 }
256 266
257 WASM_EXEC_TEST_WITH_TRAP(I64DivS_Byzero_Const) { 267 WASM_EXEC_TEST_WITH_TRAP(I64DivS_Byzero_Const) {
258 REQUIRE(I64DivS); 268 REQUIRE(I64DivS);
259 for (int8_t denom = -2; denom < 8; denom++) { 269 for (int8_t denom = -2; denom < 8; denom++) {
260 WasmRunner<int64_t, int64_t> r(execution_mode); 270 WasmRunner<int64_t> r(execution_mode, MachineType::Int64());
261 BUILD(r, WASM_I64_DIVS(WASM_GET_LOCAL(0), WASM_I64V_1(denom))); 271 BUILD(r, WASM_I64_DIVS(WASM_GET_LOCAL(0), WASM_I64V_1(denom)));
262 for (int64_t val = -7; val < 8; val++) { 272 for (int64_t val = -7; val < 8; val++) {
263 if (denom == 0) { 273 if (denom == 0) {
264 CHECK_TRAP64(r.Call(val)); 274 CHECK_TRAP64(r.Call(val));
265 } else { 275 } else {
266 CHECK_EQ(val / denom, r.Call(val)); 276 CHECK_EQ(val / denom, r.Call(val));
267 } 277 }
268 } 278 }
269 } 279 }
270 } 280 }
271 281
272 WASM_EXEC_TEST_WITH_TRAP(I64DivU) { 282 WASM_EXEC_TEST_WITH_TRAP(I64DivU) {
273 REQUIRE(I64DivU); 283 REQUIRE(I64DivU);
274 WasmRunner<uint64_t, uint64_t, uint64_t> r(execution_mode); 284 WasmRunner<uint64_t> r(execution_mode, MachineType::Uint64(),
285 MachineType::Uint64());
275 BUILD(r, WASM_I64_DIVU(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 286 BUILD(r, WASM_I64_DIVU(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
276 FOR_UINT64_INPUTS(i) { 287 FOR_UINT64_INPUTS(i) {
277 FOR_UINT64_INPUTS(j) { 288 FOR_UINT64_INPUTS(j) {
278 if (*j == 0) { 289 if (*j == 0) {
279 CHECK_TRAP64(r.Call(*i, *j)); 290 CHECK_TRAP64(r.Call(*i, *j));
280 } else { 291 } else {
281 CHECK_EQ(*i / *j, r.Call(*i, *j)); 292 CHECK_EQ(*i / *j, r.Call(*i, *j));
282 } 293 }
283 } 294 }
284 } 295 }
285 } 296 }
286 297
287 WASM_EXEC_TEST_WITH_TRAP(I64DivU_Trap) { 298 WASM_EXEC_TEST_WITH_TRAP(I64DivU_Trap) {
288 REQUIRE(I64DivU); 299 REQUIRE(I64DivU);
289 WasmRunner<uint64_t, uint64_t, uint64_t> r(execution_mode); 300 WasmRunner<uint64_t> r(execution_mode, MachineType::Uint64(),
301 MachineType::Uint64());
290 BUILD(r, WASM_I64_DIVU(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 302 BUILD(r, WASM_I64_DIVU(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
291 CHECK_EQ(0, r.Call(asu64(0), asu64(100))); 303 CHECK_EQ(0u, r.Call(asu64(0), asu64(100)));
292 CHECK_TRAP64(r.Call(asu64(100), asu64(0))); 304 CHECK_TRAP64(r.Call(asu64(100), asu64(0)));
293 CHECK_TRAP64(r.Call(asu64(1001), asu64(0))); 305 CHECK_TRAP64(r.Call(asu64(1001), asu64(0)));
294 CHECK_TRAP64(r.Call(std::numeric_limits<uint64_t>::max(), asu64(0))); 306 CHECK_TRAP64(r.Call(std::numeric_limits<uint64_t>::max(), asu64(0)));
295 } 307 }
296 308
297 WASM_EXEC_TEST_WITH_TRAP(I64DivU_Byzero_Const) { 309 WASM_EXEC_TEST_WITH_TRAP(I64DivU_Byzero_Const) {
298 REQUIRE(I64DivU); 310 REQUIRE(I64DivU);
299 for (uint64_t denom = 0xfffffffffffffffe; denom < 8; denom++) { 311 for (uint64_t denom = 0xfffffffffffffffe; denom < 8; denom++) {
300 WasmRunner<uint64_t, uint64_t> r(execution_mode); 312 WasmRunner<uint64_t> r(execution_mode, MachineType::Uint64());
301 BUILD(r, WASM_I64_DIVU(WASM_GET_LOCAL(0), WASM_I64V_1(denom))); 313 BUILD(r, WASM_I64_DIVU(WASM_GET_LOCAL(0), WASM_I64V_1(denom)));
302 314
303 for (uint64_t val = 0xfffffffffffffff0; val < 8; val++) { 315 for (uint64_t val = 0xfffffffffffffff0; val < 8; val++) {
304 if (denom == 0) { 316 if (denom == 0) {
305 CHECK_TRAP64(r.Call(val)); 317 CHECK_TRAP64(r.Call(val));
306 } else { 318 } else {
307 CHECK_EQ(val / denom, r.Call(val)); 319 CHECK_EQ(val / denom, r.Call(val));
308 } 320 }
309 } 321 }
310 } 322 }
311 } 323 }
312 324
313 WASM_EXEC_TEST_WITH_TRAP(I64RemS) { 325 WASM_EXEC_TEST_WITH_TRAP(I64RemS) {
314 REQUIRE(I64RemS); 326 REQUIRE(I64RemS);
315 WasmRunner<int64_t, int64_t, int64_t> r(execution_mode); 327 WasmRunner<int64_t> r(execution_mode, MachineType::Int64(),
328 MachineType::Int64());
316 BUILD(r, WASM_I64_REMS(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 329 BUILD(r, WASM_I64_REMS(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
317 FOR_INT64_INPUTS(i) { 330 FOR_INT64_INPUTS(i) {
318 FOR_INT64_INPUTS(j) { 331 FOR_INT64_INPUTS(j) {
319 if (*j == 0) { 332 if (*j == 0) {
320 CHECK_TRAP64(r.Call(*i, *j)); 333 CHECK_TRAP64(r.Call(*i, *j));
321 } else { 334 } else {
322 CHECK_EQ(*i % *j, r.Call(*i, *j)); 335 CHECK_EQ(*i % *j, r.Call(*i, *j));
323 } 336 }
324 } 337 }
325 } 338 }
326 } 339 }
327 340
328 WASM_EXEC_TEST_WITH_TRAP(I64RemS_Trap) { 341 WASM_EXEC_TEST_WITH_TRAP(I64RemS_Trap) {
329 REQUIRE(I64RemS); 342 REQUIRE(I64RemS);
330 WasmRunner<int64_t, int64_t, int64_t> r(execution_mode); 343 WasmRunner<int64_t> r(execution_mode, MachineType::Int64(),
344 MachineType::Int64());
331 BUILD(r, WASM_I64_REMS(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 345 BUILD(r, WASM_I64_REMS(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
332 CHECK_EQ(33, r.Call(asi64(133), asi64(100))); 346 CHECK_EQ(33, r.Call(asi64(133), asi64(100)));
333 CHECK_EQ(0, r.Call(std::numeric_limits<int64_t>::min(), asi64(-1))); 347 CHECK_EQ(0, r.Call(std::numeric_limits<int64_t>::min(), asi64(-1)));
334 CHECK_TRAP64(r.Call(asi64(100), asi64(0))); 348 CHECK_TRAP64(r.Call(asi64(100), asi64(0)));
335 CHECK_TRAP64(r.Call(asi64(-1001), asi64(0))); 349 CHECK_TRAP64(r.Call(asi64(-1001), asi64(0)));
336 CHECK_TRAP64(r.Call(std::numeric_limits<int64_t>::min(), asi64(0))); 350 CHECK_TRAP64(r.Call(std::numeric_limits<int64_t>::min(), asi64(0)));
337 } 351 }
338 352
339 WASM_EXEC_TEST_WITH_TRAP(I64RemU) { 353 WASM_EXEC_TEST_WITH_TRAP(I64RemU) {
340 REQUIRE(I64RemU); 354 REQUIRE(I64RemU);
341 WasmRunner<uint64_t, uint64_t, uint64_t> r(execution_mode); 355 WasmRunner<uint64_t> r(execution_mode, MachineType::Uint64(),
356 MachineType::Uint64());
342 BUILD(r, WASM_I64_REMU(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 357 BUILD(r, WASM_I64_REMU(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
343 FOR_UINT64_INPUTS(i) { 358 FOR_UINT64_INPUTS(i) {
344 FOR_UINT64_INPUTS(j) { 359 FOR_UINT64_INPUTS(j) {
345 if (*j == 0) { 360 if (*j == 0) {
346 CHECK_TRAP64(r.Call(*i, *j)); 361 CHECK_TRAP64(r.Call(*i, *j));
347 } else { 362 } else {
348 CHECK_EQ(*i % *j, r.Call(*i, *j)); 363 CHECK_EQ(*i % *j, r.Call(*i, *j));
349 } 364 }
350 } 365 }
351 } 366 }
352 } 367 }
353 368
354 WASM_EXEC_TEST_WITH_TRAP(I64RemU_Trap) { 369 WASM_EXEC_TEST_WITH_TRAP(I64RemU_Trap) {
355 REQUIRE(I64RemU); 370 REQUIRE(I64RemU);
356 WasmRunner<uint64_t, uint64_t, uint64_t> r(execution_mode); 371 WasmRunner<uint64_t> r(execution_mode, MachineType::Uint64(),
372 MachineType::Uint64());
357 BUILD(r, WASM_I64_REMU(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 373 BUILD(r, WASM_I64_REMU(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
358 CHECK_EQ(17, r.Call(asu64(217), asu64(100))); 374 CHECK_EQ(17u, r.Call(asu64(217), asu64(100)));
359 CHECK_TRAP64(r.Call(asu64(100), asu64(0))); 375 CHECK_TRAP64(r.Call(asu64(100), asu64(0)));
360 CHECK_TRAP64(r.Call(asu64(1001), asu64(0))); 376 CHECK_TRAP64(r.Call(asu64(1001), asu64(0)));
361 CHECK_TRAP64(r.Call(std::numeric_limits<uint64_t>::max(), asu64(0))); 377 CHECK_TRAP64(r.Call(std::numeric_limits<uint64_t>::max(), asu64(0)));
362 } 378 }
363 379
364 WASM_EXEC_TEST(I64And) { 380 WASM_EXEC_TEST(I64And) {
365 REQUIRE(I64And); 381 REQUIRE(I64And);
366 WasmRunner<int64_t, int64_t, int64_t> r(execution_mode); 382 WasmRunner<int64_t> r(execution_mode, MachineType::Int64(),
383 MachineType::Int64());
367 BUILD(r, WASM_I64_AND(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 384 BUILD(r, WASM_I64_AND(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
368 FOR_INT64_INPUTS(i) { 385 FOR_INT64_INPUTS(i) {
369 FOR_INT64_INPUTS(j) { CHECK_EQ((*i) & (*j), r.Call(*i, *j)); } 386 FOR_INT64_INPUTS(j) { CHECK_EQ((*i) & (*j), r.Call(*i, *j)); }
370 } 387 }
371 } 388 }
372 389
373 WASM_EXEC_TEST(I64Ior) { 390 WASM_EXEC_TEST(I64Ior) {
374 REQUIRE(I64Ior); 391 REQUIRE(I64Ior);
375 WasmRunner<int64_t, int64_t, int64_t> r(execution_mode); 392 WasmRunner<int64_t> r(execution_mode, MachineType::Int64(),
393 MachineType::Int64());
376 BUILD(r, WASM_I64_IOR(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 394 BUILD(r, WASM_I64_IOR(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
377 FOR_INT64_INPUTS(i) { 395 FOR_INT64_INPUTS(i) {
378 FOR_INT64_INPUTS(j) { CHECK_EQ((*i) | (*j), r.Call(*i, *j)); } 396 FOR_INT64_INPUTS(j) { CHECK_EQ((*i) | (*j), r.Call(*i, *j)); }
379 } 397 }
380 } 398 }
381 399
382 WASM_EXEC_TEST(I64Xor) { 400 WASM_EXEC_TEST(I64Xor) {
383 REQUIRE(I64Xor); 401 REQUIRE(I64Xor);
384 WasmRunner<int64_t, int64_t, int64_t> r(execution_mode); 402 WasmRunner<int64_t> r(execution_mode, MachineType::Int64(),
403 MachineType::Int64());
385 BUILD(r, WASM_I64_XOR(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 404 BUILD(r, WASM_I64_XOR(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
386 FOR_INT64_INPUTS(i) { 405 FOR_INT64_INPUTS(i) {
387 FOR_INT64_INPUTS(j) { CHECK_EQ((*i) ^ (*j), r.Call(*i, *j)); } 406 FOR_INT64_INPUTS(j) { CHECK_EQ((*i) ^ (*j), r.Call(*i, *j)); }
388 } 407 }
389 } 408 }
390 409
391 WASM_EXEC_TEST(I64Shl) { 410 WASM_EXEC_TEST(I64Shl) {
392 REQUIRE(I64Shl); 411 REQUIRE(I64Shl);
393 { 412 {
394 WasmRunner<uint64_t, uint64_t, uint64_t> r(execution_mode); 413 WasmRunner<uint64_t> r(execution_mode, MachineType::Uint64(),
414 MachineType::Uint64());
395 BUILD(r, WASM_I64_SHL(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 415 BUILD(r, WASM_I64_SHL(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
396 416
397 FOR_UINT64_INPUTS(i) { 417 FOR_UINT64_INPUTS(i) {
398 FOR_UINT64_INPUTS(j) { 418 FOR_UINT64_INPUTS(j) {
399 uint64_t expected = (*i) << (*j & 0x3f); 419 uint64_t expected = (*i) << (*j & 0x3f);
400 CHECK_EQ(expected, r.Call(*i, *j)); 420 CHECK_EQ(expected, r.Call(*i, *j));
401 } 421 }
402 } 422 }
403 } 423 }
404 { 424 {
405 WasmRunner<uint64_t, int64_t> r(execution_mode); 425 WasmRunner<uint64_t> r(execution_mode, MachineType::Int64());
406 BUILD(r, WASM_I64_SHL(WASM_GET_LOCAL(0), WASM_I64V_1(0))); 426 BUILD(r, WASM_I64_SHL(WASM_GET_LOCAL(0), WASM_I64V_1(0)));
407 FOR_UINT64_INPUTS(i) { CHECK_EQ(*i << 0, r.Call(*i)); } 427 FOR_UINT64_INPUTS(i) { CHECK_EQ(*i << 0, r.Call(*i)); }
408 } 428 }
409 { 429 {
410 WasmRunner<uint64_t, int64_t> r(execution_mode); 430 WasmRunner<uint64_t> r(execution_mode, MachineType::Int64());
411 BUILD(r, WASM_I64_SHL(WASM_GET_LOCAL(0), WASM_I64V_1(32))); 431 BUILD(r, WASM_I64_SHL(WASM_GET_LOCAL(0), WASM_I64V_1(32)));
412 FOR_UINT64_INPUTS(i) { CHECK_EQ(*i << 32, r.Call(*i)); } 432 FOR_UINT64_INPUTS(i) { CHECK_EQ(*i << 32, r.Call(*i)); }
413 } 433 }
414 { 434 {
415 WasmRunner<uint64_t, int64_t> r(execution_mode); 435 WasmRunner<uint64_t> r(execution_mode, MachineType::Int64());
416 BUILD(r, WASM_I64_SHL(WASM_GET_LOCAL(0), WASM_I64V_1(20))); 436 BUILD(r, WASM_I64_SHL(WASM_GET_LOCAL(0), WASM_I64V_1(20)));
417 FOR_UINT64_INPUTS(i) { CHECK_EQ(*i << 20, r.Call(*i)); } 437 FOR_UINT64_INPUTS(i) { CHECK_EQ(*i << 20, r.Call(*i)); }
418 } 438 }
419 { 439 {
420 WasmRunner<uint64_t, int64_t> r(execution_mode); 440 WasmRunner<uint64_t> r(execution_mode, MachineType::Int64());
421 BUILD(r, WASM_I64_SHL(WASM_GET_LOCAL(0), WASM_I64V_1(40))); 441 BUILD(r, WASM_I64_SHL(WASM_GET_LOCAL(0), WASM_I64V_1(40)));
422 FOR_UINT64_INPUTS(i) { CHECK_EQ(*i << 40, r.Call(*i)); } 442 FOR_UINT64_INPUTS(i) { CHECK_EQ(*i << 40, r.Call(*i)); }
423 } 443 }
424 } 444 }
425 445
426 WASM_EXEC_TEST(I64ShrU) { 446 WASM_EXEC_TEST(I64ShrU) {
427 REQUIRE(I64ShrU); 447 REQUIRE(I64ShrU);
428 { 448 {
429 WasmRunner<uint64_t, uint64_t, uint64_t> r(execution_mode); 449 WasmRunner<uint64_t> r(execution_mode, MachineType::Uint64(),
450 MachineType::Uint64());
430 BUILD(r, WASM_I64_SHR(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 451 BUILD(r, WASM_I64_SHR(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
431 452
432 FOR_UINT64_INPUTS(i) { 453 FOR_UINT64_INPUTS(i) {
433 FOR_UINT64_INPUTS(j) { 454 FOR_UINT64_INPUTS(j) {
434 uint64_t expected = (*i) >> (*j & 0x3f); 455 uint64_t expected = (*i) >> (*j & 0x3f);
435 CHECK_EQ(expected, r.Call(*i, *j)); 456 CHECK_EQ(expected, r.Call(*i, *j));
436 } 457 }
437 } 458 }
438 } 459 }
439 { 460 {
440 WasmRunner<uint64_t, int64_t> r(execution_mode); 461 WasmRunner<uint64_t> r(execution_mode, MachineType::Int64());
441 BUILD(r, WASM_I64_SHR(WASM_GET_LOCAL(0), WASM_I64V_1(0))); 462 BUILD(r, WASM_I64_SHR(WASM_GET_LOCAL(0), WASM_I64V_1(0)));
442 FOR_UINT64_INPUTS(i) { CHECK_EQ(*i >> 0, r.Call(*i)); } 463 FOR_UINT64_INPUTS(i) { CHECK_EQ(*i >> 0, r.Call(*i)); }
443 } 464 }
444 { 465 {
445 WasmRunner<uint64_t, int64_t> r(execution_mode); 466 WasmRunner<uint64_t> r(execution_mode, MachineType::Int64());
446 BUILD(r, WASM_I64_SHR(WASM_GET_LOCAL(0), WASM_I64V_1(32))); 467 BUILD(r, WASM_I64_SHR(WASM_GET_LOCAL(0), WASM_I64V_1(32)));
447 FOR_UINT64_INPUTS(i) { CHECK_EQ(*i >> 32, r.Call(*i)); } 468 FOR_UINT64_INPUTS(i) { CHECK_EQ(*i >> 32, r.Call(*i)); }
448 } 469 }
449 { 470 {
450 WasmRunner<uint64_t, int64_t> r(execution_mode); 471 WasmRunner<uint64_t> r(execution_mode, MachineType::Int64());
451 BUILD(r, WASM_I64_SHR(WASM_GET_LOCAL(0), WASM_I64V_1(20))); 472 BUILD(r, WASM_I64_SHR(WASM_GET_LOCAL(0), WASM_I64V_1(20)));
452 FOR_UINT64_INPUTS(i) { CHECK_EQ(*i >> 20, r.Call(*i)); } 473 FOR_UINT64_INPUTS(i) { CHECK_EQ(*i >> 20, r.Call(*i)); }
453 } 474 }
454 { 475 {
455 WasmRunner<uint64_t, int64_t> r(execution_mode); 476 WasmRunner<uint64_t> r(execution_mode, MachineType::Int64());
456 BUILD(r, WASM_I64_SHR(WASM_GET_LOCAL(0), WASM_I64V_1(40))); 477 BUILD(r, WASM_I64_SHR(WASM_GET_LOCAL(0), WASM_I64V_1(40)));
457 FOR_UINT64_INPUTS(i) { CHECK_EQ(*i >> 40, r.Call(*i)); } 478 FOR_UINT64_INPUTS(i) { CHECK_EQ(*i >> 40, r.Call(*i)); }
458 } 479 }
459 } 480 }
460 481
461 WASM_EXEC_TEST(I64ShrS) { 482 WASM_EXEC_TEST(I64ShrS) {
462 REQUIRE(I64ShrS); 483 REQUIRE(I64ShrS);
463 { 484 {
464 WasmRunner<int64_t, int64_t, int64_t> r(execution_mode); 485 WasmRunner<int64_t> r(execution_mode, MachineType::Int64(),
486 MachineType::Int64());
465 BUILD(r, WASM_I64_SAR(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 487 BUILD(r, WASM_I64_SAR(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
466 488
467 FOR_INT64_INPUTS(i) { 489 FOR_INT64_INPUTS(i) {
468 FOR_INT64_INPUTS(j) { 490 FOR_INT64_INPUTS(j) {
469 int64_t expected = (*i) >> (*j & 0x3f); 491 int64_t expected = (*i) >> (*j & 0x3f);
470 CHECK_EQ(expected, r.Call(*i, *j)); 492 CHECK_EQ(expected, r.Call(*i, *j));
471 } 493 }
472 } 494 }
473 } 495 }
474 { 496 {
475 WasmRunner<int64_t, int64_t> r(execution_mode); 497 WasmRunner<int64_t> r(execution_mode, MachineType::Int64());
476 BUILD(r, WASM_I64_SAR(WASM_GET_LOCAL(0), WASM_I64V_1(0))); 498 BUILD(r, WASM_I64_SAR(WASM_GET_LOCAL(0), WASM_I64V_1(0)));
477 FOR_INT64_INPUTS(i) { CHECK_EQ(*i >> 0, r.Call(*i)); } 499 FOR_INT64_INPUTS(i) { CHECK_EQ(*i >> 0, r.Call(*i)); }
478 } 500 }
479 { 501 {
480 WasmRunner<int64_t, int64_t> r(execution_mode); 502 WasmRunner<int64_t> r(execution_mode, MachineType::Int64());
481 BUILD(r, WASM_I64_SAR(WASM_GET_LOCAL(0), WASM_I64V_1(32))); 503 BUILD(r, WASM_I64_SAR(WASM_GET_LOCAL(0), WASM_I64V_1(32)));
482 FOR_INT64_INPUTS(i) { CHECK_EQ(*i >> 32, r.Call(*i)); } 504 FOR_INT64_INPUTS(i) { CHECK_EQ(*i >> 32, r.Call(*i)); }
483 } 505 }
484 { 506 {
485 WasmRunner<int64_t, int64_t> r(execution_mode); 507 WasmRunner<int64_t> r(execution_mode, MachineType::Int64());
486 BUILD(r, WASM_I64_SAR(WASM_GET_LOCAL(0), WASM_I64V_1(20))); 508 BUILD(r, WASM_I64_SAR(WASM_GET_LOCAL(0), WASM_I64V_1(20)));
487 FOR_INT64_INPUTS(i) { CHECK_EQ(*i >> 20, r.Call(*i)); } 509 FOR_INT64_INPUTS(i) { CHECK_EQ(*i >> 20, r.Call(*i)); }
488 } 510 }
489 { 511 {
490 WasmRunner<int64_t, int64_t> r(execution_mode); 512 WasmRunner<int64_t> r(execution_mode, MachineType::Int64());
491 BUILD(r, WASM_I64_SAR(WASM_GET_LOCAL(0), WASM_I64V_1(40))); 513 BUILD(r, WASM_I64_SAR(WASM_GET_LOCAL(0), WASM_I64V_1(40)));
492 FOR_INT64_INPUTS(i) { CHECK_EQ(*i >> 40, r.Call(*i)); } 514 FOR_INT64_INPUTS(i) { CHECK_EQ(*i >> 40, r.Call(*i)); }
493 } 515 }
494 } 516 }
495 517
496 WASM_EXEC_TEST(I64Eq) { 518 WASM_EXEC_TEST(I64Eq) {
497 REQUIRE(I64Eq); 519 REQUIRE(I64Eq);
498 WasmRunner<int32_t, int64_t, int64_t> r(execution_mode); 520 WasmRunner<int32_t> r(execution_mode, MachineType::Int64(),
521 MachineType::Int64());
499 BUILD(r, WASM_I64_EQ(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 522 BUILD(r, WASM_I64_EQ(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
500 FOR_INT64_INPUTS(i) { 523 FOR_INT64_INPUTS(i) {
501 FOR_INT64_INPUTS(j) { CHECK_EQ(*i == *j ? 1 : 0, r.Call(*i, *j)); } 524 FOR_INT64_INPUTS(j) { CHECK_EQ(*i == *j ? 1 : 0, r.Call(*i, *j)); }
502 } 525 }
503 } 526 }
504 527
505 WASM_EXEC_TEST(I64Ne) { 528 WASM_EXEC_TEST(I64Ne) {
506 REQUIRE(I64Ne); 529 REQUIRE(I64Ne);
507 WasmRunner<int32_t, int64_t, int64_t> r(execution_mode); 530 WasmRunner<int32_t> r(execution_mode, MachineType::Int64(),
531 MachineType::Int64());
508 BUILD(r, WASM_I64_NE(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 532 BUILD(r, WASM_I64_NE(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
509 FOR_INT64_INPUTS(i) { 533 FOR_INT64_INPUTS(i) {
510 FOR_INT64_INPUTS(j) { CHECK_EQ(*i != *j ? 1 : 0, r.Call(*i, *j)); } 534 FOR_INT64_INPUTS(j) { CHECK_EQ(*i != *j ? 1 : 0, r.Call(*i, *j)); }
511 } 535 }
512 } 536 }
513 537
514 WASM_EXEC_TEST(I64LtS) { 538 WASM_EXEC_TEST(I64LtS) {
515 REQUIRE(I64LtS); 539 REQUIRE(I64LtS);
516 WasmRunner<int32_t, int64_t, int64_t> r(execution_mode); 540 WasmRunner<int32_t> r(execution_mode, MachineType::Int64(),
541 MachineType::Int64());
517 BUILD(r, WASM_I64_LTS(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 542 BUILD(r, WASM_I64_LTS(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
518 FOR_INT64_INPUTS(i) { 543 FOR_INT64_INPUTS(i) {
519 FOR_INT64_INPUTS(j) { CHECK_EQ(*i < *j ? 1 : 0, r.Call(*i, *j)); } 544 FOR_INT64_INPUTS(j) { CHECK_EQ(*i < *j ? 1 : 0, r.Call(*i, *j)); }
520 } 545 }
521 } 546 }
522 547
523 WASM_EXEC_TEST(I64LeS) { 548 WASM_EXEC_TEST(I64LeS) {
524 REQUIRE(I64LeS); 549 REQUIRE(I64LeS);
525 WasmRunner<int32_t, int64_t, int64_t> r(execution_mode); 550 WasmRunner<int32_t> r(execution_mode, MachineType::Int64(),
551 MachineType::Int64());
526 BUILD(r, WASM_I64_LES(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 552 BUILD(r, WASM_I64_LES(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
527 FOR_INT64_INPUTS(i) { 553 FOR_INT64_INPUTS(i) {
528 FOR_INT64_INPUTS(j) { CHECK_EQ(*i <= *j ? 1 : 0, r.Call(*i, *j)); } 554 FOR_INT64_INPUTS(j) { CHECK_EQ(*i <= *j ? 1 : 0, r.Call(*i, *j)); }
529 } 555 }
530 } 556 }
531 557
532 WASM_EXEC_TEST(I64LtU) { 558 WASM_EXEC_TEST(I64LtU) {
533 REQUIRE(I64LtU); 559 REQUIRE(I64LtU);
534 WasmRunner<int32_t, int64_t, int64_t> r(execution_mode); 560 WasmRunner<int32_t> r(execution_mode, MachineType::Int64(),
561 MachineType::Int64());
535 BUILD(r, WASM_I64_LTU(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 562 BUILD(r, WASM_I64_LTU(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
536 FOR_UINT64_INPUTS(i) { 563 FOR_UINT64_INPUTS(i) {
537 FOR_UINT64_INPUTS(j) { CHECK_EQ(*i < *j ? 1 : 0, r.Call(*i, *j)); } 564 FOR_UINT64_INPUTS(j) { CHECK_EQ(*i < *j ? 1 : 0, r.Call(*i, *j)); }
538 } 565 }
539 } 566 }
540 567
541 WASM_EXEC_TEST(I64LeU) { 568 WASM_EXEC_TEST(I64LeU) {
542 REQUIRE(I64LeU); 569 REQUIRE(I64LeU);
543 WasmRunner<int32_t, int64_t, int64_t> r(execution_mode); 570 WasmRunner<int32_t> r(execution_mode, MachineType::Int64(),
571 MachineType::Int64());
544 BUILD(r, WASM_I64_LEU(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 572 BUILD(r, WASM_I64_LEU(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
545 FOR_UINT64_INPUTS(i) { 573 FOR_UINT64_INPUTS(i) {
546 FOR_UINT64_INPUTS(j) { CHECK_EQ(*i <= *j ? 1 : 0, r.Call(*i, *j)); } 574 FOR_UINT64_INPUTS(j) { CHECK_EQ(*i <= *j ? 1 : 0, r.Call(*i, *j)); }
547 } 575 }
548 } 576 }
549 577
550 WASM_EXEC_TEST(I64GtS) { 578 WASM_EXEC_TEST(I64GtS) {
551 REQUIRE(I64GtS); 579 REQUIRE(I64GtS);
552 WasmRunner<int32_t, int64_t, int64_t> r(execution_mode); 580 WasmRunner<int32_t> r(execution_mode, MachineType::Int64(),
581 MachineType::Int64());
553 BUILD(r, WASM_I64_GTS(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 582 BUILD(r, WASM_I64_GTS(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
554 FOR_INT64_INPUTS(i) { 583 FOR_INT64_INPUTS(i) {
555 FOR_INT64_INPUTS(j) { CHECK_EQ(*i > *j ? 1 : 0, r.Call(*i, *j)); } 584 FOR_INT64_INPUTS(j) { CHECK_EQ(*i > *j ? 1 : 0, r.Call(*i, *j)); }
556 } 585 }
557 } 586 }
558 587
559 WASM_EXEC_TEST(I64GeS) { 588 WASM_EXEC_TEST(I64GeS) {
560 REQUIRE(I64GeS); 589 REQUIRE(I64GeS);
561 WasmRunner<int32_t, int64_t, int64_t> r(execution_mode); 590 WasmRunner<int32_t> r(execution_mode, MachineType::Int64(),
591 MachineType::Int64());
562 BUILD(r, WASM_I64_GES(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 592 BUILD(r, WASM_I64_GES(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
563 FOR_INT64_INPUTS(i) { 593 FOR_INT64_INPUTS(i) {
564 FOR_INT64_INPUTS(j) { CHECK_EQ(*i >= *j ? 1 : 0, r.Call(*i, *j)); } 594 FOR_INT64_INPUTS(j) { CHECK_EQ(*i >= *j ? 1 : 0, r.Call(*i, *j)); }
565 } 595 }
566 } 596 }
567 597
568 WASM_EXEC_TEST(I64GtU) { 598 WASM_EXEC_TEST(I64GtU) {
569 REQUIRE(I64GtU); 599 REQUIRE(I64GtU);
570 WasmRunner<int32_t, int64_t, int64_t> r(execution_mode); 600 WasmRunner<int32_t> r(execution_mode, MachineType::Int64(),
601 MachineType::Int64());
571 BUILD(r, WASM_I64_GTU(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 602 BUILD(r, WASM_I64_GTU(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
572 FOR_UINT64_INPUTS(i) { 603 FOR_UINT64_INPUTS(i) {
573 FOR_UINT64_INPUTS(j) { CHECK_EQ(*i > *j ? 1 : 0, r.Call(*i, *j)); } 604 FOR_UINT64_INPUTS(j) { CHECK_EQ(*i > *j ? 1 : 0, r.Call(*i, *j)); }
574 } 605 }
575 } 606 }
576 607
577 WASM_EXEC_TEST(I64GeU) { 608 WASM_EXEC_TEST(I64GeU) {
578 REQUIRE(I64GeU); 609 REQUIRE(I64GeU);
579 WasmRunner<int32_t, int64_t, int64_t> r(execution_mode); 610 WasmRunner<int32_t> r(execution_mode, MachineType::Int64(),
611 MachineType::Int64());
580 BUILD(r, WASM_I64_GEU(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 612 BUILD(r, WASM_I64_GEU(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
581 FOR_UINT64_INPUTS(i) { 613 FOR_UINT64_INPUTS(i) {
582 FOR_UINT64_INPUTS(j) { CHECK_EQ(*i >= *j ? 1 : 0, r.Call(*i, *j)); } 614 FOR_UINT64_INPUTS(j) { CHECK_EQ(*i >= *j ? 1 : 0, r.Call(*i, *j)); }
583 } 615 }
584 } 616 }
585 617
586 WASM_EXEC_TEST(I32ConvertI64) { 618 WASM_EXEC_TEST(I32ConvertI64) {
587 REQUIRE(I32ConvertI64); 619 REQUIRE(I32ConvertI64);
588 FOR_INT64_INPUTS(i) { 620 FOR_INT64_INPUTS(i) {
589 WasmRunner<int32_t> r(execution_mode); 621 WasmRunner<int32_t> r(execution_mode);
590 BUILD(r, WASM_I32_CONVERT_I64(WASM_I64V(*i))); 622 BUILD(r, WASM_I32_CONVERT_I64(WASM_I64V(*i)));
591 CHECK_EQ(static_cast<int32_t>(*i), r.Call()); 623 CHECK_EQ(static_cast<int32_t>(*i), r.Call());
592 } 624 }
593 } 625 }
594 626
595 WASM_EXEC_TEST(I64SConvertI32) { 627 WASM_EXEC_TEST(I64SConvertI32) {
596 REQUIRE(I64SConvertI32); 628 REQUIRE(I64SConvertI32);
597 WasmRunner<int64_t, int32_t> r(execution_mode); 629 WasmRunner<int64_t> r(execution_mode, MachineType::Int32());
598 BUILD(r, WASM_I64_SCONVERT_I32(WASM_GET_LOCAL(0))); 630 BUILD(r, WASM_I64_SCONVERT_I32(WASM_GET_LOCAL(0)));
599 FOR_INT32_INPUTS(i) { CHECK_EQ(static_cast<int64_t>(*i), r.Call(*i)); } 631 FOR_INT32_INPUTS(i) { CHECK_EQ(static_cast<int64_t>(*i), r.Call(*i)); }
600 } 632 }
601 633
602 WASM_EXEC_TEST(I64UConvertI32) { 634 WASM_EXEC_TEST(I64UConvertI32) {
603 REQUIRE(I64UConvertI32); 635 REQUIRE(I64UConvertI32);
604 WasmRunner<int64_t, uint32_t> r(execution_mode); 636 WasmRunner<int64_t> r(execution_mode, MachineType::Uint32());
605 BUILD(r, WASM_I64_UCONVERT_I32(WASM_GET_LOCAL(0))); 637 BUILD(r, WASM_I64_UCONVERT_I32(WASM_GET_LOCAL(0)));
606 FOR_UINT32_INPUTS(i) { CHECK_EQ(static_cast<int64_t>(*i), r.Call(*i)); } 638 FOR_UINT32_INPUTS(i) { CHECK_EQ(static_cast<int64_t>(*i), r.Call(*i)); }
607 } 639 }
608 640
609 WASM_EXEC_TEST(I64Popcnt) { 641 WASM_EXEC_TEST(I64Popcnt) {
610 struct { 642 struct {
611 int64_t expected; 643 int64_t expected;
612 uint64_t input; 644 uint64_t input;
613 } values[] = {{64, 0xffffffffffffffff}, 645 } values[] = {{64, 0xffffffffffffffff},
614 {0, 0x0000000000000000}, 646 {0, 0x0000000000000000},
615 {2, 0x0000080000008000}, 647 {2, 0x0000080000008000},
616 {26, 0x1123456782345678}, 648 {26, 0x1123456782345678},
617 {38, 0xffedcba09edcba09}}; 649 {38, 0xffedcba09edcba09}};
618 650
619 WasmRunner<int64_t, uint64_t> r(execution_mode); 651 WasmRunner<int64_t> r(execution_mode, MachineType::Uint64());
620 BUILD(r, WASM_I64_POPCNT(WASM_GET_LOCAL(0))); 652 BUILD(r, WASM_I64_POPCNT(WASM_GET_LOCAL(0)));
621 for (size_t i = 0; i < arraysize(values); i++) { 653 for (size_t i = 0; i < arraysize(values); i++) {
622 CHECK_EQ(values[i].expected, r.Call(values[i].input)); 654 CHECK_EQ(values[i].expected, r.Call(values[i].input));
623 } 655 }
624 } 656 }
625 657
626 WASM_EXEC_TEST(F32SConvertI64) { 658 WASM_EXEC_TEST(F32SConvertI64) {
627 REQUIRE(F32SConvertI64); 659 REQUIRE(F32SConvertI64);
628 WasmRunner<float, int64_t> r(execution_mode); 660 WasmRunner<float> r(execution_mode, MachineType::Int64());
629 BUILD(r, WASM_F32_SCONVERT_I64(WASM_GET_LOCAL(0))); 661 BUILD(r, WASM_F32_SCONVERT_I64(WASM_GET_LOCAL(0)));
630 FOR_INT64_INPUTS(i) { CHECK_FLOAT_EQ(static_cast<float>(*i), r.Call(*i)); } 662 FOR_INT64_INPUTS(i) { CHECK_FLOAT_EQ(static_cast<float>(*i), r.Call(*i)); }
631 } 663 }
632 664
633 WASM_EXEC_TEST(F32UConvertI64) { 665 WASM_EXEC_TEST(F32UConvertI64) {
634 REQUIRE(F32UConvertI64); 666 REQUIRE(F32UConvertI64);
635 struct { 667 struct {
636 uint64_t input; 668 uint64_t input;
637 uint32_t expected; 669 uint32_t expected;
638 } values[] = {{0x0, 0x0}, 670 } values[] = {{0x0, 0x0},
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
704 {0x3fffffffffff, 0x56800000}, 736 {0x3fffffffffff, 0x56800000},
705 {0x1fffffffffff, 0x56000000}, 737 {0x1fffffffffff, 0x56000000},
706 {0xfffffffffff, 0x55800000}, 738 {0xfffffffffff, 0x55800000},
707 {0x7ffffffffff, 0x55000000}, 739 {0x7ffffffffff, 0x55000000},
708 {0x3ffffffffff, 0x54800000}, 740 {0x3ffffffffff, 0x54800000},
709 {0x1ffffffffff, 0x54000000}, 741 {0x1ffffffffff, 0x54000000},
710 {0x8000008000000000, 0x5f000000}, 742 {0x8000008000000000, 0x5f000000},
711 {0x8000008000000001, 0x5f000001}, 743 {0x8000008000000001, 0x5f000001},
712 {0x8000000000000400, 0x5f000000}, 744 {0x8000000000000400, 0x5f000000},
713 {0x8000000000000401, 0x5f000000}}; 745 {0x8000000000000401, 0x5f000000}};
714 WasmRunner<float, uint64_t> r(execution_mode); 746 WasmRunner<float> r(execution_mode, MachineType::Uint64());
715 BUILD(r, WASM_F32_UCONVERT_I64(WASM_GET_LOCAL(0))); 747 BUILD(r, WASM_F32_UCONVERT_I64(WASM_GET_LOCAL(0)));
716 for (size_t i = 0; i < arraysize(values); i++) { 748 for (size_t i = 0; i < arraysize(values); i++) {
717 CHECK_EQ(bit_cast<float>(values[i].expected), r.Call(values[i].input)); 749 CHECK_EQ(bit_cast<float>(values[i].expected), r.Call(values[i].input));
718 } 750 }
719 } 751 }
720 752
721 WASM_EXEC_TEST(F64SConvertI64) { 753 WASM_EXEC_TEST(F64SConvertI64) {
722 REQUIRE(F64SConvertI64); 754 REQUIRE(F64SConvertI64);
723 WasmRunner<double, int64_t> r(execution_mode); 755 WasmRunner<double> r(execution_mode, MachineType::Int64());
724 BUILD(r, WASM_F64_SCONVERT_I64(WASM_GET_LOCAL(0))); 756 BUILD(r, WASM_F64_SCONVERT_I64(WASM_GET_LOCAL(0)));
725 FOR_INT64_INPUTS(i) { CHECK_DOUBLE_EQ(static_cast<double>(*i), r.Call(*i)); } 757 FOR_INT64_INPUTS(i) { CHECK_DOUBLE_EQ(static_cast<double>(*i), r.Call(*i)); }
726 } 758 }
727 759
728 WASM_EXEC_TEST(F64UConvertI64) { 760 WASM_EXEC_TEST(F64UConvertI64) {
729 REQUIRE(F64UConvertI64); 761 REQUIRE(F64UConvertI64);
730 struct { 762 struct {
731 uint64_t input; 763 uint64_t input;
732 uint64_t expected; 764 uint64_t expected;
733 } values[] = {{0x0, 0x0}, 765 } values[] = {{0x0, 0x0},
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
798 {0x3fffffffffff, 0x42cfffffffffff80}, 830 {0x3fffffffffff, 0x42cfffffffffff80},
799 {0x1fffffffffff, 0x42bfffffffffff00}, 831 {0x1fffffffffff, 0x42bfffffffffff00},
800 {0xfffffffffff, 0x42affffffffffe00}, 832 {0xfffffffffff, 0x42affffffffffe00},
801 {0x7ffffffffff, 0x429ffffffffffc00}, 833 {0x7ffffffffff, 0x429ffffffffffc00},
802 {0x3ffffffffff, 0x428ffffffffff800}, 834 {0x3ffffffffff, 0x428ffffffffff800},
803 {0x1ffffffffff, 0x427ffffffffff000}, 835 {0x1ffffffffff, 0x427ffffffffff000},
804 {0x8000008000000000, 0x43e0000010000000}, 836 {0x8000008000000000, 0x43e0000010000000},
805 {0x8000008000000001, 0x43e0000010000000}, 837 {0x8000008000000001, 0x43e0000010000000},
806 {0x8000000000000400, 0x43e0000000000000}, 838 {0x8000000000000400, 0x43e0000000000000},
807 {0x8000000000000401, 0x43e0000000000001}}; 839 {0x8000000000000401, 0x43e0000000000001}};
808 WasmRunner<double, uint64_t> r(execution_mode); 840 WasmRunner<double> r(execution_mode, MachineType::Uint64());
809 BUILD(r, WASM_F64_UCONVERT_I64(WASM_GET_LOCAL(0))); 841 BUILD(r, WASM_F64_UCONVERT_I64(WASM_GET_LOCAL(0)));
810 for (size_t i = 0; i < arraysize(values); i++) { 842 for (size_t i = 0; i < arraysize(values); i++) {
811 CHECK_EQ(bit_cast<double>(values[i].expected), r.Call(values[i].input)); 843 CHECK_EQ(bit_cast<double>(values[i].expected), r.Call(values[i].input));
812 } 844 }
813 } 845 }
814 846
815 WASM_EXEC_TEST_WITH_TRAP(I64SConvertF32a) { 847 WASM_EXEC_TEST_WITH_TRAP(I64SConvertF32a) {
816 WasmRunner<int64_t, float> r(execution_mode); 848 WasmRunner<int64_t> r(execution_mode, MachineType::Float32());
817 BUILD(r, WASM_I64_SCONVERT_F32(WASM_GET_LOCAL(0))); 849 BUILD(r, WASM_I64_SCONVERT_F32(WASM_GET_LOCAL(0)));
818 850
819 FOR_FLOAT32_INPUTS(i) { 851 FOR_FLOAT32_INPUTS(i) {
820 if (*i < static_cast<float>(std::numeric_limits<int64_t>::max()) && 852 if (*i < static_cast<float>(std::numeric_limits<int64_t>::max()) &&
821 *i >= static_cast<float>(std::numeric_limits<int64_t>::min())) { 853 *i >= static_cast<float>(std::numeric_limits<int64_t>::min())) {
822 CHECK_EQ(static_cast<int64_t>(*i), r.Call(*i)); 854 CHECK_EQ(static_cast<int64_t>(*i), r.Call(*i));
823 } else { 855 } else {
824 CHECK_TRAP64(r.Call(*i)); 856 CHECK_TRAP64(r.Call(*i));
825 } 857 }
826 } 858 }
827 } 859 }
828 860
829 WASM_EXEC_TEST_WITH_TRAP(I64SConvertF64a) { 861 WASM_EXEC_TEST_WITH_TRAP(I64SConvertF64a) {
830 WasmRunner<int64_t, double> r(execution_mode); 862 WasmRunner<int64_t> r(execution_mode, MachineType::Float64());
831 BUILD(r, WASM_I64_SCONVERT_F64(WASM_GET_LOCAL(0))); 863 BUILD(r, WASM_I64_SCONVERT_F64(WASM_GET_LOCAL(0)));
832 864
833 FOR_FLOAT64_INPUTS(i) { 865 FOR_FLOAT64_INPUTS(i) {
834 if (*i < static_cast<double>(std::numeric_limits<int64_t>::max()) && 866 if (*i < static_cast<double>(std::numeric_limits<int64_t>::max()) &&
835 *i >= static_cast<double>(std::numeric_limits<int64_t>::min())) { 867 *i >= static_cast<double>(std::numeric_limits<int64_t>::min())) {
836 CHECK_EQ(static_cast<int64_t>(*i), r.Call(*i)); 868 CHECK_EQ(static_cast<int64_t>(*i), r.Call(*i));
837 } else { 869 } else {
838 CHECK_TRAP64(r.Call(*i)); 870 CHECK_TRAP64(r.Call(*i));
839 } 871 }
840 } 872 }
841 } 873 }
842 874
843 WASM_EXEC_TEST_WITH_TRAP(I64UConvertF32a) { 875 WASM_EXEC_TEST_WITH_TRAP(I64UConvertF32a) {
844 WasmRunner<uint64_t, float> r(execution_mode); 876 WasmRunner<uint64_t> r(execution_mode, MachineType::Float32());
845 BUILD(r, WASM_I64_UCONVERT_F32(WASM_GET_LOCAL(0))); 877 BUILD(r, WASM_I64_UCONVERT_F32(WASM_GET_LOCAL(0)));
846 878
847 FOR_FLOAT32_INPUTS(i) { 879 FOR_FLOAT32_INPUTS(i) {
848 if (*i < static_cast<float>(std::numeric_limits<uint64_t>::max()) && 880 if (*i < static_cast<float>(std::numeric_limits<uint64_t>::max()) &&
849 *i > -1) { 881 *i > -1) {
850 CHECK_EQ(static_cast<uint64_t>(*i), r.Call(*i)); 882 CHECK_EQ(static_cast<uint64_t>(*i), r.Call(*i));
851 } else { 883 } else {
852 CHECK_TRAP64(r.Call(*i)); 884 CHECK_TRAP64(r.Call(*i));
853 } 885 }
854 } 886 }
855 } 887 }
856 888
857 WASM_EXEC_TEST_WITH_TRAP(I64UConvertF64a) { 889 WASM_EXEC_TEST_WITH_TRAP(I64UConvertF64a) {
858 WasmRunner<uint64_t, double> r(execution_mode); 890 WasmRunner<uint64_t> r(execution_mode, MachineType::Float64());
859 BUILD(r, WASM_I64_UCONVERT_F64(WASM_GET_LOCAL(0))); 891 BUILD(r, WASM_I64_UCONVERT_F64(WASM_GET_LOCAL(0)));
860 892
861 FOR_FLOAT64_INPUTS(i) { 893 FOR_FLOAT64_INPUTS(i) {
862 if (*i < static_cast<float>(std::numeric_limits<uint64_t>::max()) && 894 if (*i < static_cast<float>(std::numeric_limits<uint64_t>::max()) &&
863 *i > -1) { 895 *i > -1) {
864 CHECK_EQ(static_cast<uint64_t>(*i), r.Call(*i)); 896 CHECK_EQ(static_cast<uint64_t>(*i), r.Call(*i));
865 } else { 897 } else {
866 CHECK_TRAP64(r.Call(*i)); 898 CHECK_TRAP64(r.Call(*i));
867 } 899 }
868 } 900 }
869 } 901 }
870 902
871 WASM_EXEC_TEST(CallI64Parameter) { 903 WASM_EXEC_TEST(CallI64Parameter) {
904 // Build the target function.
872 LocalType param_types[20]; 905 LocalType param_types[20];
873 for (int i = 0; i < 20; i++) param_types[i] = kAstI64; 906 for (int i = 0; i < 20; i++) param_types[i] = kAstI64;
874 param_types[3] = kAstI32; 907 param_types[3] = kAstI32;
875 param_types[4] = kAstI32; 908 param_types[4] = kAstI32;
876 FunctionSig sig(1, 19, param_types); 909 FunctionSig sig(1, 19, param_types);
877 for (int i = 0; i < 19; i++) { 910 for (int i = 0; i < 19; i++) {
878 if (i == 2 || i == 3) continue; 911 TestingModule module(execution_mode);
879 WasmRunner<int32_t> r(execution_mode); 912 WasmFunctionCompiler t(&sig, &module);
880 // Build the target function. 913 if (i == 2 || i == 3) {
881 WasmFunctionCompiler& t = r.NewFunction(&sig); 914 continue;
882 BUILD(t, WASM_GET_LOCAL(i)); 915 } else {
916 BUILD(t, WASM_GET_LOCAL(i));
917 }
918 uint32_t index = t.CompileAndAdd();
883 919
884 // Build the calling function. 920 // Build the calling function.
921 WasmRunner<int32_t> r(&module);
885 BUILD( 922 BUILD(
886 r, 923 r,
887 WASM_I32_CONVERT_I64(WASM_CALL_FUNCTION( 924 WASM_I32_CONVERT_I64(WASM_CALL_FUNCTION(
888 t.function_index(), WASM_I64V_9(0xbcd12340000000b), 925 index, WASM_I64V_9(0xbcd12340000000b),
889 WASM_I64V_9(0xbcd12340000000c), WASM_I32V_1(0xd), 926 WASM_I64V_9(0xbcd12340000000c), WASM_I32V_1(0xd),
890 WASM_I32_CONVERT_I64(WASM_I64V_9(0xbcd12340000000e)), 927 WASM_I32_CONVERT_I64(WASM_I64V_9(0xbcd12340000000e)),
891 WASM_I64V_9(0xbcd12340000000f), WASM_I64V_10(0xbcd1234000000010), 928 WASM_I64V_9(0xbcd12340000000f), WASM_I64V_10(0xbcd1234000000010),
892 WASM_I64V_10(0xbcd1234000000011), WASM_I64V_10(0xbcd1234000000012), 929 WASM_I64V_10(0xbcd1234000000011), WASM_I64V_10(0xbcd1234000000012),
893 WASM_I64V_10(0xbcd1234000000013), WASM_I64V_10(0xbcd1234000000014), 930 WASM_I64V_10(0xbcd1234000000013), WASM_I64V_10(0xbcd1234000000014),
894 WASM_I64V_10(0xbcd1234000000015), WASM_I64V_10(0xbcd1234000000016), 931 WASM_I64V_10(0xbcd1234000000015), WASM_I64V_10(0xbcd1234000000016),
895 WASM_I64V_10(0xbcd1234000000017), WASM_I64V_10(0xbcd1234000000018), 932 WASM_I64V_10(0xbcd1234000000017), WASM_I64V_10(0xbcd1234000000018),
896 WASM_I64V_10(0xbcd1234000000019), WASM_I64V_10(0xbcd123400000001a), 933 WASM_I64V_10(0xbcd1234000000019), WASM_I64V_10(0xbcd123400000001a),
897 WASM_I64V_10(0xbcd123400000001b), WASM_I64V_10(0xbcd123400000001c), 934 WASM_I64V_10(0xbcd123400000001b), WASM_I64V_10(0xbcd123400000001c),
898 WASM_I64V_10(0xbcd123400000001d)))); 935 WASM_I64V_10(0xbcd123400000001d))));
899 936
900 CHECK_EQ(i + 0xb, r.Call()); 937 CHECK_EQ(i + 0xb, r.Call());
901 } 938 }
902 } 939 }
903 940
904 void TestI64Binop(WasmExecutionMode execution_mode, WasmOpcode opcode, 941 void TestI64Binop(WasmExecutionMode execution_mode, WasmOpcode opcode,
905 int64_t expected, int64_t a, int64_t b) { 942 int64_t expected, int64_t a, int64_t b) {
906 { 943 {
907 WasmRunner<int64_t> r(execution_mode); 944 WasmRunner<int64_t> r(execution_mode);
908 // return K op K 945 // return K op K
909 BUILD(r, WASM_BINOP(opcode, WASM_I64V(a), WASM_I64V(b))); 946 BUILD(r, WASM_BINOP(opcode, WASM_I64V(a), WASM_I64V(b)));
910 CHECK_EQ(expected, r.Call()); 947 CHECK_EQ(expected, r.Call());
911 } 948 }
912 { 949 {
913 WasmRunner<int64_t, int64_t, int64_t> r(execution_mode); 950 WasmRunner<int64_t> r(execution_mode, MachineType::Int64(),
951 MachineType::Int64());
914 // return a op b 952 // return a op b
915 BUILD(r, WASM_BINOP(opcode, WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 953 BUILD(r, WASM_BINOP(opcode, WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
916 CHECK_EQ(expected, r.Call(a, b)); 954 CHECK_EQ(expected, r.Call(a, b));
917 } 955 }
918 } 956 }
919 957
920 void TestI64Cmp(WasmExecutionMode execution_mode, WasmOpcode opcode, 958 void TestI64Cmp(WasmExecutionMode execution_mode, WasmOpcode opcode,
921 int64_t expected, int64_t a, int64_t b) { 959 int64_t expected, int64_t a, int64_t b) {
922 { 960 {
923 WasmRunner<int32_t> r(execution_mode); 961 WasmRunner<int32_t> r(execution_mode);
924 // return K op K 962 // return K op K
925 BUILD(r, WASM_BINOP(opcode, WASM_I64V(a), WASM_I64V(b))); 963 BUILD(r, WASM_BINOP(opcode, WASM_I64V(a), WASM_I64V(b)));
926 CHECK_EQ(expected, r.Call()); 964 CHECK_EQ(expected, r.Call());
927 } 965 }
928 { 966 {
929 WasmRunner<int32_t, int64_t, int64_t> r(execution_mode); 967 WasmRunner<int32_t> r(execution_mode, MachineType::Int64(),
968 MachineType::Int64());
930 // return a op b 969 // return a op b
931 BUILD(r, WASM_BINOP(opcode, WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 970 BUILD(r, WASM_BINOP(opcode, WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
932 CHECK_EQ(expected, r.Call(a, b)); 971 CHECK_EQ(expected, r.Call(a, b));
933 } 972 }
934 } 973 }
935 974
936 #define TEST_I64_BINOP(name, expected, a, b) \ 975 #define TEST_I64_BINOP(name, expected, a, b) \
937 do { \ 976 do { \
938 if (WASM_64 || kSupported_##name) \ 977 if (WASM_64 || kSupported_##name) \
939 TestI64Binop(execution_mode, kExpr##name, expected, a, b); \ 978 TestI64Binop(execution_mode, kExpr##name, expected, a, b); \
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
1022 {48, 0x0000000000008040}, {49, 0x0000000000004005}, 1061 {48, 0x0000000000008040}, {49, 0x0000000000004005},
1023 {50, 0x0000000000002050}, {51, 0x0000000000001700}, 1062 {50, 0x0000000000002050}, {51, 0x0000000000001700},
1024 {52, 0x0000000000000870}, {53, 0x0000000000000405}, 1063 {52, 0x0000000000000870}, {53, 0x0000000000000405},
1025 {54, 0x0000000000000203}, {55, 0x0000000000000101}, 1064 {54, 0x0000000000000203}, {55, 0x0000000000000101},
1026 {56, 0x0000000000000089}, {57, 0x0000000000000041}, 1065 {56, 0x0000000000000089}, {57, 0x0000000000000041},
1027 {58, 0x0000000000000022}, {59, 0x0000000000000013}, 1066 {58, 0x0000000000000022}, {59, 0x0000000000000013},
1028 {60, 0x0000000000000008}, {61, 0x0000000000000004}, 1067 {60, 0x0000000000000008}, {61, 0x0000000000000004},
1029 {62, 0x0000000000000002}, {63, 0x0000000000000001}, 1068 {62, 0x0000000000000002}, {63, 0x0000000000000001},
1030 {64, 0x0000000000000000}}; 1069 {64, 0x0000000000000000}};
1031 1070
1032 WasmRunner<int64_t, uint64_t> r(execution_mode); 1071 WasmRunner<int64_t> r(execution_mode, MachineType::Uint64());
1033 BUILD(r, WASM_I64_CLZ(WASM_GET_LOCAL(0))); 1072 BUILD(r, WASM_I64_CLZ(WASM_GET_LOCAL(0)));
1034 for (size_t i = 0; i < arraysize(values); i++) { 1073 for (size_t i = 0; i < arraysize(values); i++) {
1035 CHECK_EQ(values[i].expected, r.Call(values[i].input)); 1074 CHECK_EQ(values[i].expected, r.Call(values[i].input));
1036 } 1075 }
1037 } 1076 }
1038 1077
1039 WASM_EXEC_TEST(I64Ctz) { 1078 WASM_EXEC_TEST(I64Ctz) {
1040 REQUIRE(I64Ctz); 1079 REQUIRE(I64Ctz);
1041 struct { 1080 struct {
1042 int64_t expected; 1081 int64_t expected;
(...skipping 25 matching lines...) Expand all
1068 {16, 0x00000000b8f10000}, {15, 0x000000003b9f8000}, 1107 {16, 0x00000000b8f10000}, {15, 0x000000003b9f8000},
1069 {14, 0x00000000db4c4000}, {13, 0x00000000e9a32000}, 1108 {14, 0x00000000db4c4000}, {13, 0x00000000e9a32000},
1070 {12, 0x00000000fca61000}, {11, 0x000000006c8a7800}, 1109 {12, 0x00000000fca61000}, {11, 0x000000006c8a7800},
1071 {10, 0x000000008ce5a400}, {9, 0x00000000cb7d0200}, 1110 {10, 0x000000008ce5a400}, {9, 0x00000000cb7d0200},
1072 {8, 0x00000000cb4dc100}, {7, 0x00000000dfbec580}, 1111 {8, 0x00000000cb4dc100}, {7, 0x00000000dfbec580},
1073 {6, 0x0000000027a9db40}, {5, 0x00000000de3bcb20}, 1112 {6, 0x0000000027a9db40}, {5, 0x00000000de3bcb20},
1074 {4, 0x00000000d7e8a610}, {3, 0x000000009afdbc88}, 1113 {4, 0x00000000d7e8a610}, {3, 0x000000009afdbc88},
1075 {2, 0x000000009afdbc84}, {1, 0x000000009afdbc82}, 1114 {2, 0x000000009afdbc84}, {1, 0x000000009afdbc82},
1076 {0, 0x000000009afdbc81}}; 1115 {0, 0x000000009afdbc81}};
1077 1116
1078 WasmRunner<int64_t, uint64_t> r(execution_mode); 1117 WasmRunner<int64_t> r(execution_mode, MachineType::Uint64());
1079 BUILD(r, WASM_I64_CTZ(WASM_GET_LOCAL(0))); 1118 BUILD(r, WASM_I64_CTZ(WASM_GET_LOCAL(0)));
1080 for (size_t i = 0; i < arraysize(values); i++) { 1119 for (size_t i = 0; i < arraysize(values); i++) {
1081 CHECK_EQ(values[i].expected, r.Call(values[i].input)); 1120 CHECK_EQ(values[i].expected, r.Call(values[i].input));
1082 } 1121 }
1083 } 1122 }
1084 1123
1085 WASM_EXEC_TEST(I64Popcnt2) { 1124 WASM_EXEC_TEST(I64Popcnt2) {
1086 REQUIRE(I64Popcnt); 1125 REQUIRE(I64Popcnt);
1087 struct { 1126 struct {
1088 int64_t expected; 1127 int64_t expected;
1089 uint64_t input; 1128 uint64_t input;
1090 } values[] = {{64, 0xffffffffffffffff}, 1129 } values[] = {{64, 0xffffffffffffffff},
1091 {0, 0x0000000000000000}, 1130 {0, 0x0000000000000000},
1092 {2, 0x0000080000008000}, 1131 {2, 0x0000080000008000},
1093 {26, 0x1123456782345678}, 1132 {26, 0x1123456782345678},
1094 {38, 0xffedcba09edcba09}}; 1133 {38, 0xffedcba09edcba09}};
1095 1134
1096 WasmRunner<int64_t, uint64_t> r(execution_mode); 1135 WasmRunner<int64_t> r(execution_mode, MachineType::Uint64());
1097 BUILD(r, WASM_I64_POPCNT(WASM_GET_LOCAL(0))); 1136 BUILD(r, WASM_I64_POPCNT(WASM_GET_LOCAL(0)));
1098 for (size_t i = 0; i < arraysize(values); i++) { 1137 for (size_t i = 0; i < arraysize(values); i++) {
1099 CHECK_EQ(values[i].expected, r.Call(values[i].input)); 1138 CHECK_EQ(values[i].expected, r.Call(values[i].input));
1100 } 1139 }
1101 } 1140 }
1102 1141
1103 // Test the WasmRunner with an Int64 return value and different numbers of 1142 // Test the WasmRunner with an Int64 return value and different numbers of
1104 // Int64 parameters. 1143 // Int64 parameters.
1105 WASM_EXEC_TEST(I64WasmRunner) { 1144 WASM_EXEC_TEST(I64WasmRunner) {
1106 REQUIRE(I64Param); 1145 REQUIRE(I64Param);
1107 REQUIRE(I64Xor); 1146 REQUIRE(I64Xor);
1108 {FOR_INT64_INPUTS(i){WasmRunner<int64_t> r(execution_mode); 1147 {FOR_INT64_INPUTS(i){WasmRunner<int64_t> r(execution_mode);
1109 BUILD(r, WASM_I64V(*i)); 1148 BUILD(r, WASM_I64V(*i));
1110 CHECK_EQ(*i, r.Call()); 1149 CHECK_EQ(*i, r.Call());
1111 } 1150 }
1112 } 1151 }
1113 { 1152 {
1114 WasmRunner<int64_t, int64_t> r(execution_mode); 1153 WasmRunner<int64_t> r(execution_mode, MachineType::Int64());
1115 BUILD(r, WASM_GET_LOCAL(0)); 1154 BUILD(r, WASM_GET_LOCAL(0));
1116 FOR_INT64_INPUTS(i) { CHECK_EQ(*i, r.Call(*i)); } 1155 FOR_INT64_INPUTS(i) { CHECK_EQ(*i, r.Call(*i)); }
1117 } 1156 }
1118 { 1157 {
1119 WasmRunner<int64_t, int64_t, int64_t> r(execution_mode); 1158 WasmRunner<int64_t> r(execution_mode, MachineType::Int64(),
1159 MachineType::Int64());
1120 BUILD(r, WASM_I64_XOR(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 1160 BUILD(r, WASM_I64_XOR(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
1121 FOR_INT64_INPUTS(i) { 1161 FOR_INT64_INPUTS(i) {
1122 FOR_INT64_INPUTS(j) { CHECK_EQ(*i ^ *j, r.Call(*i, *j)); } 1162 FOR_INT64_INPUTS(j) { CHECK_EQ(*i ^ *j, r.Call(*i, *j)); }
1123 } 1163 }
1124 } 1164 }
1125 { 1165 {
1126 WasmRunner<int64_t, int64_t, int64_t, int64_t> r(execution_mode); 1166 WasmRunner<int64_t> r(execution_mode, MachineType::Int64(),
1167 MachineType::Int64(), MachineType::Int64());
1127 BUILD(r, WASM_I64_XOR(WASM_GET_LOCAL(0), 1168 BUILD(r, WASM_I64_XOR(WASM_GET_LOCAL(0),
1128 WASM_I64_XOR(WASM_GET_LOCAL(1), WASM_GET_LOCAL(2)))); 1169 WASM_I64_XOR(WASM_GET_LOCAL(1), WASM_GET_LOCAL(2))));
1129 FOR_INT64_INPUTS(i) { 1170 FOR_INT64_INPUTS(i) {
1130 FOR_INT64_INPUTS(j) { 1171 FOR_INT64_INPUTS(j) {
1131 CHECK_EQ(*i ^ *j ^ *j, r.Call(*i, *j, *j)); 1172 CHECK_EQ(*i ^ *j ^ *j, r.Call(*i, *j, *j));
1132 CHECK_EQ(*j ^ *i ^ *j, r.Call(*j, *i, *j)); 1173 CHECK_EQ(*j ^ *i ^ *j, r.Call(*j, *i, *j));
1133 CHECK_EQ(*j ^ *j ^ *i, r.Call(*j, *j, *i)); 1174 CHECK_EQ(*j ^ *j ^ *i, r.Call(*j, *j, *i));
1134 } 1175 }
1135 } 1176 }
1136 } 1177 }
1137 { 1178 {
1138 WasmRunner<int64_t, int64_t, int64_t, int64_t, int64_t> r(execution_mode); 1179 WasmRunner<int64_t> r(execution_mode, MachineType::Int64(),
1180 MachineType::Int64(), MachineType::Int64(),
1181 MachineType::Int64());
1139 BUILD(r, WASM_I64_XOR(WASM_GET_LOCAL(0), 1182 BUILD(r, WASM_I64_XOR(WASM_GET_LOCAL(0),
1140 WASM_I64_XOR(WASM_GET_LOCAL(1), 1183 WASM_I64_XOR(WASM_GET_LOCAL(1),
1141 WASM_I64_XOR(WASM_GET_LOCAL(2), 1184 WASM_I64_XOR(WASM_GET_LOCAL(2),
1142 WASM_GET_LOCAL(3))))); 1185 WASM_GET_LOCAL(3)))));
1143 FOR_INT64_INPUTS(i) { 1186 FOR_INT64_INPUTS(i) {
1144 FOR_INT64_INPUTS(j) { 1187 FOR_INT64_INPUTS(j) {
1145 CHECK_EQ(*i ^ *j ^ *j ^ *j, r.Call(*i, *j, *j, *j)); 1188 CHECK_EQ(*i ^ *j ^ *j ^ *j, r.Call(*i, *j, *j, *j));
1146 CHECK_EQ(*j ^ *i ^ *j ^ *j, r.Call(*j, *i, *j, *j)); 1189 CHECK_EQ(*j ^ *i ^ *j ^ *j, r.Call(*j, *i, *j, *j));
1147 CHECK_EQ(*j ^ *j ^ *i ^ *j, r.Call(*j, *j, *i, *j)); 1190 CHECK_EQ(*j ^ *j ^ *i ^ *j, r.Call(*j, *j, *i, *j));
1148 CHECK_EQ(*j ^ *j ^ *j ^ *i, r.Call(*j, *j, *j, *i)); 1191 CHECK_EQ(*j ^ *j ^ *j ^ *i, r.Call(*j, *j, *j, *i));
1149 } 1192 }
1150 } 1193 }
1151 } 1194 }
1152 } 1195 }
1153 1196
1154 WASM_EXEC_TEST(Call_Int64Sub) { 1197 WASM_EXEC_TEST(Call_Int64Sub) {
1155 REQUIRE(I64Sub); 1198 REQUIRE(I64Sub);
1156 WasmRunner<int64_t, int64_t, int64_t> r(execution_mode);
1157 // Build the target function. 1199 // Build the target function.
1158 TestSignatures sigs; 1200 TestSignatures sigs;
1159 WasmFunctionCompiler& t = r.NewFunction(sigs.l_ll()); 1201 TestingModule module(execution_mode);
1202 WasmFunctionCompiler t(sigs.l_ll(), &module);
1160 BUILD(t, WASM_I64_SUB(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 1203 BUILD(t, WASM_I64_SUB(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
1204 uint32_t index = t.CompileAndAdd();
1161 1205
1162 // Build the caller function. 1206 // Build the caller function.
1163 BUILD(r, WASM_CALL_FUNCTION(t.function_index(), WASM_GET_LOCAL(0), 1207 WasmRunner<int64_t> r(&module, MachineType::Int64(), MachineType::Int64());
1164 WASM_GET_LOCAL(1))); 1208 BUILD(r, WASM_CALL_FUNCTION(index, WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
1165 1209
1166 FOR_INT32_INPUTS(i) { 1210 FOR_INT32_INPUTS(i) {
1167 FOR_INT32_INPUTS(j) { 1211 FOR_INT32_INPUTS(j) {
1168 int64_t a = static_cast<int64_t>(*i) << 32 | 1212 int64_t a = static_cast<int64_t>(*i) << 32 |
1169 (static_cast<int64_t>(*j) | 0xFFFFFFFF); 1213 (static_cast<int64_t>(*j) | 0xFFFFFFFF);
1170 int64_t b = static_cast<int64_t>(*j) << 32 | 1214 int64_t b = static_cast<int64_t>(*j) << 32 |
1171 (static_cast<int64_t>(*i) | 0xFFFFFFFF); 1215 (static_cast<int64_t>(*i) | 0xFFFFFFFF);
1172 1216
1173 int64_t expected = static_cast<int64_t>(static_cast<uint64_t>(a) - 1217 int64_t expected = static_cast<int64_t>(static_cast<uint64_t>(a) -
1174 static_cast<uint64_t>(b)); 1218 static_cast<uint64_t>(b));
1175 CHECK_EQ(expected, r.Call(a, b)); 1219 CHECK_EQ(expected, r.Call(a, b));
1176 } 1220 }
1177 } 1221 }
1178 } 1222 }
1179 1223
1180 WASM_EXEC_TEST(LoadStoreI64_sx) { 1224 WASM_EXEC_TEST(LoadStoreI64_sx) {
1181 REQUIRE(I64LoadStore); 1225 REQUIRE(I64LoadStore);
1182 REQUIRE(DepthFirst); 1226 REQUIRE(DepthFirst);
1183 byte loads[] = {kExprI64LoadMem8S, kExprI64LoadMem16S, kExprI64LoadMem32S, 1227 byte loads[] = {kExprI64LoadMem8S, kExprI64LoadMem16S, kExprI64LoadMem32S,
1184 kExprI64LoadMem}; 1228 kExprI64LoadMem};
1185 1229
1186 for (size_t m = 0; m < arraysize(loads); m++) { 1230 for (size_t m = 0; m < arraysize(loads); m++) {
1187 WasmRunner<int64_t> r(execution_mode); 1231 TestingModule module(execution_mode);
1188 byte* memory = r.module().AddMemoryElems<byte>(16); 1232 byte* memory = module.AddMemoryElems<byte>(16);
1233 WasmRunner<int64_t> r(&module);
1189 1234
1190 byte code[] = { 1235 byte code[] = {
1191 kExprI8Const, 8, // -- 1236 kExprI8Const, 8, // --
1192 kExprI8Const, 0, // -- 1237 kExprI8Const, 0, // --
1193 loads[m], // -- 1238 loads[m], // --
1194 ZERO_ALIGNMENT, // -- 1239 ZERO_ALIGNMENT, // --
1195 ZERO_OFFSET, // -- 1240 ZERO_OFFSET, // --
1196 kExprI64StoreMem, // -- 1241 kExprI64StoreMem, // --
1197 ZERO_ALIGNMENT, // -- 1242 ZERO_ALIGNMENT, // --
1198 ZERO_OFFSET, // -- 1243 ZERO_OFFSET, // --
1199 kExprI8Const, 0, // -- 1244 kExprI8Const, 0, // --
1200 loads[m], // -- 1245 loads[m], // --
1201 ZERO_ALIGNMENT, // -- 1246 ZERO_ALIGNMENT, // --
1202 ZERO_OFFSET, // -- 1247 ZERO_OFFSET, // --
1203 }; 1248 };
1204 1249
1205 r.Build(code, code + arraysize(code)); 1250 r.Build(code, code + arraysize(code));
1206 1251
1207 // Try a bunch of different negative values. 1252 // Try a bunch of different negative values.
1208 for (int i = -1; i >= -128; i -= 11) { 1253 for (int i = -1; i >= -128; i -= 11) {
1209 int size = 1 << m; 1254 int size = 1 << m;
1210 r.module().BlankMemory(); 1255 module.BlankMemory();
1211 memory[size - 1] = static_cast<byte>(i); // set the high order byte. 1256 memory[size - 1] = static_cast<byte>(i); // set the high order byte.
1212 1257
1213 int64_t expected = static_cast<int64_t>(i) << ((size - 1) * 8); 1258 int64_t expected = static_cast<int64_t>(i) << ((size - 1) * 8);
1214 1259
1215 CHECK_EQ(expected, r.Call()); 1260 CHECK_EQ(expected, r.Call());
1216 CHECK_EQ(static_cast<byte>(i), memory[8 + size - 1]); 1261 CHECK_EQ(static_cast<byte>(i), memory[8 + size - 1]);
1217 for (int j = size; j < 8; j++) { 1262 for (int j = size; j < 8; j++) {
1218 CHECK_EQ(255, memory[8 + j]); 1263 CHECK_EQ(255, memory[8 + j]);
1219 } 1264 }
1220 } 1265 }
1221 } 1266 }
1222 } 1267 }
1223 1268
1224 WASM_EXEC_TEST_WITH_TRAP(I64SConvertF32b) { 1269 WASM_EXEC_TEST_WITH_TRAP(I64SConvertF32b) {
1225 REQUIRE(I64SConvertF32); 1270 REQUIRE(I64SConvertF32);
1226 WasmRunner<int64_t, float> r(execution_mode); 1271 WasmRunner<int64_t> r(execution_mode, MachineType::Float32());
1227 BUILD(r, WASM_I64_SCONVERT_F32(WASM_GET_LOCAL(0))); 1272 BUILD(r, WASM_I64_SCONVERT_F32(WASM_GET_LOCAL(0)));
1228 1273
1229 FOR_FLOAT32_INPUTS(i) { 1274 FOR_FLOAT32_INPUTS(i) {
1230 if (*i < static_cast<float>(INT64_MAX) && 1275 if (*i < static_cast<float>(INT64_MAX) &&
1231 *i >= static_cast<float>(INT64_MIN)) { 1276 *i >= static_cast<float>(INT64_MIN)) {
1232 CHECK_EQ(static_cast<int64_t>(*i), r.Call(*i)); 1277 CHECK_EQ(static_cast<int64_t>(*i), r.Call(*i));
1233 } else { 1278 } else {
1234 CHECK_TRAP64(r.Call(*i)); 1279 CHECK_TRAP64(r.Call(*i));
1235 } 1280 }
1236 } 1281 }
1237 } 1282 }
1238 1283
1239 WASM_EXEC_TEST_WITH_TRAP(I64SConvertF64b) { 1284 WASM_EXEC_TEST_WITH_TRAP(I64SConvertF64b) {
1240 REQUIRE(I64SConvertF64); 1285 REQUIRE(I64SConvertF64);
1241 WasmRunner<int64_t, double> r(execution_mode); 1286 WasmRunner<int64_t> r(execution_mode, MachineType::Float64());
1242 BUILD(r, WASM_I64_SCONVERT_F64(WASM_GET_LOCAL(0))); 1287 BUILD(r, WASM_I64_SCONVERT_F64(WASM_GET_LOCAL(0)));
1243 1288
1244 FOR_FLOAT64_INPUTS(i) { 1289 FOR_FLOAT64_INPUTS(i) {
1245 if (*i < static_cast<double>(INT64_MAX) && 1290 if (*i < static_cast<double>(INT64_MAX) &&
1246 *i >= static_cast<double>(INT64_MIN)) { 1291 *i >= static_cast<double>(INT64_MIN)) {
1247 CHECK_EQ(static_cast<int64_t>(*i), r.Call(*i)); 1292 CHECK_EQ(static_cast<int64_t>(*i), r.Call(*i));
1248 } else { 1293 } else {
1249 CHECK_TRAP64(r.Call(*i)); 1294 CHECK_TRAP64(r.Call(*i));
1250 } 1295 }
1251 } 1296 }
1252 } 1297 }
1253 1298
1254 WASM_EXEC_TEST_WITH_TRAP(I64UConvertF32b) { 1299 WASM_EXEC_TEST_WITH_TRAP(I64UConvertF32b) {
1255 REQUIRE(I64UConvertF32); 1300 REQUIRE(I64UConvertF32);
1256 WasmRunner<uint64_t, float> r(execution_mode); 1301 WasmRunner<uint64_t> r(execution_mode, MachineType::Float32());
1257 BUILD(r, WASM_I64_UCONVERT_F32(WASM_GET_LOCAL(0))); 1302 BUILD(r, WASM_I64_UCONVERT_F32(WASM_GET_LOCAL(0)));
1258 1303
1259 FOR_FLOAT32_INPUTS(i) { 1304 FOR_FLOAT32_INPUTS(i) {
1260 if (*i < static_cast<float>(UINT64_MAX) && *i > -1) { 1305 if (*i < static_cast<float>(UINT64_MAX) && *i > -1) {
1261 CHECK_EQ(static_cast<uint64_t>(*i), r.Call(*i)); 1306 CHECK_EQ(static_cast<uint64_t>(*i), r.Call(*i));
1262 } else { 1307 } else {
1263 CHECK_TRAP64(r.Call(*i)); 1308 CHECK_TRAP64(r.Call(*i));
1264 } 1309 }
1265 } 1310 }
1266 } 1311 }
1267 1312
1268 WASM_EXEC_TEST_WITH_TRAP(I64UConvertF64b) { 1313 WASM_EXEC_TEST_WITH_TRAP(I64UConvertF64b) {
1269 REQUIRE(I64UConvertF64); 1314 REQUIRE(I64UConvertF64);
1270 WasmRunner<uint64_t, double> r(execution_mode); 1315 WasmRunner<uint64_t> r(execution_mode, MachineType::Float64());
1271 BUILD(r, WASM_I64_UCONVERT_F64(WASM_GET_LOCAL(0))); 1316 BUILD(r, WASM_I64_UCONVERT_F64(WASM_GET_LOCAL(0)));
1272 1317
1273 FOR_FLOAT64_INPUTS(i) { 1318 FOR_FLOAT64_INPUTS(i) {
1274 if (*i < static_cast<float>(UINT64_MAX) && *i > -1) { 1319 if (*i < static_cast<float>(UINT64_MAX) && *i > -1) {
1275 CHECK_EQ(static_cast<uint64_t>(*i), r.Call(*i)); 1320 CHECK_EQ(static_cast<uint64_t>(*i), r.Call(*i));
1276 } else { 1321 } else {
1277 CHECK_TRAP64(r.Call(*i)); 1322 CHECK_TRAP64(r.Call(*i));
1278 } 1323 }
1279 } 1324 }
1280 } 1325 }
1281 1326
1282 WASM_EXEC_TEST(I64ReinterpretF64) { 1327 WASM_EXEC_TEST(I64ReinterpretF64) {
1283 REQUIRE(I64ReinterpretF64); 1328 REQUIRE(I64ReinterpretF64);
1284 WasmRunner<int64_t> r(execution_mode); 1329 TestingModule module(execution_mode);
1285 int64_t* memory = r.module().AddMemoryElems<int64_t>(8); 1330 int64_t* memory = module.AddMemoryElems<int64_t>(8);
1331 WasmRunner<int64_t> r(&module);
1286 1332
1287 BUILD(r, WASM_I64_REINTERPRET_F64( 1333 BUILD(r, WASM_I64_REINTERPRET_F64(
1288 WASM_LOAD_MEM(MachineType::Float64(), WASM_ZERO))); 1334 WASM_LOAD_MEM(MachineType::Float64(), WASM_ZERO)));
1289 1335
1290 FOR_INT32_INPUTS(i) { 1336 FOR_INT32_INPUTS(i) {
1291 int64_t expected = static_cast<int64_t>(*i) * 0x300010001; 1337 int64_t expected = static_cast<int64_t>(*i) * 0x300010001;
1292 r.module().WriteMemory(&memory[0], expected); 1338 module.WriteMemory(&memory[0], expected);
1293 CHECK_EQ(expected, r.Call()); 1339 CHECK_EQ(expected, r.Call());
1294 } 1340 }
1295 } 1341 }
1296 1342
1297 WASM_EXEC_TEST(F64ReinterpretI64) { 1343 WASM_EXEC_TEST(F64ReinterpretI64) {
1298 REQUIRE(F64ReinterpretI64); 1344 REQUIRE(F64ReinterpretI64);
1299 WasmRunner<int64_t, int64_t> r(execution_mode); 1345 TestingModule module(execution_mode);
1300 int64_t* memory = r.module().AddMemoryElems<int64_t>(8); 1346 int64_t* memory = module.AddMemoryElems<int64_t>(8);
1347 WasmRunner<int64_t> r(&module, MachineType::Int64());
1301 1348
1302 BUILD(r, WASM_STORE_MEM(MachineType::Float64(), WASM_ZERO, 1349 BUILD(r, WASM_STORE_MEM(MachineType::Float64(), WASM_ZERO,
1303 WASM_F64_REINTERPRET_I64(WASM_GET_LOCAL(0))), 1350 WASM_F64_REINTERPRET_I64(WASM_GET_LOCAL(0))),
1304 WASM_GET_LOCAL(0)); 1351 WASM_GET_LOCAL(0));
1305 1352
1306 FOR_INT32_INPUTS(i) { 1353 FOR_INT32_INPUTS(i) {
1307 int64_t expected = static_cast<int64_t>(*i) * 0x300010001; 1354 int64_t expected = static_cast<int64_t>(*i) * 0x300010001;
1308 CHECK_EQ(expected, r.Call(expected)); 1355 CHECK_EQ(expected, r.Call(expected));
1309 CHECK_EQ(expected, r.module().ReadMemory<int64_t>(&memory[0])); 1356 CHECK_EQ(expected, module.ReadMemory<int64_t>(&memory[0]));
1310 } 1357 }
1311 } 1358 }
1312 1359
1313 WASM_EXEC_TEST(LoadMemI64) { 1360 WASM_EXEC_TEST(LoadMemI64) {
1314 REQUIRE(I64LoadStore); 1361 REQUIRE(I64LoadStore);
1315 WasmRunner<int64_t> r(execution_mode); 1362 TestingModule module(execution_mode);
1316 int64_t* memory = r.module().AddMemoryElems<int64_t>(8); 1363 int64_t* memory = module.AddMemoryElems<int64_t>(8);
1317 r.module().RandomizeMemory(1111); 1364 module.RandomizeMemory(1111);
1365 WasmRunner<int64_t> r(&module);
1318 1366
1319 BUILD(r, WASM_LOAD_MEM(MachineType::Int64(), WASM_I8(0))); 1367 BUILD(r, WASM_LOAD_MEM(MachineType::Int64(), WASM_I8(0)));
1320 1368
1321 r.module().WriteMemory<int64_t>(&memory[0], 0x1abbccdd00112233LL); 1369 module.WriteMemory<int64_t>(&memory[0], 0x1abbccdd00112233LL);
1322 CHECK_EQ(0x1abbccdd00112233LL, r.Call()); 1370 CHECK_EQ(0x1abbccdd00112233LL, r.Call());
1323 1371
1324 r.module().WriteMemory<int64_t>(&memory[0], 0x33aabbccdd001122LL); 1372 module.WriteMemory<int64_t>(&memory[0], 0x33aabbccdd001122LL);
1325 CHECK_EQ(0x33aabbccdd001122LL, r.Call()); 1373 CHECK_EQ(0x33aabbccdd001122LL, r.Call());
1326 1374
1327 r.module().WriteMemory<int64_t>(&memory[0], 77777777); 1375 module.WriteMemory<int64_t>(&memory[0], 77777777);
1328 CHECK_EQ(77777777, r.Call()); 1376 CHECK_EQ(77777777, r.Call());
1329 } 1377 }
1330 1378
1331 WASM_EXEC_TEST(LoadMemI64_alignment) { 1379 WASM_EXEC_TEST(LoadMemI64_alignment) {
1332 REQUIRE(I64LoadStore); 1380 REQUIRE(I64LoadStore);
1381 TestingModule module(execution_mode);
1382 int64_t* memory = module.AddMemoryElems<int64_t>(8);
1333 for (byte alignment = 0; alignment <= 3; alignment++) { 1383 for (byte alignment = 0; alignment <= 3; alignment++) {
1334 WasmRunner<int64_t> r(execution_mode); 1384 module.RandomizeMemory(1111);
1335 int64_t* memory = r.module().AddMemoryElems<int64_t>(8); 1385 WasmRunner<int64_t> r(&module);
1336 r.module().RandomizeMemory(1111);
1337 1386
1338 BUILD(r, 1387 BUILD(r,
1339 WASM_LOAD_MEM_ALIGNMENT(MachineType::Int64(), WASM_I8(0), alignment)); 1388 WASM_LOAD_MEM_ALIGNMENT(MachineType::Int64(), WASM_I8(0), alignment));
1340 1389
1341 r.module().WriteMemory<int64_t>(&memory[0], 0x1abbccdd00112233LL); 1390 module.WriteMemory<int64_t>(&memory[0], 0x1abbccdd00112233LL);
1342 CHECK_EQ(0x1abbccdd00112233LL, r.Call()); 1391 CHECK_EQ(0x1abbccdd00112233LL, r.Call());
1343 1392
1344 r.module().WriteMemory<int64_t>(&memory[0], 0x33aabbccdd001122LL); 1393 module.WriteMemory<int64_t>(&memory[0], 0x33aabbccdd001122LL);
1345 CHECK_EQ(0x33aabbccdd001122LL, r.Call()); 1394 CHECK_EQ(0x33aabbccdd001122LL, r.Call());
1346 1395
1347 r.module().WriteMemory<int64_t>(&memory[0], 77777777); 1396 module.WriteMemory<int64_t>(&memory[0], 77777777);
1348 CHECK_EQ(77777777, r.Call()); 1397 CHECK_EQ(77777777, r.Call());
1349 } 1398 }
1350 } 1399 }
1351 1400
1352 WASM_EXEC_TEST(MemI64_Sum) { 1401 WASM_EXEC_TEST(MemI64_Sum) {
1353 REQUIRE(I64LoadStore); 1402 REQUIRE(I64LoadStore);
1354 REQUIRE(I64Add); 1403 REQUIRE(I64Add);
1355 REQUIRE(I64Sub); 1404 REQUIRE(I64Sub);
1356 REQUIRE(I64Phi); 1405 REQUIRE(I64Phi);
1357 const int kNumElems = 20; 1406 const int kNumElems = 20;
1358 WasmRunner<uint64_t, int32_t> r(execution_mode); 1407 TestingModule module(execution_mode);
1359 uint64_t* memory = r.module().AddMemoryElems<uint64_t>(kNumElems); 1408 uint64_t* memory = module.AddMemoryElems<uint64_t>(kNumElems);
1409 WasmRunner<uint64_t> r(&module, MachineType::Int32());
1360 const byte kSum = r.AllocateLocal(kAstI64); 1410 const byte kSum = r.AllocateLocal(kAstI64);
1361 1411
1362 BUILD( 1412 BUILD(
1363 r, 1413 r,
1364 WASM_WHILE( 1414 WASM_WHILE(
1365 WASM_GET_LOCAL(0), 1415 WASM_GET_LOCAL(0),
1366 WASM_BLOCK( 1416 WASM_BLOCK(
1367 WASM_SET_LOCAL(kSum, 1417 WASM_SET_LOCAL(kSum,
1368 WASM_I64_ADD(WASM_GET_LOCAL(kSum), 1418 WASM_I64_ADD(WASM_GET_LOCAL(kSum),
1369 WASM_LOAD_MEM(MachineType::Int64(), 1419 WASM_LOAD_MEM(MachineType::Int64(),
1370 WASM_GET_LOCAL(0)))), 1420 WASM_GET_LOCAL(0)))),
1371 WASM_SET_LOCAL(0, WASM_I32_SUB(WASM_GET_LOCAL(0), WASM_I8(8))))), 1421 WASM_SET_LOCAL(0, WASM_I32_SUB(WASM_GET_LOCAL(0), WASM_I8(8))))),
1372 WASM_GET_LOCAL(1)); 1422 WASM_GET_LOCAL(1));
1373 1423
1374 // Run 4 trials. 1424 // Run 4 trials.
1375 for (int i = 0; i < 3; i++) { 1425 for (int i = 0; i < 3; i++) {
1376 r.module().RandomizeMemory(i * 33); 1426 module.RandomizeMemory(i * 33);
1377 uint64_t expected = 0; 1427 uint64_t expected = 0;
1378 for (size_t j = kNumElems - 1; j > 0; j--) { 1428 for (size_t j = kNumElems - 1; j > 0; j--) {
1379 expected += r.module().ReadMemory(&memory[j]); 1429 expected += module.ReadMemory(&memory[j]);
1380 } 1430 }
1381 uint64_t result = r.Call(8 * (kNumElems - 1)); 1431 uint64_t result = r.Call(8 * (kNumElems - 1));
1382 CHECK_EQ(expected, result); 1432 CHECK_EQ(expected, result);
1383 } 1433 }
1384 } 1434 }
1385 1435
1386 WASM_EXEC_TEST(StoreMemI64_alignment) { 1436 WASM_EXEC_TEST(StoreMemI64_alignment) {
1437 TestingModule module(execution_mode);
1438 int64_t* memory = module.AddMemoryElems<int64_t>(4);
1387 const int64_t kWritten = 0x12345678abcd0011ll; 1439 const int64_t kWritten = 0x12345678abcd0011ll;
1388 1440
1389 for (byte i = 0; i <= 3; i++) { 1441 for (byte i = 0; i <= 3; i++) {
1390 WasmRunner<int64_t, int64_t> r(execution_mode); 1442 WasmRunner<int64_t> r(&module, MachineType::Int64());
1391 int64_t* memory = r.module().AddMemoryElems<int64_t>(4);
1392 BUILD(r, WASM_STORE_MEM_ALIGNMENT(MachineType::Int64(), WASM_ZERO, i, 1443 BUILD(r, WASM_STORE_MEM_ALIGNMENT(MachineType::Int64(), WASM_ZERO, i,
1393 WASM_GET_LOCAL(0)), 1444 WASM_GET_LOCAL(0)),
1394 WASM_GET_LOCAL(0)); 1445 WASM_GET_LOCAL(0));
1395 r.module().RandomizeMemory(1111); 1446 module.RandomizeMemory(1111);
1396 r.module().WriteMemory<int64_t>(&memory[0], 0); 1447 module.WriteMemory<int64_t>(&memory[0], 0);
1397 1448
1398 CHECK_EQ(kWritten, r.Call(kWritten)); 1449 CHECK_EQ(kWritten, r.Call(kWritten));
1399 CHECK_EQ(kWritten, r.module().ReadMemory(&memory[0])); 1450 CHECK_EQ(kWritten, module.ReadMemory(&memory[0]));
1400 } 1451 }
1401 } 1452 }
1402 1453
1403 WASM_EXEC_TEST(I64Global) { 1454 WASM_EXEC_TEST(I64Global) {
1404 REQUIRE(I64LoadStore); 1455 REQUIRE(I64LoadStore);
1405 REQUIRE(I64SConvertI32); 1456 REQUIRE(I64SConvertI32);
1406 REQUIRE(I64And); 1457 REQUIRE(I64And);
1407 REQUIRE(DepthFirst); 1458 REQUIRE(DepthFirst);
1408 WasmRunner<int32_t, int32_t> r(execution_mode); 1459 TestingModule module(execution_mode);
1409 int64_t* global = r.module().AddGlobal<int64_t>(); 1460 int64_t* global = module.AddGlobal<int64_t>(kAstI64);
1461 WasmRunner<int32_t> r(&module, MachineType::Int32());
1410 // global = global + p0 1462 // global = global + p0
1411 BUILD(r, WASM_SET_GLOBAL( 1463 BUILD(r, WASM_SET_GLOBAL(
1412 0, WASM_I64_AND(WASM_GET_GLOBAL(0), 1464 0, WASM_I64_AND(WASM_GET_GLOBAL(0),
1413 WASM_I64_SCONVERT_I32(WASM_GET_LOCAL(0)))), 1465 WASM_I64_SCONVERT_I32(WASM_GET_LOCAL(0)))),
1414 WASM_ZERO); 1466 WASM_ZERO);
1415 1467
1416 r.module().WriteMemory<int64_t>(global, 0xFFFFFFFFFFFFFFFFLL); 1468 module.WriteMemory<int64_t>(global, 0xFFFFFFFFFFFFFFFFLL);
1417 for (int i = 9; i < 444444; i += 111111) { 1469 for (int i = 9; i < 444444; i += 111111) {
1418 int64_t expected = *global & i; 1470 int64_t expected = *global & i;
1419 r.Call(i); 1471 r.Call(i);
1420 CHECK_EQ(expected, *global); 1472 CHECK_EQ(expected, *global);
1421 } 1473 }
1422 } 1474 }
1423 1475
1424 WASM_EXEC_TEST(I64Eqz) { 1476 WASM_EXEC_TEST(I64Eqz) {
1425 REQUIRE(I64Eq); 1477 REQUIRE(I64Eq);
1426 1478
1427 WasmRunner<int32_t, int64_t> r(execution_mode); 1479 WasmRunner<int32_t> r(execution_mode, MachineType::Int64());
1428 BUILD(r, WASM_I64_EQZ(WASM_GET_LOCAL(0))); 1480 BUILD(r, WASM_I64_EQZ(WASM_GET_LOCAL(0)));
1429 1481
1430 FOR_INT64_INPUTS(i) { 1482 FOR_INT64_INPUTS(i) {
1431 int32_t result = *i == 0 ? 1 : 0; 1483 int32_t result = *i == 0 ? 1 : 0;
1432 CHECK_EQ(result, r.Call(*i)); 1484 CHECK_EQ(result, r.Call(*i));
1433 } 1485 }
1434 } 1486 }
1435 1487
1436 WASM_EXEC_TEST(I64Ror) { 1488 WASM_EXEC_TEST(I64Ror) {
1437 REQUIRE(I64Ror); 1489 REQUIRE(I64Ror);
1438 WasmRunner<int64_t, int64_t, int64_t> r(execution_mode); 1490 WasmRunner<int64_t> r(execution_mode, MachineType::Int64(),
1491 MachineType::Int64());
1439 BUILD(r, WASM_I64_ROR(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 1492 BUILD(r, WASM_I64_ROR(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
1440 1493
1441 FOR_UINT64_INPUTS(i) { 1494 FOR_UINT64_INPUTS(i) {
1442 FOR_UINT64_INPUTS(j) { 1495 FOR_UINT64_INPUTS(j) {
1443 int64_t expected = bits::RotateRight64(*i, *j & 0x3f); 1496 int64_t expected = bits::RotateRight64(*i, *j & 0x3f);
1444 CHECK_EQ(expected, r.Call(*i, *j)); 1497 CHECK_EQ(expected, r.Call(*i, *j));
1445 } 1498 }
1446 } 1499 }
1447 } 1500 }
1448 1501
1449 WASM_EXEC_TEST(I64Rol) { 1502 WASM_EXEC_TEST(I64Rol) {
1450 REQUIRE(I64Rol); 1503 REQUIRE(I64Rol);
1451 WasmRunner<int64_t, int64_t, int64_t> r(execution_mode); 1504 WasmRunner<int64_t> r(execution_mode, MachineType::Int64(),
1505 MachineType::Int64());
1452 BUILD(r, WASM_I64_ROL(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 1506 BUILD(r, WASM_I64_ROL(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
1453 1507
1454 FOR_UINT64_INPUTS(i) { 1508 FOR_UINT64_INPUTS(i) {
1455 FOR_UINT64_INPUTS(j) { 1509 FOR_UINT64_INPUTS(j) {
1456 int64_t expected = bits::RotateLeft64(*i, *j & 0x3f); 1510 int64_t expected = bits::RotateLeft64(*i, *j & 0x3f);
1457 CHECK_EQ(expected, r.Call(*i, *j)); 1511 CHECK_EQ(expected, r.Call(*i, *j));
1458 } 1512 }
1459 } 1513 }
1460 } 1514 }
1461 1515
1462 WASM_EXEC_TEST_WITH_TRAP(StoreMem_offset_oob_i64) { 1516 WASM_EXEC_TEST_WITH_TRAP(StoreMem_offset_oob_i64) {
1517 TestingModule module(execution_mode);
1518 byte* memory = module.AddMemoryElems<byte>(32);
1519
1463 static const MachineType machineTypes[] = { 1520 static const MachineType machineTypes[] = {
1464 MachineType::Int8(), MachineType::Uint8(), MachineType::Int16(), 1521 MachineType::Int8(), MachineType::Uint8(), MachineType::Int16(),
1465 MachineType::Uint16(), MachineType::Int32(), MachineType::Uint32(), 1522 MachineType::Uint16(), MachineType::Int32(), MachineType::Uint32(),
1466 MachineType::Int64(), MachineType::Uint64(), MachineType::Float32(), 1523 MachineType::Int64(), MachineType::Uint64(), MachineType::Float32(),
1467 MachineType::Float64()}; 1524 MachineType::Float64()};
1468 1525
1469 for (size_t m = 0; m < arraysize(machineTypes); m++) { 1526 for (size_t m = 0; m < arraysize(machineTypes); m++) {
1470 WasmRunner<int32_t, uint32_t> r(execution_mode); 1527 module.RandomizeMemory(1119 + static_cast<int>(m));
1471 byte* memory = r.module().AddMemoryElems<byte>(32); 1528 WasmRunner<int32_t> r(&module, MachineType::Uint32());
1472 r.module().RandomizeMemory(1119 + static_cast<int>(m));
1473 1529
1474 BUILD(r, WASM_STORE_MEM_OFFSET(machineTypes[m], 8, WASM_GET_LOCAL(0), 1530 BUILD(r, WASM_STORE_MEM_OFFSET(machineTypes[m], 8, WASM_GET_LOCAL(0),
1475 WASM_LOAD_MEM(machineTypes[m], WASM_ZERO)), 1531 WASM_LOAD_MEM(machineTypes[m], WASM_ZERO)),
1476 WASM_ZERO); 1532 WASM_ZERO);
1477 1533
1478 byte memsize = WasmOpcodes::MemSize(machineTypes[m]); 1534 byte memsize = WasmOpcodes::MemSize(machineTypes[m]);
1479 uint32_t boundary = 24 - memsize; 1535 uint32_t boundary = 24 - memsize;
1480 CHECK_EQ(0, r.Call(boundary)); // in bounds. 1536 CHECK_EQ(0, r.Call(boundary)); // in bounds.
1481 CHECK_EQ(0, memcmp(&memory[0], &memory[8 + boundary], memsize)); 1537 CHECK_EQ(0, memcmp(&memory[0], &memory[8 + boundary], memsize));
1482 1538
1483 for (uint32_t offset = boundary + 1; offset < boundary + 19; offset++) { 1539 for (uint32_t offset = boundary + 1; offset < boundary + 19; offset++) {
1484 CHECK_TRAP(r.Call(offset)); // out of bounds. 1540 CHECK_TRAP(r.Call(offset)); // out of bounds.
1485 } 1541 }
1486 } 1542 }
1487 } 1543 }
1488 1544
1489 #define ADD_CODE(vec, ...) \ 1545 #define ADD_CODE(vec, ...) \
1490 do { \ 1546 do { \
1491 byte __buf[] = {__VA_ARGS__}; \ 1547 byte __buf[] = {__VA_ARGS__}; \
1492 for (size_t i = 0; i < sizeof(__buf); i++) vec.push_back(__buf[i]); \ 1548 for (size_t i = 0; i < sizeof(__buf); i++) vec.push_back(__buf[i]); \
1493 } while (false) 1549 } while (false)
1494 1550
1495 static void CompileCallIndirectMany(LocalType param) { 1551 static void CompileCallIndirectMany(LocalType param) {
1496 // Make sure we don't run out of registers when compiling indirect calls 1552 // Make sure we don't run out of registers when compiling indirect calls
1497 // with many many parameters. 1553 // with many many parameters.
1498 TestSignatures sigs; 1554 TestSignatures sigs;
1499 for (byte num_params = 0; num_params < 40; num_params++) { 1555 for (byte num_params = 0; num_params < 40; num_params++) {
1500 WasmRunner<void> r(kExecuteCompiled); 1556 v8::internal::AccountingAllocator allocator;
1501 FunctionSig* sig = sigs.many(r.zone(), kAstStmt, param, num_params); 1557 Zone zone(&allocator, ZONE_NAME);
1558 HandleScope scope(CcTest::InitIsolateOnce());
1559 TestingModule module(kExecuteCompiled);
1560 FunctionSig* sig = sigs.many(&zone, kAstStmt, param, num_params);
1502 1561
1503 r.module().AddSignature(sig); 1562 module.AddSignature(sig);
1504 r.module().AddSignature(sig); 1563 module.AddSignature(sig);
1505 r.module().AddIndirectFunctionTable(nullptr, 0); 1564 module.AddIndirectFunctionTable(nullptr, 0);
1506 1565
1507 WasmFunctionCompiler& t = r.NewFunction(sig); 1566 WasmFunctionCompiler t(sig, &module);
1508 1567
1509 std::vector<byte> code; 1568 std::vector<byte> code;
1510 for (byte p = 0; p < num_params; p++) { 1569 for (byte p = 0; p < num_params; p++) {
1511 ADD_CODE(code, kExprGetLocal, p); 1570 ADD_CODE(code, kExprGetLocal, p);
1512 } 1571 }
1513 ADD_CODE(code, kExprI8Const, 0); 1572 ADD_CODE(code, kExprI8Const, 0);
1514 ADD_CODE(code, kExprCallIndirect, 1, TABLE_ZERO); 1573 ADD_CODE(code, kExprCallIndirect, 1, TABLE_ZERO);
1515 1574
1516 t.Build(&code[0], &code[0] + code.size()); 1575 t.Build(&code[0], &code[0] + code.size());
1576 t.Compile();
1517 } 1577 }
1518 } 1578 }
1519 1579
1520 TEST(Compile_Wasm_CallIndirect_Many_i64) { CompileCallIndirectMany(kAstI64); } 1580 TEST(Compile_Wasm_CallIndirect_Many_i64) { CompileCallIndirectMany(kAstI64); }
1521 1581
1522 static void Run_WasmMixedCall_N(WasmExecutionMode execution_mode, int start) { 1582 static void Run_WasmMixedCall_N(WasmExecutionMode execution_mode, int start) {
1523 const int kExpected = 6333; 1583 const int kExpected = 6333;
1524 const int kElemSize = 8; 1584 const int kElemSize = 8;
1525 TestSignatures sigs; 1585 TestSignatures sigs;
1526 1586
1527 static MachineType mixed[] = { 1587 static MachineType mixed[] = {
1528 MachineType::Int32(), MachineType::Float32(), MachineType::Int64(), 1588 MachineType::Int32(), MachineType::Float32(), MachineType::Int64(),
1529 MachineType::Float64(), MachineType::Float32(), MachineType::Int64(), 1589 MachineType::Float64(), MachineType::Float32(), MachineType::Int64(),
1530 MachineType::Int32(), MachineType::Float64(), MachineType::Float32(), 1590 MachineType::Int32(), MachineType::Float64(), MachineType::Float32(),
1531 MachineType::Float64(), MachineType::Int32(), MachineType::Int64(), 1591 MachineType::Float64(), MachineType::Int32(), MachineType::Int64(),
1532 MachineType::Int32(), MachineType::Int32()}; 1592 MachineType::Int32(), MachineType::Int32()};
1533 1593
1534 int num_params = static_cast<int>(arraysize(mixed)) - start; 1594 int num_params = static_cast<int>(arraysize(mixed)) - start;
1535 for (int which = 0; which < num_params; which++) { 1595 for (int which = 0; which < num_params; which++) {
1536 v8::internal::AccountingAllocator allocator; 1596 v8::internal::AccountingAllocator allocator;
1537 Zone zone(&allocator, ZONE_NAME); 1597 Zone zone(&allocator, ZONE_NAME);
1538 WasmRunner<int32_t> r(execution_mode); 1598 TestingModule module(execution_mode);
1539 r.module().AddMemory(1024); 1599 module.AddMemory(1024);
1540 MachineType* memtypes = &mixed[start]; 1600 MachineType* memtypes = &mixed[start];
1541 MachineType result = memtypes[which]; 1601 MachineType result = memtypes[which];
1542 1602
1543 // ========================================================================= 1603 // =========================================================================
1544 // Build the selector function. 1604 // Build the selector function.
1545 // ========================================================================= 1605 // =========================================================================
1606 uint32_t index;
1546 FunctionSig::Builder b(&zone, 1, num_params); 1607 FunctionSig::Builder b(&zone, 1, num_params);
1547 b.AddReturn(WasmOpcodes::LocalTypeFor(result)); 1608 b.AddReturn(WasmOpcodes::LocalTypeFor(result));
1548 for (int i = 0; i < num_params; i++) { 1609 for (int i = 0; i < num_params; i++) {
1549 b.AddParam(WasmOpcodes::LocalTypeFor(memtypes[i])); 1610 b.AddParam(WasmOpcodes::LocalTypeFor(memtypes[i]));
1550 } 1611 }
1551 WasmFunctionCompiler& t = r.NewFunction(b.Build()); 1612 WasmFunctionCompiler t(b.Build(), &module);
1552 BUILD(t, WASM_GET_LOCAL(which)); 1613 BUILD(t, WASM_GET_LOCAL(which));
1614 index = t.CompileAndAdd();
1553 1615
1554 // ========================================================================= 1616 // =========================================================================
1555 // Build the calling function. 1617 // Build the calling function.
1556 // ========================================================================= 1618 // =========================================================================
1619 WasmRunner<int32_t> r(&module);
1557 std::vector<byte> code; 1620 std::vector<byte> code;
1558 1621
1559 // Load the offset for the store. 1622 // Load the offset for the store.
1560 ADD_CODE(code, WASM_ZERO); 1623 ADD_CODE(code, WASM_ZERO);
1561 1624
1562 // Load the arguments. 1625 // Load the arguments.
1563 for (int i = 0; i < num_params; i++) { 1626 for (int i = 0; i < num_params; i++) {
1564 int offset = (i + 1) * kElemSize; 1627 int offset = (i + 1) * kElemSize;
1565 ADD_CODE(code, WASM_LOAD_MEM(memtypes[i], WASM_I8(offset))); 1628 ADD_CODE(code, WASM_LOAD_MEM(memtypes[i], WASM_I8(offset)));
1566 } 1629 }
1567 1630
1568 // Call the selector function. 1631 // Call the selector function.
1569 ADD_CODE(code, WASM_CALL_FUNCTION0(t.function_index())); 1632 ADD_CODE(code, kExprCallFunction, static_cast<byte>(index));
1570 1633
1571 // Store the result in memory. 1634 // Store the result in memory.
1572 ADD_CODE(code, 1635 ADD_CODE(code,
1573 static_cast<byte>(WasmOpcodes::LoadStoreOpcodeOf(result, true)), 1636 static_cast<byte>(WasmOpcodes::LoadStoreOpcodeOf(result, true)),
1574 ZERO_ALIGNMENT, ZERO_OFFSET); 1637 ZERO_ALIGNMENT, ZERO_OFFSET);
1575 1638
1576 // Return the expected value. 1639 // Return the expected value.
1577 ADD_CODE(code, WASM_I32V_2(kExpected)); 1640 ADD_CODE(code, WASM_I32V_2(kExpected));
1578 1641
1579 r.Build(&code[0], &code[0] + code.size()); 1642 r.Build(&code[0], &code[0] + code.size());
1580 1643
1581 // Run the code. 1644 // Run the code.
1582 for (int t = 0; t < 10; t++) { 1645 for (int t = 0; t < 10; t++) {
1583 r.module().RandomizeMemory(); 1646 module.RandomizeMemory();
1584 CHECK_EQ(kExpected, r.Call()); 1647 CHECK_EQ(kExpected, r.Call());
1585 1648
1586 int size = WasmOpcodes::MemSize(result); 1649 int size = WasmOpcodes::MemSize(result);
1587 for (int i = 0; i < size; i++) { 1650 for (int i = 0; i < size; i++) {
1588 int base = (which + 1) * kElemSize; 1651 int base = (which + 1) * kElemSize;
1589 byte expected = r.module().raw_mem_at<byte>(base + i); 1652 byte expected = module.raw_mem_at<byte>(base + i);
1590 byte result = r.module().raw_mem_at<byte>(i); 1653 byte result = module.raw_mem_at<byte>(i);
1591 CHECK_EQ(expected, result); 1654 CHECK_EQ(expected, result);
1592 } 1655 }
1593 } 1656 }
1594 } 1657 }
1595 } 1658 }
1596 1659
1597 WASM_EXEC_TEST(MixedCall_i64_0) { Run_WasmMixedCall_N(execution_mode, 0); } 1660 WASM_EXEC_TEST(MixedCall_i64_0) { Run_WasmMixedCall_N(execution_mode, 0); }
1598 WASM_EXEC_TEST(MixedCall_i64_1) { Run_WasmMixedCall_N(execution_mode, 1); } 1661 WASM_EXEC_TEST(MixedCall_i64_1) { Run_WasmMixedCall_N(execution_mode, 1); }
1599 WASM_EXEC_TEST(MixedCall_i64_2) { Run_WasmMixedCall_N(execution_mode, 2); } 1662 WASM_EXEC_TEST(MixedCall_i64_2) { Run_WasmMixedCall_N(execution_mode, 2); }
1600 WASM_EXEC_TEST(MixedCall_i64_3) { Run_WasmMixedCall_N(execution_mode, 3); } 1663 WASM_EXEC_TEST(MixedCall_i64_3) { Run_WasmMixedCall_N(execution_mode, 3); }
OLDNEW
« no previous file with comments | « test/cctest/wasm/test-run-wasm.cc ('k') | test/cctest/wasm/test-run-wasm-asmjs.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698