Commit 8a5a1a68 authored by Ng Zhi An's avatar Ng Zhi An Committed by Commit Bot

[wasm-simd] Implement I64x2 AnyTrue AllTrue for arm64

Bug: v8:8460
Change-Id: I1ba49fed9500f0cadd307da02a3b6a0d1a5e2785
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/1721711
Commit-Queue: Zhi An Ng <zhin@chromium.org>
Reviewed-by: 's avatarBill Budge <bbudge@chromium.org>
Reviewed-by: 's avatarDeepti Gandluri <gdeepti@chromium.org>
Cr-Commit-Position: refs/heads/master@{#62967}
parent f57efec5
...@@ -2240,7 +2240,17 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( ...@@ -2240,7 +2240,17 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
SIMD_UNOP_CASE(kArm64S8x8Reverse, Rev64, 16B); SIMD_UNOP_CASE(kArm64S8x8Reverse, Rev64, 16B);
SIMD_UNOP_CASE(kArm64S8x4Reverse, Rev32, 16B); SIMD_UNOP_CASE(kArm64S8x4Reverse, Rev32, 16B);
SIMD_UNOP_CASE(kArm64S8x2Reverse, Rev16, 16B); SIMD_UNOP_CASE(kArm64S8x2Reverse, Rev16, 16B);
case kArm64S1x2AllTrue: {
UseScratchRegisterScope scope(tasm());
VRegister temp1 = scope.AcquireV(kFormat2D);
VRegister temp2 = scope.AcquireV(kFormatS);
__ Cmeq(temp1, i.InputSimd128Register(0).V2D(), 0);
__ Umaxv(temp2, temp1.V4S());
__ Umov(i.OutputRegister32(), temp2, 0);
__ Add(i.OutputRegister32(), i.OutputRegister32(), 1);
break;
}
#define SIMD_REDUCE_OP_CASE(Op, Instr, format, FORMAT) \ #define SIMD_REDUCE_OP_CASE(Op, Instr, format, FORMAT) \
case Op: { \ case Op: { \
UseScratchRegisterScope scope(tasm()); \ UseScratchRegisterScope scope(tasm()); \
...@@ -2251,6 +2261,8 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( ...@@ -2251,6 +2261,8 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
__ Cset(i.OutputRegister32(), ne); \ __ Cset(i.OutputRegister32(), ne); \
break; \ break; \
} }
// for AnyTrue, the format does not matter, umaxv does not support 2D
SIMD_REDUCE_OP_CASE(kArm64S1x2AnyTrue, Umaxv, kFormatS, 4S);
SIMD_REDUCE_OP_CASE(kArm64S1x4AnyTrue, Umaxv, kFormatS, 4S); SIMD_REDUCE_OP_CASE(kArm64S1x4AnyTrue, Umaxv, kFormatS, 4S);
SIMD_REDUCE_OP_CASE(kArm64S1x4AllTrue, Uminv, kFormatS, 4S); SIMD_REDUCE_OP_CASE(kArm64S1x4AllTrue, Uminv, kFormatS, 4S);
SIMD_REDUCE_OP_CASE(kArm64S1x8AnyTrue, Umaxv, kFormatH, 8H); SIMD_REDUCE_OP_CASE(kArm64S1x8AnyTrue, Umaxv, kFormatH, 8H);
......
...@@ -325,6 +325,8 @@ namespace compiler { ...@@ -325,6 +325,8 @@ namespace compiler {
V(Arm64S8x8Reverse) \ V(Arm64S8x8Reverse) \
V(Arm64S8x4Reverse) \ V(Arm64S8x4Reverse) \
V(Arm64S8x2Reverse) \ V(Arm64S8x2Reverse) \
V(Arm64S1x2AnyTrue) \
V(Arm64S1x2AllTrue) \
V(Arm64S1x4AnyTrue) \ V(Arm64S1x4AnyTrue) \
V(Arm64S1x4AllTrue) \ V(Arm64S1x4AllTrue) \
V(Arm64S1x8AnyTrue) \ V(Arm64S1x8AnyTrue) \
......
...@@ -289,6 +289,8 @@ int InstructionScheduler::GetTargetInstructionFlags( ...@@ -289,6 +289,8 @@ int InstructionScheduler::GetTargetInstructionFlags(
case kArm64S8x8Reverse: case kArm64S8x8Reverse:
case kArm64S8x4Reverse: case kArm64S8x4Reverse:
case kArm64S8x2Reverse: case kArm64S8x2Reverse:
case kArm64S1x2AnyTrue:
case kArm64S1x2AllTrue:
case kArm64S1x4AnyTrue: case kArm64S1x4AnyTrue:
case kArm64S1x4AllTrue: case kArm64S1x4AllTrue:
case kArm64S1x8AnyTrue: case kArm64S1x8AnyTrue:
......
...@@ -3073,6 +3073,8 @@ void InstructionSelector::VisitInt64AbsWithOverflow(Node* node) { ...@@ -3073,6 +3073,8 @@ void InstructionSelector::VisitInt64AbsWithOverflow(Node* node) {
V(I16x8UConvertI8x16High, kArm64I16x8UConvertI8x16High) \ V(I16x8UConvertI8x16High, kArm64I16x8UConvertI8x16High) \
V(I8x16Neg, kArm64I8x16Neg) \ V(I8x16Neg, kArm64I8x16Neg) \
V(S128Not, kArm64S128Not) \ V(S128Not, kArm64S128Not) \
V(S1x2AnyTrue, kArm64S1x2AnyTrue) \
V(S1x2AllTrue, kArm64S1x2AllTrue) \
V(S1x4AnyTrue, kArm64S1x4AnyTrue) \ V(S1x4AnyTrue, kArm64S1x4AnyTrue) \
V(S1x4AllTrue, kArm64S1x4AllTrue) \ V(S1x4AllTrue, kArm64S1x4AllTrue) \
V(S1x8AnyTrue, kArm64S1x8AnyTrue) \ V(S1x8AnyTrue, kArm64S1x8AnyTrue) \
......
...@@ -2595,9 +2595,9 @@ void InstructionSelector::VisitI64x2GtS(Node* node) { UNIMPLEMENTED(); } ...@@ -2595,9 +2595,9 @@ void InstructionSelector::VisitI64x2GtS(Node* node) { UNIMPLEMENTED(); }
void InstructionSelector::VisitI64x2GeS(Node* node) { UNIMPLEMENTED(); } void InstructionSelector::VisitI64x2GeS(Node* node) { UNIMPLEMENTED(); }
void InstructionSelector::VisitI64x2GtU(Node* node) { UNIMPLEMENTED(); } void InstructionSelector::VisitI64x2GtU(Node* node) { UNIMPLEMENTED(); }
void InstructionSelector::VisitI64x2GeU(Node* node) { UNIMPLEMENTED(); } void InstructionSelector::VisitI64x2GeU(Node* node) { UNIMPLEMENTED(); }
#endif // !V8_TARGET_ARCH_ARM64
void InstructionSelector::VisitS1x2AnyTrue(Node* node) { UNIMPLEMENTED(); } void InstructionSelector::VisitS1x2AnyTrue(Node* node) { UNIMPLEMENTED(); }
void InstructionSelector::VisitS1x2AllTrue(Node* node) { UNIMPLEMENTED(); } void InstructionSelector::VisitS1x2AllTrue(Node* node) { UNIMPLEMENTED(); }
#endif // !V8_TARGET_ARCH_ARM64
void InstructionSelector::VisitI64x2Mul(Node* node) { UNIMPLEMENTED(); } void InstructionSelector::VisitI64x2Mul(Node* node) { UNIMPLEMENTED(); }
void InstructionSelector::VisitI64x2MinS(Node* node) { UNIMPLEMENTED(); } void InstructionSelector::VisitI64x2MinS(Node* node) { UNIMPLEMENTED(); }
void InstructionSelector::VisitI64x2MaxS(Node* node) { UNIMPLEMENTED(); } void InstructionSelector::VisitI64x2MaxS(Node* node) { UNIMPLEMENTED(); }
......
...@@ -2882,9 +2882,9 @@ WASM_SIMD_COMPILED_TEST(SimdLoadStoreLoad) { ...@@ -2882,9 +2882,9 @@ 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)); \
} }
#if V8_TARGET_ARCH_X64 #if V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_ARM64
WASM_SIMD_ANYTRUE_TEST(64x2, 2, 0xffffffffffffffff, int64_t) WASM_SIMD_ANYTRUE_TEST(64x2, 2, 0xffffffffffffffff, int64_t)
#endif // V8_TARGET_ARCH_X64 #endif // V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_ARM64
WASM_SIMD_ANYTRUE_TEST(32x4, 4, 0xffffffff, int32_t) WASM_SIMD_ANYTRUE_TEST(32x4, 4, 0xffffffff, int32_t)
WASM_SIMD_ANYTRUE_TEST(16x8, 8, 0xffff, int32_t) WASM_SIMD_ANYTRUE_TEST(16x8, 8, 0xffff, int32_t)
WASM_SIMD_ANYTRUE_TEST(8x16, 16, 0xff, int32_t) WASM_SIMD_ANYTRUE_TEST(8x16, 16, 0xff, int32_t)
...@@ -2901,9 +2901,9 @@ WASM_SIMD_ANYTRUE_TEST(8x16, 16, 0xff, int32_t) ...@@ -2901,9 +2901,9 @@ WASM_SIMD_ANYTRUE_TEST(8x16, 16, 0xff, int32_t)
DCHECK_EQ(1, r.Call(0x1)); \ DCHECK_EQ(1, r.Call(0x1)); \
DCHECK_EQ(0, r.Call(0)); \ DCHECK_EQ(0, r.Call(0)); \
} }
#if V8_TARGET_ARCH_X64 #if V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_ARM64
WASM_SIMD_ALLTRUE_TEST(64x2, 2, 0xffffffffffffffff, int64_t) WASM_SIMD_ALLTRUE_TEST(64x2, 2, 0xffffffffffffffff, int64_t)
#endif // V8_TARGET_ARCH_X64 #endif // V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_ARM64
WASM_SIMD_ALLTRUE_TEST(32x4, 4, 0xffffffff, int32_t) WASM_SIMD_ALLTRUE_TEST(32x4, 4, 0xffffffff, int32_t)
WASM_SIMD_ALLTRUE_TEST(16x8, 8, 0xffff, int32_t) WASM_SIMD_ALLTRUE_TEST(16x8, 8, 0xffff, int32_t)
WASM_SIMD_ALLTRUE_TEST(8x16, 16, 0xff, int32_t) WASM_SIMD_ALLTRUE_TEST(8x16, 16, 0xff, int32_t)
......
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