Skip to content

Commit ced2117

Browse files
authored
Arm64/SVE: Implement ConvertToInt32 and ConvertToUInt32 for float (#103098)
* 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.
1 parent 9a8c69a commit ced2117

File tree

7 files changed

+474
-40
lines changed

7 files changed

+474
-40
lines changed

src/coreclr/jit/hwintrinsiclistarm64sve.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ HARDWARE_INTRINSIC(Sve, Compute16BitAddresses,
3232
HARDWARE_INTRINSIC(Sve, Compute32BitAddresses, -1, 2, true, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_adr, INS_invalid, INS_sve_adr, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_SpecialCodeGen)
3333
HARDWARE_INTRINSIC(Sve, Compute64BitAddresses, -1, 2, true, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_adr, INS_invalid, INS_sve_adr, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_SpecialCodeGen)
3434
HARDWARE_INTRINSIC(Sve, ConditionalSelect, -1, 3, true, {INS_sve_sel, INS_sve_sel, INS_sve_sel, INS_sve_sel, INS_sve_sel, INS_sve_sel, INS_sve_sel, INS_sve_sel, INS_sve_sel, INS_sve_sel}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_ExplicitMaskedOperation|HW_Flag_SupportsContainment)
35+
HARDWARE_INTRINSIC(Sve, ConvertToInt32, -1, -1, false, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_fcvtzs, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_BaseTypeFromFirstArg|HW_Flag_EmbeddedMaskedOperation|HW_Flag_LowMaskedOperation)
36+
HARDWARE_INTRINSIC(Sve, ConvertToUInt32, -1, -1, false, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_fcvtzu, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_BaseTypeFromFirstArg|HW_Flag_EmbeddedMaskedOperation|HW_Flag_LowMaskedOperation)
3537
HARDWARE_INTRINSIC(Sve, Count16BitElements, 0, 1, false, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_cnth, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Scalar, HW_Flag_Scalable|HW_Flag_HasEnumOperand|HW_Flag_SpecialCodeGen|HW_Flag_NoFloatingPointUsed)
3638
HARDWARE_INTRINSIC(Sve, Count32BitElements, 0, 1, false, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_cntw, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Scalar, HW_Flag_Scalable|HW_Flag_HasEnumOperand|HW_Flag_SpecialCodeGen|HW_Flag_NoFloatingPointUsed)
3739
HARDWARE_INTRINSIC(Sve, Count64BitElements, 0, 1, false, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_cntd, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Scalar, HW_Flag_Scalable|HW_Flag_HasEnumOperand|HW_Flag_SpecialCodeGen|HW_Flag_NoFloatingPointUsed)

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

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -848,6 +848,30 @@ internal Arm64() { }
848848
public static unsafe Vector<double> ConditionalSelect(Vector<double> mask, Vector<double> left, Vector<double> right) { throw new PlatformNotSupportedException(); }
849849

850850

851+
/// ConvertToInt32 : Floating-point convert
852+
853+
/// <summary>
854+
/// svint32_t svcvt_s32[_f32]_m(svint32_t inactive, svbool_t pg, svfloat32_t op)
855+
/// FCVTZS Ztied.S, Pg/M, Zop.S
856+
/// svint32_t svcvt_s32[_f32]_x(svbool_t pg, svfloat32_t op)
857+
/// FCVTZS Ztied.S, Pg/M, Ztied.S
858+
/// svint32_t svcvt_s32[_f32]_z(svbool_t pg, svfloat32_t op)
859+
/// </summary>
860+
public static unsafe Vector<int> ConvertToInt32(Vector<float> value) { throw new PlatformNotSupportedException(); }
861+
862+
863+
/// ConvertToUInt32 : Floating-point convert
864+
865+
/// <summary>
866+
/// svuint32_t svcvt_u32[_f32]_m(svuint32_t inactive, svbool_t pg, svfloat32_t op)
867+
/// FCVTZU Ztied.S, Pg/M, Zop.S
868+
/// svuint32_t svcvt_u32[_f32]_x(svbool_t pg, svfloat32_t op)
869+
/// FCVTZU Ztied.S, Pg/M, Ztied.S
870+
/// svuint32_t svcvt_u32[_f32]_z(svbool_t pg, svfloat32_t op)
871+
/// </summary>
872+
public static unsafe Vector<uint> ConvertToUInt32(Vector<float> value) { throw new PlatformNotSupportedException(); }
873+
874+
851875
/// Count16BitElements : Count the number of 16-bit elements in a vector
852876

853877
/// <summary>

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

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -905,6 +905,30 @@ internal Arm64() { }
905905
public static unsafe Vector<double> ConditionalSelect(Vector<double> mask, Vector<double> left, Vector<double> right) => ConditionalSelect(mask, left, right);
906906

907907

908+
/// ConvertToInt32 : Floating-point convert
909+
910+
/// <summary>
911+
/// svint32_t svcvt_s32[_f32]_m(svint32_t inactive, svbool_t pg, svfloat32_t op)
912+
/// FCVTZS Ztied.S, Pg/M, Zop.S
913+
/// svint32_t svcvt_s32[_f32]_x(svbool_t pg, svfloat32_t op)
914+
/// FCVTZS Ztied.S, Pg/M, Ztied.S
915+
/// svint32_t svcvt_s32[_f32]_z(svbool_t pg, svfloat32_t op)
916+
/// </summary>
917+
public static unsafe Vector<int> ConvertToInt32(Vector<float> value) => ConvertToInt32(value);
918+
919+
920+
/// ConvertToUInt32 : Floating-point convert
921+
922+
/// <summary>
923+
/// svuint32_t svcvt_u32[_f32]_m(svuint32_t inactive, svbool_t pg, svfloat32_t op)
924+
/// FCVTZU Ztied.S, Pg/M, Zop.S
925+
/// svuint32_t svcvt_u32[_f32]_x(svbool_t pg, svfloat32_t op)
926+
/// FCVTZU Ztied.S, Pg/M, Ztied.S
927+
/// svuint32_t svcvt_u32[_f32]_z(svbool_t pg, svfloat32_t op)
928+
/// </summary>
929+
public static unsafe Vector<uint> ConvertToUInt32(Vector<float> value) => ConvertToUInt32(value);
930+
931+
908932
/// Count16BitElements : Count the number of 16-bit elements in a vector
909933

910934
/// <summary>

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4307,11 +4307,14 @@ internal Arm64() { }
43074307
public static System.Numerics.Vector<float> ConditionalSelect(System.Numerics.Vector<float> mask, System.Numerics.Vector<float> left, System.Numerics.Vector<float> right) { throw null; }
43084308
public static System.Numerics.Vector<double> ConditionalSelect(System.Numerics.Vector<double> mask, System.Numerics.Vector<double> left, System.Numerics.Vector<double> right) { throw null; }
43094309

4310+
public static System.Numerics.Vector<int> ConvertToInt32(System.Numerics.Vector<float> value) { throw null; }
4311+
public static System.Numerics.Vector<uint> ConvertToUInt32(System.Numerics.Vector<float> value) { throw null; }
4312+
43104313
public static ulong Count16BitElements([ConstantExpected] SveMaskPattern pattern = SveMaskPattern.All) { throw null; }
43114314
public static ulong Count32BitElements([ConstantExpected] SveMaskPattern pattern = SveMaskPattern.All) { throw null; }
43124315
public static ulong Count64BitElements([ConstantExpected] SveMaskPattern pattern = SveMaskPattern.All) { throw null; }
43134316
public static ulong Count8BitElements([ConstantExpected] SveMaskPattern pattern = SveMaskPattern.All) { throw null; }
4314-
4317+
43154318
public static System.Numerics.Vector<byte> CreateFalseMaskByte() { throw null; }
43164319
public static System.Numerics.Vector<double> CreateFalseMaskDouble() { throw null; }
43174320
public static System.Numerics.Vector<short> CreateFalseMaskInt16() { throw null; }

0 commit comments

Comments
 (0)