| 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 216 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 227 BUILD(r, WASM_I32_CONVERT_I64( | 227 BUILD(r, WASM_I32_CONVERT_I64( |
| 228 WASM_I64_SAR(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)))); | 228 WASM_I64_SAR(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1)))); |
| 229 FOR_INT64_INPUTS(i) { | 229 FOR_INT64_INPUTS(i) { |
| 230 FOR_INT64_INPUTS(j) { | 230 FOR_INT64_INPUTS(j) { |
| 231 int32_t expected = static_cast<int32_t>((*i) >> (*j & 0x3f)); | 231 int32_t expected = static_cast<int32_t>((*i) >> (*j & 0x3f)); |
| 232 CHECK_EQ(expected, r.Call(*i, *j)); | 232 CHECK_EQ(expected, r.Call(*i, *j)); |
| 233 } | 233 } |
| 234 } | 234 } |
| 235 } | 235 } |
| 236 | 236 |
| 237 WASM_EXEC_TEST(I64DivS) { | 237 WASM_EXEC_TEST_WITH_TRAP(I64DivS) { |
| 238 REQUIRE(I64DivS); | 238 REQUIRE(I64DivS); |
| 239 WasmRunner<int64_t> r(execution_mode, MachineType::Int64(), | 239 WasmRunner<int64_t> r(execution_mode, MachineType::Int64(), |
| 240 MachineType::Int64()); | 240 MachineType::Int64()); |
| 241 BUILD(r, WASM_I64_DIVS(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); | 241 BUILD(r, WASM_I64_DIVS(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); |
| 242 FOR_INT64_INPUTS(i) { | 242 FOR_INT64_INPUTS(i) { |
| 243 FOR_INT64_INPUTS(j) { | 243 FOR_INT64_INPUTS(j) { |
| 244 if (*j == 0) { | 244 if (*j == 0) { |
| 245 CHECK_TRAP64(r.Call(*i, *j)); | 245 CHECK_TRAP64(r.Call(*i, *j)); |
| 246 } else if (*j == -1 && *i == std::numeric_limits<int64_t>::min()) { | 246 } else if (*j == -1 && *i == std::numeric_limits<int64_t>::min()) { |
| 247 CHECK_TRAP64(r.Call(*i, *j)); | 247 CHECK_TRAP64(r.Call(*i, *j)); |
| 248 } else { | 248 } else { |
| 249 CHECK_EQ(*i / *j, r.Call(*i, *j)); | 249 CHECK_EQ(*i / *j, r.Call(*i, *j)); |
| 250 } | 250 } |
| 251 } | 251 } |
| 252 } | 252 } |
| 253 } | 253 } |
| 254 | 254 |
| 255 WASM_EXEC_TEST(I64DivS_Trap) { | 255 WASM_EXEC_TEST_WITH_TRAP(I64DivS_Trap) { |
| 256 REQUIRE(I64DivS); | 256 REQUIRE(I64DivS); |
| 257 WasmRunner<int64_t> r(execution_mode, MachineType::Int64(), | 257 WasmRunner<int64_t> r(execution_mode, MachineType::Int64(), |
| 258 MachineType::Int64()); | 258 MachineType::Int64()); |
| 259 BUILD(r, WASM_I64_DIVS(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); | 259 BUILD(r, WASM_I64_DIVS(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); |
| 260 CHECK_EQ(0, r.Call(asi64(0), asi64(100))); | 260 CHECK_EQ(0, r.Call(asi64(0), asi64(100))); |
| 261 CHECK_TRAP64(r.Call(asi64(100), asi64(0))); | 261 CHECK_TRAP64(r.Call(asi64(100), asi64(0))); |
| 262 CHECK_TRAP64(r.Call(asi64(-1001), asi64(0))); | 262 CHECK_TRAP64(r.Call(asi64(-1001), asi64(0))); |
| 263 CHECK_TRAP64(r.Call(std::numeric_limits<int64_t>::min(), asi64(-1))); | 263 CHECK_TRAP64(r.Call(std::numeric_limits<int64_t>::min(), asi64(-1))); |
| 264 CHECK_TRAP64(r.Call(std::numeric_limits<int64_t>::min(), asi64(0))); | 264 CHECK_TRAP64(r.Call(std::numeric_limits<int64_t>::min(), asi64(0))); |
| 265 } | 265 } |
| 266 | 266 |
| 267 WASM_EXEC_TEST(I64DivS_Byzero_Const) { | 267 WASM_EXEC_TEST_WITH_TRAP(I64DivS_Byzero_Const) { |
| 268 REQUIRE(I64DivS); | 268 REQUIRE(I64DivS); |
| 269 for (int8_t denom = -2; denom < 8; denom++) { | 269 for (int8_t denom = -2; denom < 8; denom++) { |
| 270 WasmRunner<int64_t> r(execution_mode, MachineType::Int64()); | 270 WasmRunner<int64_t> r(execution_mode, MachineType::Int64()); |
| 271 BUILD(r, WASM_I64_DIVS(WASM_GET_LOCAL(0), WASM_I64V_1(denom))); | 271 BUILD(r, WASM_I64_DIVS(WASM_GET_LOCAL(0), WASM_I64V_1(denom))); |
| 272 for (int64_t val = -7; val < 8; val++) { | 272 for (int64_t val = -7; val < 8; val++) { |
| 273 if (denom == 0) { | 273 if (denom == 0) { |
| 274 CHECK_TRAP64(r.Call(val)); | 274 CHECK_TRAP64(r.Call(val)); |
| 275 } else { | 275 } else { |
| 276 CHECK_EQ(val / denom, r.Call(val)); | 276 CHECK_EQ(val / denom, r.Call(val)); |
| 277 } | 277 } |
| 278 } | 278 } |
| 279 } | 279 } |
| 280 } | 280 } |
| 281 | 281 |
| 282 WASM_EXEC_TEST(I64DivU) { | 282 WASM_EXEC_TEST_WITH_TRAP(I64DivU) { |
| 283 REQUIRE(I64DivU); | 283 REQUIRE(I64DivU); |
| 284 WasmRunner<uint64_t> r(execution_mode, MachineType::Uint64(), | 284 WasmRunner<uint64_t> r(execution_mode, MachineType::Uint64(), |
| 285 MachineType::Uint64()); | 285 MachineType::Uint64()); |
| 286 BUILD(r, WASM_I64_DIVU(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); | 286 BUILD(r, WASM_I64_DIVU(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); |
| 287 FOR_UINT64_INPUTS(i) { | 287 FOR_UINT64_INPUTS(i) { |
| 288 FOR_UINT64_INPUTS(j) { | 288 FOR_UINT64_INPUTS(j) { |
| 289 if (*j == 0) { | 289 if (*j == 0) { |
| 290 CHECK_TRAP64(r.Call(*i, *j)); | 290 CHECK_TRAP64(r.Call(*i, *j)); |
| 291 } else { | 291 } else { |
| 292 CHECK_EQ(*i / *j, r.Call(*i, *j)); | 292 CHECK_EQ(*i / *j, r.Call(*i, *j)); |
| 293 } | 293 } |
| 294 } | 294 } |
| 295 } | 295 } |
| 296 } | 296 } |
| 297 | 297 |
| 298 WASM_EXEC_TEST(I64DivU_Trap) { | 298 WASM_EXEC_TEST_WITH_TRAP(I64DivU_Trap) { |
| 299 REQUIRE(I64DivU); | 299 REQUIRE(I64DivU); |
| 300 WasmRunner<uint64_t> r(execution_mode, MachineType::Uint64(), | 300 WasmRunner<uint64_t> r(execution_mode, MachineType::Uint64(), |
| 301 MachineType::Uint64()); | 301 MachineType::Uint64()); |
| 302 BUILD(r, WASM_I64_DIVU(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); | 302 BUILD(r, WASM_I64_DIVU(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); |
| 303 CHECK_EQ(0u, r.Call(asu64(0), asu64(100))); | 303 CHECK_EQ(0u, r.Call(asu64(0), asu64(100))); |
| 304 CHECK_TRAP64(r.Call(asu64(100), asu64(0))); | 304 CHECK_TRAP64(r.Call(asu64(100), asu64(0))); |
| 305 CHECK_TRAP64(r.Call(asu64(1001), asu64(0))); | 305 CHECK_TRAP64(r.Call(asu64(1001), asu64(0))); |
| 306 CHECK_TRAP64(r.Call(std::numeric_limits<uint64_t>::max(), asu64(0))); | 306 CHECK_TRAP64(r.Call(std::numeric_limits<uint64_t>::max(), asu64(0))); |
| 307 } | 307 } |
| 308 | 308 |
| 309 WASM_EXEC_TEST(I64DivU_Byzero_Const) { | 309 WASM_EXEC_TEST_WITH_TRAP(I64DivU_Byzero_Const) { |
| 310 REQUIRE(I64DivU); | 310 REQUIRE(I64DivU); |
| 311 for (uint64_t denom = 0xfffffffffffffffe; denom < 8; denom++) { | 311 for (uint64_t denom = 0xfffffffffffffffe; denom < 8; denom++) { |
| 312 WasmRunner<uint64_t> r(execution_mode, MachineType::Uint64()); | 312 WasmRunner<uint64_t> r(execution_mode, MachineType::Uint64()); |
| 313 BUILD(r, WASM_I64_DIVU(WASM_GET_LOCAL(0), WASM_I64V_1(denom))); | 313 BUILD(r, WASM_I64_DIVU(WASM_GET_LOCAL(0), WASM_I64V_1(denom))); |
| 314 | 314 |
| 315 for (uint64_t val = 0xfffffffffffffff0; val < 8; val++) { | 315 for (uint64_t val = 0xfffffffffffffff0; val < 8; val++) { |
| 316 if (denom == 0) { | 316 if (denom == 0) { |
| 317 CHECK_TRAP64(r.Call(val)); | 317 CHECK_TRAP64(r.Call(val)); |
| 318 } else { | 318 } else { |
| 319 CHECK_EQ(val / denom, r.Call(val)); | 319 CHECK_EQ(val / denom, r.Call(val)); |
| 320 } | 320 } |
| 321 } | 321 } |
| 322 } | 322 } |
| 323 } | 323 } |
| 324 | 324 |
| 325 WASM_EXEC_TEST(I64RemS) { | 325 WASM_EXEC_TEST_WITH_TRAP(I64RemS) { |
| 326 REQUIRE(I64RemS); | 326 REQUIRE(I64RemS); |
| 327 WasmRunner<int64_t> r(execution_mode, MachineType::Int64(), | 327 WasmRunner<int64_t> r(execution_mode, MachineType::Int64(), |
| 328 MachineType::Int64()); | 328 MachineType::Int64()); |
| 329 BUILD(r, WASM_I64_REMS(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); | 329 BUILD(r, WASM_I64_REMS(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); |
| 330 FOR_INT64_INPUTS(i) { | 330 FOR_INT64_INPUTS(i) { |
| 331 FOR_INT64_INPUTS(j) { | 331 FOR_INT64_INPUTS(j) { |
| 332 if (*j == 0) { | 332 if (*j == 0) { |
| 333 CHECK_TRAP64(r.Call(*i, *j)); | 333 CHECK_TRAP64(r.Call(*i, *j)); |
| 334 } else { | 334 } else { |
| 335 CHECK_EQ(*i % *j, r.Call(*i, *j)); | 335 CHECK_EQ(*i % *j, r.Call(*i, *j)); |
| 336 } | 336 } |
| 337 } | 337 } |
| 338 } | 338 } |
| 339 } | 339 } |
| 340 | 340 |
| 341 WASM_EXEC_TEST(I64RemS_Trap) { | 341 WASM_EXEC_TEST_WITH_TRAP(I64RemS_Trap) { |
| 342 REQUIRE(I64RemS); | 342 REQUIRE(I64RemS); |
| 343 WasmRunner<int64_t> r(execution_mode, MachineType::Int64(), | 343 WasmRunner<int64_t> r(execution_mode, MachineType::Int64(), |
| 344 MachineType::Int64()); | 344 MachineType::Int64()); |
| 345 BUILD(r, WASM_I64_REMS(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); | 345 BUILD(r, WASM_I64_REMS(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); |
| 346 CHECK_EQ(33, r.Call(asi64(133), asi64(100))); | 346 CHECK_EQ(33, r.Call(asi64(133), asi64(100))); |
| 347 CHECK_EQ(0, r.Call(std::numeric_limits<int64_t>::min(), asi64(-1))); | 347 CHECK_EQ(0, r.Call(std::numeric_limits<int64_t>::min(), asi64(-1))); |
| 348 CHECK_TRAP64(r.Call(asi64(100), asi64(0))); | 348 CHECK_TRAP64(r.Call(asi64(100), asi64(0))); |
| 349 CHECK_TRAP64(r.Call(asi64(-1001), asi64(0))); | 349 CHECK_TRAP64(r.Call(asi64(-1001), asi64(0))); |
| 350 CHECK_TRAP64(r.Call(std::numeric_limits<int64_t>::min(), asi64(0))); | 350 CHECK_TRAP64(r.Call(std::numeric_limits<int64_t>::min(), asi64(0))); |
| 351 } | 351 } |
| 352 | 352 |
| 353 WASM_EXEC_TEST(I64RemU) { | 353 WASM_EXEC_TEST_WITH_TRAP(I64RemU) { |
| 354 REQUIRE(I64RemU); | 354 REQUIRE(I64RemU); |
| 355 WasmRunner<uint64_t> r(execution_mode, MachineType::Uint64(), | 355 WasmRunner<uint64_t> r(execution_mode, MachineType::Uint64(), |
| 356 MachineType::Uint64()); | 356 MachineType::Uint64()); |
| 357 BUILD(r, WASM_I64_REMU(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); | 357 BUILD(r, WASM_I64_REMU(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); |
| 358 FOR_UINT64_INPUTS(i) { | 358 FOR_UINT64_INPUTS(i) { |
| 359 FOR_UINT64_INPUTS(j) { | 359 FOR_UINT64_INPUTS(j) { |
| 360 if (*j == 0) { | 360 if (*j == 0) { |
| 361 CHECK_TRAP64(r.Call(*i, *j)); | 361 CHECK_TRAP64(r.Call(*i, *j)); |
| 362 } else { | 362 } else { |
| 363 CHECK_EQ(*i % *j, r.Call(*i, *j)); | 363 CHECK_EQ(*i % *j, r.Call(*i, *j)); |
| 364 } | 364 } |
| 365 } | 365 } |
| 366 } | 366 } |
| 367 } | 367 } |
| 368 | 368 |
| 369 WASM_EXEC_TEST(I64RemU_Trap) { | 369 WASM_EXEC_TEST_WITH_TRAP(I64RemU_Trap) { |
| 370 REQUIRE(I64RemU); | 370 REQUIRE(I64RemU); |
| 371 WasmRunner<uint64_t> r(execution_mode, MachineType::Uint64(), | 371 WasmRunner<uint64_t> r(execution_mode, MachineType::Uint64(), |
| 372 MachineType::Uint64()); | 372 MachineType::Uint64()); |
| 373 BUILD(r, WASM_I64_REMU(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); | 373 BUILD(r, WASM_I64_REMU(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); |
| 374 CHECK_EQ(17u, r.Call(asu64(217), asu64(100))); | 374 CHECK_EQ(17u, r.Call(asu64(217), asu64(100))); |
| 375 CHECK_TRAP64(r.Call(asu64(100), asu64(0))); | 375 CHECK_TRAP64(r.Call(asu64(100), asu64(0))); |
| 376 CHECK_TRAP64(r.Call(asu64(1001), asu64(0))); | 376 CHECK_TRAP64(r.Call(asu64(1001), asu64(0))); |
| 377 CHECK_TRAP64(r.Call(std::numeric_limits<uint64_t>::max(), asu64(0))); | 377 CHECK_TRAP64(r.Call(std::numeric_limits<uint64_t>::max(), asu64(0))); |
| 378 } | 378 } |
| 379 | 379 |
| (...skipping 457 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 837 {0x8000008000000001, 0x43e0000010000000}, | 837 {0x8000008000000001, 0x43e0000010000000}, |
| 838 {0x8000000000000400, 0x43e0000000000000}, | 838 {0x8000000000000400, 0x43e0000000000000}, |
| 839 {0x8000000000000401, 0x43e0000000000001}}; | 839 {0x8000000000000401, 0x43e0000000000001}}; |
| 840 WasmRunner<double> r(execution_mode, MachineType::Uint64()); | 840 WasmRunner<double> r(execution_mode, MachineType::Uint64()); |
| 841 BUILD(r, WASM_F64_UCONVERT_I64(WASM_GET_LOCAL(0))); | 841 BUILD(r, WASM_F64_UCONVERT_I64(WASM_GET_LOCAL(0))); |
| 842 for (size_t i = 0; i < arraysize(values); i++) { | 842 for (size_t i = 0; i < arraysize(values); i++) { |
| 843 CHECK_EQ(bit_cast<double>(values[i].expected), r.Call(values[i].input)); | 843 CHECK_EQ(bit_cast<double>(values[i].expected), r.Call(values[i].input)); |
| 844 } | 844 } |
| 845 } | 845 } |
| 846 | 846 |
| 847 WASM_EXEC_TEST(I64SConvertF32a) { | 847 WASM_EXEC_TEST_WITH_TRAP(I64SConvertF32a) { |
| 848 WasmRunner<int64_t> r(execution_mode, MachineType::Float32()); | 848 WasmRunner<int64_t> r(execution_mode, MachineType::Float32()); |
| 849 BUILD(r, WASM_I64_SCONVERT_F32(WASM_GET_LOCAL(0))); | 849 BUILD(r, WASM_I64_SCONVERT_F32(WASM_GET_LOCAL(0))); |
| 850 | 850 |
| 851 FOR_FLOAT32_INPUTS(i) { | 851 FOR_FLOAT32_INPUTS(i) { |
| 852 if (*i < static_cast<float>(std::numeric_limits<int64_t>::max()) && | 852 if (*i < static_cast<float>(std::numeric_limits<int64_t>::max()) && |
| 853 *i >= static_cast<float>(std::numeric_limits<int64_t>::min())) { | 853 *i >= static_cast<float>(std::numeric_limits<int64_t>::min())) { |
| 854 CHECK_EQ(static_cast<int64_t>(*i), r.Call(*i)); | 854 CHECK_EQ(static_cast<int64_t>(*i), r.Call(*i)); |
| 855 } else { | 855 } else { |
| 856 CHECK_TRAP64(r.Call(*i)); | 856 CHECK_TRAP64(r.Call(*i)); |
| 857 } | 857 } |
| 858 } | 858 } |
| 859 } | 859 } |
| 860 | 860 |
| 861 WASM_EXEC_TEST(I64SConvertF64a) { | 861 WASM_EXEC_TEST_WITH_TRAP(I64SConvertF64a) { |
| 862 WasmRunner<int64_t> r(execution_mode, MachineType::Float64()); | 862 WasmRunner<int64_t> r(execution_mode, MachineType::Float64()); |
| 863 BUILD(r, WASM_I64_SCONVERT_F64(WASM_GET_LOCAL(0))); | 863 BUILD(r, WASM_I64_SCONVERT_F64(WASM_GET_LOCAL(0))); |
| 864 | 864 |
| 865 FOR_FLOAT64_INPUTS(i) { | 865 FOR_FLOAT64_INPUTS(i) { |
| 866 if (*i < static_cast<double>(std::numeric_limits<int64_t>::max()) && | 866 if (*i < static_cast<double>(std::numeric_limits<int64_t>::max()) && |
| 867 *i >= static_cast<double>(std::numeric_limits<int64_t>::min())) { | 867 *i >= static_cast<double>(std::numeric_limits<int64_t>::min())) { |
| 868 CHECK_EQ(static_cast<int64_t>(*i), r.Call(*i)); | 868 CHECK_EQ(static_cast<int64_t>(*i), r.Call(*i)); |
| 869 } else { | 869 } else { |
| 870 CHECK_TRAP64(r.Call(*i)); | 870 CHECK_TRAP64(r.Call(*i)); |
| 871 } | 871 } |
| 872 } | 872 } |
| 873 } | 873 } |
| 874 | 874 |
| 875 WASM_EXEC_TEST(I64UConvertF32a) { | 875 WASM_EXEC_TEST_WITH_TRAP(I64UConvertF32a) { |
| 876 WasmRunner<uint64_t> r(execution_mode, MachineType::Float32()); | 876 WasmRunner<uint64_t> r(execution_mode, MachineType::Float32()); |
| 877 BUILD(r, WASM_I64_UCONVERT_F32(WASM_GET_LOCAL(0))); | 877 BUILD(r, WASM_I64_UCONVERT_F32(WASM_GET_LOCAL(0))); |
| 878 | 878 |
| 879 FOR_FLOAT32_INPUTS(i) { | 879 FOR_FLOAT32_INPUTS(i) { |
| 880 if (*i < static_cast<float>(std::numeric_limits<uint64_t>::max()) && | 880 if (*i < static_cast<float>(std::numeric_limits<uint64_t>::max()) && |
| 881 *i > -1) { | 881 *i > -1) { |
| 882 CHECK_EQ(static_cast<uint64_t>(*i), r.Call(*i)); | 882 CHECK_EQ(static_cast<uint64_t>(*i), r.Call(*i)); |
| 883 } else { | 883 } else { |
| 884 CHECK_TRAP64(r.Call(*i)); | 884 CHECK_TRAP64(r.Call(*i)); |
| 885 } | 885 } |
| 886 } | 886 } |
| 887 } | 887 } |
| 888 | 888 |
| 889 WASM_EXEC_TEST(I64UConvertF64a) { | 889 WASM_EXEC_TEST_WITH_TRAP(I64UConvertF64a) { |
| 890 WasmRunner<uint64_t> r(execution_mode, MachineType::Float64()); | 890 WasmRunner<uint64_t> r(execution_mode, MachineType::Float64()); |
| 891 BUILD(r, WASM_I64_UCONVERT_F64(WASM_GET_LOCAL(0))); | 891 BUILD(r, WASM_I64_UCONVERT_F64(WASM_GET_LOCAL(0))); |
| 892 | 892 |
| 893 FOR_FLOAT64_INPUTS(i) { | 893 FOR_FLOAT64_INPUTS(i) { |
| 894 if (*i < static_cast<float>(std::numeric_limits<uint64_t>::max()) && | 894 if (*i < static_cast<float>(std::numeric_limits<uint64_t>::max()) && |
| 895 *i > -1) { | 895 *i > -1) { |
| 896 CHECK_EQ(static_cast<uint64_t>(*i), r.Call(*i)); | 896 CHECK_EQ(static_cast<uint64_t>(*i), r.Call(*i)); |
| 897 } else { | 897 } else { |
| 898 CHECK_TRAP64(r.Call(*i)); | 898 CHECK_TRAP64(r.Call(*i)); |
| 899 } | 899 } |
| (...skipping 359 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1259 | 1259 |
| 1260 CHECK_EQ(expected, r.Call()); | 1260 CHECK_EQ(expected, r.Call()); |
| 1261 CHECK_EQ(static_cast<byte>(i), memory[8 + size - 1]); | 1261 CHECK_EQ(static_cast<byte>(i), memory[8 + size - 1]); |
| 1262 for (int j = size; j < 8; j++) { | 1262 for (int j = size; j < 8; j++) { |
| 1263 CHECK_EQ(255, memory[8 + j]); | 1263 CHECK_EQ(255, memory[8 + j]); |
| 1264 } | 1264 } |
| 1265 } | 1265 } |
| 1266 } | 1266 } |
| 1267 } | 1267 } |
| 1268 | 1268 |
| 1269 WASM_EXEC_TEST(I64SConvertF32b) { | 1269 WASM_EXEC_TEST_WITH_TRAP(I64SConvertF32b) { |
| 1270 REQUIRE(I64SConvertF32); | 1270 REQUIRE(I64SConvertF32); |
| 1271 WasmRunner<int64_t> r(execution_mode, MachineType::Float32()); | 1271 WasmRunner<int64_t> r(execution_mode, MachineType::Float32()); |
| 1272 BUILD(r, WASM_I64_SCONVERT_F32(WASM_GET_LOCAL(0))); | 1272 BUILD(r, WASM_I64_SCONVERT_F32(WASM_GET_LOCAL(0))); |
| 1273 | 1273 |
| 1274 FOR_FLOAT32_INPUTS(i) { | 1274 FOR_FLOAT32_INPUTS(i) { |
| 1275 if (*i < static_cast<float>(INT64_MAX) && | 1275 if (*i < static_cast<float>(INT64_MAX) && |
| 1276 *i >= static_cast<float>(INT64_MIN)) { | 1276 *i >= static_cast<float>(INT64_MIN)) { |
| 1277 CHECK_EQ(static_cast<int64_t>(*i), r.Call(*i)); | 1277 CHECK_EQ(static_cast<int64_t>(*i), r.Call(*i)); |
| 1278 } else { | 1278 } else { |
| 1279 CHECK_TRAP64(r.Call(*i)); | 1279 CHECK_TRAP64(r.Call(*i)); |
| 1280 } | 1280 } |
| 1281 } | 1281 } |
| 1282 } | 1282 } |
| 1283 | 1283 |
| 1284 WASM_EXEC_TEST(I64SConvertF64b) { | 1284 WASM_EXEC_TEST_WITH_TRAP(I64SConvertF64b) { |
| 1285 REQUIRE(I64SConvertF64); | 1285 REQUIRE(I64SConvertF64); |
| 1286 WasmRunner<int64_t> r(execution_mode, MachineType::Float64()); | 1286 WasmRunner<int64_t> r(execution_mode, MachineType::Float64()); |
| 1287 BUILD(r, WASM_I64_SCONVERT_F64(WASM_GET_LOCAL(0))); | 1287 BUILD(r, WASM_I64_SCONVERT_F64(WASM_GET_LOCAL(0))); |
| 1288 | 1288 |
| 1289 FOR_FLOAT64_INPUTS(i) { | 1289 FOR_FLOAT64_INPUTS(i) { |
| 1290 if (*i < static_cast<double>(INT64_MAX) && | 1290 if (*i < static_cast<double>(INT64_MAX) && |
| 1291 *i >= static_cast<double>(INT64_MIN)) { | 1291 *i >= static_cast<double>(INT64_MIN)) { |
| 1292 CHECK_EQ(static_cast<int64_t>(*i), r.Call(*i)); | 1292 CHECK_EQ(static_cast<int64_t>(*i), r.Call(*i)); |
| 1293 } else { | 1293 } else { |
| 1294 CHECK_TRAP64(r.Call(*i)); | 1294 CHECK_TRAP64(r.Call(*i)); |
| 1295 } | 1295 } |
| 1296 } | 1296 } |
| 1297 } | 1297 } |
| 1298 | 1298 |
| 1299 WASM_EXEC_TEST(I64UConvertF32b) { | 1299 WASM_EXEC_TEST_WITH_TRAP(I64UConvertF32b) { |
| 1300 REQUIRE(I64UConvertF32); | 1300 REQUIRE(I64UConvertF32); |
| 1301 WasmRunner<uint64_t> r(execution_mode, MachineType::Float32()); | 1301 WasmRunner<uint64_t> r(execution_mode, MachineType::Float32()); |
| 1302 BUILD(r, WASM_I64_UCONVERT_F32(WASM_GET_LOCAL(0))); | 1302 BUILD(r, WASM_I64_UCONVERT_F32(WASM_GET_LOCAL(0))); |
| 1303 | 1303 |
| 1304 FOR_FLOAT32_INPUTS(i) { | 1304 FOR_FLOAT32_INPUTS(i) { |
| 1305 if (*i < static_cast<float>(UINT64_MAX) && *i > -1) { | 1305 if (*i < static_cast<float>(UINT64_MAX) && *i > -1) { |
| 1306 CHECK_EQ(static_cast<uint64_t>(*i), r.Call(*i)); | 1306 CHECK_EQ(static_cast<uint64_t>(*i), r.Call(*i)); |
| 1307 } else { | 1307 } else { |
| 1308 CHECK_TRAP64(r.Call(*i)); | 1308 CHECK_TRAP64(r.Call(*i)); |
| 1309 } | 1309 } |
| 1310 } | 1310 } |
| 1311 } | 1311 } |
| 1312 | 1312 |
| 1313 WASM_EXEC_TEST(I64UConvertF64b) { | 1313 WASM_EXEC_TEST_WITH_TRAP(I64UConvertF64b) { |
| 1314 REQUIRE(I64UConvertF64); | 1314 REQUIRE(I64UConvertF64); |
| 1315 WasmRunner<uint64_t> r(execution_mode, MachineType::Float64()); | 1315 WasmRunner<uint64_t> r(execution_mode, MachineType::Float64()); |
| 1316 BUILD(r, WASM_I64_UCONVERT_F64(WASM_GET_LOCAL(0))); | 1316 BUILD(r, WASM_I64_UCONVERT_F64(WASM_GET_LOCAL(0))); |
| 1317 | 1317 |
| 1318 FOR_FLOAT64_INPUTS(i) { | 1318 FOR_FLOAT64_INPUTS(i) { |
| 1319 if (*i < static_cast<float>(UINT64_MAX) && *i > -1) { | 1319 if (*i < static_cast<float>(UINT64_MAX) && *i > -1) { |
| 1320 CHECK_EQ(static_cast<uint64_t>(*i), r.Call(*i)); | 1320 CHECK_EQ(static_cast<uint64_t>(*i), r.Call(*i)); |
| 1321 } else { | 1321 } else { |
| 1322 CHECK_TRAP64(r.Call(*i)); | 1322 CHECK_TRAP64(r.Call(*i)); |
| 1323 } | 1323 } |
| (...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1506 BUILD(r, WASM_I64_ROL(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); | 1506 BUILD(r, WASM_I64_ROL(WASM_GET_LOCAL(0), WASM_GET_LOCAL(1))); |
| 1507 | 1507 |
| 1508 FOR_UINT64_INPUTS(i) { | 1508 FOR_UINT64_INPUTS(i) { |
| 1509 FOR_UINT64_INPUTS(j) { | 1509 FOR_UINT64_INPUTS(j) { |
| 1510 int64_t expected = bits::RotateLeft64(*i, *j & 0x3f); | 1510 int64_t expected = bits::RotateLeft64(*i, *j & 0x3f); |
| 1511 CHECK_EQ(expected, r.Call(*i, *j)); | 1511 CHECK_EQ(expected, r.Call(*i, *j)); |
| 1512 } | 1512 } |
| 1513 } | 1513 } |
| 1514 } | 1514 } |
| 1515 | 1515 |
| 1516 WASM_EXEC_TEST(StoreMem_offset_oob_i64) { | 1516 WASM_EXEC_TEST_WITH_TRAP(StoreMem_offset_oob_i64) { |
| 1517 TestingModule module(execution_mode); | 1517 TestingModule module(execution_mode); |
| 1518 byte* memory = module.AddMemoryElems<byte>(32); | 1518 byte* memory = module.AddMemoryElems<byte>(32); |
| 1519 | 1519 |
| 1520 static const MachineType machineTypes[] = { | 1520 static const MachineType machineTypes[] = { |
| 1521 MachineType::Int8(), MachineType::Uint8(), MachineType::Int16(), | 1521 MachineType::Int8(), MachineType::Uint8(), MachineType::Int16(), |
| 1522 MachineType::Uint16(), MachineType::Int32(), MachineType::Uint32(), | 1522 MachineType::Uint16(), MachineType::Int32(), MachineType::Uint32(), |
| 1523 MachineType::Int64(), MachineType::Uint64(), MachineType::Float32(), | 1523 MachineType::Int64(), MachineType::Uint64(), MachineType::Float32(), |
| 1524 MachineType::Float64()}; | 1524 MachineType::Float64()}; |
| 1525 | 1525 |
| 1526 for (size_t m = 0; m < arraysize(machineTypes); m++) { | 1526 for (size_t m = 0; m < arraysize(machineTypes); m++) { |
| (...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1654 CHECK_EQ(expected, result); | 1654 CHECK_EQ(expected, result); |
| 1655 } | 1655 } |
| 1656 } | 1656 } |
| 1657 } | 1657 } |
| 1658 } | 1658 } |
| 1659 | 1659 |
| 1660 WASM_EXEC_TEST(MixedCall_i64_0) { Run_WasmMixedCall_N(execution_mode, 0); } | 1660 WASM_EXEC_TEST(MixedCall_i64_0) { Run_WasmMixedCall_N(execution_mode, 0); } |
| 1661 WASM_EXEC_TEST(MixedCall_i64_1) { Run_WasmMixedCall_N(execution_mode, 1); } | 1661 WASM_EXEC_TEST(MixedCall_i64_1) { Run_WasmMixedCall_N(execution_mode, 1); } |
| 1662 WASM_EXEC_TEST(MixedCall_i64_2) { Run_WasmMixedCall_N(execution_mode, 2); } | 1662 WASM_EXEC_TEST(MixedCall_i64_2) { Run_WasmMixedCall_N(execution_mode, 2); } |
| 1663 WASM_EXEC_TEST(MixedCall_i64_3) { Run_WasmMixedCall_N(execution_mode, 3); } | 1663 WASM_EXEC_TEST(MixedCall_i64_3) { Run_WasmMixedCall_N(execution_mode, 3); } |
| OLD | NEW |