Skip to content

Commit 9861664

Browse files
dtigkangwoosukeq
authored andcommitted
[wasm-relaxed-simd] Prototype relaxed min/max for ARM
Prototype F32x4Relaxed(Min/Max) and F64x2Relaxed(Min/Max) operations for ARM. F32x4 variants map directly to vmin/vmax hardware instructions which are also used for F32x4(Min/Max) operations. The F64x2 variants are mapped in this implementation to Pmin/Pmax instructions as detailed in the github issue. WebAssembly/relaxed-simd#33 Bug: v8:12284 Change-Id: I5ea939385fa0ae97bbdf776fc0b763cabb1b293c Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3501347 Reviewed-by: Adam Klein <[email protected]> Commit-Queue: Deepti Gandluri <[email protected]> Cr-Commit-Position: refs/heads/main@{#79355}
1 parent 295e353 commit 9861664

File tree

3 files changed

+18
-8
lines changed

3 files changed

+18
-8
lines changed

src/compiler/backend/arm/instruction-selector-arm.cc

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2640,7 +2640,9 @@ void InstructionSelector::VisitWord32AtomicPairCompareExchange(Node* node) {
26402640
V(F32x4Sub, kArmF32x4Sub) \
26412641
V(F32x4Mul, kArmF32x4Mul) \
26422642
V(F32x4Min, kArmF32x4Min) \
2643+
V(F32x4RelaxedMin, kArmF32x4Min) \
26432644
V(F32x4Max, kArmF32x4Max) \
2645+
V(F32x4RelaxedMax, kArmF32x4Max) \
26442646
V(F32x4Eq, kArmF32x4Eq) \
26452647
V(F32x4Ne, kArmF32x4Ne) \
26462648
V(F32x4Lt, kArmF32x4Lt) \
@@ -3148,6 +3150,14 @@ void InstructionSelector::VisitF64x2Pmax(Node* node) {
31483150
VisitF64x2PminOrPMax(this, kArmF64x2Pmax, node);
31493151
}
31503152

3153+
void InstructionSelector::VisitF64x2RelaxedMin(Node* node) {
3154+
VisitF64x2Pmin(node);
3155+
}
3156+
3157+
void InstructionSelector::VisitF64x2RelaxedMax(Node* node) {
3158+
VisitF64x2Pmax(node);
3159+
}
3160+
31513161
#define EXT_MUL_LIST(V) \
31523162
V(I16x8ExtMulLowI8x16S, kArmVmullLow, NeonS8) \
31533163
V(I16x8ExtMulHighI8x16S, kArmVmullHigh, NeonS8) \

src/compiler/backend/instruction-selector.cc

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2809,15 +2809,15 @@ void InstructionSelector::VisitI32x4RelaxedLaneSelect(Node* node) {
28092809
void InstructionSelector::VisitI64x2RelaxedLaneSelect(Node* node) {
28102810
UNIMPLEMENTED();
28112811
}
2812+
void InstructionSelector::VisitF32x4RelaxedMin(Node* node) { UNIMPLEMENTED(); }
2813+
void InstructionSelector::VisitF32x4RelaxedMax(Node* node) { UNIMPLEMENTED(); }
2814+
void InstructionSelector::VisitF64x2RelaxedMin(Node* node) { UNIMPLEMENTED(); }
2815+
void InstructionSelector::VisitF64x2RelaxedMax(Node* node) { UNIMPLEMENTED(); }
28122816
#endif // !V8_TARGET_ARCH_X64 && !V8_TARGET_ARCH_IA32 && !V8_TARGET_ARCH_ARM64
28132817
// && !V8_TARGET_ARCH_RISCV64 && !V8_TARGET_ARM
28142818

28152819
#if !V8_TARGET_ARCH_X64 && !V8_TARGET_ARCH_IA32 && !V8_TARGET_ARCH_ARM64 && \
28162820
!V8_TARGET_ARCH_RISCV64
2817-
void InstructionSelector::VisitF32x4RelaxedMin(Node* node) { UNIMPLEMENTED(); }
2818-
void InstructionSelector::VisitF32x4RelaxedMax(Node* node) { UNIMPLEMENTED(); }
2819-
void InstructionSelector::VisitF64x2RelaxedMin(Node* node) { UNIMPLEMENTED(); }
2820-
void InstructionSelector::VisitF64x2RelaxedMax(Node* node) { UNIMPLEMENTED(); }
28212821
void InstructionSelector::VisitI32x4RelaxedTruncF64x2SZero(Node* node) {
28222822
UNIMPLEMENTED();
28232823
}

test/cctest/wasm/test-run-wasm-relaxed-simd.cc

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -314,11 +314,7 @@ WASM_RELAXED_SIMD_TEST(I64x2RelaxedLaneSelect) {
314314
RelaxedLaneSelectTest<uint64_t, kElems>(execution_tier, v1, v2, s, expected,
315315
kExprI64x2RelaxedLaneSelect);
316316
}
317-
#endif // V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_IA32 || V8_TARGET_ARCH_ARM64 ||
318-
// V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_RISCV64
319317

320-
#if V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_IA32 || V8_TARGET_ARCH_ARM64 || \
321-
V8_TARGET_ARCH_RISCV64
322318
WASM_RELAXED_SIMD_TEST(F32x4RelaxedMin) {
323319
RunF32x4BinOpTest(execution_tier, kExprF32x4RelaxedMin, Minimum);
324320
}
@@ -334,7 +330,11 @@ WASM_RELAXED_SIMD_TEST(F64x2RelaxedMin) {
334330
WASM_RELAXED_SIMD_TEST(F64x2RelaxedMax) {
335331
RunF64x2BinOpTest(execution_tier, kExprF64x2RelaxedMax, Maximum);
336332
}
333+
#endif // V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_IA32 || V8_TARGET_ARCH_ARM64 ||
334+
// V8_TARGET_ARCH_ARM || V8_TARGET_ARCH_RISCV64
337335

336+
#if V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_IA32 || V8_TARGET_ARCH_ARM64 || \
337+
V8_TARGET_ARCH_RISCV64
338338
namespace {
339339
// For relaxed trunc instructions, don't test out of range values.
340340
// FloatType comes later so caller can rely on template argument deduction and

0 commit comments

Comments
 (0)