Index: test/cctest/wasm/test-run-wasm-simd.cc |
diff --git a/test/cctest/wasm/test-run-wasm-simd.cc b/test/cctest/wasm/test-run-wasm-simd.cc |
index 32fa65331e3f62c9122c77f21f5aceb9337dc3a5..6b60ff972ac3f44ffdd7e32d978000e1d36f9623 100644 |
--- a/test/cctest/wasm/test-run-wasm-simd.cc |
+++ b/test/cctest/wasm/test-run-wasm-simd.cc |
@@ -29,10 +29,10 @@ typedef int8_t (*Int8BinOp)(int8_t, int8_t); |
typedef int8_t (*Int8ShiftOp)(int8_t, int); |
#if V8_TARGET_ARCH_ARM |
-// Floating point specific value functions. |
-int32_t Equal(float a, float b) { return a == b ? -1 : 0; } |
+// Floating point specific value functions, only used by ARM so far. |
+int32_t Equal(float a, float b) { return a == b ? 1 : 0; } |
-int32_t NotEqual(float a, float b) { return a != b ? -1 : 0; } |
+int32_t NotEqual(float a, float b) { return a != b ? 1 : 0; } |
#endif // V8_TARGET_ARCH_ARM |
// Generic expected value functions. |
@@ -80,56 +80,56 @@ T UnsignedMaximum(T a, T b) { |
template <typename T> |
T Equal(T a, T b) { |
- return a == b ? -1 : 0; |
+ return a == b ? 1 : 0; |
} |
template <typename T> |
T NotEqual(T a, T b) { |
- return a != b ? -1 : 0; |
+ return a != b ? 1 : 0; |
} |
template <typename T> |
T Greater(T a, T b) { |
- return a > b ? -1 : 0; |
+ return a > b ? 1 : 0; |
} |
template <typename T> |
T GreaterEqual(T a, T b) { |
- return a >= b ? -1 : 0; |
+ return a >= b ? 1 : 0; |
} |
template <typename T> |
T Less(T a, T b) { |
- return a < b ? -1 : 0; |
+ return a < b ? 1 : 0; |
} |
template <typename T> |
T LessEqual(T a, T b) { |
- return a <= b ? -1 : 0; |
+ return a <= b ? 1 : 0; |
} |
template <typename T> |
T UnsignedGreater(T a, T b) { |
using UnsignedT = typename std::make_unsigned<T>::type; |
- return static_cast<UnsignedT>(a) > static_cast<UnsignedT>(b) ? -1 : 0; |
+ return static_cast<UnsignedT>(a) > static_cast<UnsignedT>(b) ? 1 : 0; |
} |
template <typename T> |
T UnsignedGreaterEqual(T a, T b) { |
using UnsignedT = typename std::make_unsigned<T>::type; |
- return static_cast<UnsignedT>(a) >= static_cast<UnsignedT>(b) ? -1 : 0; |
+ return static_cast<UnsignedT>(a) >= static_cast<UnsignedT>(b) ? 1 : 0; |
} |
template <typename T> |
T UnsignedLess(T a, T b) { |
using UnsignedT = typename std::make_unsigned<T>::type; |
- return static_cast<UnsignedT>(a) < static_cast<UnsignedT>(b) ? -1 : 0; |
+ return static_cast<UnsignedT>(a) < static_cast<UnsignedT>(b) ? 1 : 0; |
} |
template <typename T> |
T UnsignedLessEqual(T a, T b) { |
using UnsignedT = typename std::make_unsigned<T>::type; |
- return static_cast<UnsignedT>(a) <= static_cast<UnsignedT>(b) ? -1 : 0; |
+ return static_cast<UnsignedT>(a) <= static_cast<UnsignedT>(b) ? 1 : 0; |
} |
template <typename T> |
@@ -286,11 +286,18 @@ T Not(T a) { |
#define TO_BYTE(val) static_cast<byte>(val) |
#define WASM_SIMD_OP(op) kSimdPrefix, TO_BYTE(op) |
+#define WASM_SIMD_SPLAT(Type, x) x, WASM_SIMD_OP(kExpr##Type##Splat) |
#define WASM_SIMD_UNOP(op, x) x, WASM_SIMD_OP(op) |
#define WASM_SIMD_BINOP(op, x, y) x, y, WASM_SIMD_OP(op) |
#define WASM_SIMD_SHIFT_OP(op, shift, x) x, WASM_SIMD_OP(op), TO_BYTE(shift) |
#define WASM_SIMD_SELECT(format, x, y, z) \ |
x, y, z, WASM_SIMD_OP(kExprS##format##Select) |
+// Since boolean vectors can't be checked directly, materialize them into |
+// integer vectors using a Select operation. |
+#define WASM_SIMD_MATERIALIZE_BOOLS(format, x) \ |
+ x, WASM_SIMD_I##format##_SPLAT(WASM_ONE), \ |
+ WASM_SIMD_I##format##_SPLAT(WASM_ZERO), \ |
+ WASM_SIMD_OP(kExprS##format##Select) |
#define WASM_SIMD_I16x8_SPLAT(x) x, WASM_SIMD_OP(kExprI16x8Splat) |
#define WASM_SIMD_I16x8_EXTRACT_LANE(lane, x) \ |
@@ -432,8 +439,10 @@ void RunF32x4CompareOpTest(WasmOpcode simd_op, FloatCompareOp expected_op) { |
byte simd1 = r.AllocateLocal(kWasmS128); |
BUILD(r, WASM_SET_LOCAL(simd0, WASM_SIMD_F32x4_SPLAT(WASM_GET_LOCAL(a))), |
WASM_SET_LOCAL(simd1, WASM_SIMD_F32x4_SPLAT(WASM_GET_LOCAL(b))), |
- WASM_SET_LOCAL(simd1, WASM_SIMD_BINOP(simd_op, WASM_GET_LOCAL(simd0), |
- WASM_GET_LOCAL(simd1))), |
+ WASM_SET_LOCAL(simd1, |
+ WASM_SIMD_MATERIALIZE_BOOLS( |
+ 32x4, WASM_SIMD_BINOP(simd_op, WASM_GET_LOCAL(simd0), |
+ WASM_GET_LOCAL(simd1)))), |
WASM_SIMD_CHECK_SPLAT4(I32x4, simd1, I32, expected), WASM_ONE); |
FOR_FLOAT32_INPUTS(i) { |
@@ -797,48 +806,73 @@ WASM_EXEC_TEST(I32x4Min) { RunI32x4BinOpTest(kExprI32x4MinS, Minimum); } |
WASM_EXEC_TEST(I32x4Max) { RunI32x4BinOpTest(kExprI32x4MaxS, Maximum); } |
-WASM_EXEC_TEST(I32x4Equal) { RunI32x4BinOpTest(kExprI32x4Eq, Equal); } |
+WASM_EXEC_TEST(Ui32x4Min) { |
+ RunI32x4BinOpTest(kExprI32x4MinU, UnsignedMinimum); |
+} |
+ |
+WASM_EXEC_TEST(Ui32x4Max) { |
+ RunI32x4BinOpTest(kExprI32x4MaxU, UnsignedMaximum); |
+} |
+ |
+WASM_EXEC_TEST(S128And) { RunI32x4BinOpTest(kExprS128And, And); } |
-WASM_EXEC_TEST(I32x4NotEqual) { RunI32x4BinOpTest(kExprI32x4Ne, NotEqual); } |
+WASM_EXEC_TEST(S128Or) { RunI32x4BinOpTest(kExprS128Or, Or); } |
-WASM_EXEC_TEST(I32x4Greater) { RunI32x4BinOpTest(kExprI32x4GtS, Greater); } |
+WASM_EXEC_TEST(S128Xor) { RunI32x4BinOpTest(kExprS128Xor, Xor); } |
-WASM_EXEC_TEST(I32x4GreaterEqual) { |
- RunI32x4BinOpTest(kExprI32x4GeS, GreaterEqual); |
+void RunI32x4CompareOpTest(WasmOpcode simd_op, Int32BinOp expected_op) { |
+ FLAG_wasm_simd_prototype = true; |
+ WasmRunner<int32_t, int32_t, int32_t, int32_t> r(kExecuteCompiled); |
+ byte a = 0; |
+ byte b = 1; |
+ byte expected = 2; |
+ byte simd0 = r.AllocateLocal(kWasmS128); |
+ byte simd1 = r.AllocateLocal(kWasmS128); |
+ BUILD(r, WASM_SET_LOCAL(simd0, WASM_SIMD_I32x4_SPLAT(WASM_GET_LOCAL(a))), |
+ WASM_SET_LOCAL(simd1, WASM_SIMD_I32x4_SPLAT(WASM_GET_LOCAL(b))), |
+ WASM_SET_LOCAL(simd1, |
+ WASM_SIMD_MATERIALIZE_BOOLS( |
+ 32x4, WASM_SIMD_BINOP(simd_op, WASM_GET_LOCAL(simd0), |
+ WASM_GET_LOCAL(simd1)))), |
+ WASM_SIMD_CHECK_SPLAT4(I32x4, simd1, I32, expected), WASM_ONE); |
+ |
+ FOR_INT32_INPUTS(i) { |
+ FOR_INT32_INPUTS(j) { CHECK_EQ(1, r.Call(*i, *j, expected_op(*i, *j))); } |
+ } |
} |
-WASM_EXEC_TEST(I32x4Less) { RunI32x4BinOpTest(kExprI32x4LtS, Less); } |
+WASM_EXEC_TEST(I32x4Equal) { RunI32x4CompareOpTest(kExprI32x4Eq, Equal); } |
-WASM_EXEC_TEST(I32x4LessEqual) { RunI32x4BinOpTest(kExprI32x4LeS, LessEqual); } |
+WASM_EXEC_TEST(I32x4NotEqual) { RunI32x4CompareOpTest(kExprI32x4Ne, NotEqual); } |
-WASM_EXEC_TEST(Ui32x4Min) { |
- RunI32x4BinOpTest(kExprI32x4MinU, UnsignedMinimum); |
+WASM_EXEC_TEST(I32x4Greater) { RunI32x4CompareOpTest(kExprI32x4GtS, Greater); } |
+ |
+WASM_EXEC_TEST(I32x4GreaterEqual) { |
+ RunI32x4CompareOpTest(kExprI32x4GeS, GreaterEqual); |
} |
-WASM_EXEC_TEST(Ui32x4Max) { |
- RunI32x4BinOpTest(kExprI32x4MaxU, UnsignedMaximum); |
+WASM_EXEC_TEST(I32x4Less) { RunI32x4CompareOpTest(kExprI32x4LtS, Less); } |
+ |
+WASM_EXEC_TEST(I32x4LessEqual) { |
+ RunI32x4CompareOpTest(kExprI32x4LeS, LessEqual); |
} |
WASM_EXEC_TEST(Ui32x4Greater) { |
- RunI32x4BinOpTest(kExprI32x4GtU, UnsignedGreater); |
+ RunI32x4CompareOpTest(kExprI32x4GtU, UnsignedGreater); |
} |
WASM_EXEC_TEST(Ui32x4GreaterEqual) { |
- RunI32x4BinOpTest(kExprI32x4GeU, UnsignedGreaterEqual); |
+ RunI32x4CompareOpTest(kExprI32x4GeU, UnsignedGreaterEqual); |
} |
-WASM_EXEC_TEST(Ui32x4Less) { RunI32x4BinOpTest(kExprI32x4LtU, UnsignedLess); } |
+WASM_EXEC_TEST(Ui32x4Less) { |
+ RunI32x4CompareOpTest(kExprI32x4LtU, UnsignedLess); |
+} |
WASM_EXEC_TEST(Ui32x4LessEqual) { |
- RunI32x4BinOpTest(kExprI32x4LeU, UnsignedLessEqual); |
+ RunI32x4CompareOpTest(kExprI32x4LeU, UnsignedLessEqual); |
} |
-WASM_EXEC_TEST(S128And) { RunI32x4BinOpTest(kExprS128And, And); } |
- |
-WASM_EXEC_TEST(S128Or) { RunI32x4BinOpTest(kExprS128Or, Or); } |
- |
-WASM_EXEC_TEST(S128Xor) { RunI32x4BinOpTest(kExprS128Xor, Xor); } |
- |
void RunI32x4ShiftOpTest(WasmOpcode simd_op, Int32ShiftOp expected_op, |
int shift) { |
FLAG_wasm_simd_prototype = true; |
@@ -918,20 +952,6 @@ WASM_EXEC_TEST(I16x8Min) { RunI16x8BinOpTest(kExprI16x8MinS, Minimum); } |
WASM_EXEC_TEST(I16x8Max) { RunI16x8BinOpTest(kExprI16x8MaxS, Maximum); } |
-WASM_EXEC_TEST(I16x8Equal) { RunI16x8BinOpTest(kExprI16x8Eq, Equal); } |
- |
-WASM_EXEC_TEST(I16x8NotEqual) { RunI16x8BinOpTest(kExprI16x8Ne, NotEqual); } |
- |
-WASM_EXEC_TEST(I16x8Greater) { RunI16x8BinOpTest(kExprI16x8GtS, Greater); } |
- |
-WASM_EXEC_TEST(I16x8GreaterEqual) { |
- RunI16x8BinOpTest(kExprI16x8GeS, GreaterEqual); |
-} |
- |
-WASM_EXEC_TEST(I16x8Less) { RunI16x8BinOpTest(kExprI16x8LtS, Less); } |
- |
-WASM_EXEC_TEST(I16x8LessEqual) { RunI16x8BinOpTest(kExprI16x8LeS, LessEqual); } |
- |
WASM_EXEC_TEST(Ui16x8AddSaturate) { |
RunI16x8BinOpTest(kExprI16x8AddSaturateU, UnsignedAddSaturate); |
} |
@@ -948,18 +968,57 @@ WASM_EXEC_TEST(Ui16x8Max) { |
RunI16x8BinOpTest(kExprI16x8MaxU, UnsignedMaximum); |
} |
+void RunI16x8CompareOpTest(WasmOpcode simd_op, Int16BinOp expected_op) { |
+ FLAG_wasm_simd_prototype = true; |
+ WasmRunner<int32_t, int32_t, int32_t, int32_t> r(kExecuteCompiled); |
+ byte a = 0; |
+ byte b = 1; |
+ byte expected = 2; |
+ byte simd0 = r.AllocateLocal(kWasmS128); |
+ byte simd1 = r.AllocateLocal(kWasmS128); |
+ BUILD(r, WASM_SET_LOCAL(simd0, WASM_SIMD_I16x8_SPLAT(WASM_GET_LOCAL(a))), |
+ WASM_SET_LOCAL(simd1, WASM_SIMD_I16x8_SPLAT(WASM_GET_LOCAL(b))), |
+ WASM_SET_LOCAL(simd1, |
+ WASM_SIMD_MATERIALIZE_BOOLS( |
+ 16x8, WASM_SIMD_BINOP(simd_op, WASM_GET_LOCAL(simd0), |
+ WASM_GET_LOCAL(simd1)))), |
+ WASM_SIMD_CHECK_SPLAT8(I16x8, simd1, I32, expected), WASM_ONE); |
+ |
+ FOR_INT16_INPUTS(i) { |
+ FOR_INT16_INPUTS(j) { CHECK_EQ(1, r.Call(*i, *j, expected_op(*i, *j))); } |
+ } |
+} |
+ |
+WASM_EXEC_TEST(I16x8Equal) { RunI16x8CompareOpTest(kExprI16x8Eq, Equal); } |
+ |
+WASM_EXEC_TEST(I16x8NotEqual) { RunI16x8CompareOpTest(kExprI16x8Ne, NotEqual); } |
+ |
+WASM_EXEC_TEST(I16x8Greater) { RunI16x8CompareOpTest(kExprI16x8GtS, Greater); } |
+ |
+WASM_EXEC_TEST(I16x8GreaterEqual) { |
+ RunI16x8CompareOpTest(kExprI16x8GeS, GreaterEqual); |
+} |
+ |
+WASM_EXEC_TEST(I16x8Less) { RunI16x8CompareOpTest(kExprI16x8LtS, Less); } |
+ |
+WASM_EXEC_TEST(I16x8LessEqual) { |
+ RunI16x8CompareOpTest(kExprI16x8LeS, LessEqual); |
+} |
+ |
WASM_EXEC_TEST(Ui16x8Greater) { |
- RunI16x8BinOpTest(kExprI16x8GtU, UnsignedGreater); |
+ RunI16x8CompareOpTest(kExprI16x8GtU, UnsignedGreater); |
} |
WASM_EXEC_TEST(Ui16x8GreaterEqual) { |
- RunI16x8BinOpTest(kExprI16x8GeU, UnsignedGreaterEqual); |
+ RunI16x8CompareOpTest(kExprI16x8GeU, UnsignedGreaterEqual); |
} |
-WASM_EXEC_TEST(Ui16x8Less) { RunI16x8BinOpTest(kExprI16x8LtU, UnsignedLess); } |
+WASM_EXEC_TEST(Ui16x8Less) { |
+ RunI16x8CompareOpTest(kExprI16x8LtU, UnsignedLess); |
+} |
WASM_EXEC_TEST(Ui16x8LessEqual) { |
- RunI16x8BinOpTest(kExprI16x8LeU, UnsignedLessEqual); |
+ RunI16x8CompareOpTest(kExprI16x8LeU, UnsignedLessEqual); |
} |
void RunI16x8ShiftOpTest(WasmOpcode simd_op, Int16ShiftOp expected_op, |
@@ -1041,20 +1100,6 @@ WASM_EXEC_TEST(I8x16Min) { RunI8x16BinOpTest(kExprI8x16MinS, Minimum); } |
WASM_EXEC_TEST(I8x16Max) { RunI8x16BinOpTest(kExprI8x16MaxS, Maximum); } |
-WASM_EXEC_TEST(I8x16Equal) { RunI8x16BinOpTest(kExprI8x16Eq, Equal); } |
- |
-WASM_EXEC_TEST(I8x16NotEqual) { RunI8x16BinOpTest(kExprI8x16Ne, NotEqual); } |
- |
-WASM_EXEC_TEST(I8x16Greater) { RunI8x16BinOpTest(kExprI8x16GtS, Greater); } |
- |
-WASM_EXEC_TEST(I8x16GreaterEqual) { |
- RunI8x16BinOpTest(kExprI8x16GeS, GreaterEqual); |
-} |
- |
-WASM_EXEC_TEST(I8x16Less) { RunI8x16BinOpTest(kExprI8x16LtS, Less); } |
- |
-WASM_EXEC_TEST(I8x16LessEqual) { RunI8x16BinOpTest(kExprI8x16LeS, LessEqual); } |
- |
WASM_EXEC_TEST(Ui8x16AddSaturate) { |
RunI8x16BinOpTest(kExprI8x16AddSaturateU, UnsignedAddSaturate); |
} |
@@ -1071,18 +1116,57 @@ WASM_EXEC_TEST(Ui8x16Max) { |
RunI8x16BinOpTest(kExprI8x16MaxU, UnsignedMaximum); |
} |
+void RunI8x16CompareOpTest(WasmOpcode simd_op, Int8BinOp expected_op) { |
+ FLAG_wasm_simd_prototype = true; |
+ WasmRunner<int32_t, int32_t, int32_t, int32_t> r(kExecuteCompiled); |
+ byte a = 0; |
+ byte b = 1; |
+ byte expected = 2; |
+ byte simd0 = r.AllocateLocal(kWasmS128); |
+ byte simd1 = r.AllocateLocal(kWasmS128); |
+ BUILD(r, WASM_SET_LOCAL(simd0, WASM_SIMD_I8x16_SPLAT(WASM_GET_LOCAL(a))), |
+ WASM_SET_LOCAL(simd1, WASM_SIMD_I8x16_SPLAT(WASM_GET_LOCAL(b))), |
+ WASM_SET_LOCAL(simd1, |
+ WASM_SIMD_MATERIALIZE_BOOLS( |
+ 8x16, WASM_SIMD_BINOP(simd_op, WASM_GET_LOCAL(simd0), |
+ WASM_GET_LOCAL(simd1)))), |
+ WASM_SIMD_CHECK_SPLAT16(I8x16, simd1, I32, expected), WASM_ONE); |
+ |
+ FOR_INT8_INPUTS(i) { |
+ FOR_INT8_INPUTS(j) { CHECK_EQ(1, r.Call(*i, *j, expected_op(*i, *j))); } |
+ } |
+} |
+ |
+WASM_EXEC_TEST(I8x16Equal) { RunI8x16CompareOpTest(kExprI8x16Eq, Equal); } |
+ |
+WASM_EXEC_TEST(I8x16NotEqual) { RunI8x16CompareOpTest(kExprI8x16Ne, NotEqual); } |
+ |
+WASM_EXEC_TEST(I8x16Greater) { RunI8x16CompareOpTest(kExprI8x16GtS, Greater); } |
+ |
+WASM_EXEC_TEST(I8x16GreaterEqual) { |
+ RunI8x16CompareOpTest(kExprI8x16GeS, GreaterEqual); |
+} |
+ |
+WASM_EXEC_TEST(I8x16Less) { RunI8x16CompareOpTest(kExprI8x16LtS, Less); } |
+ |
+WASM_EXEC_TEST(I8x16LessEqual) { |
+ RunI8x16CompareOpTest(kExprI8x16LeS, LessEqual); |
+} |
+ |
WASM_EXEC_TEST(Ui8x16Greater) { |
- RunI8x16BinOpTest(kExprI8x16GtU, UnsignedGreater); |
+ RunI8x16CompareOpTest(kExprI8x16GtU, UnsignedGreater); |
} |
WASM_EXEC_TEST(Ui8x16GreaterEqual) { |
- RunI8x16BinOpTest(kExprI8x16GeU, UnsignedGreaterEqual); |
+ RunI8x16CompareOpTest(kExprI8x16GeU, UnsignedGreaterEqual); |
} |
-WASM_EXEC_TEST(Ui8x16Less) { RunI8x16BinOpTest(kExprI8x16LtU, UnsignedLess); } |
+WASM_EXEC_TEST(Ui8x16Less) { |
+ RunI8x16CompareOpTest(kExprI8x16LtU, UnsignedLess); |
+} |
WASM_EXEC_TEST(Ui8x16LessEqual) { |
- RunI8x16BinOpTest(kExprI8x16LeU, UnsignedLessEqual); |
+ RunI8x16CompareOpTest(kExprI8x16LeU, UnsignedLessEqual); |
} |
void RunI8x16ShiftOpTest(WasmOpcode simd_op, Int8ShiftOp expected_op, |
@@ -1112,27 +1196,33 @@ WASM_EXEC_TEST(I8x16ShrU) { |
RunI8x16ShiftOpTest(kExprI8x16ShrU, LogicalShiftRight, 1); |
} |
+// Test Select by making a mask where the first two lanes are true and the rest |
+// false, and comparing for non-equality with zero to materialize a bool vector. |
#define WASM_SIMD_SELECT_TEST(format) \ |
WASM_EXEC_TEST(S##format##Select) { \ |
FLAG_wasm_simd_prototype = true; \ |
WasmRunner<int32_t, int32_t, int32_t> r(kExecuteCompiled); \ |
byte val1 = 0; \ |
byte val2 = 1; \ |
- byte mask = r.AllocateLocal(kWasmS128); \ |
byte src1 = r.AllocateLocal(kWasmS128); \ |
byte src2 = r.AllocateLocal(kWasmS128); \ |
- BUILD(r, WASM_SET_LOCAL(mask, WASM_SIMD_I##format##_SPLAT(WASM_ZERO)), \ |
- WASM_SET_LOCAL(src1, \ |
- WASM_SIMD_I##format##_SPLAT(WASM_GET_LOCAL(val1))), \ |
+ byte zero = r.AllocateLocal(kWasmS128); \ |
+ byte mask = r.AllocateLocal(kWasmS128); \ |
+ BUILD(r, WASM_SET_LOCAL( \ |
+ src1, WASM_SIMD_I##format##_SPLAT(WASM_GET_LOCAL(val1))), \ |
WASM_SET_LOCAL(src2, \ |
WASM_SIMD_I##format##_SPLAT(WASM_GET_LOCAL(val2))), \ |
+ WASM_SET_LOCAL(zero, WASM_SIMD_I##format##_SPLAT(WASM_ZERO)), \ |
WASM_SET_LOCAL(mask, WASM_SIMD_I##format##_REPLACE_LANE( \ |
- 1, WASM_GET_LOCAL(mask), WASM_I32V(-1))), \ |
+ 1, WASM_GET_LOCAL(zero), WASM_I32V(-1))), \ |
WASM_SET_LOCAL(mask, WASM_SIMD_I##format##_REPLACE_LANE( \ |
2, WASM_GET_LOCAL(mask), WASM_I32V(-1))), \ |
- WASM_SET_LOCAL(mask, WASM_SIMD_SELECT(format, WASM_GET_LOCAL(mask), \ |
- WASM_GET_LOCAL(src1), \ |
- WASM_GET_LOCAL(src2))), \ |
+ WASM_SET_LOCAL( \ |
+ mask, \ |
+ WASM_SIMD_SELECT(format, WASM_SIMD_BINOP(kExprI##format##Ne, \ |
+ WASM_GET_LOCAL(mask), \ |
+ WASM_GET_LOCAL(zero)), \ |
+ WASM_GET_LOCAL(src1), WASM_GET_LOCAL(src2))), \ |
WASM_SIMD_CHECK_LANE(I##format, mask, I32, val2, 0), \ |
WASM_SIMD_CHECK_LANE(I##format, mask, I32, val1, 1), \ |
WASM_SIMD_CHECK_LANE(I##format, mask, I32, val1, 2), \ |