Skip to content

[API Proposal]: Arm64: FEAT_SVE: counting #94003

Closed
@a74nh

Description

@a74nh
namespace System.Runtime.Intrinsics.Arm

/// VectorT Summary
public abstract class Sve : AdvSimd /// Feature: FEAT_SVE  Category: counting
{

  public static unsafe ulong Count16BitElements(); // CNTH

  public static unsafe ulong Count16BitElements(enum SveMaskPattern pattern); // CNTH

  public static unsafe ulong Count32BitElements(); // CNTW

  public static unsafe ulong Count32BitElements(enum SveMaskPattern pattern); // CNTW

  public static unsafe ulong Count64BitElements(); // CNTD

  public static unsafe ulong Count64BitElements(enum SveMaskPattern pattern); // CNTD

  public static unsafe ulong Count8BitElements(); // CNTB

  public static unsafe ulong Count8BitElements(enum SveMaskPattern pattern); // CNTB

  /// T: byte, ushort, uint, ulong
  public static unsafe ulong GetActiveElementCount(Vector<T> mask, Vector<T> from); // CNTP

  /// T: [byte, sbyte], [ushort, short], [uint, int], [ulong, long]
  public static unsafe Vector<T> LeadingSignCount(Vector<T2> value); // CLS // predicated, MOVPRFX

  /// T: [byte, sbyte], [ushort, short], [uint, int], [ulong, long]
  public static unsafe Vector<T> LeadingZeroCount(Vector<T2> value); // CLZ // predicated, MOVPRFX

  /// T: byte, ushort, uint, ulong
  public static unsafe Vector<T> LeadingZeroCount(Vector<T> value); // CLZ // predicated, MOVPRFX

  /// T: [uint, float], [ulong, double], [byte, sbyte], [ushort, short], [uint, int], [ulong, long]
  public static unsafe Vector<T> PopCount(Vector<T2> value); // CNT // predicated, MOVPRFX

  /// T: byte, ushort, uint, ulong
  public static unsafe Vector<T> PopCount(Vector<T> value); // CNT // predicated, MOVPRFX

  /// T: byte, ushort, uint, ulong
  public static unsafe int SaturatingDecrementByActiveElementCount(int op, Vector<T> from); // SQDECP

  /// T: byte, ushort, uint, ulong
  public static unsafe long SaturatingDecrementByActiveElementCount(long op, Vector<T> from); // SQDECP

  /// T: byte, ushort, uint, ulong
  public static unsafe uint SaturatingDecrementByActiveElementCount(uint op, Vector<T> from); // UQDECP

  /// T: byte, ushort, uint, ulong
  public static unsafe ulong SaturatingDecrementByActiveElementCount(ulong op, Vector<T> from); // UQDECP

  /// T: short, int, long, ushort, uint, ulong
  public static unsafe Vector<T> SaturatingDecrementByActiveElementCount(Vector<T> op, Vector<T> from); // SQDECP or UQDECP // MOVPRFX

  public static unsafe int SaturatingDecrementByteElementCount(int op, ulong imm_factor); // SQDECB

  public static unsafe long SaturatingDecrementByteElementCount(long op, ulong imm_factor); // SQDECB

  public static unsafe uint SaturatingDecrementByteElementCount(uint op, ulong imm_factor); // UQDECB

  public static unsafe ulong SaturatingDecrementByteElementCount(ulong op, ulong imm_factor); // UQDECB

  public static unsafe int SaturatingDecrementByteElementCount(int op, enum SveMaskPattern pattern, ulong imm_factor); // SQDECB

  public static unsafe long SaturatingDecrementByteElementCount(long op, enum SveMaskPattern pattern, ulong imm_factor); // SQDECB

  public static unsafe uint SaturatingDecrementByteElementCount(uint op, enum SveMaskPattern pattern, ulong imm_factor); // UQDECB

  public static unsafe ulong SaturatingDecrementByteElementCount(ulong op, enum SveMaskPattern pattern, ulong imm_factor); // UQDECB

  public static unsafe int SaturatingDecrementInt16ElementCount(int op, ulong imm_factor); // SQDECH

