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

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

Issue 2829483002: [wasm] Implement first set of SIMD I8x16 ops (Closed)
Patch Set: Created 3 years, 8 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/compiler/x64/instruction-selector-x64.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2016 the V8 project authors. All rights reserved. 1 // Copyright 2016 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 "src/assembler-inl.h" 5 #include "src/assembler-inl.h"
6 #include "src/wasm/wasm-macro-gen.h" 6 #include "src/wasm/wasm-macro-gen.h"
7 #include "test/cctest/cctest.h" 7 #include "test/cctest/cctest.h"
8 #include "test/cctest/compiler/value-helper.h" 8 #include "test/cctest/compiler/value-helper.h"
9 #include "test/cctest/wasm/wasm-run-utils.h" 9 #include "test/cctest/wasm/wasm-run-utils.h"
10 10
(...skipping 731 matching lines...) Expand 10 before | Expand all | Expand 10 after
742 WASM_GET_LOCAL(new_val))), 742 WASM_GET_LOCAL(new_val))),
743 WASM_SIMD_CHECK8(I16x8, simd, I32, new_val, new_val, new_val, new_val, 743 WASM_SIMD_CHECK8(I16x8, simd, I32, new_val, new_val, new_val, new_val,
744 new_val, new_val, new_val, old_val), 744 new_val, new_val, new_val, old_val),
745 WASM_SET_LOCAL(simd, 745 WASM_SET_LOCAL(simd,
746 WASM_SIMD_I16x8_REPLACE_LANE(7, WASM_GET_LOCAL(simd), 746 WASM_SIMD_I16x8_REPLACE_LANE(7, WASM_GET_LOCAL(simd),
747 WASM_GET_LOCAL(new_val))), 747 WASM_GET_LOCAL(new_val))),
748 WASM_SIMD_CHECK_SPLAT8(I16x8, simd, I32, new_val), WASM_ONE); 748 WASM_SIMD_CHECK_SPLAT8(I16x8, simd, I32, new_val), WASM_ONE);
749 749
750 CHECK_EQ(1, r.Call(1, 2)); 750 CHECK_EQ(1, r.Call(1, 2));
751 } 751 }
752 #endif // V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_X64
753 752
754 #if V8_TARGET_ARCH_ARM
755 WASM_EXEC_COMPILED_TEST(I8x16Splat) { 753 WASM_EXEC_COMPILED_TEST(I8x16Splat) {
756 FLAG_wasm_simd_prototype = true; 754 FLAG_wasm_simd_prototype = true;
757 755
758 WasmRunner<int32_t, int32_t> r(kExecuteCompiled); 756 WasmRunner<int32_t, int32_t> r(kExecuteCompiled);
759 byte lane_val = 0; 757 byte lane_val = 0;
760 byte simd = r.AllocateLocal(kWasmS128); 758 byte simd = r.AllocateLocal(kWasmS128);
761 BUILD(r, 759 BUILD(r,
762 WASM_SET_LOCAL(simd, WASM_SIMD_I8x16_SPLAT(WASM_GET_LOCAL(lane_val))), 760 WASM_SET_LOCAL(simd, WASM_SIMD_I8x16_SPLAT(WASM_GET_LOCAL(lane_val))),
763 WASM_SIMD_CHECK_SPLAT8(I8x16, simd, I32, lane_val), WASM_ONE); 761 WASM_SIMD_CHECK_SPLAT8(I8x16, simd, I32, lane_val), WASM_ONE);
764 762
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
862 WASM_SIMD_CHECK16(I8x16, simd, I32, new_val, new_val, new_val, new_val, 860 WASM_SIMD_CHECK16(I8x16, simd, I32, new_val, new_val, new_val, new_val,
863 new_val, new_val, new_val, new_val, new_val, new_val, 861 new_val, new_val, new_val, new_val, new_val, new_val,
864 new_val, new_val, new_val, new_val, new_val, old_val), 862 new_val, new_val, new_val, new_val, new_val, old_val),
865 WASM_SET_LOCAL(simd, 863 WASM_SET_LOCAL(simd,
866 WASM_SIMD_I8x16_REPLACE_LANE(15, WASM_GET_LOCAL(simd), 864 WASM_SIMD_I8x16_REPLACE_LANE(15, WASM_GET_LOCAL(simd),
867 WASM_GET_LOCAL(new_val))), 865 WASM_GET_LOCAL(new_val))),
868 WASM_SIMD_CHECK_SPLAT16(I8x16, simd, I32, new_val), WASM_ONE); 866 WASM_SIMD_CHECK_SPLAT16(I8x16, simd, I32, new_val), WASM_ONE);
869 867
870 CHECK_EQ(1, r.Call(1, 2)); 868 CHECK_EQ(1, r.Call(1, 2));
871 } 869 }
872 #endif // V8_TARGET_ARCH_ARM 870 #endif // V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_X64
873 871
874 #if V8_TARGET_ARCH_ARM || SIMD_LOWERING_TARGET || V8_TARGET_ARCH_MIPS || \ 872 #if V8_TARGET_ARCH_ARM || SIMD_LOWERING_TARGET || V8_TARGET_ARCH_MIPS || \
875 V8_TARGET_ARCH_MIPS64 873 V8_TARGET_ARCH_MIPS64
876 // Determines if conversion from float to int will be valid. 874 // Determines if conversion from float to int will be valid.
877 bool CanRoundToZeroAndConvert(double val, bool unsigned_integer) { 875 bool CanRoundToZeroAndConvert(double val, bool unsigned_integer) {
878 const double max_uint = static_cast<double>(0xffffffffu); 876 const double max_uint = static_cast<double>(0xffffffffu);
879 const double max_int = static_cast<double>(kMaxInt); 877 const double max_int = static_cast<double>(kMaxInt);
880 const double min_int = static_cast<double>(kMinInt); 878 const double min_int = static_cast<double>(kMinInt);
881 879
882 // Check for NaN. 880 // Check for NaN.
(...skipping 510 matching lines...) Expand 10 before | Expand all | Expand 10 after
1393 WASM_SIMD_CHECK_SPLAT16(I8x16, simd2, I32, packed_unsigned), WASM_ONE); 1391 WASM_SIMD_CHECK_SPLAT16(I8x16, simd2, I32, packed_unsigned), WASM_ONE);
1394 1392
1395 FOR_INT16_INPUTS(i) { 1393 FOR_INT16_INPUTS(i) {
1396 int32_t packed_signed = Narrow<int8_t>(*i); 1394 int32_t packed_signed = Narrow<int8_t>(*i);
1397 int32_t packed_unsigned = UnsignedNarrow<int8_t>(*i); 1395 int32_t packed_unsigned = UnsignedNarrow<int8_t>(*i);
1398 // Sign-extend here, since ExtractLane sign extends. 1396 // Sign-extend here, since ExtractLane sign extends.
1399 if (packed_unsigned & 0x80) packed_unsigned |= 0xffffff00; 1397 if (packed_unsigned & 0x80) packed_unsigned |= 0xffffff00;
1400 CHECK_EQ(1, r.Call(*i, packed_signed, packed_unsigned)); 1398 CHECK_EQ(1, r.Call(*i, packed_signed, packed_unsigned));
1401 } 1399 }
1402 } 1400 }
1401 #endif // V8_TARGET_ARCH_ARM
1403 1402
1403 #if V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_X64
1404 void RunI8x16BinOpTest(WasmOpcode simd_op, Int8BinOp expected_op) { 1404 void RunI8x16BinOpTest(WasmOpcode simd_op, Int8BinOp expected_op) {
1405 FLAG_wasm_simd_prototype = true; 1405 FLAG_wasm_simd_prototype = true;
1406 WasmRunner<int32_t, int32_t, int32_t, int32_t> r(kExecuteCompiled); 1406 WasmRunner<int32_t, int32_t, int32_t, int32_t> r(kExecuteCompiled);
1407 byte a = 0; 1407 byte a = 0;
1408 byte b = 1; 1408 byte b = 1;
1409 byte expected = 2; 1409 byte expected = 2;
1410 byte simd0 = r.AllocateLocal(kWasmS128); 1410 byte simd0 = r.AllocateLocal(kWasmS128);
1411 byte simd1 = r.AllocateLocal(kWasmS128); 1411 byte simd1 = r.AllocateLocal(kWasmS128);
1412 BUILD(r, WASM_SET_LOCAL(simd0, WASM_SIMD_I8x16_SPLAT(WASM_GET_LOCAL(a))), 1412 BUILD(r, WASM_SET_LOCAL(simd0, WASM_SIMD_I8x16_SPLAT(WASM_GET_LOCAL(a))),
1413 WASM_SET_LOCAL(simd1, WASM_SIMD_I8x16_SPLAT(WASM_GET_LOCAL(b))), 1413 WASM_SET_LOCAL(simd1, WASM_SIMD_I8x16_SPLAT(WASM_GET_LOCAL(b))),
(...skipping 11 matching lines...) Expand all
1425 WASM_EXEC_COMPILED_TEST(I8x16AddSaturateS) { 1425 WASM_EXEC_COMPILED_TEST(I8x16AddSaturateS) {
1426 RunI8x16BinOpTest(kExprI8x16AddSaturateS, AddSaturate); 1426 RunI8x16BinOpTest(kExprI8x16AddSaturateS, AddSaturate);
1427 } 1427 }
1428 1428
1429 WASM_EXEC_COMPILED_TEST(I8x16Sub) { RunI8x16BinOpTest(kExprI8x16Sub, Sub); } 1429 WASM_EXEC_COMPILED_TEST(I8x16Sub) { RunI8x16BinOpTest(kExprI8x16Sub, Sub); }
1430 1430
1431 WASM_EXEC_COMPILED_TEST(I8x16SubSaturateS) { 1431 WASM_EXEC_COMPILED_TEST(I8x16SubSaturateS) {
1432 RunI8x16BinOpTest(kExprI8x16SubSaturateS, SubSaturate); 1432 RunI8x16BinOpTest(kExprI8x16SubSaturateS, SubSaturate);
1433 } 1433 }
1434 1434
1435 WASM_EXEC_COMPILED_TEST(I8x16Mul) { RunI8x16BinOpTest(kExprI8x16Mul, Mul); }
1436
1437 WASM_EXEC_COMPILED_TEST(I8x16MinS) { 1435 WASM_EXEC_COMPILED_TEST(I8x16MinS) {
1438 RunI8x16BinOpTest(kExprI8x16MinS, Minimum); 1436 RunI8x16BinOpTest(kExprI8x16MinS, Minimum);
1439 } 1437 }
1440 1438
1441 WASM_EXEC_COMPILED_TEST(I8x16MaxS) { 1439 WASM_EXEC_COMPILED_TEST(I8x16MaxS) {
1442 RunI8x16BinOpTest(kExprI8x16MaxS, Maximum); 1440 RunI8x16BinOpTest(kExprI8x16MaxS, Maximum);
1443 } 1441 }
1444 1442
1445 WASM_EXEC_COMPILED_TEST(I8x16AddSaturateU) { 1443 WASM_EXEC_COMPILED_TEST(I8x16AddSaturateU) {
1446 RunI8x16BinOpTest(kExprI8x16AddSaturateU, UnsignedAddSaturate); 1444 RunI8x16BinOpTest(kExprI8x16AddSaturateU, UnsignedAddSaturate);
(...skipping 30 matching lines...) Expand all
1477 FOR_INT8_INPUTS(i) { 1475 FOR_INT8_INPUTS(i) {
1478 FOR_INT8_INPUTS(j) { CHECK_EQ(1, r.Call(*i, *j, expected_op(*i, *j))); } 1476 FOR_INT8_INPUTS(j) { CHECK_EQ(1, r.Call(*i, *j, expected_op(*i, *j))); }
1479 } 1477 }
1480 } 1478 }
1481 1479
1482 WASM_EXEC_COMPILED_TEST(I8x16Eq) { RunI8x16CompareOpTest(kExprI8x16Eq, Equal); } 1480 WASM_EXEC_COMPILED_TEST(I8x16Eq) { RunI8x16CompareOpTest(kExprI8x16Eq, Equal); }
1483 1481
1484 WASM_EXEC_COMPILED_TEST(I8x16Ne) { 1482 WASM_EXEC_COMPILED_TEST(I8x16Ne) {
1485 RunI8x16CompareOpTest(kExprI8x16Ne, NotEqual); 1483 RunI8x16CompareOpTest(kExprI8x16Ne, NotEqual);
1486 } 1484 }
1485 #endif // V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_X64
1486
1487 #if V8_TARGET_ARCH_ARM
1488 WASM_EXEC_COMPILED_TEST(I8x16Mul) { RunI8x16BinOpTest(kExprI8x16Mul, Mul); }
1487 1489
1488 WASM_EXEC_COMPILED_TEST(I8x16GtS) { 1490 WASM_EXEC_COMPILED_TEST(I8x16GtS) {
1489 RunI8x16CompareOpTest(kExprI8x16GtS, Greater); 1491 RunI8x16CompareOpTest(kExprI8x16GtS, Greater);
1490 } 1492 }
1491 1493
1492 WASM_EXEC_COMPILED_TEST(I8x16GeS) { 1494 WASM_EXEC_COMPILED_TEST(I8x16GeS) {
1493 RunI8x16CompareOpTest(kExprI8x16GeS, GreaterEqual); 1495 RunI8x16CompareOpTest(kExprI8x16GeS, GreaterEqual);
1494 } 1496 }
1495 1497
1496 WASM_EXEC_COMPILED_TEST(I8x16LtS) { 1498 WASM_EXEC_COMPILED_TEST(I8x16LtS) {
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
1581 \ 1583 \
1582 CHECK_EQ(1, r.Call(0x12, 0x34)); \ 1584 CHECK_EQ(1, r.Call(0x12, 0x34)); \
1583 } 1585 }
1584 1586
1585 WASM_SIMD_SELECT_TEST(32x4) 1587 WASM_SIMD_SELECT_TEST(32x4)
1586 #endif // V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_MIPS || 1588 #endif // V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_MIPS ||
1587 // V8_TARGET_ARCH_MIPS64 1589 // V8_TARGET_ARCH_MIPS64
1588 1590
1589 #if V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_X64 1591 #if V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_X64
1590 WASM_SIMD_SELECT_TEST(16x8) 1592 WASM_SIMD_SELECT_TEST(16x8)
1593
1594 WASM_SIMD_SELECT_TEST(8x16)
1591 #endif // V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_X64 1595 #endif // V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_X64
1592 1596
1593 #if V8_TARGET_ARCH_ARM 1597 #if V8_TARGET_ARCH_ARM
1594 WASM_SIMD_SELECT_TEST(8x16)
1595
1596 // Boolean unary operations are 'AllTrue' and 'AnyTrue', which return an integer 1598 // Boolean unary operations are 'AllTrue' and 'AnyTrue', which return an integer
1597 // result. Use relational ops on numeric vectors to create the boolean vector 1599 // result. Use relational ops on numeric vectors to create the boolean vector
1598 // test inputs. Test inputs with all true, all false, one true, and one false. 1600 // test inputs. Test inputs with all true, all false, one true, and one false.
1599 #define WASM_SIMD_BOOL_REDUCTION_TEST(format, lanes) \ 1601 #define WASM_SIMD_BOOL_REDUCTION_TEST(format, lanes) \
1600 WASM_EXEC_TEST(ReductionTest##lanes) { \ 1602 WASM_EXEC_TEST(ReductionTest##lanes) { \
1601 FLAG_wasm_simd_prototype = true; \ 1603 FLAG_wasm_simd_prototype = true; \
1602 WasmRunner<int32_t> r(kExecuteCompiled); \ 1604 WasmRunner<int32_t> r(kExecuteCompiled); \
1603 byte zero = r.AllocateLocal(kWasmS128); \ 1605 byte zero = r.AllocateLocal(kWasmS128); \
1604 byte one_one = r.AllocateLocal(kWasmS128); \ 1606 byte one_one = r.AllocateLocal(kWasmS128); \
1605 byte reduced = r.AllocateLocal(kWasmI32); \ 1607 byte reduced = r.AllocateLocal(kWasmI32); \
(...skipping 405 matching lines...) Expand 10 before | Expand all | Expand 10 after
2011 WASM_SIMD_I32x4_EXTRACT_LANE( 2013 WASM_SIMD_I32x4_EXTRACT_LANE(
2012 0, WASM_LOAD_MEM(MachineType::Simd128(), WASM_ZERO))); 2014 0, WASM_LOAD_MEM(MachineType::Simd128(), WASM_ZERO)));
2013 2015
2014 FOR_INT32_INPUTS(i) { 2016 FOR_INT32_INPUTS(i) {
2015 int32_t expected = *i; 2017 int32_t expected = *i;
2016 r.module().WriteMemory(&memory[0], expected); 2018 r.module().WriteMemory(&memory[0], expected);
2017 CHECK_EQ(expected, r.Call()); 2019 CHECK_EQ(expected, r.Call());
2018 } 2020 }
2019 } 2021 }
2020 #endif // V8_TARGET_ARCH_ARM || SIMD_LOWERING_TARGET 2022 #endif // V8_TARGET_ARCH_ARM || SIMD_LOWERING_TARGET
OLDNEW
« no previous file with comments | « src/compiler/x64/instruction-selector-x64.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698