| 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/base/bits.h" | 9 #include "src/base/bits.h" |
| 10 #include "src/wasm/wasm-macro-gen.h" | 10 #include "src/wasm/wasm-macro-gen.h" |
| (...skipping 1170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1181 REQUIRE(I64LoadStore); | 1181 REQUIRE(I64LoadStore); |
| 1182 REQUIRE(DepthFirst); | 1182 REQUIRE(DepthFirst); |
| 1183 byte loads[] = {kExprI64LoadMem8S, kExprI64LoadMem16S, kExprI64LoadMem32S, | 1183 byte loads[] = {kExprI64LoadMem8S, kExprI64LoadMem16S, kExprI64LoadMem32S, |
| 1184 kExprI64LoadMem}; | 1184 kExprI64LoadMem}; |
| 1185 | 1185 |
| 1186 for (size_t m = 0; m < arraysize(loads); m++) { | 1186 for (size_t m = 0; m < arraysize(loads); m++) { |
| 1187 WasmRunner<int64_t> r(execution_mode); | 1187 WasmRunner<int64_t> r(execution_mode); |
| 1188 byte* memory = r.module().AddMemoryElems<byte>(16); | 1188 byte* memory = r.module().AddMemoryElems<byte>(16); |
| 1189 | 1189 |
| 1190 byte code[] = { | 1190 byte code[] = { |
| 1191 kExprI8Const, 8, // -- | 1191 kExprI32Const, 8, // -- |
| 1192 kExprI8Const, 0, // -- | 1192 kExprI32Const, 0, // -- |
| 1193 loads[m], // -- | 1193 loads[m], // -- |
| 1194 ZERO_ALIGNMENT, // -- | 1194 ZERO_ALIGNMENT, // -- |
| 1195 ZERO_OFFSET, // -- | 1195 ZERO_OFFSET, // -- |
| 1196 kExprI64StoreMem, // -- | 1196 kExprI64StoreMem, // -- |
| 1197 ZERO_ALIGNMENT, // -- | 1197 ZERO_ALIGNMENT, // -- |
| 1198 ZERO_OFFSET, // -- | 1198 ZERO_OFFSET, // -- |
| 1199 kExprI8Const, 0, // -- | 1199 kExprI32Const, 0, // -- |
| 1200 loads[m], // -- | 1200 loads[m], // -- |
| 1201 ZERO_ALIGNMENT, // -- | 1201 ZERO_ALIGNMENT, // -- |
| 1202 ZERO_OFFSET, // -- | 1202 ZERO_OFFSET, // -- |
| 1203 }; | 1203 }; |
| 1204 | 1204 |
| 1205 r.Build(code, code + arraysize(code)); | 1205 r.Build(code, code + arraysize(code)); |
| 1206 | 1206 |
| 1207 // Try a bunch of different negative values. | 1207 // Try a bunch of different negative values. |
| 1208 for (int i = -1; i >= -128; i -= 11) { | 1208 for (int i = -1; i >= -128; i -= 11) { |
| 1209 int size = 1 << m; | 1209 int size = 1 << m; |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1309 CHECK_EQ(expected, r.module().ReadMemory<int64_t>(&memory[0])); | 1309 CHECK_EQ(expected, r.module().ReadMemory<int64_t>(&memory[0])); |
| 1310 } | 1310 } |
| 1311 } | 1311 } |
| 1312 | 1312 |
| 1313 WASM_EXEC_TEST(LoadMemI64) { | 1313 WASM_EXEC_TEST(LoadMemI64) { |
| 1314 REQUIRE(I64LoadStore); | 1314 REQUIRE(I64LoadStore); |
| 1315 WasmRunner<int64_t> r(execution_mode); | 1315 WasmRunner<int64_t> r(execution_mode); |
| 1316 int64_t* memory = r.module().AddMemoryElems<int64_t>(8); | 1316 int64_t* memory = r.module().AddMemoryElems<int64_t>(8); |
| 1317 r.module().RandomizeMemory(1111); | 1317 r.module().RandomizeMemory(1111); |
| 1318 | 1318 |
| 1319 BUILD(r, WASM_LOAD_MEM(MachineType::Int64(), WASM_I8(0))); | 1319 BUILD(r, WASM_LOAD_MEM(MachineType::Int64(), WASM_ZERO)); |
| 1320 | 1320 |
| 1321 r.module().WriteMemory<int64_t>(&memory[0], 0x1abbccdd00112233LL); | 1321 r.module().WriteMemory<int64_t>(&memory[0], 0x1abbccdd00112233LL); |
| 1322 CHECK_EQ(0x1abbccdd00112233LL, r.Call()); | 1322 CHECK_EQ(0x1abbccdd00112233LL, r.Call()); |
| 1323 | 1323 |
| 1324 r.module().WriteMemory<int64_t>(&memory[0], 0x33aabbccdd001122LL); | 1324 r.module().WriteMemory<int64_t>(&memory[0], 0x33aabbccdd001122LL); |
| 1325 CHECK_EQ(0x33aabbccdd001122LL, r.Call()); | 1325 CHECK_EQ(0x33aabbccdd001122LL, r.Call()); |
| 1326 | 1326 |
| 1327 r.module().WriteMemory<int64_t>(&memory[0], 77777777); | 1327 r.module().WriteMemory<int64_t>(&memory[0], 77777777); |
| 1328 CHECK_EQ(77777777, r.Call()); | 1328 CHECK_EQ(77777777, r.Call()); |
| 1329 } | 1329 } |
| 1330 | 1330 |
| 1331 WASM_EXEC_TEST(LoadMemI64_alignment) { | 1331 WASM_EXEC_TEST(LoadMemI64_alignment) { |
| 1332 REQUIRE(I64LoadStore); | 1332 REQUIRE(I64LoadStore); |
| 1333 for (byte alignment = 0; alignment <= 3; alignment++) { | 1333 for (byte alignment = 0; alignment <= 3; alignment++) { |
| 1334 WasmRunner<int64_t> r(execution_mode); | 1334 WasmRunner<int64_t> r(execution_mode); |
| 1335 int64_t* memory = r.module().AddMemoryElems<int64_t>(8); | 1335 int64_t* memory = r.module().AddMemoryElems<int64_t>(8); |
| 1336 r.module().RandomizeMemory(1111); | 1336 r.module().RandomizeMemory(1111); |
| 1337 | 1337 |
| 1338 BUILD(r, | 1338 BUILD(r, |
| 1339 WASM_LOAD_MEM_ALIGNMENT(MachineType::Int64(), WASM_I8(0), alignment)); | 1339 WASM_LOAD_MEM_ALIGNMENT(MachineType::Int64(), WASM_ZERO, alignment)); |
| 1340 | 1340 |
| 1341 r.module().WriteMemory<int64_t>(&memory[0], 0x1abbccdd00112233LL); | 1341 r.module().WriteMemory<int64_t>(&memory[0], 0x1abbccdd00112233LL); |
| 1342 CHECK_EQ(0x1abbccdd00112233LL, r.Call()); | 1342 CHECK_EQ(0x1abbccdd00112233LL, r.Call()); |
| 1343 | 1343 |
| 1344 r.module().WriteMemory<int64_t>(&memory[0], 0x33aabbccdd001122LL); | 1344 r.module().WriteMemory<int64_t>(&memory[0], 0x33aabbccdd001122LL); |
| 1345 CHECK_EQ(0x33aabbccdd001122LL, r.Call()); | 1345 CHECK_EQ(0x33aabbccdd001122LL, r.Call()); |
| 1346 | 1346 |
| 1347 r.module().WriteMemory<int64_t>(&memory[0], 77777777); | 1347 r.module().WriteMemory<int64_t>(&memory[0], 77777777); |
| 1348 CHECK_EQ(77777777, r.Call()); | 1348 CHECK_EQ(77777777, r.Call()); |
| 1349 } | 1349 } |
| 1350 } | 1350 } |
| 1351 | 1351 |
| 1352 WASM_EXEC_TEST(MemI64_Sum) { | 1352 WASM_EXEC_TEST(MemI64_Sum) { |
| 1353 REQUIRE(I64LoadStore); | 1353 REQUIRE(I64LoadStore); |
| 1354 REQUIRE(I64Add); | 1354 REQUIRE(I64Add); |
| 1355 REQUIRE(I64Sub); | 1355 REQUIRE(I64Sub); |
| 1356 REQUIRE(I64Phi); | 1356 REQUIRE(I64Phi); |
| 1357 const int kNumElems = 20; | 1357 const int kNumElems = 20; |
| 1358 WasmRunner<uint64_t, int32_t> r(execution_mode); | 1358 WasmRunner<uint64_t, int32_t> r(execution_mode); |
| 1359 uint64_t* memory = r.module().AddMemoryElems<uint64_t>(kNumElems); | 1359 uint64_t* memory = r.module().AddMemoryElems<uint64_t>(kNumElems); |
| 1360 const byte kSum = r.AllocateLocal(kWasmI64); | 1360 const byte kSum = r.AllocateLocal(kWasmI64); |
| 1361 | 1361 |
| 1362 BUILD( | 1362 BUILD(r, WASM_WHILE( |
| 1363 r, | 1363 WASM_GET_LOCAL(0), |
| 1364 WASM_WHILE( | 1364 WASM_BLOCK( |
| 1365 WASM_GET_LOCAL(0), | 1365 WASM_SET_LOCAL( |
| 1366 WASM_BLOCK( | 1366 kSum, WASM_I64_ADD(WASM_GET_LOCAL(kSum), |
| 1367 WASM_SET_LOCAL(kSum, | |
| 1368 WASM_I64_ADD(WASM_GET_LOCAL(kSum), | |
| 1369 WASM_LOAD_MEM(MachineType::Int64(), | 1367 WASM_LOAD_MEM(MachineType::Int64(), |
| 1370 WASM_GET_LOCAL(0)))), | 1368 WASM_GET_LOCAL(0)))), |
| 1371 WASM_SET_LOCAL(0, WASM_I32_SUB(WASM_GET_LOCAL(0), WASM_I8(8))))), | 1369 WASM_SET_LOCAL( |
| 1372 WASM_GET_LOCAL(1)); | 1370 0, WASM_I32_SUB(WASM_GET_LOCAL(0), WASM_I32V_1(8))))), |
| 1371 WASM_GET_LOCAL(1)); |
| 1373 | 1372 |
| 1374 // Run 4 trials. | 1373 // Run 4 trials. |
| 1375 for (int i = 0; i < 3; i++) { | 1374 for (int i = 0; i < 3; i++) { |
| 1376 r.module().RandomizeMemory(i * 33); | 1375 r.module().RandomizeMemory(i * 33); |
| 1377 uint64_t expected = 0; | 1376 uint64_t expected = 0; |
| 1378 for (size_t j = kNumElems - 1; j > 0; j--) { | 1377 for (size_t j = kNumElems - 1; j > 0; j--) { |
| 1379 expected += r.module().ReadMemory(&memory[j]); | 1378 expected += r.module().ReadMemory(&memory[j]); |
| 1380 } | 1379 } |
| 1381 uint64_t result = r.Call(8 * (kNumElems - 1)); | 1380 uint64_t result = r.Call(8 * (kNumElems - 1)); |
| 1382 CHECK_EQ(expected, result); | 1381 CHECK_EQ(expected, result); |
| (...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1503 r.module().AddSignature(sig); | 1502 r.module().AddSignature(sig); |
| 1504 r.module().AddSignature(sig); | 1503 r.module().AddSignature(sig); |
| 1505 r.module().AddIndirectFunctionTable(nullptr, 0); | 1504 r.module().AddIndirectFunctionTable(nullptr, 0); |
| 1506 | 1505 |
| 1507 WasmFunctionCompiler& t = r.NewFunction(sig); | 1506 WasmFunctionCompiler& t = r.NewFunction(sig); |
| 1508 | 1507 |
| 1509 std::vector<byte> code; | 1508 std::vector<byte> code; |
| 1510 for (byte p = 0; p < num_params; p++) { | 1509 for (byte p = 0; p < num_params; p++) { |
| 1511 ADD_CODE(code, kExprGetLocal, p); | 1510 ADD_CODE(code, kExprGetLocal, p); |
| 1512 } | 1511 } |
| 1513 ADD_CODE(code, kExprI8Const, 0); | 1512 ADD_CODE(code, kExprI32Const, 0); |
| 1514 ADD_CODE(code, kExprCallIndirect, 1, TABLE_ZERO); | 1513 ADD_CODE(code, kExprCallIndirect, 1, TABLE_ZERO); |
| 1515 | 1514 |
| 1516 t.Build(&code[0], &code[0] + code.size()); | 1515 t.Build(&code[0], &code[0] + code.size()); |
| 1517 } | 1516 } |
| 1518 } | 1517 } |
| 1519 | 1518 |
| 1520 TEST(Compile_Wasm_CallIndirect_Many_i64) { CompileCallIndirectMany(kWasmI64); } | 1519 TEST(Compile_Wasm_CallIndirect_Many_i64) { CompileCallIndirectMany(kWasmI64); } |
| 1521 | 1520 |
| 1522 static void Run_WasmMixedCall_N(WasmExecutionMode execution_mode, int start) { | 1521 static void Run_WasmMixedCall_N(WasmExecutionMode execution_mode, int start) { |
| 1523 const int kExpected = 6333; | 1522 const int kExpected = 6333; |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1555 // Build the calling function. | 1554 // Build the calling function. |
| 1556 // ========================================================================= | 1555 // ========================================================================= |
| 1557 std::vector<byte> code; | 1556 std::vector<byte> code; |
| 1558 | 1557 |
| 1559 // Load the offset for the store. | 1558 // Load the offset for the store. |
| 1560 ADD_CODE(code, WASM_ZERO); | 1559 ADD_CODE(code, WASM_ZERO); |
| 1561 | 1560 |
| 1562 // Load the arguments. | 1561 // Load the arguments. |
| 1563 for (int i = 0; i < num_params; i++) { | 1562 for (int i = 0; i < num_params; i++) { |
| 1564 int offset = (i + 1) * kElemSize; | 1563 int offset = (i + 1) * kElemSize; |
| 1565 ADD_CODE(code, WASM_LOAD_MEM(memtypes[i], WASM_I8(offset))); | 1564 ADD_CODE(code, WASM_LOAD_MEM(memtypes[i], WASM_I32V_2(offset))); |
| 1566 } | 1565 } |
| 1567 | 1566 |
| 1568 // Call the selector function. | 1567 // Call the selector function. |
| 1569 ADD_CODE(code, WASM_CALL_FUNCTION0(t.function_index())); | 1568 ADD_CODE(code, WASM_CALL_FUNCTION0(t.function_index())); |
| 1570 | 1569 |
| 1571 // Store the result in memory. | 1570 // Store the result in memory. |
| 1572 ADD_CODE(code, | 1571 ADD_CODE(code, |
| 1573 static_cast<byte>(WasmOpcodes::LoadStoreOpcodeOf(result, true)), | 1572 static_cast<byte>(WasmOpcodes::LoadStoreOpcodeOf(result, true)), |
| 1574 ZERO_ALIGNMENT, ZERO_OFFSET); | 1573 ZERO_ALIGNMENT, ZERO_OFFSET); |
| 1575 | 1574 |
| (...skipping 15 matching lines...) Expand all Loading... |
| 1591 CHECK_EQ(expected, result); | 1590 CHECK_EQ(expected, result); |
| 1592 } | 1591 } |
| 1593 } | 1592 } |
| 1594 } | 1593 } |
| 1595 } | 1594 } |
| 1596 | 1595 |
| 1597 WASM_EXEC_TEST(MixedCall_i64_0) { Run_WasmMixedCall_N(execution_mode, 0); } | 1596 WASM_EXEC_TEST(MixedCall_i64_0) { Run_WasmMixedCall_N(execution_mode, 0); } |
| 1598 WASM_EXEC_TEST(MixedCall_i64_1) { Run_WasmMixedCall_N(execution_mode, 1); } | 1597 WASM_EXEC_TEST(MixedCall_i64_1) { Run_WasmMixedCall_N(execution_mode, 1); } |
| 1599 WASM_EXEC_TEST(MixedCall_i64_2) { Run_WasmMixedCall_N(execution_mode, 2); } | 1598 WASM_EXEC_TEST(MixedCall_i64_2) { Run_WasmMixedCall_N(execution_mode, 2); } |
| 1600 WASM_EXEC_TEST(MixedCall_i64_3) { Run_WasmMixedCall_N(execution_mode, 3); } | 1599 WASM_EXEC_TEST(MixedCall_i64_3) { Run_WasmMixedCall_N(execution_mode, 3); } |
| OLD | NEW |