Skip to content

Commit fd5a2d5

Browse files
committed
Expose the rest of embedded rounding APIs
1 parent d0c805c commit fd5a2d5

File tree

10 files changed

+222
-39
lines changed

10 files changed

+222
-39
lines changed

src/coreclr/jit/gentree.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26498,6 +26498,7 @@ bool GenTreeHWIntrinsic::OperIsEmbRoundingEnabled() const
2649826498
case NI_AVX512F_Subtract:
2649926499

2650026500
case NI_AVX512F_Scale:
26501+
case NI_AVX512F_ScaleScalar:
2650126502

2650226503
case NI_AVX512F_ConvertScalarToVector128Single:
2650326504
#if defined(TARGET_AMD64)
@@ -26521,9 +26522,14 @@ bool GenTreeHWIntrinsic::OperIsEmbRoundingEnabled() const
2652126522
case NI_AVX512F_X64_ConvertToInt64:
2652226523
case NI_AVX512F_X64_ConvertToUInt64:
2652326524
#endif // TARGET_AMD64
26525+
case NI_AVX512DQ_ConvertToVector256Single:
26526+
case NI_AVX512DQ_ConvertToVector512Double:
26527+
case NI_AVX512DQ_ConvertToVector512Int64:
26528+
case NI_AVX512DQ_ConvertToVector512UInt64:
2652426529
{
2652526530
return numArgs == 2;
2652626531
}
26532+
2652726533
default:
2652826534
unreached();
2652926535
}