  public static unsafe long SaturatingDecrementInt16ElementCount(long op, ulong imm_factor); // SQDECH

  public static unsafe uint SaturatingDecrementInt16ElementCount(uint op, ulong imm_factor); // UQDECH

  public static unsafe ulong SaturatingDecrementInt16ElementCount(ulong op, ulong imm_factor); // UQDECH

  public static unsafe int SaturatingDecrementInt16ElementCount(int op, enum SveMaskPattern pattern, ulong imm_factor); // SQDECH

  public static unsafe long SaturatingDecrementInt16ElementCount(long op, enum SveMaskPattern pattern, ulong imm_factor); // SQDECH

  public static unsafe uint SaturatingDecrementInt16ElementCount(uint op, enum SveMaskPattern pattern, ulong imm_factor); // UQDECH

  public static unsafe ulong SaturatingDecrementInt16ElementCount(ulong op, enum SveMaskPattern pattern, ulong imm_factor); // UQDECH

  /// T: short, ushort
  public static unsafe Vector<T> SaturatingDecrementInt16ElementCount(Vector<T> op, ulong imm_factor); // SQDECH or UQDECH // MOVPRFX

  /// T: short, ushort
  public static unsafe Vector<T> SaturatingDecrementInt16ElementCount(Vector<T> op, enum SveMaskPattern pattern, ulong imm_factor); // SQDECH or UQDECH // MOVPRFX

  public static unsafe int SaturatingDecrementInt32ElementCount(int op, ulong imm_factor); // SQDECW

  public static unsafe long SaturatingDecrementInt32ElementCount(long op, ulong imm_factor); // SQDECW

  public static unsafe uint SaturatingDecrementInt32ElementCount(uint op, ulong imm_factor); // UQDECW

  public static unsafe ulong SaturatingDecrementInt32ElementCount(ulong op, ulong imm_factor); // UQDECW

  public static unsafe int SaturatingDecrementInt32ElementCount(int op, enum SveMaskPattern pattern, ulong imm_factor); // SQDECW

  public static unsafe long SaturatingDecrementInt32ElementCount(long op, enum SveMaskPattern pattern, ulong imm_factor); // SQDECW

  public static unsafe uint SaturatingDecrementInt32ElementCount(uint op, enum SveMaskPattern pattern, ulong imm_factor); // UQDECW

  public static unsafe ulong SaturatingDecrementInt32ElementCount(ulong op, enum SveMaskPattern pattern, ulong imm_factor); // UQDECW

  /// T: int, uint
  public static unsafe Vector<T> SaturatingDecrementInt32ElementCount(Vector<T> op, ulong imm_factor); // SQDECW or UQDECW // MOVPRFX

  /// T: int, uint
  public static unsafe Vector<T> SaturatingDecrementInt32ElementCount(Vector<T> op, enum SveMaskPattern pattern, ulong imm_factor); // SQDECW or UQDECW // MOVPRFX

  public static unsafe int SaturatingDecrementInt64ElementCount(int op, ulong imm_factor); // SQDECD

  public static unsafe long SaturatingDecrementInt64ElementCount(long op, ulong imm_factor); // SQDECD

  public static unsafe uint SaturatingDecrementInt64ElementCount(uint op, ulong imm_factor); // UQDECD

  public static unsafe ulong SaturatingDecrementInt64ElementCount(ulong op, ulong imm_factor); // UQDECD

  public static unsafe int SaturatingDecrementInt64ElementCount(int op, enum SveMaskPattern pattern, ulong imm_factor); // SQDECD

  public static unsafe long SaturatingDecrementInt64ElementCount(long op, enum SveMaskPattern pattern, ulong imm_factor); // SQDECD

  public static unsafe uint SaturatingDecrementInt64ElementCount(uint op, enum SveMaskPattern pattern, ulong imm_factor); // UQDECD

  public static unsafe ulong SaturatingDecrementInt64ElementCount(ulong op, enum SveMaskPattern pattern, ulong imm_factor); // UQDECD

  /// T: long, ulong
  public static unsafe Vector<T> SaturatingDecrementInt64ElementCount(Vector<T> op, ulong imm_factor); // SQDECD or UQDECD // MOVPRFX

