[wasm-simd] Implement F64x2 Abs Neg for arm64
Bug: v8:8460 Change-Id: I4bf23d884f5d6b587db741e9d19ac4b6b1ece506 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/1749663 Reviewed-by: Deepti Gandluri <gdeepti@chromium.org> Commit-Queue: Zhi An Ng <zhin@chromium.org> Cr-Commit-Position: refs/heads/master@{#63210}
This commit is contained in:
parent
cfe6ceae3f
commit
3945c61271
@ -1792,6 +1792,8 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
|
|||||||
__ Mov(dst, i.InputInt8(1), i.InputSimd128Register(2).V2D(), 0);
|
__ Mov(dst, i.InputInt8(1), i.InputSimd128Register(2).V2D(), 0);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
SIMD_UNOP_CASE(kArm64F64x2Abs, Fabs, 2D);
|
||||||
|
SIMD_UNOP_CASE(kArm64F64x2Neg, Fneg, 2D);
|
||||||
case kArm64F32x4Splat: {
|
case kArm64F32x4Splat: {
|
||||||
__ Dup(i.OutputSimd128Register().V4S(), i.InputSimd128Register(0).S(), 0);
|
__ Dup(i.OutputSimd128Register().V4S(), i.InputSimd128Register(0).S(), 0);
|
||||||
break;
|
break;
|
||||||
|
@ -173,6 +173,8 @@ namespace compiler {
|
|||||||
V(Arm64F64x2Splat) \
|
V(Arm64F64x2Splat) \
|
||||||
V(Arm64F64x2ExtractLane) \
|
V(Arm64F64x2ExtractLane) \
|
||||||
V(Arm64F64x2ReplaceLane) \
|
V(Arm64F64x2ReplaceLane) \
|
||||||
|
V(Arm64F64x2Abs) \
|
||||||
|
V(Arm64F64x2Neg) \
|
||||||
V(Arm64F32x4Splat) \
|
V(Arm64F32x4Splat) \
|
||||||
V(Arm64F32x4ExtractLane) \
|
V(Arm64F32x4ExtractLane) \
|
||||||
V(Arm64F32x4ReplaceLane) \
|
V(Arm64F32x4ReplaceLane) \
|
||||||
|
@ -140,6 +140,8 @@ int InstructionScheduler::GetTargetInstructionFlags(
|
|||||||
case kArm64F64x2Splat:
|
case kArm64F64x2Splat:
|
||||||
case kArm64F64x2ExtractLane:
|
case kArm64F64x2ExtractLane:
|
||||||
case kArm64F64x2ReplaceLane:
|
case kArm64F64x2ReplaceLane:
|
||||||
|
case kArm64F64x2Abs:
|
||||||
|
case kArm64F64x2Neg:
|
||||||
case kArm64F32x4Splat:
|
case kArm64F32x4Splat:
|
||||||
case kArm64F32x4ExtractLane:
|
case kArm64F32x4ExtractLane:
|
||||||
case kArm64F32x4ReplaceLane:
|
case kArm64F32x4ReplaceLane:
|
||||||
|
@ -3055,6 +3055,8 @@ void InstructionSelector::VisitInt64AbsWithOverflow(Node* node) {
|
|||||||
V(I8x16)
|
V(I8x16)
|
||||||
|
|
||||||
#define SIMD_UNOP_LIST(V) \
|
#define SIMD_UNOP_LIST(V) \
|
||||||
|
V(F64x2Abs, kArm64F64x2Abs) \
|
||||||
|
V(F64x2Neg, kArm64F64x2Neg) \
|
||||||
V(F32x4SConvertI32x4, kArm64F32x4SConvertI32x4) \
|
V(F32x4SConvertI32x4, kArm64F32x4SConvertI32x4) \
|
||||||
V(F32x4UConvertI32x4, kArm64F32x4UConvertI32x4) \
|
V(F32x4UConvertI32x4, kArm64F32x4UConvertI32x4) \
|
||||||
V(F32x4Abs, kArm64F32x4Abs) \
|
V(F32x4Abs, kArm64F32x4Abs) \
|
||||||
|
@ -2600,8 +2600,6 @@ void InstructionSelector::VisitWord64AtomicCompareExchange(Node* node) {
|
|||||||
// !V8_TARGET_ARCH_MIPS64 && !V8_TARGET_ARCH_S390
|
// !V8_TARGET_ARCH_MIPS64 && !V8_TARGET_ARCH_S390
|
||||||
|
|
||||||
#if !V8_TARGET_ARCH_X64
|
#if !V8_TARGET_ARCH_X64
|
||||||
void InstructionSelector::VisitF64x2Abs(Node* node) { UNIMPLEMENTED(); }
|
|
||||||
void InstructionSelector::VisitF64x2Neg(Node* node) { UNIMPLEMENTED(); }
|
|
||||||
void InstructionSelector::VisitF64x2Add(Node* node) { UNIMPLEMENTED(); }
|
void InstructionSelector::VisitF64x2Add(Node* node) { UNIMPLEMENTED(); }
|
||||||
void InstructionSelector::VisitF64x2Sub(Node* node) { UNIMPLEMENTED(); }
|
void InstructionSelector::VisitF64x2Sub(Node* node) { UNIMPLEMENTED(); }
|
||||||
void InstructionSelector::VisitF64x2Mul(Node* node) { UNIMPLEMENTED(); }
|
void InstructionSelector::VisitF64x2Mul(Node* node) { UNIMPLEMENTED(); }
|
||||||
@ -2616,6 +2614,8 @@ void InstructionSelector::VisitF64x2Le(Node* node) { UNIMPLEMENTED(); }
|
|||||||
void InstructionSelector::VisitF64x2Splat(Node* node) { UNIMPLEMENTED(); }
|
void InstructionSelector::VisitF64x2Splat(Node* node) { UNIMPLEMENTED(); }
|
||||||
void InstructionSelector::VisitF64x2ExtractLane(Node* node) { UNIMPLEMENTED(); }
|
void InstructionSelector::VisitF64x2ExtractLane(Node* node) { UNIMPLEMENTED(); }
|
||||||
void InstructionSelector::VisitF64x2ReplaceLane(Node* node) { UNIMPLEMENTED(); }
|
void InstructionSelector::VisitF64x2ReplaceLane(Node* node) { UNIMPLEMENTED(); }
|
||||||
|
void InstructionSelector::VisitF64x2Abs(Node* node) { UNIMPLEMENTED(); }
|
||||||
|
void InstructionSelector::VisitF64x2Neg(Node* node) { UNIMPLEMENTED(); }
|
||||||
void InstructionSelector::VisitI64x2Splat(Node* node) { UNIMPLEMENTED(); }
|
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(); }
|
||||||
|
@ -988,62 +988,6 @@ WASM_SIMD_TEST_NO_LOWERING(F64x2ReplaceLane) {
|
|||||||
CHECK_EQ(static_cast<double>(i), ReadLittleEndianValue<double>(&g[i]));
|
CHECK_EQ(static_cast<double>(i), ReadLittleEndianValue<double>(&g[i]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif // V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_ARM64
|
|
||||||
|
|
||||||
#if V8_TARGET_ARCH_X64
|
|
||||||
void RunF64x2CompareOpTest(ExecutionTier execution_tier, LowerSimd lower_simd,
|
|
||||||
WasmOpcode opcode, DoubleCompareOp expected_op) {
|
|
||||||
WasmRunner<int32_t, double, double> r(execution_tier, lower_simd);
|
|
||||||
// Set up global to hold mask output.
|
|
||||||
int64_t* g = r.builder().AddGlobal<int64_t>(kWasmS128);
|
|
||||||
// Build fn to splat test values, perform compare op, and write the result.
|
|
||||||
byte value1 = 0, value2 = 1;
|
|
||||||
byte temp1 = r.AllocateLocal(kWasmS128);
|
|
||||||
byte temp2 = r.AllocateLocal(kWasmS128);
|
|
||||||
BUILD(r, WASM_SET_LOCAL(temp1, WASM_SIMD_F64x2_SPLAT(WASM_GET_LOCAL(value1))),
|
|
||||||
WASM_SET_LOCAL(temp2, WASM_SIMD_F64x2_SPLAT(WASM_GET_LOCAL(value2))),
|
|
||||||
WASM_SET_GLOBAL(0, WASM_SIMD_BINOP(opcode, WASM_GET_LOCAL(temp1),
|
|
||||||
WASM_GET_LOCAL(temp2))),
|
|
||||||
WASM_ONE);
|
|
||||||
|
|
||||||
FOR_FLOAT64_INPUTS(x) {
|
|
||||||
if (!PlatformCanRepresent(x)) continue;
|
|
||||||
FOR_FLOAT64_INPUTS(y) {
|
|
||||||
if (!PlatformCanRepresent(y)) continue;
|
|
||||||
double diff = x - y; // Model comparison as subtraction.
|
|
||||||
if (!PlatformCanRepresent(diff)) continue;
|
|
||||||
r.Call(x, y);
|
|
||||||
int64_t expected = expected_op(x, y);
|
|
||||||
for (int i = 0; i < 2; i++) {
|
|
||||||
CHECK_EQ(expected, ReadLittleEndianValue<int64_t>(&g[i]));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
WASM_SIMD_TEST_NO_LOWERING(F64x2Eq) {
|
|
||||||
RunF64x2CompareOpTest(execution_tier, lower_simd, kExprF64x2Eq, Equal);
|
|
||||||
}
|
|
||||||
|
|
||||||
WASM_SIMD_TEST_NO_LOWERING(F64x2Ne) {
|
|
||||||
RunF64x2CompareOpTest(execution_tier, lower_simd, kExprF64x2Ne, NotEqual);
|
|
||||||
}
|
|
||||||
|
|
||||||
WASM_SIMD_TEST_NO_LOWERING(F64x2Gt) {
|
|
||||||
RunF64x2CompareOpTest(execution_tier, lower_simd, kExprF64x2Gt, Greater);
|
|
||||||
}
|
|
||||||
|
|
||||||
WASM_SIMD_TEST_NO_LOWERING(F64x2Ge) {
|
|
||||||
RunF64x2CompareOpTest(execution_tier, lower_simd, kExprF64x2Ge, GreaterEqual);
|
|
||||||
}
|
|
||||||
|
|
||||||
WASM_SIMD_TEST_NO_LOWERING(F64x2Lt) {
|
|
||||||
RunF64x2CompareOpTest(execution_tier, lower_simd, kExprF64x2Lt, Less);
|
|
||||||
}
|
|
||||||
|
|
||||||
WASM_SIMD_TEST_NO_LOWERING(F64x2Le) {
|
|
||||||
RunF64x2CompareOpTest(execution_tier, lower_simd, kExprF64x2Le, LessEqual);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool IsExtreme(double x) {
|
bool IsExtreme(double x) {
|
||||||
double abs_x = std::fabs(x);
|
double abs_x = std::fabs(x);
|
||||||
@ -1166,6 +1110,62 @@ WASM_SIMD_TEST_NO_LOWERING(F64x2Abs) {
|
|||||||
WASM_SIMD_TEST_NO_LOWERING(F64x2Neg) {
|
WASM_SIMD_TEST_NO_LOWERING(F64x2Neg) {
|
||||||
RunF64x2UnOpTest(execution_tier, lower_simd, kExprF64x2Neg, Negate);
|
RunF64x2UnOpTest(execution_tier, lower_simd, kExprF64x2Neg, Negate);
|
||||||
}
|
}
|
||||||
|
#endif // V8_TARGET_ARCH_X64 || V8_TARGET_ARCH_ARM64
|
||||||
|
|
||||||
|
#if V8_TARGET_ARCH_X64
|
||||||
|
void RunF64x2CompareOpTest(ExecutionTier execution_tier, LowerSimd lower_simd,
|
||||||
|
WasmOpcode opcode, DoubleCompareOp expected_op) {
|
||||||
|
WasmRunner<int32_t, double, double> r(execution_tier, lower_simd);
|
||||||
|
// Set up global to hold mask output.
|
||||||
|
int64_t* g = r.builder().AddGlobal<int64_t>(kWasmS128);
|
||||||
|
// Build fn to splat test values, perform compare op, and write the result.
|
||||||
|
byte value1 = 0, value2 = 1;
|
||||||
|
byte temp1 = r.AllocateLocal(kWasmS128);
|
||||||
|
byte temp2 = r.AllocateLocal(kWasmS128);
|
||||||
|
BUILD(r, WASM_SET_LOCAL(temp1, WASM_SIMD_F64x2_SPLAT(WASM_GET_LOCAL(value1))),
|
||||||
|
WASM_SET_LOCAL(temp2, WASM_SIMD_F64x2_SPLAT(WASM_GET_LOCAL(value2))),
|
||||||
|
WASM_SET_GLOBAL(0, WASM_SIMD_BINOP(opcode, WASM_GET_LOCAL(temp1),
|
||||||
|
WASM_GET_LOCAL(temp2))),
|
||||||
|
WASM_ONE);
|
||||||
|
|
||||||
|
FOR_FLOAT64_INPUTS(x) {
|
||||||
|
if (!PlatformCanRepresent(x)) continue;
|
||||||
|
FOR_FLOAT64_INPUTS(y) {
|
||||||
|
if (!PlatformCanRepresent(y)) continue;
|
||||||
|
double diff = x - y; // Model comparison as subtraction.
|
||||||
|
if (!PlatformCanRepresent(diff)) continue;
|
||||||
|
r.Call(x, y);
|
||||||
|
int64_t expected = expected_op(x, y);
|
||||||
|
for (int i = 0; i < 2; i++) {
|
||||||
|
CHECK_EQ(expected, ReadLittleEndianValue<int64_t>(&g[i]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
WASM_SIMD_TEST_NO_LOWERING(F64x2Eq) {
|
||||||
|
RunF64x2CompareOpTest(execution_tier, lower_simd, kExprF64x2Eq, Equal);
|
||||||
|
}
|
||||||
|
|
||||||
|
WASM_SIMD_TEST_NO_LOWERING(F64x2Ne) {
|
||||||
|
RunF64x2CompareOpTest(execution_tier, lower_simd, kExprF64x2Ne, NotEqual);
|
||||||
|
}
|
||||||
|
|
||||||
|
WASM_SIMD_TEST_NO_LOWERING(F64x2Gt) {
|
||||||
|
RunF64x2CompareOpTest(execution_tier, lower_simd, kExprF64x2Gt, Greater);
|
||||||
|
}
|
||||||
|
|
||||||
|
WASM_SIMD_TEST_NO_LOWERING(F64x2Ge) {
|
||||||
|
RunF64x2CompareOpTest(execution_tier, lower_simd, kExprF64x2Ge, GreaterEqual);
|
||||||
|
}
|
||||||
|
|
||||||
|
WASM_SIMD_TEST_NO_LOWERING(F64x2Lt) {
|
||||||
|
RunF64x2CompareOpTest(execution_tier, lower_simd, kExprF64x2Lt, Less);
|
||||||
|
}
|
||||||
|
|
||||||
|
WASM_SIMD_TEST_NO_LOWERING(F64x2Le) {
|
||||||
|
RunF64x2CompareOpTest(execution_tier, lower_simd, kExprF64x2Le, LessEqual);
|
||||||
|
}
|
||||||
|
|
||||||
void RunF64x2BinOpTest(ExecutionTier execution_tier, LowerSimd lower_simd,
|
void RunF64x2BinOpTest(ExecutionTier execution_tier, LowerSimd lower_simd,
|
||||||
WasmOpcode opcode, DoubleBinOp expected_op) {
|
WasmOpcode opcode, DoubleBinOp expected_op) {
|
||||||
|
Loading…
Reference in New Issue
Block a user