src/coreclr/jit/hwintrinsiclistxarch.h

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -941,8 +941,8 @@ HARDWARE_INTRINSIC(AVX512F, RotateRight,
941941
HARDWARE_INTRINSIC(AVX512F, RotateRightVariable, 64, 2, true, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_vprorvd, INS_vprorvd, INS_vprorvq, INS_vprorvq, INS_invalid, INS_invalid}, HW_Category_SimpleSIMD, HW_Flag_NoFlag)
942942
HARDWARE_INTRINSIC(AVX512F, RoundScale, 64, 2, true, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_vrndscaleps, INS_vrndscalepd}, HW_Category_IMM, HW_Flag_FullRangeIMM)
943943
HARDWARE_INTRINSIC(AVX512F, RoundScaleScalar, 16, -1, false, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_vrndscaless, INS_vrndscalesd}, HW_Category_IMM, HW_Flag_FullRangeIMM|HW_Flag_CopyUpperBits)
944-
HARDWARE_INTRINSIC(AVX512F, Scale, 64, 2, true, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_vscalefps, INS_vscalefpd}, HW_Category_SimpleSIMD, HW_Flag_EmbRoundingCompatible)
945-
HARDWARE_INTRINSIC(AVX512F, ScaleScalar, 16, 2, true, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_vscalefss, INS_vscalefsd}, HW_Category_SimpleSIMD, HW_Flag_CopyUpperBits)
944+
HARDWARE_INTRINSIC(AVX512F, Scale, 64, -1, false, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_vscalefps, INS_vscalefpd}, HW_Category_SimpleSIMD, HW_Flag_EmbRoundingCompatible)
945+
HARDWARE_INTRINSIC(AVX512F, ScaleScalar, 16, -1, false, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_vscalefss, INS_vscalefsd}, HW_Category_SIMDScalar, HW_Flag_CopyUpperBits|HW_Flag_EmbRoundingCompatible)
946946
HARDWARE_INTRINSIC(AVX512F, ShiftLeftLogical, 64, 2, true, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_pslld, INS_pslld, INS_psllq, INS_psllq, INS_invalid, INS_invalid}, HW_Category_IMM, HW_Flag_MaybeIMM|HW_Flag_NoJmpTableIMM|HW_Flag_FullRangeIMM)
947947
HARDWARE_INTRINSIC(AVX512F, ShiftLeftLogicalVariable, 64, 2, true, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_vpsllvd, INS_vpsllvd, INS_vpsllvq, INS_vpsllvq, INS_invalid, INS_invalid}, HW_Category_SimpleSIMD, HW_Flag_EmbBroadcastCompatible)
948948
HARDWARE_INTRINSIC(AVX512F, ShiftRightArithmetic, 64, 2, true, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_psrad, INS_invalid, INS_vpsraq, INS_invalid, INS_invalid, INS_invalid}, HW_Category_IMM, HW_Flag_MaybeIMM|HW_Flag_NoJmpTableIMM|HW_Flag_FullRangeIMM)
@@ -1132,11 +1132,11 @@ HARDWARE_INTRINSIC(AVX512DQ, AndNot,
11321132
HARDWARE_INTRINSIC(AVX512DQ, BroadcastPairScalarToVector512, 64, 1, true, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_vbroadcasti32x2, INS_vbroadcasti32x2, INS_invalid, INS_invalid, INS_vbroadcastf32x2, INS_invalid}, HW_Category_SimpleSIMD, HW_Flag_NoFlag)
11331133
HARDWARE_INTRINSIC(AVX512DQ, BroadcastVector128ToVector512, 64, 1, true, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_vbroadcasti64x2, INS_vbroadcasti64x2, INS_invalid, INS_vbroadcastf64x2}, HW_Category_MemoryLoad, HW_Flag_NoFlag)
11341134
HARDWARE_INTRINSIC(AVX512DQ, BroadcastVector256ToVector512, 64, 1, true, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_vbroadcasti32x8, INS_vbroadcasti32x8, INS_invalid, INS_invalid, INS_vbroadcastf32x8, INS_invalid}, HW_Category_MemoryLoad, HW_Flag_NoFlag)
1135-
HARDWARE_INTRINSIC(AVX512DQ, ConvertToVector256Single, 64, 1, true, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_vcvtqq2ps, INS_vcvtuqq2ps, INS_invalid, INS_invalid}, HW_Category_SimpleSIMD, HW_Flag_BaseTypeFromFirstArg)
1136-
HARDWARE_INTRINSIC(AVX512DQ, ConvertToVector512Double, 64, 1, true, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_vcvtqq2pd, INS_vcvtuqq2pd, INS_invalid, INS_invalid}, HW_Category_SimpleSIMD, HW_Flag_BaseTypeFromFirstArg)
1137-
HARDWARE_INTRINSIC(AVX512DQ, ConvertToVector512Int64, 64, 1, true, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_vcvtps2qq, INS_vcvtpd2qq}, HW_Category_SimpleSIMD, HW_Flag_BaseTypeFromFirstArg)
1135+
HARDWARE_INTRINSIC(AVX512DQ, ConvertToVector256Single, 64, -1, false, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_vcvtqq2ps, INS_vcvtuqq2ps, INS_invalid, INS_invalid}, HW_Category_SimpleSIMD, HW_Flag_BaseTypeFromFirstArg|HW_Flag_EmbRoundingCompatible)
1136+
HARDWARE_INTRINSIC(AVX512DQ, ConvertToVector512Double, 64, -1, false, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_vcvtqq2pd, INS_vcvtuqq2pd, INS_invalid, INS_invalid}, HW_Category_SimpleSIMD, HW_Flag_BaseTypeFromFirstArg|HW_Flag_EmbRoundingCompatible)
1137+
HARDWARE_INTRINSIC(AVX512DQ, ConvertToVector512Int64, 64, -1, false, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_vcvtps2qq, INS_vcvtpd2qq}, HW_Category_SimpleSIMD, HW_Flag_BaseTypeFromFirstArg|HW_Flag_EmbRoundingCompatible)
11381138
HARDWARE_INTRINSIC(AVX512DQ, ConvertToVector512Int64WithTruncation, 64, 1, true, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_vcvttps2qq, INS_vcvttpd2qq}, HW_Category_SimpleSIMD, HW_Flag_BaseTypeFromFirstArg)
1139-
HARDWARE_INTRINSIC(AVX512DQ, ConvertToVector512UInt64, 64, 1, true, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_vcvtps2uqq, INS_vcvtpd2uqq}, HW_Category_SimpleSIMD, HW_Flag_BaseTypeFromFirstArg)
1139+
HARDWARE_INTRINSIC(AVX512DQ, ConvertToVector512UInt64, 64, -1, false, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_vcvtps2uqq, INS_vcvtpd2uqq}, HW_Category_SimpleSIMD, HW_Flag_BaseTypeFromFirstArg|HW_Flag_EmbRoundingCompatible)
11401140
HARDWARE_INTRINSIC(AVX512DQ, ConvertToVector512UInt64WithTruncation, 64, 1, true, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_vcvttps2uqq, INS_vcvttpd2uqq}, HW_Category_SimpleSIMD, HW_Flag_BaseTypeFromFirstArg)
11411141
HARDWARE_INTRINSIC(AVX512DQ, ExtractVector128, 64, 2, true, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_vextracti64x2, INS_vextracti64x2, INS_invalid, INS_vextractf64x2}, HW_Category_IMM, HW_Flag_FullRangeIMM)
11421142
HARDWARE_INTRINSIC(AVX512DQ, ExtractVector256, 64, 2, true, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_vextracti32x8, INS_vextracti32x8, INS_invalid, INS_invalid, INS_vextractf32x8, INS_invalid}, HW_Category_IMM, HW_Flag_FullRangeIMM)

