Skip to content

[API Proposal]: Arm64: FEAT_SVE: gather loads #94007

Closed
@a74nh

Description

@a74nh
namespace System.Runtime.Intrinsics.Arm;

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

  /// T: [byte, uint], [byte, ulong]
  public static unsafe void GatherPrefetchBytes(Vector<T> mask, Vector<T2> bases, [ConstantExpected] SvePrefetchType op); // PRFB

  /// T: [byte, int], [byte, uint], [byte, long], [byte, ulong]
  public static unsafe void GatherPrefetchBytes(Vector<T> mask, void* base, Vector<T2> offsets, [ConstantExpected] SvePrefetchType op); // PRFB

  /// T: [byte, uint], [byte, ulong]
  public static unsafe void GatherPrefetchBytes(Vector<T> mask, Vector<T2> bases, long offset, [ConstantExpected] SvePrefetchType op); // PRFB

  /// T: [ushort, uint], [ushort, ulong]
  public static unsafe void GatherPrefetchInt16(Vector<T> mask, Vector<T2> bases, [ConstantExpected] SvePrefetchType op); // PRFH

  /// T: [ushort, int], [ushort, uint], [ushort, long], [ushort, ulong]
  public static unsafe void GatherPrefetchInt16(Vector<T> mask, void* base, Vector<T2> indices, [ConstantExpected] SvePrefetchType op); // PRFH

  /// T: [ushort, uint], [ushort, ulong]
  public static unsafe void GatherPrefetchInt16(Vector<T> mask, Vector<T2> bases, long index, [ConstantExpected] SvePrefetchType op); // PRFH or PRFB

  public static unsafe void GatherPrefetchInt32(Vector<uint> mask, Vector<uint> bases, [ConstantExpected] SvePrefetchType op); // PRFW

  public static unsafe void GatherPrefetchInt32(Vector<uint> mask, Vector<ulong> bases, [ConstantExpected] SvePrefetchType op); // PRFW

  /// T: [uint, int], [uint, long], [uint, ulong]
  public static unsafe void GatherPrefetchInt32(Vector<T> mask, void* base, Vector<T2> indices, [ConstantExpected] SvePrefetchType op); // PRFW

  public static unsafe void GatherPrefetchInt32(Vector<uint> mask, void* base, Vector<uint> indices, [ConstantExpected] SvePrefetchType op); // PRFW

  public static unsafe void GatherPrefetchInt32(Vector<uint> mask, Vector<uint> bases, long index, [ConstantExpected] SvePrefetchType op); // PRFW or PRFB

  public static unsafe void GatherPrefetchInt32(Vector<uint> mask, Vector<ulong> bases, long index, [ConstantExpected] SvePrefetchType op); // PRFW or PRFB

  public static unsafe void GatherPrefetchInt64(Vector<ulong> mask, Vector<uint> bases, [ConstantExpected] SvePrefetchType op); // PRFD

  public static unsafe void GatherPrefetchInt64(Vector<ulong> mask, Vector<ulong> bases, [ConstantExpected] SvePrefetchType op); // PRFD

  /// T: [ulong, int], [ulong, uint], [ulong, long]
  public static unsafe void GatherPrefetchInt64(Vector<T> mask, void* base, Vector<T2> indices, [ConstantExpected] SvePrefetchType op); // PRFD

  public static unsafe void GatherPrefetchInt64(Vector<ulong> mask, void* base, Vector<ulong> indices, [ConstantExpected] SvePrefetchType op); // PRFD

  public static unsafe void GatherPrefetchInt64(Vector<ulong> mask, Vector<uint> bases, long index, [ConstantExpected] SvePrefetchType op); // PRFD or PRFB

  public static unsafe void GatherPrefetchInt64(Vector<ulong> mask, Vector<ulong> bases, long index, [ConstantExpected] SvePrefetchType op); // PRFD or PRFB

  /// T: [float, uint], [int, uint], [double, ulong], [long, ulong]
  public static unsafe Vector<T> GatherVector(Vector<T> mask, Vector<T2> bases); // LD1W or LD1D

  /// T: uint, ulong
  public static unsafe Vector<T> GatherVector(Vector<T> mask, Vector<T> bases); // LD1W or LD1D

  /// T: [float, int], [uint, int], [float, uint], [int, uint], [double, long], [ulong, long], [double, ulong], [long, ulong]
  public static unsafe Vector<T> GatherVector(Vector<T> mask, T* base, Vector<T2> offsets); // LD1W or LD1D

  /// T: int, uint, long, ulong
  public static unsafe Vector<T> GatherVector(Vector<T> mask, T* base, Vector<T> offsets); // LD1W or LD1D

  /// T: [float, int], [uint, int], [float, uint], [int, uint], [double, long], [ulong, long], [double, ulong], [long, ulong]
  public static unsafe Vector<T> GatherVector(Vector<T> mask, T* base, Vector<T2> indices); // LD1W or LD1D

  /// T: int, uint, long, ulong
  public static unsafe Vector<T> GatherVector(Vector<T> mask, T* base, Vector<T> indices); // LD1W or LD1D

  /// T: [float, uint], [int, uint], [double, ulong], [long, ulong]
  public static unsafe Vector<T> GatherVector(Vector<T> mask, Vector<T2> bases, long offset); // LD1W or LD1D

  /// T: uint, ulong
  public static unsafe Vector<T> GatherVector(Vector<T> mask, Vector<T> bases, long offset); // LD1W or LD1D

  /// T: [float, uint], [int, uint], [double, ulong], [long, ulong]
  public static unsafe Vector<T> GatherVector(Vector<T> mask, Vector<T2> bases, long index); // LD1W or LD1D

  /// T: uint, ulong
  public static unsafe Vector<T> GatherVector(Vector<T> mask, Vector<T> bases, long index); // LD1W or LD1D

  /// T: [int, uint], [long, ulong]
  public static unsafe Vector<T> GatherVectorByteZeroExtend(Vector<T> mask, Vector<T2> bases); // LD1B

  /// T: uint, ulong
  public static unsafe Vector<T> GatherVectorByteZeroExtend(Vector<T> mask, Vector<T> bases); // LD1B

  /// T: int, uint, long, ulong
  public static unsafe Vector<T> GatherVectorByteZeroExtend(Vector<T> mask, byte* base, Vector<T> offsets); // LD1B

  /// T: [uint, int], [int, uint], [ulong, long], [long, ulong]
  public static unsafe Vector<T> GatherVectorByteZeroExtend(Vector<T> mask, byte* base, Vector<T2> offsets); // LD1B

  /// T: [int, uint], [long, ulong]
  public static unsafe Vector<T> GatherVectorByteZeroExtend(Vector<T> mask, Vector<T2> bases, long offset); // LD1B

  /// T: uint, ulong
  public static unsafe Vector<T> GatherVectorByteZeroExtend(Vector<T> mask, Vector<T> bases, long offset); // LD1B

  /// T: [int, uint], [long, ulong]
  public static unsafe Vector<T> GatherVectorInt16SignExtend(Vector<T> mask, Vector<T2> bases); // LD1SH

  /// T: uint, ulong
  public static unsafe Vector<T> GatherVectorInt16SignExtend(Vector<T> mask, Vector<T> bases); // LD1SH

  /// T: int, uint, long, ulong
  public static unsafe Vector<T> GatherVectorInt16SignExtend(Vector<T> mask, short* base, Vector<T> offsets); // LD1SH

  /// T: [uint, int], [int, uint], [ulong, long], [long, ulong]
  public static unsafe Vector<T> GatherVectorInt16SignExtend(Vector<T> mask, short* base, Vector<T2> offsets); // LD1SH

  /// T: int, uint, long, ulong
  public static unsafe Vector<T> GatherVectorInt16SignExtend(Vector<T> mask, short* base, Vector<T> indices); // LD1SH

  /// T: [uint, int], [int, uint], [ulong, long], [long, ulong]
  public static unsafe Vector<T> GatherVectorInt16SignExtend(Vector<T> mask, short* base, Vector<T2> indices); // LD1SH

  /// T: [int, uint], [long, ulong]
  public static unsafe Vector<T> GatherVectorInt16SignExtend(Vector<T> mask, Vector<T2> bases, long offset); // LD1SH

  /// T: uint, ulong
  public static unsafe Vector<T> GatherVectorInt16SignExtend(Vector<T> mask, Vector<T> bases, long offset); // LD1SH

  /// T: [int, uint], [long, ulong]
  public static unsafe Vector<T> GatherVectorInt16SignExtend(Vector<T> mask, Vector<T2> bases, long index); // LD1SH

  /// T: uint, ulong
  public static unsafe Vector<T> GatherVectorInt16SignExtend(Vector<T> mask, Vector<T> bases, long index); // LD1SH

  /// T: [int, uint], [long, ulong]
  public static unsafe Vector<T> GatherVectorInt16ZeroExtend(Vector<T> mask, Vector<T2> bases); // LD1H

  /// T: uint, ulong
  public static unsafe Vector<T> GatherVectorInt16ZeroExtend(Vector<T> mask, Vector<T> bases); // LD1H

  /// T: int, uint, long, ulong
  public static unsafe Vector<T> GatherVectorInt16ZeroExtend(Vector<T> mask, ushort* base, Vector<T> offsets); // LD1H

  /// T: [uint, int], [int, uint], [ulong, long], [long, ulong]
  public static unsafe Vector<T> GatherVectorInt16ZeroExtend(Vector<T> mask, ushort* base, Vector<T2> offsets); // LD1H

  /// T: int, uint, long, ulong
  public static unsafe Vector<T> GatherVectorInt16ZeroExtend(Vector<T> mask, ushort* base, Vector<T> indices); // LD1H

  /// T: [uint, int], [int, uint], [ulong, long], [long, ulong]
  public static unsafe Vector<T> GatherVectorInt16ZeroExtend(Vector<T> mask, ushort* base, Vector<T2> indices); // LD1H

  /// T: [int, uint], [long, ulong]
  public static unsafe Vector<T> GatherVectorInt16ZeroExtend(Vector<T> mask, Vector<T2> bases, long offset); // LD1H

  /// T: uint, ulong
  public static unsafe Vector<T> GatherVectorInt16ZeroExtend(Vector<T> mask, Vector<T> bases, long offset); // LD1H

  /// T: [int, uint], [long, ulong]
  public static unsafe Vector<T> GatherVectorInt16ZeroExtend(Vector<T> mask, Vector<T2> bases, long index); // LD1H

  /// T: uint, ulong
  public static unsafe Vector<T> GatherVectorInt16ZeroExtend(Vector<T> mask, Vector<T> bases, long index); // LD1H

  public static unsafe Vector<long> GatherVectorInt32SignExtend(Vector<long> mask, Vector<ulong> bases); // LD1SW

  public static unsafe Vector<ulong> GatherVectorInt32SignExtend(Vector<ulong> mask, Vector<ulong> bases); // LD1SW

  /// T: long, ulong
  public static unsafe Vector<T> GatherVectorInt32SignExtend(Vector<T> mask, int* base, Vector<T> offsets); // LD1SW

  /// T: [ulong, long], [long, ulong]
  public static unsafe Vector<T> GatherVectorInt32SignExtend(Vector<T> mask, int* base, Vector<T2> offsets); // LD1SW

  /// T: long, ulong
  public static unsafe Vector<T> GatherVectorInt32SignExtend(Vector<T> mask, int* base, Vector<T> indices); // LD1SW

  /// T: [ulong, long], [long, ulong]
  public static unsafe Vector<T> GatherVectorInt32SignExtend(Vector<T> mask, int* base, Vector<T2> indices); // LD1SW

  public static unsafe Vector<long> GatherVectorInt32SignExtend(Vector<long> mask, Vector<ulong> bases, long offset); // LD1SW

  public static unsafe Vector<ulong> GatherVectorInt32SignExtend(Vector<ulong> mask, Vector<ulong> bases, long offset); // LD1SW

  public static unsafe Vector<long> GatherVectorInt32SignExtend(Vector<long> mask, Vector<ulong> bases, long index); // LD1SW

  public static unsafe Vector<ulong> GatherVectorInt32SignExtend(Vector<ulong> mask, Vector<ulong> bases, long index); // LD1SW

  public static unsafe Vector<long> GatherVectorInt32ZeroExtend(Vector<long> mask, Vector<ulong> bases); // LD1W

  public static unsafe Vector<ulong> GatherVectorInt32ZeroExtend(Vector<ulong> mask, Vector<ulong> bases); // LD1W

  /// T: long, ulong
  public static unsafe Vector<T> GatherVectorInt32ZeroExtend(Vector<T> mask, uint* base, Vector<T> offsets); // LD1W

  /// T: [ulong, long], [long, ulong]
  public static unsafe Vector<T> GatherVectorInt32ZeroExtend(Vector<T> mask, uint* base, Vector<T2> offsets); // LD1W

  /// T: long, ulong
  public static unsafe Vector<T> GatherVectorInt32ZeroExtend(Vector<T> mask, uint* base, Vector<T> indices); // LD1W

  /// T: [ulong, long], [long, ulong]
  public static unsafe Vector<T> GatherVectorInt32ZeroExtend(Vector<T> mask, uint* base, Vector<T2> indices); // LD1W

  public static unsafe Vector<long> GatherVectorInt32ZeroExtend(Vector<long> mask, Vector<ulong> bases, long offset); // LD1W

  public static unsafe Vector<ulong> GatherVectorInt32ZeroExtend(Vector<ulong> mask, Vector<ulong> bases, long offset); // LD1W

  public static unsafe Vector<long> GatherVectorInt32ZeroExtend(Vector<long> mask, Vector<ulong> bases, long index); // LD1W

  public static unsafe Vector<ulong> GatherVectorInt32ZeroExtend(Vector<ulong> mask, Vector<ulong> bases, long index); // LD1W

  /// T: [int, uint], [long, ulong]
  public static unsafe Vector<T> GatherVectorSByteSignExtend(Vector<T> mask, Vector<T2> bases); // LD1SB

  /// T: uint, ulong
  public static unsafe Vector<T> GatherVectorSByteSignExtend(Vector<T> mask, Vector<T> bases); // LD1SB

  /// T: int, uint, long, ulong
  public static unsafe Vector<T> GatherVectorSByteSignExtend(Vector<T> mask, sbyte* base, Vector<T> offsets); // LD1SB

  /// T: [uint, int], [int, uint], [ulong, long], [long, ulong]
  public static unsafe Vector<T> GatherVectorSByteSignExtend(Vector<T> mask, sbyte* base, Vector<T2> offsets); // LD1SB

  /// T: [int, uint], [long, ulong]
  public static unsafe Vector<T> GatherVectorSByteSignExtend(Vector<T> mask, Vector<T2> bases, long offset); // LD1SB

  /// T: uint, ulong
  public static unsafe Vector<T> GatherVectorSByteSignExtend(Vector<T> mask, Vector<T> bases, long offset); // LD1SB


  // All possible prefetch types
  enum SvePrefetchType
  {
    SV_PLDL1KEEP = 0,   // Temporal fetch the addressed location for reading, to L1 cache.
    SV_PLDL1STRM = 1,   // Streaming fetch the addressed location for reading, to L1 cache.
    SV_PLDL2KEEP = 2,   // Temporal fetch the addressed location for reading, to L2 cache.
    SV_PLDL2STRM = 3,   // Streaming fetch the addressed location for reading, to L2 cache.
    SV_PLDL3KEEP = 4,   // Temporal fetch the addressed location for reading, to L3 cache.
    SV_PLDL3STRM = 5,   // Streaming fetch the addressed location for reading, to L3 cache.
    SV_PSTL1KEEP = 8,   // Temporal fetch the addressed location for writing, to L1 cache.
    SV_PSTL1STRM = 9,   // Streaming fetch the addressed location for writing, to L1 cache.
    SV_PSTL2KEEP = 10,  // Temporal fetch the addressed location for writing, to L2 cache.
    SV_PSTL2STRM = 11,  // Streaming fetch the addressed location for writing, to L2 cache.
    SV_PSTL3KEEP = 12,  // Temporal fetch the addressed location for writing, to L3 cache.
    SV_PSTL3STRM = 13   // Streaming fetch the addressed location for writing, to L3 cache.
  };

  /// total method signatures: 80

}

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions