| 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/platform/elapsed-timer.h" | 9 #include "src/base/platform/elapsed-timer.h" |
| 10 | 10 |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 44 | 44 |
| 45 WASM_EXEC_TEST(Int8Const_fallthru2) { | 45 WASM_EXEC_TEST(Int8Const_fallthru2) { |
| 46 WasmRunner<int32_t> r(execution_mode); | 46 WasmRunner<int32_t> r(execution_mode); |
| 47 const byte kExpectedValue = 123; | 47 const byte kExpectedValue = 123; |
| 48 // -99 kExpectedValue | 48 // -99 kExpectedValue |
| 49 BUILD(r, WASM_I8(-99), WASM_I8(kExpectedValue)); | 49 BUILD(r, WASM_I8(-99), WASM_I8(kExpectedValue)); |
| 50 CHECK_EQ(kExpectedValue, r.Call()); | 50 CHECK_EQ(kExpectedValue, r.Call()); |
| 51 } | 51 } |
| 52 | 52 |
| 53 WASM_EXEC_TEST(Int8Const_all) { | 53 WASM_EXEC_TEST(Int8Const_all) { |
| 54 for (int value = -128; value <= 127; value++) { | 54 for (int value = -128; value <= 127; ++value) { |
| 55 WasmRunner<int32_t> r(execution_mode); | 55 WasmRunner<int32_t> r(execution_mode); |
| 56 // return(value) | 56 // return(value) |
| 57 BUILD(r, WASM_I8(value)); | 57 BUILD(r, WASM_I8(value)); |
| 58 int32_t result = r.Call(); | 58 int32_t result = r.Call(); |
| 59 CHECK_EQ(value, result); | 59 CHECK_EQ(value, result); |
| 60 } | 60 } |
| 61 } | 61 } |
| 62 | 62 |
| 63 WASM_EXEC_TEST(Int32Const) { | 63 WASM_EXEC_TEST(Int32Const) { |
| 64 WasmRunner<int32_t> r(execution_mode); | 64 WasmRunner<int32_t> r(execution_mode); |
| (...skipping 328 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 393 BUILD(r, WASM_I32_REMU(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); | 393 BUILD(r, WASM_I32_REMU(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); |
| 394 CHECK_EQ(17, r.Call(217, 100)); | 394 CHECK_EQ(17, r.Call(217, 100)); |
| 395 const int32_t kMin = std::numeric_limits<int32_t>::min(); | 395 const int32_t kMin = std::numeric_limits<int32_t>::min(); |
| 396 CHECK_TRAP(r.Call(100, 0)); | 396 CHECK_TRAP(r.Call(100, 0)); |
| 397 CHECK_TRAP(r.Call(-1001, 0)); | 397 CHECK_TRAP(r.Call(-1001, 0)); |
| 398 CHECK_TRAP(r.Call(kMin, 0)); | 398 CHECK_TRAP(r.Call(kMin, 0)); |
| 399 CHECK_EQ(kMin, r.Call(kMin, -1)); | 399 CHECK_EQ(kMin, r.Call(kMin, -1)); |
| 400 } | 400 } |
| 401 | 401 |
| 402 WASM_EXEC_TEST(Int32DivS_byzero_const) { | 402 WASM_EXEC_TEST(Int32DivS_byzero_const) { |
| 403 for (int8_t denom = -2; denom < 8; denom++) { | 403 for (int8_t denom = -2; denom < 8; ++denom) { |
| 404 WasmRunner<int32_t> r(execution_mode, MachineType::Int32()); | 404 WasmRunner<int32_t> r(execution_mode, MachineType::Int32()); |
| 405 BUILD(r, WASM_I32_DIVS(WASM_GET_LOCAL(0), WASM_I8(denom))); | 405 BUILD(r, WASM_I32_DIVS(WASM_GET_LOCAL(0), WASM_I8(denom))); |
| 406 for (int32_t val = -7; val < 8; val++) { | 406 for (int32_t val = -7; val < 8; ++val) { |
| 407 if (denom == 0) { | 407 if (denom == 0) { |
| 408 CHECK_TRAP(r.Call(val)); | 408 CHECK_TRAP(r.Call(val)); |
| 409 } else { | 409 } else { |
| 410 CHECK_EQ(val / denom, r.Call(val)); | 410 CHECK_EQ(val / denom, r.Call(val)); |
| 411 } | 411 } |
| 412 } | 412 } |
| 413 } | 413 } |
| 414 } | 414 } |
| 415 | 415 |
| 416 WASM_EXEC_TEST(Int32DivU_byzero_const) { | 416 WASM_EXEC_TEST(Int32DivU_byzero_const) { |
| 417 for (uint32_t denom = 0xfffffffe; denom < 8; denom++) { | 417 for (uint32_t denom = 0xfffffffe; denom < 8; ++denom) { |
| 418 WasmRunner<uint32_t> r(execution_mode, MachineType::Uint32()); | 418 WasmRunner<uint32_t> r(execution_mode, MachineType::Uint32()); |
| 419 BUILD(r, WASM_I32_DIVU(WASM_GET_LOCAL(0), WASM_I32V_1(denom))); | 419 BUILD(r, WASM_I32_DIVU(WASM_GET_LOCAL(0), WASM_I32V_1(denom))); |
| 420 | 420 |
| 421 for (uint32_t val = 0xfffffff0; val < 8; val++) { | 421 for (uint32_t val = 0xfffffff0; val < 8; ++val) { |
| 422 if (denom == 0) { | 422 if (denom == 0) { |
| 423 CHECK_TRAP(r.Call(val)); | 423 CHECK_TRAP(r.Call(val)); |
| 424 } else { | 424 } else { |
| 425 CHECK_EQ(val / denom, r.Call(val)); | 425 CHECK_EQ(val / denom, r.Call(val)); |
| 426 } | 426 } |
| 427 } | 427 } |
| 428 } | 428 } |
| 429 } | 429 } |
| 430 | 430 |
| 431 WASM_EXEC_TEST(Int32DivS_trap_effect) { | 431 WASM_EXEC_TEST(Int32DivS_trap_effect) { |
| (...skipping 452 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 884 WASM_I8(88)); | 884 WASM_I8(88)); |
| 885 CHECK_EQ(86, r.Call(0)); | 885 CHECK_EQ(86, r.Call(0)); |
| 886 CHECK_EQ(87, r.Call(1)); | 886 CHECK_EQ(87, r.Call(1)); |
| 887 CHECK_EQ(88, r.Call(2)); | 887 CHECK_EQ(88, r.Call(2)); |
| 888 CHECK_EQ(85, r.Call(3)); | 888 CHECK_EQ(85, r.Call(3)); |
| 889 CHECK_EQ(85, r.Call(4)); | 889 CHECK_EQ(85, r.Call(4)); |
| 890 CHECK_EQ(85, r.Call(5)); | 890 CHECK_EQ(85, r.Call(5)); |
| 891 } | 891 } |
| 892 | 892 |
| 893 WASM_EXEC_TEST(BrTable4) { | 893 WASM_EXEC_TEST(BrTable4) { |
| 894 for (int i = 0; i < 4; i++) { | 894 for (int i = 0; i < 4; ++i) { |
| 895 for (int t = 0; t < 4; t++) { | 895 for (int t = 0; t < 4; ++t) { |
| 896 uint32_t cases[] = {0, 1, 2, 3}; | 896 uint32_t cases[] = {0, 1, 2, 3}; |
| 897 cases[i] = t; | 897 cases[i] = t; |
| 898 byte code[] = {B2(B2(B2(B2(B1(WASM_BR_TABLE( | 898 byte code[] = {B2(B2(B2(B2(B1(WASM_BR_TABLE( |
| 899 WASM_GET_LOCAL(0), 3, BR_TARGET(cases[0]), | 899 WASM_GET_LOCAL(0), 3, BR_TARGET(cases[0]), |
| 900 BR_TARGET(cases[1]), BR_TARGET(cases[2]), | 900 BR_TARGET(cases[1]), BR_TARGET(cases[2]), |
| 901 BR_TARGET(cases[3]))), | 901 BR_TARGET(cases[3]))), |
| 902 RET_I8(70)), | 902 RET_I8(70)), |
| 903 RET_I8(71)), | 903 RET_I8(71)), |
| 904 RET_I8(72)), | 904 RET_I8(72)), |
| 905 RET_I8(73)), | 905 RET_I8(73)), |
| 906 WASM_I8(75)}; | 906 WASM_I8(75)}; |
| 907 | 907 |
| 908 WasmRunner<int32_t> r(execution_mode, MachineType::Int32()); | 908 WasmRunner<int32_t> r(execution_mode, MachineType::Int32()); |
| 909 r.Build(code, code + arraysize(code)); | 909 r.Build(code, code + arraysize(code)); |
| 910 | 910 |
| 911 for (int x = -3; x < 50; x++) { | 911 for (int x = -3; x < 50; ++x) { |
| 912 int index = (x > 3 || x < 0) ? 3 : x; | 912 int index = (x > 3 || x < 0) ? 3 : x; |
| 913 int32_t expected = 70 + cases[index]; | 913 int32_t expected = 70 + cases[index]; |
| 914 CHECK_EQ(expected, r.Call(x)); | 914 CHECK_EQ(expected, r.Call(x)); |
| 915 } | 915 } |
| 916 } | 916 } |
| 917 } | 917 } |
| 918 } | 918 } |
| 919 | 919 |
| 920 WASM_EXEC_TEST(BrTable4x4) { | 920 WASM_EXEC_TEST(BrTable4x4) { |
| 921 for (byte a = 0; a < 4; a++) { | 921 for (byte a = 0; a < 4; ++a) { |
| 922 for (byte b = 0; b < 4; b++) { | 922 for (byte b = 0; b < 4; ++b) { |
| 923 for (byte c = 0; c < 4; c++) { | 923 for (byte c = 0; c < 4; ++c) { |
| 924 for (byte d = 0; d < 4; d++) { | 924 for (byte d = 0; d < 4; ++d) { |
| 925 for (int i = 0; i < 4; i++) { | 925 for (int i = 0; i < 4; ++i) { |
| 926 uint32_t cases[] = {a, b, c, d}; | 926 uint32_t cases[] = {a, b, c, d}; |
| 927 byte code[] = { | 927 byte code[] = { |
| 928 B2(B2(B2(B2(B1(WASM_BR_TABLE( | 928 B2(B2(B2(B2(B1(WASM_BR_TABLE( |
| 929 WASM_GET_LOCAL(0), 3, BR_TARGET(cases[0]), | 929 WASM_GET_LOCAL(0), 3, BR_TARGET(cases[0]), |
| 930 BR_TARGET(cases[1]), BR_TARGET(cases[2]), | 930 BR_TARGET(cases[1]), BR_TARGET(cases[2]), |
| 931 BR_TARGET(cases[3]))), | 931 BR_TARGET(cases[3]))), |
| 932 RET_I8(50)), | 932 RET_I8(50)), |
| 933 RET_I8(51)), | 933 RET_I8(51)), |
| 934 RET_I8(52)), | 934 RET_I8(52)), |
| 935 RET_I8(53)), | 935 RET_I8(53)), |
| 936 WASM_I8(55)}; | 936 WASM_I8(55)}; |
| 937 | 937 |
| 938 WasmRunner<int32_t> r(execution_mode, MachineType::Int32()); | 938 WasmRunner<int32_t> r(execution_mode, MachineType::Int32()); |
| 939 r.Build(code, code + arraysize(code)); | 939 r.Build(code, code + arraysize(code)); |
| 940 | 940 |
| 941 for (int x = -6; x < 47; x++) { | 941 for (int x = -6; x < 47; ++x) { |
| 942 int index = (x > 3 || x < 0) ? 3 : x; | 942 int index = (x > 3 || x < 0) ? 3 : x; |
| 943 int32_t expected = 50 + cases[index]; | 943 int32_t expected = 50 + cases[index]; |
| 944 CHECK_EQ(expected, r.Call(x)); | 944 CHECK_EQ(expected, r.Call(x)); |
| 945 } | 945 } |
| 946 } | 946 } |
| 947 } | 947 } |
| 948 } | 948 } |
| 949 } | 949 } |
| 950 } | 950 } |
| 951 } | 951 } |
| (...skipping 363 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1315 memory[0] = 88888888; | 1315 memory[0] = 88888888; |
| 1316 CHECK_EQ(88888888, r.Call(0)); | 1316 CHECK_EQ(88888888, r.Call(0)); |
| 1317 | 1317 |
| 1318 memory[0] = 77777777; | 1318 memory[0] = 77777777; |
| 1319 CHECK_EQ(77777777, r.Call(0)); | 1319 CHECK_EQ(77777777, r.Call(0)); |
| 1320 } | 1320 } |
| 1321 | 1321 |
| 1322 WASM_EXEC_TEST(LoadMemI32_alignment) { | 1322 WASM_EXEC_TEST(LoadMemI32_alignment) { |
| 1323 TestingModule module(execution_mode); | 1323 TestingModule module(execution_mode); |
| 1324 int32_t* memory = module.AddMemoryElems<int32_t>(8); | 1324 int32_t* memory = module.AddMemoryElems<int32_t>(8); |
| 1325 for (byte alignment = 0; alignment <= 2; alignment++) { | 1325 for (byte alignment = 0; alignment <= 2; ++alignment) { |
| 1326 WasmRunner<int32_t> r(&module, MachineType::Int32()); | 1326 WasmRunner<int32_t> r(&module, MachineType::Int32()); |
| 1327 module.RandomizeMemory(1111); | 1327 module.RandomizeMemory(1111); |
| 1328 | 1328 |
| 1329 BUILD(r, | 1329 BUILD(r, |
| 1330 WASM_LOAD_MEM_ALIGNMENT(MachineType::Int32(), WASM_I8(0), alignment)); | 1330 WASM_LOAD_MEM_ALIGNMENT(MachineType::Int32(), WASM_I8(0), alignment)); |
| 1331 | 1331 |
| 1332 memory[0] = 0x1a2b3c4d; | 1332 memory[0] = 0x1a2b3c4d; |
| 1333 CHECK_EQ(0x1a2b3c4d, r.Call(0)); | 1333 CHECK_EQ(0x1a2b3c4d, r.Call(0)); |
| 1334 | 1334 |
| 1335 memory[0] = 0x5e6f7a8b; | 1335 memory[0] = 0x5e6f7a8b; |
| 1336 CHECK_EQ(0x5e6f7a8b, r.Call(0)); | 1336 CHECK_EQ(0x5e6f7a8b, r.Call(0)); |
| 1337 | 1337 |
| 1338 memory[0] = 0x9ca0b1c2; | 1338 memory[0] = 0x9ca0b1c2; |
| 1339 CHECK_EQ(0x9ca0b1c2, r.Call(0)); | 1339 CHECK_EQ(0x9ca0b1c2, r.Call(0)); |
| 1340 } | 1340 } |
| 1341 } | 1341 } |
| 1342 | 1342 |
| 1343 WASM_EXEC_TEST(LoadMemI32_oob) { | 1343 WASM_EXEC_TEST(LoadMemI32_oob) { |
| 1344 TestingModule module(execution_mode); | 1344 TestingModule module(execution_mode); |
| 1345 int32_t* memory = module.AddMemoryElems<int32_t>(8); | 1345 int32_t* memory = module.AddMemoryElems<int32_t>(8); |
| 1346 WasmRunner<int32_t> r(&module, MachineType::Uint32()); | 1346 WasmRunner<int32_t> r(&module, MachineType::Uint32()); |
| 1347 module.RandomizeMemory(1111); | 1347 module.RandomizeMemory(1111); |
| 1348 | 1348 |
| 1349 BUILD(r, WASM_LOAD_MEM(MachineType::Int32(), WASM_GET_LOCAL(0))); | 1349 BUILD(r, WASM_LOAD_MEM(MachineType::Int32(), WASM_GET_LOCAL(0))); |
| 1350 | 1350 |
| 1351 memory[0] = 88888888; | 1351 memory[0] = 88888888; |
| 1352 CHECK_EQ(88888888, r.Call(0u)); | 1352 CHECK_EQ(88888888, r.Call(0u)); |
| 1353 for (uint32_t offset = 29; offset < 40; offset++) { | 1353 for (uint32_t offset = 29; offset < 40; ++offset) { |
| 1354 CHECK_TRAP(r.Call(offset)); | 1354 CHECK_TRAP(r.Call(offset)); |
| 1355 } | 1355 } |
| 1356 | 1356 |
| 1357 for (uint32_t offset = 0x80000000; offset < 0x80000010; offset++) { | 1357 for (uint32_t offset = 0x80000000; offset < 0x80000010; ++offset) { |
| 1358 CHECK_TRAP(r.Call(offset)); | 1358 CHECK_TRAP(r.Call(offset)); |
| 1359 } | 1359 } |
| 1360 } | 1360 } |
| 1361 | 1361 |
| 1362 WASM_EXEC_TEST(LoadMem_offset_oob) { | 1362 WASM_EXEC_TEST(LoadMem_offset_oob) { |
| 1363 TestingModule module(execution_mode); | 1363 TestingModule module(execution_mode); |
| 1364 module.AddMemoryElems<int32_t>(8); | 1364 module.AddMemoryElems<int32_t>(8); |
| 1365 | 1365 |
| 1366 static const MachineType machineTypes[] = { | 1366 static const MachineType machineTypes[] = { |
| 1367 MachineType::Int8(), MachineType::Uint8(), MachineType::Int16(), | 1367 MachineType::Int8(), MachineType::Uint8(), MachineType::Int16(), |
| 1368 MachineType::Uint16(), MachineType::Int32(), MachineType::Uint32(), | 1368 MachineType::Uint16(), MachineType::Int32(), MachineType::Uint32(), |
| 1369 MachineType::Int64(), MachineType::Uint64(), MachineType::Float32(), | 1369 MachineType::Int64(), MachineType::Uint64(), MachineType::Float32(), |
| 1370 MachineType::Float64()}; | 1370 MachineType::Float64()}; |
| 1371 | 1371 |
| 1372 for (size_t m = 0; m < arraysize(machineTypes); m++) { | 1372 for (size_t m = 0; m < arraysize(machineTypes); ++m) { |
| 1373 module.RandomizeMemory(1116 + static_cast<int>(m)); | 1373 module.RandomizeMemory(1116 + static_cast<int>(m)); |
| 1374 WasmRunner<int32_t> r(&module, MachineType::Uint32()); | 1374 WasmRunner<int32_t> r(&module, MachineType::Uint32()); |
| 1375 uint32_t boundary = 24 - WasmOpcodes::MemSize(machineTypes[m]); | 1375 uint32_t boundary = 24 - WasmOpcodes::MemSize(machineTypes[m]); |
| 1376 | 1376 |
| 1377 BUILD(r, WASM_LOAD_MEM_OFFSET(machineTypes[m], 8, WASM_GET_LOCAL(0)), | 1377 BUILD(r, WASM_LOAD_MEM_OFFSET(machineTypes[m], 8, WASM_GET_LOCAL(0)), |
| 1378 WASM_ZERO); | 1378 WASM_ZERO); |
| 1379 | 1379 |
| 1380 CHECK_EQ(0, r.Call(boundary)); // in bounds. | 1380 CHECK_EQ(0, r.Call(boundary)); // in bounds. |
| 1381 | 1381 |
| 1382 for (uint32_t offset = boundary + 1; offset < boundary + 19; offset++) { | 1382 for (uint32_t offset = boundary + 1; offset < boundary + 19; ++offset) { |
| 1383 CHECK_TRAP(r.Call(offset)); // out of bounds. | 1383 CHECK_TRAP(r.Call(offset)); // out of bounds. |
| 1384 } | 1384 } |
| 1385 } | 1385 } |
| 1386 } | 1386 } |
| 1387 | 1387 |
| 1388 WASM_EXEC_TEST(LoadMemI32_offset) { | 1388 WASM_EXEC_TEST(LoadMemI32_offset) { |
| 1389 TestingModule module(execution_mode); | 1389 TestingModule module(execution_mode); |
| 1390 int32_t* memory = module.AddMemoryElems<int32_t>(4); | 1390 int32_t* memory = module.AddMemoryElems<int32_t>(4); |
| 1391 WasmRunner<int32_t> r(&module, MachineType::Int32()); | 1391 WasmRunner<int32_t> r(&module, MachineType::Int32()); |
| 1392 module.RandomizeMemory(1111); | 1392 module.RandomizeMemory(1111); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 1406 memory[2] = 33333333; | 1406 memory[2] = 33333333; |
| 1407 memory[3] = 44444444; | 1407 memory[3] = 44444444; |
| 1408 CHECK_EQ(22222222, r.Call(0)); | 1408 CHECK_EQ(22222222, r.Call(0)); |
| 1409 CHECK_EQ(33333333, r.Call(4)); | 1409 CHECK_EQ(33333333, r.Call(4)); |
| 1410 CHECK_EQ(44444444, r.Call(8)); | 1410 CHECK_EQ(44444444, r.Call(8)); |
| 1411 } | 1411 } |
| 1412 | 1412 |
| 1413 WASM_EXEC_TEST(LoadMemI32_const_oob_misaligned) { | 1413 WASM_EXEC_TEST(LoadMemI32_const_oob_misaligned) { |
| 1414 const int kMemSize = 12; | 1414 const int kMemSize = 12; |
| 1415 // TODO(titzer): Fix misaligned accesses on MIPS and re-enable. | 1415 // TODO(titzer): Fix misaligned accesses on MIPS and re-enable. |
| 1416 for (int offset = 0; offset < kMemSize + 5; offset++) { | 1416 for (int offset = 0; offset < kMemSize + 5; ++offset) { |
| 1417 for (int index = 0; index < kMemSize + 5; index++) { | 1417 for (int index = 0; index < kMemSize + 5; ++index) { |
| 1418 TestingModule module(execution_mode); | 1418 TestingModule module(execution_mode); |
| 1419 module.AddMemoryElems<byte>(kMemSize); | 1419 module.AddMemoryElems<byte>(kMemSize); |
| 1420 | 1420 |
| 1421 WasmRunner<int32_t> r(&module); | 1421 WasmRunner<int32_t> r(&module); |
| 1422 module.RandomizeMemory(); | 1422 module.RandomizeMemory(); |
| 1423 | 1423 |
| 1424 BUILD(r, | 1424 BUILD(r, |
| 1425 WASM_LOAD_MEM_OFFSET(MachineType::Int32(), offset, WASM_I8(index))); | 1425 WASM_LOAD_MEM_OFFSET(MachineType::Int32(), offset, WASM_I8(index))); |
| 1426 | 1426 |
| 1427 if ((offset + index) <= (kMemSize - sizeof(int32_t))) { | 1427 if ((offset + index) <= (kMemSize - sizeof(int32_t))) { |
| (...skipping 25 matching lines...) Expand all Loading... |
| 1453 } | 1453 } |
| 1454 } | 1454 } |
| 1455 } | 1455 } |
| 1456 } | 1456 } |
| 1457 | 1457 |
| 1458 WASM_EXEC_TEST(StoreMemI32_alignment) { | 1458 WASM_EXEC_TEST(StoreMemI32_alignment) { |
| 1459 TestingModule module(execution_mode); | 1459 TestingModule module(execution_mode); |
| 1460 int32_t* memory = module.AddMemoryElems<int32_t>(4); | 1460 int32_t* memory = module.AddMemoryElems<int32_t>(4); |
| 1461 const int32_t kWritten = 0x12345678; | 1461 const int32_t kWritten = 0x12345678; |
| 1462 | 1462 |
| 1463 for (byte i = 0; i <= 2; i++) { | 1463 for (byte i = 0; i <= 2; ++i) { |
| 1464 WasmRunner<int32_t> r(&module, MachineType::Int32()); | 1464 WasmRunner<int32_t> r(&module, MachineType::Int32()); |
| 1465 BUILD(r, WASM_STORE_MEM_ALIGNMENT(MachineType::Int32(), WASM_ZERO, i, | 1465 BUILD(r, WASM_STORE_MEM_ALIGNMENT(MachineType::Int32(), WASM_ZERO, i, |
| 1466 WASM_GET_LOCAL(0))); | 1466 WASM_GET_LOCAL(0))); |
| 1467 module.RandomizeMemory(1111); | 1467 module.RandomizeMemory(1111); |
| 1468 memory[0] = 0; | 1468 memory[0] = 0; |
| 1469 | 1469 |
| 1470 CHECK_EQ(kWritten, r.Call(kWritten)); | 1470 CHECK_EQ(kWritten, r.Call(kWritten)); |
| 1471 CHECK_EQ(kWritten, memory[0]); | 1471 CHECK_EQ(kWritten, memory[0]); |
| 1472 } | 1472 } |
| 1473 } | 1473 } |
| 1474 | 1474 |
| 1475 WASM_EXEC_TEST(StoreMemI32_offset) { | 1475 WASM_EXEC_TEST(StoreMemI32_offset) { |
| 1476 TestingModule module(execution_mode); | 1476 TestingModule module(execution_mode); |
| 1477 int32_t* memory = module.AddMemoryElems<int32_t>(4); | 1477 int32_t* memory = module.AddMemoryElems<int32_t>(4); |
| 1478 WasmRunner<int32_t> r(&module, MachineType::Int32()); | 1478 WasmRunner<int32_t> r(&module, MachineType::Int32()); |
| 1479 const int32_t kWritten = 0xaabbccdd; | 1479 const int32_t kWritten = 0xaabbccdd; |
| 1480 | 1480 |
| 1481 BUILD(r, WASM_STORE_MEM_OFFSET(MachineType::Int32(), 4, WASM_GET_LOCAL(0), | 1481 BUILD(r, WASM_STORE_MEM_OFFSET(MachineType::Int32(), 4, WASM_GET_LOCAL(0), |
| 1482 WASM_I32V_5(kWritten))); | 1482 WASM_I32V_5(kWritten))); |
| 1483 | 1483 |
| 1484 for (int i = 0; i < 2; i++) { | 1484 for (int i = 0; i < 2; ++i) { |
| 1485 module.RandomizeMemory(1111); | 1485 module.RandomizeMemory(1111); |
| 1486 memory[0] = 66666666; | 1486 memory[0] = 66666666; |
| 1487 memory[1] = 77777777; | 1487 memory[1] = 77777777; |
| 1488 memory[2] = 88888888; | 1488 memory[2] = 88888888; |
| 1489 memory[3] = 99999999; | 1489 memory[3] = 99999999; |
| 1490 CHECK_EQ(kWritten, r.Call(i * 4)); | 1490 CHECK_EQ(kWritten, r.Call(i * 4)); |
| 1491 CHECK_EQ(66666666, memory[0]); | 1491 CHECK_EQ(66666666, memory[0]); |
| 1492 CHECK_EQ(i == 0 ? kWritten : 77777777, memory[1]); | 1492 CHECK_EQ(i == 0 ? kWritten : 77777777, memory[1]); |
| 1493 CHECK_EQ(i == 1 ? kWritten : 88888888, memory[2]); | 1493 CHECK_EQ(i == 1 ? kWritten : 88888888, memory[2]); |
| 1494 CHECK_EQ(i == 2 ? kWritten : 99999999, memory[3]); | 1494 CHECK_EQ(i == 2 ? kWritten : 99999999, memory[3]); |
| 1495 } | 1495 } |
| 1496 } | 1496 } |
| 1497 | 1497 |
| 1498 WASM_EXEC_TEST(StoreMem_offset_oob) { | 1498 WASM_EXEC_TEST(StoreMem_offset_oob) { |
| 1499 TestingModule module(execution_mode); | 1499 TestingModule module(execution_mode); |
| 1500 byte* memory = module.AddMemoryElems<byte>(32); | 1500 byte* memory = module.AddMemoryElems<byte>(32); |
| 1501 | 1501 |
| 1502 // 64-bit cases are handled in test-run-wasm-64.cc | 1502 // 64-bit cases are handled in test-run-wasm-64.cc |
| 1503 static const MachineType machineTypes[] = { | 1503 static const MachineType machineTypes[] = { |
| 1504 MachineType::Int8(), MachineType::Uint8(), MachineType::Int16(), | 1504 MachineType::Int8(), MachineType::Uint8(), MachineType::Int16(), |
| 1505 MachineType::Uint16(), MachineType::Int32(), MachineType::Uint32(), | 1505 MachineType::Uint16(), MachineType::Int32(), MachineType::Uint32(), |
| 1506 MachineType::Float32(), MachineType::Float64()}; | 1506 MachineType::Float32(), MachineType::Float64()}; |
| 1507 | 1507 |
| 1508 for (size_t m = 0; m < arraysize(machineTypes); m++) { | 1508 for (size_t m = 0; m < arraysize(machineTypes); ++m) { |
| 1509 module.RandomizeMemory(1119 + static_cast<int>(m)); | 1509 module.RandomizeMemory(1119 + static_cast<int>(m)); |
| 1510 WasmRunner<int32_t> r(&module, MachineType::Uint32()); | 1510 WasmRunner<int32_t> r(&module, MachineType::Uint32()); |
| 1511 | 1511 |
| 1512 BUILD(r, WASM_STORE_MEM_OFFSET(machineTypes[m], 8, WASM_GET_LOCAL(0), | 1512 BUILD(r, WASM_STORE_MEM_OFFSET(machineTypes[m], 8, WASM_GET_LOCAL(0), |
| 1513 WASM_LOAD_MEM(machineTypes[m], WASM_ZERO)), | 1513 WASM_LOAD_MEM(machineTypes[m], WASM_ZERO)), |
| 1514 WASM_ZERO); | 1514 WASM_ZERO); |
| 1515 | 1515 |
| 1516 byte memsize = WasmOpcodes::MemSize(machineTypes[m]); | 1516 byte memsize = WasmOpcodes::MemSize(machineTypes[m]); |
| 1517 uint32_t boundary = 24 - memsize; | 1517 uint32_t boundary = 24 - memsize; |
| 1518 CHECK_EQ(0, r.Call(boundary)); // in bounds. | 1518 CHECK_EQ(0, r.Call(boundary)); // in bounds. |
| 1519 CHECK_EQ(0, memcmp(&memory[0], &memory[8 + boundary], memsize)); | 1519 CHECK_EQ(0, memcmp(&memory[0], &memory[8 + boundary], memsize)); |
| 1520 | 1520 |
| 1521 for (uint32_t offset = boundary + 1; offset < boundary + 19; offset++) { | 1521 for (uint32_t offset = boundary + 1; offset < boundary + 19; ++offset) { |
| 1522 CHECK_TRAP(r.Call(offset)); // out of bounds. | 1522 CHECK_TRAP(r.Call(offset)); // out of bounds. |
| 1523 } | 1523 } |
| 1524 } | 1524 } |
| 1525 } | 1525 } |
| 1526 | 1526 |
| 1527 WASM_EXEC_TEST(LoadMemI32_P) { | 1527 WASM_EXEC_TEST(LoadMemI32_P) { |
| 1528 const int kNumElems = 8; | 1528 const int kNumElems = 8; |
| 1529 TestingModule module(execution_mode); | 1529 TestingModule module(execution_mode); |
| 1530 int32_t* memory = module.AddMemoryElems<int32_t>(kNumElems); | 1530 int32_t* memory = module.AddMemoryElems<int32_t>(kNumElems); |
| 1531 WasmRunner<int32_t> r(&module, MachineType::Int32()); | 1531 WasmRunner<int32_t> r(&module, MachineType::Int32()); |
| 1532 module.RandomizeMemory(2222); | 1532 module.RandomizeMemory(2222); |
| 1533 | 1533 |
| 1534 BUILD(r, WASM_LOAD_MEM(MachineType::Int32(), WASM_GET_LOCAL(0))); | 1534 BUILD(r, WASM_LOAD_MEM(MachineType::Int32(), WASM_GET_LOCAL(0))); |
| 1535 | 1535 |
| 1536 for (int i = 0; i < kNumElems; i++) { | 1536 for (int i = 0; i < kNumElems; ++i) { |
| 1537 CHECK_EQ(memory[i], r.Call(i * 4)); | 1537 CHECK_EQ(memory[i], r.Call(i * 4)); |
| 1538 } | 1538 } |
| 1539 } | 1539 } |
| 1540 | 1540 |
| 1541 WASM_EXEC_TEST(MemI32_Sum) { | 1541 WASM_EXEC_TEST(MemI32_Sum) { |
| 1542 const int kNumElems = 20; | 1542 const int kNumElems = 20; |
| 1543 TestingModule module(execution_mode); | 1543 TestingModule module(execution_mode); |
| 1544 uint32_t* memory = module.AddMemoryElems<uint32_t>(kNumElems); | 1544 uint32_t* memory = module.AddMemoryElems<uint32_t>(kNumElems); |
| 1545 WasmRunner<uint32_t> r(&module, MachineType::Int32()); | 1545 WasmRunner<uint32_t> r(&module, MachineType::Int32()); |
| 1546 const byte kSum = r.AllocateLocal(kAstI32); | 1546 const byte kSum = r.AllocateLocal(kAstI32); |
| 1547 | 1547 |
| 1548 BUILD(r, WASM_BLOCK( | 1548 BUILD(r, WASM_BLOCK( |
| 1549 2, WASM_WHILE( | 1549 2, WASM_WHILE( |
| 1550 WASM_GET_LOCAL(0), | 1550 WASM_GET_LOCAL(0), |
| 1551 WASM_BLOCK( | 1551 WASM_BLOCK( |
| 1552 2, WASM_SET_LOCAL( | 1552 2, WASM_SET_LOCAL( |
| 1553 kSum, WASM_I32_ADD( | 1553 kSum, WASM_I32_ADD( |
| 1554 WASM_GET_LOCAL(kSum), | 1554 WASM_GET_LOCAL(kSum), |
| 1555 WASM_LOAD_MEM(MachineType::Int32(), | 1555 WASM_LOAD_MEM(MachineType::Int32(), |
| 1556 WASM_GET_LOCAL(0)))), | 1556 WASM_GET_LOCAL(0)))), |
| 1557 WASM_SET_LOCAL( | 1557 WASM_SET_LOCAL( |
| 1558 0, WASM_I32_SUB(WASM_GET_LOCAL(0), WASM_I8(4))))), | 1558 0, WASM_I32_SUB(WASM_GET_LOCAL(0), WASM_I8(4))))), |
| 1559 WASM_GET_LOCAL(1))); | 1559 WASM_GET_LOCAL(1))); |
| 1560 | 1560 |
| 1561 // Run 4 trials. | 1561 // Run 4 trials. |
| 1562 for (int i = 0; i < 3; i++) { | 1562 for (int i = 0; i < 3; ++i) { |
| 1563 module.RandomizeMemory(i * 33); | 1563 module.RandomizeMemory(i * 33); |
| 1564 uint32_t expected = 0; | 1564 uint32_t expected = 0; |
| 1565 for (size_t j = kNumElems - 1; j > 0; j--) { | 1565 for (size_t j = kNumElems - 1; j > 0; --j) { |
| 1566 expected += memory[j]; | 1566 expected += memory[j]; |
| 1567 } | 1567 } |
| 1568 uint32_t result = r.Call(static_cast<int>(4 * (kNumElems - 1))); | 1568 uint32_t result = r.Call(4 * (kNumElems - 1)); |
| 1569 CHECK_EQ(expected, result); | 1569 CHECK_EQ(expected, result); |
| 1570 } | 1570 } |
| 1571 } | 1571 } |
| 1572 | 1572 |
| 1573 WASM_EXEC_TEST(CheckMachIntsZero) { | 1573 WASM_EXEC_TEST(CheckMachIntsZero) { |
| 1574 const int kNumElems = 55; | 1574 const int kNumElems = 55; |
| 1575 TestingModule module(execution_mode); | 1575 TestingModule module(execution_mode); |
| 1576 module.AddMemoryElems<uint32_t>(kNumElems); | 1576 module.AddMemoryElems<uint32_t>(kNumElems); |
| 1577 WasmRunner<uint32_t> r(&module, MachineType::Int32()); | 1577 WasmRunner<uint32_t> r(&module, MachineType::Int32()); |
| 1578 | 1578 |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1613 WASM_GET_LOCAL(kSum)), | 1613 WASM_GET_LOCAL(kSum)), |
| 1614 WASM_GET_LOCAL(0))); | 1614 WASM_GET_LOCAL(0))); |
| 1615 | 1615 |
| 1616 CHECK_EQ(0, r.Call(4 * (kSize - 1))); | 1616 CHECK_EQ(0, r.Call(4 * (kSize - 1))); |
| 1617 CHECK_NE(-99.25, buffer[0]); | 1617 CHECK_NE(-99.25, buffer[0]); |
| 1618 CHECK_EQ(71256.0f, buffer[0]); | 1618 CHECK_EQ(71256.0f, buffer[0]); |
| 1619 } | 1619 } |
| 1620 | 1620 |
| 1621 template <typename T> | 1621 template <typename T> |
| 1622 T GenerateAndRunFold(WasmExecutionMode execution_mode, WasmOpcode binop, | 1622 T GenerateAndRunFold(WasmExecutionMode execution_mode, WasmOpcode binop, |
| 1623 T* buffer, size_t size, LocalType astType, | 1623 T* buffer, uint32_t size, LocalType astType, |
| 1624 MachineType memType) { | 1624 MachineType memType) { |
| 1625 TestingModule module(execution_mode); | 1625 TestingModule module(execution_mode); |
| 1626 module.AddMemoryElems<T>(size); | 1626 module.AddMemoryElems<T>(size); |
| 1627 for (size_t i = 0; i < size; i++) { | 1627 for (uint32_t i = 0; i < size; ++i) { |
| 1628 module.raw_mem_start<T>()[i] = buffer[i]; | 1628 module.raw_mem_start<T>()[i] = buffer[i]; |
| 1629 } | 1629 } |
| 1630 WasmRunner<int32_t> r(&module, MachineType::Int32()); | 1630 WasmRunner<int32_t> r(&module, MachineType::Int32()); |
| 1631 const byte kAccum = r.AllocateLocal(astType); | 1631 const byte kAccum = r.AllocateLocal(astType); |
| 1632 | 1632 |
| 1633 BUILD( | 1633 BUILD( |
| 1634 r, | 1634 r, |
| 1635 WASM_BLOCK( | 1635 WASM_BLOCK( |
| 1636 4, WASM_SET_LOCAL(kAccum, WASM_LOAD_MEM(memType, WASM_ZERO)), | 1636 4, WASM_SET_LOCAL(kAccum, WASM_LOAD_MEM(memType, WASM_ZERO)), |
| 1637 WASM_WHILE( | 1637 WASM_WHILE( |
| (...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1781 | 1781 |
| 1782 WASM_EXEC_TEST(Int32LoadInt8_signext) { | 1782 WASM_EXEC_TEST(Int32LoadInt8_signext) { |
| 1783 TestingModule module(execution_mode); | 1783 TestingModule module(execution_mode); |
| 1784 const int kNumElems = 16; | 1784 const int kNumElems = 16; |
| 1785 int8_t* memory = module.AddMemoryElems<int8_t>(kNumElems); | 1785 int8_t* memory = module.AddMemoryElems<int8_t>(kNumElems); |
| 1786 module.RandomizeMemory(); | 1786 module.RandomizeMemory(); |
| 1787 memory[0] = -1; | 1787 memory[0] = -1; |
| 1788 WasmRunner<int32_t> r(&module, MachineType::Int32()); | 1788 WasmRunner<int32_t> r(&module, MachineType::Int32()); |
| 1789 BUILD(r, WASM_LOAD_MEM(MachineType::Int8(), WASM_GET_LOCAL(0))); | 1789 BUILD(r, WASM_LOAD_MEM(MachineType::Int8(), WASM_GET_LOCAL(0))); |
| 1790 | 1790 |
| 1791 for (size_t i = 0; i < kNumElems; i++) { | 1791 for (int i = 0; i < kNumElems; ++i) { |
| 1792 CHECK_EQ(memory[i], r.Call(static_cast<int>(i))); | 1792 CHECK_EQ(memory[i], r.Call(i)); |
| 1793 } | 1793 } |
| 1794 } | 1794 } |
| 1795 | 1795 |
| 1796 WASM_EXEC_TEST(Int32LoadInt8_zeroext) { | 1796 WASM_EXEC_TEST(Int32LoadInt8_zeroext) { |
| 1797 TestingModule module(execution_mode); | 1797 TestingModule module(execution_mode); |
| 1798 const int kNumElems = 16; | 1798 const int kNumElems = 16; |
| 1799 byte* memory = module.AddMemory(kNumElems); | 1799 byte* memory = module.AddMemory(kNumElems); |
| 1800 module.RandomizeMemory(77); | 1800 module.RandomizeMemory(77); |
| 1801 memory[0] = 255; | 1801 memory[0] = 255; |
| 1802 WasmRunner<int32_t> r(&module, MachineType::Int32()); | 1802 WasmRunner<int32_t> r(&module, MachineType::Int32()); |
| 1803 BUILD(r, WASM_LOAD_MEM(MachineType::Uint8(), WASM_GET_LOCAL(0))); | 1803 BUILD(r, WASM_LOAD_MEM(MachineType::Uint8(), WASM_GET_LOCAL(0))); |
| 1804 | 1804 |
| 1805 for (size_t i = 0; i < kNumElems; i++) { | 1805 for (int i = 0; i < kNumElems; ++i) { |
| 1806 CHECK_EQ(memory[i], r.Call(static_cast<int>(i))); | 1806 CHECK_EQ(memory[i], r.Call(i)); |
| 1807 } | 1807 } |
| 1808 } | 1808 } |
| 1809 | 1809 |
| 1810 WASM_EXEC_TEST(Int32LoadInt16_signext) { | 1810 WASM_EXEC_TEST(Int32LoadInt16_signext) { |
| 1811 TestingModule module(execution_mode); | 1811 TestingModule module(execution_mode); |
| 1812 const int kNumBytes = 16; | 1812 const int kNumBytes = 16; |
| 1813 byte* memory = module.AddMemory(kNumBytes); | 1813 byte* memory = module.AddMemory(kNumBytes); |
| 1814 module.RandomizeMemory(888); | 1814 module.RandomizeMemory(888); |
| 1815 memory[1] = 200; | 1815 memory[1] = 200; |
| 1816 WasmRunner<int32_t> r(&module, MachineType::Int32()); | 1816 WasmRunner<int32_t> r(&module, MachineType::Int32()); |
| 1817 BUILD(r, WASM_LOAD_MEM(MachineType::Int16(), WASM_GET_LOCAL(0))); | 1817 BUILD(r, WASM_LOAD_MEM(MachineType::Int16(), WASM_GET_LOCAL(0))); |
| 1818 | 1818 |
| 1819 for (size_t i = 0; i < kNumBytes; i += 2) { | 1819 for (int i = 0; i < kNumBytes; i += 2) { |
| 1820 int32_t expected = memory[i] | (static_cast<int8_t>(memory[i + 1]) << 8); | 1820 int32_t expected = memory[i] | (static_cast<int8_t>(memory[i + 1]) << 8); |
| 1821 CHECK_EQ(expected, r.Call(static_cast<int>(i))); | 1821 CHECK_EQ(expected, r.Call(i)); |
| 1822 } | 1822 } |
| 1823 } | 1823 } |
| 1824 | 1824 |
| 1825 WASM_EXEC_TEST(Int32LoadInt16_zeroext) { | 1825 WASM_EXEC_TEST(Int32LoadInt16_zeroext) { |
| 1826 TestingModule module(execution_mode); | 1826 TestingModule module(execution_mode); |
| 1827 const int kNumBytes = 16; | 1827 const int kNumBytes = 16; |
| 1828 byte* memory = module.AddMemory(kNumBytes); | 1828 byte* memory = module.AddMemory(kNumBytes); |
| 1829 module.RandomizeMemory(9999); | 1829 module.RandomizeMemory(9999); |
| 1830 memory[1] = 204; | 1830 memory[1] = 204; |
| 1831 WasmRunner<int32_t> r(&module, MachineType::Int32()); | 1831 WasmRunner<int32_t> r(&module, MachineType::Int32()); |
| 1832 BUILD(r, WASM_LOAD_MEM(MachineType::Uint16(), WASM_GET_LOCAL(0))); | 1832 BUILD(r, WASM_LOAD_MEM(MachineType::Uint16(), WASM_GET_LOCAL(0))); |
| 1833 | 1833 |
| 1834 for (size_t i = 0; i < kNumBytes; i += 2) { | 1834 for (int i = 0; i < kNumBytes; i += 2) { |
| 1835 int32_t expected = memory[i] | (memory[i + 1] << 8); | 1835 int32_t expected = memory[i] | (memory[i + 1] << 8); |
| 1836 CHECK_EQ(expected, r.Call(static_cast<int>(i))); | 1836 CHECK_EQ(expected, r.Call(i)); |
| 1837 } | 1837 } |
| 1838 } | 1838 } |
| 1839 | 1839 |
| 1840 WASM_EXEC_TEST(Int32Global) { | 1840 WASM_EXEC_TEST(Int32Global) { |
| 1841 TestingModule module(execution_mode); | 1841 TestingModule module(execution_mode); |
| 1842 int32_t* global = module.AddGlobal<int32_t>(MachineType::Int32()); | 1842 int32_t* global = module.AddGlobal<int32_t>(MachineType::Int32()); |
| 1843 WasmRunner<int32_t> r(&module, MachineType::Int32()); | 1843 WasmRunner<int32_t> r(&module, MachineType::Int32()); |
| 1844 // global = global + p0 | 1844 // global = global + p0 |
| 1845 BUILD(r, WASM_STORE_GLOBAL( | 1845 BUILD(r, WASM_STORE_GLOBAL( |
| 1846 0, WASM_I32_ADD(WASM_LOAD_GLOBAL(0), WASM_GET_LOCAL(0)))); | 1846 0, WASM_I32_ADD(WASM_LOAD_GLOBAL(0), WASM_GET_LOCAL(0)))); |
| 1847 | 1847 |
| 1848 *global = 116; | 1848 *global = 116; |
| 1849 for (int i = 9; i < 444444; i += 111111) { | 1849 for (int i = 9; i < 444444; i += 111111) { |
| 1850 int32_t expected = *global + i; | 1850 int32_t expected = *global + i; |
| 1851 r.Call(i); | 1851 r.Call(i); |
| 1852 CHECK_EQ(expected, *global); | 1852 CHECK_EQ(expected, *global); |
| 1853 } | 1853 } |
| 1854 } | 1854 } |
| 1855 | 1855 |
| 1856 WASM_EXEC_TEST(Int32Globals_DontAlias) { | 1856 WASM_EXEC_TEST(Int32Globals_DontAlias) { |
| 1857 const int kNumGlobals = 3; | 1857 const int kNumGlobals = 3; |
| 1858 TestingModule module(execution_mode); | 1858 TestingModule module(execution_mode); |
| 1859 int32_t* globals[] = {module.AddGlobal<int32_t>(MachineType::Int32()), | 1859 int32_t* globals[] = {module.AddGlobal<int32_t>(MachineType::Int32()), |
| 1860 module.AddGlobal<int32_t>(MachineType::Int32()), | 1860 module.AddGlobal<int32_t>(MachineType::Int32()), |
| 1861 module.AddGlobal<int32_t>(MachineType::Int32())}; | 1861 module.AddGlobal<int32_t>(MachineType::Int32())}; |
| 1862 | 1862 |
| 1863 for (int g = 0; g < kNumGlobals; g++) { | 1863 for (int g = 0; g < kNumGlobals; ++g) { |
| 1864 // global = global + p0 | 1864 // global = global + p0 |
| 1865 WasmRunner<int32_t> r(&module, MachineType::Int32()); | 1865 WasmRunner<int32_t> r(&module, MachineType::Int32()); |
| 1866 BUILD(r, WASM_STORE_GLOBAL( | 1866 BUILD(r, WASM_STORE_GLOBAL( |
| 1867 g, WASM_I32_ADD(WASM_LOAD_GLOBAL(g), WASM_GET_LOCAL(0)))); | 1867 g, WASM_I32_ADD(WASM_LOAD_GLOBAL(g), WASM_GET_LOCAL(0)))); |
| 1868 | 1868 |
| 1869 // Check that reading/writing global number {g} doesn't alter the others. | 1869 // Check that reading/writing global number {g} doesn't alter the others. |
| 1870 *globals[g] = 116 * g; | 1870 *globals[g] = 116 * g; |
| 1871 int32_t before[kNumGlobals]; | 1871 int32_t before[kNumGlobals]; |
| 1872 for (int i = 9; i < 444444; i += 111113) { | 1872 for (int i = 9; i < 444444; i += 111113) { |
| 1873 int32_t sum = *globals[g] + i; | 1873 int32_t sum = *globals[g] + i; |
| 1874 for (int j = 0; j < kNumGlobals; j++) before[j] = *globals[j]; | 1874 for (int j = 0; j < kNumGlobals; ++j) before[j] = *globals[j]; |
| 1875 r.Call(i); | 1875 r.Call(i); |
| 1876 for (int j = 0; j < kNumGlobals; j++) { | 1876 for (int j = 0; j < kNumGlobals; ++j) { |
| 1877 int32_t expected = j == g ? sum : before[j]; | 1877 int32_t expected = j == g ? sum : before[j]; |
| 1878 CHECK_EQ(expected, *globals[j]); | 1878 CHECK_EQ(expected, *globals[j]); |
| 1879 } | 1879 } |
| 1880 } | 1880 } |
| 1881 } | 1881 } |
| 1882 } | 1882 } |
| 1883 | 1883 |
| 1884 WASM_EXEC_TEST(Float32Global) { | 1884 WASM_EXEC_TEST(Float32Global) { |
| 1885 TestingModule module(execution_mode); | 1885 TestingModule module(execution_mode); |
| 1886 float* global = module.AddGlobal<float>(MachineType::Float32()); | 1886 float* global = module.AddGlobal<float>(MachineType::Float32()); |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1984 WasmRunner<int32_t> r(&module); | 1984 WasmRunner<int32_t> r(&module); |
| 1985 BUILD(r, WASM_CALL_FUNCTION0(index)); | 1985 BUILD(r, WASM_CALL_FUNCTION0(index)); |
| 1986 | 1986 |
| 1987 int32_t result = r.Call(); | 1987 int32_t result = r.Call(); |
| 1988 CHECK_EQ(kExpected, result); | 1988 CHECK_EQ(kExpected, result); |
| 1989 } | 1989 } |
| 1990 | 1990 |
| 1991 WASM_EXEC_TEST(CallF32StackParameter) { | 1991 WASM_EXEC_TEST(CallF32StackParameter) { |
| 1992 // Build the target function. | 1992 // Build the target function. |
| 1993 LocalType param_types[20]; | 1993 LocalType param_types[20]; |
| 1994 for (int i = 0; i < 20; i++) param_types[i] = kAstF32; | 1994 for (int i = 0; i < 20; ++i) param_types[i] = kAstF32; |
| 1995 FunctionSig sig(1, 19, param_types); | 1995 FunctionSig sig(1, 19, param_types); |
| 1996 TestingModule module(execution_mode); | 1996 TestingModule module(execution_mode); |
| 1997 WasmFunctionCompiler t(&sig, &module); | 1997 WasmFunctionCompiler t(&sig, &module); |
| 1998 BUILD(t, WASM_GET_LOCAL(17)); | 1998 BUILD(t, WASM_GET_LOCAL(17)); |
| 1999 uint32_t index = t.CompileAndAdd(); | 1999 uint32_t index = t.CompileAndAdd(); |
| 2000 | 2000 |
| 2001 // Build the calling function. | 2001 // Build the calling function. |
| 2002 WasmRunner<float> r(&module); | 2002 WasmRunner<float> r(&module); |
| 2003 BUILD(r, WASM_CALL_FUNCTIONN( | 2003 BUILD(r, WASM_CALL_FUNCTIONN( |
| 2004 19, index, WASM_F32(1.0f), WASM_F32(2.0f), WASM_F32(4.0f), | 2004 19, index, WASM_F32(1.0f), WASM_F32(2.0f), WASM_F32(4.0f), |
| 2005 WASM_F32(8.0f), WASM_F32(16.0f), WASM_F32(32.0f), | 2005 WASM_F32(8.0f), WASM_F32(16.0f), WASM_F32(32.0f), |
| 2006 WASM_F32(64.0f), WASM_F32(128.0f), WASM_F32(256.0f), | 2006 WASM_F32(64.0f), WASM_F32(128.0f), WASM_F32(256.0f), |
| 2007 WASM_F32(1.5f), WASM_F32(2.5f), WASM_F32(4.5f), WASM_F32(8.5f), | 2007 WASM_F32(1.5f), WASM_F32(2.5f), WASM_F32(4.5f), WASM_F32(8.5f), |
| 2008 WASM_F32(16.5f), WASM_F32(32.5f), WASM_F32(64.5f), | 2008 WASM_F32(16.5f), WASM_F32(32.5f), WASM_F32(64.5f), |
| 2009 WASM_F32(128.5f), WASM_F32(256.5f), WASM_F32(512.5f))); | 2009 WASM_F32(128.5f), WASM_F32(256.5f), WASM_F32(512.5f))); |
| 2010 | 2010 |
| 2011 float result = r.Call(); | 2011 float result = r.Call(); |
| 2012 CHECK_EQ(256.5f, result); | 2012 CHECK_EQ(256.5f, result); |
| 2013 } | 2013 } |
| 2014 | 2014 |
| 2015 WASM_EXEC_TEST(CallF64StackParameter) { | 2015 WASM_EXEC_TEST(CallF64StackParameter) { |
| 2016 // Build the target function. | 2016 // Build the target function. |
| 2017 LocalType param_types[20]; | 2017 LocalType param_types[20]; |
| 2018 for (int i = 0; i < 20; i++) param_types[i] = kAstF64; | 2018 for (int i = 0; i < 20; ++i) param_types[i] = kAstF64; |
| 2019 FunctionSig sig(1, 19, param_types); | 2019 FunctionSig sig(1, 19, param_types); |
| 2020 TestingModule module(execution_mode); | 2020 TestingModule module(execution_mode); |
| 2021 WasmFunctionCompiler t(&sig, &module); | 2021 WasmFunctionCompiler t(&sig, &module); |
| 2022 BUILD(t, WASM_GET_LOCAL(17)); | 2022 BUILD(t, WASM_GET_LOCAL(17)); |
| 2023 uint32_t index = t.CompileAndAdd(); | 2023 uint32_t index = t.CompileAndAdd(); |
| 2024 | 2024 |
| 2025 // Build the calling function. | 2025 // Build the calling function. |
| 2026 WasmRunner<double> r(&module); | 2026 WasmRunner<double> r(&module); |
| 2027 BUILD(r, WASM_CALL_FUNCTIONN(19, index, WASM_F64(1.0), WASM_F64(2.0), | 2027 BUILD(r, WASM_CALL_FUNCTIONN(19, index, WASM_F64(1.0), WASM_F64(2.0), |
| 2028 WASM_F64(4.0), WASM_F64(8.0), WASM_F64(16.0), | 2028 WASM_F64(4.0), WASM_F64(8.0), WASM_F64(16.0), |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2123 } else { | 2123 } else { |
| 2124 CHECK_EQ(expected, memory[0]); | 2124 CHECK_EQ(expected, memory[0]); |
| 2125 } | 2125 } |
| 2126 } | 2126 } |
| 2127 } | 2127 } |
| 2128 } | 2128 } |
| 2129 | 2129 |
| 2130 #define ADD_CODE(vec, ...) \ | 2130 #define ADD_CODE(vec, ...) \ |
| 2131 do { \ | 2131 do { \ |
| 2132 byte __buf[] = {__VA_ARGS__}; \ | 2132 byte __buf[] = {__VA_ARGS__}; \ |
| 2133 for (size_t i = 0; i < sizeof(__buf); i++) vec.push_back(__buf[i]); \ | 2133 for (size_t i = 0; i < sizeof(__buf); ++i) vec.push_back(__buf[i]); \ |
| 2134 } while (false) | 2134 } while (false) |
| 2135 | 2135 |
| 2136 static void Run_WasmMixedCall_N(WasmExecutionMode execution_mode, int start) { | 2136 static void Run_WasmMixedCall_N(WasmExecutionMode execution_mode, int start) { |
| 2137 const int kExpected = 6333; | 2137 const int kExpected = 6333; |
| 2138 const int kElemSize = 8; | 2138 const int kElemSize = 8; |
| 2139 TestSignatures sigs; | 2139 TestSignatures sigs; |
| 2140 | 2140 |
| 2141 // 64-bit cases handled in test-run-wasm-64.cc. | 2141 // 64-bit cases handled in test-run-wasm-64.cc. |
| 2142 static MachineType mixed[] = { | 2142 static MachineType mixed[] = { |
| 2143 MachineType::Int32(), MachineType::Float32(), MachineType::Float64(), | 2143 MachineType::Int32(), MachineType::Float32(), MachineType::Float64(), |
| 2144 MachineType::Float32(), MachineType::Int32(), MachineType::Float64(), | 2144 MachineType::Float32(), MachineType::Int32(), MachineType::Float64(), |
| 2145 MachineType::Float32(), MachineType::Float64(), MachineType::Int32(), | 2145 MachineType::Float32(), MachineType::Float64(), MachineType::Int32(), |
| 2146 MachineType::Int32(), MachineType::Int32()}; | 2146 MachineType::Int32(), MachineType::Int32()}; |
| 2147 | 2147 |
| 2148 int num_params = static_cast<int>(arraysize(mixed)) - start; | 2148 int num_params = static_cast<int>(arraysize(mixed)) - start; |
| 2149 for (int which = 0; which < num_params; which++) { | 2149 for (int which = 0; which < num_params; ++which) { |
| 2150 v8::base::AccountingAllocator allocator; | 2150 v8::base::AccountingAllocator allocator; |
| 2151 Zone zone(&allocator); | 2151 Zone zone(&allocator); |
| 2152 TestingModule module(execution_mode); | 2152 TestingModule module(execution_mode); |
| 2153 module.AddMemory(1024); | 2153 module.AddMemory(1024); |
| 2154 MachineType* memtypes = &mixed[start]; | 2154 MachineType* memtypes = &mixed[start]; |
| 2155 MachineType result = memtypes[which]; | 2155 MachineType result = memtypes[which]; |
| 2156 | 2156 |
| 2157 // ========================================================================= | 2157 // ========================================================================= |
| 2158 // Build the selector function. | 2158 // Build the selector function. |
| 2159 // ========================================================================= | 2159 // ========================================================================= |
| 2160 uint32_t index; | 2160 uint32_t index; |
| 2161 FunctionSig::Builder b(&zone, 1, num_params); | 2161 FunctionSig::Builder b(&zone, 1, num_params); |
| 2162 b.AddReturn(WasmOpcodes::LocalTypeFor(result)); | 2162 b.AddReturn(WasmOpcodes::LocalTypeFor(result)); |
| 2163 for (int i = 0; i < num_params; i++) { | 2163 for (int i = 0; i < num_params; ++i) { |
| 2164 b.AddParam(WasmOpcodes::LocalTypeFor(memtypes[i])); | 2164 b.AddParam(WasmOpcodes::LocalTypeFor(memtypes[i])); |
| 2165 } | 2165 } |
| 2166 WasmFunctionCompiler t(b.Build(), &module); | 2166 WasmFunctionCompiler t(b.Build(), &module); |
| 2167 BUILD(t, WASM_GET_LOCAL(which)); | 2167 BUILD(t, WASM_GET_LOCAL(which)); |
| 2168 index = t.CompileAndAdd(); | 2168 index = t.CompileAndAdd(); |
| 2169 | 2169 |
| 2170 // ========================================================================= | 2170 // ========================================================================= |
| 2171 // Build the calling function. | 2171 // Build the calling function. |
| 2172 // ========================================================================= | 2172 // ========================================================================= |
| 2173 WasmRunner<int32_t> r(&module); | 2173 WasmRunner<int32_t> r(&module); |
| 2174 std::vector<byte> code; | 2174 std::vector<byte> code; |
| 2175 | 2175 |
| 2176 // Load the offset for the store. | 2176 // Load the offset for the store. |
| 2177 ADD_CODE(code, WASM_ZERO); | 2177 ADD_CODE(code, WASM_ZERO); |
| 2178 | 2178 |
| 2179 // Load the arguments. | 2179 // Load the arguments. |
| 2180 for (int i = 0; i < num_params; i++) { | 2180 for (int i = 0; i < num_params; ++i) { |
| 2181 int offset = (i + 1) * kElemSize; | 2181 int offset = (i + 1) * kElemSize; |
| 2182 ADD_CODE(code, WASM_LOAD_MEM(memtypes[i], WASM_I8(offset))); | 2182 ADD_CODE(code, WASM_LOAD_MEM(memtypes[i], WASM_I8(offset))); |
| 2183 } | 2183 } |
| 2184 | 2184 |
| 2185 // Call the selector function. | 2185 // Call the selector function. |
| 2186 ADD_CODE(code, kExprCallFunction, static_cast<byte>(num_params), | 2186 ADD_CODE(code, kExprCallFunction, static_cast<byte>(num_params), |
| 2187 static_cast<byte>(index)); | 2187 static_cast<byte>(index)); |
| 2188 | 2188 |
| 2189 // Store the result in memory. | 2189 // Store the result in memory. |
| 2190 ADD_CODE(code, | 2190 ADD_CODE(code, |
| 2191 static_cast<byte>(WasmOpcodes::LoadStoreOpcodeOf(result, true)), | 2191 static_cast<byte>(WasmOpcodes::LoadStoreOpcodeOf(result, true)), |
| 2192 ZERO_ALIGNMENT, ZERO_OFFSET); | 2192 ZERO_ALIGNMENT, ZERO_OFFSET); |
| 2193 | 2193 |
| 2194 // Return the expected value. | 2194 // Return the expected value. |
| 2195 ADD_CODE(code, WASM_I32V_2(kExpected)); | 2195 ADD_CODE(code, WASM_I32V_2(kExpected)); |
| 2196 | 2196 |
| 2197 r.Build(&code[0], &code[0] + code.size()); | 2197 r.Build(&code[0], &code[0] + code.size()); |
| 2198 | 2198 |
| 2199 // Run the code. | 2199 // Run the code. |
| 2200 for (int t = 0; t < 10; t++) { | 2200 for (int t = 0; t < 10; ++t) { |
| 2201 module.RandomizeMemory(); | 2201 module.RandomizeMemory(); |
| 2202 CHECK_EQ(kExpected, r.Call()); | 2202 CHECK_EQ(kExpected, r.Call()); |
| 2203 | 2203 |
| 2204 int size = WasmOpcodes::MemSize(result); | 2204 int size = WasmOpcodes::MemSize(result); |
| 2205 for (int i = 0; i < size; i++) { | 2205 for (int i = 0; i < size; ++i) { |
| 2206 int base = (which + 1) * kElemSize; | 2206 int base = (which + 1) * kElemSize; |
| 2207 byte expected = module.raw_mem_at<byte>(base + i); | 2207 byte expected = module.raw_mem_at<byte>(base + i); |
| 2208 byte result = module.raw_mem_at<byte>(i); | 2208 byte result = module.raw_mem_at<byte>(i); |
| 2209 CHECK_EQ(expected, result); | 2209 CHECK_EQ(expected, result); |
| 2210 } | 2210 } |
| 2211 } | 2211 } |
| 2212 } | 2212 } |
| 2213 } | 2213 } |
| 2214 | 2214 |
| 2215 WASM_EXEC_TEST(MixedCall_0) { Run_WasmMixedCall_N(execution_mode, 0); } | 2215 WASM_EXEC_TEST(MixedCall_0) { Run_WasmMixedCall_N(execution_mode, 0); } |
| (...skipping 555 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2771 | 2771 |
| 2772 FOR_FLOAT32_INPUTS(i) { | 2772 FOR_FLOAT32_INPUTS(i) { |
| 2773 FOR_FLOAT32_INPUTS(j) { CHECK_FLOAT_EQ(copysignf(*i, *j), r.Call(*i, *j)); } | 2773 FOR_FLOAT32_INPUTS(j) { CHECK_FLOAT_EQ(copysignf(*i, *j), r.Call(*i, *j)); } |
| 2774 } | 2774 } |
| 2775 } | 2775 } |
| 2776 | 2776 |
| 2777 static void CompileCallIndirectMany(LocalType param) { | 2777 static void CompileCallIndirectMany(LocalType param) { |
| 2778 // Make sure we don't run out of registers when compiling indirect calls | 2778 // Make sure we don't run out of registers when compiling indirect calls |
| 2779 // with many many parameters. | 2779 // with many many parameters. |
| 2780 TestSignatures sigs; | 2780 TestSignatures sigs; |
| 2781 for (byte num_params = 0; num_params < 40; num_params++) { | 2781 for (byte num_params = 0; num_params < 40; ++num_params) { |
| 2782 v8::base::AccountingAllocator allocator; | 2782 v8::base::AccountingAllocator allocator; |
| 2783 Zone zone(&allocator); | 2783 Zone zone(&allocator); |
| 2784 HandleScope scope(CcTest::InitIsolateOnce()); | 2784 HandleScope scope(CcTest::InitIsolateOnce()); |
| 2785 TestingModule module(kExecuteCompiled); | 2785 TestingModule module(kExecuteCompiled); |
| 2786 FunctionSig* sig = sigs.many(&zone, kAstStmt, param, num_params); | 2786 FunctionSig* sig = sigs.many(&zone, kAstStmt, param, num_params); |
| 2787 | 2787 |
| 2788 module.AddSignature(sig); | 2788 module.AddSignature(sig); |
| 2789 module.AddSignature(sig); | 2789 module.AddSignature(sig); |
| 2790 module.AddIndirectFunctionTable(nullptr, 0); | 2790 module.AddIndirectFunctionTable(nullptr, 0); |
| 2791 | 2791 |
| 2792 WasmFunctionCompiler t(sig, &module); | 2792 WasmFunctionCompiler t(sig, &module); |
| 2793 | 2793 |
| 2794 std::vector<byte> code; | 2794 std::vector<byte> code; |
| 2795 ADD_CODE(code, kExprI8Const, 0); | 2795 ADD_CODE(code, kExprI8Const, 0); |
| 2796 for (byte p = 0; p < num_params; p++) { | 2796 for (byte p = 0; p < num_params; ++p) { |
| 2797 ADD_CODE(code, kExprGetLocal, p); | 2797 ADD_CODE(code, kExprGetLocal, p); |
| 2798 } | 2798 } |
| 2799 ADD_CODE(code, kExprCallIndirect, static_cast<byte>(num_params), 1); | 2799 ADD_CODE(code, kExprCallIndirect, static_cast<byte>(num_params), 1); |
| 2800 | 2800 |
| 2801 t.Build(&code[0], &code[0] + code.size()); | 2801 t.Build(&code[0], &code[0] + code.size()); |
| 2802 t.Compile(); | 2802 t.Compile(); |
| 2803 } | 2803 } |
| 2804 } | 2804 } |
| 2805 | 2805 |
| 2806 TEST(Compile_Wasm_CallIndirect_Many_i32) { CompileCallIndirectMany(kAstI32); } | 2806 TEST(Compile_Wasm_CallIndirect_Many_i32) { CompileCallIndirectMany(kAstI32); } |
| 2807 | 2807 |
| 2808 TEST(Compile_Wasm_CallIndirect_Many_f32) { CompileCallIndirectMany(kAstF32); } | 2808 TEST(Compile_Wasm_CallIndirect_Many_f32) { CompileCallIndirectMany(kAstF32); } |
| 2809 | 2809 |
| 2810 TEST(Compile_Wasm_CallIndirect_Many_f64) { CompileCallIndirectMany(kAstF64); } | 2810 TEST(Compile_Wasm_CallIndirect_Many_f64) { CompileCallIndirectMany(kAstF64); } |
| 2811 | 2811 |
| 2812 WASM_EXEC_TEST(Int32RemS_dead) { | 2812 WASM_EXEC_TEST(Int32RemS_dead) { |
| 2813 WasmRunner<int32_t> r(execution_mode, MachineType::Int32(), | 2813 WasmRunner<int32_t> r(execution_mode, MachineType::Int32(), |
| 2814 MachineType::Int32()); | 2814 MachineType::Int32()); |
| 2815 BUILD(r, WASM_I32_REMS(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)), WASM_ZERO); | 2815 BUILD(r, WASM_I32_REMS(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)), WASM_ZERO); |
| 2816 const int32_t kMin = std::numeric_limits<int32_t>::min(); | 2816 const int32_t kMin = std::numeric_limits<int32_t>::min(); |
| 2817 CHECK_EQ(0, r.Call(133, 100)); | 2817 CHECK_EQ(0, r.Call(133, 100)); |
| 2818 CHECK_EQ(0, r.Call(kMin, -1)); | 2818 CHECK_EQ(0, r.Call(kMin, -1)); |
| 2819 CHECK_EQ(0, r.Call(0, 1)); | 2819 CHECK_EQ(0, r.Call(0, 1)); |
| 2820 CHECK_TRAP(r.Call(100, 0)); | 2820 CHECK_TRAP(r.Call(100, 0)); |
| 2821 CHECK_TRAP(r.Call(-1001, 0)); | 2821 CHECK_TRAP(r.Call(-1001, 0)); |
| 2822 CHECK_TRAP(r.Call(kMin, 0)); | 2822 CHECK_TRAP(r.Call(kMin, 0)); |
| 2823 } | 2823 } |
| OLD | NEW |