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

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

Issue 2562393002: [wasm] Introduce the TrapIf and TrapUnless operators to generate trap code. (Closed)
Patch Set: Rename UseSourcePosition to IsSourcePositionUsed 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 | « src/wasm/wasm-opcodes.cc ('k') | test/cctest/wasm/test-run-wasm-64.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/platform/elapsed-timer.h" 9 #include "src/base/platform/elapsed-timer.h"
10 #include "src/utils.h" 10 #include "src/utils.h"
(...skipping 368 matching lines...) Expand 10 before | Expand all | Expand 10 after
379 BUILD(r, WASM_I32_SAR(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 379 BUILD(r, WASM_I32_SAR(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
380 380
381 FOR_INT32_INPUTS(i) { 381 FOR_INT32_INPUTS(i) {
382 FOR_INT32_INPUTS(j) { 382 FOR_INT32_INPUTS(j) {
383 int32_t expected = (*i) >> (*j & 0x1f); 383 int32_t expected = (*i) >> (*j & 0x1f);
384 CHECK_EQ(expected, r.Call(*i, *j)); 384 CHECK_EQ(expected, r.Call(*i, *j));
385 } 385 }
386 } 386 }
387 } 387 }
388 388
389 WASM_EXEC_TEST(Int32DivS_trap) { 389 WASM_EXEC_TEST_WITH_TRAP(Int32DivS_trap) {
390 WasmRunner<int32_t> r(execution_mode, MachineType::Int32(), 390 WasmRunner<int32_t> r(execution_mode, MachineType::Int32(),
391 MachineType::Int32()); 391 MachineType::Int32());
392 BUILD(r, WASM_I32_DIVS(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 392 BUILD(r, WASM_I32_DIVS(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
393 const int32_t kMin = std::numeric_limits<int32_t>::min(); 393 const int32_t kMin = std::numeric_limits<int32_t>::min();
394 CHECK_EQ(0, r.Call(0, 100)); 394 CHECK_EQ(0, r.Call(0, 100));
395 CHECK_TRAP(r.Call(100, 0)); 395 CHECK_TRAP(r.Call(100, 0));
396 CHECK_TRAP(r.Call(-1001, 0)); 396 CHECK_TRAP(r.Call(-1001, 0));
397 CHECK_TRAP(r.Call(kMin, -1)); 397 CHECK_TRAP(r.Call(kMin, -1));
398 CHECK_TRAP(r.Call(kMin, 0)); 398 CHECK_TRAP(r.Call(kMin, 0));
399 } 399 }
400 400
401 WASM_EXEC_TEST(Int32RemS_trap) { 401 WASM_EXEC_TEST_WITH_TRAP(Int32RemS_trap) {
402 WasmRunner<int32_t> r(execution_mode, MachineType::Int32(), 402 WasmRunner<int32_t> r(execution_mode, MachineType::Int32(),
403 MachineType::Int32()); 403 MachineType::Int32());
404 BUILD(r, WASM_I32_REMS(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 404 BUILD(r, WASM_I32_REMS(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
405 const int32_t kMin = std::numeric_limits<int32_t>::min(); 405 const int32_t kMin = std::numeric_limits<int32_t>::min();
406 CHECK_EQ(33, r.Call(133, 100)); 406 CHECK_EQ(33, r.Call(133, 100));
407 CHECK_EQ(0, r.Call(kMin, -1)); 407 CHECK_EQ(0, r.Call(kMin, -1));
408 CHECK_TRAP(r.Call(100, 0)); 408 CHECK_TRAP(r.Call(100, 0));
409 CHECK_TRAP(r.Call(-1001, 0)); 409 CHECK_TRAP(r.Call(-1001, 0));
410 CHECK_TRAP(r.Call(kMin, 0)); 410 CHECK_TRAP(r.Call(kMin, 0));
411 } 411 }
412 412
413 WASM_EXEC_TEST(Int32DivU_trap) { 413 WASM_EXEC_TEST_WITH_TRAP(Int32DivU_trap) {
414 WasmRunner<int32_t> r(execution_mode, MachineType::Int32(), 414 WasmRunner<int32_t> r(execution_mode, MachineType::Int32(),
415 MachineType::Int32()); 415 MachineType::Int32());
416 BUILD(r, WASM_I32_DIVU(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 416 BUILD(r, WASM_I32_DIVU(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
417 const int32_t kMin = std::numeric_limits<int32_t>::min(); 417 const int32_t kMin = std::numeric_limits<int32_t>::min();
418 CHECK_EQ(0, r.Call(0, 100)); 418 CHECK_EQ(0, r.Call(0, 100));
419 CHECK_EQ(0, r.Call(kMin, -1)); 419 CHECK_EQ(0, r.Call(kMin, -1));
420 CHECK_TRAP(r.Call(100, 0)); 420 CHECK_TRAP(r.Call(100, 0));
421 CHECK_TRAP(r.Call(-1001, 0)); 421 CHECK_TRAP(r.Call(-1001, 0));
422 CHECK_TRAP(r.Call(kMin, 0)); 422 CHECK_TRAP(r.Call(kMin, 0));
423 } 423 }
424 424
425 WASM_EXEC_TEST(Int32RemU_trap) { 425 WASM_EXEC_TEST_WITH_TRAP(Int32RemU_trap) {
426 WasmRunner<int32_t> r(execution_mode, MachineType::Int32(), 426 WasmRunner<int32_t> r(execution_mode, MachineType::Int32(),
427 MachineType::Int32()); 427 MachineType::Int32());
428 BUILD(r, WASM_I32_REMU(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 428 BUILD(r, WASM_I32_REMU(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
429 CHECK_EQ(17, r.Call(217, 100)); 429 CHECK_EQ(17, r.Call(217, 100));
430 const int32_t kMin = std::numeric_limits<int32_t>::min(); 430 const int32_t kMin = std::numeric_limits<int32_t>::min();
431 CHECK_TRAP(r.Call(100, 0)); 431 CHECK_TRAP(r.Call(100, 0));
432 CHECK_TRAP(r.Call(-1001, 0)); 432 CHECK_TRAP(r.Call(-1001, 0));
433 CHECK_TRAP(r.Call(kMin, 0)); 433 CHECK_TRAP(r.Call(kMin, 0));
434 CHECK_EQ(kMin, r.Call(kMin, -1)); 434 CHECK_EQ(kMin, r.Call(kMin, -1));
435 } 435 }
436 436
437 WASM_EXEC_TEST(Int32DivS_byzero_const) { 437 WASM_EXEC_TEST_WITH_TRAP(Int32DivS_byzero_const) {
438 for (int8_t denom = -2; denom < 8; ++denom) { 438 for (int8_t denom = -2; denom < 8; ++denom) {
439 WasmRunner<int32_t> r(execution_mode, MachineType::Int32()); 439 WasmRunner<int32_t> r(execution_mode, MachineType::Int32());
440 BUILD(r, WASM_I32_DIVS(WASM_GET_LOCAL(0), WASM_I8(denom))); 440 BUILD(r, WASM_I32_DIVS(WASM_GET_LOCAL(0), WASM_I8(denom)));
441 for (int32_t val = -7; val < 8; ++val) { 441 for (int32_t val = -7; val < 8; ++val) {
442 if (denom == 0) { 442 if (denom == 0) {
443 CHECK_TRAP(r.Call(val)); 443 CHECK_TRAP(r.Call(val));
444 } else { 444 } else {
445 CHECK_EQ(val / denom, r.Call(val)); 445 CHECK_EQ(val / denom, r.Call(val));
446 } 446 }
447 } 447 }
(...skipping 29 matching lines...) Expand all
477 CHECK_EQ(0, r.Call(*i)); 477 CHECK_EQ(0, r.Call(*i));
478 } else if (denom == -1 && *i == std::numeric_limits<int32_t>::min()) { 478 } else if (denom == -1 && *i == std::numeric_limits<int32_t>::min()) {
479 CHECK_EQ(0, r.Call(*i)); 479 CHECK_EQ(0, r.Call(*i));
480 } else { 480 } else {
481 CHECK_EQ(*i % denom, r.Call(*i)); 481 CHECK_EQ(*i % denom, r.Call(*i));
482 } 482 }
483 } 483 }
484 } 484 }
485 } 485 }
486 486
487 WASM_EXEC_TEST(Int32DivU_byzero_const) { 487 WASM_EXEC_TEST_WITH_TRAP(Int32DivU_byzero_const) {
488 for (uint32_t denom = 0xfffffffe; denom < 8; ++denom) { 488 for (uint32_t denom = 0xfffffffe; denom < 8; ++denom) {
489 WasmRunner<uint32_t> r(execution_mode, MachineType::Uint32()); 489 WasmRunner<uint32_t> r(execution_mode, MachineType::Uint32());
490 BUILD(r, WASM_I32_DIVU(WASM_GET_LOCAL(0), WASM_I32V_1(denom))); 490 BUILD(r, WASM_I32_DIVU(WASM_GET_LOCAL(0), WASM_I32V_1(denom)));
491 491
492 for (uint32_t val = 0xfffffff0; val < 8; ++val) { 492 for (uint32_t val = 0xfffffff0; val < 8; ++val) {
493 if (denom == 0) { 493 if (denom == 0) {
494 CHECK_TRAP(r.Call(val)); 494 CHECK_TRAP(r.Call(val));
495 } else { 495 } else {
496 CHECK_EQ(val / denom, r.Call(val)); 496 CHECK_EQ(val / denom, r.Call(val));
497 } 497 }
498 } 498 }
499 } 499 }
500 } 500 }
501 501
502 WASM_EXEC_TEST(Int32DivS_trap_effect) { 502 WASM_EXEC_TEST_WITH_TRAP(Int32DivS_trap_effect) {
503 TestingModule module(execution_mode); 503 TestingModule module(execution_mode);
504 module.AddMemoryElems<int32_t>(8); 504 module.AddMemoryElems<int32_t>(8);
505 WasmRunner<int32_t> r(&module, MachineType::Int32(), MachineType::Int32()); 505 WasmRunner<int32_t> r(&module, MachineType::Int32(), MachineType::Int32());
506 506
507 BUILD(r, WASM_IF_ELSE_I( 507 BUILD(r, WASM_IF_ELSE_I(
508 WASM_GET_LOCAL(0), 508 WASM_GET_LOCAL(0),
509 WASM_I32_DIVS( 509 WASM_I32_DIVS(
510 WASM_BLOCK_I(WASM_STORE_MEM(MachineType::Int8(), WASM_ZERO, 510 WASM_BLOCK_I(WASM_STORE_MEM(MachineType::Int8(), WASM_ZERO,
511 WASM_GET_LOCAL(0)), 511 WASM_GET_LOCAL(0)),
512 WASM_GET_LOCAL(0)), 512 WASM_GET_LOCAL(0)),
(...skipping 589 matching lines...) Expand 10 before | Expand all | Expand 10 after
1102 WASM_F32_REINTERPRET_I32(WASM_GET_LOCAL(0))), 1102 WASM_F32_REINTERPRET_I32(WASM_GET_LOCAL(0))),
1103 WASM_I8(107)); 1103 WASM_I8(107));
1104 1104
1105 FOR_INT32_INPUTS(i) { 1105 FOR_INT32_INPUTS(i) {
1106 int32_t expected = *i; 1106 int32_t expected = *i;
1107 CHECK_EQ(107, r.Call(expected)); 1107 CHECK_EQ(107, r.Call(expected));
1108 CHECK_EQ(expected, module.ReadMemory(&memory[0])); 1108 CHECK_EQ(expected, module.ReadMemory(&memory[0]));
1109 } 1109 }
1110 } 1110 }
1111 1111
1112 WASM_EXEC_TEST(LoadMaxUint32Offset) { 1112 WASM_EXEC_TEST_WITH_TRAP(LoadMaxUint32Offset) {
1113 TestingModule module(execution_mode); 1113 TestingModule module(execution_mode);
1114 module.AddMemoryElems<int32_t>(8); 1114 module.AddMemoryElems<int32_t>(8);
1115 WasmRunner<int32_t> r(&module); 1115 WasmRunner<int32_t> r(&module);
1116 1116
1117 BUILD(r, kExprI8Const, 0, // index 1117 BUILD(r, kExprI8Const, 0, // index
1118 static_cast<byte>(v8::internal::wasm::WasmOpcodes::LoadStoreOpcodeOf( 1118 static_cast<byte>(v8::internal::wasm::WasmOpcodes::LoadStoreOpcodeOf(
1119 MachineType::Int32(), false)), // -- 1119 MachineType::Int32(), false)), // --
1120 0, // alignment 1120 0, // alignment
1121 U32V_5(0xffffffff)); // offset 1121 U32V_5(0xffffffff)); // offset
1122 1122
(...skipping 382 matching lines...) Expand 10 before | Expand all | Expand 10 after
1505 CHECK_EQ(0x1a2b3c4d, r.Call(0)); 1505 CHECK_EQ(0x1a2b3c4d, r.Call(0));
1506 1506
1507 module.WriteMemory(&memory[0], 0x5e6f7a8b); 1507 module.WriteMemory(&memory[0], 0x5e6f7a8b);
1508 CHECK_EQ(0x5e6f7a8b, r.Call(0)); 1508 CHECK_EQ(0x5e6f7a8b, r.Call(0));
1509 1509
1510 module.WriteMemory(&memory[0], 0x7ca0b1c2); 1510 module.WriteMemory(&memory[0], 0x7ca0b1c2);
1511 CHECK_EQ(0x7ca0b1c2, r.Call(0)); 1511 CHECK_EQ(0x7ca0b1c2, r.Call(0));
1512 } 1512 }
1513 } 1513 }
1514 1514
1515 WASM_EXEC_TEST(LoadMemI32_oob) { 1515 WASM_EXEC_TEST_WITH_TRAP(LoadMemI32_oob) {
1516 TestingModule module(execution_mode); 1516 TestingModule module(execution_mode);
1517 int32_t* memory = module.AddMemoryElems<int32_t>(8); 1517 int32_t* memory = module.AddMemoryElems<int32_t>(8);
1518 WasmRunner<int32_t> r(&module, MachineType::Uint32()); 1518 WasmRunner<int32_t> r(&module, MachineType::Uint32());
1519 module.RandomizeMemory(1111); 1519 module.RandomizeMemory(1111);
1520 1520
1521 BUILD(r, WASM_LOAD_MEM(MachineType::Int32(), WASM_GET_LOCAL(0))); 1521 BUILD(r, WASM_LOAD_MEM(MachineType::Int32(), WASM_GET_LOCAL(0)));
1522 1522
1523 module.WriteMemory(&memory[0], 88888888); 1523 module.WriteMemory(&memory[0], 88888888);
1524 CHECK_EQ(88888888, r.Call(0u)); 1524 CHECK_EQ(88888888, r.Call(0u));
1525 for (uint32_t offset = 29; offset < 40; ++offset) { 1525 for (uint32_t offset = 29; offset < 40; ++offset) {
1526 CHECK_TRAP(r.Call(offset)); 1526 CHECK_TRAP(r.Call(offset));
1527 } 1527 }
1528 1528
1529 for (uint32_t offset = 0x80000000; offset < 0x80000010; ++offset) { 1529 for (uint32_t offset = 0x80000000; offset < 0x80000010; ++offset) {
1530 CHECK_TRAP(r.Call(offset)); 1530 CHECK_TRAP(r.Call(offset));
1531 } 1531 }
1532 } 1532 }
1533 1533
1534 WASM_EXEC_TEST(LoadMem_offset_oob) { 1534 WASM_EXEC_TEST_WITH_TRAP(LoadMem_offset_oob) {
1535 TestingModule module(execution_mode); 1535 TestingModule module(execution_mode);
1536 module.AddMemoryElems<int32_t>(8); 1536 module.AddMemoryElems<int32_t>(8);
1537 1537
1538 static const MachineType machineTypes[] = { 1538 static const MachineType machineTypes[] = {
1539 MachineType::Int8(), MachineType::Uint8(), MachineType::Int16(), 1539 MachineType::Int8(), MachineType::Uint8(), MachineType::Int16(),
1540 MachineType::Uint16(), MachineType::Int32(), MachineType::Uint32(), 1540 MachineType::Uint16(), MachineType::Int32(), MachineType::Uint32(),
1541 MachineType::Int64(), MachineType::Uint64(), MachineType::Float32(), 1541 MachineType::Int64(), MachineType::Uint64(), MachineType::Float32(),
1542 MachineType::Float64()}; 1542 MachineType::Float64()};
1543 1543
1544 for (size_t m = 0; m < arraysize(machineTypes); ++m) { 1544 for (size_t m = 0; m < arraysize(machineTypes); ++m) {
(...skipping 30 matching lines...) Expand all
1575 1575
1576 module.WriteMemory(&memory[0], 11111111); 1576 module.WriteMemory(&memory[0], 11111111);
1577 module.WriteMemory(&memory[1], 22222222); 1577 module.WriteMemory(&memory[1], 22222222);
1578 module.WriteMemory(&memory[2], 33333333); 1578 module.WriteMemory(&memory[2], 33333333);
1579 module.WriteMemory(&memory[3], 44444444); 1579 module.WriteMemory(&memory[3], 44444444);
1580 CHECK_EQ(22222222, r.Call(0)); 1580 CHECK_EQ(22222222, r.Call(0));
1581 CHECK_EQ(33333333, r.Call(4)); 1581 CHECK_EQ(33333333, r.Call(4));
1582 CHECK_EQ(44444444, r.Call(8)); 1582 CHECK_EQ(44444444, r.Call(8));
1583 } 1583 }
1584 1584
1585 WASM_EXEC_TEST(LoadMemI32_const_oob_misaligned) { 1585 WASM_EXEC_TEST_WITH_TRAP(LoadMemI32_const_oob_misaligned) {
1586 const int kMemSize = 12; 1586 const int kMemSize = 12;
1587 // TODO(titzer): Fix misaligned accesses on MIPS and re-enable. 1587 // TODO(titzer): Fix misaligned accesses on MIPS and re-enable.
1588 for (int offset = 0; offset < kMemSize + 5; ++offset) { 1588 for (int offset = 0; offset < kMemSize + 5; ++offset) {
1589 for (int index = 0; index < kMemSize + 5; ++index) { 1589 for (int index = 0; index < kMemSize + 5; ++index) {
1590 TestingModule module(execution_mode); 1590 TestingModule module(execution_mode);
1591 module.AddMemoryElems<byte>(kMemSize); 1591 module.AddMemoryElems<byte>(kMemSize);
1592 1592
1593 WasmRunner<int32_t> r(&module); 1593 WasmRunner<int32_t> r(&module);
1594 module.RandomizeMemory(); 1594 module.RandomizeMemory();
1595 1595
1596 BUILD(r, 1596 BUILD(r,
1597 WASM_LOAD_MEM_OFFSET(MachineType::Int32(), offset, WASM_I8(index))); 1597 WASM_LOAD_MEM_OFFSET(MachineType::Int32(), offset, WASM_I8(index)));
1598 1598
1599 if ((offset + index) <= static_cast<int>((kMemSize - sizeof(int32_t)))) { 1599 if ((offset + index) <= static_cast<int>((kMemSize - sizeof(int32_t)))) {
1600 CHECK_EQ(module.raw_val_at<int32_t>(offset + index), r.Call()); 1600 CHECK_EQ(module.raw_val_at<int32_t>(offset + index), r.Call());
1601 } else { 1601 } else {
1602 CHECK_TRAP(r.Call()); 1602 CHECK_TRAP(r.Call());
1603 } 1603 }
1604 } 1604 }
1605 } 1605 }
1606 } 1606 }
1607 1607
1608 WASM_EXEC_TEST(LoadMemI32_const_oob) { 1608 WASM_EXEC_TEST_WITH_TRAP(LoadMemI32_const_oob) {
1609 const int kMemSize = 24; 1609 const int kMemSize = 24;
1610 for (int offset = 0; offset < kMemSize + 5; offset += 4) { 1610 for (int offset = 0; offset < kMemSize + 5; offset += 4) {
1611 for (int index = 0; index < kMemSize + 5; index += 4) { 1611 for (int index = 0; index < kMemSize + 5; index += 4) {
1612 TestingModule module(execution_mode); 1612 TestingModule module(execution_mode);
1613 module.AddMemoryElems<byte>(kMemSize); 1613 module.AddMemoryElems<byte>(kMemSize);
1614 1614
1615 WasmRunner<int32_t> r(&module); 1615 WasmRunner<int32_t> r(&module);
1616 module.RandomizeMemory(); 1616 module.RandomizeMemory();
1617 1617
1618 BUILD(r, 1618 BUILD(r,
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
1662 module.WriteMemory(&memory[2], 88888888); 1662 module.WriteMemory(&memory[2], 88888888);
1663 module.WriteMemory(&memory[3], 99999999); 1663 module.WriteMemory(&memory[3], 99999999);
1664 CHECK_EQ(kWritten, r.Call(i * 4)); 1664 CHECK_EQ(kWritten, r.Call(i * 4));
1665 CHECK_EQ(66666666, module.ReadMemory(&memory[0])); 1665 CHECK_EQ(66666666, module.ReadMemory(&memory[0]));
1666 CHECK_EQ(i == 0 ? kWritten : 77777777, module.ReadMemory(&memory[1])); 1666 CHECK_EQ(i == 0 ? kWritten : 77777777, module.ReadMemory(&memory[1]));
1667 CHECK_EQ(i == 1 ? kWritten : 88888888, module.ReadMemory(&memory[2])); 1667 CHECK_EQ(i == 1 ? kWritten : 88888888, module.ReadMemory(&memory[2]));
1668 CHECK_EQ(i == 2 ? kWritten : 99999999, module.ReadMemory(&memory[3])); 1668 CHECK_EQ(i == 2 ? kWritten : 99999999, module.ReadMemory(&memory[3]));
1669 } 1669 }
1670 } 1670 }
1671 1671
1672 WASM_EXEC_TEST(StoreMem_offset_oob) { 1672 WASM_EXEC_TEST_WITH_TRAP(StoreMem_offset_oob) {
1673 TestingModule module(execution_mode); 1673 TestingModule module(execution_mode);
1674 byte* memory = module.AddMemoryElems<byte>(32); 1674 byte* memory = module.AddMemoryElems<byte>(32);
1675 1675
1676 // 64-bit cases are handled in test-run-wasm-64.cc 1676 // 64-bit cases are handled in test-run-wasm-64.cc
1677 static const MachineType machineTypes[] = { 1677 static const MachineType machineTypes[] = {
1678 MachineType::Int8(), MachineType::Uint8(), MachineType::Int16(), 1678 MachineType::Int8(), MachineType::Uint8(), MachineType::Int16(),
1679 MachineType::Uint16(), MachineType::Int32(), MachineType::Uint32(), 1679 MachineType::Uint16(), MachineType::Int32(), MachineType::Uint32(),
1680 MachineType::Float32(), MachineType::Float64()}; 1680 MachineType::Float32(), MachineType::Float64()};
1681 1681
1682 for (size_t m = 0; m < arraysize(machineTypes); ++m) { 1682 for (size_t m = 0; m < arraysize(machineTypes); ++m) {
(...skipping 921 matching lines...) Expand 10 before | Expand all | Expand 10 after
2604 WASM_BRV(1, WASM_I8(12))), 2604 WASM_BRV(1, WASM_I8(12))),
2605 WASM_IF_ELSE_I(WASM_GET_LOCAL(1), WASM_BRV(0, WASM_I8(13)), 2605 WASM_IF_ELSE_I(WASM_GET_LOCAL(1), WASM_BRV(0, WASM_I8(13)),
2606 WASM_BRV(1, WASM_I8(14)))))); 2606 WASM_BRV(1, WASM_I8(14))))));
2607 2607
2608 CHECK_EQ(11, r.Call(1, 1)); 2608 CHECK_EQ(11, r.Call(1, 1));
2609 CHECK_EQ(12, r.Call(1, 0)); 2609 CHECK_EQ(12, r.Call(1, 0));
2610 CHECK_EQ(13, r.Call(0, 1)); 2610 CHECK_EQ(13, r.Call(0, 1));
2611 CHECK_EQ(14, r.Call(0, 0)); 2611 CHECK_EQ(14, r.Call(0, 0));
2612 } 2612 }
2613 2613
2614 WASM_EXEC_TEST(SimpleCallIndirect) { 2614 WASM_EXEC_TEST_WITH_TRAP(SimpleCallIndirect) {
2615 TestSignatures sigs; 2615 TestSignatures sigs;
2616 TestingModule module(execution_mode); 2616 TestingModule module(execution_mode);
2617 2617
2618 WasmFunctionCompiler t1(sigs.i_ii(), &module); 2618 WasmFunctionCompiler t1(sigs.i_ii(), &module);
2619 BUILD(t1, WASM_I32_ADD(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 2619 BUILD(t1, WASM_I32_ADD(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
2620 t1.CompileAndAdd(/*sig_index*/ 1); 2620 t1.CompileAndAdd(/*sig_index*/ 1);
2621 2621
2622 WasmFunctionCompiler t2(sigs.i_ii(), &module); 2622 WasmFunctionCompiler t2(sigs.i_ii(), &module);
2623 BUILD(t2, WASM_I32_SUB(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 2623 BUILD(t2, WASM_I32_SUB(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
2624 t2.CompileAndAdd(/*sig_index*/ 1); 2624 t2.CompileAndAdd(/*sig_index*/ 1);
(...skipping 11 matching lines...) Expand all
2636 2636
2637 // Builder the caller function. 2637 // Builder the caller function.
2638 WasmRunner<int32_t> r(&module, MachineType::Int32()); 2638 WasmRunner<int32_t> r(&module, MachineType::Int32());
2639 BUILD(r, WASM_CALL_INDIRECT2(1, WASM_GET_LOCAL(0), WASM_I8(66), WASM_I8(22))); 2639 BUILD(r, WASM_CALL_INDIRECT2(1, WASM_GET_LOCAL(0), WASM_I8(66), WASM_I8(22)));
2640 2640
2641 CHECK_EQ(88, r.Call(0)); 2641 CHECK_EQ(88, r.Call(0));
2642 CHECK_EQ(44, r.Call(1)); 2642 CHECK_EQ(44, r.Call(1));
2643 CHECK_TRAP(r.Call(2)); 2643 CHECK_TRAP(r.Call(2));
2644 } 2644 }
2645 2645
2646 WASM_EXEC_TEST(MultipleCallIndirect) { 2646 WASM_EXEC_TEST_WITH_TRAP(MultipleCallIndirect) {
2647 TestSignatures sigs; 2647 TestSignatures sigs;
2648 TestingModule module(execution_mode); 2648 TestingModule module(execution_mode);
2649 2649
2650 WasmFunctionCompiler t1(sigs.i_ii(), &module); 2650 WasmFunctionCompiler t1(sigs.i_ii(), &module);
2651 BUILD(t1, WASM_I32_ADD(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 2651 BUILD(t1, WASM_I32_ADD(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
2652 t1.CompileAndAdd(/*sig_index*/ 1); 2652 t1.CompileAndAdd(/*sig_index*/ 1);
2653 2653
2654 WasmFunctionCompiler t2(sigs.i_ii(), &module); 2654 WasmFunctionCompiler t2(sigs.i_ii(), &module);
2655 BUILD(t2, WASM_I32_SUB(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 2655 BUILD(t2, WASM_I32_SUB(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
2656 t2.CompileAndAdd(/*sig_index*/ 1); 2656 t2.CompileAndAdd(/*sig_index*/ 1);
(...skipping 22 matching lines...) Expand all
2679 CHECK_EQ(19, r.Call(0, 1, 9)); 2679 CHECK_EQ(19, r.Call(0, 1, 9));
2680 CHECK_EQ(1, r.Call(1, 0, 2)); 2680 CHECK_EQ(1, r.Call(1, 0, 2));
2681 CHECK_EQ(1, r.Call(1, 0, 9)); 2681 CHECK_EQ(1, r.Call(1, 0, 9));
2682 2682
2683 CHECK_TRAP(r.Call(0, 2, 1)); 2683 CHECK_TRAP(r.Call(0, 2, 1));
2684 CHECK_TRAP(r.Call(1, 2, 0)); 2684 CHECK_TRAP(r.Call(1, 2, 0));
2685 CHECK_TRAP(r.Call(2, 0, 1)); 2685 CHECK_TRAP(r.Call(2, 0, 1));
2686 CHECK_TRAP(r.Call(2, 1, 0)); 2686 CHECK_TRAP(r.Call(2, 1, 0));
2687 } 2687 }
2688 2688
2689 WASM_EXEC_TEST(CallIndirect_EmptyTable) { 2689 WASM_EXEC_TEST_WITH_TRAP(CallIndirect_EmptyTable) {
2690 TestSignatures sigs; 2690 TestSignatures sigs;
2691 TestingModule module(execution_mode); 2691 TestingModule module(execution_mode);
2692 2692
2693 // One function. 2693 // One function.
2694 WasmFunctionCompiler t1(sigs.i_ii(), &module); 2694 WasmFunctionCompiler t1(sigs.i_ii(), &module);
2695 BUILD(t1, WASM_I32_ADD(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 2695 BUILD(t1, WASM_I32_ADD(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
2696 t1.CompileAndAdd(/*sig_index*/ 1); 2696 t1.CompileAndAdd(/*sig_index*/ 1);
2697 2697
2698 // Signature table. 2698 // Signature table.
2699 module.AddSignature(sigs.f_ff()); 2699 module.AddSignature(sigs.f_ff());
2700 module.AddSignature(sigs.i_ii()); 2700 module.AddSignature(sigs.i_ii());
2701 module.AddIndirectFunctionTable(nullptr, 0); 2701 module.AddIndirectFunctionTable(nullptr, 0);
2702 2702
2703 // Builder the caller function. 2703 // Builder the caller function.
2704 WasmRunner<int32_t> r(&module, MachineType::Int32()); 2704 WasmRunner<int32_t> r(&module, MachineType::Int32());
2705 BUILD(r, WASM_CALL_INDIRECT2(1, WASM_GET_LOCAL(0), WASM_I8(66), WASM_I8(22))); 2705 BUILD(r, WASM_CALL_INDIRECT2(1, WASM_GET_LOCAL(0), WASM_I8(66), WASM_I8(22)));
2706 2706
2707 CHECK_TRAP(r.Call(0)); 2707 CHECK_TRAP(r.Call(0));
2708 CHECK_TRAP(r.Call(1)); 2708 CHECK_TRAP(r.Call(1));
2709 CHECK_TRAP(r.Call(2)); 2709 CHECK_TRAP(r.Call(2));
2710 } 2710 }
2711 2711
2712 WASM_EXEC_TEST(CallIndirect_canonical) { 2712 WASM_EXEC_TEST_WITH_TRAP(CallIndirect_canonical) {
2713 TestSignatures sigs; 2713 TestSignatures sigs;
2714 TestingModule module(execution_mode); 2714 TestingModule module(execution_mode);
2715 2715
2716 WasmFunctionCompiler t1(sigs.i_ii(), &module); 2716 WasmFunctionCompiler t1(sigs.i_ii(), &module);
2717 BUILD(t1, WASM_I32_ADD(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 2717 BUILD(t1, WASM_I32_ADD(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
2718 t1.CompileAndAdd(/*sig_index*/ 0); 2718 t1.CompileAndAdd(/*sig_index*/ 0);
2719 2719
2720 WasmFunctionCompiler t2(sigs.i_ii(), &module); 2720 WasmFunctionCompiler t2(sigs.i_ii(), &module);
2721 BUILD(t2, WASM_I32_SUB(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 2721 BUILD(t2, WASM_I32_SUB(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
2722 t2.CompileAndAdd(/*sig_index*/ 1); 2722 t2.CompileAndAdd(/*sig_index*/ 1);
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
2844 BUILD(r, WASM_F64_MAX(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 2844 BUILD(r, WASM_F64_MAX(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
2845 2845
2846 FOR_FLOAT64_INPUTS(i) { 2846 FOR_FLOAT64_INPUTS(i) {
2847 FOR_FLOAT64_INPUTS(j) { 2847 FOR_FLOAT64_INPUTS(j) {
2848 double result = r.Call(*i, *j); 2848 double result = r.Call(*i, *j);
2849 CHECK_DOUBLE_EQ(JSMax(*i, *j), result); 2849 CHECK_DOUBLE_EQ(JSMax(*i, *j), result);
2850 } 2850 }
2851 } 2851 }
2852 } 2852 }
2853 2853
2854 WASM_EXEC_TEST(I32SConvertF32) { 2854 WASM_EXEC_TEST_WITH_TRAP(I32SConvertF32) {
2855 WasmRunner<int32_t> r(execution_mode, MachineType::Float32()); 2855 WasmRunner<int32_t> r(execution_mode, MachineType::Float32());
2856 BUILD(r, WASM_I32_SCONVERT_F32(WASM_GET_LOCAL(0))); 2856 BUILD(r, WASM_I32_SCONVERT_F32(WASM_GET_LOCAL(0)));
2857 2857
2858 // The upper bound is (INT32_MAX + 1), which is the lowest float-representable 2858 // The upper bound is (INT32_MAX + 1), which is the lowest float-representable
2859 // number above INT32_MAX which cannot be represented as int32. 2859 // number above INT32_MAX which cannot be represented as int32.
2860 float upper_bound = 2147483648.0f; 2860 float upper_bound = 2147483648.0f;
2861 // We use INT32_MIN as a lower bound because (INT32_MIN - 1) is not 2861 // We use INT32_MIN as a lower bound because (INT32_MIN - 1) is not
2862 // representable as float, and no number between (INT32_MIN - 1) and INT32_MIN 2862 // representable as float, and no number between (INT32_MIN - 1) and INT32_MIN
2863 // is. 2863 // is.
2864 float lower_bound = static_cast<float>(INT32_MIN); 2864 float lower_bound = static_cast<float>(INT32_MIN);
2865 FOR_FLOAT32_INPUTS(i) { 2865 FOR_FLOAT32_INPUTS(i) {
2866 if (*i < upper_bound && *i >= lower_bound) { 2866 if (*i < upper_bound && *i >= lower_bound) {
2867 CHECK_EQ(static_cast<int32_t>(*i), r.Call(*i)); 2867 CHECK_EQ(static_cast<int32_t>(*i), r.Call(*i));
2868 } else { 2868 } else {
2869 CHECK_TRAP32(r.Call(*i)); 2869 CHECK_TRAP32(r.Call(*i));
2870 } 2870 }
2871 } 2871 }
2872 } 2872 }
2873 2873
2874 WASM_EXEC_TEST(I32SConvertF64) { 2874 WASM_EXEC_TEST_WITH_TRAP(I32SConvertF64) {
2875 WasmRunner<int32_t> r(execution_mode, MachineType::Float64()); 2875 WasmRunner<int32_t> r(execution_mode, MachineType::Float64());
2876 BUILD(r, WASM_I32_SCONVERT_F64(WASM_GET_LOCAL(0))); 2876 BUILD(r, WASM_I32_SCONVERT_F64(WASM_GET_LOCAL(0)));
2877 2877
2878 // The upper bound is (INT32_MAX + 1), which is the lowest double- 2878 // The upper bound is (INT32_MAX + 1), which is the lowest double-
2879 // representable number above INT32_MAX which cannot be represented as int32. 2879 // representable number above INT32_MAX which cannot be represented as int32.
2880 double upper_bound = 2147483648.0; 2880 double upper_bound = 2147483648.0;
2881 // The lower bound is (INT32_MIN - 1), which is the greatest double- 2881 // The lower bound is (INT32_MIN - 1), which is the greatest double-
2882 // representable number below INT32_MIN which cannot be represented as int32. 2882 // representable number below INT32_MIN which cannot be represented as int32.
2883 double lower_bound = -2147483649.0; 2883 double lower_bound = -2147483649.0;
2884 FOR_FLOAT64_INPUTS(i) { 2884 FOR_FLOAT64_INPUTS(i) {
2885 if (*i<upper_bound&& * i> lower_bound) { 2885 if (*i<upper_bound&& * i> lower_bound) {
2886 CHECK_EQ(static_cast<int32_t>(*i), r.Call(*i)); 2886 CHECK_EQ(static_cast<int32_t>(*i), r.Call(*i));
2887 } else { 2887 } else {
2888 CHECK_TRAP32(r.Call(*i)); 2888 CHECK_TRAP32(r.Call(*i));
2889 } 2889 }
2890 } 2890 }
2891 } 2891 }
2892 2892
2893 WASM_EXEC_TEST(I32UConvertF32) { 2893 WASM_EXEC_TEST_WITH_TRAP(I32UConvertF32) {
2894 WasmRunner<uint32_t> r(execution_mode, MachineType::Float32()); 2894 WasmRunner<uint32_t> r(execution_mode, MachineType::Float32());
2895 BUILD(r, WASM_I32_UCONVERT_F32(WASM_GET_LOCAL(0))); 2895 BUILD(r, WASM_I32_UCONVERT_F32(WASM_GET_LOCAL(0)));
2896 // The upper bound is (UINT32_MAX + 1), which is the lowest 2896 // The upper bound is (UINT32_MAX + 1), which is the lowest
2897 // float-representable number above UINT32_MAX which cannot be represented as 2897 // float-representable number above UINT32_MAX which cannot be represented as
2898 // uint32. 2898 // uint32.
2899 double upper_bound = 4294967296.0f; 2899 double upper_bound = 4294967296.0f;
2900 double lower_bound = -1.0f; 2900 double lower_bound = -1.0f;
2901 FOR_FLOAT32_INPUTS(i) { 2901 FOR_FLOAT32_INPUTS(i) {
2902 if (*i<upper_bound&& * i> lower_bound) { 2902 if (*i<upper_bound&& * i> lower_bound) {
2903 CHECK_EQ(static_cast<uint32_t>(*i), r.Call(*i)); 2903 CHECK_EQ(static_cast<uint32_t>(*i), r.Call(*i));
2904 } else { 2904 } else {
2905 CHECK_TRAP32(r.Call(*i)); 2905 CHECK_TRAP32(r.Call(*i));
2906 } 2906 }
2907 } 2907 }
2908 } 2908 }
2909 2909
2910 WASM_EXEC_TEST(I32UConvertF64) { 2910 WASM_EXEC_TEST_WITH_TRAP(I32UConvertF64) {
2911 WasmRunner<uint32_t> r(execution_mode, MachineType::Float64()); 2911 WasmRunner<uint32_t> r(execution_mode, MachineType::Float64());
2912 BUILD(r, WASM_I32_UCONVERT_F64(WASM_GET_LOCAL(0))); 2912 BUILD(r, WASM_I32_UCONVERT_F64(WASM_GET_LOCAL(0)));
2913 // The upper bound is (UINT32_MAX + 1), which is the lowest 2913 // The upper bound is (UINT32_MAX + 1), which is the lowest
2914 // double-representable number above UINT32_MAX which cannot be represented as 2914 // double-representable number above UINT32_MAX which cannot be represented as
2915 // uint32. 2915 // uint32.
2916 double upper_bound = 4294967296.0; 2916 double upper_bound = 4294967296.0;
2917 double lower_bound = -1.0; 2917 double lower_bound = -1.0;
2918 FOR_FLOAT64_INPUTS(i) { 2918 FOR_FLOAT64_INPUTS(i) {
2919 if (*i<upper_bound&& * i> lower_bound) { 2919 if (*i<upper_bound&& * i> lower_bound) {
2920 CHECK_EQ(static_cast<uint32_t>(*i), r.Call(*i)); 2920 CHECK_EQ(static_cast<uint32_t>(*i), r.Call(*i));
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
2972 t.Compile(); 2972 t.Compile();
2973 } 2973 }
2974 } 2974 }
2975 2975
2976 TEST(Compile_Wasm_CallIndirect_Many_i32) { CompileCallIndirectMany(kAstI32); } 2976 TEST(Compile_Wasm_CallIndirect_Many_i32) { CompileCallIndirectMany(kAstI32); }
2977 2977
2978 TEST(Compile_Wasm_CallIndirect_Many_f32) { CompileCallIndirectMany(kAstF32); } 2978 TEST(Compile_Wasm_CallIndirect_Many_f32) { CompileCallIndirectMany(kAstF32); }
2979 2979
2980 TEST(Compile_Wasm_CallIndirect_Many_f64) { CompileCallIndirectMany(kAstF64); } 2980 TEST(Compile_Wasm_CallIndirect_Many_f64) { CompileCallIndirectMany(kAstF64); }
2981 2981
2982 WASM_EXEC_TEST(Int32RemS_dead) { 2982 WASM_EXEC_TEST_WITH_TRAP(Int32RemS_dead) {
2983 WasmRunner<int32_t> r(execution_mode, MachineType::Int32(), 2983 WasmRunner<int32_t> r(execution_mode, MachineType::Int32(),
2984 MachineType::Int32()); 2984 MachineType::Int32());
2985 BUILD(r, WASM_I32_REMS(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)), WASM_DROP, 2985 BUILD(r, WASM_I32_REMS(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)), WASM_DROP,
2986 WASM_ZERO); 2986 WASM_ZERO);
2987 const int32_t kMin = std::numeric_limits<int32_t>::min(); 2987 const int32_t kMin = std::numeric_limits<int32_t>::min();
2988 CHECK_EQ(0, r.Call(133, 100)); 2988 CHECK_EQ(0, r.Call(133, 100));
2989 CHECK_EQ(0, r.Call(kMin, -1)); 2989 CHECK_EQ(0, r.Call(kMin, -1));
2990 CHECK_EQ(0, r.Call(0, 1)); 2990 CHECK_EQ(0, r.Call(0, 1));
2991 CHECK_TRAP(r.Call(100, 0)); 2991 CHECK_TRAP(r.Call(100, 0));
2992 CHECK_TRAP(r.Call(-1001, 0)); 2992 CHECK_TRAP(r.Call(-1001, 0));
2993 CHECK_TRAP(r.Call(kMin, 0)); 2993 CHECK_TRAP(r.Call(kMin, 0));
2994 } 2994 }
OLDNEW
« no previous file with comments | « src/wasm/wasm-opcodes.cc ('k') | test/cctest/wasm/test-run-wasm-64.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698