| OLD | NEW |
| 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/wasm/wasm-macro-gen.h" | 5 #include "src/wasm/wasm-macro-gen.h" |
| 6 | 6 |
| 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 11 matching lines...) Expand all Loading... |
| 22 typedef int32_t (*Int32BinOp)(int32_t, int32_t); | 22 typedef int32_t (*Int32BinOp)(int32_t, int32_t); |
| 23 typedef int32_t (*Int32ShiftOp)(int32_t, int); | 23 typedef int32_t (*Int32ShiftOp)(int32_t, int); |
| 24 typedef int16_t (*Int16UnOp)(int16_t); | 24 typedef int16_t (*Int16UnOp)(int16_t); |
| 25 typedef int16_t (*Int16BinOp)(int16_t, int16_t); | 25 typedef int16_t (*Int16BinOp)(int16_t, int16_t); |
| 26 typedef int16_t (*Int16ShiftOp)(int16_t, int); | 26 typedef int16_t (*Int16ShiftOp)(int16_t, int); |
| 27 typedef int8_t (*Int8UnOp)(int8_t); | 27 typedef int8_t (*Int8UnOp)(int8_t); |
| 28 typedef int8_t (*Int8BinOp)(int8_t, int8_t); | 28 typedef int8_t (*Int8BinOp)(int8_t, int8_t); |
| 29 typedef int8_t (*Int8ShiftOp)(int8_t, int); | 29 typedef int8_t (*Int8ShiftOp)(int8_t, int); |
| 30 | 30 |
| 31 #if V8_TARGET_ARCH_ARM | 31 #if V8_TARGET_ARCH_ARM |
| 32 // Floating point specific value functions. | 32 // Floating point specific value functions, only used by ARM so far. |
| 33 int32_t Equal(float a, float b) { return a == b ? -1 : 0; } | 33 int32_t Equal(float a, float b) { return a == b ? 1 : 0; } |
| 34 | 34 |
| 35 int32_t NotEqual(float a, float b) { return a != b ? -1 : 0; } | 35 int32_t NotEqual(float a, float b) { return a != b ? 1 : 0; } |
| 36 #endif // V8_TARGET_ARCH_ARM | 36 #endif // V8_TARGET_ARCH_ARM |
| 37 | 37 |
| 38 // Generic expected value functions. | 38 // Generic expected value functions. |
| 39 template <typename T> | 39 template <typename T> |
| 40 T Negate(T a) { | 40 T Negate(T a) { |
| 41 return -a; | 41 return -a; |
| 42 } | 42 } |
| 43 | 43 |
| 44 template <typename T> | 44 template <typename T> |
| 45 T Add(T a, T b) { | 45 T Add(T a, T b) { |
| (...skipping 27 matching lines...) Expand all Loading... |
| 73 } | 73 } |
| 74 | 74 |
| 75 template <typename T> | 75 template <typename T> |
| 76 T UnsignedMaximum(T a, T b) { | 76 T UnsignedMaximum(T a, T b) { |
| 77 using UnsignedT = typename std::make_unsigned<T>::type; | 77 using UnsignedT = typename std::make_unsigned<T>::type; |
| 78 return static_cast<UnsignedT>(a) >= static_cast<UnsignedT>(b) ? a : b; | 78 return static_cast<UnsignedT>(a) >= static_cast<UnsignedT>(b) ? a : b; |
| 79 } | 79 } |
| 80 | 80 |
| 81 template <typename T> | 81 template <typename T> |
| 82 T Equal(T a, T b) { | 82 T Equal(T a, T b) { |
| 83 return a == b ? -1 : 0; | 83 return a == b ? 1 : 0; |
| 84 } | 84 } |
| 85 | 85 |
| 86 template <typename T> | 86 template <typename T> |
| 87 T NotEqual(T a, T b) { | 87 T NotEqual(T a, T b) { |
| 88 return a != b ? -1 : 0; | 88 return a != b ? 1 : 0; |
| 89 } | 89 } |
| 90 | 90 |
| 91 template <typename T> | 91 template <typename T> |
| 92 T Greater(T a, T b) { | 92 T Greater(T a, T b) { |
| 93 return a > b ? -1 : 0; | 93 return a > b ? 1 : 0; |
| 94 } | 94 } |
| 95 | 95 |
| 96 template <typename T> | 96 template <typename T> |
| 97 T GreaterEqual(T a, T b) { | 97 T GreaterEqual(T a, T b) { |
| 98 return a >= b ? -1 : 0; | 98 return a >= b ? 1 : 0; |
| 99 } | 99 } |
| 100 | 100 |
| 101 template <typename T> | 101 template <typename T> |
| 102 T Less(T a, T b) { | 102 T Less(T a, T b) { |
| 103 return a < b ? -1 : 0; | 103 return a < b ? 1 : 0; |
| 104 } | 104 } |
| 105 | 105 |
| 106 template <typename T> | 106 template <typename T> |
| 107 T LessEqual(T a, T b) { | 107 T LessEqual(T a, T b) { |
| 108 return a <= b ? -1 : 0; | 108 return a <= b ? 1 : 0; |
| 109 } | 109 } |
| 110 | 110 |
| 111 template <typename T> | 111 template <typename T> |
| 112 T UnsignedGreater(T a, T b) { | 112 T UnsignedGreater(T a, T b) { |
| 113 using UnsignedT = typename std::make_unsigned<T>::type; | 113 using UnsignedT = typename std::make_unsigned<T>::type; |
| 114 return static_cast<UnsignedT>(a) > static_cast<UnsignedT>(b) ? -1 : 0; | 114 return static_cast<UnsignedT>(a) > static_cast<UnsignedT>(b) ? 1 : 0; |
| 115 } | 115 } |
| 116 | 116 |
| 117 template <typename T> | 117 template <typename T> |
| 118 T UnsignedGreaterEqual(T a, T b) { | 118 T UnsignedGreaterEqual(T a, T b) { |
| 119 using UnsignedT = typename std::make_unsigned<T>::type; | 119 using UnsignedT = typename std::make_unsigned<T>::type; |
| 120 return static_cast<UnsignedT>(a) >= static_cast<UnsignedT>(b) ? -1 : 0; | 120 return static_cast<UnsignedT>(a) >= static_cast<UnsignedT>(b) ? 1 : 0; |
| 121 } | 121 } |
| 122 | 122 |
| 123 template <typename T> | 123 template <typename T> |
| 124 T UnsignedLess(T a, T b) { | 124 T UnsignedLess(T a, T b) { |
| 125 using UnsignedT = typename std::make_unsigned<T>::type; | 125 using UnsignedT = typename std::make_unsigned<T>::type; |
| 126 return static_cast<UnsignedT>(a) < static_cast<UnsignedT>(b) ? -1 : 0; | 126 return static_cast<UnsignedT>(a) < static_cast<UnsignedT>(b) ? 1 : 0; |
| 127 } | 127 } |
| 128 | 128 |
| 129 template <typename T> | 129 template <typename T> |
| 130 T UnsignedLessEqual(T a, T b) { | 130 T UnsignedLessEqual(T a, T b) { |
| 131 using UnsignedT = typename std::make_unsigned<T>::type; | 131 using UnsignedT = typename std::make_unsigned<T>::type; |
| 132 return static_cast<UnsignedT>(a) <= static_cast<UnsignedT>(b) ? -1 : 0; | 132 return static_cast<UnsignedT>(a) <= static_cast<UnsignedT>(b) ? 1 : 0; |
| 133 } | 133 } |
| 134 | 134 |
| 135 template <typename T> | 135 template <typename T> |
| 136 T LogicalShiftLeft(T a, int shift) { | 136 T LogicalShiftLeft(T a, int shift) { |
| 137 return a << shift; | 137 return a << shift; |
| 138 } | 138 } |
| 139 | 139 |
| 140 template <typename T> | 140 template <typename T> |
| 141 T LogicalShiftRight(T a, int shift) { | 141 T LogicalShiftRight(T a, int shift) { |
| 142 using UnsignedT = typename std::make_unsigned<T>::type; | 142 using UnsignedT = typename std::make_unsigned<T>::type; |
| (...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 279 WASM_SIMD_CHECK_F32_LANE(TYPE, value, lv0, 0) \ | 279 WASM_SIMD_CHECK_F32_LANE(TYPE, value, lv0, 0) \ |
| 280 , WASM_SIMD_CHECK_F32_LANE(TYPE, value, lv1, 1), \ | 280 , WASM_SIMD_CHECK_F32_LANE(TYPE, value, lv1, 1), \ |
| 281 WASM_SIMD_CHECK_F32_LANE(TYPE, value, lv2, 2), \ | 281 WASM_SIMD_CHECK_F32_LANE(TYPE, value, lv2, 2), \ |
| 282 WASM_SIMD_CHECK_F32_LANE(TYPE, value, lv3, 3) | 282 WASM_SIMD_CHECK_F32_LANE(TYPE, value, lv3, 3) |
| 283 | 283 |
| 284 #define WASM_SIMD_CHECK_SPLAT4_F32(TYPE, value, lv) \ | 284 #define WASM_SIMD_CHECK_SPLAT4_F32(TYPE, value, lv) \ |
| 285 WASM_SIMD_CHECK4_F32(TYPE, value, lv, lv, lv, lv) | 285 WASM_SIMD_CHECK4_F32(TYPE, value, lv, lv, lv, lv) |
| 286 | 286 |
| 287 #define TO_BYTE(val) static_cast<byte>(val) | 287 #define TO_BYTE(val) static_cast<byte>(val) |
| 288 #define WASM_SIMD_OP(op) kSimdPrefix, TO_BYTE(op) | 288 #define WASM_SIMD_OP(op) kSimdPrefix, TO_BYTE(op) |
| 289 #define WASM_SIMD_SPLAT(Type, x) x, WASM_SIMD_OP(kExpr##Type##Splat) |
| 289 #define WASM_SIMD_UNOP(op, x) x, WASM_SIMD_OP(op) | 290 #define WASM_SIMD_UNOP(op, x) x, WASM_SIMD_OP(op) |
| 290 #define WASM_SIMD_BINOP(op, x, y) x, y, WASM_SIMD_OP(op) | 291 #define WASM_SIMD_BINOP(op, x, y) x, y, WASM_SIMD_OP(op) |
| 291 #define WASM_SIMD_SHIFT_OP(op, shift, x) x, WASM_SIMD_OP(op), TO_BYTE(shift) | 292 #define WASM_SIMD_SHIFT_OP(op, shift, x) x, WASM_SIMD_OP(op), TO_BYTE(shift) |
| 292 #define WASM_SIMD_SELECT(format, x, y, z) \ | 293 #define WASM_SIMD_SELECT(format, x, y, z) \ |
| 293 x, y, z, WASM_SIMD_OP(kExprS##format##Select) | 294 x, y, z, WASM_SIMD_OP(kExprS##format##Select) |
| 295 // Since boolean vectors can't be checked directly, materialize them into |
| 296 // integer vectors using a Select operation. |
| 297 #define WASM_SIMD_MATERIALIZE_BOOLS(format, x) \ |
| 298 x, WASM_SIMD_I##format##_SPLAT(WASM_ONE), \ |
| 299 WASM_SIMD_I##format##_SPLAT(WASM_ZERO), \ |
| 300 WASM_SIMD_OP(kExprS##format##Select) |
| 294 | 301 |
| 295 #define WASM_SIMD_I16x8_SPLAT(x) x, WASM_SIMD_OP(kExprI16x8Splat) | 302 #define WASM_SIMD_I16x8_SPLAT(x) x, WASM_SIMD_OP(kExprI16x8Splat) |
| 296 #define WASM_SIMD_I16x8_EXTRACT_LANE(lane, x) \ | 303 #define WASM_SIMD_I16x8_EXTRACT_LANE(lane, x) \ |
| 297 x, WASM_SIMD_OP(kExprI16x8ExtractLane), TO_BYTE(lane) | 304 x, WASM_SIMD_OP(kExprI16x8ExtractLane), TO_BYTE(lane) |
| 298 #define WASM_SIMD_I16x8_REPLACE_LANE(lane, x, y) \ | 305 #define WASM_SIMD_I16x8_REPLACE_LANE(lane, x, y) \ |
| 299 x, y, WASM_SIMD_OP(kExprI16x8ReplaceLane), TO_BYTE(lane) | 306 x, y, WASM_SIMD_OP(kExprI16x8ReplaceLane), TO_BYTE(lane) |
| 300 #define WASM_SIMD_I8x16_SPLAT(x) x, WASM_SIMD_OP(kExprI8x16Splat) | 307 #define WASM_SIMD_I8x16_SPLAT(x) x, WASM_SIMD_OP(kExprI8x16Splat) |
| 301 #define WASM_SIMD_I8x16_EXTRACT_LANE(lane, x) \ | 308 #define WASM_SIMD_I8x16_EXTRACT_LANE(lane, x) \ |
| 302 x, WASM_SIMD_OP(kExprI8x16ExtractLane), TO_BYTE(lane) | 309 x, WASM_SIMD_OP(kExprI8x16ExtractLane), TO_BYTE(lane) |
| 303 #define WASM_SIMD_I8x16_REPLACE_LANE(lane, x, y) \ | 310 #define WASM_SIMD_I8x16_REPLACE_LANE(lane, x, y) \ |
| (...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 425 void RunF32x4CompareOpTest(WasmOpcode simd_op, FloatCompareOp expected_op) { | 432 void RunF32x4CompareOpTest(WasmOpcode simd_op, FloatCompareOp expected_op) { |
| 426 FLAG_wasm_simd_prototype = true; | 433 FLAG_wasm_simd_prototype = true; |
| 427 WasmRunner<int32_t, float, float, int32_t> r(kExecuteCompiled); | 434 WasmRunner<int32_t, float, float, int32_t> r(kExecuteCompiled); |
| 428 byte a = 0; | 435 byte a = 0; |
| 429 byte b = 1; | 436 byte b = 1; |
| 430 byte expected = 2; | 437 byte expected = 2; |
| 431 byte simd0 = r.AllocateLocal(kWasmS128); | 438 byte simd0 = r.AllocateLocal(kWasmS128); |
| 432 byte simd1 = r.AllocateLocal(kWasmS128); | 439 byte simd1 = r.AllocateLocal(kWasmS128); |
| 433 BUILD(r, WASM_SET_LOCAL(simd0, WASM_SIMD_F32x4_SPLAT(WASM_GET_LOCAL(a))), | 440 BUILD(r, WASM_SET_LOCAL(simd0, WASM_SIMD_F32x4_SPLAT(WASM_GET_LOCAL(a))), |
| 434 WASM_SET_LOCAL(simd1, WASM_SIMD_F32x4_SPLAT(WASM_GET_LOCAL(b))), | 441 WASM_SET_LOCAL(simd1, WASM_SIMD_F32x4_SPLAT(WASM_GET_LOCAL(b))), |
| 435 WASM_SET_LOCAL(simd1, WASM_SIMD_BINOP(simd_op, WASM_GET_LOCAL(simd0), | 442 WASM_SET_LOCAL(simd1, |
| 436 WASM_GET_LOCAL(simd1))), | 443 WASM_SIMD_MATERIALIZE_BOOLS( |
| 444 32x4, WASM_SIMD_BINOP(simd_op, WASM_GET_LOCAL(simd0), |
| 445 WASM_GET_LOCAL(simd1)))), |
| 437 WASM_SIMD_CHECK_SPLAT4(I32x4, simd1, I32, expected), WASM_ONE); | 446 WASM_SIMD_CHECK_SPLAT4(I32x4, simd1, I32, expected), WASM_ONE); |
| 438 | 447 |
| 439 FOR_FLOAT32_INPUTS(i) { | 448 FOR_FLOAT32_INPUTS(i) { |
| 440 if (std::isnan(*i)) continue; | 449 if (std::isnan(*i)) continue; |
| 441 FOR_FLOAT32_INPUTS(j) { | 450 FOR_FLOAT32_INPUTS(j) { |
| 442 if (std::isnan(*j)) continue; | 451 if (std::isnan(*j)) continue; |
| 443 // SIMD on some platforms may handle denormalized numbers differently. | 452 // SIMD on some platforms may handle denormalized numbers differently. |
| 444 // Check for number pairs that are very close together. | 453 // Check for number pairs that are very close together. |
| 445 if (std::fpclassify(*i - *j) == FP_SUBNORMAL) continue; | 454 if (std::fpclassify(*i - *j) == FP_SUBNORMAL) continue; |
| 446 CHECK_EQ(1, r.Call(*i, *j, expected_op(*i, *j))); | 455 CHECK_EQ(1, r.Call(*i, *j, expected_op(*i, *j))); |
| (...skipping 343 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 790 | 799 |
| 791 WASM_EXEC_TEST(I32x4Sub) { RunI32x4BinOpTest(kExprI32x4Sub, Sub); } | 800 WASM_EXEC_TEST(I32x4Sub) { RunI32x4BinOpTest(kExprI32x4Sub, Sub); } |
| 792 | 801 |
| 793 #if V8_TARGET_ARCH_ARM | 802 #if V8_TARGET_ARCH_ARM |
| 794 WASM_EXEC_TEST(I32x4Mul) { RunI32x4BinOpTest(kExprI32x4Mul, Mul); } | 803 WASM_EXEC_TEST(I32x4Mul) { RunI32x4BinOpTest(kExprI32x4Mul, Mul); } |
| 795 | 804 |
| 796 WASM_EXEC_TEST(I32x4Min) { RunI32x4BinOpTest(kExprI32x4MinS, Minimum); } | 805 WASM_EXEC_TEST(I32x4Min) { RunI32x4BinOpTest(kExprI32x4MinS, Minimum); } |
| 797 | 806 |
| 798 WASM_EXEC_TEST(I32x4Max) { RunI32x4BinOpTest(kExprI32x4MaxS, Maximum); } | 807 WASM_EXEC_TEST(I32x4Max) { RunI32x4BinOpTest(kExprI32x4MaxS, Maximum); } |
| 799 | 808 |
| 800 WASM_EXEC_TEST(I32x4Equal) { RunI32x4BinOpTest(kExprI32x4Eq, Equal); } | |
| 801 | |
| 802 WASM_EXEC_TEST(I32x4NotEqual) { RunI32x4BinOpTest(kExprI32x4Ne, NotEqual); } | |
| 803 | |
| 804 WASM_EXEC_TEST(I32x4Greater) { RunI32x4BinOpTest(kExprI32x4GtS, Greater); } | |
| 805 | |
| 806 WASM_EXEC_TEST(I32x4GreaterEqual) { | |
| 807 RunI32x4BinOpTest(kExprI32x4GeS, GreaterEqual); | |
| 808 } | |
| 809 | |
| 810 WASM_EXEC_TEST(I32x4Less) { RunI32x4BinOpTest(kExprI32x4LtS, Less); } | |
| 811 | |
| 812 WASM_EXEC_TEST(I32x4LessEqual) { RunI32x4BinOpTest(kExprI32x4LeS, LessEqual); } | |
| 813 | |
| 814 WASM_EXEC_TEST(Ui32x4Min) { | 809 WASM_EXEC_TEST(Ui32x4Min) { |
| 815 RunI32x4BinOpTest(kExprI32x4MinU, UnsignedMinimum); | 810 RunI32x4BinOpTest(kExprI32x4MinU, UnsignedMinimum); |
| 816 } | 811 } |
| 817 | 812 |
| 818 WASM_EXEC_TEST(Ui32x4Max) { | 813 WASM_EXEC_TEST(Ui32x4Max) { |
| 819 RunI32x4BinOpTest(kExprI32x4MaxU, UnsignedMaximum); | 814 RunI32x4BinOpTest(kExprI32x4MaxU, UnsignedMaximum); |
| 820 } | 815 } |
| 821 | 816 |
| 822 WASM_EXEC_TEST(Ui32x4Greater) { | |
| 823 RunI32x4BinOpTest(kExprI32x4GtU, UnsignedGreater); | |
| 824 } | |
| 825 | |
| 826 WASM_EXEC_TEST(Ui32x4GreaterEqual) { | |
| 827 RunI32x4BinOpTest(kExprI32x4GeU, UnsignedGreaterEqual); | |
| 828 } | |
| 829 | |
| 830 WASM_EXEC_TEST(Ui32x4Less) { RunI32x4BinOpTest(kExprI32x4LtU, UnsignedLess); } | |
| 831 | |
| 832 WASM_EXEC_TEST(Ui32x4LessEqual) { | |
| 833 RunI32x4BinOpTest(kExprI32x4LeU, UnsignedLessEqual); | |
| 834 } | |
| 835 | |
| 836 WASM_EXEC_TEST(S128And) { RunI32x4BinOpTest(kExprS128And, And); } | 817 WASM_EXEC_TEST(S128And) { RunI32x4BinOpTest(kExprS128And, And); } |
| 837 | 818 |
| 838 WASM_EXEC_TEST(S128Or) { RunI32x4BinOpTest(kExprS128Or, Or); } | 819 WASM_EXEC_TEST(S128Or) { RunI32x4BinOpTest(kExprS128Or, Or); } |
| 839 | 820 |
| 840 WASM_EXEC_TEST(S128Xor) { RunI32x4BinOpTest(kExprS128Xor, Xor); } | 821 WASM_EXEC_TEST(S128Xor) { RunI32x4BinOpTest(kExprS128Xor, Xor); } |
| 841 | 822 |
| 823 void RunI32x4CompareOpTest(WasmOpcode simd_op, Int32BinOp expected_op) { |
| 824 FLAG_wasm_simd_prototype = true; |
| 825 WasmRunner<int32_t, int32_t, int32_t, int32_t> r(kExecuteCompiled); |
| 826 byte a = 0; |
| 827 byte b = 1; |
| 828 byte expected = 2; |
| 829 byte simd0 = r.AllocateLocal(kWasmS128); |
| 830 byte simd1 = r.AllocateLocal(kWasmS128); |
| 831 BUILD(r, WASM_SET_LOCAL(simd0, WASM_SIMD_I32x4_SPLAT(WASM_GET_LOCAL(a))), |
| 832 WASM_SET_LOCAL(simd1, WASM_SIMD_I32x4_SPLAT(WASM_GET_LOCAL(b))), |
| 833 WASM_SET_LOCAL(simd1, |
| 834 WASM_SIMD_MATERIALIZE_BOOLS( |
| 835 32x4, WASM_SIMD_BINOP(simd_op, WASM_GET_LOCAL(simd0), |
| 836 WASM_GET_LOCAL(simd1)))), |
| 837 WASM_SIMD_CHECK_SPLAT4(I32x4, simd1, I32, expected), WASM_ONE); |
| 838 |
| 839 FOR_INT32_INPUTS(i) { |
| 840 FOR_INT32_INPUTS(j) { CHECK_EQ(1, r.Call(*i, *j, expected_op(*i, *j))); } |
| 841 } |
| 842 } |
| 843 |
| 844 WASM_EXEC_TEST(I32x4Equal) { RunI32x4CompareOpTest(kExprI32x4Eq, Equal); } |
| 845 |
| 846 WASM_EXEC_TEST(I32x4NotEqual) { RunI32x4CompareOpTest(kExprI32x4Ne, NotEqual); } |
| 847 |
| 848 WASM_EXEC_TEST(I32x4Greater) { RunI32x4CompareOpTest(kExprI32x4GtS, Greater); } |
| 849 |
| 850 WASM_EXEC_TEST(I32x4GreaterEqual) { |
| 851 RunI32x4CompareOpTest(kExprI32x4GeS, GreaterEqual); |
| 852 } |
| 853 |
| 854 WASM_EXEC_TEST(I32x4Less) { RunI32x4CompareOpTest(kExprI32x4LtS, Less); } |
| 855 |
| 856 WASM_EXEC_TEST(I32x4LessEqual) { |
| 857 RunI32x4CompareOpTest(kExprI32x4LeS, LessEqual); |
| 858 } |
| 859 |
| 860 WASM_EXEC_TEST(Ui32x4Greater) { |
| 861 RunI32x4CompareOpTest(kExprI32x4GtU, UnsignedGreater); |
| 862 } |
| 863 |
| 864 WASM_EXEC_TEST(Ui32x4GreaterEqual) { |
| 865 RunI32x4CompareOpTest(kExprI32x4GeU, UnsignedGreaterEqual); |
| 866 } |
| 867 |
| 868 WASM_EXEC_TEST(Ui32x4Less) { |
| 869 RunI32x4CompareOpTest(kExprI32x4LtU, UnsignedLess); |
| 870 } |
| 871 |
| 872 WASM_EXEC_TEST(Ui32x4LessEqual) { |
| 873 RunI32x4CompareOpTest(kExprI32x4LeU, UnsignedLessEqual); |
| 874 } |
| 875 |
| 842 void RunI32x4ShiftOpTest(WasmOpcode simd_op, Int32ShiftOp expected_op, | 876 void RunI32x4ShiftOpTest(WasmOpcode simd_op, Int32ShiftOp expected_op, |
| 843 int shift) { | 877 int shift) { |
| 844 FLAG_wasm_simd_prototype = true; | 878 FLAG_wasm_simd_prototype = true; |
| 845 WasmRunner<int32_t, int32_t, int32_t> r(kExecuteCompiled); | 879 WasmRunner<int32_t, int32_t, int32_t> r(kExecuteCompiled); |
| 846 byte a = 0; | 880 byte a = 0; |
| 847 byte expected = 1; | 881 byte expected = 1; |
| 848 byte simd = r.AllocateLocal(kWasmS128); | 882 byte simd = r.AllocateLocal(kWasmS128); |
| 849 BUILD(r, WASM_SET_LOCAL(simd, WASM_SIMD_I32x4_SPLAT(WASM_GET_LOCAL(a))), | 883 BUILD(r, WASM_SET_LOCAL(simd, WASM_SIMD_I32x4_SPLAT(WASM_GET_LOCAL(a))), |
| 850 WASM_SET_LOCAL( | 884 WASM_SET_LOCAL( |
| 851 simd, WASM_SIMD_SHIFT_OP(simd_op, shift, WASM_GET_LOCAL(simd))), | 885 simd, WASM_SIMD_SHIFT_OP(simd_op, shift, WASM_GET_LOCAL(simd))), |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 911 WASM_EXEC_TEST(I16x8SubSaturate) { | 945 WASM_EXEC_TEST(I16x8SubSaturate) { |
| 912 RunI16x8BinOpTest(kExprI16x8SubSaturateS, SubSaturate); | 946 RunI16x8BinOpTest(kExprI16x8SubSaturateS, SubSaturate); |
| 913 } | 947 } |
| 914 | 948 |
| 915 WASM_EXEC_TEST(I16x8Mul) { RunI16x8BinOpTest(kExprI16x8Mul, Mul); } | 949 WASM_EXEC_TEST(I16x8Mul) { RunI16x8BinOpTest(kExprI16x8Mul, Mul); } |
| 916 | 950 |
| 917 WASM_EXEC_TEST(I16x8Min) { RunI16x8BinOpTest(kExprI16x8MinS, Minimum); } | 951 WASM_EXEC_TEST(I16x8Min) { RunI16x8BinOpTest(kExprI16x8MinS, Minimum); } |
| 918 | 952 |
| 919 WASM_EXEC_TEST(I16x8Max) { RunI16x8BinOpTest(kExprI16x8MaxS, Maximum); } | 953 WASM_EXEC_TEST(I16x8Max) { RunI16x8BinOpTest(kExprI16x8MaxS, Maximum); } |
| 920 | 954 |
| 921 WASM_EXEC_TEST(I16x8Equal) { RunI16x8BinOpTest(kExprI16x8Eq, Equal); } | |
| 922 | |
| 923 WASM_EXEC_TEST(I16x8NotEqual) { RunI16x8BinOpTest(kExprI16x8Ne, NotEqual); } | |
| 924 | |
| 925 WASM_EXEC_TEST(I16x8Greater) { RunI16x8BinOpTest(kExprI16x8GtS, Greater); } | |
| 926 | |
| 927 WASM_EXEC_TEST(I16x8GreaterEqual) { | |
| 928 RunI16x8BinOpTest(kExprI16x8GeS, GreaterEqual); | |
| 929 } | |
| 930 | |
| 931 WASM_EXEC_TEST(I16x8Less) { RunI16x8BinOpTest(kExprI16x8LtS, Less); } | |
| 932 | |
| 933 WASM_EXEC_TEST(I16x8LessEqual) { RunI16x8BinOpTest(kExprI16x8LeS, LessEqual); } | |
| 934 | |
| 935 WASM_EXEC_TEST(Ui16x8AddSaturate) { | 955 WASM_EXEC_TEST(Ui16x8AddSaturate) { |
| 936 RunI16x8BinOpTest(kExprI16x8AddSaturateU, UnsignedAddSaturate); | 956 RunI16x8BinOpTest(kExprI16x8AddSaturateU, UnsignedAddSaturate); |
| 937 } | 957 } |
| 938 | 958 |
| 939 WASM_EXEC_TEST(Ui16x8SubSaturate) { | 959 WASM_EXEC_TEST(Ui16x8SubSaturate) { |
| 940 RunI16x8BinOpTest(kExprI16x8SubSaturateU, UnsignedSubSaturate); | 960 RunI16x8BinOpTest(kExprI16x8SubSaturateU, UnsignedSubSaturate); |
| 941 } | 961 } |
| 942 | 962 |
| 943 WASM_EXEC_TEST(Ui16x8Min) { | 963 WASM_EXEC_TEST(Ui16x8Min) { |
| 944 RunI16x8BinOpTest(kExprI16x8MinU, UnsignedMinimum); | 964 RunI16x8BinOpTest(kExprI16x8MinU, UnsignedMinimum); |
| 945 } | 965 } |
| 946 | 966 |
| 947 WASM_EXEC_TEST(Ui16x8Max) { | 967 WASM_EXEC_TEST(Ui16x8Max) { |
| 948 RunI16x8BinOpTest(kExprI16x8MaxU, UnsignedMaximum); | 968 RunI16x8BinOpTest(kExprI16x8MaxU, UnsignedMaximum); |
| 949 } | 969 } |
| 950 | 970 |
| 971 void RunI16x8CompareOpTest(WasmOpcode simd_op, Int16BinOp expected_op) { |
| 972 FLAG_wasm_simd_prototype = true; |
| 973 WasmRunner<int32_t, int32_t, int32_t, int32_t> r(kExecuteCompiled); |
| 974 byte a = 0; |
| 975 byte b = 1; |
| 976 byte expected = 2; |
| 977 byte simd0 = r.AllocateLocal(kWasmS128); |
| 978 byte simd1 = r.AllocateLocal(kWasmS128); |
| 979 BUILD(r, WASM_SET_LOCAL(simd0, WASM_SIMD_I16x8_SPLAT(WASM_GET_LOCAL(a))), |
| 980 WASM_SET_LOCAL(simd1, WASM_SIMD_I16x8_SPLAT(WASM_GET_LOCAL(b))), |
| 981 WASM_SET_LOCAL(simd1, |
| 982 WASM_SIMD_MATERIALIZE_BOOLS( |
| 983 16x8, WASM_SIMD_BINOP(simd_op, WASM_GET_LOCAL(simd0), |
| 984 WASM_GET_LOCAL(simd1)))), |
| 985 WASM_SIMD_CHECK_SPLAT8(I16x8, simd1, I32, expected), WASM_ONE); |
| 986 |
| 987 FOR_INT16_INPUTS(i) { |
| 988 FOR_INT16_INPUTS(j) { CHECK_EQ(1, r.Call(*i, *j, expected_op(*i, *j))); } |
| 989 } |
| 990 } |
| 991 |
| 992 WASM_EXEC_TEST(I16x8Equal) { RunI16x8CompareOpTest(kExprI16x8Eq, Equal); } |
| 993 |
| 994 WASM_EXEC_TEST(I16x8NotEqual) { RunI16x8CompareOpTest(kExprI16x8Ne, NotEqual); } |
| 995 |
| 996 WASM_EXEC_TEST(I16x8Greater) { RunI16x8CompareOpTest(kExprI16x8GtS, Greater); } |
| 997 |
| 998 WASM_EXEC_TEST(I16x8GreaterEqual) { |
| 999 RunI16x8CompareOpTest(kExprI16x8GeS, GreaterEqual); |
| 1000 } |
| 1001 |
| 1002 WASM_EXEC_TEST(I16x8Less) { RunI16x8CompareOpTest(kExprI16x8LtS, Less); } |
| 1003 |
| 1004 WASM_EXEC_TEST(I16x8LessEqual) { |
| 1005 RunI16x8CompareOpTest(kExprI16x8LeS, LessEqual); |
| 1006 } |
| 1007 |
| 951 WASM_EXEC_TEST(Ui16x8Greater) { | 1008 WASM_EXEC_TEST(Ui16x8Greater) { |
| 952 RunI16x8BinOpTest(kExprI16x8GtU, UnsignedGreater); | 1009 RunI16x8CompareOpTest(kExprI16x8GtU, UnsignedGreater); |
| 953 } | 1010 } |
| 954 | 1011 |
| 955 WASM_EXEC_TEST(Ui16x8GreaterEqual) { | 1012 WASM_EXEC_TEST(Ui16x8GreaterEqual) { |
| 956 RunI16x8BinOpTest(kExprI16x8GeU, UnsignedGreaterEqual); | 1013 RunI16x8CompareOpTest(kExprI16x8GeU, UnsignedGreaterEqual); |
| 957 } | 1014 } |
| 958 | 1015 |
| 959 WASM_EXEC_TEST(Ui16x8Less) { RunI16x8BinOpTest(kExprI16x8LtU, UnsignedLess); } | 1016 WASM_EXEC_TEST(Ui16x8Less) { |
| 1017 RunI16x8CompareOpTest(kExprI16x8LtU, UnsignedLess); |
| 1018 } |
| 960 | 1019 |
| 961 WASM_EXEC_TEST(Ui16x8LessEqual) { | 1020 WASM_EXEC_TEST(Ui16x8LessEqual) { |
| 962 RunI16x8BinOpTest(kExprI16x8LeU, UnsignedLessEqual); | 1021 RunI16x8CompareOpTest(kExprI16x8LeU, UnsignedLessEqual); |
| 963 } | 1022 } |
| 964 | 1023 |
| 965 void RunI16x8ShiftOpTest(WasmOpcode simd_op, Int16ShiftOp expected_op, | 1024 void RunI16x8ShiftOpTest(WasmOpcode simd_op, Int16ShiftOp expected_op, |
| 966 int shift) { | 1025 int shift) { |
| 967 FLAG_wasm_simd_prototype = true; | 1026 FLAG_wasm_simd_prototype = true; |
| 968 WasmRunner<int32_t, int32_t, int32_t> r(kExecuteCompiled); | 1027 WasmRunner<int32_t, int32_t, int32_t> r(kExecuteCompiled); |
| 969 byte a = 0; | 1028 byte a = 0; |
| 970 byte expected = 1; | 1029 byte expected = 1; |
| 971 byte simd = r.AllocateLocal(kWasmS128); | 1030 byte simd = r.AllocateLocal(kWasmS128); |
| 972 BUILD(r, WASM_SET_LOCAL(simd, WASM_SIMD_I16x8_SPLAT(WASM_GET_LOCAL(a))), | 1031 BUILD(r, WASM_SET_LOCAL(simd, WASM_SIMD_I16x8_SPLAT(WASM_GET_LOCAL(a))), |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1034 WASM_EXEC_TEST(I8x16SubSaturate) { | 1093 WASM_EXEC_TEST(I8x16SubSaturate) { |
| 1035 RunI8x16BinOpTest(kExprI8x16SubSaturateS, SubSaturate); | 1094 RunI8x16BinOpTest(kExprI8x16SubSaturateS, SubSaturate); |
| 1036 } | 1095 } |
| 1037 | 1096 |
| 1038 WASM_EXEC_TEST(I8x16Mul) { RunI8x16BinOpTest(kExprI8x16Mul, Mul); } | 1097 WASM_EXEC_TEST(I8x16Mul) { RunI8x16BinOpTest(kExprI8x16Mul, Mul); } |
| 1039 | 1098 |
| 1040 WASM_EXEC_TEST(I8x16Min) { RunI8x16BinOpTest(kExprI8x16MinS, Minimum); } | 1099 WASM_EXEC_TEST(I8x16Min) { RunI8x16BinOpTest(kExprI8x16MinS, Minimum); } |
| 1041 | 1100 |
| 1042 WASM_EXEC_TEST(I8x16Max) { RunI8x16BinOpTest(kExprI8x16MaxS, Maximum); } | 1101 WASM_EXEC_TEST(I8x16Max) { RunI8x16BinOpTest(kExprI8x16MaxS, Maximum); } |
| 1043 | 1102 |
| 1044 WASM_EXEC_TEST(I8x16Equal) { RunI8x16BinOpTest(kExprI8x16Eq, Equal); } | |
| 1045 | |
| 1046 WASM_EXEC_TEST(I8x16NotEqual) { RunI8x16BinOpTest(kExprI8x16Ne, NotEqual); } | |
| 1047 | |
| 1048 WASM_EXEC_TEST(I8x16Greater) { RunI8x16BinOpTest(kExprI8x16GtS, Greater); } | |
| 1049 | |
| 1050 WASM_EXEC_TEST(I8x16GreaterEqual) { | |
| 1051 RunI8x16BinOpTest(kExprI8x16GeS, GreaterEqual); | |
| 1052 } | |
| 1053 | |
| 1054 WASM_EXEC_TEST(I8x16Less) { RunI8x16BinOpTest(kExprI8x16LtS, Less); } | |
| 1055 | |
| 1056 WASM_EXEC_TEST(I8x16LessEqual) { RunI8x16BinOpTest(kExprI8x16LeS, LessEqual); } | |
| 1057 | |
| 1058 WASM_EXEC_TEST(Ui8x16AddSaturate) { | 1103 WASM_EXEC_TEST(Ui8x16AddSaturate) { |
| 1059 RunI8x16BinOpTest(kExprI8x16AddSaturateU, UnsignedAddSaturate); | 1104 RunI8x16BinOpTest(kExprI8x16AddSaturateU, UnsignedAddSaturate); |
| 1060 } | 1105 } |
| 1061 | 1106 |
| 1062 WASM_EXEC_TEST(Ui8x16SubSaturate) { | 1107 WASM_EXEC_TEST(Ui8x16SubSaturate) { |
| 1063 RunI8x16BinOpTest(kExprI8x16SubSaturateU, UnsignedSubSaturate); | 1108 RunI8x16BinOpTest(kExprI8x16SubSaturateU, UnsignedSubSaturate); |
| 1064 } | 1109 } |
| 1065 | 1110 |
| 1066 WASM_EXEC_TEST(Ui8x16Min) { | 1111 WASM_EXEC_TEST(Ui8x16Min) { |
| 1067 RunI8x16BinOpTest(kExprI8x16MinU, UnsignedMinimum); | 1112 RunI8x16BinOpTest(kExprI8x16MinU, UnsignedMinimum); |
| 1068 } | 1113 } |
| 1069 | 1114 |
| 1070 WASM_EXEC_TEST(Ui8x16Max) { | 1115 WASM_EXEC_TEST(Ui8x16Max) { |
| 1071 RunI8x16BinOpTest(kExprI8x16MaxU, UnsignedMaximum); | 1116 RunI8x16BinOpTest(kExprI8x16MaxU, UnsignedMaximum); |
| 1072 } | 1117 } |
| 1073 | 1118 |
| 1119 void RunI8x16CompareOpTest(WasmOpcode simd_op, Int8BinOp expected_op) { |
| 1120 FLAG_wasm_simd_prototype = true; |
| 1121 WasmRunner<int32_t, int32_t, int32_t, int32_t> r(kExecuteCompiled); |
| 1122 byte a = 0; |
| 1123 byte b = 1; |
| 1124 byte expected = 2; |
| 1125 byte simd0 = r.AllocateLocal(kWasmS128); |
| 1126 byte simd1 = r.AllocateLocal(kWasmS128); |
| 1127 BUILD(r, WASM_SET_LOCAL(simd0, WASM_SIMD_I8x16_SPLAT(WASM_GET_LOCAL(a))), |
| 1128 WASM_SET_LOCAL(simd1, WASM_SIMD_I8x16_SPLAT(WASM_GET_LOCAL(b))), |
| 1129 WASM_SET_LOCAL(simd1, |
| 1130 WASM_SIMD_MATERIALIZE_BOOLS( |
| 1131 8x16, WASM_SIMD_BINOP(simd_op, WASM_GET_LOCAL(simd0), |
| 1132 WASM_GET_LOCAL(simd1)))), |
| 1133 WASM_SIMD_CHECK_SPLAT16(I8x16, simd1, I32, expected), WASM_ONE); |
| 1134 |
| 1135 FOR_INT8_INPUTS(i) { |
| 1136 FOR_INT8_INPUTS(j) { CHECK_EQ(1, r.Call(*i, *j, expected_op(*i, *j))); } |
| 1137 } |
| 1138 } |
| 1139 |
| 1140 WASM_EXEC_TEST(I8x16Equal) { RunI8x16CompareOpTest(kExprI8x16Eq, Equal); } |
| 1141 |
| 1142 WASM_EXEC_TEST(I8x16NotEqual) { RunI8x16CompareOpTest(kExprI8x16Ne, NotEqual); } |
| 1143 |
| 1144 WASM_EXEC_TEST(I8x16Greater) { RunI8x16CompareOpTest(kExprI8x16GtS, Greater); } |
| 1145 |
| 1146 WASM_EXEC_TEST(I8x16GreaterEqual) { |
| 1147 RunI8x16CompareOpTest(kExprI8x16GeS, GreaterEqual); |
| 1148 } |
| 1149 |
| 1150 WASM_EXEC_TEST(I8x16Less) { RunI8x16CompareOpTest(kExprI8x16LtS, Less); } |
| 1151 |
| 1152 WASM_EXEC_TEST(I8x16LessEqual) { |
| 1153 RunI8x16CompareOpTest(kExprI8x16LeS, LessEqual); |
| 1154 } |
| 1155 |
| 1074 WASM_EXEC_TEST(Ui8x16Greater) { | 1156 WASM_EXEC_TEST(Ui8x16Greater) { |
| 1075 RunI8x16BinOpTest(kExprI8x16GtU, UnsignedGreater); | 1157 RunI8x16CompareOpTest(kExprI8x16GtU, UnsignedGreater); |
| 1076 } | 1158 } |
| 1077 | 1159 |
| 1078 WASM_EXEC_TEST(Ui8x16GreaterEqual) { | 1160 WASM_EXEC_TEST(Ui8x16GreaterEqual) { |
| 1079 RunI8x16BinOpTest(kExprI8x16GeU, UnsignedGreaterEqual); | 1161 RunI8x16CompareOpTest(kExprI8x16GeU, UnsignedGreaterEqual); |
| 1080 } | 1162 } |
| 1081 | 1163 |
| 1082 WASM_EXEC_TEST(Ui8x16Less) { RunI8x16BinOpTest(kExprI8x16LtU, UnsignedLess); } | 1164 WASM_EXEC_TEST(Ui8x16Less) { |
| 1165 RunI8x16CompareOpTest(kExprI8x16LtU, UnsignedLess); |
| 1166 } |
| 1083 | 1167 |
| 1084 WASM_EXEC_TEST(Ui8x16LessEqual) { | 1168 WASM_EXEC_TEST(Ui8x16LessEqual) { |
| 1085 RunI8x16BinOpTest(kExprI8x16LeU, UnsignedLessEqual); | 1169 RunI8x16CompareOpTest(kExprI8x16LeU, UnsignedLessEqual); |
| 1086 } | 1170 } |
| 1087 | 1171 |
| 1088 void RunI8x16ShiftOpTest(WasmOpcode simd_op, Int8ShiftOp expected_op, | 1172 void RunI8x16ShiftOpTest(WasmOpcode simd_op, Int8ShiftOp expected_op, |
| 1089 int shift) { | 1173 int shift) { |
| 1090 FLAG_wasm_simd_prototype = true; | 1174 FLAG_wasm_simd_prototype = true; |
| 1091 WasmRunner<int32_t, int32_t, int32_t> r(kExecuteCompiled); | 1175 WasmRunner<int32_t, int32_t, int32_t> r(kExecuteCompiled); |
| 1092 byte a = 0; | 1176 byte a = 0; |
| 1093 byte expected = 1; | 1177 byte expected = 1; |
| 1094 byte simd = r.AllocateLocal(kWasmS128); | 1178 byte simd = r.AllocateLocal(kWasmS128); |
| 1095 BUILD(r, WASM_SET_LOCAL(simd, WASM_SIMD_I8x16_SPLAT(WASM_GET_LOCAL(a))), | 1179 BUILD(r, WASM_SET_LOCAL(simd, WASM_SIMD_I8x16_SPLAT(WASM_GET_LOCAL(a))), |
| 1096 WASM_SET_LOCAL( | 1180 WASM_SET_LOCAL( |
| 1097 simd, WASM_SIMD_SHIFT_OP(simd_op, shift, WASM_GET_LOCAL(simd))), | 1181 simd, WASM_SIMD_SHIFT_OP(simd_op, shift, WASM_GET_LOCAL(simd))), |
| 1098 WASM_SIMD_CHECK_SPLAT16(I8x16, simd, I32, expected), WASM_ONE); | 1182 WASM_SIMD_CHECK_SPLAT16(I8x16, simd, I32, expected), WASM_ONE); |
| 1099 | 1183 |
| 1100 FOR_INT8_INPUTS(i) { CHECK_EQ(1, r.Call(*i, expected_op(*i, shift))); } | 1184 FOR_INT8_INPUTS(i) { CHECK_EQ(1, r.Call(*i, expected_op(*i, shift))); } |
| 1101 } | 1185 } |
| 1102 | 1186 |
| 1103 WASM_EXEC_TEST(I8x16Shl) { | 1187 WASM_EXEC_TEST(I8x16Shl) { |
| 1104 RunI8x16ShiftOpTest(kExprI8x16Shl, LogicalShiftLeft, 1); | 1188 RunI8x16ShiftOpTest(kExprI8x16Shl, LogicalShiftLeft, 1); |
| 1105 } | 1189 } |
| 1106 | 1190 |
| 1107 WASM_EXEC_TEST(I8x16ShrS) { | 1191 WASM_EXEC_TEST(I8x16ShrS) { |
| 1108 RunI8x16ShiftOpTest(kExprI8x16ShrS, ArithmeticShiftRight, 1); | 1192 RunI8x16ShiftOpTest(kExprI8x16ShrS, ArithmeticShiftRight, 1); |
| 1109 } | 1193 } |
| 1110 | 1194 |
| 1111 WASM_EXEC_TEST(I8x16ShrU) { | 1195 WASM_EXEC_TEST(I8x16ShrU) { |
| 1112 RunI8x16ShiftOpTest(kExprI8x16ShrU, LogicalShiftRight, 1); | 1196 RunI8x16ShiftOpTest(kExprI8x16ShrU, LogicalShiftRight, 1); |
| 1113 } | 1197 } |
| 1114 | 1198 |
| 1199 // Test Select by making a mask where the first two lanes are true and the rest |
| 1200 // false, and comparing for non-equality with zero to materialize a bool vector. |
| 1115 #define WASM_SIMD_SELECT_TEST(format) \ | 1201 #define WASM_SIMD_SELECT_TEST(format) \ |
| 1116 WASM_EXEC_TEST(S##format##Select) { \ | 1202 WASM_EXEC_TEST(S##format##Select) { \ |
| 1117 FLAG_wasm_simd_prototype = true; \ | 1203 FLAG_wasm_simd_prototype = true; \ |
| 1118 WasmRunner<int32_t, int32_t, int32_t> r(kExecuteCompiled); \ | 1204 WasmRunner<int32_t, int32_t, int32_t> r(kExecuteCompiled); \ |
| 1119 byte val1 = 0; \ | 1205 byte val1 = 0; \ |
| 1120 byte val2 = 1; \ | 1206 byte val2 = 1; \ |
| 1121 byte mask = r.AllocateLocal(kWasmS128); \ | |
| 1122 byte src1 = r.AllocateLocal(kWasmS128); \ | 1207 byte src1 = r.AllocateLocal(kWasmS128); \ |
| 1123 byte src2 = r.AllocateLocal(kWasmS128); \ | 1208 byte src2 = r.AllocateLocal(kWasmS128); \ |
| 1124 BUILD(r, WASM_SET_LOCAL(mask, WASM_SIMD_I##format##_SPLAT(WASM_ZERO)), \ | 1209 byte zero = r.AllocateLocal(kWasmS128); \ |
| 1125 WASM_SET_LOCAL(src1, \ | 1210 byte mask = r.AllocateLocal(kWasmS128); \ |
| 1126 WASM_SIMD_I##format##_SPLAT(WASM_GET_LOCAL(val1))), \ | 1211 BUILD(r, WASM_SET_LOCAL( \ |
| 1212 src1, WASM_SIMD_I##format##_SPLAT(WASM_GET_LOCAL(val1))), \ |
| 1127 WASM_SET_LOCAL(src2, \ | 1213 WASM_SET_LOCAL(src2, \ |
| 1128 WASM_SIMD_I##format##_SPLAT(WASM_GET_LOCAL(val2))), \ | 1214 WASM_SIMD_I##format##_SPLAT(WASM_GET_LOCAL(val2))), \ |
| 1215 WASM_SET_LOCAL(zero, WASM_SIMD_I##format##_SPLAT(WASM_ZERO)), \ |
| 1129 WASM_SET_LOCAL(mask, WASM_SIMD_I##format##_REPLACE_LANE( \ | 1216 WASM_SET_LOCAL(mask, WASM_SIMD_I##format##_REPLACE_LANE( \ |
| 1130 1, WASM_GET_LOCAL(mask), WASM_I32V(-1))), \ | 1217 1, WASM_GET_LOCAL(zero), WASM_I32V(-1))), \ |
| 1131 WASM_SET_LOCAL(mask, WASM_SIMD_I##format##_REPLACE_LANE( \ | 1218 WASM_SET_LOCAL(mask, WASM_SIMD_I##format##_REPLACE_LANE( \ |
| 1132 2, WASM_GET_LOCAL(mask), WASM_I32V(-1))), \ | 1219 2, WASM_GET_LOCAL(mask), WASM_I32V(-1))), \ |
| 1133 WASM_SET_LOCAL(mask, WASM_SIMD_SELECT(format, WASM_GET_LOCAL(mask), \ | 1220 WASM_SET_LOCAL( \ |
| 1134 WASM_GET_LOCAL(src1), \ | 1221 mask, \ |
| 1135 WASM_GET_LOCAL(src2))), \ | 1222 WASM_SIMD_SELECT(format, WASM_SIMD_BINOP(kExprI##format##Ne, \ |
| 1223 WASM_GET_LOCAL(mask), \ |
| 1224 WASM_GET_LOCAL(zero)), \ |
| 1225 WASM_GET_LOCAL(src1), WASM_GET_LOCAL(src2))), \ |
| 1136 WASM_SIMD_CHECK_LANE(I##format, mask, I32, val2, 0), \ | 1226 WASM_SIMD_CHECK_LANE(I##format, mask, I32, val2, 0), \ |
| 1137 WASM_SIMD_CHECK_LANE(I##format, mask, I32, val1, 1), \ | 1227 WASM_SIMD_CHECK_LANE(I##format, mask, I32, val1, 1), \ |
| 1138 WASM_SIMD_CHECK_LANE(I##format, mask, I32, val1, 2), \ | 1228 WASM_SIMD_CHECK_LANE(I##format, mask, I32, val1, 2), \ |
| 1139 WASM_SIMD_CHECK_LANE(I##format, mask, I32, val2, 3), WASM_ONE); \ | 1229 WASM_SIMD_CHECK_LANE(I##format, mask, I32, val2, 3), WASM_ONE); \ |
| 1140 \ | 1230 \ |
| 1141 CHECK_EQ(1, r.Call(0x12, 0x34)); \ | 1231 CHECK_EQ(1, r.Call(0x12, 0x34)); \ |
| 1142 } | 1232 } |
| 1143 | 1233 |
| 1144 WASM_SIMD_SELECT_TEST(32x4) | 1234 WASM_SIMD_SELECT_TEST(32x4) |
| 1145 WASM_SIMD_SELECT_TEST(16x8) | 1235 WASM_SIMD_SELECT_TEST(16x8) |
| 1146 WASM_SIMD_SELECT_TEST(8x16) | 1236 WASM_SIMD_SELECT_TEST(8x16) |
| 1147 #endif // V8_TARGET_ARCH_ARM | 1237 #endif // V8_TARGET_ARCH_ARM |
| OLD | NEW |