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

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

Issue 1830663002: [wasm] Binary 11: AST changes. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 7 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
« no previous file with comments | « src/wasm/wasm-opcodes.cc ('k') | test/cctest/wasm/test-run-wasm-64.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 the V8 project authors. All rights reserved. 1 // Copyright 2015 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <stdint.h> 5 #include <stdint.h>
6 #include <stdlib.h> 6 #include <stdlib.h>
7 #include <string.h> 7 #include <string.h>
8 8
9 #include "src/base/platform/elapsed-timer.h"
10
9 #include "src/wasm/wasm-macro-gen.h" 11 #include "src/wasm/wasm-macro-gen.h"
10 12
11 #include "test/cctest/cctest.h" 13 #include "test/cctest/cctest.h"
12 #include "test/cctest/compiler/value-helper.h" 14 #include "test/cctest/compiler/value-helper.h"
13 #include "test/cctest/wasm/test-signatures.h" 15 #include "test/cctest/wasm/test-signatures.h"
14 #include "test/cctest/wasm/wasm-run-utils.h" 16 #include "test/cctest/wasm/wasm-run-utils.h"
15 17
16 using namespace v8::base; 18 using namespace v8::base;
17 using namespace v8::internal; 19 using namespace v8::internal;
18 using namespace v8::internal::compiler; 20 using namespace v8::internal::compiler;
19 using namespace v8::internal::wasm; 21 using namespace v8::internal::wasm;
20 22
21 // for even shorter tests. 23 // for even shorter tests.
22 #define B2(a, b) kExprBlock, 2, a, b 24 #define B2(a, b) kExprBlock, a, b, kExprEnd
23 #define B1(a) kExprBlock, 1, a 25 #define B1(a) kExprBlock, a, kExprEnd
24 #define RET(x) kExprReturn, x 26 #define RET(x) x, kExprReturn, 1
25 #define RET_I8(x) kExprReturn, kExprI8Const, x 27 #define RET_I8(x) kExprI8Const, x, kExprReturn, 1
26 28
27 TEST(Run_WasmInt8Const) { 29 TEST(Run_WasmInt8Const) {
28 WasmRunner<int32_t> r; 30 WasmRunner<int32_t> r;
29 const byte kExpectedValue = 121; 31 const byte kExpectedValue = 121;
30 // return(kExpectedValue) 32 // return(kExpectedValue)
31 BUILD(r, WASM_I8(kExpectedValue)); 33 BUILD(r, WASM_I8(kExpectedValue));
32 CHECK_EQ(kExpectedValue, r.Call()); 34 CHECK_EQ(kExpectedValue, r.Call());
33 } 35 }
34 36
35 37
(...skipping 643 matching lines...) Expand 10 before | Expand all | Expand 10 after
679 // if (p0) return 11; else return 22; 681 // if (p0) return 11; else return 22;
680 BUILD(r, WASM_IF_ELSE(WASM_GET_LOCAL(0), // -- 682 BUILD(r, WASM_IF_ELSE(WASM_GET_LOCAL(0), // --
681 WASM_I8(11), // -- 683 WASM_I8(11), // --
682 WASM_I8(22))); // -- 684 WASM_I8(22))); // --
683 FOR_INT32_INPUTS(i) { 685 FOR_INT32_INPUTS(i) {
684 int32_t expected = *i ? 11 : 22; 686 int32_t expected = *i ? 11 : 22;
685 CHECK_EQ(expected, r.Call(*i)); 687 CHECK_EQ(expected, r.Call(*i));
686 } 688 }
687 } 689 }
688 690
691 TEST(Run_Wasm_If_chain) {
692 WasmRunner<int32_t> r(MachineType::Int32());
693 // if (p0) 13; if (p0) 14; 15
694 BUILD(r, WASM_IF(WASM_GET_LOCAL(0), WASM_I8(13)),
695 WASM_IF(WASM_GET_LOCAL(0), WASM_I8(14)), WASM_I8(15));
696 FOR_INT32_INPUTS(i) { CHECK_EQ(15, r.Call(*i)); }
697 }
698
699 TEST(Run_Wasm_If_chain_set) {
700 WasmRunner<int32_t> r(MachineType::Int32(), MachineType::Int32());
701 // if (p0) p1 = 73; if (p0) p1 = 74; p1
702 BUILD(r, WASM_IF(WASM_GET_LOCAL(0), WASM_SET_LOCAL(1, WASM_I8(73))),
703 WASM_IF(WASM_GET_LOCAL(0), WASM_SET_LOCAL(1, WASM_I8(74))),
704 WASM_GET_LOCAL(1));
705 FOR_INT32_INPUTS(i) {
706 int32_t expected = *i ? 74 : *i;
707 CHECK_EQ(expected, r.Call(*i, *i));
708 }
709 }
689 710
690 TEST(Run_Wasm_IfElse_Unreachable1) { 711 TEST(Run_Wasm_IfElse_Unreachable1) {
691 WasmRunner<int32_t> r; 712 WasmRunner<int32_t> r;
692 // if (0) unreachable; else return 22; 713 // if (0) unreachable; else return 22;
693 BUILD(r, WASM_IF_ELSE(WASM_ZERO, // -- 714 BUILD(r, WASM_IF_ELSE(WASM_ZERO, // --
694 WASM_UNREACHABLE, // -- 715 WASM_UNREACHABLE, // --
695 WASM_I8(27))); // -- 716 WASM_I8(27))); // --
696 CHECK_EQ(27, r.Call()); 717 CHECK_EQ(27, r.Call());
697 } 718 }
698 719
(...skipping 367 matching lines...) Expand 10 before | Expand all | Expand 10 after
1066 int32_t result = r.Call(); 1087 int32_t result = r.Call();
1067 CHECK_EQ(kExpected, result); 1088 CHECK_EQ(kExpected, result);
1068 } 1089 }
1069 1090
1070 1091
1071 TEST(Run_Wasm_Block_If_P) { 1092 TEST(Run_Wasm_Block_If_P) {
1072 WasmRunner<int32_t> r(MachineType::Int32()); 1093 WasmRunner<int32_t> r(MachineType::Int32());
1073 // { if (p0) return 51; return 52; } 1094 // { if (p0) return 51; return 52; }
1074 BUILD(r, B2( // -- 1095 BUILD(r, B2( // --
1075 WASM_IF(WASM_GET_LOCAL(0), // -- 1096 WASM_IF(WASM_GET_LOCAL(0), // --
1076 WASM_BRV(0, WASM_I8(51))), // -- 1097 WASM_BRV(1, WASM_I8(51))), // --
1077 WASM_I8(52))); // -- 1098 WASM_I8(52))); // --
1078 FOR_INT32_INPUTS(i) { 1099 FOR_INT32_INPUTS(i) {
1079 int32_t expected = *i ? 51 : 52; 1100 int32_t expected = *i ? 51 : 52;
1080 CHECK_EQ(expected, r.Call(*i)); 1101 CHECK_EQ(expected, r.Call(*i));
1081 } 1102 }
1082 } 1103 }
1083 1104
1084 1105
1085 TEST(Run_Wasm_Block_BrIf_P) { 1106 TEST(Run_Wasm_Block_BrIf_P) {
1086 WasmRunner<int32_t> r(MachineType::Int32()); 1107 WasmRunner<int32_t> r(MachineType::Int32());
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
1167 } 1188 }
1168 } 1189 }
1169 1190
1170 1191
1171 TEST(Run_Wasm_CountDown) { 1192 TEST(Run_Wasm_CountDown) {
1172 WasmRunner<int32_t> r(MachineType::Int32()); 1193 WasmRunner<int32_t> r(MachineType::Int32());
1173 BUILD(r, 1194 BUILD(r,
1174 WASM_BLOCK( 1195 WASM_BLOCK(
1175 2, WASM_LOOP( 1196 2, WASM_LOOP(
1176 1, WASM_IF(WASM_GET_LOCAL(0), 1197 1, WASM_IF(WASM_GET_LOCAL(0),
1177 WASM_BRV(0, WASM_SET_LOCAL( 1198 WASM_BRV(1, WASM_SET_LOCAL(
1178 0, WASM_I32_SUB(WASM_GET_LOCAL(0), 1199 0, WASM_I32_SUB(WASM_GET_LOCAL(0),
1179 WASM_I8(1)))))), 1200 WASM_I8(1)))))),
1180 WASM_GET_LOCAL(0))); 1201 WASM_GET_LOCAL(0)));
1181 CHECK_EQ(0, r.Call(1)); 1202 CHECK_EQ(0, r.Call(1));
1182 CHECK_EQ(0, r.Call(10)); 1203 CHECK_EQ(0, r.Call(10));
1183 CHECK_EQ(0, r.Call(100)); 1204 CHECK_EQ(0, r.Call(100));
1184 } 1205 }
1185 1206
1186 1207
1187 TEST(Run_Wasm_CountDown_fallthru) { 1208 TEST(Run_Wasm_CountDown_fallthru) {
1188 WasmRunner<int32_t> r(MachineType::Int32()); 1209 WasmRunner<int32_t> r(MachineType::Int32());
1189 BUILD(r, 1210 BUILD(r,
1190 WASM_BLOCK( 1211 WASM_BLOCK(
1191 2, WASM_LOOP(3, WASM_IF(WASM_NOT(WASM_GET_LOCAL(0)), WASM_BREAK(0)), 1212 2, WASM_LOOP(3, WASM_IF(WASM_NOT(WASM_GET_LOCAL(0)), WASM_BREAK(1)),
1192 WASM_SET_LOCAL( 1213 WASM_SET_LOCAL(
1193 0, WASM_I32_SUB(WASM_GET_LOCAL(0), WASM_I8(1))), 1214 0, WASM_I32_SUB(WASM_GET_LOCAL(0), WASM_I8(1))),
1194 WASM_CONTINUE(0)), 1215 WASM_CONTINUE(0)),
1195 WASM_GET_LOCAL(0))); 1216 WASM_GET_LOCAL(0)));
1196 CHECK_EQ(0, r.Call(1)); 1217 CHECK_EQ(0, r.Call(1));
1197 CHECK_EQ(0, r.Call(10)); 1218 CHECK_EQ(0, r.Call(10));
1198 CHECK_EQ(0, r.Call(100)); 1219 CHECK_EQ(0, r.Call(100));
1199 } 1220 }
1200 1221
1201 1222
1202 TEST(Run_Wasm_WhileCountDown) { 1223 TEST(Run_Wasm_WhileCountDown) {
1203 WasmRunner<int32_t> r(MachineType::Int32()); 1224 WasmRunner<int32_t> r(MachineType::Int32());
1204 BUILD(r, WASM_BLOCK( 1225 BUILD(r, WASM_BLOCK(
1205 2, WASM_WHILE(WASM_GET_LOCAL(0), 1226 2, WASM_WHILE(WASM_GET_LOCAL(0),
1206 WASM_SET_LOCAL(0, WASM_I32_SUB(WASM_GET_LOCAL(0), 1227 WASM_SET_LOCAL(0, WASM_I32_SUB(WASM_GET_LOCAL(0),
1207 WASM_I8(1)))), 1228 WASM_I8(1)))),
1208 WASM_GET_LOCAL(0))); 1229 WASM_GET_LOCAL(0)));
1209 CHECK_EQ(0, r.Call(1)); 1230 CHECK_EQ(0, r.Call(1));
1210 CHECK_EQ(0, r.Call(10)); 1231 CHECK_EQ(0, r.Call(10));
1211 CHECK_EQ(0, r.Call(100)); 1232 CHECK_EQ(0, r.Call(100));
1212 } 1233 }
1213 1234
1214 1235
1215 TEST(Run_Wasm_Loop_if_break1) { 1236 TEST(Run_Wasm_Loop_if_break1) {
1216 WasmRunner<int32_t> r(MachineType::Int32()); 1237 WasmRunner<int32_t> r(MachineType::Int32());
1217 BUILD(r, B2(WASM_LOOP(2, WASM_IF(WASM_GET_LOCAL(0), WASM_BREAK(0)), 1238 BUILD(r, B2(WASM_LOOP(2, WASM_IF(WASM_GET_LOCAL(0), WASM_BREAK(1)),
1218 WASM_SET_LOCAL(0, WASM_I8(99))), 1239 WASM_SET_LOCAL(0, WASM_I8(99))),
1219 WASM_GET_LOCAL(0))); 1240 WASM_GET_LOCAL(0)));
1220 CHECK_EQ(99, r.Call(0)); 1241 CHECK_EQ(99, r.Call(0));
1221 CHECK_EQ(3, r.Call(3)); 1242 CHECK_EQ(3, r.Call(3));
1222 CHECK_EQ(10000, r.Call(10000)); 1243 CHECK_EQ(10000, r.Call(10000));
1223 CHECK_EQ(-29, r.Call(-29)); 1244 CHECK_EQ(-29, r.Call(-29));
1224 } 1245 }
1225 1246
1226 1247
1227 TEST(Run_Wasm_Loop_if_break2) { 1248 TEST(Run_Wasm_Loop_if_break2) {
(...skipping 12 matching lines...) Expand all
1240 WasmRunner<int32_t> r(MachineType::Int32()); 1261 WasmRunner<int32_t> r(MachineType::Int32());
1241 BUILD(r, B1(WASM_LOOP(2, WASM_IF(WASM_GET_LOCAL(0), WASM_BREAK(1)), 1262 BUILD(r, B1(WASM_LOOP(2, WASM_IF(WASM_GET_LOCAL(0), WASM_BREAK(1)),
1242 WASM_SET_LOCAL(0, WASM_I8(93)))), 1263 WASM_SET_LOCAL(0, WASM_I8(93)))),
1243 WASM_GET_LOCAL(0)); 1264 WASM_GET_LOCAL(0));
1244 CHECK_EQ(93, r.Call(0)); 1265 CHECK_EQ(93, r.Call(0));
1245 CHECK_EQ(3, r.Call(3)); 1266 CHECK_EQ(3, r.Call(3));
1246 CHECK_EQ(10001, r.Call(10001)); 1267 CHECK_EQ(10001, r.Call(10001));
1247 CHECK_EQ(-22, r.Call(-22)); 1268 CHECK_EQ(-22, r.Call(-22));
1248 } 1269 }
1249 1270
1271 TEST(Run_Wasm_IfBreak1) {
1272 WasmRunner<int32_t> r(MachineType::Int32());
1273 BUILD(r, WASM_IF(WASM_GET_LOCAL(0), WASM_SEQ(WASM_BR(0), WASM_UNREACHABLE)),
1274 WASM_I8(91));
1275 CHECK_EQ(91, r.Call(0));
1276 CHECK_EQ(91, r.Call(1));
1277 CHECK_EQ(91, r.Call(-8734));
1278 }
1279
1280 TEST(Run_Wasm_IfBreak2) {
1281 WasmRunner<int32_t> r(MachineType::Int32());
1282 BUILD(r, WASM_IF(WASM_GET_LOCAL(0), WASM_SEQ(WASM_BR(0), RET_I8(77))),
1283 WASM_I8(81));
1284 CHECK_EQ(81, r.Call(0));
1285 CHECK_EQ(81, r.Call(1));
1286 CHECK_EQ(81, r.Call(-8734));
1287 }
1250 1288
1251 TEST(Run_Wasm_LoadMemI32) { 1289 TEST(Run_Wasm_LoadMemI32) {
1252 TestingModule module; 1290 TestingModule module;
1253 int32_t* memory = module.AddMemoryElems<int32_t>(8); 1291 int32_t* memory = module.AddMemoryElems<int32_t>(8);
1254 WasmRunner<int32_t> r(&module, MachineType::Int32()); 1292 WasmRunner<int32_t> r(&module, MachineType::Int32());
1255 module.RandomizeMemory(1111); 1293 module.RandomizeMemory(1111);
1256 1294
1257 BUILD(r, WASM_LOAD_MEM(MachineType::Int32(), WASM_I8(0))); 1295 BUILD(r, WASM_LOAD_MEM(MachineType::Int32(), WASM_I8(0)));
1258 1296
1259 memory[0] = 99999999; 1297 memory[0] = 99999999;
(...skipping 261 matching lines...) Expand 10 before | Expand all | Expand 10 after
1521 } 1559 }
1522 } 1560 }
1523 1561
1524 1562
1525 TEST(Run_Wasm_CheckMachIntsZero) { 1563 TEST(Run_Wasm_CheckMachIntsZero) {
1526 const int kNumElems = 55; 1564 const int kNumElems = 55;
1527 TestingModule module; 1565 TestingModule module;
1528 module.AddMemoryElems<uint32_t>(kNumElems); 1566 module.AddMemoryElems<uint32_t>(kNumElems);
1529 WasmRunner<uint32_t> r(&module, MachineType::Int32()); 1567 WasmRunner<uint32_t> r(&module, MachineType::Int32());
1530 1568
1531 BUILD(r, kExprBlock, 2, kExprLoop, 1, kExprIf, kExprGetLocal, 0, kExprBr, 0, 1569 BUILD(r, kExprLoop, kExprGetLocal, 0, kExprIf, kExprGetLocal, 0,
1532 kExprIfElse, kExprI32LoadMem, ZERO_ALIGNMENT, ZERO_OFFSET, 1570 kExprI32LoadMem, 0, 0, kExprIf, kExprI8Const, 255, kExprReturn, ARITY_1,
1533 kExprGetLocal, 0, kExprBr, 2, kExprI8Const, 255, kExprSetLocal, 0, 1571 kExprEnd, kExprGetLocal, 0, kExprI8Const, 4, kExprI32Sub, kExprSetLocal,
1534 kExprI32Sub, kExprGetLocal, 0, kExprI8Const, 4, kExprI8Const, 0); 1572 0, kExprBr, ARITY_1, DEPTH_0, kExprEnd, kExprEnd, kExprI8Const, 0);
1535 1573
1536 module.BlankMemory(); 1574 module.BlankMemory();
1537 CHECK_EQ(0, r.Call((kNumElems - 1) * 4)); 1575 CHECK_EQ(0, r.Call((kNumElems - 1) * 4));
1538 } 1576 }
1539 1577
1540 1578
1541 TEST(Run_Wasm_MemF32_Sum) { 1579 TEST(Run_Wasm_MemF32_Sum) {
1542 const int kSize = 5; 1580 const int kSize = 5;
1543 TestingModule module; 1581 TestingModule module;
1544 module.AddMemoryElems<float>(kSize); 1582 module.AddMemoryElems<float>(kSize);
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after
1688 TEST(Run_Wasm_Infinite_Loop_not_taken1) { 1726 TEST(Run_Wasm_Infinite_Loop_not_taken1) {
1689 WasmRunner<int32_t> r(MachineType::Int32()); 1727 WasmRunner<int32_t> r(MachineType::Int32());
1690 BUILD(r, B2(WASM_IF(WASM_GET_LOCAL(0), WASM_INFINITE_LOOP), WASM_I8(45))); 1728 BUILD(r, B2(WASM_IF(WASM_GET_LOCAL(0), WASM_INFINITE_LOOP), WASM_I8(45)));
1691 // Run the code, but don't go into the infinite loop. 1729 // Run the code, but don't go into the infinite loop.
1692 CHECK_EQ(45, r.Call(0)); 1730 CHECK_EQ(45, r.Call(0));
1693 } 1731 }
1694 1732
1695 1733
1696 TEST(Run_Wasm_Infinite_Loop_not_taken2) { 1734 TEST(Run_Wasm_Infinite_Loop_not_taken2) {
1697 WasmRunner<int32_t> r(MachineType::Int32()); 1735 WasmRunner<int32_t> r(MachineType::Int32());
1698 BUILD(r, B1(WASM_IF_ELSE(WASM_GET_LOCAL(0), WASM_BRV(0, WASM_I8(45)), 1736 BUILD(r, B1(WASM_IF_ELSE(WASM_GET_LOCAL(0), WASM_BRV(1, WASM_I8(45)),
1699 WASM_INFINITE_LOOP))); 1737 WASM_INFINITE_LOOP)));
1700 // Run the code, but don't go into the infinite loop. 1738 // Run the code, but don't go into the infinite loop.
1701 CHECK_EQ(45, r.Call(1)); 1739 CHECK_EQ(45, r.Call(1));
1702 } 1740 }
1703 1741
1704 1742
1705 TEST(Run_Wasm_Infinite_Loop_not_taken2_brif) { 1743 TEST(Run_Wasm_Infinite_Loop_not_taken2_brif) {
1706 WasmRunner<int32_t> r(MachineType::Int32()); 1744 WasmRunner<int32_t> r(MachineType::Int32());
1707 BUILD(r, 1745 BUILD(r,
1708 B2(WASM_BRV_IF(0, WASM_I8(45), WASM_GET_LOCAL(0)), WASM_INFINITE_LOOP)); 1746 B2(WASM_BRV_IF(0, WASM_I8(45), WASM_GET_LOCAL(0)), WASM_INFINITE_LOOP));
(...skipping 10 matching lines...) Expand all
1719 HandleScope scope(isolate); 1757 HandleScope scope(isolate);
1720 // Enable all optional operators. 1758 // Enable all optional operators.
1721 CommonOperatorBuilder common(&zone); 1759 CommonOperatorBuilder common(&zone);
1722 MachineOperatorBuilder machine(&zone, MachineType::PointerRepresentation(), 1760 MachineOperatorBuilder machine(&zone, MachineType::PointerRepresentation(),
1723 MachineOperatorBuilder::kAllOptionalOps); 1761 MachineOperatorBuilder::kAllOptionalOps);
1724 Graph graph(&zone); 1762 Graph graph(&zone);
1725 JSGraph jsgraph(isolate, &graph, &common, nullptr, nullptr, &machine); 1763 JSGraph jsgraph(isolate, &graph, &common, nullptr, nullptr, &machine);
1726 FunctionSig* sig = WasmOpcodes::Signature(opcode); 1764 FunctionSig* sig = WasmOpcodes::Signature(opcode);
1727 1765
1728 if (sig->parameter_count() == 1) { 1766 if (sig->parameter_count() == 1) {
1729 byte code[] = {WASM_NO_LOCALS, static_cast<byte>(opcode), kExprGetLocal, 0}; 1767 byte code[] = {WASM_NO_LOCALS, kExprGetLocal, 0, static_cast<byte>(opcode)};
1730 TestBuildingGraph(&zone, &jsgraph, nullptr, sig, nullptr, code, 1768 TestBuildingGraph(&zone, &jsgraph, nullptr, sig, nullptr, code,
1731 code + arraysize(code)); 1769 code + arraysize(code));
1732 } else { 1770 } else {
1733 CHECK_EQ(2, sig->parameter_count()); 1771 CHECK_EQ(2, sig->parameter_count());
1734 byte code[] = {WASM_NO_LOCALS, static_cast<byte>(opcode), 1772 byte code[] = {WASM_NO_LOCALS, kExprGetLocal, 0, kExprGetLocal, 1,
1735 kExprGetLocal, 0, 1773 static_cast<byte>(opcode)};
1736 kExprGetLocal, 1};
1737 TestBuildingGraph(&zone, &jsgraph, nullptr, sig, nullptr, code, 1774 TestBuildingGraph(&zone, &jsgraph, nullptr, sig, nullptr, code,
1738 code + arraysize(code)); 1775 code + arraysize(code));
1739 } 1776 }
1740 } 1777 }
1741 1778
1742 1779
1743 TEST(Build_Wasm_SimpleExprs) { 1780 TEST(Build_Wasm_SimpleExprs) {
1744 // Test that the decoder can build a graph for all supported simple expressions. 1781 // Test that the decoder can build a graph for all supported simple expressions.
1745 #define GRAPH_BUILD_TEST(name, opcode, sig) \ 1782 #define GRAPH_BUILD_TEST(name, opcode, sig) \
1746 TestBuildGraphForSimpleExpression(kExpr##name); 1783 TestBuildGraphForSimpleExpression(kExpr##name);
(...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after
1975 LocalType param_types[20]; 2012 LocalType param_types[20];
1976 for (int i = 0; i < 20; i++) param_types[i] = kAstF32; 2013 for (int i = 0; i < 20; i++) param_types[i] = kAstF32;
1977 FunctionSig sig(1, 19, param_types); 2014 FunctionSig sig(1, 19, param_types);
1978 TestingModule module; 2015 TestingModule module;
1979 WasmFunctionCompiler t(&sig, &module); 2016 WasmFunctionCompiler t(&sig, &module);
1980 BUILD(t, WASM_GET_LOCAL(17)); 2017 BUILD(t, WASM_GET_LOCAL(17));
1981 uint32_t index = t.CompileAndAdd(); 2018 uint32_t index = t.CompileAndAdd();
1982 2019
1983 // Build the calling function. 2020 // Build the calling function.
1984 WasmRunner<float> r(&module); 2021 WasmRunner<float> r(&module);
1985 BUILD(r, WASM_CALL_FUNCTION( 2022 BUILD(r, WASM_CALL_FUNCTIONN(
1986 index, WASM_F32(1.0f), WASM_F32(2.0f), WASM_F32(4.0f), 2023 19, index, WASM_F32(1.0f), WASM_F32(2.0f), WASM_F32(4.0f),
1987 WASM_F32(8.0f), WASM_F32(16.0f), WASM_F32(32.0f), 2024 WASM_F32(8.0f), WASM_F32(16.0f), WASM_F32(32.0f),
1988 WASM_F32(64.0f), WASM_F32(128.0f), WASM_F32(256.0f), 2025 WASM_F32(64.0f), WASM_F32(128.0f), WASM_F32(256.0f),
1989 WASM_F32(1.5f), WASM_F32(2.5f), WASM_F32(4.5f), WASM_F32(8.5f), 2026 WASM_F32(1.5f), WASM_F32(2.5f), WASM_F32(4.5f), WASM_F32(8.5f),
1990 WASM_F32(16.5f), WASM_F32(32.5f), WASM_F32(64.5f), 2027 WASM_F32(16.5f), WASM_F32(32.5f), WASM_F32(64.5f),
1991 WASM_F32(128.5f), WASM_F32(256.5f), WASM_F32(512.5f))); 2028 WASM_F32(128.5f), WASM_F32(256.5f), WASM_F32(512.5f)));
1992 2029
1993 float result = r.Call(); 2030 float result = r.Call();
1994 CHECK_EQ(256.5f, result); 2031 CHECK_EQ(256.5f, result);
1995 } 2032 }
1996 2033
1997 2034
1998 TEST(Run_WasmCallF64StackParameter) { 2035 TEST(Run_WasmCallF64StackParameter) {
1999 // Build the target function. 2036 // Build the target function.
2000 LocalType param_types[20]; 2037 LocalType param_types[20];
2001 for (int i = 0; i < 20; i++) param_types[i] = kAstF64; 2038 for (int i = 0; i < 20; i++) param_types[i] = kAstF64;
2002 FunctionSig sig(1, 19, param_types); 2039 FunctionSig sig(1, 19, param_types);
2003 TestingModule module; 2040 TestingModule module;
2004 WasmFunctionCompiler t(&sig, &module); 2041 WasmFunctionCompiler t(&sig, &module);
2005 BUILD(t, WASM_GET_LOCAL(17)); 2042 BUILD(t, WASM_GET_LOCAL(17));
2006 uint32_t index = t.CompileAndAdd(); 2043 uint32_t index = t.CompileAndAdd();
2007 2044
2008 // Build the calling function. 2045 // Build the calling function.
2009 WasmRunner<double> r(&module); 2046 WasmRunner<double> r(&module);
2010 BUILD(r, WASM_CALL_FUNCTION(index, WASM_F64(1.0), WASM_F64(2.0), 2047 BUILD(r, WASM_CALL_FUNCTIONN(19, index, WASM_F64(1.0), WASM_F64(2.0),
2011 WASM_F64(4.0), WASM_F64(8.0), WASM_F64(16.0), 2048 WASM_F64(4.0), WASM_F64(8.0), WASM_F64(16.0),
2012 WASM_F64(32.0), WASM_F64(64.0), WASM_F64(128.0), 2049 WASM_F64(32.0), WASM_F64(64.0), WASM_F64(128.0),
2013 WASM_F64(256.0), WASM_F64(1.5), WASM_F64(2.5), 2050 WASM_F64(256.0), WASM_F64(1.5), WASM_F64(2.5),
2014 WASM_F64(4.5), WASM_F64(8.5), WASM_F64(16.5), 2051 WASM_F64(4.5), WASM_F64(8.5), WASM_F64(16.5),
2015 WASM_F64(32.5), WASM_F64(64.5), WASM_F64(128.5), 2052 WASM_F64(32.5), WASM_F64(64.5), WASM_F64(128.5),
2016 WASM_F64(256.5), WASM_F64(512.5))); 2053 WASM_F64(256.5), WASM_F64(512.5)));
2017 2054
2018 float result = r.Call(); 2055 float result = r.Call();
2019 CHECK_EQ(256.5, result); 2056 CHECK_EQ(256.5, result);
2020 } 2057 }
2021 2058
2022 TEST(Run_WasmCallVoid) { 2059 TEST(Run_WasmCallVoid) {
2023 const byte kMemOffset = 8; 2060 const byte kMemOffset = 8;
2024 const int32_t kElemNum = kMemOffset / sizeof(int32_t); 2061 const int32_t kElemNum = kMemOffset / sizeof(int32_t);
2025 const int32_t kExpected = -414444; 2062 const int32_t kExpected = -414444;
2026 // Build the target function. 2063 // Build the target function.
(...skipping 20 matching lines...) Expand all
2047 TEST(Run_WasmCall_Int32Add) { 2084 TEST(Run_WasmCall_Int32Add) {
2048 // Build the target function. 2085 // Build the target function.
2049 TestSignatures sigs; 2086 TestSignatures sigs;
2050 TestingModule module; 2087 TestingModule module;
2051 WasmFunctionCompiler t(sigs.i_ii(), &module); 2088 WasmFunctionCompiler t(sigs.i_ii(), &module);
2052 BUILD(t, WASM_I32_ADD(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 2089 BUILD(t, WASM_I32_ADD(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
2053 uint32_t index = t.CompileAndAdd(); 2090 uint32_t index = t.CompileAndAdd();
2054 2091
2055 // Build the caller function. 2092 // Build the caller function.
2056 WasmRunner<int32_t> r(&module, MachineType::Int32(), MachineType::Int32()); 2093 WasmRunner<int32_t> r(&module, MachineType::Int32(), MachineType::Int32());
2057 BUILD(r, WASM_CALL_FUNCTION(index, WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 2094 BUILD(r, WASM_CALL_FUNCTION2(index, WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
2058 2095
2059 FOR_INT32_INPUTS(i) { 2096 FOR_INT32_INPUTS(i) {
2060 FOR_INT32_INPUTS(j) { 2097 FOR_INT32_INPUTS(j) {
2061 int32_t expected = static_cast<int32_t>(static_cast<uint32_t>(*i) + 2098 int32_t expected = static_cast<int32_t>(static_cast<uint32_t>(*i) +
2062 static_cast<uint32_t>(*j)); 2099 static_cast<uint32_t>(*j));
2063 CHECK_EQ(expected, r.Call(*i, *j)); 2100 CHECK_EQ(expected, r.Call(*i, *j));
2064 } 2101 }
2065 } 2102 }
2066 } 2103 }
2067 2104
2068 TEST(Run_WasmCall_Float32Sub) { 2105 TEST(Run_WasmCall_Float32Sub) {
2069 TestSignatures sigs; 2106 TestSignatures sigs;
2070 TestingModule module; 2107 TestingModule module;
2071 WasmFunctionCompiler t(sigs.f_ff(), &module); 2108 WasmFunctionCompiler t(sigs.f_ff(), &module);
2072 2109
2073 // Build the target function. 2110 // Build the target function.
2074 BUILD(t, WASM_F32_SUB(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 2111 BUILD(t, WASM_F32_SUB(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
2075 uint32_t index = t.CompileAndAdd(); 2112 uint32_t index = t.CompileAndAdd();
2076 2113
2077 // Builder the caller function. 2114 // Builder the caller function.
2078 WasmRunner<float> r(&module, MachineType::Float32(), MachineType::Float32()); 2115 WasmRunner<float> r(&module, MachineType::Float32(), MachineType::Float32());
2079 BUILD(r, WASM_CALL_FUNCTION(index, WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 2116 BUILD(r, WASM_CALL_FUNCTION2(index, WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
2080 2117
2081 FOR_FLOAT32_INPUTS(i) { 2118 FOR_FLOAT32_INPUTS(i) {
2082 FOR_FLOAT32_INPUTS(j) { CHECK_FLOAT_EQ(*i - *j, r.Call(*i, *j)); } 2119 FOR_FLOAT32_INPUTS(j) { CHECK_FLOAT_EQ(*i - *j, r.Call(*i, *j)); }
2083 } 2120 }
2084 } 2121 }
2085 2122
2086 2123
2087 TEST(Run_WasmCall_Float64Sub) { 2124 TEST(Run_WasmCall_Float64Sub) {
2088 TestingModule module; 2125 TestingModule module;
2089 double* memory = module.AddMemoryElems<double>(16); 2126 double* memory = module.AddMemoryElems<double>(16);
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
2158 b.AddParam(WasmOpcodes::LocalTypeFor(memtypes[i])); 2195 b.AddParam(WasmOpcodes::LocalTypeFor(memtypes[i]));
2159 } 2196 }
2160 WasmFunctionCompiler t(b.Build(), &module); 2197 WasmFunctionCompiler t(b.Build(), &module);
2161 BUILD(t, WASM_GET_LOCAL(which)); 2198 BUILD(t, WASM_GET_LOCAL(which));
2162 index = t.CompileAndAdd(); 2199 index = t.CompileAndAdd();
2163 2200
2164 // ========================================================================= 2201 // =========================================================================
2165 // Build the calling function. 2202 // Build the calling function.
2166 // ========================================================================= 2203 // =========================================================================
2167 WasmRunner<int32_t> r(&module); 2204 WasmRunner<int32_t> r(&module);
2205 std::vector<byte> code;
2168 2206
2169 std::vector<byte> code; 2207 // Load the offset for the store.
2170 ADD_CODE(code,
2171 static_cast<byte>(WasmOpcodes::LoadStoreOpcodeOf(result, true)),
2172 ZERO_ALIGNMENT, ZERO_OFFSET);
2173 ADD_CODE(code, WASM_ZERO); 2208 ADD_CODE(code, WASM_ZERO);
2174 ADD_CODE(code, kExprCallFunction, static_cast<byte>(index));
2175 2209
2210 // Load the arguments.
2176 for (int i = 0; i < num_params; i++) { 2211 for (int i = 0; i < num_params; i++) {
2177 int offset = (i + 1) * kElemSize; 2212 int offset = (i + 1) * kElemSize;
2178 ADD_CODE(code, WASM_LOAD_MEM(memtypes[i], WASM_I8(offset))); 2213 ADD_CODE(code, WASM_LOAD_MEM(memtypes[i], WASM_I8(offset)));
2179 } 2214 }
2180 2215
2216 // Call the selector function.
2217 ADD_CODE(code, kExprCallFunction, static_cast<byte>(num_params),
2218 static_cast<byte>(index));
2219
2220 // Store the result in memory.
2221 ADD_CODE(code,
2222 static_cast<byte>(WasmOpcodes::LoadStoreOpcodeOf(result, true)),
2223 ZERO_ALIGNMENT, ZERO_OFFSET);
2224
2225 // Return the expected value.
2181 ADD_CODE(code, WASM_I32V_2(kExpected)); 2226 ADD_CODE(code, WASM_I32V_2(kExpected));
2182 size_t end = code.size(); 2227
2183 code.push_back(0); 2228 r.Build(&code[0], &code[0] + code.size());
2184 r.Build(&code[0], &code[end]);
2185 2229
2186 // Run the code. 2230 // Run the code.
2187 for (int t = 0; t < 10; t++) { 2231 for (int t = 0; t < 10; t++) {
2188 module.RandomizeMemory(); 2232 module.RandomizeMemory();
2189 CHECK_EQ(kExpected, r.Call()); 2233 CHECK_EQ(kExpected, r.Call());
2190 2234
2191 int size = WasmOpcodes::MemSize(result); 2235 int size = WasmOpcodes::MemSize(result);
2192 for (int i = 0; i < size; i++) { 2236 for (int i = 0; i < size; i++) {
2193 int base = (which + 1) * kElemSize; 2237 int base = (which + 1) * kElemSize;
2194 byte expected = module.raw_mem_at<byte>(base + i); 2238 byte expected = module.raw_mem_at<byte>(base + i);
(...skipping 14 matching lines...) Expand all
2209 TestSignatures sigs; 2253 TestSignatures sigs;
2210 TestingModule module; 2254 TestingModule module;
2211 WasmFunctionCompiler t1(sigs.i_ii(), &module); 2255 WasmFunctionCompiler t1(sigs.i_ii(), &module);
2212 BUILD(t1, WASM_I32_ADD(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 2256 BUILD(t1, WASM_I32_ADD(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
2213 t1.CompileAndAdd(); 2257 t1.CompileAndAdd();
2214 2258
2215 WasmRunner<int32_t> r(&module, MachineType::Int32()); 2259 WasmRunner<int32_t> r(&module, MachineType::Int32());
2216 byte local = r.AllocateLocal(kAstI32); 2260 byte local = r.AllocateLocal(kAstI32);
2217 BUILD(r, B2(WASM_SET_LOCAL(local, WASM_I8(99)), 2261 BUILD(r, B2(WASM_SET_LOCAL(local, WASM_I8(99)),
2218 WASM_I32_ADD( 2262 WASM_I32_ADD(
2219 WASM_CALL_FUNCTION(t1.function_index_, WASM_GET_LOCAL(0), 2263 WASM_CALL_FUNCTION2(t1.function_index_, WASM_GET_LOCAL(0),
2220 WASM_GET_LOCAL(0)), 2264 WASM_GET_LOCAL(0)),
2221 WASM_CALL_FUNCTION(t1.function_index_, WASM_GET_LOCAL(1), 2265 WASM_CALL_FUNCTION2(t1.function_index_, WASM_GET_LOCAL(1),
2222 WASM_GET_LOCAL(local))))); 2266 WASM_GET_LOCAL(local)))));
2223 2267
2224 CHECK_EQ(198, r.Call(0)); 2268 CHECK_EQ(198, r.Call(0));
2225 CHECK_EQ(200, r.Call(1)); 2269 CHECK_EQ(200, r.Call(1));
2226 CHECK_EQ(100, r.Call(-49)); 2270 CHECK_EQ(100, r.Call(-49));
2227 } 2271 }
2228 2272
2229 TEST(Run_Wasm_CountDown_expr) { 2273 TEST(Run_Wasm_CountDown_expr) {
2230 WasmRunner<int32_t> r(MachineType::Int32()); 2274 WasmRunner<int32_t> r(MachineType::Int32());
2231 BUILD(r, WASM_LOOP( 2275 BUILD(r, WASM_LOOP(
2232 3, WASM_IF(WASM_NOT(WASM_GET_LOCAL(0)), 2276 3, WASM_IF(WASM_NOT(WASM_GET_LOCAL(0)),
2233 WASM_BREAKV(0, WASM_GET_LOCAL(0))), 2277 WASM_BREAKV(1, WASM_GET_LOCAL(0))),
2234 WASM_SET_LOCAL(0, WASM_I32_SUB(WASM_GET_LOCAL(0), WASM_I8(1))), 2278 WASM_SET_LOCAL(0, WASM_I32_SUB(WASM_GET_LOCAL(0), WASM_I8(1))),
2235 WASM_CONTINUE(0))); 2279 WASM_CONTINUE(0)));
2236 CHECK_EQ(0, r.Call(1)); 2280 CHECK_EQ(0, r.Call(1));
2237 CHECK_EQ(0, r.Call(10)); 2281 CHECK_EQ(0, r.Call(10));
2238 CHECK_EQ(0, r.Call(100)); 2282 CHECK_EQ(0, r.Call(100));
2239 } 2283 }
2240 2284
2241 2285
2242 TEST(Run_Wasm_ExprBlock2a) { 2286 TEST(Run_Wasm_ExprBlock2a) {
2243 WasmRunner<int32_t> r(MachineType::Int32()); 2287 WasmRunner<int32_t> r(MachineType::Int32());
2244 BUILD(r, B2(WASM_IF(WASM_GET_LOCAL(0), WASM_BRV(0, WASM_I8(1))), WASM_I8(1))); 2288 BUILD(r, B2(WASM_IF(WASM_GET_LOCAL(0), WASM_BRV(1, WASM_I8(1))), WASM_I8(1)));
2245 CHECK_EQ(1, r.Call(0)); 2289 CHECK_EQ(1, r.Call(0));
2246 CHECK_EQ(1, r.Call(1)); 2290 CHECK_EQ(1, r.Call(1));
2247 } 2291 }
2248 2292
2249 2293
2250 TEST(Run_Wasm_ExprBlock2b) { 2294 TEST(Run_Wasm_ExprBlock2b) {
2251 WasmRunner<int32_t> r(MachineType::Int32()); 2295 WasmRunner<int32_t> r(MachineType::Int32());
2252 BUILD(r, B2(WASM_IF(WASM_GET_LOCAL(0), WASM_BRV(0, WASM_I8(1))), WASM_I8(2))); 2296 BUILD(r, B2(WASM_IF(WASM_GET_LOCAL(0), WASM_BRV(1, WASM_I8(1))), WASM_I8(2)));
2253 CHECK_EQ(2, r.Call(0)); 2297 CHECK_EQ(2, r.Call(0));
2254 CHECK_EQ(1, r.Call(1)); 2298 CHECK_EQ(1, r.Call(1));
2255 } 2299 }
2256 2300
2257 2301
2258 TEST(Run_Wasm_ExprBlock2c) { 2302 TEST(Run_Wasm_ExprBlock2c) {
2259 WasmRunner<int32_t> r(MachineType::Int32()); 2303 WasmRunner<int32_t> r(MachineType::Int32());
2260 BUILD(r, B2(WASM_BRV_IF(0, WASM_I8(1), WASM_GET_LOCAL(0)), WASM_I8(1))); 2304 BUILD(r, B2(WASM_BRV_IF(0, WASM_I8(1), WASM_GET_LOCAL(0)), WASM_I8(1)));
2261 CHECK_EQ(1, r.Call(0)); 2305 CHECK_EQ(1, r.Call(0));
2262 CHECK_EQ(1, r.Call(1)); 2306 CHECK_EQ(1, r.Call(1));
2263 } 2307 }
2264 2308
2265 2309
2266 TEST(Run_Wasm_ExprBlock2d) { 2310 TEST(Run_Wasm_ExprBlock2d) {
2267 WasmRunner<int32_t> r(MachineType::Int32()); 2311 WasmRunner<int32_t> r(MachineType::Int32());
2268 BUILD(r, B2(WASM_BRV_IF(0, WASM_I8(1), WASM_GET_LOCAL(0)), WASM_I8(2))); 2312 BUILD(r, B2(WASM_BRV_IF(0, WASM_I8(1), WASM_GET_LOCAL(0)), WASM_I8(2)));
2269 CHECK_EQ(2, r.Call(0)); 2313 CHECK_EQ(2, r.Call(0));
2270 CHECK_EQ(1, r.Call(1)); 2314 CHECK_EQ(1, r.Call(1));
2271 } 2315 }
2272 2316
2273 2317
2274 TEST(Run_Wasm_ExprBlock_ManualSwitch) { 2318 TEST(Run_Wasm_ExprBlock_ManualSwitch) {
2275 WasmRunner<int32_t> r(MachineType::Int32()); 2319 WasmRunner<int32_t> r(MachineType::Int32());
2276 BUILD(r, WASM_BLOCK(6, WASM_IF(WASM_I32_EQ(WASM_GET_LOCAL(0), WASM_I8(1)), 2320 BUILD(r, WASM_BLOCK(6, WASM_IF(WASM_I32_EQ(WASM_GET_LOCAL(0), WASM_I8(1)),
2277 WASM_BRV(0, WASM_I8(11))), 2321 WASM_BRV(1, WASM_I8(11))),
2278 WASM_IF(WASM_I32_EQ(WASM_GET_LOCAL(0), WASM_I8(2)), 2322 WASM_IF(WASM_I32_EQ(WASM_GET_LOCAL(0), WASM_I8(2)),
2279 WASM_BRV(0, WASM_I8(12))), 2323 WASM_BRV(1, WASM_I8(12))),
2280 WASM_IF(WASM_I32_EQ(WASM_GET_LOCAL(0), WASM_I8(3)), 2324 WASM_IF(WASM_I32_EQ(WASM_GET_LOCAL(0), WASM_I8(3)),
2281 WASM_BRV(0, WASM_I8(13))), 2325 WASM_BRV(1, WASM_I8(13))),
2282 WASM_IF(WASM_I32_EQ(WASM_GET_LOCAL(0), WASM_I8(4)), 2326 WASM_IF(WASM_I32_EQ(WASM_GET_LOCAL(0), WASM_I8(4)),
2283 WASM_BRV(0, WASM_I8(14))), 2327 WASM_BRV(1, WASM_I8(14))),
2284 WASM_IF(WASM_I32_EQ(WASM_GET_LOCAL(0), WASM_I8(5)), 2328 WASM_IF(WASM_I32_EQ(WASM_GET_LOCAL(0), WASM_I8(5)),
2285 WASM_BRV(0, WASM_I8(15))), 2329 WASM_BRV(1, WASM_I8(15))),
2286 WASM_I8(99))); 2330 WASM_I8(99)));
2287 CHECK_EQ(99, r.Call(0)); 2331 CHECK_EQ(99, r.Call(0));
2288 CHECK_EQ(11, r.Call(1)); 2332 CHECK_EQ(11, r.Call(1));
2289 CHECK_EQ(12, r.Call(2)); 2333 CHECK_EQ(12, r.Call(2));
2290 CHECK_EQ(13, r.Call(3)); 2334 CHECK_EQ(13, r.Call(3));
2291 CHECK_EQ(14, r.Call(4)); 2335 CHECK_EQ(14, r.Call(4));
2292 CHECK_EQ(15, r.Call(5)); 2336 CHECK_EQ(15, r.Call(5));
2293 CHECK_EQ(99, r.Call(6)); 2337 CHECK_EQ(99, r.Call(6));
2294 } 2338 }
2295 2339
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
2331 CHECK_EQ(12, r.Call(1, 0)); 2375 CHECK_EQ(12, r.Call(1, 0));
2332 CHECK_EQ(13, r.Call(0, 1)); 2376 CHECK_EQ(13, r.Call(0, 1));
2333 CHECK_EQ(14, r.Call(0, 0)); 2377 CHECK_EQ(14, r.Call(0, 0));
2334 } 2378 }
2335 2379
2336 2380
2337 TEST(Run_Wasm_ExprBlock_if) { 2381 TEST(Run_Wasm_ExprBlock_if) {
2338 WasmRunner<int32_t> r(MachineType::Int32()); 2382 WasmRunner<int32_t> r(MachineType::Int32());
2339 2383
2340 BUILD(r, B1(WASM_IF_ELSE(WASM_GET_LOCAL(0), WASM_BRV(0, WASM_I8(11)), 2384 BUILD(r, B1(WASM_IF_ELSE(WASM_GET_LOCAL(0), WASM_BRV(0, WASM_I8(11)),
2341 WASM_BRV(0, WASM_I8(14))))); 2385 WASM_BRV(1, WASM_I8(14)))));
2342 2386
2343 CHECK_EQ(11, r.Call(1)); 2387 CHECK_EQ(11, r.Call(1));
2344 CHECK_EQ(14, r.Call(0)); 2388 CHECK_EQ(14, r.Call(0));
2345 } 2389 }
2346 2390
2347 2391
2348 TEST(Run_Wasm_ExprBlock_nested_ifs) { 2392 TEST(Run_Wasm_ExprBlock_nested_ifs) {
2349 WasmRunner<int32_t> r(MachineType::Int32(), MachineType::Int32()); 2393 WasmRunner<int32_t> r(MachineType::Int32(), MachineType::Int32());
2350 2394
2351 BUILD(r, WASM_BLOCK( 2395 BUILD(r, WASM_BLOCK(
2352 1, WASM_IF_ELSE( 2396 1, WASM_IF_ELSE(
2353 WASM_GET_LOCAL(0), 2397 WASM_GET_LOCAL(0),
2354 WASM_IF_ELSE(WASM_GET_LOCAL(1), WASM_BRV(0, WASM_I8(11)), 2398 WASM_IF_ELSE(WASM_GET_LOCAL(1), WASM_BRV(0, WASM_I8(11)),
2355 WASM_BRV(0, WASM_I8(12))), 2399 WASM_BRV(1, WASM_I8(12))),
2356 WASM_IF_ELSE(WASM_GET_LOCAL(1), WASM_BRV(0, WASM_I8(13)), 2400 WASM_IF_ELSE(WASM_GET_LOCAL(1), WASM_BRV(0, WASM_I8(13)),
2357 WASM_BRV(0, WASM_I8(14)))))); 2401 WASM_BRV(1, WASM_I8(14))))));
2358
2359 2402
2360 CHECK_EQ(11, r.Call(1, 1)); 2403 CHECK_EQ(11, r.Call(1, 1));
2361 CHECK_EQ(12, r.Call(1, 0)); 2404 CHECK_EQ(12, r.Call(1, 0));
2362 CHECK_EQ(13, r.Call(0, 1)); 2405 CHECK_EQ(13, r.Call(0, 1));
2363 CHECK_EQ(14, r.Call(0, 0)); 2406 CHECK_EQ(14, r.Call(0, 0));
2364 } 2407 }
2365 2408
2366 2409
2367 TEST(Run_Wasm_ExprLoop_nested_ifs) { 2410 TEST(Run_Wasm_ExprLoop_nested_ifs) {
2368 WasmRunner<int32_t> r(MachineType::Int32(), MachineType::Int32()); 2411 WasmRunner<int32_t> r(MachineType::Int32(), MachineType::Int32());
2369 2412
2370 BUILD(r, WASM_LOOP( 2413 BUILD(r, WASM_LOOP(
2371 1, WASM_IF_ELSE( 2414 1, WASM_IF_ELSE(
2372 WASM_GET_LOCAL(0), 2415 WASM_GET_LOCAL(0),
2373 WASM_IF_ELSE(WASM_GET_LOCAL(1), WASM_BRV(1, WASM_I8(11)), 2416 WASM_IF_ELSE(WASM_GET_LOCAL(1), WASM_BRV(1, WASM_I8(11)),
2374 WASM_BRV(1, WASM_I8(12))), 2417 WASM_BRV(3, WASM_I8(12))),
2375 WASM_IF_ELSE(WASM_GET_LOCAL(1), WASM_BRV(1, WASM_I8(13)), 2418 WASM_IF_ELSE(WASM_GET_LOCAL(1), WASM_BRV(1, WASM_I8(13)),
2376 WASM_BRV(1, WASM_I8(14)))))); 2419 WASM_BRV(3, WASM_I8(14))))));
2377
2378 2420
2379 CHECK_EQ(11, r.Call(1, 1)); 2421 CHECK_EQ(11, r.Call(1, 1));
2380 CHECK_EQ(12, r.Call(1, 0)); 2422 CHECK_EQ(12, r.Call(1, 0));
2381 CHECK_EQ(13, r.Call(0, 1)); 2423 CHECK_EQ(13, r.Call(0, 1));
2382 CHECK_EQ(14, r.Call(0, 0)); 2424 CHECK_EQ(14, r.Call(0, 0));
2383 } 2425 }
2384 2426
2385
2386 TEST(Run_Wasm_SimpleCallIndirect) { 2427 TEST(Run_Wasm_SimpleCallIndirect) {
2387 TestSignatures sigs; 2428 TestSignatures sigs;
2388 TestingModule module; 2429 TestingModule module;
2389 2430
2390 WasmFunctionCompiler t1(sigs.i_ii(), &module); 2431 WasmFunctionCompiler t1(sigs.i_ii(), &module);
2391 BUILD(t1, WASM_I32_ADD(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 2432 BUILD(t1, WASM_I32_ADD(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
2392 t1.CompileAndAdd(/*sig_index*/ 1); 2433 t1.CompileAndAdd(/*sig_index*/ 1);
2393 2434
2394 WasmFunctionCompiler t2(sigs.i_ii(), &module); 2435 WasmFunctionCompiler t2(sigs.i_ii(), &module);
2395 BUILD(t2, WASM_I32_SUB(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 2436 BUILD(t2, WASM_I32_SUB(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
2396 t2.CompileAndAdd(/*sig_index*/ 1); 2437 t2.CompileAndAdd(/*sig_index*/ 1);
2397 2438
2398 // Signature table. 2439 // Signature table.
2399 module.AddSignature(sigs.f_ff()); 2440 module.AddSignature(sigs.f_ff());
2400 module.AddSignature(sigs.i_ii()); 2441 module.AddSignature(sigs.i_ii());
2401 module.AddSignature(sigs.d_dd()); 2442 module.AddSignature(sigs.d_dd());
2402 2443
2403 // Function table. 2444 // Function table.
2404 int table[] = {0, 1}; 2445 int table[] = {0, 1};
2405 module.AddIndirectFunctionTable(table, 2); 2446 module.AddIndirectFunctionTable(table, 2);
2406 module.PopulateIndirectFunctionTable(); 2447 module.PopulateIndirectFunctionTable();
2407 2448
2408 // Builder the caller function. 2449 // Builder the caller function.
2409 WasmRunner<int32_t> r(&module, MachineType::Int32()); 2450 WasmRunner<int32_t> r(&module, MachineType::Int32());
2410 BUILD(r, WASM_CALL_INDIRECT(1, WASM_GET_LOCAL(0), WASM_I8(66), WASM_I8(22))); 2451 BUILD(r, WASM_CALL_INDIRECT2(1, WASM_GET_LOCAL(0), WASM_I8(66), WASM_I8(22)));
2411 2452
2412 CHECK_EQ(88, r.Call(0)); 2453 CHECK_EQ(88, r.Call(0));
2413 CHECK_EQ(44, r.Call(1)); 2454 CHECK_EQ(44, r.Call(1));
2414 CHECK_TRAP(r.Call(2)); 2455 CHECK_TRAP(r.Call(2));
2415 } 2456 }
2416 2457
2417 2458
2418 TEST(Run_Wasm_MultipleCallIndirect) { 2459 TEST(Run_Wasm_MultipleCallIndirect) {
2419 TestSignatures sigs; 2460 TestSignatures sigs;
2420 TestingModule module; 2461 TestingModule module;
(...skipping 12 matching lines...) Expand all
2433 module.AddSignature(sigs.d_dd()); 2474 module.AddSignature(sigs.d_dd());
2434 2475
2435 // Function table. 2476 // Function table.
2436 int table[] = {0, 1}; 2477 int table[] = {0, 1};
2437 module.AddIndirectFunctionTable(table, 2); 2478 module.AddIndirectFunctionTable(table, 2);
2438 module.PopulateIndirectFunctionTable(); 2479 module.PopulateIndirectFunctionTable();
2439 2480
2440 // Builder the caller function. 2481 // Builder the caller function.
2441 WasmRunner<int32_t> r(&module, MachineType::Int32(), MachineType::Int32(), 2482 WasmRunner<int32_t> r(&module, MachineType::Int32(), MachineType::Int32(),
2442 MachineType::Int32()); 2483 MachineType::Int32());
2443 BUILD(r, 2484 BUILD(r, WASM_I32_ADD(
2444 WASM_I32_ADD(WASM_CALL_INDIRECT(1, WASM_GET_LOCAL(0), WASM_GET_LOCAL(1), 2485 WASM_CALL_INDIRECT2(1, WASM_GET_LOCAL(0), WASM_GET_LOCAL(1),
2445 WASM_GET_LOCAL(2)), 2486 WASM_GET_LOCAL(2)),
2446 WASM_CALL_INDIRECT(1, WASM_GET_LOCAL(1), WASM_GET_LOCAL(2), 2487 WASM_CALL_INDIRECT2(1, WASM_GET_LOCAL(1), WASM_GET_LOCAL(2),
2447 WASM_GET_LOCAL(0)))); 2488 WASM_GET_LOCAL(0))));
2448 2489
2449 CHECK_EQ(5, r.Call(0, 1, 2)); 2490 CHECK_EQ(5, r.Call(0, 1, 2));
2450 CHECK_EQ(19, r.Call(0, 1, 9)); 2491 CHECK_EQ(19, r.Call(0, 1, 9));
2451 CHECK_EQ(1, r.Call(1, 0, 2)); 2492 CHECK_EQ(1, r.Call(1, 0, 2));
2452 CHECK_EQ(1, r.Call(1, 0, 9)); 2493 CHECK_EQ(1, r.Call(1, 0, 9));
2453 2494
2454 CHECK_TRAP(r.Call(0, 2, 1)); 2495 CHECK_TRAP(r.Call(0, 2, 1));
2455 CHECK_TRAP(r.Call(1, 2, 0)); 2496 CHECK_TRAP(r.Call(1, 2, 0));
2456 CHECK_TRAP(r.Call(2, 0, 1)); 2497 CHECK_TRAP(r.Call(2, 0, 1));
2457 CHECK_TRAP(r.Call(2, 1, 0)); 2498 CHECK_TRAP(r.Call(2, 1, 0));
2458 } 2499 }
2459 2500
2460 TEST(Run_Wasm_CallIndirect_NoTable) { 2501 TEST(Run_Wasm_CallIndirect_NoTable) {
2461 TestSignatures sigs; 2502 TestSignatures sigs;
2462 TestingModule module; 2503 TestingModule module;
2463 2504
2464 // One function. 2505 // One function.
2465 WasmFunctionCompiler t1(sigs.i_ii(), &module); 2506 WasmFunctionCompiler t1(sigs.i_ii(), &module);
2466 BUILD(t1, WASM_I32_ADD(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); 2507 BUILD(t1, WASM_I32_ADD(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)));
2467 t1.CompileAndAdd(/*sig_index*/ 1); 2508 t1.CompileAndAdd(/*sig_index*/ 1);
2468 2509
2469 // Signature table. 2510 // Signature table.
2470 module.AddSignature(sigs.f_ff()); 2511 module.AddSignature(sigs.f_ff());
2471 module.AddSignature(sigs.i_ii()); 2512 module.AddSignature(sigs.i_ii());
2472 2513
2473 // Builder the caller function. 2514 // Builder the caller function.
2474 WasmRunner<int32_t> r(&module, MachineType::Int32()); 2515 WasmRunner<int32_t> r(&module, MachineType::Int32());
2475 BUILD(r, WASM_CALL_INDIRECT(1, WASM_GET_LOCAL(0), WASM_I8(66), WASM_I8(22))); 2516 BUILD(r, WASM_CALL_INDIRECT2(1, WASM_GET_LOCAL(0), WASM_I8(66), WASM_I8(22)));
2476 2517
2477 CHECK_TRAP(r.Call(0)); 2518 CHECK_TRAP(r.Call(0));
2478 CHECK_TRAP(r.Call(1)); 2519 CHECK_TRAP(r.Call(1));
2479 CHECK_TRAP(r.Call(2)); 2520 CHECK_TRAP(r.Call(2));
2480 } 2521 }
2481 2522
2482 TEST(Run_Wasm_F32Floor) { 2523 TEST(Run_Wasm_F32Floor) {
2483 WasmRunner<float> r(MachineType::Float32()); 2524 WasmRunner<float> r(MachineType::Float32());
2484 BUILD(r, WASM_F32_FLOOR(WASM_GET_LOCAL(0))); 2525 BUILD(r, WASM_F32_FLOOR(WASM_GET_LOCAL(0)));
2485 2526
(...skipping 300 matching lines...) Expand 10 before | Expand all | Expand 10 after
2786 TestingModule module; 2827 TestingModule module;
2787 FunctionSig* sig = sigs.many(&zone, kAstStmt, param, num_params); 2828 FunctionSig* sig = sigs.many(&zone, kAstStmt, param, num_params);
2788 2829
2789 module.AddSignature(sig); 2830 module.AddSignature(sig);
2790 module.AddSignature(sig); 2831 module.AddSignature(sig);
2791 module.AddIndirectFunctionTable(nullptr, 0); 2832 module.AddIndirectFunctionTable(nullptr, 0);
2792 2833
2793 WasmFunctionCompiler t(sig, &module); 2834 WasmFunctionCompiler t(sig, &module);
2794 2835
2795 std::vector<byte> code; 2836 std::vector<byte> code;
2796 ADD_CODE(code, kExprCallIndirect, 1);
2797 ADD_CODE(code, kExprI8Const, 0); 2837 ADD_CODE(code, kExprI8Const, 0);
2798 for (byte p = 0; p < num_params; p++) { 2838 for (byte p = 0; p < num_params; p++) {
2799 ADD_CODE(code, kExprGetLocal, p); 2839 ADD_CODE(code, kExprGetLocal, p);
2800 } 2840 }
2841 ADD_CODE(code, kExprCallIndirect, static_cast<byte>(num_params), 1);
2801 2842
2802 t.Build(&code[0], &code[0] + code.size()); 2843 t.Build(&code[0], &code[0] + code.size());
2803 t.Compile(); 2844 t.Compile();
2804 } 2845 }
2805 } 2846 }
2806 2847
2807 2848
2808 TEST(Compile_Wasm_CallIndirect_Many_i32) { CompileCallIndirectMany(kAstI32); } 2849 TEST(Compile_Wasm_CallIndirect_Many_i32) { CompileCallIndirectMany(kAstI32); }
2809 2850
2810 2851
(...skipping 11 matching lines...) Expand all
2822 WasmRunner<int32_t> r(MachineType::Int32(), MachineType::Int32()); 2863 WasmRunner<int32_t> r(MachineType::Int32(), MachineType::Int32());
2823 BUILD(r, WASM_I32_REMS(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)), WASM_ZERO); 2864 BUILD(r, WASM_I32_REMS(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)), WASM_ZERO);
2824 const int32_t kMin = std::numeric_limits<int32_t>::min(); 2865 const int32_t kMin = std::numeric_limits<int32_t>::min();
2825 CHECK_EQ(0, r.Call(133, 100)); 2866 CHECK_EQ(0, r.Call(133, 100));
2826 CHECK_EQ(0, r.Call(kMin, -1)); 2867 CHECK_EQ(0, r.Call(kMin, -1));
2827 CHECK_EQ(0, r.Call(0, 1)); 2868 CHECK_EQ(0, r.Call(0, 1));
2828 CHECK_TRAP(r.Call(100, 0)); 2869 CHECK_TRAP(r.Call(100, 0));
2829 CHECK_TRAP(r.Call(-1001, 0)); 2870 CHECK_TRAP(r.Call(-1001, 0));
2830 CHECK_TRAP(r.Call(kMin, 0)); 2871 CHECK_TRAP(r.Call(kMin, 0));
2831 } 2872 }
OLDNEW
« no previous file with comments | « src/wasm/wasm-opcodes.cc ('k') | test/cctest/wasm/test-run-wasm-64.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698