Commit 30663c88 authored by Ng Zhi An's avatar Ng Zhi An Committed by Commit Bot

[wasm simd] Implement I64x2AllTrue and I64x2AnyTrue on x64

Bug: v8:8460
Change-Id: I003972a804df3589ce953dbb294c44b97ab65d88
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/1686512
Commit-Queue: Zhi An Ng <zhin@chromium.org>
Reviewed-by: 's avatarDeepti Gandluri <gdeepti@chromium.org>
Reviewed-by: 's avatarMichael Starzinger <mstarzinger@chromium.org>
Cr-Commit-Position: refs/heads/master@{#62724}
parent 4edb56af
...@@ -2067,6 +2067,10 @@ void InstructionSelector::VisitNode(Node* node) { ...@@ -2067,6 +2067,10 @@ void InstructionSelector::VisitNode(Node* node) {
return MarkAsSimd128(node), VisitS128Select(node); return MarkAsSimd128(node), VisitS128Select(node);
case IrOpcode::kS8x16Shuffle: case IrOpcode::kS8x16Shuffle:
return MarkAsSimd128(node), VisitS8x16Shuffle(node); return MarkAsSimd128(node), VisitS8x16Shuffle(node);
case IrOpcode::kS1x2AnyTrue:
return MarkAsWord32(node), VisitS1x2AnyTrue(node);
case IrOpcode::kS1x2AllTrue:
return MarkAsWord32(node), VisitS1x2AllTrue(node);
case IrOpcode::kS1x4AnyTrue: case IrOpcode::kS1x4AnyTrue:
return MarkAsWord32(node), VisitS1x4AnyTrue(node); return MarkAsWord32(node), VisitS1x4AnyTrue(node);
case IrOpcode::kS1x4AllTrue: case IrOpcode::kS1x4AllTrue:
...@@ -2536,6 +2540,8 @@ void InstructionSelector::VisitI64x2Splat(Node* node) { UNIMPLEMENTED(); } ...@@ -2536,6 +2540,8 @@ void InstructionSelector::VisitI64x2Splat(Node* node) { UNIMPLEMENTED(); }
void InstructionSelector::VisitI64x2ExtractLane(Node* node) { UNIMPLEMENTED(); } void InstructionSelector::VisitI64x2ExtractLane(Node* node) { UNIMPLEMENTED(); }
void InstructionSelector::VisitI64x2ReplaceLane(Node* node) { UNIMPLEMENTED(); } void InstructionSelector::VisitI64x2ReplaceLane(Node* node) { UNIMPLEMENTED(); }
void InstructionSelector::VisitI64x2Neg(Node* node) { UNIMPLEMENTED(); } void InstructionSelector::VisitI64x2Neg(Node* node) { UNIMPLEMENTED(); }
void InstructionSelector::VisitS1x2AnyTrue(Node* node) { UNIMPLEMENTED(); }
void InstructionSelector::VisitS1x2AllTrue(Node* node) { UNIMPLEMENTED(); }
void InstructionSelector::VisitI64x2Shl(Node* node) { UNIMPLEMENTED(); } void InstructionSelector::VisitI64x2Shl(Node* node) { UNIMPLEMENTED(); }
void InstructionSelector::VisitI64x2ShrS(Node* node) { UNIMPLEMENTED(); } void InstructionSelector::VisitI64x2ShrS(Node* node) { UNIMPLEMENTED(); }
void InstructionSelector::VisitI64x2Add(Node* node) { UNIMPLEMENTED(); } void InstructionSelector::VisitI64x2Add(Node* node) { UNIMPLEMENTED(); }
......
...@@ -3474,6 +3474,7 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( ...@@ -3474,6 +3474,7 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
__ por(dst, kScratchDoubleReg); __ por(dst, kScratchDoubleReg);
break; break;
} }
case kX64S1x2AnyTrue:
case kX64S1x4AnyTrue: case kX64S1x4AnyTrue:
case kX64S1x8AnyTrue: case kX64S1x8AnyTrue:
case kX64S1x16AnyTrue: { case kX64S1x16AnyTrue: {
...@@ -3491,6 +3492,10 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( ...@@ -3491,6 +3492,10 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
// comparison instruction used matters, e.g. given 0xff00, pcmpeqb returns // comparison instruction used matters, e.g. given 0xff00, pcmpeqb returns
// 0x0011, pcmpeqw returns 0x0000, ptest will set ZF to 0 and 1 // 0x0011, pcmpeqw returns 0x0000, ptest will set ZF to 0 and 1
// respectively. // respectively.
case kX64S1x2AllTrue: {
ASSEMBLE_SIMD_ALL_TRUE(pcmpeqq);
break;
}
case kX64S1x4AllTrue: { case kX64S1x4AllTrue: {
ASSEMBLE_SIMD_ALL_TRUE(pcmpeqd); ASSEMBLE_SIMD_ALL_TRUE(pcmpeqd);
break; break;
......
...@@ -311,6 +311,8 @@ namespace compiler { ...@@ -311,6 +311,8 @@ namespace compiler {
V(X64S8x8Reverse) \ V(X64S8x8Reverse) \
V(X64S8x4Reverse) \ V(X64S8x4Reverse) \
V(X64S8x2Reverse) \ V(X64S8x2Reverse) \
V(X64S1x2AnyTrue) \
V(X64S1x2AllTrue) \
V(X64S1x4AnyTrue) \ V(X64S1x4AnyTrue) \
V(X64S1x4AllTrue) \ V(X64S1x4AllTrue) \
V(X64S1x8AnyTrue) \ V(X64S1x8AnyTrue) \
......
...@@ -251,6 +251,8 @@ int InstructionScheduler::GetTargetInstructionFlags( ...@@ -251,6 +251,8 @@ int InstructionScheduler::GetTargetInstructionFlags(
case kX64S128Not: case kX64S128Not:
case kX64S128Select: case kX64S128Select:
case kX64S128Zero: case kX64S128Zero:
case kX64S1x2AnyTrue:
case kX64S1x2AllTrue:
case kX64S1x4AnyTrue: case kX64S1x4AnyTrue:
case kX64S1x4AllTrue: case kX64S1x4AllTrue:
case kX64S1x8AnyTrue: case kX64S1x8AnyTrue:
......
...@@ -2702,11 +2702,13 @@ VISIT_ATOMIC_BINOP(Xor) ...@@ -2702,11 +2702,13 @@ VISIT_ATOMIC_BINOP(Xor)
V(I8x16ShrU) V(I8x16ShrU)
#define SIMD_ANYTRUE_LIST(V) \ #define SIMD_ANYTRUE_LIST(V) \
V(S1x2AnyTrue) \
V(S1x4AnyTrue) \ V(S1x4AnyTrue) \
V(S1x8AnyTrue) \ V(S1x8AnyTrue) \
V(S1x16AnyTrue) V(S1x16AnyTrue)
#define SIMD_ALLTRUE_LIST(V) \ #define SIMD_ALLTRUE_LIST(V) \
V(S1x2AllTrue) \
V(S1x4AllTrue) \ V(S1x4AllTrue) \
V(S1x8AllTrue) \ V(S1x8AllTrue) \
V(S1x16AllTrue) V(S1x16AllTrue)
......
...@@ -350,6 +350,8 @@ MachineType AtomicOpType(Operator const* op) { ...@@ -350,6 +350,8 @@ MachineType AtomicOpType(Operator const* op) {
V(S128Xor, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \ V(S128Xor, Operator::kAssociative | Operator::kCommutative, 2, 0, 1) \
V(S128Not, Operator::kNoProperties, 1, 0, 1) \ V(S128Not, Operator::kNoProperties, 1, 0, 1) \
V(S128Select, Operator::kNoProperties, 3, 0, 1) \ V(S128Select, Operator::kNoProperties, 3, 0, 1) \
V(S1x2AnyTrue, Operator::kNoProperties, 1, 0, 1) \
V(S1x2AllTrue, Operator::kNoProperties, 1, 0, 1) \
V(S1x4AnyTrue, Operator::kNoProperties, 1, 0, 1) \ V(S1x4AnyTrue, Operator::kNoProperties, 1, 0, 1) \
V(S1x4AllTrue, Operator::kNoProperties, 1, 0, 1) \ V(S1x4AllTrue, Operator::kNoProperties, 1, 0, 1) \
V(S1x8AnyTrue, Operator::kNoProperties, 1, 0, 1) \ V(S1x8AnyTrue, Operator::kNoProperties, 1, 0, 1) \
......
...@@ -610,6 +610,8 @@ class V8_EXPORT_PRIVATE MachineOperatorBuilder final ...@@ -610,6 +610,8 @@ class V8_EXPORT_PRIVATE MachineOperatorBuilder final
const Operator* S8x16Shuffle(const uint8_t shuffle[16]); const Operator* S8x16Shuffle(const uint8_t shuffle[16]);
const Operator* S1x2AnyTrue();
const Operator* S1x2AllTrue();
const Operator* S1x4AnyTrue(); const Operator* S1x4AnyTrue();
const Operator* S1x4AllTrue(); const Operator* S1x4AllTrue();
const Operator* S1x8AnyTrue(); const Operator* S1x8AnyTrue();
......
...@@ -884,6 +884,8 @@ ...@@ -884,6 +884,8 @@
V(S128Xor) \ V(S128Xor) \
V(S128Select) \ V(S128Select) \
V(S8x16Shuffle) \ V(S8x16Shuffle) \
V(S1x2AnyTrue) \
V(S1x2AllTrue) \
V(S1x4AnyTrue) \ V(S1x4AnyTrue) \
V(S1x4AllTrue) \ V(S1x4AllTrue) \
V(S1x8AnyTrue) \ V(S1x8AnyTrue) \
......
...@@ -4339,6 +4339,10 @@ Node* WasmGraphBuilder::SimdOp(wasm::WasmOpcode opcode, Node* const* inputs) { ...@@ -4339,6 +4339,10 @@ Node* WasmGraphBuilder::SimdOp(wasm::WasmOpcode opcode, Node* const* inputs) {
case wasm::kExprS128Select: case wasm::kExprS128Select:
return graph()->NewNode(mcgraph()->machine()->S128Select(), inputs[2], return graph()->NewNode(mcgraph()->machine()->S128Select(), inputs[2],
inputs[0], inputs[1]); inputs[0], inputs[1]);
case wasm::kExprS1x2AnyTrue:
return graph()->NewNode(mcgraph()->machine()->S1x2AnyTrue(), inputs[0]);
case wasm::kExprS1x2AllTrue:
return graph()->NewNode(mcgraph()->machine()->S1x2AllTrue(), inputs[0]);
case wasm::kExprS1x4AnyTrue: case wasm::kExprS1x4AnyTrue:
return graph()->NewNode(mcgraph()->machine()->S1x4AnyTrue(), inputs[0]); return graph()->NewNode(mcgraph()->machine()->S1x4AnyTrue(), inputs[0]);
case wasm::kExprS1x4AllTrue: case wasm::kExprS1x4AllTrue:
......
...@@ -2553,6 +2553,7 @@ class ThreadImpl { ...@@ -2553,6 +2553,7 @@ class ThreadImpl {
Push(WasmValue(Simd128(res))); Push(WasmValue(Simd128(res)));
return true; return true;
} }
case kExprS1x2AnyTrue:
case kExprS1x4AnyTrue: case kExprS1x4AnyTrue:
case kExprS1x8AnyTrue: case kExprS1x8AnyTrue:
case kExprS1x16AnyTrue: { case kExprS1x16AnyTrue: {
...@@ -2571,6 +2572,7 @@ class ThreadImpl { ...@@ -2571,6 +2572,7 @@ class ThreadImpl {
Push(WasmValue(res)); \ Push(WasmValue(res)); \
return true; \ return true; \
} }
REDUCTION_CASE(S1x2AllTrue, i64x2, int2, 2, &)
REDUCTION_CASE(S1x4AllTrue, i32x4, int4, 4, &) REDUCTION_CASE(S1x4AllTrue, i32x4, int4, 4, &)
REDUCTION_CASE(S1x8AllTrue, i16x8, int8, 8, &) REDUCTION_CASE(S1x8AllTrue, i16x8, int8, 8, &)
REDUCTION_CASE(S1x16AllTrue, i8x16, int16, 16, &) REDUCTION_CASE(S1x16AllTrue, i8x16, int16, 16, &)
......
...@@ -23,16 +23,17 @@ namespace wasm { ...@@ -23,16 +23,17 @@ namespace wasm {
#define CASE_F32_OP(name, str) CASE_OP(F32##name, "f32." str) #define CASE_F32_OP(name, str) CASE_OP(F32##name, "f32." str)
#define CASE_F64_OP(name, str) CASE_OP(F64##name, "f64." str) #define CASE_F64_OP(name, str) CASE_OP(F64##name, "f64." str)
#define CASE_REF_OP(name, str) CASE_OP(Ref##name, "ref." str) #define CASE_REF_OP(name, str) CASE_OP(Ref##name, "ref." str)
#define CASE_F64x2_OP(name, str) CASE_OP(F64x2##name, "f64x2." str)
#define CASE_F32x4_OP(name, str) CASE_OP(F32x4##name, "f32x4." str) #define CASE_F32x4_OP(name, str) CASE_OP(F32x4##name, "f32x4." str)
#define CASE_I32x4_OP(name, str) CASE_OP(I32x4##name, "i32x4." str)
#define CASE_I64x2_OP(name, str) CASE_OP(I64x2##name, "i64x2." str) #define CASE_I64x2_OP(name, str) CASE_OP(I64x2##name, "i64x2." str)
#define CASE_F64x2_OP(name, str) CASE_OP(F64x2##name, "f64x2." str) #define CASE_I32x4_OP(name, str) CASE_OP(I32x4##name, "i32x4." str)
#define CASE_I16x8_OP(name, str) CASE_OP(I16x8##name, "i16x8." str) #define CASE_I16x8_OP(name, str) CASE_OP(I16x8##name, "i16x8." str)
#define CASE_I8x16_OP(name, str) CASE_OP(I8x16##name, "i8x16." str) #define CASE_I8x16_OP(name, str) CASE_OP(I8x16##name, "i8x16." str)
#define CASE_S128_OP(name, str) CASE_OP(S128##name, "s128." str) #define CASE_S128_OP(name, str) CASE_OP(S128##name, "s128." str)
#define CASE_S32x4_OP(name, str) CASE_OP(S32x4##name, "s32x4." str) #define CASE_S32x4_OP(name, str) CASE_OP(S32x4##name, "s32x4." str)
#define CASE_S16x8_OP(name, str) CASE_OP(S16x8##name, "s16x8." str) #define CASE_S16x8_OP(name, str) CASE_OP(S16x8##name, "s16x8." str)
#define CASE_S8x16_OP(name, str) CASE_OP(S8x16##name, "s8x16." str) #define CASE_S8x16_OP(name, str) CASE_OP(S8x16##name, "s8x16." str)
#define CASE_S1x2_OP(name, str) CASE_OP(S1x2##name, "s1x2." str)
#define CASE_S1x4_OP(name, str) CASE_OP(S1x4##name, "s1x4." str) #define CASE_S1x4_OP(name, str) CASE_OP(S1x4##name, "s1x4." str)
#define CASE_S1x8_OP(name, str) CASE_OP(S1x8##name, "s1x8." str) #define CASE_S1x8_OP(name, str) CASE_OP(S1x8##name, "s1x8." str)
#define CASE_S1x16_OP(name, str) CASE_OP(S1x16##name, "s1x16." str) #define CASE_S1x16_OP(name, str) CASE_OP(S1x16##name, "s1x16." str)
...@@ -283,6 +284,8 @@ const char* WasmOpcodes::OpcodeName(WasmOpcode opcode) { ...@@ -283,6 +284,8 @@ const char* WasmOpcodes::OpcodeName(WasmOpcode opcode) {
CASE_S128_OP(Not, "not") CASE_S128_OP(Not, "not")
CASE_S128_OP(Select, "select") CASE_S128_OP(Select, "select")
CASE_S8x16_OP(Shuffle, "shuffle") CASE_S8x16_OP(Shuffle, "shuffle")
CASE_S1x2_OP(AnyTrue, "any_true")
CASE_S1x2_OP(AllTrue, "all_true")
CASE_S1x4_OP(AnyTrue, "any_true") CASE_S1x4_OP(AnyTrue, "any_true")
CASE_S1x4_OP(AllTrue, "all_true") CASE_S1x4_OP(AllTrue, "all_true")
CASE_S1x8_OP(AnyTrue, "any_true") CASE_S1x8_OP(AnyTrue, "any_true")
...@@ -314,7 +317,9 @@ const char* WasmOpcodes::OpcodeName(WasmOpcode opcode) { ...@@ -314,7 +317,9 @@ const char* WasmOpcodes::OpcodeName(WasmOpcode opcode) {
#undef CASE_F32_OP #undef CASE_F32_OP
#undef CASE_F64_OP #undef CASE_F64_OP
#undef CASE_REF_OP #undef CASE_REF_OP
#undef CASE_F64x2_OP
#undef CASE_F32x4_OP #undef CASE_F32x4_OP
#undef CASE_I64x2_OP
#undef CASE_I32x4_OP #undef CASE_I32x4_OP
#undef CASE_I16x8_OP #undef CASE_I16x8_OP
#undef CASE_I8x16_OP #undef CASE_I8x16_OP
...@@ -322,6 +327,7 @@ const char* WasmOpcodes::OpcodeName(WasmOpcode opcode) { ...@@ -322,6 +327,7 @@ const char* WasmOpcodes::OpcodeName(WasmOpcode opcode) {
#undef CASE_S32x4_OP #undef CASE_S32x4_OP
#undef CASE_S16x8_OP #undef CASE_S16x8_OP
#undef CASE_S8x16_OP #undef CASE_S8x16_OP
#undef CASE_S1x2_OP
#undef CASE_S1x4_OP #undef CASE_S1x4_OP
#undef CASE_S1x8_OP #undef CASE_S1x8_OP
#undef CASE_S1x16_OP #undef CASE_S1x16_OP
......
...@@ -365,6 +365,8 @@ bool IsJSCompatibleSignature(const FunctionSig* sig, bool hasBigIntFeature); ...@@ -365,6 +365,8 @@ bool IsJSCompatibleSignature(const FunctionSig* sig, bool hasBigIntFeature);
V(I32x4MaxS, 0xfd82, s_ss) \ V(I32x4MaxS, 0xfd82, s_ss) \
V(I32x4MaxU, 0xfd83, s_ss) \ V(I32x4MaxU, 0xfd83, s_ss) \
V(I64x2Neg, 0xfd84, s_s) \ V(I64x2Neg, 0xfd84, s_s) \
V(S1x2AnyTrue, 0xfd85, i_s) \
V(S1x2AllTrue, 0xfd86, i_s) \
V(I64x2Add, 0xfd8a, s_ss) \ V(I64x2Add, 0xfd8a, s_ss) \
V(I64x2Sub, 0xfd8d, s_ss) \ V(I64x2Sub, 0xfd8d, s_ss) \
V(F32x4Abs, 0xfd95, s_s) \ V(F32x4Abs, 0xfd95, s_s) \
......
...@@ -2585,9 +2585,9 @@ WASM_SIMD_COMPILED_TEST(SimdLoadStoreLoad) { ...@@ -2585,9 +2585,9 @@ WASM_SIMD_COMPILED_TEST(SimdLoadStoreLoad) {
V8_TARGET_ARCH_ARM V8_TARGET_ARCH_ARM
// V8:8665 - Tracking bug to enable reduction tests in the interpreter, // V8:8665 - Tracking bug to enable reduction tests in the interpreter,
// and for SIMD lowering. // and for SIMD lowering.
#define WASM_SIMD_ANYTRUE_TEST(format, lanes, max) \ #define WASM_SIMD_ANYTRUE_TEST(format, lanes, max, param_type) \
WASM_SIMD_TEST_NO_LOWERING(S##format##AnyTrue) { \ WASM_SIMD_TEST_NO_LOWERING(S##format##AnyTrue) { \
WasmRunner<int32_t, int32_t> r(execution_tier, lower_simd); \ WasmRunner<int32_t, param_type> r(execution_tier, lower_simd); \
byte simd = r.AllocateLocal(kWasmS128); \ byte simd = r.AllocateLocal(kWasmS128); \
BUILD( \ BUILD( \
r, \ r, \
...@@ -2597,13 +2597,16 @@ WASM_SIMD_COMPILED_TEST(SimdLoadStoreLoad) { ...@@ -2597,13 +2597,16 @@ WASM_SIMD_COMPILED_TEST(SimdLoadStoreLoad) {
DCHECK_EQ(1, r.Call(5)); \ DCHECK_EQ(1, r.Call(5)); \
DCHECK_EQ(0, r.Call(0)); \ DCHECK_EQ(0, r.Call(0)); \
} }
WASM_SIMD_ANYTRUE_TEST(32x4, 4, 0xffffffff) #if V8_TARGET_ARCH_X64
WASM_SIMD_ANYTRUE_TEST(16x8, 8, 0xffff) WASM_SIMD_ANYTRUE_TEST(64x2, 2, 0xffffffffffffffff, int64_t)
WASM_SIMD_ANYTRUE_TEST(8x16, 16, 0xff) #endif // V8_TARGET_ARCH_X64
WASM_SIMD_ANYTRUE_TEST(32x4, 4, 0xffffffff, int32_t)
WASM_SIMD_ANYTRUE_TEST(16x8, 8, 0xffff, int32_t)
WASM_SIMD_ANYTRUE_TEST(8x16, 16, 0xff, int32_t)
#define WASM_SIMD_ALLTRUE_TEST(format, lanes, max) \ #define WASM_SIMD_ALLTRUE_TEST(format, lanes, max, param_type) \
WASM_SIMD_TEST_NO_LOWERING(S##format##AllTrue) { \ WASM_SIMD_TEST_NO_LOWERING(S##format##AllTrue) { \
WasmRunner<int32_t, int32_t> r(execution_tier, lower_simd); \ WasmRunner<int32_t, param_type> r(execution_tier, lower_simd); \
byte simd = r.AllocateLocal(kWasmS128); \ byte simd = r.AllocateLocal(kWasmS128); \
BUILD( \ BUILD( \
r, \ r, \
...@@ -2613,9 +2616,12 @@ WASM_SIMD_ANYTRUE_TEST(8x16, 16, 0xff) ...@@ -2613,9 +2616,12 @@ WASM_SIMD_ANYTRUE_TEST(8x16, 16, 0xff)
DCHECK_EQ(1, r.Call(0x1)); \ DCHECK_EQ(1, r.Call(0x1)); \
DCHECK_EQ(0, r.Call(0)); \ DCHECK_EQ(0, r.Call(0)); \
} }
WASM_SIMD_ALLTRUE_TEST(32x4, 4, 0xffffffff) #if V8_TARGET_ARCH_X64
WASM_SIMD_ALLTRUE_TEST(16x8, 8, 0xffff) WASM_SIMD_ALLTRUE_TEST(64x2, 2, 0xffffffffffffffff, int64_t)
WASM_SIMD_ALLTRUE_TEST(8x16, 16, 0xff) #endif // V8_TARGET_ARCH_X64
WASM_SIMD_ALLTRUE_TEST(32x4, 4, 0xffffffff, int32_t)
WASM_SIMD_ALLTRUE_TEST(16x8, 8, 0xffff, int32_t)
WASM_SIMD_ALLTRUE_TEST(8x16, 16, 0xff, int32_t)
#endif // V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_IA32 || V8_TARGET_ARCH_ARM64 || #endif // V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_IA32 || V8_TARGET_ARCH_ARM64 ||
// V8_TARGET_ARCH_ARM // V8_TARGET_ARCH_ARM
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment