Commit 50f4706c authored by Ng Zhi An's avatar Ng Zhi An Committed by Commit Bot

[wasm-simd][arm64] Prototype i32x4.dot_i16x8_s

This implements I32x4DotI16x8S for arm64.

Bug: v8:10583
Change-Id: Id55c57715b4050d54bbcdc18fc443f2332291651
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2231032Reviewed-by: 's avatarDeepti Gandluri <gdeepti@chromium.org>
Commit-Queue: Zhi An Ng <zhin@chromium.org>
Cr-Commit-Position: refs/heads/master@{#68473}
parent 3e919578
...@@ -2208,6 +2208,17 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( ...@@ -2208,6 +2208,17 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
__ Mov(dst.W(), tmp.V4S(), 0); __ Mov(dst.W(), tmp.V4S(), 0);
break; break;
} }
case kArm64I32x4DotI16x8S: {
UseScratchRegisterScope scope(tasm());
VRegister lhs = i.InputSimd128Register(0);
VRegister rhs = i.InputSimd128Register(1);
VRegister tmp1 = scope.AcquireV(kFormat4S);
VRegister tmp2 = scope.AcquireV(kFormat4S);
__ Smull(tmp1, lhs.V4H(), rhs.V4H());
__ Smull2(tmp2, lhs.V8H(), rhs.V8H());
__ Addp(i.OutputSimd128Register().V4S(), tmp1, tmp2);
break;
}
case kArm64I16x8Splat: { case kArm64I16x8Splat: {
__ Dup(i.OutputSimd128Register().V8H(), i.InputRegister32(0)); __ Dup(i.OutputSimd128Register().V8H(), i.InputRegister32(0));
break; break;
......
...@@ -268,6 +268,7 @@ namespace compiler { ...@@ -268,6 +268,7 @@ namespace compiler {
V(Arm64I32x4GeU) \ V(Arm64I32x4GeU) \
V(Arm64I32x4Abs) \ V(Arm64I32x4Abs) \
V(Arm64I32x4BitMask) \ V(Arm64I32x4BitMask) \
V(Arm64I32x4DotI16x8S) \
V(Arm64I16x8Splat) \ V(Arm64I16x8Splat) \
V(Arm64I16x8ExtractLaneU) \ V(Arm64I16x8ExtractLaneU) \
V(Arm64I16x8ExtractLaneS) \ V(Arm64I16x8ExtractLaneS) \
......
...@@ -238,6 +238,7 @@ int InstructionScheduler::GetTargetInstructionFlags( ...@@ -238,6 +238,7 @@ int InstructionScheduler::GetTargetInstructionFlags(
case kArm64I32x4GeU: case kArm64I32x4GeU:
case kArm64I32x4Abs: case kArm64I32x4Abs:
case kArm64I32x4BitMask: case kArm64I32x4BitMask:
case kArm64I32x4DotI16x8S:
case kArm64I16x8Splat: case kArm64I16x8Splat:
case kArm64I16x8ExtractLaneU: case kArm64I16x8ExtractLaneU:
case kArm64I16x8ExtractLaneS: case kArm64I16x8ExtractLaneS:
......
...@@ -3262,6 +3262,7 @@ void InstructionSelector::VisitInt64AbsWithOverflow(Node* node) { ...@@ -3262,6 +3262,7 @@ void InstructionSelector::VisitInt64AbsWithOverflow(Node* node) {
V(I32x4MaxU, kArm64I32x4MaxU) \ V(I32x4MaxU, kArm64I32x4MaxU) \
V(I32x4GtU, kArm64I32x4GtU) \ V(I32x4GtU, kArm64I32x4GtU) \
V(I32x4GeU, kArm64I32x4GeU) \ V(I32x4GeU, kArm64I32x4GeU) \
V(I32x4DotI16x8S, kArm64I32x4DotI16x8S) \
V(I16x8SConvertI32x4, kArm64I16x8SConvertI32x4) \ V(I16x8SConvertI32x4, kArm64I16x8SConvertI32x4) \
V(I16x8AddSaturateS, kArm64I16x8AddSaturateS) \ V(I16x8AddSaturateS, kArm64I16x8AddSaturateS) \
V(I16x8AddHoriz, kArm64I16x8AddHoriz) \ V(I16x8AddHoriz, kArm64I16x8AddHoriz) \
......
...@@ -2705,10 +2705,10 @@ void InstructionSelector::VisitF32x4NearestInt(Node* node) { UNIMPLEMENTED(); } ...@@ -2705,10 +2705,10 @@ void InstructionSelector::VisitF32x4NearestInt(Node* node) { UNIMPLEMENTED(); }
#endif // !V8_TARGET_ARCH_X64 && !V8_TARGET_ARCH_ARM64 && !V8_TARGET_ARCH_S390X #endif // !V8_TARGET_ARCH_X64 && !V8_TARGET_ARCH_ARM64 && !V8_TARGET_ARCH_S390X
// && !V8_TARGET_ARCH_IA32 // && !V8_TARGET_ARCH_IA32
#if !V8_TARGET_ARCH_X64 && !V8_TARGET_ARCH_IA32 #if !V8_TARGET_ARCH_X64 && !V8_TARGET_ARCH_IA32 && !V8_TARGET_ARCH_ARM64
// TODO(v8:10583) Prototype i32x4.dot_i16x8_s // TODO(v8:10583) Prototype i32x4.dot_i16x8_s
void InstructionSelector::VisitI32x4DotI16x8S(Node* node) { UNIMPLEMENTED(); } void InstructionSelector::VisitI32x4DotI16x8S(Node* node) { UNIMPLEMENTED(); }
#endif // !V8_TARGET_ARCH_X64 && !V8_TARGET_ARCH_IA32 #endif // !V8_TARGET_ARCH_X64 && !V8_TARGET_ARCH_IA32 && !V8_TARGET_ARCH_ARM64
void InstructionSelector::VisitFinishRegion(Node* node) { EmitIdentity(node); } void InstructionSelector::VisitFinishRegion(Node* node) { EmitIdentity(node); }
......
...@@ -2317,7 +2317,7 @@ WASM_SIMD_TEST(I16x8RoundingAverageU) { ...@@ -2317,7 +2317,7 @@ WASM_SIMD_TEST(I16x8RoundingAverageU) {
} }
// TODO(v8:10583) Prototype i32x4.dot_i16x8_s // TODO(v8:10583) Prototype i32x4.dot_i16x8_s
#if V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_IA32 #if V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_IA32 || V8_TARGET_ARCH_ARM64
WASM_SIMD_TEST_NO_LOWERING(I32x4DotI16x8S) { WASM_SIMD_TEST_NO_LOWERING(I32x4DotI16x8S) {
FLAG_SCOPE(wasm_simd_post_mvp); FLAG_SCOPE(wasm_simd_post_mvp);
...@@ -2344,7 +2344,7 @@ WASM_SIMD_TEST_NO_LOWERING(I32x4DotI16x8S) { ...@@ -2344,7 +2344,7 @@ WASM_SIMD_TEST_NO_LOWERING(I32x4DotI16x8S) {
} }
} }
} }
#endif // V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_IA32 #endif // V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_IA32 || V8_TARGET_ARCH_ARM64
void RunI16x8ShiftOpTest(ExecutionTier execution_tier, LowerSimd lower_simd, void RunI16x8ShiftOpTest(ExecutionTier execution_tier, LowerSimd lower_simd,
WasmOpcode opcode, Int16ShiftOp expected_op) { WasmOpcode opcode, Int16ShiftOp expected_op) {
......
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