src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/X86/Avx512DQ.PlatformNotSupported.cs

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -322,7 +322,16 @@ internal X64() { }
322322
/// VCVTUQQ2PS ymm1 {k1}{z}, zmm2/m512/m64bcst
323323
/// </summary>
324324
public static Vector256<float> ConvertToVector256Single(Vector512<ulong> value) { throw new PlatformNotSupportedException(); }
325-
325+
/// <summary>
326+
/// __m256 _mm512_cvt_roundepi64_ps (__m512i a, int r)
327+
/// VCVTQQ2PS ymm1, zmm2 {er}
328+
/// </summary>
329+
public static Vector256<float> ConvertToVector256Single(Vector512<long> value, [ConstantExpected(Max = FloatRoundingMode.ToZero)] FloatRoundingMode mode) { throw new PlatformNotSupportedException(); }
330+
/// <summary>
331+
/// __m256 _mm512_cvt_roundepu64_ps (__m512i a, int r)
332+
/// VCVTUQQ2PS ymm1, zmm2 {er}
333+
/// </summary>
334+
public static Vector256<float> ConvertToVector256Single(Vector512<ulong> value, [ConstantExpected(Max = FloatRoundingMode.ToZero)] FloatRoundingMode mode) { throw new PlatformNotSupportedException(); }
326335
/// <summary>
327336
/// __m512d _mm512_cvtepi64_pd (__m512i a)
328337
/// VCVTQQ2PD zmm1 {k1}{z}, zmm2/m512/m64bcst
@@ -334,6 +343,16 @@ internal X64() { }
334343
/// </summary>
335344
public static Vector512<double> ConvertToVector512Double(Vector512<ulong> value) { throw new PlatformNotSupportedException(); }
336345
/// <summary>
346+
/// __m512d _mm512_cvt_roundepi64_pd (__m512i a, int r)
347+
/// VCVTQQ2PD zmm1, zmm2 {er}
348+
/// </summary>
349+
public static Vector512<double> ConvertToVector512Double(Vector512<long> value, [ConstantExpected(Max = FloatRoundingMode.ToZero)] FloatRoundingMode mode) { throw new PlatformNotSupportedException(); }
350+
/// <summary>
351+
/// __m512d _mm512_cvt_roundepu64_pd (__m512i a, int r)
352+
/// VCVTUQQ2PD zmm1, zmm2 {er}
353+
/// </summary>
354+
public static Vector512<double> ConvertToVector512Double(Vector512<ulong> value, [ConstantExpected(Max = FloatRoundingMode.ToZero)] FloatRoundingMode mode) { throw new PlatformNotSupportedException(); }
355+
/// <summary>
337356
/// __m512i _mm512_cvtps_epi64 (__m512 a)
338357
/// VCVTPS2QQ zmm1 {k1}{z}, ymm2/m256/m32bcst{er}
339358
/// </summary>
@@ -344,6 +363,16 @@ internal X64() { }
344363
/// </summary>
345364
public static Vector512<long> ConvertToVector512Int64(Vector512<double> value) { throw new PlatformNotSupportedException(); }
346365
/// <summary>
366+
/// __m512i _mm512_cvt_roundps_epi64 (__m512 a, int r)
367+
/// VCVTPS2QQ zmm1, ymm2 {er}
368+
/// </summary>
369+
public static Vector512<long> ConvertToVector512Int64(Vector256<float> value, [ConstantExpected(Max = FloatRoundingMode.ToZero)] FloatRoundingMode mode) { throw new PlatformNotSupportedException(); }
370+
/// <summary>
371+
/// __m512i _mm512_cvt_roundpd_epi64 (__m512d a, int r)
372+
/// VCVTPD2QQ zmm1, zmm2 {er}
373+
/// </summary>
374+
public static Vector512<long> ConvertToVector512Int64(Vector512<double> value, [ConstantExpected(Max = FloatRoundingMode.ToZero)] FloatRoundingMode mode) { throw new PlatformNotSupportedException(); }
375+
/// <summary>
347376
/// __m512i _mm512_cvttps_epi64 (__m512 a)
348377
/// VCVTTPS2QQ zmm1 {k1}{z}, ymm2/m256/m32bcst{er}
349378
/// </summary>
@@ -364,6 +393,16 @@ internal X64() { }
364393
/// </summary>
365394
public static Vector512<ulong> ConvertToVector512UInt64(Vector512<double> value) { throw new PlatformNotSupportedException(); }
366395
/// <summary>
396+
/// __m512i _mm512_cvt_roundps_epu64 (__m512 a, int r)
397+
/// VCVTPS2UQQ zmm1 {k1}{z}, ymm2/m256/m32bcst{er}
398+
/// </summary>
399+
public static Vector512<ulong> ConvertToVector512UInt64(Vector256<float> value, [ConstantExpected(Max = FloatRoundingMode.ToZero)] FloatRoundingMode mode) { throw new PlatformNotSupportedException(); }
400+
/// <summary>
401+
/// __m512i _mm512_cvt_roundpd_epu64 (__m512d a, int r)
402+
/// VCVTPD2UQQ zmm1 {k1}{z}, zmm2/m512/m64bcst{er}
403+
/// </summary>
404+
public static Vector512<ulong> ConvertToVector512UInt64(Vector512<double> value, [ConstantExpected(Max = FloatRoundingMode.ToZero)] FloatRoundingMode mode) { throw new PlatformNotSupportedException(); }
405+
/// <summary>
367406
/// __m512i _mm512_cvttps_epu64 (__m512 a)
368407
/// VCVTTPS2UQQ zmm1 {k1}{z}, ymm2/m256/m32bcst{er}
369408
/// </summary>

