Skip to content

Commit bed87f8

Browse files
authored
JIT ARM64-SVE: Add Sve.CreateFalseMask*() (#102076)
* JIT ARM64-SVE: Add Sve.CreateFalseMask*() Also added tests for Sve.CreateTrueMask*() * Remove code copied from the Arm manual. * Remove LargestVectorSize from CreateFalseMask* template parameters * Fix documentation comments for CreateFalseMask*() * Improve code readability by operating byte-sized elements. * Enable reflection scenario tests
1 parent 78c8cb9 commit bed87f8

File tree

8 files changed

+568
-0
lines changed

8 files changed

+568
-0
lines changed

src/coreclr/jit/hwintrinsiccodegenarm64.cpp

+3
Original file line numberDiff line numberDiff line change
@@ -738,6 +738,9 @@ void CodeGen::genHWIntrinsic(GenTreeHWIntrinsic* node)
738738

739739
switch (intrin.numOperands)
740740
{
741+
case 0:
742+
GetEmitter()->emitIns_R(ins, emitSize, targetReg, opt);
743+
break;
741744
case 1:
742745
GetEmitter()->emitIns_R_R(ins, emitSize, targetReg, op1Reg, opt);
743746
break;

src/coreclr/jit/hwintrinsiclistarm64sve.h

+10
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,16 @@ HARDWARE_INTRINSIC(Sve, Count16BitElements,
2929
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)
3030
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)
3131
HARDWARE_INTRINSIC(Sve, Count8BitElements, 0, 1, false, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_cntb, INS_invalid, INS_invalid, INS_invalid}, HW_Category_Scalar, HW_Flag_Scalable|HW_Flag_HasEnumOperand|HW_Flag_SpecialCodeGen|HW_Flag_NoFloatingPointUsed)
32+
HARDWARE_INTRINSIC(Sve, CreateFalseMaskByte, -1, 0, false, {INS_invalid, INS_sve_pfalse, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_ReturnsPerElementMask)
33+
HARDWARE_INTRINSIC(Sve, CreateFalseMaskDouble, -1, 0, false, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_pfalse}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_ReturnsPerElementMask)
34+
HARDWARE_INTRINSIC(Sve, CreateFalseMaskInt16, -1, 0, false, {INS_invalid, INS_invalid, INS_sve_pfalse, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_ReturnsPerElementMask)
35+
HARDWARE_INTRINSIC(Sve, CreateFalseMaskInt32, -1, 0, false, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_pfalse, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_ReturnsPerElementMask)
36+
HARDWARE_INTRINSIC(Sve, CreateFalseMaskInt64, -1, 0, false, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_pfalse, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_ReturnsPerElementMask)
37+
HARDWARE_INTRINSIC(Sve, CreateFalseMaskSByte, -1, 0, false, {INS_sve_pfalse, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_ReturnsPerElementMask)
38+
HARDWARE_INTRINSIC(Sve, CreateFalseMaskSingle, -1, 0, false, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_pfalse, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_ReturnsPerElementMask)
39+
HARDWARE_INTRINSIC(Sve, CreateFalseMaskUInt16, -1, 0, false, {INS_invalid, INS_invalid, INS_invalid, INS_sve_pfalse, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_ReturnsPerElementMask)
40+
HARDWARE_INTRINSIC(Sve, CreateFalseMaskUInt32, -1, 0, false, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_pfalse, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_ReturnsPerElementMask)
41+
HARDWARE_INTRINSIC(Sve, CreateFalseMaskUInt64, -1, 0, false, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_pfalse, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_ReturnsPerElementMask)
3242
HARDWARE_INTRINSIC(Sve, CreateTrueMaskByte, -1, 1, false, {INS_invalid, INS_sve_ptrue, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_HasEnumOperand|HW_Flag_ReturnsPerElementMask)
3343
HARDWARE_INTRINSIC(Sve, CreateTrueMaskDouble, -1, 1, false, {INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_sve_ptrue}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_HasEnumOperand|HW_Flag_ReturnsPerElementMask)
3444
HARDWARE_INTRINSIC(Sve, CreateTrueMaskInt16, -1, 1, false, {INS_invalid, INS_invalid, INS_sve_ptrue, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid, INS_invalid}, HW_Category_SIMD, HW_Flag_Scalable|HW_Flag_HasEnumOperand|HW_Flag_ReturnsPerElementMask)

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

+90
Original file line numberDiff line numberDiff line change
@@ -608,6 +608,96 @@ internal Arm64() { }
608608
public static unsafe ulong Count8BitElements([ConstantExpected] SveMaskPattern pattern = SveMaskPattern.All) { throw new PlatformNotSupportedException(); }
609609

610610

611+
/// Set all predicate elements to false
612+
613+
/// <summary>
614+
/// svbool_t svpfalse[_b]()
615+
/// PFALSE Presult.B
616+
/// </summary>
617+
public static unsafe Vector<byte> CreateFalseMaskByte() { throw new PlatformNotSupportedException(); }
618+
619+
620+
/// Set all predicate elements to false
621+
622+
/// <summary>
623+
/// svbool_t svpfalse[_b]()
624+
/// PFALSE Presult.B
625+
/// </summary>
626+
public static unsafe Vector<double> CreateFalseMaskDouble() { throw new PlatformNotSupportedException(); }
627+
628+
629+
/// Set all predicate elements to false
630+
631+
/// <summary>
632+
/// svbool_t svpfalse[_b]()
633+
/// PFALSE Presult.B
634+
/// </summary>
635+
public static unsafe Vector<short> CreateFalseMaskInt16() { throw new PlatformNotSupportedException(); }
636+
637+
638+
/// Set all predicate elements to false
639+
640+
/// <summary>
641+
/// svbool_t svpfalse[_b]()
642+
/// PFALSE Presult.B
643+
/// </summary>
644+
public static unsafe Vector<int> CreateFalseMaskInt32() { throw new PlatformNotSupportedException(); }
645+
646+
647+
/// Set all predicate elements to false
648+
649+
/// <summary>
650+
/// svbool_t svpfalse[_b]()
651+
/// PFALSE Presult.B
652+
/// </summary>
653+
public static unsafe Vector<long> CreateFalseMaskInt64() { throw new PlatformNotSupportedException(); }
654+
655+
656+
/// Set all predicate elements to false
657+
658+
/// <summary>
659+
/// svbool_t svpfalse[_b]()
660+
/// PFALSE Presult.B
661+
/// </summary>
662+
public static unsafe Vector<sbyte> CreateFalseMaskSByte() { throw new PlatformNotSupportedException(); }
663+
664+
665+
/// Set all predicate elements to false
666+
667+
/// <summary>
668+
/// svbool_t svpfalse[_b]()
669+
/// PFALSE Presult.B
670+
/// </summary>
671+
public static unsafe Vector<float> CreateFalseMaskSingle() { throw new PlatformNotSupportedException(); }
672+
673+
674+
/// Set all predicate elements to false
675+
676+
/// <summary>
677+
/// svbool_t svpfalse[_b]()
678+
/// PFALSE Presult.B
679+
/// </summary>
680+
public static unsafe Vector<ushort> CreateFalseMaskUInt16() { throw new PlatformNotSupportedException(); }
681+
682+
683+
/// Set all predicate elements to false
684+
685+
/// <summary>
686+
/// svbool_t svpfalse[_b]()
687+
/// PFALSE Presult.B
688+
/// </summary>
689+
public static unsafe Vector<uint> CreateFalseMaskUInt32() { throw new PlatformNotSupportedException(); }
690+
691+
692+
/// Set all predicate elements to false
693+
694+
/// <summary>
695+
/// svbool_t svpfalse[_b]()
696+
/// PFALSE Presult.B
697+
/// </summary>
698+
public static unsafe Vector<ulong> CreateFalseMaskUInt64() { throw new PlatformNotSupportedException(); }
699+
700+
611701
/// CreateTrueMaskByte : Set predicate elements to true
612702

613703
/// <summary>

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

+90
Original file line numberDiff line numberDiff line change
@@ -665,6 +665,96 @@ internal Arm64() { }
665665
public static unsafe ulong Count8BitElements([ConstantExpected] SveMaskPattern pattern = SveMaskPattern.All) => Count8BitElements(pattern);
666666

667667

668+
/// Set all predicate elements to false
669+
670+
/// <summary>
671+
/// svbool_t svpfalse[_b]()
672+
/// PFALSE Presult.B
673+
/// </summary>
674+
public static unsafe Vector<byte> CreateFalseMaskByte() => CreateFalseMaskByte();
675+
676+
677+
/// Set all predicate elements to false
678+
679+
/// <summary>
680+
/// svbool_t svpfalse[_b]()
681+
/// PFALSE Presult.B
682+
/// </summary>
683+
public static unsafe Vector<double> CreateFalseMaskDouble() => CreateFalseMaskDouble();
684+
685+
686+
/// Set all predicate elements to false
687+
688+
/// <summary>
689+
/// svbool_t svpfalse[_b]()
690+
/// PFALSE Presult.B
691+
/// </summary>
692+
public static unsafe Vector<short> CreateFalseMaskInt16() => CreateFalseMaskInt16();
693+
694+
695+
/// Set all predicate elements to false
696+
697+
/// <summary>
698+
/// svbool_t svpfalse[_b]()
699+
/// PFALSE Presult.B
700+
/// </summary>
701+
public static unsafe Vector<int> CreateFalseMaskInt32() => CreateFalseMaskInt32();
702+
703+
704+
/// Set all predicate elements to false
705+
706+
/// <summary>
707+
/// svbool_t svpfalse[_b]()
708+
/// PFALSE Presult.B
709+
/// </summary>
710+
public static unsafe Vector<long> CreateFalseMaskInt64() => CreateFalseMaskInt64();
711+
712+
713+
/// Set all predicate elements to false
714+
715+
/// <summary>
716+
/// svbool_t svpfalse[_b]()
717+
/// PFALSE Presult.B
718+
/// </summary>
719+
public static unsafe Vector<sbyte> CreateFalseMaskSByte() => CreateFalseMaskSByte();
720+
721+
722+
/// Set all predicate elements to false
723+
724+
/// <summary>
725+
/// svbool_t svpfalse[_b]()
726+
/// PFALSE Presult.B
727+
/// </summary>
728+
public static unsafe Vector<float> CreateFalseMaskSingle() => CreateFalseMaskSingle();
729+
730+
731+
/// Set all predicate elements to false
732+
733+
/// <summary>
734+
/// svbool_t svpfalse[_b]()
735+
/// PFALSE Presult.B
736+
/// </summary>
737+
public static unsafe Vector<ushort> CreateFalseMaskUInt16() => CreateFalseMaskUInt16();
738+
739+
740+
/// Set all predicate elements to false
741+
742+
/// <summary>
743+
/// svbool_t svpfalse[_b]()
744+
/// PFALSE Presult.B
745+
/// </summary>
746+
public static unsafe Vector<uint> CreateFalseMaskUInt32() => CreateFalseMaskUInt32();
747+
748+
749+
/// Set all predicate elements to false
750+
751+
/// <summary>
752+
/// svbool_t svpfalse[_b]()
753+
/// PFALSE Presult.B
754+
/// </summary>
755+
public static unsafe Vector<ulong> CreateFalseMaskUInt64() => CreateFalseMaskUInt64();
756+
757+
668758
/// CreateTrueMaskByte : Set predicate elements to true
669759

670760
/// <summary>

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

+10
Original file line numberDiff line numberDiff line change
@@ -4247,6 +4247,16 @@ internal Arm64() { }
42474247
public static System.Numerics.Vector<ulong> ConditionalSelect(System.Numerics.Vector<ulong> mask, System.Numerics.Vector<ulong> left, System.Numerics.Vector<ulong> right) { throw null; }
42484248
public static System.Numerics.Vector<float> ConditionalSelect(System.Numerics.Vector<float> mask, System.Numerics.Vector<float> left, System.Numerics.Vector<float> right) { throw null; }
42494249
public static System.Numerics.Vector<double> ConditionalSelect(System.Numerics.Vector<double> mask, System.Numerics.Vector<double> left, System.Numerics.Vector<double> right) { throw null; }
4250+
public static System.Numerics.Vector<byte> CreateFalseMaskByte() { throw null; }
4251+
public static System.Numerics.Vector<double> CreateFalseMaskDouble() { throw null; }
4252+
public static System.Numerics.Vector<short> CreateFalseMaskInt16() { throw null; }
4253+
public static System.Numerics.Vector<int> CreateFalseMaskInt32() { throw null; }
4254+
public static System.Numerics.Vector<long> CreateFalseMaskInt64() { throw null; }
4255+
public static System.Numerics.Vector<sbyte> CreateFalseMaskSByte() { throw null; }
4256+
public static System.Numerics.Vector<float> CreateFalseMaskSingle() { throw null; }
4257+
public static System.Numerics.Vector<ushort> CreateFalseMaskUInt16() { throw null; }
4258+
public static System.Numerics.Vector<uint> CreateFalseMaskUInt32() { throw null; }
4259+
public static System.Numerics.Vector<ulong> CreateFalseMaskUInt64() { throw null; }
42504260
public static System.Numerics.Vector<byte> CreateTrueMaskByte([ConstantExpected] SveMaskPattern pattern = SveMaskPattern.All) { throw null; }
42514261
public static System.Numerics.Vector<double> CreateTrueMaskDouble([ConstantExpected] SveMaskPattern pattern = SveMaskPattern.All) { throw null; }
42524262
public static System.Numerics.Vector<short> CreateTrueMaskInt16([ConstantExpected] SveMaskPattern pattern = SveMaskPattern.All) { throw null; }

0 commit comments

Comments
 (0)