Skip to content

Commit ddcbc8b

Browse files
authored
Arm64/SVE: Implemented Scale and Sqrt (#103663)
* Added ConverToInt32 and ConvertToUInt32 for float inputs. * Added flags to handle only low predicate registers. * Fix whitespace * Remove special codegen flag * Added new test template for operations with different return types. * Add new test template. * Added api for ConvertToInt32 and ConvertToUInt 32 for double. * Round SVE intrinsics for floats. * Completed Round SVE fp apis. * Completed sve apis for scale and sqrt, added a new test template for when Op1 and Op2 have different types. * Fixed test templates.
1 parent f0e70b2 commit ddcbc8b

File tree

7 files changed

+106
-5
lines changed

7 files changed

+106
-5
lines changed

src/coreclr/jit/hwintrinsiclistarm64sve.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,11 +192,13 @@ HARDWARE_INTRINSIC(Sve, SaturatingIncrementBy32BitElementCount,
192192
HARDWARE_INTRINSIC(Sve, SaturatingIncrementBy64BitElementCount, -1, 3, true, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_sqincd, INS_sve_uqincd, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_HasImmediateOperand|HW_Flag_HasEnumOperand|HW_Flag_SpecialCodeGen|HW_Flag_HasScalarInputVariant|HW_Flag_SpecialImport|HW_Flag_HasRMWSemantics)
193193
HARDWARE_INTRINSIC(Sve, SaturatingIncrementBy8BitElementCount, 0, 3, false, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_sqincb, INS_sve_uqincb, INS_sve_sqincb, INS_sve_uqincb, INS_invalid, INS_invalid}, HW_Category_Scalar, HW_Flag_Scalable|HW_Flag_HasImmediateOperand|HW_Flag_HasEnumOperand|HW_Flag_SpecialCodeGen|HW_Flag_SpecialImport|HW_Flag_HasRMWSemantics)
194194
HARDWARE_INTRINSIC(Sve, SaturatingIncrementByActiveElementCount, -1, 2, true, {INS_invalid, INS_sve_sqincp, INS_sve_sqincp, INS_sve_sqincp, INS_sve_sqincp, INS_sve_sqincp, INS_sve_sqincp, INS_sve_sqincp, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_SpecialCodeGen|HW_Flag_SpecialImport|HW_Flag_BaseTypeFromSecondArg|HW_Flag_HasRMWSemantics)
195+
HARDWARE_INTRINSIC(Sve, Scale, -1, -1, false, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_fscale, INS_sve_fscale}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_BaseTypeFromFirstArg|HW_Flag_EmbeddedMaskedOperation|HW_Flag_LowMaskedOperation|HW_Flag_HasRMWSemantics)
195196
HARDWARE_INTRINSIC(Sve, SignExtend16, -1, -1, false, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_sxth, INS_invalid, INS_sve_sxth, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_EmbeddedMaskedOperation|HW_Flag_LowMaskedOperation)
196197
HARDWARE_INTRINSIC(Sve, SignExtend32, -1, -1, false, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_sxtw, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_EmbeddedMaskedOperation|HW_Flag_LowMaskedOperation)
197198
HARDWARE_INTRINSIC(Sve, SignExtend8, -1, -1, false, {INS_invalid, INS_invalid, INS_sve_sxtb, INS_invalid, INS_sve_sxtb, INS_invalid, INS_sve_sxtb, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_EmbeddedMaskedOperation|HW_Flag_LowMaskedOperation)
198199
HARDWARE_INTRINSIC(Sve, SignExtendWideningLower, -1, 1, true, {INS_sve_sunpklo, INS_invalid, INS_sve_sunpklo, INS_invalid, INS_sve_sunpklo, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_BaseTypeFromFirstArg)
199200
HARDWARE_INTRINSIC(Sve, SignExtendWideningUpper, -1, 1, true, {INS_sve_sunpkhi, INS_invalid, INS_sve_sunpkhi, INS_invalid, INS_sve_sunpkhi, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_BaseTypeFromFirstArg)
201+
HARDWARE_INTRINSIC(Sve, Sqrt, -1, -1, false, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_fsqrt, INS_sve_fsqrt}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_EmbeddedMaskedOperation|HW_Flag_LowMaskedOperation)
200202
HARDWARE_INTRINSIC(Sve, StoreAndZip, -1, 3, true, {INS_sve_st1b, INS_sve_st1b, INS_sve_st1h, INS_sve_st1h, INS_sve_st1w, INS_sve_st1w, INS_sve_st1d, INS_sve_st1d, INS_sve_st1w, INS_sve_st1d}, HW_Category_MemoryStore, HW_Flag_Scalable|HW_Flag_BaseTypeFromFirstArg|HW_Flag_ExplicitMaskedOperation|HW_Flag_SpecialImport|HW_Flag_SpecialCodeGen|HW_Flag_LowMaskedOperation)
201203
HARDWARE_INTRINSIC(Sve, StoreNarrowing, -1, 3, true, {INS_sve_st1b, INS_sve_st1b, INS_sve_st1h, INS_sve_st1h, INS_sve_st1w, INS_sve_st1w, INS_sve_st1d, INS_sve_st1d, INS_invalid, INS_invalid}, HW_Category_MemoryStore, HW_Flag_Scalable|HW_Flag_BaseTypeFromFirstArg|HW_Flag_ExplicitMaskedOperation|HW_Flag_SpecialImport|HW_Flag_SpecialCodeGen|HW_Flag_LowMaskedOperation)
202204
HARDWARE_INTRINSIC(Sve, StoreNonTemporal, -1, 3, true, {INS_sve_stnt1b, INS_sve_stnt1b, INS_sve_stnt1h, INS_sve_stnt1h, INS_sve_stnt1w, INS_sve_stnt1w, INS_sve_stnt1d, INS_sve_stnt1d, INS_sve_stnt1w, INS_sve_stnt1d}, HW_Category_MemoryStore, HW_Flag_Scalable|HW_Flag_BaseTypeFromFirstArg|HW_Flag_ExplicitMaskedOperation|HW_Flag_SpecialCodeGen|HW_Flag_LowMaskedOperation)

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

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5394,6 +5394,27 @@ internal Arm64() { }
53945394
public static unsafe Vector<ulong> SaturatingIncrementByActiveElementCount(Vector<ulong> value, Vector<ulong> from) { throw new PlatformNotSupportedException(); }
53955395

53965396

5397+
/// Scale : Adjust exponent
5398+
5399+
/// <summary>
5400+
/// svfloat64_t svscale[_f64]_m(svbool_t pg, svfloat64_t op1, svint64_t op2)
5401+
/// FSCALE Ztied1.D, Pg/M, Ztied1.D, Zop2.D
5402+
/// svfloat64_t svscale[_f64]_x(svbool_t pg, svfloat64_t op1, svint64_t op2)
5403+
/// FSCALE Ztied1.D, Pg/M, Ztied1.D, Zop2.D
5404+
/// svfloat64_t svscale[_f64]_z(svbool_t pg, svfloat64_t op1, svint64_t op2)
5405+
/// </summary>
5406+
public static unsafe Vector<double> Scale(Vector<double> left, Vector<long> right) { throw new PlatformNotSupportedException(); }
5407+
5408+
/// <summary>
5409+
/// svfloat32_t svscale[_f32]_m(svbool_t pg, svfloat32_t op1, svint32_t op2)
5410+
/// FSCALE Ztied1.S, Pg/M, Ztied1.S, Zop2.S
5411+
/// svfloat32_t svscale[_f32]_x(svbool_t pg, svfloat32_t op1, svint32_t op2)
5412+
/// FSCALE Ztied1.S, Pg/M, Ztied1.S, Zop2.S
5413+
/// svfloat32_t svscale[_f32]_z(svbool_t pg, svfloat32_t op1, svint32_t op2)
5414+
/// </summary>
5415+
public static unsafe Vector<float> Scale(Vector<float> left, Vector<int> right) { throw new PlatformNotSupportedException(); }
5416+
5417+
53975418
/// SignExtend16 : Sign-extend the low 16 bits
53985419

53995420
/// <summary>
@@ -5475,6 +5496,27 @@ internal Arm64() { }
54755496
public static unsafe Vector<long> SignExtend8(Vector<long> value) { throw new PlatformNotSupportedException(); }
54765497

54775498

5499+
/// Sqrt : Square root
5500+
5501+
/// <summary>
5502+
/// svfloat64_t svsqrt[_f64]_m(svfloat64_t inactive, svbool_t pg, svfloat64_t op)
5503+
/// FSQRT Ztied.D, Pg/M, Zop.D
5504+
/// svfloat64_t svsqrt[_f64]_x(svbool_t pg, svfloat64_t op)
5505+
/// FSQRT Ztied.D, Pg/M, Ztied.D
5506+
/// svfloat64_t svsqrt[_f64]_z(svbool_t pg, svfloat64_t op)
5507+
/// </summary>
5508+
public static unsafe Vector<double> Sqrt(Vector<double> value) { throw new PlatformNotSupportedException(); }
5509+
5510+
/// <summary>
5511+
/// svfloat32_t svsqrt[_f32]_m(svfloat32_t inactive, svbool_t pg, svfloat32_t op)
5512+
/// FSQRT Ztied.S, Pg/M, Zop.S
5513+
/// svfloat32_t svsqrt[_f32]_x(svbool_t pg, svfloat32_t op)
5514+
/// FSQRT Ztied.S, Pg/M, Ztied.S
5515+
/// svfloat32_t svsqrt[_f32]_z(svbool_t pg, svfloat32_t op)
5516+
/// </summary>
5517+
public static unsafe Vector<float> Sqrt(Vector<float> value) { throw new PlatformNotSupportedException(); }
5518+
5519+
54785520
/// Non-truncating store
54795521

54805522
/// <summary>

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

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5437,6 +5437,27 @@ internal Arm64() { }
54375437
public static unsafe Vector<ulong> SaturatingIncrementByActiveElementCount(Vector<ulong> value, Vector<ulong> from) => SaturatingIncrementByActiveElementCount(value, from);
54385438

54395439

5440+
/// Scale : Adjust exponent
5441+
5442+
/// <summary>
5443+
/// svfloat64_t svscale[_f64]_m(svbool_t pg, svfloat64_t op1, svint64_t op2)
5444+
/// FSCALE Ztied1.D, Pg/M, Ztied1.D, Zop2.D
5445+
/// svfloat64_t svscale[_f64]_x(svbool_t pg, svfloat64_t op1, svint64_t op2)
5446+
/// FSCALE Ztied1.D, Pg/M, Ztied1.D, Zop2.D
5447+
/// svfloat64_t svscale[_f64]_z(svbool_t pg, svfloat64_t op1, svint64_t op2)
5448+
/// </summary>
5449+
public static unsafe Vector<double> Scale(Vector<double> left, Vector<long> right) => Scale(left, right);
5450+
5451+
/// <summary>
5452+
/// svfloat32_t svscale[_f32]_m(svbool_t pg, svfloat32_t op1, svint32_t op2)
5453+
/// FSCALE Ztied1.S, Pg/M, Ztied1.S, Zop2.S
5454+
/// svfloat32_t svscale[_f32]_x(svbool_t pg, svfloat32_t op1, svint32_t op2)
5455+
/// FSCALE Ztied1.S, Pg/M, Ztied1.S, Zop2.S
5456+
/// svfloat32_t svscale[_f32]_z(svbool_t pg, svfloat32_t op1, svint32_t op2)
5457+
/// </summary>
5458+
public static unsafe Vector<float> Scale(Vector<float> left, Vector<int> right) => Scale(left, right);
5459+
5460+
54405461
/// SignExtend16 : Sign-extend the low 16 bits
54415462

54425463
/// <summary>
@@ -5559,6 +5580,27 @@ internal Arm64() { }
55595580
public static unsafe Vector<long> SignExtendWideningUpper(Vector<int> value) => SignExtendWideningUpper(value);
55605581

55615582

5583+
/// Sqrt : Square root
5584+
5585+
/// <summary>
5586+
/// svfloat64_t svsqrt[_f64]_m(svfloat64_t inactive, svbool_t pg, svfloat64_t op)
5587+
/// FSQRT Ztied.D, Pg/M, Zop.D
5588+
/// svfloat64_t svsqrt[_f64]_x(svbool_t pg, svfloat64_t op)
5589+
/// FSQRT Ztied.D, Pg/M, Ztied.D
5590+
/// svfloat64_t svsqrt[_f64]_z(svbool_t pg, svfloat64_t op)
5591+
/// </summary>
5592+
public static unsafe Vector<double> Sqrt(Vector<double> value) => Sqrt(value);
5593+
5594+
/// <summary>
5595+
/// svfloat32_t svsqrt[_f32]_m(svfloat32_t inactive, svbool_t pg, svfloat32_t op)
5596+
/// FSQRT Ztied.S, Pg/M, Zop.S
5597+
/// svfloat32_t svsqrt[_f32]_x(svbool_t pg, svfloat32_t op)
5598+
/// FSQRT Ztied.S, Pg/M, Ztied.S
5599+
/// svfloat32_t svsqrt[_f32]_z(svbool_t pg, svfloat32_t op)
5600+
/// </summary>
5601+
public static unsafe Vector<float> Sqrt(Vector<float> value) => Sqrt(value);
5602+
5603+
55625604
/// Non-truncating store
55635605

55645606
/// <summary>

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4972,6 +4972,9 @@ internal Arm64() { }
49724972
public static ulong SaturatingIncrementByActiveElementCount(ulong value, System.Numerics.Vector<ulong> from) { throw null; }
49734973
public static System.Numerics.Vector<ulong> SaturatingIncrementByActiveElementCount(System.Numerics.Vector<ulong> value, System.Numerics.Vector<ulong> from) { throw null; }
49744974

4975+
public static System.Numerics.Vector<double> Scale(System.Numerics.Vector<double> left, System.Numerics.Vector<long> right) { throw null; }
4976+
public static System.Numerics.Vector<float> Scale(System.Numerics.Vector<float> left, System.Numerics.Vector<int> right) { throw null; }
4977+
49754978
public static System.Numerics.Vector<int> SignExtend16(System.Numerics.Vector<int> value) { throw null; }
49764979
public static System.Numerics.Vector<long> SignExtend16(System.Numerics.Vector<long> value) { throw null; }
49774980
public static System.Numerics.Vector<long> SignExtend32(System.Numerics.Vector<long> value) { throw null; }
@@ -4986,6 +4989,9 @@ internal Arm64() { }
49864989
public static System.Numerics.Vector<int> SignExtendWideningUpper(System.Numerics.Vector<short> value) { throw null; }
49874990
public static System.Numerics.Vector<long> SignExtendWideningUpper(System.Numerics.Vector<int> value) { throw null; }
49884991

4992+
public static System.Numerics.Vector<double> Sqrt(System.Numerics.Vector<double> value) { throw null; }
4993+
public static System.Numerics.Vector<float> Sqrt(System.Numerics.Vector<float> value) { throw null; }
4994+
49894995
public static unsafe void StoreAndZip(System.Numerics.Vector<byte> mask, byte* address, System.Numerics.Vector<byte> data) { throw null; }
49904996
public static unsafe void StoreAndZip(System.Numerics.Vector<byte> mask, byte* address, (System.Numerics.Vector<byte> Value1, System.Numerics.Vector<byte> Value2) data) { throw null; }
49914997
public static unsafe void StoreAndZip(System.Numerics.Vector<byte> mask, byte* address, (System.Numerics.Vector<byte> Value1, System.Numerics.Vector<byte> Value2, System.Numerics.Vector<byte> Value3) data) { throw null; }

0 commit comments

Comments
 (0)