src/libraries/System.Private.CoreLib/src/System/Runtime/Intrinsics/X86/Avx512DQ.cs

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -323,6 +323,16 @@ internal X64() { }
323323
/// VCVTUQQ2PS ymm1 {k1}{z}, zmm2/m512/m64bcst
324324
/// </summary>
325325
public static Vector256<float> ConvertToVector256Single(Vector512<ulong> value) => ConvertToVector256Single(value);
326+
/// <summary>
327+
/// __m256 _mm512_cvt_roundepi64_ps (__m512i a, int r)
328+
/// VCVTQQ2PS ymm1, zmm2 {er}
329+
/// </summary>
330+
public static Vector256<float> ConvertToVector256Single(Vector512<long> value, [ConstantExpected(Max = FloatRoundingMode.ToZero)] FloatRoundingMode mode) => ConvertToVector256Single(value, mode);
331+
/// <summary>
332+
/// __m256 _mm512_cvt_roundepu64_ps (__m512i a, int r)
333+
/// VCVTUQQ2PS ymm1, zmm2 {er}
334+
/// </summary>
335+
public static Vector256<float> ConvertToVector256Single(Vector512<ulong> value, [ConstantExpected(Max = FloatRoundingMode.ToZero)] FloatRoundingMode mode) => ConvertToVector256Single(value, mode);
326336

