Skip to content

Commit 5354e0f

Browse files
ARM64-SVE: Add TrigonometricMultiplyAddCoefficient (#104697)
1 parent ad25cd0 commit 5354e0f

File tree

11 files changed

+155
-4
lines changed

11 files changed

+155
-4
lines changed

src/coreclr/jit/hwintrinsicarm64.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -504,6 +504,11 @@ void HWIntrinsicInfo::lookupImmBounds(
504504
immUpperBound = (int)SVE_PRFOP_CONST15;
505505
break;
506506

507+
case NI_Sve_TrigonometricMultiplyAddCoefficient:
508+
immLowerBound = 0;
509+
immUpperBound = 7;
510+
break;
511+
507512
default:
508513
unreached();
509514
}

src/coreclr/jit/hwintrinsiccodegenarm64.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2330,6 +2330,26 @@ void CodeGen::genHWIntrinsic(GenTreeHWIntrinsic* node)
23302330
break;
23312331
}
23322332

2333+
case NI_Sve_TrigonometricMultiplyAddCoefficient:
2334+
{
2335+
assert(isRMW);
2336+
2337+
if (targetReg != op1Reg)
2338+
{
2339+
assert(targetReg != op2Reg);
2340+
2341+
GetEmitter()->emitInsSve_R_R(INS_sve_movprfx, EA_SCALABLE, targetReg, op1Reg);
2342+
}
2343+
2344+
HWIntrinsicImmOpHelper helper(this, intrin.op3, node);
2345+
2346+
for (helper.EmitBegin(); !helper.Done(); helper.EmitCaseEnd())
2347+
{
2348+
GetEmitter()->emitInsSve_R_R_I(ins, emitSize, targetReg, op2Reg, helper.ImmValue(), opt);
2349+
}
2350+
break;
2351+
}
2352+
23332353
default:
23342354
unreached();
23352355
}

src/coreclr/jit/hwintrinsiclistarm64sve.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,7 @@ HARDWARE_INTRINSIC(Sve, TestFirstTrue,
246246
HARDWARE_INTRINSIC(Sve, TestLastTrue, -1, 2, true, {INS_sve_ptest, INS_sve_ptest, INS_sve_ptest, INS_sve_ptest, INS_sve_ptest, INS_sve_ptest, INS_sve_ptest, INS_sve_ptest, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_ExplicitMaskedOperation|HW_Flag_LowMaskedOperation|HW_Flag_BaseTypeFromFirstArg|HW_Flag_SpecialCodeGen)
247247
HARDWARE_INTRINSIC(Sve, TransposeEven, -1, 2, true, {INS_sve_trn1, INS_sve_trn1, INS_sve_trn1, INS_sve_trn1, INS_sve_trn1, INS_sve_trn1, INS_sve_trn1, INS_sve_trn1, INS_sve_trn1, INS_sve_trn1}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_SpecialCodeGen)
248248
HARDWARE_INTRINSIC(Sve, TransposeOdd, -1, 2, true, {INS_sve_trn2, INS_sve_trn2, INS_sve_trn2, INS_sve_trn2, INS_sve_trn2, INS_sve_trn2, INS_sve_trn2, INS_sve_trn2, INS_sve_trn2, INS_sve_trn2}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_SpecialCodeGen)
249+
HARDWARE_INTRINSIC(Sve, TrigonometricMultiplyAddCoefficient, -1, 3, true, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_ftmad, INS_sve_ftmad}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_HasImmediateOperand|HW_Flag_HasRMWSemantics|HW_Flag_SpecialCodeGen)
249250
HARDWARE_INTRINSIC(Sve, TrigonometricSelectCoefficient, -1, 2, true, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_ftssel, INS_sve_ftssel}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_BaseTypeFromFirstArg)
250251
HARDWARE_INTRINSIC(Sve, TrigonometricStartingValue, -1, 2, true, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_ftsmul, INS_sve_ftsmul}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_BaseTypeFromFirstArg)
251252
HARDWARE_INTRINSIC(Sve, UnzipEven, -1, 2, true, {INS_sve_uzp1, INS_sve_uzp1, INS_sve_uzp1, INS_sve_uzp1, INS_sve_uzp1, INS_sve_uzp1, INS_sve_uzp1, INS_sve_uzp1, INS_sve_uzp1, INS_sve_uzp1}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_SpecialCodeGen)

src/coreclr/jit/lowerarmarch.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3434,6 +3434,7 @@ void Lowering::ContainCheckHWIntrinsic(GenTreeHWIntrinsic* node)
34343434
case NI_Sve_PrefetchInt32:
34353435
case NI_Sve_PrefetchInt64:
34363436
case NI_Sve_ExtractVector:
3437+
case NI_Sve_TrigonometricMultiplyAddCoefficient:
34373438
assert(hasImmediateOperand);
34383439
assert(varTypeIsIntegral(intrin.op3));
34393440
if (intrin.op3->IsCnsIntOrI())

