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

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

Issue 1764723002: [wasm] Remove TableSwitch and replace with br_table. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2015 the V8 project authors. All rights reserved. 1 // Copyright 2015 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <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
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
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
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
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
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
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
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
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
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
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); }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698