327337
/// <summary>
328338
/// __m512d _mm512_cvtepi64_pd (__m512i a)
@@ -334,6 +344,17 @@ internal X64() { }
334344
/// VCVTUQQ2PD zmm1 {k1}{z}, zmm2/m512/m64bcst
335345
/// </summary>
336346
public static Vector512<double> ConvertToVector512Double(Vector512<ulong> value) => ConvertToVector512Double(value);
347+
/// <summary>
348+
/// __m512d _mm512_cvt_roundepi64_pd (__m512i a, int r)
349+
/// VCVTQQ2PD zmm1, zmm2 {er}
350+
/// </summary>
351+
public static Vector512<double> ConvertToVector512Double(Vector512<long> value, [ConstantExpected(Max = FloatRoundingMode.ToZero)] FloatRoundingMode mode) => ConvertToVector512Double(value, mode);
352+
/// <summary>
353+
/// __m512d _mm512_cvt_roundepu64_pd (__m512i a, int r)
354+
/// VCVTUQQ2PD zmm1, zmm2 {er}
355+
/// </summary>
356+
public static Vector512<double> ConvertToVector512Double(Vector512<ulong> value, [ConstantExpected(Max = FloatRoundingMode.ToZero)] FloatRoundingMode mode) => ConvertToVector512Double(value, mode);
357+
337358
/// <summary>
338359
/// __m512i _mm512_cvtps_epi64 (__m512 a)
339360
/// VCVTPS2QQ zmm1 {k1}{z}, ymm2/m256/m32bcst{er}
@@ -344,6 +365,17 @@ internal X64() { }
344365
/// VCVTPD2QQ zmm1 {k1}{z}, zmm2/m512/m64bcst{er}
345366
/// </summary>
346367
public static Vector512<long> ConvertToVector512Int64(Vector512<double> value) => ConvertToVector512Int64(value);
368+
/// <summary>
369+
/// __m512i _mm512_cvt_roundps_epi64 (__m512 a, int r)
370+
/// VCVTPS2QQ zmm1, ymm2 {er}
371+
/// </summary>
372+
public static Vector512<long> ConvertToVector512Int64(Vector256<float> value, [ConstantExpected(Max = FloatRoundingMode.ToZero)] FloatRoundingMode mode) => ConvertToVector512Int64(value, mode);
373+
/// <summary>
374+
/// __m512i _mm512_cvt_roundpd_epi64 (__m512d a, int r)
375+
/// VCVTPD2QQ zmm1, zmm2 {er}
376+
/// </summary>
377+
public static Vector512<long> ConvertToVector512Int64(Vector512<double> value, [ConstantExpected(Max = FloatRoundingMode.ToZero)] FloatRoundingMode mode) => ConvertToVector512Int64(value, mode);
378+
347379
/// <summary>
348380
/// __m512i _mm512_cvttps_epi64 (__m512 a)
349381
/// VCVTTPS2QQ zmm1 {k1}{z}, ymm2/m256/m32bcst{er}
@@ -365,6 +397,16 @@ internal X64() { }
365397
/// </summary>
366398
public static Vector512<ulong> ConvertToVector512UInt64(Vector512<double> value) => ConvertToVector512UInt64(value);
367399
/// <summary>
400+
/// __m512i _mm512_cvt_roundps_epu64 (__m512 a, int r)
401+
/// VCVTPS2UQQ zmm1 {k1}{z}, ymm2/m256/m32bcst{er}
402+
/// </summary>
403+
public static Vector512<ulong> ConvertToVector512UInt64(Vector256<float> value, [ConstantExpected(Max = FloatRoundingMode.ToZero)] FloatRoundingMode mode) => ConvertToVector512UInt64(value, mode);
404+
/// <summary>
405+
/// __m512i _mm512_cvt_roundpd_epu64 (__m512d a, int r)
406+
/// VCVTPD2UQQ zmm1 {k1}{z}, zmm2/m512/m64bcst{er}
407+
/// </summary>
408+
public static Vector512<ulong> ConvertToVector512UInt64(Vector512<double> value, [ConstantExpected(Max = FloatRoundingMode.ToZero)] FloatRoundingMode mode) => ConvertToVector512UInt64(value, mode);
409+
/// <summary>
368410
/// __m512i _mm512_cvttps_epu64 (__m512 a)
369411
/// VCVTTPS2UQQ zmm1 {k1}{z}, ymm2/m256/m32bcst{er}
370412
/// </summary>

0 commit comments

Comments
 (0)