| OLD | NEW |
| 1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "test/unittests/test-utils.h" | 5 #include "test/unittests/test-utils.h" |
| 6 | 6 |
| 7 #include "src/v8.h" | 7 #include "src/v8.h" |
| 8 | 8 |
| 9 #include "test/cctest/wasm/test-signatures.h" | 9 #include "test/cctest/wasm/test-signatures.h" |
| 10 | 10 |
| (...skipping 451 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 462 | 462 |
| 463 TEST_F(AstDecoderTest, Block5) { | 463 TEST_F(AstDecoderTest, Block5) { |
| 464 EXPECT_VERIFIES_INLINE(sigs.v_i(), B1(WASM_GET_LOCAL(0))); | 464 EXPECT_VERIFIES_INLINE(sigs.v_i(), B1(WASM_GET_LOCAL(0))); |
| 465 | 465 |
| 466 EXPECT_VERIFIES_INLINE(sigs.v_i(), B2(WASM_GET_LOCAL(0), WASM_GET_LOCAL(0))); | 466 EXPECT_VERIFIES_INLINE(sigs.v_i(), B2(WASM_GET_LOCAL(0), WASM_GET_LOCAL(0))); |
| 467 | 467 |
| 468 EXPECT_VERIFIES_INLINE( | 468 EXPECT_VERIFIES_INLINE( |
| 469 sigs.v_i(), B3(WASM_GET_LOCAL(0), WASM_GET_LOCAL(0), WASM_GET_LOCAL(0))); | 469 sigs.v_i(), B3(WASM_GET_LOCAL(0), WASM_GET_LOCAL(0), WASM_GET_LOCAL(0))); |
| 470 | 470 |
| 471 EXPECT_VERIFIES_INLINE(sigs.v_i(), | 471 EXPECT_VERIFIES_INLINE(sigs.v_i(), |
| 472 WASM_BLOCK(4, WASM_GET_LOCAL(0), WASM_GET_LOCAL(0), | 472 WASM_BLOCK(WASM_GET_LOCAL(0), WASM_GET_LOCAL(0), |
| 473 WASM_GET_LOCAL(0), WASM_GET_LOCAL(0))); | 473 WASM_GET_LOCAL(0), WASM_GET_LOCAL(0))); |
| 474 | 474 |
| 475 EXPECT_VERIFIES_INLINE( | 475 EXPECT_VERIFIES_INLINE( |
| 476 sigs.v_i(), | 476 sigs.v_i(), |
| 477 WASM_BLOCK(5, WASM_GET_LOCAL(0), WASM_GET_LOCAL(0), WASM_GET_LOCAL(0), | 477 WASM_BLOCK(WASM_GET_LOCAL(0), WASM_GET_LOCAL(0), WASM_GET_LOCAL(0), |
| 478 WASM_GET_LOCAL(0), WASM_GET_LOCAL(0))); | 478 WASM_GET_LOCAL(0), WASM_GET_LOCAL(0))); |
| 479 } | 479 } |
| 480 | 480 |
| 481 TEST_F(AstDecoderTest, BlockF32) { | 481 TEST_F(AstDecoderTest, BlockF32) { |
| 482 static const byte code[] = {kExprBlock, kExprF32Const, 0, 0, 0, 0, kExprEnd}; | 482 static const byte code[] = {kExprBlock, kExprF32Const, 0, 0, 0, 0, kExprEnd}; |
| 483 EXPECT_VERIFIES(sigs.f_ff(), code); | 483 EXPECT_VERIFIES(sigs.f_ff(), code); |
| 484 EXPECT_FAILURE(sigs.i_i(), code); | 484 EXPECT_FAILURE(sigs.i_i(), code); |
| 485 EXPECT_FAILURE(sigs.d_dd(), code); | 485 EXPECT_FAILURE(sigs.d_dd(), code); |
| 486 } | 486 } |
| 487 | 487 |
| (...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 676 sigs.v_i(), WASM_IF_ELSE(WASM_GET_LOCAL(0), WASM_SET_LOCAL(0, WASM_ZERO), | 676 sigs.v_i(), WASM_IF_ELSE(WASM_GET_LOCAL(0), WASM_SET_LOCAL(0, WASM_ZERO), |
| 677 WASM_SET_LOCAL(0, WASM_I8(1)))); | 677 WASM_SET_LOCAL(0, WASM_I8(1)))); |
| 678 } | 678 } |
| 679 | 679 |
| 680 TEST_F(AstDecoderTest, Loop0) { | 680 TEST_F(AstDecoderTest, Loop0) { |
| 681 static const byte code[] = {kExprLoop, kExprEnd}; | 681 static const byte code[] = {kExprLoop, kExprEnd}; |
| 682 EXPECT_VERIFIES(sigs.v_v(), code); | 682 EXPECT_VERIFIES(sigs.v_v(), code); |
| 683 } | 683 } |
| 684 | 684 |
| 685 TEST_F(AstDecoderTest, Loop1) { | 685 TEST_F(AstDecoderTest, Loop1) { |
| 686 static const byte code[] = {WASM_LOOP(1, WASM_SET_LOCAL(0, WASM_ZERO))}; | 686 static const byte code[] = {WASM_LOOP(WASM_SET_LOCAL(0, WASM_ZERO))}; |
| 687 EXPECT_VERIFIES(sigs.v_i(), code); | 687 EXPECT_VERIFIES(sigs.v_i(), code); |
| 688 EXPECT_FAILURE(sigs.v_v(), code); | 688 EXPECT_FAILURE(sigs.v_v(), code); |
| 689 EXPECT_FAILURE(sigs.f_ff(), code); | 689 EXPECT_FAILURE(sigs.f_ff(), code); |
| 690 } | 690 } |
| 691 | 691 |
| 692 TEST_F(AstDecoderTest, Loop2) { | 692 TEST_F(AstDecoderTest, Loop2) { |
| 693 EXPECT_VERIFIES_INLINE(sigs.v_i(), WASM_LOOP(2, WASM_SET_LOCAL(0, WASM_ZERO), | 693 EXPECT_VERIFIES_INLINE(sigs.v_i(), WASM_LOOP(WASM_SET_LOCAL(0, WASM_ZERO), |
| 694 WASM_SET_LOCAL(0, WASM_ZERO))); | 694 WASM_SET_LOCAL(0, WASM_ZERO))); |
| 695 } | 695 } |
| 696 | 696 |
| 697 TEST_F(AstDecoderTest, Loop1_continue) { | 697 TEST_F(AstDecoderTest, Loop1_continue) { |
| 698 EXPECT_VERIFIES_INLINE(sigs.v_v(), WASM_LOOP(1, WASM_BR(0))); | 698 EXPECT_VERIFIES_INLINE(sigs.v_v(), WASM_LOOP(WASM_BR(0))); |
| 699 } | 699 } |
| 700 | 700 |
| 701 TEST_F(AstDecoderTest, Loop1_break) { | 701 TEST_F(AstDecoderTest, Loop1_break) { |
| 702 EXPECT_VERIFIES_INLINE(sigs.v_v(), WASM_LOOP(1, WASM_BR(1))); | 702 EXPECT_VERIFIES_INLINE(sigs.v_v(), WASM_LOOP(WASM_BR(1))); |
| 703 } | 703 } |
| 704 | 704 |
| 705 TEST_F(AstDecoderTest, Loop2_continue) { | 705 TEST_F(AstDecoderTest, Loop2_continue) { |
| 706 EXPECT_VERIFIES_INLINE( | 706 EXPECT_VERIFIES_INLINE(sigs.v_i(), |
| 707 sigs.v_i(), WASM_LOOP(2, WASM_SET_LOCAL(0, WASM_ZERO), WASM_BR(0))); | 707 WASM_LOOP(WASM_SET_LOCAL(0, WASM_ZERO), WASM_BR(0))); |
| 708 } | 708 } |
| 709 | 709 |
| 710 TEST_F(AstDecoderTest, Loop2_break) { | 710 TEST_F(AstDecoderTest, Loop2_break) { |
| 711 EXPECT_VERIFIES_INLINE( | 711 EXPECT_VERIFIES_INLINE(sigs.v_i(), |
| 712 sigs.v_i(), WASM_LOOP(2, WASM_SET_LOCAL(0, WASM_ZERO), WASM_BR(1))); | 712 WASM_LOOP(WASM_SET_LOCAL(0, WASM_ZERO), WASM_BR(1))); |
| 713 } | 713 } |
| 714 | 714 |
| 715 TEST_F(AstDecoderTest, ExprLoop0) { | 715 TEST_F(AstDecoderTest, ExprLoop0) { |
| 716 static const byte code[] = {kExprLoop, kExprEnd}; | 716 static const byte code[] = {kExprLoop, kExprEnd}; |
| 717 EXPECT_VERIFIES(sigs.v_v(), code); | 717 EXPECT_VERIFIES(sigs.v_v(), code); |
| 718 } | 718 } |
| 719 | 719 |
| 720 TEST_F(AstDecoderTest, ExprLoop1a) { | 720 TEST_F(AstDecoderTest, ExprLoop1a) { |
| 721 EXPECT_VERIFIES_INLINE(sigs.i_i(), WASM_LOOP(1, WASM_BRV(0, WASM_ZERO))); | 721 EXPECT_VERIFIES_INLINE(sigs.i_i(), WASM_LOOP(WASM_BRV(0, WASM_ZERO))); |
| 722 } | 722 } |
| 723 | 723 |
| 724 TEST_F(AstDecoderTest, ExprLoop1b) { | 724 TEST_F(AstDecoderTest, ExprLoop1b) { |
| 725 EXPECT_VERIFIES_INLINE(sigs.i_i(), WASM_LOOP(1, WASM_BRV(1, WASM_ZERO))); | 725 EXPECT_VERIFIES_INLINE(sigs.i_i(), WASM_LOOP(WASM_BRV(1, WASM_ZERO))); |
| 726 EXPECT_FAILURE_INLINE(sigs.f_ff(), WASM_LOOP(1, WASM_BRV(1, WASM_ZERO))); | 726 EXPECT_FAILURE_INLINE(sigs.f_ff(), WASM_LOOP(WASM_BRV(1, WASM_ZERO))); |
| 727 } | 727 } |
| 728 | 728 |
| 729 TEST_F(AstDecoderTest, ExprLoop2_unreachable) { | 729 TEST_F(AstDecoderTest, ExprLoop2_unreachable) { |
| 730 EXPECT_VERIFIES_INLINE(sigs.i_i(), WASM_LOOP(2, WASM_BR(0), WASM_NOP)); | 730 EXPECT_VERIFIES_INLINE(sigs.i_i(), WASM_LOOP(WASM_BR(0), WASM_NOP)); |
| 731 } | 731 } |
| 732 | 732 |
| 733 TEST_F(AstDecoderTest, ReturnVoid1) { | 733 TEST_F(AstDecoderTest, ReturnVoid1) { |
| 734 static const byte code[] = {kExprNop}; | 734 static const byte code[] = {kExprNop}; |
| 735 EXPECT_VERIFIES(sigs.v_v(), code); | 735 EXPECT_VERIFIES(sigs.v_v(), code); |
| 736 EXPECT_FAILURE(sigs.i_i(), code); | 736 EXPECT_FAILURE(sigs.i_i(), code); |
| 737 EXPECT_FAILURE(sigs.i_f(), code); | 737 EXPECT_FAILURE(sigs.i_f(), code); |
| 738 } | 738 } |
| 739 | 739 |
| 740 TEST_F(AstDecoderTest, ReturnVoid2) { | 740 TEST_F(AstDecoderTest, ReturnVoid2) { |
| (...skipping 11 matching lines...) Expand all Loading... |
| 752 EXPECT_VERIFIES_INLINE(sigs.v_v(), kExprF64Const, 0, 0, 0, 0, 0, 0, 0, 0); | 752 EXPECT_VERIFIES_INLINE(sigs.v_v(), kExprF64Const, 0, 0, 0, 0, 0, 0, 0, 0); |
| 753 | 753 |
| 754 EXPECT_VERIFIES_INLINE(sigs.v_i(), kExprGetLocal, 0); | 754 EXPECT_VERIFIES_INLINE(sigs.v_i(), kExprGetLocal, 0); |
| 755 } | 755 } |
| 756 | 756 |
| 757 TEST_F(AstDecoderTest, Unreachable1) { | 757 TEST_F(AstDecoderTest, Unreachable1) { |
| 758 EXPECT_VERIFIES_INLINE(sigs.v_v(), kExprUnreachable); | 758 EXPECT_VERIFIES_INLINE(sigs.v_v(), kExprUnreachable); |
| 759 EXPECT_VERIFIES_INLINE(sigs.v_v(), kExprUnreachable, kExprUnreachable); | 759 EXPECT_VERIFIES_INLINE(sigs.v_v(), kExprUnreachable, kExprUnreachable); |
| 760 EXPECT_VERIFIES_INLINE(sigs.v_v(), B2(WASM_UNREACHABLE, WASM_ZERO)); | 760 EXPECT_VERIFIES_INLINE(sigs.v_v(), B2(WASM_UNREACHABLE, WASM_ZERO)); |
| 761 EXPECT_VERIFIES_INLINE(sigs.v_v(), B2(WASM_BR(0), WASM_ZERO)); | 761 EXPECT_VERIFIES_INLINE(sigs.v_v(), B2(WASM_BR(0), WASM_ZERO)); |
| 762 EXPECT_VERIFIES_INLINE(sigs.v_v(), WASM_LOOP(2, WASM_UNREACHABLE, WASM_ZERO)); | 762 EXPECT_VERIFIES_INLINE(sigs.v_v(), WASM_LOOP(WASM_UNREACHABLE, WASM_ZERO)); |
| 763 EXPECT_VERIFIES_INLINE(sigs.v_v(), WASM_LOOP(2, WASM_BR(0), WASM_ZERO)); | 763 EXPECT_VERIFIES_INLINE(sigs.v_v(), WASM_LOOP(WASM_BR(0), WASM_ZERO)); |
| 764 } | 764 } |
| 765 | 765 |
| 766 TEST_F(AstDecoderTest, Unreachable_binop) { | 766 TEST_F(AstDecoderTest, Unreachable_binop) { |
| 767 EXPECT_VERIFIES_INLINE(sigs.i_i(), WASM_I32_AND(WASM_ZERO, WASM_UNREACHABLE)); | 767 EXPECT_VERIFIES_INLINE(sigs.i_i(), WASM_I32_AND(WASM_ZERO, WASM_UNREACHABLE)); |
| 768 EXPECT_VERIFIES_INLINE(sigs.i_i(), WASM_I32_AND(WASM_UNREACHABLE, WASM_ZERO)); | 768 EXPECT_VERIFIES_INLINE(sigs.i_i(), WASM_I32_AND(WASM_UNREACHABLE, WASM_ZERO)); |
| 769 } | 769 } |
| 770 | 770 |
| 771 TEST_F(AstDecoderTest, Unreachable_select) { | 771 TEST_F(AstDecoderTest, Unreachable_select) { |
| 772 EXPECT_VERIFIES_INLINE(sigs.i_i(), | 772 EXPECT_VERIFIES_INLINE(sigs.i_i(), |
| 773 WASM_SELECT(WASM_UNREACHABLE, WASM_ZERO, WASM_ZERO)); | 773 WASM_SELECT(WASM_UNREACHABLE, WASM_ZERO, WASM_ZERO)); |
| (...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 907 TestUnop(kExprF32ConvertF64, kAstF32, kAstF64); | 907 TestUnop(kExprF32ConvertF64, kAstF32, kAstF64); |
| 908 } | 908 } |
| 909 | 909 |
| 910 TEST_F(AstDecoderTest, MacrosStmt) { | 910 TEST_F(AstDecoderTest, MacrosStmt) { |
| 911 VERIFY(WASM_SET_LOCAL(0, WASM_I32V_3(87348))); | 911 VERIFY(WASM_SET_LOCAL(0, WASM_I32V_3(87348))); |
| 912 VERIFY(WASM_STORE_MEM(MachineType::Int32(), WASM_I8(24), WASM_I8(40))); | 912 VERIFY(WASM_STORE_MEM(MachineType::Int32(), WASM_I8(24), WASM_I8(40))); |
| 913 VERIFY(WASM_IF(WASM_GET_LOCAL(0), WASM_NOP)); | 913 VERIFY(WASM_IF(WASM_GET_LOCAL(0), WASM_NOP)); |
| 914 VERIFY(WASM_IF_ELSE(WASM_GET_LOCAL(0), WASM_NOP, WASM_NOP)); | 914 VERIFY(WASM_IF_ELSE(WASM_GET_LOCAL(0), WASM_NOP, WASM_NOP)); |
| 915 VERIFY(WASM_NOP); | 915 VERIFY(WASM_NOP); |
| 916 VERIFY(B1(WASM_NOP)); | 916 VERIFY(B1(WASM_NOP)); |
| 917 VERIFY(WASM_LOOP(1, WASM_NOP)); | 917 VERIFY(WASM_LOOP(WASM_NOP)); |
| 918 VERIFY(WASM_LOOP(1, WASM_BREAK(0))); | 918 VERIFY(WASM_LOOP(WASM_BREAK(0))); |
| 919 VERIFY(WASM_LOOP(1, WASM_CONTINUE(0))); | 919 VERIFY(WASM_LOOP(WASM_CONTINUE(0))); |
| 920 } | 920 } |
| 921 | 921 |
| 922 TEST_F(AstDecoderTest, MacrosBreak) { | 922 TEST_F(AstDecoderTest, MacrosBreak) { |
| 923 EXPECT_VERIFIES_INLINE(sigs.v_v(), WASM_LOOP(1, WASM_BREAK(0))); | 923 EXPECT_VERIFIES_INLINE(sigs.v_v(), WASM_LOOP(WASM_BREAK(0))); |
| 924 | 924 |
| 925 EXPECT_VERIFIES_INLINE(sigs.i_i(), WASM_LOOP(1, WASM_BREAKV(0, WASM_ZERO))); | 925 EXPECT_VERIFIES_INLINE(sigs.i_i(), WASM_LOOP(WASM_BREAKV(0, WASM_ZERO))); |
| 926 EXPECT_VERIFIES_INLINE(sigs.l_l(), | 926 EXPECT_VERIFIES_INLINE(sigs.l_l(), WASM_LOOP(WASM_BREAKV(0, WASM_I64V_1(0)))); |
| 927 WASM_LOOP(1, WASM_BREAKV(0, WASM_I64V_1(0)))); | 927 EXPECT_VERIFIES_INLINE(sigs.f_ff(), WASM_LOOP(WASM_BREAKV(0, WASM_F32(0.0)))); |
| 928 EXPECT_VERIFIES_INLINE(sigs.f_ff(), | 928 EXPECT_VERIFIES_INLINE(sigs.d_dd(), WASM_LOOP(WASM_BREAKV(0, WASM_F64(0.0)))); |
| 929 WASM_LOOP(1, WASM_BREAKV(0, WASM_F32(0.0)))); | |
| 930 EXPECT_VERIFIES_INLINE(sigs.d_dd(), | |
| 931 WASM_LOOP(1, WASM_BREAKV(0, WASM_F64(0.0)))); | |
| 932 } | 929 } |
| 933 | 930 |
| 934 TEST_F(AstDecoderTest, MacrosContinue) { | 931 TEST_F(AstDecoderTest, MacrosContinue) { |
| 935 EXPECT_VERIFIES_INLINE(sigs.v_v(), WASM_LOOP(1, WASM_CONTINUE(0))); | 932 EXPECT_VERIFIES_INLINE(sigs.v_v(), WASM_LOOP(WASM_CONTINUE(0))); |
| 936 } | 933 } |
| 937 | 934 |
| 938 TEST_F(AstDecoderTest, MacrosVariadic) { | 935 TEST_F(AstDecoderTest, MacrosVariadic) { |
| 939 VERIFY(B2(WASM_NOP, WASM_NOP)); | 936 VERIFY(B2(WASM_NOP, WASM_NOP)); |
| 940 VERIFY(B3(WASM_NOP, WASM_NOP, WASM_NOP)); | 937 VERIFY(B3(WASM_NOP, WASM_NOP, WASM_NOP)); |
| 941 VERIFY(WASM_LOOP(2, WASM_NOP, WASM_NOP)); | 938 VERIFY(WASM_LOOP(WASM_NOP, WASM_NOP)); |
| 942 VERIFY(WASM_LOOP(3, WASM_NOP, WASM_NOP, WASM_NOP)); | 939 VERIFY(WASM_LOOP(WASM_NOP, WASM_NOP, WASM_NOP)); |
| 943 } | 940 } |
| 944 | 941 |
| 945 TEST_F(AstDecoderTest, MacrosNestedBlocks) { | 942 TEST_F(AstDecoderTest, MacrosNestedBlocks) { |
| 946 VERIFY(B2(WASM_NOP, B2(WASM_NOP, WASM_NOP))); | 943 VERIFY(B2(WASM_NOP, B2(WASM_NOP, WASM_NOP))); |
| 947 VERIFY(B3(WASM_NOP, // -- | 944 VERIFY(B3(WASM_NOP, // -- |
| 948 B2(WASM_NOP, WASM_NOP), // -- | 945 B2(WASM_NOP, WASM_NOP), // -- |
| 949 B2(WASM_NOP, WASM_NOP))); // -- | 946 B2(WASM_NOP, WASM_NOP))); // -- |
| 950 VERIFY(B1(B1(B2(WASM_NOP, WASM_NOP)))); | 947 VERIFY(B1(B1(B2(WASM_NOP, WASM_NOP)))); |
| 951 } | 948 } |
| 952 | 949 |
| (...skipping 513 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1466 | 1463 |
| 1467 TEST_F(AstDecoderTest, BreakEnd) { | 1464 TEST_F(AstDecoderTest, BreakEnd) { |
| 1468 EXPECT_VERIFIES_INLINE(sigs.i_i(), | 1465 EXPECT_VERIFIES_INLINE(sigs.i_i(), |
| 1469 B1(WASM_I32_ADD(WASM_BRV(0, WASM_ZERO), WASM_ZERO))); | 1466 B1(WASM_I32_ADD(WASM_BRV(0, WASM_ZERO), WASM_ZERO))); |
| 1470 EXPECT_VERIFIES_INLINE(sigs.i_i(), | 1467 EXPECT_VERIFIES_INLINE(sigs.i_i(), |
| 1471 B1(WASM_I32_ADD(WASM_ZERO, WASM_BRV(0, WASM_ZERO)))); | 1468 B1(WASM_I32_ADD(WASM_ZERO, WASM_BRV(0, WASM_ZERO)))); |
| 1472 } | 1469 } |
| 1473 | 1470 |
| 1474 TEST_F(AstDecoderTest, BreakIfBinop) { | 1471 TEST_F(AstDecoderTest, BreakIfBinop) { |
| 1475 EXPECT_FAILURE_INLINE( | 1472 EXPECT_FAILURE_INLINE( |
| 1476 sigs.i_i(), | 1473 sigs.i_i(), WASM_BLOCK(WASM_I32_ADD(WASM_BRV_IF(0, WASM_ZERO, WASM_ZERO), |
| 1477 WASM_BLOCK( | 1474 WASM_ZERO))); |
| 1478 1, WASM_I32_ADD(WASM_BRV_IF(0, WASM_ZERO, WASM_ZERO), WASM_ZERO))); | 1475 EXPECT_FAILURE_INLINE(sigs.i_i(), |
| 1479 EXPECT_FAILURE_INLINE( | 1476 WASM_BLOCK(WASM_I32_ADD( |
| 1480 sigs.i_i(), | 1477 WASM_ZERO, WASM_BRV_IF(0, WASM_ZERO, WASM_ZERO)))); |
| 1481 WASM_BLOCK( | |
| 1482 1, WASM_I32_ADD(WASM_ZERO, WASM_BRV_IF(0, WASM_ZERO, WASM_ZERO)))); | |
| 1483 } | 1478 } |
| 1484 | 1479 |
| 1485 TEST_F(AstDecoderTest, BreakNesting1) { | 1480 TEST_F(AstDecoderTest, BreakNesting1) { |
| 1486 for (int i = 0; i < 5; i++) { | 1481 for (int i = 0; i < 5; i++) { |
| 1487 // (block[2] (loop[2] (if (get p) break[N]) (set p 1)) p) | 1482 // (block[2] (loop[2] (if (get p) break[N]) (set p 1)) p) |
| 1488 byte code[] = {WASM_BLOCK( | 1483 byte code[] = {WASM_BLOCK( |
| 1489 2, WASM_LOOP(2, WASM_IF(WASM_GET_LOCAL(0), WASM_BRV(i + 1, WASM_ZERO)), | 1484 WASM_LOOP(WASM_IF(WASM_GET_LOCAL(0), WASM_BRV(i + 1, WASM_ZERO)), |
| 1490 WASM_SET_LOCAL(0, WASM_I8(1))), | 1485 WASM_SET_LOCAL(0, WASM_I8(1))), |
| 1491 WASM_GET_LOCAL(0))}; | 1486 WASM_GET_LOCAL(0))}; |
| 1492 if (i < 3) { | 1487 if (i < 3) { |
| 1493 EXPECT_VERIFIES(sigs.i_i(), code); | 1488 EXPECT_VERIFIES(sigs.i_i(), code); |
| 1494 } else { | 1489 } else { |
| 1495 EXPECT_FAILURE(sigs.i_i(), code); | 1490 EXPECT_FAILURE(sigs.i_i(), code); |
| 1496 } | 1491 } |
| 1497 } | 1492 } |
| 1498 } | 1493 } |
| 1499 | 1494 |
| 1500 TEST_F(AstDecoderTest, BreakNesting2) { | 1495 TEST_F(AstDecoderTest, BreakNesting2) { |
| 1501 AddLocals(kAstI32, 1); | 1496 AddLocals(kAstI32, 1); |
| 1502 for (int i = 0; i < 5; i++) { | 1497 for (int i = 0; i < 5; i++) { |
| 1503 // (block[2] (loop[2] (if 0 break[N]) (set p 1)) (return p)) (11) | 1498 // (block[2] (loop[2] (if 0 break[N]) (set p 1)) (return p)) (11) |
| 1504 byte code[] = {B1(WASM_LOOP(2, WASM_IF(WASM_ZERO, WASM_BREAK(i + 1)), | 1499 byte code[] = {B1(WASM_LOOP(WASM_IF(WASM_ZERO, WASM_BREAK(i + 1)), |
| 1505 WASM_SET_LOCAL(0, WASM_I8(1)))), | 1500 WASM_SET_LOCAL(0, WASM_I8(1)))), |
| 1506 WASM_I8(11)}; | 1501 WASM_I8(11)}; |
| 1507 if (i < 2) { | 1502 if (i < 2) { |
| 1508 EXPECT_VERIFIES(sigs.v_v(), code); | 1503 EXPECT_VERIFIES(sigs.v_v(), code); |
| 1509 } else { | 1504 } else { |
| 1510 EXPECT_FAILURE(sigs.v_v(), code); | 1505 EXPECT_FAILURE(sigs.v_v(), code); |
| 1511 } | 1506 } |
| 1512 } | 1507 } |
| 1513 } | 1508 } |
| 1514 | 1509 |
| 1515 TEST_F(AstDecoderTest, BreakNesting3) { | 1510 TEST_F(AstDecoderTest, BreakNesting3) { |
| 1516 for (int i = 0; i < 5; i++) { | 1511 for (int i = 0; i < 5; i++) { |
| 1517 // (block[1] (loop[1] (block[1] (if 0 break[N]) | 1512 // (block[1] (loop[1] (block[1] (if 0 break[N]) |
| 1518 byte code[] = { | 1513 byte code[] = { |
| 1519 WASM_BLOCK(1, WASM_LOOP(1, B1(WASM_IF(WASM_ZERO, WASM_BREAK(i + 1)))))}; | 1514 WASM_BLOCK(WASM_LOOP(B1(WASM_IF(WASM_ZERO, WASM_BREAK(i + 1)))))}; |
| 1520 if (i < 3) { | 1515 if (i < 3) { |
| 1521 EXPECT_VERIFIES(sigs.v_v(), code); | 1516 EXPECT_VERIFIES(sigs.v_v(), code); |
| 1522 } else { | 1517 } else { |
| 1523 EXPECT_FAILURE(sigs.v_v(), code); | 1518 EXPECT_FAILURE(sigs.v_v(), code); |
| 1524 } | 1519 } |
| 1525 } | 1520 } |
| 1526 } | 1521 } |
| 1527 | 1522 |
| 1528 TEST_F(AstDecoderTest, BreaksWithMultipleTypes) { | 1523 TEST_F(AstDecoderTest, BreaksWithMultipleTypes) { |
| 1529 EXPECT_FAILURE_INLINE(sigs.i_i(), | 1524 EXPECT_FAILURE_INLINE(sigs.i_i(), |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1590 sigs.i_i(), | 1585 sigs.i_i(), |
| 1591 B2(WASM_IF(WASM_ZERO, WASM_BRV(0, WASM_ZERO)), WASM_F32(1.2))); | 1586 B2(WASM_IF(WASM_ZERO, WASM_BRV(0, WASM_ZERO)), WASM_F32(1.2))); |
| 1592 | 1587 |
| 1593 // unify f64 and f64 => OK | 1588 // unify f64 and f64 => OK |
| 1594 EXPECT_VERIFIES_INLINE( | 1589 EXPECT_VERIFIES_INLINE( |
| 1595 sigs.d_dd(), | 1590 sigs.d_dd(), |
| 1596 B2(WASM_IF(WASM_ZERO, WASM_BRV(0, WASM_GET_LOCAL(0))), WASM_F64(1.2))); | 1591 B2(WASM_IF(WASM_ZERO, WASM_BRV(0, WASM_GET_LOCAL(0))), WASM_F64(1.2))); |
| 1597 } | 1592 } |
| 1598 | 1593 |
| 1599 TEST_F(AstDecoderTest, ExprBreak_TypeCheckAll) { | 1594 TEST_F(AstDecoderTest, ExprBreak_TypeCheckAll) { |
| 1600 byte code1[] = {WASM_BLOCK(2, | 1595 byte code1[] = {WASM_BLOCK(WASM_IF(WASM_ZERO, WASM_BRV(0, WASM_GET_LOCAL(0))), |
| 1601 WASM_IF(WASM_ZERO, WASM_BRV(0, WASM_GET_LOCAL(0))), | |
| 1602 WASM_GET_LOCAL(1))}; | 1596 WASM_GET_LOCAL(1))}; |
| 1603 byte code2[] = {B2(WASM_IF(WASM_ZERO, WASM_BRV_IF_ZERO(0, WASM_GET_LOCAL(0))), | 1597 byte code2[] = {B2(WASM_IF(WASM_ZERO, WASM_BRV_IF_ZERO(0, WASM_GET_LOCAL(0))), |
| 1604 WASM_GET_LOCAL(1))}; | 1598 WASM_GET_LOCAL(1))}; |
| 1605 | 1599 |
| 1606 for (size_t i = 0; i < arraysize(kLocalTypes); i++) { | 1600 for (size_t i = 0; i < arraysize(kLocalTypes); i++) { |
| 1607 for (size_t j = 0; j < arraysize(kLocalTypes); j++) { | 1601 for (size_t j = 0; j < arraysize(kLocalTypes); j++) { |
| 1608 LocalType storage[] = {kLocalTypes[i], kLocalTypes[i], kLocalTypes[j]}; | 1602 LocalType storage[] = {kLocalTypes[i], kLocalTypes[i], kLocalTypes[j]}; |
| 1609 FunctionSig sig(1, 2, storage); | 1603 FunctionSig sig(1, 2, storage); |
| 1610 | 1604 |
| 1611 if (i == j) { | 1605 if (i == j) { |
| (...skipping 10 matching lines...) Expand all Loading... |
| 1622 TEST_F(AstDecoderTest, ExprBr_Unify) { | 1616 TEST_F(AstDecoderTest, ExprBr_Unify) { |
| 1623 for (int which = 0; which < 2; which++) { | 1617 for (int which = 0; which < 2; which++) { |
| 1624 for (size_t i = 0; i < arraysize(kLocalTypes); i++) { | 1618 for (size_t i = 0; i < arraysize(kLocalTypes); i++) { |
| 1625 LocalType type = kLocalTypes[i]; | 1619 LocalType type = kLocalTypes[i]; |
| 1626 LocalType storage[] = {kAstI32, kAstI32, type}; | 1620 LocalType storage[] = {kAstI32, kAstI32, type}; |
| 1627 FunctionSig sig(1, 2, storage); | 1621 FunctionSig sig(1, 2, storage); |
| 1628 | 1622 |
| 1629 byte code1[] = {B2(WASM_IF(WASM_ZERO, WASM_BRV(1, WASM_GET_LOCAL(which))), | 1623 byte code1[] = {B2(WASM_IF(WASM_ZERO, WASM_BRV(1, WASM_GET_LOCAL(which))), |
| 1630 WASM_GET_LOCAL(which ^ 1))}; | 1624 WASM_GET_LOCAL(which ^ 1))}; |
| 1631 byte code2[] = { | 1625 byte code2[] = { |
| 1632 WASM_LOOP(2, WASM_IF(WASM_ZERO, WASM_BRV(2, WASM_GET_LOCAL(which))), | 1626 WASM_LOOP(WASM_IF(WASM_ZERO, WASM_BRV(2, WASM_GET_LOCAL(which))), |
| 1633 WASM_GET_LOCAL(which ^ 1))}; | 1627 WASM_GET_LOCAL(which ^ 1))}; |
| 1634 | 1628 |
| 1635 if (type == kAstI32) { | 1629 if (type == kAstI32) { |
| 1636 EXPECT_VERIFIES(&sig, code1); | 1630 EXPECT_VERIFIES(&sig, code1); |
| 1637 EXPECT_VERIFIES(&sig, code2); | 1631 EXPECT_VERIFIES(&sig, code2); |
| 1638 } else { | 1632 } else { |
| 1639 EXPECT_FAILURE(&sig, code1); | 1633 EXPECT_FAILURE(&sig, code1); |
| 1640 EXPECT_FAILURE(&sig, code2); | 1634 EXPECT_FAILURE(&sig, code2); |
| 1641 } | 1635 } |
| 1642 } | 1636 } |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1679 | 1673 |
| 1680 TEST_F(AstDecoderTest, ExprBrIf_Unify) { | 1674 TEST_F(AstDecoderTest, ExprBrIf_Unify) { |
| 1681 for (int which = 0; which < 2; which++) { | 1675 for (int which = 0; which < 2; which++) { |
| 1682 for (size_t i = 0; i < arraysize(kLocalTypes); i++) { | 1676 for (size_t i = 0; i < arraysize(kLocalTypes); i++) { |
| 1683 LocalType type = kLocalTypes[i]; | 1677 LocalType type = kLocalTypes[i]; |
| 1684 LocalType storage[] = {kAstI32, kAstI32, type}; | 1678 LocalType storage[] = {kAstI32, kAstI32, type}; |
| 1685 FunctionSig sig(1, 2, storage); | 1679 FunctionSig sig(1, 2, storage); |
| 1686 | 1680 |
| 1687 byte code1[] = {B2(WASM_BRV_IF_ZERO(0, WASM_GET_LOCAL(which)), | 1681 byte code1[] = {B2(WASM_BRV_IF_ZERO(0, WASM_GET_LOCAL(which)), |
| 1688 WASM_GET_LOCAL(which ^ 1))}; | 1682 WASM_GET_LOCAL(which ^ 1))}; |
| 1689 byte code2[] = {WASM_LOOP(2, WASM_BRV_IF_ZERO(1, WASM_GET_LOCAL(which)), | 1683 byte code2[] = {WASM_LOOP(WASM_BRV_IF_ZERO(1, WASM_GET_LOCAL(which)), |
| 1690 WASM_GET_LOCAL(which ^ 1))}; | 1684 WASM_GET_LOCAL(which ^ 1))}; |
| 1691 | 1685 |
| 1692 if (type == kAstI32) { | 1686 if (type == kAstI32) { |
| 1693 EXPECT_VERIFIES(&sig, code1); | 1687 EXPECT_VERIFIES(&sig, code1); |
| 1694 EXPECT_VERIFIES(&sig, code2); | 1688 EXPECT_VERIFIES(&sig, code2); |
| 1695 } else { | 1689 } else { |
| 1696 EXPECT_FAILURE(&sig, code1); | 1690 EXPECT_FAILURE(&sig, code1); |
| 1697 EXPECT_FAILURE(&sig, code2); | 1691 EXPECT_FAILURE(&sig, code2); |
| 1698 } | 1692 } |
| 1699 } | 1693 } |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1731 } | 1725 } |
| 1732 | 1726 |
| 1733 TEST_F(AstDecoderTest, BrTable2a) { | 1727 TEST_F(AstDecoderTest, BrTable2a) { |
| 1734 static byte code[] = { | 1728 static byte code[] = { |
| 1735 B1(WASM_BR_TABLE(WASM_I8(67), 1, BR_TARGET(0), BR_TARGET(0)))}; | 1729 B1(WASM_BR_TABLE(WASM_I8(67), 1, BR_TARGET(0), BR_TARGET(0)))}; |
| 1736 EXPECT_VERIFIES(sigs.v_v(), code); | 1730 EXPECT_VERIFIES(sigs.v_v(), code); |
| 1737 } | 1731 } |
| 1738 | 1732 |
| 1739 TEST_F(AstDecoderTest, BrTable2b) { | 1733 TEST_F(AstDecoderTest, BrTable2b) { |
| 1740 static byte code[] = {WASM_BLOCK( | 1734 static byte code[] = {WASM_BLOCK( |
| 1741 1, WASM_BLOCK( | 1735 WASM_BLOCK(WASM_BR_TABLE(WASM_I8(67), 1, BR_TARGET(0), BR_TARGET(1))))}; |
| 1742 1, WASM_BR_TABLE(WASM_I8(67), 1, BR_TARGET(0), BR_TARGET(1))))}; | |
| 1743 EXPECT_VERIFIES(sigs.v_v(), code); | 1736 EXPECT_VERIFIES(sigs.v_v(), code); |
| 1744 } | 1737 } |
| 1745 | 1738 |
| 1746 TEST_F(AstDecoderTest, BrTable_off_end) { | 1739 TEST_F(AstDecoderTest, BrTable_off_end) { |
| 1747 static byte code[] = {B1(WASM_BR_TABLE(WASM_GET_LOCAL(0), 0, BR_TARGET(0)))}; | 1740 static byte code[] = {B1(WASM_BR_TABLE(WASM_GET_LOCAL(0), 0, BR_TARGET(0)))}; |
| 1748 for (size_t len = 1; len < sizeof(code); len++) { | 1741 for (size_t len = 1; len < sizeof(code); len++) { |
| 1749 Verify(kError, sigs.i_i(), code, code + len); | 1742 Verify(kError, sigs.i_i(), code, code + len); |
| 1750 } | 1743 } |
| 1751 } | 1744 } |
| 1752 | 1745 |
| 1753 TEST_F(AstDecoderTest, BrTable_invalid_br1) { | 1746 TEST_F(AstDecoderTest, BrTable_invalid_br1) { |
| 1754 for (int depth = 0; depth < 4; depth++) { | 1747 for (int depth = 0; depth < 4; depth++) { |
| 1755 byte code[] = {B1(WASM_BR_TABLE(WASM_GET_LOCAL(0), 0, BR_TARGET(depth)))}; | 1748 byte code[] = {B1(WASM_BR_TABLE(WASM_GET_LOCAL(0), 0, BR_TARGET(depth)))}; |
| 1756 if (depth == 0) { | 1749 if (depth == 0) { |
| 1757 EXPECT_VERIFIES(sigs.v_i(), code); | 1750 EXPECT_VERIFIES(sigs.v_i(), code); |
| 1758 } else { | 1751 } else { |
| 1759 EXPECT_FAILURE(sigs.v_i(), code); | 1752 EXPECT_FAILURE(sigs.v_i(), code); |
| 1760 } | 1753 } |
| 1761 } | 1754 } |
| 1762 } | 1755 } |
| 1763 | 1756 |
| 1764 TEST_F(AstDecoderTest, BrTable_invalid_br2) { | 1757 TEST_F(AstDecoderTest, BrTable_invalid_br2) { |
| 1765 for (int depth = 0; depth < 4; depth++) { | 1758 for (int depth = 0; depth < 4; depth++) { |
| 1766 byte code[] = { | 1759 byte code[] = { |
| 1767 WASM_LOOP(1, WASM_BR_TABLE(WASM_GET_LOCAL(0), 0, BR_TARGET(depth)))}; | 1760 WASM_LOOP(WASM_BR_TABLE(WASM_GET_LOCAL(0), 0, BR_TARGET(depth)))}; |
| 1768 if (depth <= 1) { | 1761 if (depth <= 1) { |
| 1769 EXPECT_VERIFIES(sigs.v_i(), code); | 1762 EXPECT_VERIFIES(sigs.v_i(), code); |
| 1770 } else { | 1763 } else { |
| 1771 EXPECT_FAILURE(sigs.v_i(), code); | 1764 EXPECT_FAILURE(sigs.v_i(), code); |
| 1772 } | 1765 } |
| 1773 } | 1766 } |
| 1774 } | 1767 } |
| 1775 | 1768 |
| 1776 TEST_F(AstDecoderTest, ExprBreakNesting1) { | 1769 TEST_F(AstDecoderTest, ExprBreakNesting1) { |
| 1777 EXPECT_VERIFIES_INLINE(sigs.v_v(), B1(WASM_BRV(0, WASM_ZERO))); | 1770 EXPECT_VERIFIES_INLINE(sigs.v_v(), B1(WASM_BRV(0, WASM_ZERO))); |
| 1778 EXPECT_VERIFIES_INLINE(sigs.v_v(), B1(WASM_BR(0))); | 1771 EXPECT_VERIFIES_INLINE(sigs.v_v(), B1(WASM_BR(0))); |
| 1779 EXPECT_VERIFIES_INLINE(sigs.v_v(), B1(WASM_BRV_IF(0, WASM_ZERO, WASM_ZERO))); | 1772 EXPECT_VERIFIES_INLINE(sigs.v_v(), B1(WASM_BRV_IF(0, WASM_ZERO, WASM_ZERO))); |
| 1780 EXPECT_VERIFIES_INLINE(sigs.v_v(), B1(WASM_BR_IF(0, WASM_ZERO))); | 1773 EXPECT_VERIFIES_INLINE(sigs.v_v(), B1(WASM_BR_IF(0, WASM_ZERO))); |
| 1781 | 1774 |
| 1782 EXPECT_VERIFIES_INLINE(sigs.v_v(), WASM_LOOP(1, WASM_BRV(0, WASM_ZERO))); | 1775 EXPECT_VERIFIES_INLINE(sigs.v_v(), WASM_LOOP(WASM_BRV(0, WASM_ZERO))); |
| 1783 EXPECT_VERIFIES_INLINE(sigs.v_v(), WASM_LOOP(1, WASM_BR(0))); | 1776 EXPECT_VERIFIES_INLINE(sigs.v_v(), WASM_LOOP(WASM_BR(0))); |
| 1784 EXPECT_VERIFIES_INLINE(sigs.v_v(), | 1777 EXPECT_VERIFIES_INLINE(sigs.v_v(), |
| 1785 WASM_LOOP(1, WASM_BRV_IF(0, WASM_ZERO, WASM_ZERO))); | 1778 WASM_LOOP(WASM_BRV_IF(0, WASM_ZERO, WASM_ZERO))); |
| 1786 EXPECT_VERIFIES_INLINE(sigs.v_v(), WASM_LOOP(1, WASM_BR_IF(0, WASM_ZERO))); | 1779 EXPECT_VERIFIES_INLINE(sigs.v_v(), WASM_LOOP(WASM_BR_IF(0, WASM_ZERO))); |
| 1787 | 1780 |
| 1788 EXPECT_VERIFIES_INLINE(sigs.v_v(), WASM_LOOP(1, WASM_BRV(1, WASM_ZERO))); | 1781 EXPECT_VERIFIES_INLINE(sigs.v_v(), WASM_LOOP(WASM_BRV(1, WASM_ZERO))); |
| 1789 EXPECT_VERIFIES_INLINE(sigs.v_v(), WASM_LOOP(1, WASM_BR(1))); | 1782 EXPECT_VERIFIES_INLINE(sigs.v_v(), WASM_LOOP(WASM_BR(1))); |
| 1790 } | 1783 } |
| 1791 | 1784 |
| 1792 TEST_F(AstDecoderTest, Select) { | 1785 TEST_F(AstDecoderTest, Select) { |
| 1793 EXPECT_VERIFIES_INLINE( | 1786 EXPECT_VERIFIES_INLINE( |
| 1794 sigs.i_i(), WASM_SELECT(WASM_GET_LOCAL(0), WASM_GET_LOCAL(0), WASM_ZERO)); | 1787 sigs.i_i(), WASM_SELECT(WASM_GET_LOCAL(0), WASM_GET_LOCAL(0), WASM_ZERO)); |
| 1795 EXPECT_VERIFIES_INLINE(sigs.f_ff(), | 1788 EXPECT_VERIFIES_INLINE(sigs.f_ff(), |
| 1796 WASM_SELECT(WASM_F32(0.0), WASM_F32(0.0), WASM_ZERO)); | 1789 WASM_SELECT(WASM_F32(0.0), WASM_F32(0.0), WASM_ZERO)); |
| 1797 EXPECT_VERIFIES_INLINE(sigs.d_dd(), | 1790 EXPECT_VERIFIES_INLINE(sigs.d_dd(), |
| 1798 WASM_SELECT(WASM_F64(0.0), WASM_F64(0.0), WASM_ZERO)); | 1791 WASM_SELECT(WASM_F64(0.0), WASM_F64(0.0), WASM_ZERO)); |
| 1799 EXPECT_VERIFIES_INLINE( | 1792 EXPECT_VERIFIES_INLINE( |
| (...skipping 687 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2487 iter.next(); | 2480 iter.next(); |
| 2488 EXPECT_TRUE(iter.has_next()); | 2481 EXPECT_TRUE(iter.has_next()); |
| 2489 EXPECT_EQ(kExprI8Const, iter.current()); | 2482 EXPECT_EQ(kExprI8Const, iter.current()); |
| 2490 iter.next(); | 2483 iter.next(); |
| 2491 EXPECT_FALSE(iter.has_next()); | 2484 EXPECT_FALSE(iter.has_next()); |
| 2492 } | 2485 } |
| 2493 | 2486 |
| 2494 } // namespace wasm | 2487 } // namespace wasm |
| 2495 } // namespace internal | 2488 } // namespace internal |
| 2496 } // namespace v8 | 2489 } // namespace v8 |
| OLD | NEW |