Chromium Code Reviews| 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 <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/wasm/wasm-macro-gen.h" | 9 #include "src/wasm/wasm-macro-gen.h" |
| 10 | 10 |
| 11 #include "test/cctest/cctest.h" | 11 #include "test/cctest/cctest.h" |
| 12 #include "test/cctest/compiler/value-helper.h" | 12 #include "test/cctest/compiler/value-helper.h" |
| 13 #include "test/cctest/wasm/test-signatures.h" | 13 #include "test/cctest/wasm/test-signatures.h" |
| 14 #include "test/cctest/wasm/wasm-run-utils.h" | 14 #include "test/cctest/wasm/wasm-run-utils.h" |
| 15 | 15 |
| 16 using namespace v8::base; | 16 using namespace v8::base; |
| 17 using namespace v8::internal; | 17 using namespace v8::internal; |
| 18 using namespace v8::internal::compiler; | 18 using namespace v8::internal::compiler; |
| 19 using namespace v8::internal::wasm; | 19 using namespace v8::internal::wasm; |
| 20 | 20 |
| 21 // for even shorter tests. | |
| 22 #define B2(a, b) kExprBlock, 2, a, b | |
|
binji
2016/03/04 00:04:17
imagine if we could package an argument in the opc
| |
| 23 #define B1(a) kExprBlock, 1, a | |
| 24 #define RET(x) kExprReturn, x | |
| 25 #define RET_I8(x) kExprReturn, kExprI8Const, x | |
| 26 | |
| 21 TEST(Run_WasmInt8Const) { | 27 TEST(Run_WasmInt8Const) { |
| 22 WasmRunner<int32_t> r; | 28 WasmRunner<int32_t> r; |
| 23 const byte kExpectedValue = 121; | 29 const byte kExpectedValue = 121; |
| 24 // return(kExpectedValue) | 30 // return(kExpectedValue) |
| 25 BUILD(r, WASM_I8(kExpectedValue)); | 31 BUILD(r, WASM_I8(kExpectedValue)); |
| 26 CHECK_EQ(kExpectedValue, r.Call()); | 32 CHECK_EQ(kExpectedValue, r.Call()); |
| 27 } | 33 } |
| 28 | 34 |
| 29 | 35 |
| 30 TEST(Run_WasmInt8Const_fallthru1) { | 36 TEST(Run_WasmInt8Const_fallthru1) { |
| (...skipping 830 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 861 BUILD(r, WASM_IF_ELSE(WASM_ZERO, // -- | 867 BUILD(r, WASM_IF_ELSE(WASM_ZERO, // -- |
| 862 WASM_UNREACHABLE, // -- | 868 WASM_UNREACHABLE, // -- |
| 863 WASM_I8(27))); // -- | 869 WASM_I8(27))); // -- |
| 864 CHECK_EQ(27, r.Call()); | 870 CHECK_EQ(27, r.Call()); |
| 865 } | 871 } |
| 866 | 872 |
| 867 | 873 |
| 868 TEST(Run_Wasm_Return12) { | 874 TEST(Run_Wasm_Return12) { |
| 869 WasmRunner<int32_t> r; | 875 WasmRunner<int32_t> r; |
| 870 | 876 |
| 871 BUILD(r, WASM_RETURN(WASM_I8(12))); | 877 BUILD(r, RET_I8(12)); |
| 872 CHECK_EQ(12, r.Call()); | 878 CHECK_EQ(12, r.Call()); |
| 873 } | 879 } |
| 874 | 880 |
| 875 | 881 |
| 876 TEST(Run_Wasm_Return17) { | 882 TEST(Run_Wasm_Return17) { |
| 877 WasmRunner<int32_t> r; | 883 WasmRunner<int32_t> r; |
| 878 | 884 |
| 879 BUILD(r, WASM_BLOCK(1, WASM_RETURN(WASM_I8(17)))); | 885 BUILD(r, B1(RET_I8(17))); |
| 880 CHECK_EQ(17, r.Call()); | 886 CHECK_EQ(17, r.Call()); |
| 881 } | 887 } |
| 882 | 888 |
| 883 | 889 |
| 884 TEST(Run_Wasm_Return_I32) { | 890 TEST(Run_Wasm_Return_I32) { |
| 885 WasmRunner<int32_t> r(MachineType::Int32()); | 891 WasmRunner<int32_t> r(MachineType::Int32()); |
| 886 | 892 |
| 887 BUILD(r, WASM_RETURN(WASM_GET_LOCAL(0))); | 893 BUILD(r, RET(WASM_GET_LOCAL(0))); |
| 888 | 894 |
| 889 FOR_INT32_INPUTS(i) { CHECK_EQ(*i, r.Call(*i)); } | 895 FOR_INT32_INPUTS(i) { CHECK_EQ(*i, r.Call(*i)); } |
| 890 } | 896 } |
| 891 | 897 |
| 892 | 898 |
| 893 #if WASM_64 | 899 #if WASM_64 |
| 894 TEST(Run_Wasm_Return_I64) { | 900 TEST(Run_Wasm_Return_I64) { |
| 895 WasmRunner<int64_t> r(MachineType::Int64()); | 901 WasmRunner<int64_t> r(MachineType::Int64()); |
| 896 | 902 |
| 897 BUILD(r, WASM_RETURN(WASM_GET_LOCAL(0))); | 903 BUILD(r, RET(WASM_GET_LOCAL(0))); |
| 898 | 904 |
| 899 FOR_INT64_INPUTS(i) { CHECK_EQ(*i, r.Call(*i)); } | 905 FOR_INT64_INPUTS(i) { CHECK_EQ(*i, r.Call(*i)); } |
| 900 } | 906 } |
| 901 #endif | 907 #endif |
| 902 | 908 |
| 903 | 909 |
| 904 TEST(Run_Wasm_Return_F32) { | 910 TEST(Run_Wasm_Return_F32) { |
| 905 WasmRunner<float> r(MachineType::Float32()); | 911 WasmRunner<float> r(MachineType::Float32()); |
| 906 | 912 |
| 907 BUILD(r, WASM_RETURN(WASM_GET_LOCAL(0))); | 913 BUILD(r, RET(WASM_GET_LOCAL(0))); |
| 908 | 914 |
| 909 FOR_FLOAT32_INPUTS(i) { | 915 FOR_FLOAT32_INPUTS(i) { |
| 910 float expect = *i; | 916 float expect = *i; |
| 911 float result = r.Call(expect); | 917 float result = r.Call(expect); |
| 912 if (std::isnan(expect)) { | 918 if (std::isnan(expect)) { |
| 913 CHECK(std::isnan(result)); | 919 CHECK(std::isnan(result)); |
| 914 } else { | 920 } else { |
| 915 CHECK_EQ(expect, result); | 921 CHECK_EQ(expect, result); |
| 916 } | 922 } |
| 917 } | 923 } |
| 918 } | 924 } |
| 919 | 925 |
| 920 | 926 |
| 921 TEST(Run_Wasm_Return_F64) { | 927 TEST(Run_Wasm_Return_F64) { |
| 922 WasmRunner<double> r(MachineType::Float64()); | 928 WasmRunner<double> r(MachineType::Float64()); |
| 923 | 929 |
| 924 BUILD(r, WASM_RETURN(WASM_GET_LOCAL(0))); | 930 BUILD(r, RET(WASM_GET_LOCAL(0))); |
| 925 | 931 |
| 926 FOR_FLOAT64_INPUTS(i) { | 932 FOR_FLOAT64_INPUTS(i) { |
| 927 double expect = *i; | 933 double expect = *i; |
| 928 double result = r.Call(expect); | 934 double result = r.Call(expect); |
| 929 if (std::isnan(expect)) { | 935 if (std::isnan(expect)) { |
| 930 CHECK(std::isnan(result)); | 936 CHECK(std::isnan(result)); |
| 931 } else { | 937 } else { |
| 932 CHECK_EQ(expect, result); | 938 CHECK_EQ(expect, result); |
| 933 } | 939 } |
| 934 } | 940 } |
| 935 } | 941 } |
| 936 | 942 |
| 937 | 943 |
| 938 TEST(Run_Wasm_Select) { | 944 TEST(Run_Wasm_Select) { |
| 939 WasmRunner<int32_t> r(MachineType::Int32()); | 945 WasmRunner<int32_t> r(MachineType::Int32()); |
| 940 // return select(11, 22, a); | 946 // return select(11, 22, a); |
| 941 BUILD(r, WASM_SELECT(WASM_I8(11), WASM_I8(22), WASM_GET_LOCAL(0))); | 947 BUILD(r, WASM_SELECT(WASM_I8(11), WASM_I8(22), WASM_GET_LOCAL(0))); |
| 942 FOR_INT32_INPUTS(i) { | 948 FOR_INT32_INPUTS(i) { |
| 943 int32_t expected = *i ? 11 : 22; | 949 int32_t expected = *i ? 11 : 22; |
| 944 CHECK_EQ(expected, r.Call(*i)); | 950 CHECK_EQ(expected, r.Call(*i)); |
| 945 } | 951 } |
| 946 } | 952 } |
| 947 | 953 |
| 948 | 954 |
| 949 TEST(Run_Wasm_Select_strict1) { | 955 TEST(Run_Wasm_Select_strict1) { |
| 950 WasmRunner<int32_t> r(MachineType::Int32()); | 956 WasmRunner<int32_t> r(MachineType::Int32()); |
| 951 // select(a=0, a=1, a=2); return a | 957 // select(a=0, a=1, a=2); return a |
| 952 BUILD(r, WASM_BLOCK(2, WASM_SELECT(WASM_SET_LOCAL(0, WASM_I8(0)), | 958 BUILD(r, B2(WASM_SELECT(WASM_SET_LOCAL(0, WASM_I8(0)), |
| 953 WASM_SET_LOCAL(0, WASM_I8(1)), | 959 WASM_SET_LOCAL(0, WASM_I8(1)), |
| 954 WASM_SET_LOCAL(0, WASM_I8(2))), | 960 WASM_SET_LOCAL(0, WASM_I8(2))), |
| 955 WASM_GET_LOCAL(0))); | 961 WASM_GET_LOCAL(0))); |
| 956 FOR_INT32_INPUTS(i) { CHECK_EQ(2, r.Call(*i)); } | 962 FOR_INT32_INPUTS(i) { CHECK_EQ(2, r.Call(*i)); } |
| 957 } | 963 } |
| 958 | 964 |
| 959 | 965 |
| 960 TEST(Run_Wasm_Select_strict2) { | 966 TEST(Run_Wasm_Select_strict2) { |
| 961 WasmRunner<int32_t> r(MachineType::Int32()); | 967 WasmRunner<int32_t> r(MachineType::Int32()); |
| 962 r.env()->AddLocals(kAstI32, 2); | 968 r.env()->AddLocals(kAstI32, 2); |
| 963 // select(b=5, c=6, a) | 969 // select(b=5, c=6, a) |
| 964 BUILD(r, WASM_SELECT(WASM_SET_LOCAL(1, WASM_I8(5)), | 970 BUILD(r, WASM_SELECT(WASM_SET_LOCAL(1, WASM_I8(5)), |
| 965 WASM_SET_LOCAL(2, WASM_I8(6)), WASM_GET_LOCAL(0))); | 971 WASM_SET_LOCAL(2, WASM_I8(6)), WASM_GET_LOCAL(0))); |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 978 WASM_SET_LOCAL(0, WASM_GET_LOCAL(1)))); | 984 WASM_SET_LOCAL(0, WASM_GET_LOCAL(1)))); |
| 979 FOR_INT32_INPUTS(i) { | 985 FOR_INT32_INPUTS(i) { |
| 980 int32_t expected = 5; | 986 int32_t expected = 5; |
| 981 CHECK_EQ(expected, r.Call(*i)); | 987 CHECK_EQ(expected, r.Call(*i)); |
| 982 } | 988 } |
| 983 } | 989 } |
| 984 | 990 |
| 985 | 991 |
| 986 TEST(Run_Wasm_BrIf_strict) { | 992 TEST(Run_Wasm_BrIf_strict) { |
| 987 WasmRunner<int32_t> r(MachineType::Int32()); | 993 WasmRunner<int32_t> r(MachineType::Int32()); |
| 988 BUILD(r, WASM_BLOCK( | 994 BUILD( |
| 989 2, WASM_BLOCK(1, WASM_BRV_IF(0, WASM_GET_LOCAL(0), | 995 r, |
| 990 WASM_SET_LOCAL(0, WASM_I8(99)))), | 996 B2(B1(WASM_BRV_IF(0, WASM_GET_LOCAL(0), WASM_SET_LOCAL(0, WASM_I8(99)))), |
| 991 WASM_GET_LOCAL(0))); | 997 WASM_GET_LOCAL(0))); |
| 992 | 998 |
| 993 FOR_INT32_INPUTS(i) { CHECK_EQ(99, r.Call(*i)); } | 999 FOR_INT32_INPUTS(i) { CHECK_EQ(99, r.Call(*i)); } |
| 994 } | 1000 } |
| 995 | 1001 |
| 996 TEST(Run_Wasm_TableSwitch0a) { | 1002 TEST(Run_Wasm_BrTable0a) { |
| 997 WasmRunner<int32_t> r(MachineType::Int32()); | 1003 WasmRunner<int32_t> r(MachineType::Int32()); |
| 998 BUILD(r, WASM_BLOCK(2, WASM_TABLESWITCH_OP(0, 1, WASM_CASE_BR(0)), | 1004 BUILD(r, |
| 999 WASM_TABLESWITCH_BODY0(WASM_GET_LOCAL(0)), WASM_I8(91))); | 1005 B2(B1(WASM_BR_TABLE(WASM_GET_LOCAL(0), 1, BR_TARGET(0))), WASM_I8(91))); |
| 1000 FOR_INT32_INPUTS(i) { CHECK_EQ(91, r.Call(*i)); } | 1006 FOR_INT32_INPUTS(i) { CHECK_EQ(91, r.Call(*i)); } |
| 1001 } | 1007 } |
| 1002 | 1008 |
| 1003 TEST(Run_Wasm_TableSwitch0b) { | 1009 TEST(Run_Wasm_BrTable0b) { |
| 1004 WasmRunner<int32_t> r(MachineType::Int32()); | 1010 WasmRunner<int32_t> r(MachineType::Int32()); |
| 1005 BUILD(r, WASM_BLOCK( | 1011 BUILD(r, |
| 1006 2, WASM_TABLESWITCH_OP(0, 2, WASM_CASE_BR(0), WASM_CASE_BR(0)), | 1012 B2(B1(WASM_BR_TABLE(WASM_GET_LOCAL(0), 2, BR_TARGET(0), BR_TARGET(0))), |
| 1007 WASM_TABLESWITCH_BODY0(WASM_GET_LOCAL(0)), WASM_I8(92))); | 1013 WASM_I8(92))); |
| 1008 FOR_INT32_INPUTS(i) { CHECK_EQ(92, r.Call(*i)); } | 1014 FOR_INT32_INPUTS(i) { CHECK_EQ(92, r.Call(*i)); } |
| 1009 } | 1015 } |
| 1010 | 1016 |
| 1011 TEST(Run_Wasm_TableSwitch0c) { | 1017 TEST(Run_Wasm_BrTable0c) { |
| 1012 WasmRunner<int32_t> r(MachineType::Int32()); | 1018 WasmRunner<int32_t> r(MachineType::Int32()); |
| 1013 BUILD(r, | 1019 BUILD( |
| 1014 WASM_BLOCK(2, WASM_BLOCK(2, WASM_TABLESWITCH_OP(0, 2, WASM_CASE_BR(0), | 1020 r, |
| 1015 WASM_CASE_BR(1)), | 1021 B2(B2(B1(WASM_BR_TABLE(WASM_GET_LOCAL(0), 2, BR_TARGET(0), BR_TARGET(1))), |
| 1016 WASM_TABLESWITCH_BODY0(WASM_GET_LOCAL(0)), | 1022 RET_I8(76)), |
| 1017 WASM_RETURN(WASM_I8(76))), | 1023 WASM_I8(77))); |
| 1018 WASM_I8(77))); | |
| 1019 FOR_INT32_INPUTS(i) { | 1024 FOR_INT32_INPUTS(i) { |
| 1020 int32_t expected = *i == 0 ? 76 : 77; | 1025 int32_t expected = *i == 0 ? 76 : 77; |
| 1021 CHECK_EQ(expected, r.Call(*i)); | 1026 CHECK_EQ(expected, r.Call(*i)); |
| 1022 } | 1027 } |
| 1023 } | 1028 } |
| 1024 | 1029 |
| 1025 TEST(Run_Wasm_TableSwitch1) { | 1030 TEST(Run_Wasm_BrTable1) { |
| 1026 WasmRunner<int32_t> r(MachineType::Int32()); | 1031 WasmRunner<int32_t> r(MachineType::Int32()); |
| 1027 BUILD(r, WASM_TABLESWITCH_OP(1, 1, WASM_CASE(0)), | 1032 BUILD(r, B1(WASM_BR_TABLE(WASM_GET_LOCAL(0), 1, BR_TARGET(0))), RET_I8(93)); |
| 1028 WASM_TABLESWITCH_BODY(WASM_GET_LOCAL(0), WASM_RETURN(WASM_I8(93)))); | |
| 1029 FOR_INT32_INPUTS(i) { CHECK_EQ(93, r.Call(*i)); } | 1033 FOR_INT32_INPUTS(i) { CHECK_EQ(93, r.Call(*i)); } |
| 1030 } | 1034 } |
| 1031 | 1035 |
| 1036 TEST(Run_Wasm_BrTable_loop) { | |
| 1037 WasmRunner<int32_t> r(MachineType::Int32()); | |
| 1038 BUILD(r, | |
| 1039 B2(WASM_LOOP(1, WASM_BR_TABLE(WASM_INC_LOCAL_BY(0, 1), 3, BR_TARGET(2), | |
| 1040 BR_TARGET(1), BR_TARGET(0))), | |
| 1041 RET_I8(99)), | |
| 1042 WASM_I8(98)); | |
| 1043 CHECK_EQ(99, r.Call(0)); | |
| 1044 CHECK_EQ(98, r.Call(-1)); | |
| 1045 CHECK_EQ(98, r.Call(-2)); | |
| 1046 CHECK_EQ(98, r.Call(-3)); | |
| 1047 CHECK_EQ(98, r.Call(-100)); | |
| 1048 } | |
| 1032 | 1049 |
| 1033 TEST(Run_Wasm_TableSwitch_br) { | 1050 TEST(Run_Wasm_BrTable_br) { |
| 1034 WasmRunner<int32_t> r(MachineType::Int32()); | 1051 WasmRunner<int32_t> r(MachineType::Int32()); |
| 1035 BUILD(r, WASM_TABLESWITCH_OP(1, 2, WASM_CASE_BR(0), WASM_CASE(0)), | 1052 BUILD(r, |
| 1036 WASM_TABLESWITCH_BODY(WASM_GET_LOCAL(0), WASM_RETURN(WASM_I8(91))), | 1053 B2(B1(WASM_BR_TABLE(WASM_GET_LOCAL(0), 2, BR_TARGET(1), BR_TARGET(0))), |
| 1054 RET_I8(91)), | |
| 1037 WASM_I8(99)); | 1055 WASM_I8(99)); |
| 1038 CHECK_EQ(99, r.Call(0)); | 1056 CHECK_EQ(99, r.Call(0)); |
| 1039 CHECK_EQ(91, r.Call(1)); | 1057 CHECK_EQ(91, r.Call(1)); |
| 1040 CHECK_EQ(91, r.Call(2)); | 1058 CHECK_EQ(91, r.Call(2)); |
| 1041 CHECK_EQ(91, r.Call(3)); | 1059 CHECK_EQ(91, r.Call(3)); |
| 1042 } | 1060 } |
| 1043 | 1061 |
| 1062 TEST(Run_Wasm_BrTable_br2) { | |
| 1063 WasmRunner<int32_t> r(MachineType::Int32()); | |
| 1044 | 1064 |
| 1045 TEST(Run_Wasm_TableSwitch_br2) { | 1065 BUILD(r, B2(B2(B2(B1(WASM_BR_TABLE(WASM_GET_LOCAL(0), 4, BR_TARGET(1), |
| 1046 WasmRunner<int32_t> r(MachineType::Int32()); | 1066 BR_TARGET(2), BR_TARGET(3), BR_TARGET(0))), |
| 1047 BUILD(r, WASM_BLOCK( | 1067 RET_I8(85)), |
| 1048 2, WASM_BLOCK(2, WASM_TABLESWITCH_OP( | 1068 RET_I8(86)), |
| 1049 1, 4, WASM_CASE_BR(0), WASM_CASE_BR(1), | 1069 RET_I8(87)), |
| 1050 WASM_CASE_BR(2), WASM_CASE(0)), | |
| 1051 WASM_TABLESWITCH_BODY(WASM_GET_LOCAL(0), | |
| 1052 WASM_RETURN(WASM_I8(85))), | |
| 1053 WASM_RETURN(WASM_I8(86))), | |
| 1054 WASM_RETURN(WASM_I8(87))), | |
| 1055 WASM_I8(88)); | 1070 WASM_I8(88)); |
| 1056 CHECK_EQ(86, r.Call(0)); | 1071 CHECK_EQ(86, r.Call(0)); |
| 1057 CHECK_EQ(87, r.Call(1)); | 1072 CHECK_EQ(87, r.Call(1)); |
| 1058 CHECK_EQ(88, r.Call(2)); | 1073 CHECK_EQ(88, r.Call(2)); |
| 1059 CHECK_EQ(85, r.Call(3)); | 1074 CHECK_EQ(85, r.Call(3)); |
| 1060 CHECK_EQ(85, r.Call(4)); | 1075 CHECK_EQ(85, r.Call(4)); |
| 1061 CHECK_EQ(85, r.Call(5)); | 1076 CHECK_EQ(85, r.Call(5)); |
| 1062 } | 1077 } |
| 1063 | 1078 |
| 1079 TEST(Run_Wasm_BrTable4) { | |
| 1080 for (int i = 0; i < 4; i++) { | |
| 1081 for (int t = 0; t < 4; t++) { | |
| 1082 uint16_t cases[] = {0, 1, 2, 3}; | |
| 1083 cases[i] = t; | |
| 1084 byte code[] = {B2(B2(B2(B2(B1(WASM_BR_TABLE( | |
| 1085 WASM_GET_LOCAL(0), 4, BR_TARGET(cases[0]), | |
| 1086 BR_TARGET(cases[1]), BR_TARGET(cases[2]), | |
| 1087 BR_TARGET(cases[3]))), | |
| 1088 RET_I8(70)), | |
| 1089 RET_I8(71)), | |
| 1090 RET_I8(72)), | |
| 1091 RET_I8(73)), | |
| 1092 WASM_I8(75)}; | |
| 1064 | 1093 |
| 1065 TEST(Run_Wasm_TableSwitch2) { | 1094 WasmRunner<int32_t> r(MachineType::Int32()); |
| 1066 WasmRunner<int32_t> r(MachineType::Int32()); | 1095 r.Build(code, code + arraysize(code)); |
| 1067 BUILD(r, WASM_TABLESWITCH_OP(2, 2, WASM_CASE(0), WASM_CASE(1)), | |
| 1068 WASM_TABLESWITCH_BODY(WASM_GET_LOCAL(0), WASM_RETURN(WASM_I8(91)), | |
| 1069 WASM_RETURN(WASM_I8(92)))); | |
| 1070 FOR_INT32_INPUTS(i) { | |
| 1071 int32_t expected = *i == 0 ? 91 : 92; | |
| 1072 CHECK_EQ(expected, r.Call(*i)); | |
| 1073 } | |
| 1074 } | |
| 1075 | 1096 |
| 1076 | 1097 for (int x = -3; x < 50; x++) { |
| 1077 TEST(Run_Wasm_TableSwitch2b) { | 1098 int index = (x > 3 || x < 0) ? 3 : x; |
| 1078 WasmRunner<int32_t> r(MachineType::Int32()); | 1099 int32_t expected = 70 + cases[index]; |
| 1079 BUILD(r, WASM_TABLESWITCH_OP(2, 2, WASM_CASE(1), WASM_CASE(0)), | 1100 CHECK_EQ(expected, r.Call(x)); |
| 1080 WASM_TABLESWITCH_BODY(WASM_GET_LOCAL(0), WASM_RETURN(WASM_I8(81)), | 1101 } |
| 1081 WASM_RETURN(WASM_I8(82)))); | |
| 1082 FOR_INT32_INPUTS(i) { | |
| 1083 int32_t expected = *i == 0 ? 82 : 81; | |
| 1084 CHECK_EQ(expected, r.Call(*i)); | |
| 1085 } | |
| 1086 } | |
| 1087 | |
| 1088 | |
| 1089 TEST(Run_Wasm_TableSwitch4) { | |
| 1090 for (int i = 0; i < 4; i++) { | |
| 1091 const uint16_t br = 0x8000u; | |
| 1092 uint16_t c = 0; | |
| 1093 uint16_t cases[] = {i == 0 ? br : c++, i == 1 ? br : c++, i == 2 ? br : c++, | |
| 1094 i == 3 ? br : c++}; | |
| 1095 byte code[] = { | |
| 1096 WASM_BLOCK(1, WASM_TABLESWITCH_OP( | |
| 1097 3, 4, WASM_CASE(cases[0]), WASM_CASE(cases[1]), | |
| 1098 WASM_CASE(cases[2]), WASM_CASE(cases[3])), | |
| 1099 WASM_TABLESWITCH_BODY( | |
| 1100 WASM_GET_LOCAL(0), WASM_RETURN(WASM_I8(71)), | |
| 1101 WASM_RETURN(WASM_I8(72)), WASM_RETURN(WASM_I8(73)))), | |
| 1102 WASM_RETURN(WASM_I8(74))}; | |
| 1103 | |
| 1104 WasmRunner<int32_t> r(MachineType::Int32()); | |
| 1105 r.Build(code, code + arraysize(code)); | |
| 1106 | |
| 1107 FOR_INT32_INPUTS(i) { | |
| 1108 int index = (*i < 0 || *i > 3) ? 3 : *i; | |
| 1109 int32_t expected = 71 + cases[index]; | |
| 1110 if (expected >= 0x8000) expected = 74; | |
| 1111 CHECK_EQ(expected, r.Call(*i)); | |
| 1112 } | 1102 } |
| 1113 } | 1103 } |
| 1114 } | 1104 } |
| 1115 | 1105 |
| 1106 TEST(Run_Wasm_BrTable4x4) { | |
| 1107 for (byte a = 0; a < 4; a++) { | |
| 1108 for (byte b = 0; b < 4; b++) { | |
| 1109 for (byte c = 0; c < 4; c++) { | |
| 1110 for (byte d = 0; d < 4; d++) { | |
| 1111 for (int i = 0; i < 4; i++) { | |
| 1112 uint16_t cases[] = {a, b, c, d}; | |
| 1113 byte code[] = { | |
| 1114 B2(B2(B2(B2(B1(WASM_BR_TABLE( | |
| 1115 WASM_GET_LOCAL(0), 4, BR_TARGET(cases[0]), | |
| 1116 BR_TARGET(cases[1]), BR_TARGET(cases[2]), | |
| 1117 BR_TARGET(cases[3]))), | |
| 1118 RET_I8(50)), | |
| 1119 RET_I8(51)), | |
| 1120 RET_I8(52)), | |
| 1121 RET_I8(53)), | |
| 1122 WASM_I8(55)}; | |
| 1116 | 1123 |
| 1117 TEST(Run_Wasm_TableSwitch4b) { | 1124 WasmRunner<int32_t> r(MachineType::Int32()); |
| 1118 for (int a = 0; a < 2; a++) { | 1125 r.Build(code, code + arraysize(code)); |
| 1119 for (int b = 0; b < 2; b++) { | |
| 1120 for (int c = 0; c < 2; c++) { | |
| 1121 for (int d = 0; d < 2; d++) { | |
| 1122 if (a + b + c + d == 0) continue; | |
| 1123 if (a + b + c + d == 4) continue; | |
| 1124 | 1126 |
| 1125 byte code[] = { | 1127 for (int x = -6; x < 47; x++) { |
| 1126 WASM_TABLESWITCH_OP(2, 4, WASM_CASE(a), WASM_CASE(b), | 1128 int index = (x > 3 || x < 0) ? 3 : x; |
| 1127 WASM_CASE(c), WASM_CASE(d)), | 1129 int32_t expected = 50 + cases[index]; |
| 1128 WASM_TABLESWITCH_BODY(WASM_GET_LOCAL(0), WASM_RETURN(WASM_I8(61)), | 1130 CHECK_EQ(expected, r.Call(x)); |
| 1129 WASM_RETURN(WASM_I8(62)))}; | 1131 } |
| 1130 | 1132 } |
| 1131 WasmRunner<int32_t> r(MachineType::Int32()); | |
| 1132 r.Build(code, code + arraysize(code)); | |
| 1133 | |
| 1134 CHECK_EQ(61 + a, r.Call(0)); | |
| 1135 CHECK_EQ(61 + b, r.Call(1)); | |
| 1136 CHECK_EQ(61 + c, r.Call(2)); | |
| 1137 CHECK_EQ(61 + d, r.Call(3)); | |
| 1138 CHECK_EQ(61 + d, r.Call(4)); | |
| 1139 } | 1133 } |
| 1140 } | 1134 } |
| 1141 } | 1135 } |
| 1142 } | 1136 } |
| 1143 } | 1137 } |
| 1144 | 1138 |
| 1145 | 1139 TEST(Run_Wasm_BrTable4_fallthru) { |
| 1146 TEST(Run_Wasm_TableSwitch4_fallthru) { | |
| 1147 byte code[] = { | 1140 byte code[] = { |
| 1148 WASM_TABLESWITCH_OP(4, 4, WASM_CASE(0), WASM_CASE(1), WASM_CASE(2), | 1141 B2(B2(B2(B2(B1(WASM_BR_TABLE(WASM_GET_LOCAL(0), 4, BR_TARGET(0), |
| 1149 WASM_CASE(3)), | 1142 BR_TARGET(1), BR_TARGET(2), BR_TARGET(3))), |
| 1150 WASM_TABLESWITCH_BODY(WASM_GET_LOCAL(0), WASM_INC_LOCAL_BY(1, 1), | 1143 WASM_INC_LOCAL_BY(1, 1)), |
| 1151 WASM_INC_LOCAL_BY(1, 2), WASM_INC_LOCAL_BY(1, 4), | 1144 WASM_INC_LOCAL_BY(1, 2)), |
| 1152 WASM_INC_LOCAL_BY(1, 8)), | 1145 WASM_INC_LOCAL_BY(1, 4)), |
| 1146 WASM_INC_LOCAL_BY(1, 8)), | |
| 1153 WASM_GET_LOCAL(1)}; | 1147 WASM_GET_LOCAL(1)}; |
| 1154 | 1148 |
| 1155 WasmRunner<int32_t> r(MachineType::Int32(), MachineType::Int32()); | 1149 WasmRunner<int32_t> r(MachineType::Int32(), MachineType::Int32()); |
| 1156 r.Build(code, code + arraysize(code)); | 1150 r.Build(code, code + arraysize(code)); |
| 1157 | 1151 |
| 1158 CHECK_EQ(15, r.Call(0, 0)); | 1152 CHECK_EQ(15, r.Call(0, 0)); |
| 1159 CHECK_EQ(14, r.Call(1, 0)); | 1153 CHECK_EQ(14, r.Call(1, 0)); |
| 1160 CHECK_EQ(12, r.Call(2, 0)); | 1154 CHECK_EQ(12, r.Call(2, 0)); |
| 1161 CHECK_EQ(8, r.Call(3, 0)); | 1155 CHECK_EQ(8, r.Call(3, 0)); |
| 1162 CHECK_EQ(8, r.Call(4, 0)); | 1156 CHECK_EQ(8, r.Call(4, 0)); |
| 1163 | 1157 |
| 1164 CHECK_EQ(115, r.Call(0, 100)); | 1158 CHECK_EQ(115, r.Call(0, 100)); |
| 1165 CHECK_EQ(114, r.Call(1, 100)); | 1159 CHECK_EQ(114, r.Call(1, 100)); |
| 1166 CHECK_EQ(112, r.Call(2, 100)); | 1160 CHECK_EQ(112, r.Call(2, 100)); |
| 1167 CHECK_EQ(108, r.Call(3, 100)); | 1161 CHECK_EQ(108, r.Call(3, 100)); |
| 1168 CHECK_EQ(108, r.Call(4, 100)); | 1162 CHECK_EQ(108, r.Call(4, 100)); |
| 1169 } | 1163 } |
| 1170 | 1164 |
| 1171 | |
| 1172 TEST(Run_Wasm_TableSwitch4_fallthru_br) { | |
| 1173 byte code[] = { | |
| 1174 WASM_TABLESWITCH_OP(4, 4, WASM_CASE(0), WASM_CASE(1), WASM_CASE(2), | |
| 1175 WASM_CASE(3)), | |
| 1176 WASM_TABLESWITCH_BODY(WASM_GET_LOCAL(0), WASM_INC_LOCAL_BY(1, 1), | |
| 1177 WASM_BRV(0, WASM_INC_LOCAL_BY(1, 2)), | |
| 1178 WASM_INC_LOCAL_BY(1, 4), | |
| 1179 WASM_BRV(0, WASM_INC_LOCAL_BY(1, 8))), | |
| 1180 WASM_GET_LOCAL(1)}; | |
| 1181 | |
| 1182 WasmRunner<int32_t> r(MachineType::Int32(), MachineType::Int32()); | |
| 1183 r.Build(code, code + arraysize(code)); | |
| 1184 | |
| 1185 CHECK_EQ(3, r.Call(0, 0)); | |
| 1186 CHECK_EQ(2, r.Call(1, 0)); | |
| 1187 CHECK_EQ(12, r.Call(2, 0)); | |
| 1188 CHECK_EQ(8, r.Call(3, 0)); | |
| 1189 CHECK_EQ(8, r.Call(4, 0)); | |
| 1190 | |
| 1191 CHECK_EQ(203, r.Call(0, 200)); | |
| 1192 CHECK_EQ(202, r.Call(1, 200)); | |
| 1193 CHECK_EQ(212, r.Call(2, 200)); | |
| 1194 CHECK_EQ(208, r.Call(3, 200)); | |
| 1195 CHECK_EQ(208, r.Call(4, 200)); | |
| 1196 } | |
| 1197 | |
| 1198 | |
| 1199 TEST(Run_Wasm_F32ReinterpretI32) { | 1165 TEST(Run_Wasm_F32ReinterpretI32) { |
| 1200 TestingModule module; | 1166 TestingModule module; |
| 1201 int32_t* memory = module.AddMemoryElems<int32_t>(8); | 1167 int32_t* memory = module.AddMemoryElems<int32_t>(8); |
| 1202 WasmRunner<int32_t> r(&module); | 1168 WasmRunner<int32_t> r(&module); |
| 1203 | 1169 |
| 1204 BUILD(r, WASM_I32_REINTERPRET_F32( | 1170 BUILD(r, WASM_I32_REINTERPRET_F32( |
| 1205 WASM_LOAD_MEM(MachineType::Float32(), WASM_ZERO))); | 1171 WASM_LOAD_MEM(MachineType::Float32(), WASM_ZERO))); |
| 1206 | 1172 |
| 1207 FOR_INT32_INPUTS(i) { | 1173 FOR_INT32_INPUTS(i) { |
| 1208 int32_t expected = *i; | 1174 int32_t expected = *i; |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1253 TestSignatures sigs; | 1219 TestSignatures sigs; |
| 1254 TestingModule module; | 1220 TestingModule module; |
| 1255 WasmFunctionCompiler t(sigs.v_v(), &module); | 1221 WasmFunctionCompiler t(sigs.v_v(), &module); |
| 1256 BUILD(t, kExprNop); | 1222 BUILD(t, kExprNop); |
| 1257 uint32_t index = t.CompileAndAdd(); | 1223 uint32_t index = t.CompileAndAdd(); |
| 1258 | 1224 |
| 1259 const int32_t kExpected = -414444; | 1225 const int32_t kExpected = -414444; |
| 1260 // Build the calling function. | 1226 // Build the calling function. |
| 1261 WasmRunner<int32_t> r; | 1227 WasmRunner<int32_t> r; |
| 1262 r.env()->module = &module; | 1228 r.env()->module = &module; |
| 1263 BUILD(r, WASM_BLOCK(2, WASM_CALL_FUNCTION0(index), WASM_I32(kExpected))); | 1229 BUILD(r, B2(WASM_CALL_FUNCTION0(index), WASM_I32(kExpected))); |
| 1264 | 1230 |
| 1265 int32_t result = r.Call(); | 1231 int32_t result = r.Call(); |
| 1266 CHECK_EQ(kExpected, result); | 1232 CHECK_EQ(kExpected, result); |
| 1267 } | 1233 } |
| 1268 | 1234 |
| 1269 | 1235 |
| 1270 TEST(Run_Wasm_VoidReturn2) { | 1236 TEST(Run_Wasm_VoidReturn2) { |
| 1271 // We use a wrapper function because WasmRunner<void> does not exist. | 1237 // We use a wrapper function because WasmRunner<void> does not exist. |
| 1272 // Build the test function. | 1238 // Build the test function. |
| 1273 TestSignatures sigs; | 1239 TestSignatures sigs; |
| 1274 TestingModule module; | 1240 TestingModule module; |
| 1275 WasmFunctionCompiler t(sigs.v_v(), &module); | 1241 WasmFunctionCompiler t(sigs.v_v(), &module); |
| 1276 BUILD(t, WASM_RETURN0); | 1242 BUILD(t, WASM_RETURN0); |
| 1277 uint32_t index = t.CompileAndAdd(); | 1243 uint32_t index = t.CompileAndAdd(); |
| 1278 | 1244 |
| 1279 const int32_t kExpected = -414444; | 1245 const int32_t kExpected = -414444; |
| 1280 // Build the calling function. | 1246 // Build the calling function. |
| 1281 WasmRunner<int32_t> r; | 1247 WasmRunner<int32_t> r; |
| 1282 r.env()->module = &module; | 1248 r.env()->module = &module; |
| 1283 BUILD(r, WASM_BLOCK(2, WASM_CALL_FUNCTION0(index), WASM_I32(kExpected))); | 1249 BUILD(r, B2(WASM_CALL_FUNCTION0(index), WASM_I32(kExpected))); |
| 1284 | 1250 |
| 1285 int32_t result = r.Call(); | 1251 int32_t result = r.Call(); |
| 1286 CHECK_EQ(kExpected, result); | 1252 CHECK_EQ(kExpected, result); |
| 1287 } | 1253 } |
| 1288 | 1254 |
| 1289 | 1255 |
| 1290 TEST(Run_Wasm_Block_If_P) { | 1256 TEST(Run_Wasm_Block_If_P) { |
| 1291 WasmRunner<int32_t> r(MachineType::Int32()); | 1257 WasmRunner<int32_t> r(MachineType::Int32()); |
| 1292 // { if (p0) return 51; return 52; } | 1258 // { if (p0) return 51; return 52; } |
| 1293 BUILD(r, WASM_BLOCK(2, // -- | 1259 BUILD(r, B2( // -- |
| 1294 WASM_IF(WASM_GET_LOCAL(0), // -- | 1260 WASM_IF(WASM_GET_LOCAL(0), // -- |
| 1295 WASM_BRV(0, WASM_I8(51))), // -- | 1261 WASM_BRV(0, WASM_I8(51))), // -- |
| 1296 WASM_I8(52))); // -- | 1262 WASM_I8(52))); // -- |
| 1297 FOR_INT32_INPUTS(i) { | 1263 FOR_INT32_INPUTS(i) { |
| 1298 int32_t expected = *i ? 51 : 52; | 1264 int32_t expected = *i ? 51 : 52; |
| 1299 CHECK_EQ(expected, r.Call(*i)); | 1265 CHECK_EQ(expected, r.Call(*i)); |
| 1300 } | 1266 } |
| 1301 } | 1267 } |
| 1302 | 1268 |
| 1303 | 1269 |
| 1304 TEST(Run_Wasm_Block_BrIf_P) { | 1270 TEST(Run_Wasm_Block_BrIf_P) { |
| 1305 WasmRunner<int32_t> r(MachineType::Int32()); | 1271 WasmRunner<int32_t> r(MachineType::Int32()); |
| 1306 BUILD(r, WASM_BLOCK(2, WASM_BRV_IF(0, WASM_I8(51), WASM_GET_LOCAL(0)), | 1272 BUILD(r, B2(WASM_BRV_IF(0, WASM_I8(51), WASM_GET_LOCAL(0)), WASM_I8(52))); |
| 1307 WASM_I8(52))); | |
| 1308 FOR_INT32_INPUTS(i) { | 1273 FOR_INT32_INPUTS(i) { |
| 1309 int32_t expected = *i ? 51 : 52; | 1274 int32_t expected = *i ? 51 : 52; |
| 1310 CHECK_EQ(expected, r.Call(*i)); | 1275 CHECK_EQ(expected, r.Call(*i)); |
| 1311 } | 1276 } |
| 1312 } | 1277 } |
| 1313 | 1278 |
| 1314 | 1279 |
| 1315 TEST(Run_Wasm_Block_IfElse_P_assign) { | 1280 TEST(Run_Wasm_Block_IfElse_P_assign) { |
| 1316 WasmRunner<int32_t> r(MachineType::Int32()); | 1281 WasmRunner<int32_t> r(MachineType::Int32()); |
| 1317 // { if (p0) p0 = 71; else p0 = 72; return p0; } | 1282 // { if (p0) p0 = 71; else p0 = 72; return p0; } |
| 1318 BUILD(r, WASM_BLOCK(2, // -- | 1283 BUILD(r, B2( // -- |
| 1319 WASM_IF_ELSE(WASM_GET_LOCAL(0), // -- | 1284 WASM_IF_ELSE(WASM_GET_LOCAL(0), // -- |
| 1320 WASM_SET_LOCAL(0, WASM_I8(71)), // -- | 1285 WASM_SET_LOCAL(0, WASM_I8(71)), // -- |
| 1321 WASM_SET_LOCAL(0, WASM_I8(72))), // -- | 1286 WASM_SET_LOCAL(0, WASM_I8(72))), // -- |
| 1322 WASM_GET_LOCAL(0))); | 1287 WASM_GET_LOCAL(0))); |
| 1323 FOR_INT32_INPUTS(i) { | 1288 FOR_INT32_INPUTS(i) { |
| 1324 int32_t expected = *i ? 71 : 72; | 1289 int32_t expected = *i ? 71 : 72; |
| 1325 CHECK_EQ(expected, r.Call(*i)); | 1290 CHECK_EQ(expected, r.Call(*i)); |
| 1326 } | 1291 } |
| 1327 } | 1292 } |
| 1328 | 1293 |
| 1329 | 1294 |
| 1330 TEST(Run_Wasm_Block_IfElse_P_return) { | 1295 TEST(Run_Wasm_Block_IfElse_P_return) { |
| 1331 WasmRunner<int32_t> r(MachineType::Int32()); | 1296 WasmRunner<int32_t> r(MachineType::Int32()); |
| 1332 // if (p0) return 81; else return 82; | 1297 // if (p0) return 81; else return 82; |
| 1333 BUILD(r, // -- | 1298 BUILD(r, // -- |
| 1334 WASM_IF_ELSE(WASM_GET_LOCAL(0), // -- | 1299 WASM_IF_ELSE(WASM_GET_LOCAL(0), // -- |
| 1335 WASM_RETURN(WASM_I8(81)), // -- | 1300 RET_I8(81), // -- |
| 1336 WASM_RETURN(WASM_I8(82)))); // -- | 1301 RET_I8(82))); // -- |
| 1337 FOR_INT32_INPUTS(i) { | 1302 FOR_INT32_INPUTS(i) { |
| 1338 int32_t expected = *i ? 81 : 82; | 1303 int32_t expected = *i ? 81 : 82; |
| 1339 CHECK_EQ(expected, r.Call(*i)); | 1304 CHECK_EQ(expected, r.Call(*i)); |
| 1340 } | 1305 } |
| 1341 } | 1306 } |
| 1342 | 1307 |
| 1343 | 1308 |
| 1344 TEST(Run_Wasm_Block_If_P_assign) { | 1309 TEST(Run_Wasm_Block_If_P_assign) { |
| 1345 WasmRunner<int32_t> r(MachineType::Int32()); | 1310 WasmRunner<int32_t> r(MachineType::Int32()); |
| 1346 // { if (p0) p0 = 61; p0; } | 1311 // { if (p0) p0 = 61; p0; } |
| 1347 BUILD(r, WASM_BLOCK( | 1312 BUILD(r, WASM_BLOCK( |
| 1348 2, WASM_IF(WASM_GET_LOCAL(0), WASM_SET_LOCAL(0, WASM_I8(61))), | 1313 2, WASM_IF(WASM_GET_LOCAL(0), WASM_SET_LOCAL(0, WASM_I8(61))), |
| 1349 WASM_GET_LOCAL(0))); | 1314 WASM_GET_LOCAL(0))); |
| 1350 FOR_INT32_INPUTS(i) { | 1315 FOR_INT32_INPUTS(i) { |
| 1351 int32_t expected = *i ? 61 : *i; | 1316 int32_t expected = *i ? 61 : *i; |
| 1352 CHECK_EQ(expected, r.Call(*i)); | 1317 CHECK_EQ(expected, r.Call(*i)); |
| 1353 } | 1318 } |
| 1354 } | 1319 } |
| 1355 | 1320 |
| 1356 | 1321 |
| 1357 TEST(Run_Wasm_DanglingAssign) { | 1322 TEST(Run_Wasm_DanglingAssign) { |
| 1358 WasmRunner<int32_t> r(MachineType::Int32()); | 1323 WasmRunner<int32_t> r(MachineType::Int32()); |
| 1359 // { return 0; p0 = 0; } | 1324 // { return 0; p0 = 0; } |
| 1360 BUILD(r, | 1325 BUILD(r, B2(RET_I8(99), WASM_SET_LOCAL(0, WASM_ZERO))); |
| 1361 WASM_BLOCK(2, WASM_RETURN(WASM_I8(99)), WASM_SET_LOCAL(0, WASM_ZERO))); | |
| 1362 CHECK_EQ(99, r.Call(1)); | 1326 CHECK_EQ(99, r.Call(1)); |
| 1363 } | 1327 } |
| 1364 | 1328 |
| 1365 | 1329 |
| 1366 TEST(Run_Wasm_ExprIf_P) { | 1330 TEST(Run_Wasm_ExprIf_P) { |
| 1367 WasmRunner<int32_t> r(MachineType::Int32()); | 1331 WasmRunner<int32_t> r(MachineType::Int32()); |
| 1368 // p0 ? 11 : 22; | 1332 // p0 ? 11 : 22; |
| 1369 BUILD(r, WASM_IF_ELSE(WASM_GET_LOCAL(0), // -- | 1333 BUILD(r, WASM_IF_ELSE(WASM_GET_LOCAL(0), // -- |
| 1370 WASM_I8(11), // -- | 1334 WASM_I8(11), // -- |
| 1371 WASM_I8(22))); // -- | 1335 WASM_I8(22))); // -- |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1428 WASM_I8(1)))), | 1392 WASM_I8(1)))), |
| 1429 WASM_GET_LOCAL(0))); | 1393 WASM_GET_LOCAL(0))); |
| 1430 CHECK_EQ(0, r.Call(1)); | 1394 CHECK_EQ(0, r.Call(1)); |
| 1431 CHECK_EQ(0, r.Call(10)); | 1395 CHECK_EQ(0, r.Call(10)); |
| 1432 CHECK_EQ(0, r.Call(100)); | 1396 CHECK_EQ(0, r.Call(100)); |
| 1433 } | 1397 } |
| 1434 | 1398 |
| 1435 | 1399 |
| 1436 TEST(Run_Wasm_Loop_if_break1) { | 1400 TEST(Run_Wasm_Loop_if_break1) { |
| 1437 WasmRunner<int32_t> r(MachineType::Int32()); | 1401 WasmRunner<int32_t> r(MachineType::Int32()); |
| 1438 BUILD(r, WASM_BLOCK(2, WASM_LOOP(2, WASM_IF(WASM_GET_LOCAL(0), WASM_BREAK(0)), | 1402 BUILD(r, B2(WASM_LOOP(2, WASM_IF(WASM_GET_LOCAL(0), WASM_BREAK(0)), |
| 1439 WASM_SET_LOCAL(0, WASM_I8(99))), | 1403 WASM_SET_LOCAL(0, WASM_I8(99))), |
| 1440 WASM_GET_LOCAL(0))); | 1404 WASM_GET_LOCAL(0))); |
| 1441 CHECK_EQ(99, r.Call(0)); | 1405 CHECK_EQ(99, r.Call(0)); |
| 1442 CHECK_EQ(3, r.Call(3)); | 1406 CHECK_EQ(3, r.Call(3)); |
| 1443 CHECK_EQ(10000, r.Call(10000)); | 1407 CHECK_EQ(10000, r.Call(10000)); |
| 1444 CHECK_EQ(-29, r.Call(-29)); | 1408 CHECK_EQ(-29, r.Call(-29)); |
| 1445 } | 1409 } |
| 1446 | 1410 |
| 1447 | 1411 |
| 1448 TEST(Run_Wasm_Loop_if_break2) { | 1412 TEST(Run_Wasm_Loop_if_break2) { |
| 1449 WasmRunner<int32_t> r(MachineType::Int32()); | 1413 WasmRunner<int32_t> r(MachineType::Int32()); |
| 1450 BUILD(r, WASM_BLOCK(2, WASM_LOOP(2, WASM_BR_IF(1, WASM_GET_LOCAL(0)), | 1414 BUILD(r, B2(WASM_LOOP(2, WASM_BR_IF(1, WASM_GET_LOCAL(0)), |
| 1451 WASM_SET_LOCAL(0, WASM_I8(99))), | 1415 WASM_SET_LOCAL(0, WASM_I8(99))), |
| 1452 WASM_GET_LOCAL(0))); | 1416 WASM_GET_LOCAL(0))); |
| 1453 CHECK_EQ(99, r.Call(0)); | 1417 CHECK_EQ(99, r.Call(0)); |
| 1454 CHECK_EQ(3, r.Call(3)); | 1418 CHECK_EQ(3, r.Call(3)); |
| 1455 CHECK_EQ(10000, r.Call(10000)); | 1419 CHECK_EQ(10000, r.Call(10000)); |
| 1456 CHECK_EQ(-29, r.Call(-29)); | 1420 CHECK_EQ(-29, r.Call(-29)); |
| 1457 } | 1421 } |
| 1458 | 1422 |
| 1459 | 1423 |
| 1460 TEST(Run_Wasm_Loop_if_break_fallthru) { | 1424 TEST(Run_Wasm_Loop_if_break_fallthru) { |
| 1461 WasmRunner<int32_t> r(MachineType::Int32()); | 1425 WasmRunner<int32_t> r(MachineType::Int32()); |
| 1462 BUILD(r, WASM_BLOCK(1, WASM_LOOP(2, WASM_IF(WASM_GET_LOCAL(0), WASM_BREAK(1)), | 1426 BUILD(r, B1(WASM_LOOP(2, WASM_IF(WASM_GET_LOCAL(0), WASM_BREAK(1)), |
| 1463 WASM_SET_LOCAL(0, WASM_I8(93)))), | 1427 WASM_SET_LOCAL(0, WASM_I8(93)))), |
| 1464 WASM_GET_LOCAL(0)); | 1428 WASM_GET_LOCAL(0)); |
| 1465 CHECK_EQ(93, r.Call(0)); | 1429 CHECK_EQ(93, r.Call(0)); |
| 1466 CHECK_EQ(3, r.Call(3)); | 1430 CHECK_EQ(3, r.Call(3)); |
| 1467 CHECK_EQ(10001, r.Call(10001)); | 1431 CHECK_EQ(10001, r.Call(10001)); |
| 1468 CHECK_EQ(-22, r.Call(-22)); | 1432 CHECK_EQ(-22, r.Call(-22)); |
| 1469 } | 1433 } |
| 1470 | 1434 |
| 1471 | 1435 |
| 1472 TEST(Run_Wasm_LoadMemI32) { | 1436 TEST(Run_Wasm_LoadMemI32) { |
| 1473 TestingModule module; | 1437 TestingModule module; |
| (...skipping 461 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1935 module.AddMemoryElems<int8_t>(16); | 1899 module.AddMemoryElems<int8_t>(16); |
| 1936 WasmRunner<int32_t> r(&module, MachineType::Int32()); | 1900 WasmRunner<int32_t> r(&module, MachineType::Int32()); |
| 1937 | 1901 |
| 1938 // Only build the graph and compile, don't run. | 1902 // Only build the graph and compile, don't run. |
| 1939 BUILD(r, WASM_LOOP(1, WASM_LOAD_MEM(MachineType::Int32(), WASM_ZERO))); | 1903 BUILD(r, WASM_LOOP(1, WASM_LOAD_MEM(MachineType::Int32(), WASM_ZERO))); |
| 1940 } | 1904 } |
| 1941 | 1905 |
| 1942 | 1906 |
| 1943 TEST(Run_Wasm_Unreachable0a) { | 1907 TEST(Run_Wasm_Unreachable0a) { |
| 1944 WasmRunner<int32_t> r(MachineType::Int32()); | 1908 WasmRunner<int32_t> r(MachineType::Int32()); |
| 1945 BUILD(r, | 1909 BUILD(r, B2(WASM_BRV(0, WASM_I8(9)), RET(WASM_GET_LOCAL(0)))); |
| 1946 WASM_BLOCK(2, WASM_BRV(0, WASM_I8(9)), WASM_RETURN(WASM_GET_LOCAL(0)))); | |
| 1947 CHECK_EQ(9, r.Call(0)); | 1910 CHECK_EQ(9, r.Call(0)); |
| 1948 CHECK_EQ(9, r.Call(1)); | 1911 CHECK_EQ(9, r.Call(1)); |
| 1949 } | 1912 } |
| 1950 | 1913 |
| 1951 | 1914 |
| 1952 TEST(Run_Wasm_Unreachable0b) { | 1915 TEST(Run_Wasm_Unreachable0b) { |
| 1953 WasmRunner<int32_t> r(MachineType::Int32()); | 1916 WasmRunner<int32_t> r(MachineType::Int32()); |
| 1954 BUILD(r, WASM_BLOCK(2, WASM_BRV(0, WASM_I8(7)), WASM_UNREACHABLE)); | 1917 BUILD(r, B2(WASM_BRV(0, WASM_I8(7)), WASM_UNREACHABLE)); |
| 1955 CHECK_EQ(7, r.Call(0)); | 1918 CHECK_EQ(7, r.Call(0)); |
| 1956 CHECK_EQ(7, r.Call(1)); | 1919 CHECK_EQ(7, r.Call(1)); |
| 1957 } | 1920 } |
| 1958 | 1921 |
| 1959 | 1922 |
| 1960 TEST(Build_Wasm_Unreachable1) { | 1923 TEST(Build_Wasm_Unreachable1) { |
| 1961 WasmRunner<int32_t> r(MachineType::Int32()); | 1924 WasmRunner<int32_t> r(MachineType::Int32()); |
| 1962 BUILD(r, WASM_UNREACHABLE); | 1925 BUILD(r, WASM_UNREACHABLE); |
| 1963 } | 1926 } |
| 1964 | 1927 |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 1983 | 1946 |
| 1984 TEST(Build_Wasm_UnreachableIf2) { | 1947 TEST(Build_Wasm_UnreachableIf2) { |
| 1985 WasmRunner<int32_t> r(MachineType::Int32()); | 1948 WasmRunner<int32_t> r(MachineType::Int32()); |
| 1986 BUILD(r, WASM_UNREACHABLE, | 1949 BUILD(r, WASM_UNREACHABLE, |
| 1987 WASM_IF_ELSE(WASM_GET_LOCAL(0), WASM_GET_LOCAL(0), WASM_UNREACHABLE)); | 1950 WASM_IF_ELSE(WASM_GET_LOCAL(0), WASM_GET_LOCAL(0), WASM_UNREACHABLE)); |
| 1988 } | 1951 } |
| 1989 | 1952 |
| 1990 | 1953 |
| 1991 TEST(Run_Wasm_Unreachable_Load) { | 1954 TEST(Run_Wasm_Unreachable_Load) { |
| 1992 WasmRunner<int32_t> r(MachineType::Int32()); | 1955 WasmRunner<int32_t> r(MachineType::Int32()); |
| 1993 BUILD(r, WASM_BLOCK(2, WASM_BRV(0, WASM_GET_LOCAL(0)), | 1956 BUILD(r, B2(WASM_BRV(0, WASM_GET_LOCAL(0)), |
| 1994 WASM_LOAD_MEM(MachineType::Int8(), WASM_GET_LOCAL(0)))); | 1957 WASM_LOAD_MEM(MachineType::Int8(), WASM_GET_LOCAL(0)))); |
| 1995 CHECK_EQ(11, r.Call(11)); | 1958 CHECK_EQ(11, r.Call(11)); |
| 1996 CHECK_EQ(21, r.Call(21)); | 1959 CHECK_EQ(21, r.Call(21)); |
| 1997 } | 1960 } |
| 1998 | 1961 |
| 1999 | 1962 |
| 2000 TEST(Run_Wasm_Infinite_Loop_not_taken1) { | 1963 TEST(Run_Wasm_Infinite_Loop_not_taken1) { |
| 2001 WasmRunner<int32_t> r(MachineType::Int32()); | 1964 WasmRunner<int32_t> r(MachineType::Int32()); |
| 2002 BUILD(r, WASM_BLOCK(2, WASM_IF(WASM_GET_LOCAL(0), WASM_INFINITE_LOOP), | 1965 BUILD(r, B2(WASM_IF(WASM_GET_LOCAL(0), WASM_INFINITE_LOOP), WASM_I8(45))); |
| 2003 WASM_I8(45))); | |
| 2004 // Run the code, but don't go into the infinite loop. | 1966 // Run the code, but don't go into the infinite loop. |
| 2005 CHECK_EQ(45, r.Call(0)); | 1967 CHECK_EQ(45, r.Call(0)); |
| 2006 } | 1968 } |
| 2007 | 1969 |
| 2008 | 1970 |
| 2009 TEST(Run_Wasm_Infinite_Loop_not_taken2) { | 1971 TEST(Run_Wasm_Infinite_Loop_not_taken2) { |
| 2010 WasmRunner<int32_t> r(MachineType::Int32()); | 1972 WasmRunner<int32_t> r(MachineType::Int32()); |
| 2011 BUILD(r, | 1973 BUILD(r, B1(WASM_IF_ELSE(WASM_GET_LOCAL(0), WASM_BRV(0, WASM_I8(45)), |
| 2012 WASM_BLOCK(1, WASM_IF_ELSE(WASM_GET_LOCAL(0), WASM_BRV(0, WASM_I8(45)), | 1974 WASM_INFINITE_LOOP))); |
| 2013 WASM_INFINITE_LOOP))); | |
| 2014 // Run the code, but don't go into the infinite loop. | 1975 // Run the code, but don't go into the infinite loop. |
| 2015 CHECK_EQ(45, r.Call(1)); | 1976 CHECK_EQ(45, r.Call(1)); |
| 2016 } | 1977 } |
| 2017 | 1978 |
| 2018 | 1979 |
| 2019 TEST(Run_Wasm_Infinite_Loop_not_taken2_brif) { | 1980 TEST(Run_Wasm_Infinite_Loop_not_taken2_brif) { |
| 2020 WasmRunner<int32_t> r(MachineType::Int32()); | 1981 WasmRunner<int32_t> r(MachineType::Int32()); |
| 2021 BUILD(r, WASM_BLOCK(2, WASM_BRV_IF(0, WASM_I8(45), WASM_GET_LOCAL(0)), | 1982 BUILD(r, |
| 2022 WASM_INFINITE_LOOP)); | 1983 B2(WASM_BRV_IF(0, WASM_I8(45), WASM_GET_LOCAL(0)), WASM_INFINITE_LOOP)); |
| 2023 // Run the code, but don't go into the infinite loop. | 1984 // Run the code, but don't go into the infinite loop. |
| 2024 CHECK_EQ(45, r.Call(1)); | 1985 CHECK_EQ(45, r.Call(1)); |
| 2025 } | 1986 } |
| 2026 | 1987 |
| 2027 | 1988 |
| 2028 static void TestBuildGraphForSimpleExpression(WasmOpcode opcode) { | 1989 static void TestBuildGraphForSimpleExpression(WasmOpcode opcode) { |
| 2029 if (!WasmOpcodes::IsSupported(opcode)) return; | 1990 if (!WasmOpcodes::IsSupported(opcode)) return; |
| 2030 | 1991 |
| 2031 Zone zone; | 1992 Zone zone; |
| 2032 Isolate* isolate = CcTest::InitIsolateOnce(); | 1993 Isolate* isolate = CcTest::InitIsolateOnce(); |
| (...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2171 } | 2132 } |
| 2172 } | 2133 } |
| 2173 | 2134 |
| 2174 | 2135 |
| 2175 #if WASM_64 | 2136 #if WASM_64 |
| 2176 TEST(Run_WasmInt64Global) { | 2137 TEST(Run_WasmInt64Global) { |
| 2177 TestingModule module; | 2138 TestingModule module; |
| 2178 int64_t* global = module.AddGlobal<int64_t>(MachineType::Int64()); | 2139 int64_t* global = module.AddGlobal<int64_t>(MachineType::Int64()); |
| 2179 WasmRunner<int32_t> r(&module, MachineType::Int32()); | 2140 WasmRunner<int32_t> r(&module, MachineType::Int32()); |
| 2180 // global = global + p0 | 2141 // global = global + p0 |
| 2181 BUILD(r, WASM_BLOCK(2, WASM_STORE_GLOBAL( | 2142 BUILD(r, B2(WASM_STORE_GLOBAL( |
| 2182 0, WASM_I64_ADD( | 2143 0, WASM_I64_ADD(WASM_LOAD_GLOBAL(0), |
| 2183 WASM_LOAD_GLOBAL(0), | 2144 WASM_I64_SCONVERT_I32(WASM_GET_LOCAL(0)))), |
| 2184 WASM_I64_SCONVERT_I32(WASM_GET_LOCAL(0)))), | 2145 WASM_ZERO)); |
| 2185 WASM_ZERO)); | |
| 2186 | 2146 |
| 2187 *global = 0xFFFFFFFFFFFFFFFFLL; | 2147 *global = 0xFFFFFFFFFFFFFFFFLL; |
| 2188 for (int i = 9; i < 444444; i += 111111) { | 2148 for (int i = 9; i < 444444; i += 111111) { |
| 2189 int64_t expected = *global + i; | 2149 int64_t expected = *global + i; |
| 2190 r.Call(i); | 2150 r.Call(i); |
| 2191 CHECK_EQ(expected, *global); | 2151 CHECK_EQ(expected, *global); |
| 2192 } | 2152 } |
| 2193 } | 2153 } |
| 2194 #endif | 2154 #endif |
| 2195 | 2155 |
| 2196 | 2156 |
| 2197 TEST(Run_WasmFloat32Global) { | 2157 TEST(Run_WasmFloat32Global) { |
| 2198 TestingModule module; | 2158 TestingModule module; |
| 2199 float* global = module.AddGlobal<float>(MachineType::Float32()); | 2159 float* global = module.AddGlobal<float>(MachineType::Float32()); |
| 2200 WasmRunner<int32_t> r(&module, MachineType::Int32()); | 2160 WasmRunner<int32_t> r(&module, MachineType::Int32()); |
| 2201 // global = global + p0 | 2161 // global = global + p0 |
| 2202 BUILD(r, WASM_BLOCK(2, WASM_STORE_GLOBAL( | 2162 BUILD(r, B2(WASM_STORE_GLOBAL( |
| 2203 0, WASM_F32_ADD( | 2163 0, WASM_F32_ADD(WASM_LOAD_GLOBAL(0), |
| 2204 WASM_LOAD_GLOBAL(0), | 2164 WASM_F32_SCONVERT_I32(WASM_GET_LOCAL(0)))), |
| 2205 WASM_F32_SCONVERT_I32(WASM_GET_LOCAL(0)))), | 2165 WASM_ZERO)); |
| 2206 WASM_ZERO)); | |
| 2207 | 2166 |
| 2208 *global = 1.25; | 2167 *global = 1.25; |
| 2209 for (int i = 9; i < 4444; i += 1111) { | 2168 for (int i = 9; i < 4444; i += 1111) { |
| 2210 volatile float expected = *global + i; | 2169 volatile float expected = *global + i; |
| 2211 r.Call(i); | 2170 r.Call(i); |
| 2212 CHECK_EQ(expected, *global); | 2171 CHECK_EQ(expected, *global); |
| 2213 } | 2172 } |
| 2214 } | 2173 } |
| 2215 | 2174 |
| 2216 | 2175 |
| 2217 TEST(Run_WasmFloat64Global) { | 2176 TEST(Run_WasmFloat64Global) { |
| 2218 TestingModule module; | 2177 TestingModule module; |
| 2219 double* global = module.AddGlobal<double>(MachineType::Float64()); | 2178 double* global = module.AddGlobal<double>(MachineType::Float64()); |
| 2220 WasmRunner<int32_t> r(&module, MachineType::Int32()); | 2179 WasmRunner<int32_t> r(&module, MachineType::Int32()); |
| 2221 // global = global + p0 | 2180 // global = global + p0 |
| 2222 BUILD(r, WASM_BLOCK(2, WASM_STORE_GLOBAL( | 2181 BUILD(r, B2(WASM_STORE_GLOBAL( |
| 2223 0, WASM_F64_ADD( | 2182 0, WASM_F64_ADD(WASM_LOAD_GLOBAL(0), |
| 2224 WASM_LOAD_GLOBAL(0), | 2183 WASM_F64_SCONVERT_I32(WASM_GET_LOCAL(0)))), |
| 2225 WASM_F64_SCONVERT_I32(WASM_GET_LOCAL(0)))), | 2184 WASM_ZERO)); |
| 2226 WASM_ZERO)); | |
| 2227 | 2185 |
| 2228 *global = 1.25; | 2186 *global = 1.25; |
| 2229 for (int i = 9; i < 4444; i += 1111) { | 2187 for (int i = 9; i < 4444; i += 1111) { |
| 2230 volatile double expected = *global + i; | 2188 volatile double expected = *global + i; |
| 2231 r.Call(i); | 2189 r.Call(i); |
| 2232 CHECK_EQ(expected, *global); | 2190 CHECK_EQ(expected, *global); |
| 2233 } | 2191 } |
| 2234 } | 2192 } |
| 2235 | 2193 |
| 2236 | 2194 |
| (...skipping 395 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2632 | 2590 |
| 2633 TEST(Run_Wasm_AddCall) { | 2591 TEST(Run_Wasm_AddCall) { |
| 2634 TestSignatures sigs; | 2592 TestSignatures sigs; |
| 2635 TestingModule module; | 2593 TestingModule module; |
| 2636 WasmFunctionCompiler t1(sigs.i_ii(), &module); | 2594 WasmFunctionCompiler t1(sigs.i_ii(), &module); |
| 2637 BUILD(t1, WASM_I32_ADD(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); | 2595 BUILD(t1, WASM_I32_ADD(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); |
| 2638 t1.CompileAndAdd(); | 2596 t1.CompileAndAdd(); |
| 2639 | 2597 |
| 2640 WasmRunner<int32_t> r(&module, MachineType::Int32()); | 2598 WasmRunner<int32_t> r(&module, MachineType::Int32()); |
| 2641 byte local = r.AllocateLocal(kAstI32); | 2599 byte local = r.AllocateLocal(kAstI32); |
| 2642 BUILD(r, | 2600 BUILD(r, B2(WASM_SET_LOCAL(local, WASM_I8(99)), |
| 2643 WASM_BLOCK(2, WASM_SET_LOCAL(local, WASM_I8(99)), | 2601 WASM_I32_ADD( |
| 2644 WASM_I32_ADD( | 2602 WASM_CALL_FUNCTION(t1.function_index_, WASM_GET_LOCAL(0), |
| 2645 WASM_CALL_FUNCTION(t1.function_index_, WASM_GET_LOCAL(0), | 2603 WASM_GET_LOCAL(0)), |
| 2646 WASM_GET_LOCAL(0)), | 2604 WASM_CALL_FUNCTION(t1.function_index_, WASM_GET_LOCAL(1), |
| 2647 WASM_CALL_FUNCTION(t1.function_index_, WASM_GET_LOCAL(1), | 2605 WASM_GET_LOCAL(local))))); |
| 2648 WASM_GET_LOCAL(local))))); | |
| 2649 | 2606 |
| 2650 CHECK_EQ(198, r.Call(0)); | 2607 CHECK_EQ(198, r.Call(0)); |
| 2651 CHECK_EQ(200, r.Call(1)); | 2608 CHECK_EQ(200, r.Call(1)); |
| 2652 CHECK_EQ(100, r.Call(-49)); | 2609 CHECK_EQ(100, r.Call(-49)); |
| 2653 } | 2610 } |
| 2654 | 2611 |
| 2655 TEST(Run_Wasm_CountDown_expr) { | 2612 TEST(Run_Wasm_CountDown_expr) { |
| 2656 WasmRunner<int32_t> r(MachineType::Int32()); | 2613 WasmRunner<int32_t> r(MachineType::Int32()); |
| 2657 BUILD(r, WASM_LOOP( | 2614 BUILD(r, WASM_LOOP( |
| 2658 3, WASM_IF(WASM_NOT(WASM_GET_LOCAL(0)), | 2615 3, WASM_IF(WASM_NOT(WASM_GET_LOCAL(0)), |
| 2659 WASM_BREAKV(0, WASM_GET_LOCAL(0))), | 2616 WASM_BREAKV(0, WASM_GET_LOCAL(0))), |
| 2660 WASM_SET_LOCAL(0, WASM_I32_SUB(WASM_GET_LOCAL(0), WASM_I8(1))), | 2617 WASM_SET_LOCAL(0, WASM_I32_SUB(WASM_GET_LOCAL(0), WASM_I8(1))), |
| 2661 WASM_CONTINUE(0))); | 2618 WASM_CONTINUE(0))); |
| 2662 CHECK_EQ(0, r.Call(1)); | 2619 CHECK_EQ(0, r.Call(1)); |
| 2663 CHECK_EQ(0, r.Call(10)); | 2620 CHECK_EQ(0, r.Call(10)); |
| 2664 CHECK_EQ(0, r.Call(100)); | 2621 CHECK_EQ(0, r.Call(100)); |
| 2665 } | 2622 } |
| 2666 | 2623 |
| 2667 | 2624 |
| 2668 TEST(Run_Wasm_ExprBlock2a) { | 2625 TEST(Run_Wasm_ExprBlock2a) { |
| 2669 WasmRunner<int32_t> r(MachineType::Int32()); | 2626 WasmRunner<int32_t> r(MachineType::Int32()); |
| 2670 BUILD(r, WASM_BLOCK(2, WASM_IF(WASM_GET_LOCAL(0), WASM_BRV(0, WASM_I8(1))), | 2627 BUILD(r, B2(WASM_IF(WASM_GET_LOCAL(0), WASM_BRV(0, WASM_I8(1))), WASM_I8(1))); |
| 2671 WASM_I8(1))); | |
| 2672 CHECK_EQ(1, r.Call(0)); | 2628 CHECK_EQ(1, r.Call(0)); |
| 2673 CHECK_EQ(1, r.Call(1)); | 2629 CHECK_EQ(1, r.Call(1)); |
| 2674 } | 2630 } |
| 2675 | 2631 |
| 2676 | 2632 |
| 2677 TEST(Run_Wasm_ExprBlock2b) { | 2633 TEST(Run_Wasm_ExprBlock2b) { |
| 2678 WasmRunner<int32_t> r(MachineType::Int32()); | 2634 WasmRunner<int32_t> r(MachineType::Int32()); |
| 2679 BUILD(r, WASM_BLOCK(2, WASM_IF(WASM_GET_LOCAL(0), WASM_BRV(0, WASM_I8(1))), | 2635 BUILD(r, B2(WASM_IF(WASM_GET_LOCAL(0), WASM_BRV(0, WASM_I8(1))), WASM_I8(2))); |
| 2680 WASM_I8(2))); | |
| 2681 CHECK_EQ(2, r.Call(0)); | 2636 CHECK_EQ(2, r.Call(0)); |
| 2682 CHECK_EQ(1, r.Call(1)); | 2637 CHECK_EQ(1, r.Call(1)); |
| 2683 } | 2638 } |
| 2684 | 2639 |
| 2685 | 2640 |
| 2686 TEST(Run_Wasm_ExprBlock2c) { | 2641 TEST(Run_Wasm_ExprBlock2c) { |
| 2687 WasmRunner<int32_t> r(MachineType::Int32()); | 2642 WasmRunner<int32_t> r(MachineType::Int32()); |
| 2688 BUILD(r, WASM_BLOCK(2, WASM_BRV_IF(0, WASM_I8(1), WASM_GET_LOCAL(0)), | 2643 BUILD(r, B2(WASM_BRV_IF(0, WASM_I8(1), WASM_GET_LOCAL(0)), WASM_I8(1))); |
| 2689 WASM_I8(1))); | |
| 2690 CHECK_EQ(1, r.Call(0)); | 2644 CHECK_EQ(1, r.Call(0)); |
| 2691 CHECK_EQ(1, r.Call(1)); | 2645 CHECK_EQ(1, r.Call(1)); |
| 2692 } | 2646 } |
| 2693 | 2647 |
| 2694 | 2648 |
| 2695 TEST(Run_Wasm_ExprBlock2d) { | 2649 TEST(Run_Wasm_ExprBlock2d) { |
| 2696 WasmRunner<int32_t> r(MachineType::Int32()); | 2650 WasmRunner<int32_t> r(MachineType::Int32()); |
| 2697 BUILD(r, WASM_BLOCK(2, WASM_BRV_IF(0, WASM_I8(1), WASM_GET_LOCAL(0)), | 2651 BUILD(r, B2(WASM_BRV_IF(0, WASM_I8(1), WASM_GET_LOCAL(0)), WASM_I8(2))); |
| 2698 WASM_I8(2))); | |
| 2699 CHECK_EQ(2, r.Call(0)); | 2652 CHECK_EQ(2, r.Call(0)); |
| 2700 CHECK_EQ(1, r.Call(1)); | 2653 CHECK_EQ(1, r.Call(1)); |
| 2701 } | 2654 } |
| 2702 | 2655 |
| 2703 | 2656 |
| 2704 TEST(Run_Wasm_ExprBlock_ManualSwitch) { | 2657 TEST(Run_Wasm_ExprBlock_ManualSwitch) { |
| 2705 WasmRunner<int32_t> r(MachineType::Int32()); | 2658 WasmRunner<int32_t> r(MachineType::Int32()); |
| 2706 BUILD(r, WASM_BLOCK(6, WASM_IF(WASM_I32_EQ(WASM_GET_LOCAL(0), WASM_I8(1)), | 2659 BUILD(r, WASM_BLOCK(6, WASM_IF(WASM_I32_EQ(WASM_GET_LOCAL(0), WASM_I8(1)), |
| 2707 WASM_BRV(0, WASM_I8(11))), | 2660 WASM_BRV(0, WASM_I8(11))), |
| 2708 WASM_IF(WASM_I32_EQ(WASM_GET_LOCAL(0), WASM_I8(2)), | 2661 WASM_IF(WASM_I32_EQ(WASM_GET_LOCAL(0), WASM_I8(2)), |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2760 CHECK_EQ(11, r.Call(1, 1)); | 2713 CHECK_EQ(11, r.Call(1, 1)); |
| 2761 CHECK_EQ(12, r.Call(1, 0)); | 2714 CHECK_EQ(12, r.Call(1, 0)); |
| 2762 CHECK_EQ(13, r.Call(0, 1)); | 2715 CHECK_EQ(13, r.Call(0, 1)); |
| 2763 CHECK_EQ(14, r.Call(0, 0)); | 2716 CHECK_EQ(14, r.Call(0, 0)); |
| 2764 } | 2717 } |
| 2765 | 2718 |
| 2766 | 2719 |
| 2767 TEST(Run_Wasm_ExprBlock_if) { | 2720 TEST(Run_Wasm_ExprBlock_if) { |
| 2768 WasmRunner<int32_t> r(MachineType::Int32()); | 2721 WasmRunner<int32_t> r(MachineType::Int32()); |
| 2769 | 2722 |
| 2770 BUILD(r, | 2723 BUILD(r, B1(WASM_IF_ELSE(WASM_GET_LOCAL(0), WASM_BRV(0, WASM_I8(11)), |
| 2771 WASM_BLOCK(1, WASM_IF_ELSE(WASM_GET_LOCAL(0), WASM_BRV(0, WASM_I8(11)), | 2724 WASM_BRV(0, WASM_I8(14))))); |
| 2772 WASM_BRV(0, WASM_I8(14))))); | |
| 2773 | 2725 |
| 2774 CHECK_EQ(11, r.Call(1)); | 2726 CHECK_EQ(11, r.Call(1)); |
| 2775 CHECK_EQ(14, r.Call(0)); | 2727 CHECK_EQ(14, r.Call(0)); |
| 2776 } | 2728 } |
| 2777 | 2729 |
| 2778 | 2730 |
| 2779 TEST(Run_Wasm_ExprBlock_nested_ifs) { | 2731 TEST(Run_Wasm_ExprBlock_nested_ifs) { |
| 2780 WasmRunner<int32_t> r(MachineType::Int32(), MachineType::Int32()); | 2732 WasmRunner<int32_t> r(MachineType::Int32(), MachineType::Int32()); |
| 2781 | 2733 |
| 2782 BUILD(r, WASM_BLOCK( | 2734 BUILD(r, WASM_BLOCK( |
| (...skipping 599 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3382 | 3334 |
| 3383 #if WASM_64 | 3335 #if WASM_64 |
| 3384 TEST(Compile_Wasm_CallIndirect_Many_i64) { CompileCallIndirectMany(kAstI64); } | 3336 TEST(Compile_Wasm_CallIndirect_Many_i64) { CompileCallIndirectMany(kAstI64); } |
| 3385 #endif | 3337 #endif |
| 3386 | 3338 |
| 3387 | 3339 |
| 3388 TEST(Compile_Wasm_CallIndirect_Many_f32) { CompileCallIndirectMany(kAstF32); } | 3340 TEST(Compile_Wasm_CallIndirect_Many_f32) { CompileCallIndirectMany(kAstF32); } |
| 3389 | 3341 |
| 3390 | 3342 |
| 3391 TEST(Compile_Wasm_CallIndirect_Many_f64) { CompileCallIndirectMany(kAstF64); } | 3343 TEST(Compile_Wasm_CallIndirect_Many_f64) { CompileCallIndirectMany(kAstF64); } |
| OLD | NEW |