  /// T: long, ulong
  public static unsafe Vector<T> SaturatingDecrementInt64ElementCount(Vector<T> op, enum SveMaskPattern pattern, ulong imm_factor); // SQDECD or UQDECD // MOVPRFX

  /// T: byte, ushort, uint, ulong
  public static unsafe int SaturatingIncrementByActiveElementCount(int op, Vector<T> from); // SQINCP

  /// T: byte, ushort, uint, ulong
  public static unsafe long SaturatingIncrementByActiveElementCount(long op, Vector<T> from); // SQINCP

  /// T: byte, ushort, uint, ulong
  public static unsafe uint SaturatingIncrementByActiveElementCount(uint op, Vector<T> from); // UQINCP

  /// T: byte, ushort, uint, ulong
  public static unsafe ulong SaturatingIncrementByActiveElementCount(ulong op, Vector<T> from); // UQINCP

  /// T: short, int, long, ushort, uint, ulong
  public static unsafe Vector<T> SaturatingIncrementByActiveElementCount(Vector<T> op, Vector<T> from); // SQINCP or UQINCP // MOVPRFX

  public static unsafe int SaturatingIncrementByteElementCount(int op, ulong imm_factor); // SQINCB

  public static unsafe long SaturatingIncrementByteElementCount(long op, ulong imm_factor); // SQINCB

  public static unsafe uint SaturatingIncrementByteElementCount(uint op, ulong imm_factor); // UQINCB

  public static unsafe ulong SaturatingIncrementByteElementCount(ulong op, ulong imm_factor); // UQINCB

  public static unsafe int SaturatingIncrementByteElementCount(int op, enum SveMaskPattern pattern, ulong imm_factor); // SQINCB

  public static unsafe long SaturatingIncrementByteElementCount(long op, enum SveMaskPattern pattern, ulong imm_factor); // SQINCB

  public static unsafe uint SaturatingIncrementByteElementCount(uint op, enum SveMaskPattern pattern, ulong imm_factor); // UQINCB

  public static unsafe ulong SaturatingIncrementByteElementCount(ulong op, enum SveMaskPattern pattern, ulong imm_factor); // UQINCB

  public static unsafe int SaturatingIncrementInt16ElementCount(int op, ulong imm_factor); // SQINCH

  public static unsafe long SaturatingIncrementInt16ElementCount(long op, ulong imm_factor); // SQINCH

  public static unsafe uint SaturatingIncrementInt16ElementCount(uint op, ulong imm_factor); // UQINCH

  public static unsafe ulong SaturatingIncrementInt16ElementCount(ulong op, ulong imm_factor); // UQINCH

  public static unsafe int SaturatingIncrementInt16ElementCount(int op, enum SveMaskPattern pattern, ulong imm_factor); // SQINCH

  public static unsafe long SaturatingIncrementInt16ElementCount(long op, enum SveMaskPattern pattern, ulong imm_factor); // SQINCH

  public static unsafe uint SaturatingIncrementInt16ElementCount(uint op, enum SveMaskPattern pattern, ulong imm_factor); // UQINCH

  public static unsafe ulong SaturatingIncrementInt16ElementCount(ulong op, enum SveMaskPattern pattern, ulong imm_factor); // UQINCH

  /// T: short, ushort
  public static unsafe Vector<T> SaturatingIncrementInt16ElementCount(Vector<T> op, ulong imm_factor); // SQINCH or UQINCH // MOVPRFX

  /// T: short, ushort
  public static unsafe Vector<T> SaturatingIncrementInt16ElementCount(Vector<T> op, enum SveMaskPattern pattern, ulong imm_factor); // SQINCH or UQINCH // MOVPRFX

  public static unsafe int SaturatingIncrementInt32ElementCount(int op, ulong imm_factor); // SQINCW

  public static unsafe long SaturatingIncrementInt32ElementCount(long op, ulong imm_factor); // SQINCW

  public static unsafe uint SaturatingIncrementInt32ElementCount(uint op, ulong imm_factor); // UQINCW

  public static unsafe ulong SaturatingIncrementInt32ElementCount(ulong op, ulong imm_factor); // UQINCW

