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

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

Issue 2724973003: [wasm]implement simd lowering for f32x4->i32x4, i32x4 min/max and shift instructions (Closed)
Patch Set: comment Created 3 years, 9 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/wasm-compiler.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 743 matching lines...) Expand 10 before | Expand all | Expand 10 after
754 WASM_SIMD_CHECK16(I8x16, simd, I32, new_val, new_val, new_val, new_val, 754 WASM_SIMD_CHECK16(I8x16, simd, I32, new_val, new_val, new_val, new_val,
755 new_val, new_val, new_val, new_val, new_val, new_val, 755 new_val, new_val, new_val, new_val, new_val, new_val,
756 new_val, new_val, new_val, new_val, new_val, old_val), 756 new_val, new_val, new_val, new_val, new_val, old_val),
757 WASM_SET_LOCAL(simd, 757 WASM_SET_LOCAL(simd,
758 WASM_SIMD_I8x16_REPLACE_LANE(15, WASM_GET_LOCAL(simd), 758 WASM_SIMD_I8x16_REPLACE_LANE(15, WASM_GET_LOCAL(simd),
759 WASM_GET_LOCAL(new_val))), 759 WASM_GET_LOCAL(new_val))),
760 WASM_SIMD_CHECK_SPLAT16(I8x16, simd, I32, new_val), WASM_ONE); 760 WASM_SIMD_CHECK_SPLAT16(I8x16, simd, I32, new_val), WASM_ONE);
761 761
762 CHECK_EQ(1, r.Call(1, 2)); 762 CHECK_EQ(1, r.Call(1, 2));
763 } 763 }
764 #endif // V8_TARGET_ARCH_ARM
764 765
766 #if V8_TARGET_ARCH_ARM || SIMD_LOWERING_TARGET
765 // Determines if conversion from float to int will be valid. 767 // Determines if conversion from float to int will be valid.
766 bool CanRoundToZeroAndConvert(double val, bool unsigned_integer) { 768 bool CanRoundToZeroAndConvert(double val, bool unsigned_integer) {
767 const double max_uint = static_cast<double>(0xffffffffu); 769 const double max_uint = static_cast<double>(0xffffffffu);
768 const double max_int = static_cast<double>(kMaxInt); 770 const double max_int = static_cast<double>(kMaxInt);
769 const double min_int = static_cast<double>(kMinInt); 771 const double min_int = static_cast<double>(kMinInt);
770 772
771 // Check for NaN. 773 // Check for NaN.
772 if (val != val) { 774 if (val != val) {
773 return false; 775 return false;
774 } 776 }
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
819 WASM_SET_LOCAL(simd2, WASM_SIMD_U32x4_FROM_F32x4(WASM_GET_LOCAL(simd0))), 821 WASM_SET_LOCAL(simd2, WASM_SIMD_U32x4_FROM_F32x4(WASM_GET_LOCAL(simd0))),
820 WASM_SIMD_CHECK_SPLAT4(I32x4, simd2, I32, expected_unsigned), WASM_ONE); 822 WASM_SIMD_CHECK_SPLAT4(I32x4, simd2, I32, expected_unsigned), WASM_ONE);
821 823
822 FOR_FLOAT32_INPUTS(i) { 824 FOR_FLOAT32_INPUTS(i) {
823 if (SkipFPTestInput(*i)) continue; 825 if (SkipFPTestInput(*i)) continue;
824 int32_t signed_value = ConvertToInt(*i, false); 826 int32_t signed_value = ConvertToInt(*i, false);
825 int32_t unsigned_value = ConvertToInt(*i, true); 827 int32_t unsigned_value = ConvertToInt(*i, true);
826 CHECK_EQ(1, r.Call(*i, signed_value, unsigned_value)); 828 CHECK_EQ(1, r.Call(*i, signed_value, unsigned_value));
827 } 829 }
828 } 830 }
829 #endif // V8_TARGET_ARCH_ARM
830 831
831 #if V8_TARGET_ARCH_ARM || SIMD_LOWERING_TARGET
832 void RunI32x4UnOpTest(WasmOpcode simd_op, Int32UnOp expected_op) { 832 void RunI32x4UnOpTest(WasmOpcode simd_op, Int32UnOp expected_op) {
833 FLAG_wasm_simd_prototype = true; 833 FLAG_wasm_simd_prototype = true;
834 WasmRunner<int32_t, int32_t, int32_t> r(kExecuteCompiled); 834 WasmRunner<int32_t, int32_t, int32_t> r(kExecuteCompiled);
835 byte a = 0; 835 byte a = 0;
836 byte expected = 1; 836 byte expected = 1;
837 byte simd = r.AllocateLocal(kWasmS128); 837 byte simd = r.AllocateLocal(kWasmS128);
838 BUILD(r, WASM_SET_LOCAL(simd, WASM_SIMD_I32x4_SPLAT(WASM_GET_LOCAL(a))), 838 BUILD(r, WASM_SET_LOCAL(simd, WASM_SIMD_I32x4_SPLAT(WASM_GET_LOCAL(a))),
839 WASM_SET_LOCAL(simd, WASM_SIMD_UNOP(simd_op, WASM_GET_LOCAL(simd))), 839 WASM_SET_LOCAL(simd, WASM_SIMD_UNOP(simd_op, WASM_GET_LOCAL(simd))),
840 WASM_SIMD_CHECK_SPLAT4(I32x4, simd, I32, expected), WASM_ONE); 840 WASM_SIMD_CHECK_SPLAT4(I32x4, simd, I32, expected), WASM_ONE);
841 841
(...skipping 29 matching lines...) Expand all
871 WASM_EXEC_COMPILED_TEST(I32x4Sub) { RunI32x4BinOpTest(kExprI32x4Sub, Sub); } 871 WASM_EXEC_COMPILED_TEST(I32x4Sub) { RunI32x4BinOpTest(kExprI32x4Sub, Sub); }
872 872
873 #if V8_TARGET_ARCH_ARM || SIMD_LOWERING_TARGET 873 #if V8_TARGET_ARCH_ARM || SIMD_LOWERING_TARGET
874 WASM_EXEC_COMPILED_TEST(I32x4Mul) { RunI32x4BinOpTest(kExprI32x4Mul, Mul); } 874 WASM_EXEC_COMPILED_TEST(I32x4Mul) { RunI32x4BinOpTest(kExprI32x4Mul, Mul); }
875 875
876 WASM_EXEC_COMPILED_TEST(S128And) { RunI32x4BinOpTest(kExprS128And, And); } 876 WASM_EXEC_COMPILED_TEST(S128And) { RunI32x4BinOpTest(kExprS128And, And); }
877 877
878 WASM_EXEC_COMPILED_TEST(S128Or) { RunI32x4BinOpTest(kExprS128Or, Or); } 878 WASM_EXEC_COMPILED_TEST(S128Or) { RunI32x4BinOpTest(kExprS128Or, Or); }
879 879
880 WASM_EXEC_COMPILED_TEST(S128Xor) { RunI32x4BinOpTest(kExprS128Xor, Xor); } 880 WASM_EXEC_COMPILED_TEST(S128Xor) { RunI32x4BinOpTest(kExprS128Xor, Xor); }
881 #endif // V8_TARGET_ARCH_ARM || SIMD_LOWERING_TARGET
882 881
883 #if V8_TARGET_ARCH_ARM
884 WASM_EXEC_COMPILED_TEST(I32x4Min) { 882 WASM_EXEC_COMPILED_TEST(I32x4Min) {
885 RunI32x4BinOpTest(kExprI32x4MinS, Minimum); 883 RunI32x4BinOpTest(kExprI32x4MinS, Minimum);
886 } 884 }
887 885
888 WASM_EXEC_COMPILED_TEST(I32x4Max) { 886 WASM_EXEC_COMPILED_TEST(I32x4Max) {
889 RunI32x4BinOpTest(kExprI32x4MaxS, Maximum); 887 RunI32x4BinOpTest(kExprI32x4MaxS, Maximum);
890 } 888 }
891 889
892 WASM_EXEC_COMPILED_TEST(Ui32x4Min) { 890 WASM_EXEC_COMPILED_TEST(Ui32x4Min) {
893 RunI32x4BinOpTest(kExprI32x4MinU, UnsignedMinimum); 891 RunI32x4BinOpTest(kExprI32x4MinU, UnsignedMinimum);
894 } 892 }
895 893
896 WASM_EXEC_COMPILED_TEST(Ui32x4Max) { 894 WASM_EXEC_COMPILED_TEST(Ui32x4Max) {
897 RunI32x4BinOpTest(kExprI32x4MaxU, UnsignedMaximum); 895 RunI32x4BinOpTest(kExprI32x4MaxU, UnsignedMaximum);
898 } 896 }
897 #endif // V8_TARGET_ARCH_ARM || SIMD_LOWERING_TARGET
899 898
900 899 #if V8_TARGET_ARCH_ARM
901
902 void RunI32x4CompareOpTest(WasmOpcode simd_op, Int32BinOp expected_op) { 900 void RunI32x4CompareOpTest(WasmOpcode simd_op, Int32BinOp expected_op) {
903 FLAG_wasm_simd_prototype = true; 901 FLAG_wasm_simd_prototype = true;
904 WasmRunner<int32_t, int32_t, int32_t, int32_t> r(kExecuteCompiled); 902 WasmRunner<int32_t, int32_t, int32_t, int32_t> r(kExecuteCompiled);
905 byte a = 0; 903 byte a = 0;
906 byte b = 1; 904 byte b = 1;
907 byte expected = 2; 905 byte expected = 2;
908 byte simd0 = r.AllocateLocal(kWasmS128); 906 byte simd0 = r.AllocateLocal(kWasmS128);
909 byte simd1 = r.AllocateLocal(kWasmS128); 907 byte simd1 = r.AllocateLocal(kWasmS128);
910 BUILD(r, WASM_SET_LOCAL(simd0, WASM_SIMD_I32x4_SPLAT(WASM_GET_LOCAL(a))), 908 BUILD(r, WASM_SET_LOCAL(simd0, WASM_SIMD_I32x4_SPLAT(WASM_GET_LOCAL(a))),
911 WASM_SET_LOCAL(simd1, WASM_SIMD_I32x4_SPLAT(WASM_GET_LOCAL(b))), 909 WASM_SET_LOCAL(simd1, WASM_SIMD_I32x4_SPLAT(WASM_GET_LOCAL(b))),
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
952 RunI32x4CompareOpTest(kExprI32x4GeU, UnsignedGreaterEqual); 950 RunI32x4CompareOpTest(kExprI32x4GeU, UnsignedGreaterEqual);
953 } 951 }
954 952
955 WASM_EXEC_COMPILED_TEST(Ui32x4Less) { 953 WASM_EXEC_COMPILED_TEST(Ui32x4Less) {
956 RunI32x4CompareOpTest(kExprI32x4LtU, UnsignedLess); 954 RunI32x4CompareOpTest(kExprI32x4LtU, UnsignedLess);
957 } 955 }
958 956
959 WASM_EXEC_COMPILED_TEST(Ui32x4LessEqual) { 957 WASM_EXEC_COMPILED_TEST(Ui32x4LessEqual) {
960 RunI32x4CompareOpTest(kExprI32x4LeU, UnsignedLessEqual); 958 RunI32x4CompareOpTest(kExprI32x4LeU, UnsignedLessEqual);
961 } 959 }
960 #endif // V8_TARGET_ARCH_ARM
962 961
962 #if V8_TARGET_ARCH_ARM || SIMD_LOWERING_TARGET
963 void RunI32x4ShiftOpTest(WasmOpcode simd_op, Int32ShiftOp expected_op, 963 void RunI32x4ShiftOpTest(WasmOpcode simd_op, Int32ShiftOp expected_op,
964 int shift) { 964 int shift) {
965 FLAG_wasm_simd_prototype = true; 965 FLAG_wasm_simd_prototype = true;
966 WasmRunner<int32_t, int32_t, int32_t> r(kExecuteCompiled); 966 WasmRunner<int32_t, int32_t, int32_t> r(kExecuteCompiled);
967 byte a = 0; 967 byte a = 0;
968 byte expected = 1; 968 byte expected = 1;
969 byte simd = r.AllocateLocal(kWasmS128); 969 byte simd = r.AllocateLocal(kWasmS128);
970 BUILD(r, WASM_SET_LOCAL(simd, WASM_SIMD_I32x4_SPLAT(WASM_GET_LOCAL(a))), 970 BUILD(r, WASM_SET_LOCAL(simd, WASM_SIMD_I32x4_SPLAT(WASM_GET_LOCAL(a))),
971 WASM_SET_LOCAL( 971 WASM_SET_LOCAL(
972 simd, WASM_SIMD_SHIFT_OP(simd_op, shift, WASM_GET_LOCAL(simd))), 972 simd, WASM_SIMD_SHIFT_OP(simd_op, shift, WASM_GET_LOCAL(simd))),
973 WASM_SIMD_CHECK_SPLAT4(I32x4, simd, I32, expected), WASM_ONE); 973 WASM_SIMD_CHECK_SPLAT4(I32x4, simd, I32, expected), WASM_ONE);
974 974
975 FOR_INT32_INPUTS(i) { CHECK_EQ(1, r.Call(*i, expected_op(*i, shift))); } 975 FOR_INT32_INPUTS(i) { CHECK_EQ(1, r.Call(*i, expected_op(*i, shift))); }
976 } 976 }
977 977
978 WASM_EXEC_COMPILED_TEST(I32x4Shl) { 978 WASM_EXEC_COMPILED_TEST(I32x4Shl) {
979 RunI32x4ShiftOpTest(kExprI32x4Shl, LogicalShiftLeft, 1); 979 RunI32x4ShiftOpTest(kExprI32x4Shl, LogicalShiftLeft, 1);
980 } 980 }
981 981
982 WASM_EXEC_COMPILED_TEST(I32x4ShrS) { 982 WASM_EXEC_COMPILED_TEST(I32x4ShrS) {
983 RunI32x4ShiftOpTest(kExprI32x4ShrS, ArithmeticShiftRight, 1); 983 RunI32x4ShiftOpTest(kExprI32x4ShrS, ArithmeticShiftRight, 1);
984 } 984 }
985 985
986 WASM_EXEC_COMPILED_TEST(I32x4ShrU) { 986 WASM_EXEC_COMPILED_TEST(I32x4ShrU) {
987 RunI32x4ShiftOpTest(kExprI32x4ShrU, LogicalShiftRight, 1); 987 RunI32x4ShiftOpTest(kExprI32x4ShrU, LogicalShiftRight, 1);
988 } 988 }
989 #endif // V8_TARGET_ARCH_ARM || SIMD_LOWERING_TARGET
990
991 #if V8_TARGET_ARCH_ARM
989 992
990 void RunI16x8UnOpTest(WasmOpcode simd_op, Int16UnOp expected_op) { 993 void RunI16x8UnOpTest(WasmOpcode simd_op, Int16UnOp expected_op) {
991 FLAG_wasm_simd_prototype = true; 994 FLAG_wasm_simd_prototype = true;
992 WasmRunner<int32_t, int32_t, int32_t> r(kExecuteCompiled); 995 WasmRunner<int32_t, int32_t, int32_t> r(kExecuteCompiled);
993 byte a = 0; 996 byte a = 0;
994 byte expected = 1; 997 byte expected = 1;
995 byte simd = r.AllocateLocal(kWasmS128); 998 byte simd = r.AllocateLocal(kWasmS128);
996 BUILD(r, WASM_SET_LOCAL(simd, WASM_SIMD_I16x8_SPLAT(WASM_GET_LOCAL(a))), 999 BUILD(r, WASM_SET_LOCAL(simd, WASM_SIMD_I16x8_SPLAT(WASM_GET_LOCAL(a))),
997 WASM_SET_LOCAL(simd, WASM_SIMD_UNOP(simd_op, WASM_GET_LOCAL(simd))), 1000 WASM_SET_LOCAL(simd, WASM_SIMD_UNOP(simd_op, WASM_GET_LOCAL(simd))),
998 WASM_SIMD_CHECK_SPLAT8(I16x8, simd, I32, expected), WASM_ONE); 1001 WASM_SIMD_CHECK_SPLAT8(I16x8, simd, I32, expected), WASM_ONE);
(...skipping 750 matching lines...) Expand 10 before | Expand all | Expand 10 after
1749 WASM_SET_GLOBAL(0, WASM_SIMD_F32x4_REPLACE_LANE(3, WASM_GET_GLOBAL(0), 1752 WASM_SET_GLOBAL(0, WASM_SIMD_F32x4_REPLACE_LANE(3, WASM_GET_GLOBAL(0),
1750 WASM_F32(65.0))), 1753 WASM_F32(65.0))),
1751 WASM_I32V(1)); 1754 WASM_I32V(1));
1752 FOR_INT32_INPUTS(i) { CHECK_EQ(1, r.Call(0)); } 1755 FOR_INT32_INPUTS(i) { CHECK_EQ(1, r.Call(0)); }
1753 CHECK_EQ(*global, 13.5); 1756 CHECK_EQ(*global, 13.5);
1754 CHECK_EQ(*(global + 1), 45.5); 1757 CHECK_EQ(*(global + 1), 45.5);
1755 CHECK_EQ(*(global + 2), 32.25); 1758 CHECK_EQ(*(global + 2), 32.25);
1756 CHECK_EQ(*(global + 3), 65.0); 1759 CHECK_EQ(*(global + 3), 65.0);
1757 } 1760 }
1758 #endif // SIMD_LOWERING_TARGET 1761 #endif // SIMD_LOWERING_TARGET
OLDNEW
« no previous file with comments | « src/compiler/wasm-compiler.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698