src/coreclr/jit/lsraarm64.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1450,6 +1450,7 @@ int LinearScan::BuildHWIntrinsic(GenTreeHWIntrinsic* intrinsicTree, int* pDstCou
14501450
case NI_Sve_PrefetchInt32:
14511451
case NI_Sve_PrefetchInt64:
14521452
case NI_Sve_ExtractVector:
1453+
case NI_Sve_TrigonometricMultiplyAddCoefficient:
14531454
needBranchTargetReg = !intrin.op3->isContainedIntOrIImmed();
14541455
break;
14551456

src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Sve.PlatformNotSupported.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8631,6 +8631,21 @@ internal Arm64() { }
86318631
public static unsafe Vector<ulong> TransposeOdd(Vector<ulong> left, Vector<ulong> right) { throw new PlatformNotSupportedException(); }
86328632

86338633

8634+
/// Trigonometric multiply-add coefficient
8635+
8636+
/// <summary>
8637+
/// svfloat64_t svtmad[_f64](svfloat64_t op1, svfloat64_t op2, uint64_t imm3)
8638+
/// FTMAD Ztied1.D, Ztied1.D, Zop2.D, #imm3
8639+
/// </summary>
8640+
public static unsafe Vector<double> TrigonometricMultiplyAddCoefficient(Vector<double> left, Vector<double> right, [ConstantExpected(Min = 0, Max = (byte)(7))] byte control) { throw new PlatformNotSupportedException(); }
8641+
8642+
/// <summary>
8643+
/// svfloat32_t svtmad[_f32](svfloat32_t op1, svfloat32_t op2, uint64_t imm3)
8644+
/// FTMAD Ztied1.S, Ztied1.S, Zop2.S, #imm3
8645+
/// </summary>
8646+
public static unsafe Vector<float> TrigonometricMultiplyAddCoefficient(Vector<float> left, Vector<float> right, [ConstantExpected(Min = 0, Max = (byte)(7))] byte control) { throw new PlatformNotSupportedException(); }
8647+
8648+
86348649
/// Trigonometric select coefficient
86358650

86368651
/// <summary>

src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/Arm/Sve.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8676,6 +8676,21 @@ internal Arm64() { }
86768676
public static unsafe Vector<ulong> TransposeOdd(Vector<ulong> left, Vector<ulong> right) => TransposeOdd(left, right);
86778677

86788678

8679+
/// Trigonometric multiply-add coefficient
8680+
8681+
/// <summary>
8682+
/// svfloat64_t svtmad[_f64](svfloat64_t op1, svfloat64_t op2, uint64_t imm3)
8683+
/// FTMAD Ztied1.D, Ztied1.D, Zop2.D, #imm3
8684+
/// </summary>
8685+
public static unsafe Vector<double> TrigonometricMultiplyAddCoefficient(Vector<double> left, Vector<double> right, [ConstantExpected(Min = 0, Max = (byte)(7))] byte control) => TrigonometricMultiplyAddCoefficient(left, right, control);
8686+
8687+
/// <summary>
8688+
/// svfloat32_t svtmad[_f32](svfloat32_t op1, svfloat32_t op2, uint64_t imm3)
8689+
/// FTMAD Ztied1.S, Ztied1.S, Zop2.S, #imm3
8690+
/// </summary>
8691+
public static unsafe Vector<float> TrigonometricMultiplyAddCoefficient(Vector<float> left, Vector<float> right, [ConstantExpected(Min = 0, Max = (byte)(7))] byte control) => TrigonometricMultiplyAddCoefficient(left, right, control);
8692+
8693+
86798694
/// Trigonometric select coefficient
86808695

86818696
/// <summary>

src/libraries/System.Runtime.Intrinsics/ref/System.Runtime.Intrinsics.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5603,6 +5603,8 @@ internal Arm64() { }
56035603
public static System.Numerics.Vector<uint> TransposeOdd(System.Numerics.Vector<uint> left, System.Numerics.Vector<uint> right) { throw null; }
56045604
public static System.Numerics.Vector<ulong> TransposeOdd(System.Numerics.Vector<ulong> left, System.Numerics.Vector<ulong> right) { throw null; }
56055605

5606+
public static System.Numerics.Vector<double> TrigonometricMultiplyAddCoefficient(System.Numerics.Vector<double> left, System.Numerics.Vector<double> right, [ConstantExpected(Min = 0, Max = (byte)(7))] byte control) { throw null; }
5607+
public static System.Numerics.Vector<float> TrigonometricMultiplyAddCoefficient(System.Numerics.Vector<float> left, System.Numerics.Vector<float> right, [ConstantExpected(Min = 0, Max = (byte)(7))] byte control) { throw null; }
56065608
public static System.Numerics.Vector<double> TrigonometricSelectCoefficient(System.Numerics.Vector<double> value, System.Numerics.Vector<ulong> selector) { throw null; }
56075609
public static System.Numerics.Vector<float> TrigonometricSelectCoefficient(System.Numerics.Vector<float> value, System.Numerics.Vector<uint> selector) { throw null; }
56085610
public static System.Numerics.Vector<double> TrigonometricStartingValue(System.Numerics.Vector<double> value, System.Numerics.Vector<ulong> sign) { throw null; }

0 commit comments

Comments
 (0)