  public static unsafe int SaturatingIncrementInt32ElementCount(int op, enum SveMaskPattern pattern, ulong imm_factor); // SQINCW

  public static unsafe long SaturatingIncrementInt32ElementCount(long op, enum SveMaskPattern pattern, ulong imm_factor); // SQINCW

  public static unsafe uint SaturatingIncrementInt32ElementCount(uint op, enum SveMaskPattern pattern, ulong imm_factor); // UQINCW

  public static unsafe ulong SaturatingIncrementInt32ElementCount(ulong op, enum SveMaskPattern pattern, ulong imm_factor); // UQINCW

  /// T: int, uint
  public static unsafe Vector<T> SaturatingIncrementInt32ElementCount(Vector<T> op, ulong imm_factor); // SQINCW or UQINCW // MOVPRFX

  /// T: int, uint
  public static unsafe Vector<T> SaturatingIncrementInt32ElementCount(Vector<T> op, enum SveMaskPattern pattern, ulong imm_factor); // SQINCW or UQINCW // MOVPRFX

  public static unsafe int SaturatingIncrementInt64ElementCount(int op, ulong imm_factor); // SQINCD

  public static unsafe long SaturatingIncrementInt64ElementCount(long op, ulong imm_factor); // SQINCD

  public static unsafe uint SaturatingIncrementInt64ElementCount(uint op, ulong imm_factor); // UQINCD

  public static unsafe ulong SaturatingIncrementInt64ElementCount(ulong op, ulong imm_factor); // UQINCD

  public static unsafe int SaturatingIncrementInt64ElementCount(int op, enum SveMaskPattern pattern, ulong imm_factor); // SQINCD

  public static unsafe long SaturatingIncrementInt64ElementCount(long op, enum SveMaskPattern pattern, ulong imm_factor); // SQINCD

  public static unsafe uint SaturatingIncrementInt64ElementCount(uint op, enum SveMaskPattern pattern, ulong imm_factor); // UQINCD

  public static unsafe ulong SaturatingIncrementInt64ElementCount(ulong op, enum SveMaskPattern pattern, ulong imm_factor); // UQINCD

  /// T: long, ulong
  public static unsafe Vector<T> SaturatingIncrementInt64ElementCount(Vector<T> op, ulong imm_factor); // SQINCD or UQINCD // MOVPRFX

  /// T: long, ulong
  public static unsafe Vector<T> SaturatingIncrementInt64ElementCount(Vector<T> op, enum SveMaskPattern pattern, ulong imm_factor); // SQINCD or UQINCD // MOVPRFX


  // All patterns used by PTRUE.
  enum SveMaskPattern
  {
    SV_POW2 = 0,   // The largest power of 2.
    SV_VL1 = 1,    // 1 element.
    SV_VL2 = 2,    // 2 elements.
    SV_VL3 = 3,    // 3 elements.
    SV_VL4 = 4,    // 4 elements.
    SV_VL5 = 5,    // 5 elements.
    SV_VL6 = 6,    // 6 elements.
    SV_VL7 = 7,    // 7 elements.
    SV_VL8 = 8,    // 8 elements.
    SV_VL16 = 9,   // 16 elements.
    SV_VL32 = 10,  // 32 elements.
    SV_VL64 = 11,  // 64 elements.
    SV_VL128 = 12, // 128 elements.
    SV_VL256 = 13, // 256 elements.
    SV_MUL4 = 29,  // The largest multiple of 3.
    SV_MUL3 = 30,  // The largest multiple of 4.
    SV_ALL = 31    // All available (implicitly a multiple of two).
  };

  /// total method signatures: 100

}

Details

CountNBitElements(enum SveMaskPattern pattern)
Set scalar to multiple of predicate constraint element count
Determines the number of active elements implied by pattern, multiplies that by an immediate in the range 1 to 16 inclusive, and then places the result in the scalar destination.

Pattern limits the number of active elements in a single predicate to:

  • A fixed number (VL1 to VL256)
  • The largest power of two (POW2)
  • The largest multiple of three or four (MUL3 or MUL4)
  • All available, implicitly a multiple of two (ALL).

CountNBitElements()
Identical to: CountNBitElements(SV_ALL)

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions