dotnet / runtime

.NET is a cross-platform runtime for cloud, mobile, desktop, and IoT apps.
https://docs.microsoft.com/dotnet/core/
MIT License
15.27k stars 4.73k forks source link

[API Proposal]: Arm64: FEAT_SVE2: scatter stores #94023

Open a74nh opened 1 year ago

a74nh commented 1 year ago
namespace System.Runtime.Intrinsics.Arm;

/// VectorT Summary
public abstract partial class Sve2 : AdvSimd /// Feature: FEAT_SVE2  Category: scatterstores
{

  /// T: [int, uint], [long, ulong]
  public static unsafe void Scatter16BitNarrowing(Vector<T> mask, Vector<T2> addresses, Vector<T> data); // STNT1H

  /// T: uint, ulong
  public static unsafe void Scatter16BitNarrowing(Vector<T> mask, Vector<T> addresses, Vector<T> data); // STNT1H

  /// T: [int, uint], [long, ulong]
  public static unsafe void Scatter16BitWithByteOffsetsNarrowing(Vector<T> mask, short* address, Vector<T2> offsets, Vector<T> data); // STNT1H

  /// T: uint, ulong
  public static unsafe void Scatter16BitWithByteOffsetsNarrowing(Vector<T> mask, ushort* address, Vector<T> offsets, Vector<T> data); // STNT1H

  public static unsafe void Scatter16BitWithByteOffsetsNarrowing(Vector<long> mask, short* address, Vector<long> offsets, Vector<long> data); // STNT1H

  public static unsafe void Scatter16BitWithByteOffsetsNarrowing(Vector<ulong> mask, ushort* address, Vector<long> offsets, Vector<ulong> data); // STNT1H

  public static unsafe void Scatter16BitWithByteOffsetsNarrowing(Vector<long> mask, short* address, Vector<long> indices, Vector<long> data); // STNT1H

  public static unsafe void Scatter16BitWithByteOffsetsNarrowing(Vector<ulong> mask, ushort* address, Vector<long> indices, Vector<ulong> data); // STNT1H

  public static unsafe void Scatter16BitWithByteOffsetsNarrowing(Vector<long> mask, short* address, Vector<ulong> indices, Vector<long> data); // STNT1H

  public static unsafe void Scatter16BitWithByteOffsetsNarrowing(Vector<ulong> mask, ushort* address, Vector<ulong> indices, Vector<ulong> data); // STNT1H

  public static unsafe void Scatter32BitNarrowing(Vector<long> mask, Vector<ulong> addresses, Vector<long> data); // STNT1W

  public static unsafe void Scatter32BitNarrowing(Vector<ulong> mask, Vector<ulong> addresses, Vector<ulong> data); // STNT1W

  public static unsafe void Scatter32BitWithByteOffsetsNarrowing(Vector<long> mask, int* address, Vector<long> offsets, Vector<long> data); // STNT1W

  public static unsafe void Scatter32BitWithByteOffsetsNarrowing(Vector<ulong> mask, uint* address, Vector<long> offsets, Vector<ulong> data); // STNT1W

  public static unsafe void Scatter32BitWithByteOffsetsNarrowing(Vector<long> mask, int* address, Vector<ulong> offsets, Vector<long> data); // STNT1W

  public static unsafe void Scatter32BitWithByteOffsetsNarrowing(Vector<ulong> mask, uint* address, Vector<ulong> offsets, Vector<ulong> data); // STNT1W

  public static unsafe void Scatter32BitWithByteOffsetsNarrowing(Vector<long> mask, int* address, Vector<long> indices, Vector<long> data); // STNT1W

  public static unsafe void Scatter32BitWithByteOffsetsNarrowing(Vector<ulong> mask, uint* address, Vector<long> indices, Vector<ulong> data); // STNT1W

  public static unsafe void Scatter32BitWithByteOffsetsNarrowing(Vector<long> mask, int* address, Vector<ulong> indices, Vector<long> data); // STNT1W

  public static unsafe void Scatter32BitWithByteOffsetsNarrowing(Vector<ulong> mask, uint* address, Vector<ulong> indices, Vector<ulong> data); // STNT1W

  /// T: [int, uint], [long, ulong]
  public static unsafe void Scatter8BitNarrowing(Vector<T> mask, Vector<T2> addresses, Vector<T> data); // STNT1B

  /// T: uint, ulong
  public static unsafe void Scatter8BitNarrowing(Vector<T> mask, Vector<T> addresses, Vector<T> data); // STNT1B

  /// T: [int, uint], [long, ulong]
  public static unsafe void Scatter8BitWithByteOffsetsNarrowing(Vector<T> mask, sbyte* address, Vector<T2> offsets, Vector<T> data); // STNT1B

  /// T: uint, ulong
  public static unsafe void Scatter8BitWithByteOffsetsNarrowing(Vector<T> mask, byte* address, Vector<T> offsets, Vector<T> data); // STNT1B

  public static unsafe void Scatter8BitWithByteOffsetsNarrowing(Vector<long> mask, sbyte* address, Vector<long> offsets, Vector<long> data); // STNT1B

  public static unsafe void Scatter8BitWithByteOffsetsNarrowing(Vector<ulong> mask, byte* address, Vector<long> offsets, Vector<ulong> data); // STNT1B

  /// T: [float, uint], [int, uint], [double, ulong], [long, ulong]
  public static unsafe void ScatterNonTemporal(Vector<T> mask, Vector<T2> addresses, Vector<T> data); // STNT1W or STNT1D

  /// T: uint, ulong
  public static unsafe void ScatterNonTemporal(Vector<T> mask, Vector<T> addresses, Vector<T> data); // STNT1W or STNT1D

  /// T: [float, uint], [int, uint], [double, long], [ulong, long], [double, ulong], [long, ulong]
  public static unsafe void ScatterNonTemporal(Vector<T> mask, T* base, Vector<T2> offsets, Vector<T> data); // STNT1W or STNT1D

  /// T: uint, long, ulong
  public static unsafe void ScatterNonTemporal(Vector<T> mask, T* base, Vector<T> offsets, Vector<T> data); // STNT1W or STNT1D

  /// T: [double, long], [ulong, long], [double, ulong], [long, ulong]
  public static unsafe void ScatterNonTemporal(Vector<T> mask, T* base, Vector<T2> indices, Vector<T> data); // STNT1D

  /// T: long, ulong
  public static unsafe void ScatterNonTemporal(Vector<T> mask, T* base, Vector<T> indices, Vector<T> data); // STNT1D

  /// total method signatures: 32

}
ghost commented 1 year ago

Tagging subscribers to this area: @dotnet/area-system-runtime-intrinsics See info in area-owners.md if you want to be subscribed.

Issue Details
```csharp namespace System.Runtime.Intrinsics.Arm /// VectorT Summary public abstract class Sve : AdvSimd /// Feature: FEAT_SVE2 Category: scatterstores { /// T: [uint, float], [uint, int], [ulong, double], [ulong, long] public static unsafe void ScatterStoreVectorNonTemporal(Vector bases, Vector data); // STNT1W or STNT1D /// T: uint, ulong public static unsafe void ScatterStoreVectorNonTemporal(Vector bases, Vector data); // STNT1W or STNT1D /// T: [uint, float], [uint, int], [long, double], [long, ulong], [ulong, double], [ulong, long] public static unsafe void ScatterStoreVectorNonTemporal(T2 *base, Vector offsets, Vector data); // STNT1W or STNT1D /// T: uint, long, ulong public static unsafe void ScatterStoreVectorNonTemporal(T *base, Vector offsets, Vector data); // STNT1W or STNT1D /// T: [long, double], [long, ulong], [ulong, double], [ulong, long] public static unsafe void ScatterStoreVectorNonTemporal(T2 *base, Vector indices, Vector data); // STNT1D /// T: long, ulong public static unsafe void ScatterStoreVectorNonTemporal(T *base, Vector indices, Vector data); // STNT1D /// T: [uint, float], [uint, int], [ulong, double], [ulong, long] public static unsafe void ScatterStoreVectorNonTemporal(Vector bases, long offset, Vector data); // STNT1W or STNT1D /// T: uint, ulong public static unsafe void ScatterStoreVectorNonTemporal(Vector bases, long offset, Vector data); // STNT1W or STNT1D /// T: [uint, float], [uint, int], [ulong, double], [ulong, long] public static unsafe void ScatterStoreVectorNonTemporal(Vector bases, long index, Vector data); // STNT1W or STNT1D /// T: uint, ulong public static unsafe void ScatterStoreVectorNonTemporal(Vector bases, long index, Vector data); // STNT1W or STNT1D /// T: [uint, int], [ulong, long] public static unsafe void ScatterStoreVectorTruncate16NonTemporal(Vector bases, Vector data); // STNT1H /// T: uint, ulong public static unsafe void ScatterStoreVectorTruncate16NonTemporal(Vector bases, Vector data); // STNT1H /// T: [uint, int], [ulong, long] public static unsafe void ScatterStoreVectorTruncate16NonTemporal(short *base, Vector offsets, Vector data); // STNT1H /// T: uint, ulong public static unsafe void ScatterStoreVectorTruncate16NonTemporal(ushort *base, Vector offsets, Vector data); // STNT1H public static unsafe void ScatterStoreVectorTruncate16NonTemporal(short *base, Vector offsets, Vector data); public static unsafe void ScatterStoreVectorTruncate16NonTemporal(ushort *base, Vector offsets, Vector data); public static unsafe void ScatterStoreVectorTruncate16NonTemporal(short *base, Vector indices, Vector data); public static unsafe void ScatterStoreVectorTruncate16NonTemporal(ushort *base, Vector indices, Vector data); public static unsafe void ScatterStoreVectorTruncate16NonTemporal(short *base, Vector indices, Vector data); public static unsafe void ScatterStoreVectorTruncate16NonTemporal(ushort *base, Vector indices, Vector data); /// T: [uint, int], [ulong, long] public static unsafe void ScatterStoreVectorTruncate16NonTemporal(Vector bases, long offset, Vector data); // STNT1H /// T: uint, ulong public static unsafe void ScatterStoreVectorTruncate16NonTemporal(Vector bases, long offset, Vector data); // STNT1H /// T: [uint, int], [ulong, long] public static unsafe void ScatterStoreVectorTruncate16NonTemporal(Vector bases, long index, Vector data); // STNT1H /// T: uint, ulong public static unsafe void ScatterStoreVectorTruncate16NonTemporal(Vector bases, long index, Vector data); // STNT1H public static unsafe void ScatterStoreVectorTruncate32NonTemporal(Vector bases, Vector data); public static unsafe void ScatterStoreVectorTruncate32NonTemporal(Vector bases, Vector data); public static unsafe void ScatterStoreVectorTruncate32NonTemporal(int *base, Vector offsets, Vector data); public static unsafe void ScatterStoreVectorTruncate32NonTemporal(uint *base, Vector offsets, Vector data); public static unsafe void ScatterStoreVectorTruncate32NonTemporal(int *base, Vector offsets, Vector data); public static unsafe void ScatterStoreVectorTruncate32NonTemporal(uint *base, Vector offsets, Vector data); public static unsafe void ScatterStoreVectorTruncate32NonTemporal(int *base, Vector indices, Vector data); public static unsafe void ScatterStoreVectorTruncate32NonTemporal(uint *base, Vector indices, Vector data); public static unsafe void ScatterStoreVectorTruncate32NonTemporal(int *base, Vector indices, Vector data); public static unsafe void ScatterStoreVectorTruncate32NonTemporal(uint *base, Vector indices, Vector data); public static unsafe void ScatterStoreVectorTruncate32NonTemporal(Vector bases, long offset, Vector data); public static unsafe void ScatterStoreVectorTruncate32NonTemporal(Vector bases, long offset, Vector data); public static unsafe void ScatterStoreVectorTruncate32NonTemporal(Vector bases, long index, Vector data); public static unsafe void ScatterStoreVectorTruncate32NonTemporal(Vector bases, long index, Vector data); /// T: [uint, int], [ulong, long] public static unsafe void ScatterStoreVectorTruncate8NonTemporal(Vector bases, Vector data); // STNT1B /// T: uint, ulong public static unsafe void ScatterStoreVectorTruncate8NonTemporal(Vector bases, Vector data); // STNT1B /// T: [uint, int], [ulong, long] public static unsafe void ScatterStoreVectorTruncate8NonTemporal(sbyte *base, Vector offsets, Vector data); // STNT1B /// T: uint, ulong public static unsafe void ScatterStoreVectorTruncate8NonTemporal(byte *base, Vector offsets, Vector data); // STNT1B public static unsafe void ScatterStoreVectorTruncate8NonTemporal(sbyte *base, Vector offsets, Vector data); public static unsafe void ScatterStoreVectorTruncate8NonTemporal(byte *base, Vector offsets, Vector data); /// T: [uint, int], [ulong, long] public static unsafe void ScatterStoreVectorTruncate8NonTemporal(Vector bases, long offset, Vector data); // STNT1B /// T: uint, ulong public static unsafe void ScatterStoreVectorTruncate8NonTemporal(Vector bases, long offset, Vector data); // STNT1B /// total method signatures: 46 } ```
Author: a74nh
Assignees: -
Labels: `area-System.Runtime.Intrinsics`
Milestone: -
a74nh commented 1 year ago

/// Full API
public abstract partial class Sve2 : AdvSimd /// Feature: FEAT_SVE2  Category: scatterstores
{
    /// Scatter16BitNarrowing : Truncate to 16 bits and store, non-temporal

    /// void svstnt1h_scatter[_u32base_s32](svbool_t pg, svuint32_t bases, svint32_t data) : "STNT1H Zdata.S, Pg, [Zbases.S, XZR]"
  public static unsafe void Scatter16BitNarrowing(Vector<int> mask, Vector<uint> addresses, Vector<int> data);

    /// void svstnt1h_scatter[_u32base_u32](svbool_t pg, svuint32_t bases, svuint32_t data) : "STNT1H Zdata.S, Pg, [Zbases.S, XZR]"
  public static unsafe void Scatter16BitNarrowing(Vector<uint> mask, Vector<uint> addresses, Vector<uint> data);

    /// void svstnt1h_scatter[_u64base_s64](svbool_t pg, svuint64_t bases, svint64_t data) : "STNT1H Zdata.D, Pg, [Zbases.D, XZR]"
  public static unsafe void Scatter16BitNarrowing(Vector<long> mask, Vector<ulong> addresses, Vector<long> data);

    /// void svstnt1h_scatter[_u64base_u64](svbool_t pg, svuint64_t bases, svuint64_t data) : "STNT1H Zdata.D, Pg, [Zbases.D, XZR]"
  public static unsafe void Scatter16BitNarrowing(Vector<ulong> mask, Vector<ulong> addresses, Vector<ulong> data);

    /// Scatter16BitWithByteOffsetsNarrowing : Truncate to 16 bits and store, non-temporal

    /// void svstnt1h_scatter_[u32]offset[_s32](svbool_t pg, int16_t *base, svuint32_t offsets, svint32_t data) : "STNT1H Zdata.S, Pg, [Zoffsets.S, Xbase]"
  public static unsafe void Scatter16BitWithByteOffsetsNarrowing(Vector<int> mask, short* address, Vector<uint> offsets, Vector<int> data);

    /// void svstnt1h_scatter_[u32]offset[_u32](svbool_t pg, uint16_t *base, svuint32_t offsets, svuint32_t data) : "STNT1H Zdata.S, Pg, [Zoffsets.S, Xbase]"
  public static unsafe void Scatter16BitWithByteOffsetsNarrowing(Vector<uint> mask, ushort* address, Vector<uint> offsets, Vector<uint> data);

    /// void svstnt1h_scatter_[s64]offset[_s64](svbool_t pg, int16_t *base, svint64_t offsets, svint64_t data) : "STNT1H Zdata.D, Pg, [Zoffsets.D, Xbase]"
  public static unsafe void Scatter16BitWithByteOffsetsNarrowing(Vector<long> mask, short* address, Vector<long> offsets, Vector<long> data);

    /// void svstnt1h_scatter_[s64]offset[_u64](svbool_t pg, uint16_t *base, svint64_t offsets, svuint64_t data) : "STNT1H Zdata.D, Pg, [Zoffsets.D, Xbase]"
  public static unsafe void Scatter16BitWithByteOffsetsNarrowing(Vector<ulong> mask, ushort* address, Vector<long> offsets, Vector<ulong> data);

    /// void svstnt1h_scatter_[u64]offset[_s64](svbool_t pg, int16_t *base, svuint64_t offsets, svint64_t data) : "STNT1H Zdata.D, Pg, [Zoffsets.D, Xbase]"
  public static unsafe void Scatter16BitWithByteOffsetsNarrowing(Vector<long> mask, short* address, Vector<ulong> offsets, Vector<long> data);

    /// void svstnt1h_scatter_[u64]offset[_u64](svbool_t pg, uint16_t *base, svuint64_t offsets, svuint64_t data) : "STNT1H Zdata.D, Pg, [Zoffsets.D, Xbase]"
  public static unsafe void Scatter16BitWithByteOffsetsNarrowing(Vector<ulong> mask, ushort* address, Vector<ulong> offsets, Vector<ulong> data);

    /// void svstnt1h_scatter_[s64]index[_s64](svbool_t pg, int16_t *base, svint64_t indices, svint64_t data) : "STNT1H Zdata.D, Pg, [Zoffsets.D, Xbase]"
  public static unsafe void Scatter16BitWithByteOffsetsNarrowing(Vector<long> mask, short* address, Vector<long> indices, Vector<long> data);

    /// void svstnt1h_scatter_[s64]index[_u64](svbool_t pg, uint16_t *base, svint64_t indices, svuint64_t data) : "STNT1H Zdata.D, Pg, [Zoffsets.D, Xbase]"
  public static unsafe void Scatter16BitWithByteOffsetsNarrowing(Vector<ulong> mask, ushort* address, Vector<long> indices, Vector<ulong> data);

    /// void svstnt1h_scatter_[u64]index[_s64](svbool_t pg, int16_t *base, svuint64_t indices, svint64_t data) : "STNT1H Zdata.D, Pg, [Zoffsets.D, Xbase]"
  public static unsafe void Scatter16BitWithByteOffsetsNarrowing(Vector<long> mask, short* address, Vector<ulong> indices, Vector<long> data);

    /// void svstnt1h_scatter_[u64]index[_u64](svbool_t pg, uint16_t *base, svuint64_t indices, svuint64_t data) : "STNT1H Zdata.D, Pg, [Zoffsets.D, Xbase]"
  public static unsafe void Scatter16BitWithByteOffsetsNarrowing(Vector<ulong> mask, ushort* address, Vector<ulong> indices, Vector<ulong> data);

    /// Scatter32BitNarrowing : Truncate to 32 bits and store, non-temporal

    /// void svstnt1w_scatter[_u64base_s64](svbool_t pg, svuint64_t bases, svint64_t data) : "STNT1W Zdata.D, Pg, [Zbases.D, XZR]"
  public static unsafe void Scatter32BitNarrowing(Vector<long> mask, Vector<ulong> addresses, Vector<long> data);

    /// void svstnt1w_scatter[_u64base_u64](svbool_t pg, svuint64_t bases, svuint64_t data) : "STNT1W Zdata.D, Pg, [Zbases.D, XZR]"
  public static unsafe void Scatter32BitNarrowing(Vector<ulong> mask, Vector<ulong> addresses, Vector<ulong> data);

    /// Scatter32BitWithByteOffsetsNarrowing : Truncate to 32 bits and store, non-temporal

    /// void svstnt1w_scatter_[s64]offset[_s64](svbool_t pg, int32_t *base, svint64_t offsets, svint64_t data) : "STNT1W Zdata.D, Pg, [Zoffsets.D, Xbase]"
  public static unsafe void Scatter32BitWithByteOffsetsNarrowing(Vector<long> mask, int* address, Vector<long> offsets, Vector<long> data);

    /// void svstnt1w_scatter_[s64]offset[_u64](svbool_t pg, uint32_t *base, svint64_t offsets, svuint64_t data) : "STNT1W Zdata.D, Pg, [Zoffsets.D, Xbase]"
  public static unsafe void Scatter32BitWithByteOffsetsNarrowing(Vector<ulong> mask, uint* address, Vector<long> offsets, Vector<ulong> data);

    /// void svstnt1w_scatter_[u64]offset[_s64](svbool_t pg, int32_t *base, svuint64_t offsets, svint64_t data) : "STNT1W Zdata.D, Pg, [Zoffsets.D, Xbase]"
  public static unsafe void Scatter32BitWithByteOffsetsNarrowing(Vector<long> mask, int* address, Vector<ulong> offsets, Vector<long> data);

    /// void svstnt1w_scatter_[u64]offset[_u64](svbool_t pg, uint32_t *base, svuint64_t offsets, svuint64_t data) : "STNT1W Zdata.D, Pg, [Zoffsets.D, Xbase]"
  public static unsafe void Scatter32BitWithByteOffsetsNarrowing(Vector<ulong> mask, uint* address, Vector<ulong> offsets, Vector<ulong> data);

    /// void svstnt1w_scatter_[s64]index[_s64](svbool_t pg, int32_t *base, svint64_t indices, svint64_t data) : "STNT1W Zdata.D, Pg, [Zoffsets.D, Xbase]"
  public static unsafe void Scatter32BitWithByteOffsetsNarrowing(Vector<long> mask, int* address, Vector<long> indices, Vector<long> data);

    /// void svstnt1w_scatter_[s64]index[_u64](svbool_t pg, uint32_t *base, svint64_t indices, svuint64_t data) : "STNT1W Zdata.D, Pg, [Zoffsets.D, Xbase]"
  public static unsafe void Scatter32BitWithByteOffsetsNarrowing(Vector<ulong> mask, uint* address, Vector<long> indices, Vector<ulong> data);

    /// void svstnt1w_scatter_[u64]index[_s64](svbool_t pg, int32_t *base, svuint64_t indices, svint64_t data) : "STNT1W Zdata.D, Pg, [Zoffsets.D, Xbase]"
  public static unsafe void Scatter32BitWithByteOffsetsNarrowing(Vector<long> mask, int* address, Vector<ulong> indices, Vector<long> data);

    /// void svstnt1w_scatter_[u64]index[_u64](svbool_t pg, uint32_t *base, svuint64_t indices, svuint64_t data) : "STNT1W Zdata.D, Pg, [Zoffsets.D, Xbase]"
  public static unsafe void Scatter32BitWithByteOffsetsNarrowing(Vector<ulong> mask, uint* address, Vector<ulong> indices, Vector<ulong> data);

    /// Scatter8BitNarrowing : Truncate to 8 bits and store, non-temporal

    /// void svstnt1b_scatter[_u32base_s32](svbool_t pg, svuint32_t bases, svint32_t data) : "STNT1B Zdata.S, Pg, [Zbases.S, XZR]"
  public static unsafe void Scatter8BitNarrowing(Vector<int> mask, Vector<uint> addresses, Vector<int> data);

    /// void svstnt1b_scatter[_u32base_u32](svbool_t pg, svuint32_t bases, svuint32_t data) : "STNT1B Zdata.S, Pg, [Zbases.S, XZR]"
  public static unsafe void Scatter8BitNarrowing(Vector<uint> mask, Vector<uint> addresses, Vector<uint> data);

    /// void svstnt1b_scatter[_u64base_s64](svbool_t pg, svuint64_t bases, svint64_t data) : "STNT1B Zdata.D, Pg, [Zbases.D, XZR]"
  public static unsafe void Scatter8BitNarrowing(Vector<long> mask, Vector<ulong> addresses, Vector<long> data);

    /// void svstnt1b_scatter[_u64base_u64](svbool_t pg, svuint64_t bases, svuint64_t data) : "STNT1B Zdata.D, Pg, [Zbases.D, XZR]"
  public static unsafe void Scatter8BitNarrowing(Vector<ulong> mask, Vector<ulong> addresses, Vector<ulong> data);

    /// Scatter8BitWithByteOffsetsNarrowing : Truncate to 8 bits and store, non-temporal

    /// void svstnt1b_scatter_[u32]offset[_s32](svbool_t pg, int8_t *base, svuint32_t offsets, svint32_t data) : "STNT1B Zdata.S, Pg, [Zoffsets.S, Xbase]"
  public static unsafe void Scatter8BitWithByteOffsetsNarrowing(Vector<int> mask, sbyte* address, Vector<uint> offsets, Vector<int> data);

    /// void svstnt1b_scatter_[u32]offset[_u32](svbool_t pg, uint8_t *base, svuint32_t offsets, svuint32_t data) : "STNT1B Zdata.S, Pg, [Zoffsets.S, Xbase]"
  public static unsafe void Scatter8BitWithByteOffsetsNarrowing(Vector<uint> mask, byte* address, Vector<uint> offsets, Vector<uint> data);

    /// void svstnt1b_scatter_[s64]offset[_s64](svbool_t pg, int8_t *base, svint64_t offsets, svint64_t data) : "STNT1B Zdata.D, Pg, [Zoffsets.D, Xbase]"
  public static unsafe void Scatter8BitWithByteOffsetsNarrowing(Vector<long> mask, sbyte* address, Vector<long> offsets, Vector<long> data);

    /// void svstnt1b_scatter_[s64]offset[_u64](svbool_t pg, uint8_t *base, svint64_t offsets, svuint64_t data) : "STNT1B Zdata.D, Pg, [Zoffsets.D, Xbase]"
  public static unsafe void Scatter8BitWithByteOffsetsNarrowing(Vector<ulong> mask, byte* address, Vector<long> offsets, Vector<ulong> data);

    /// void svstnt1b_scatter_[u64]offset[_s64](svbool_t pg, int8_t *base, svuint64_t offsets, svint64_t data) : "STNT1B Zdata.D, Pg, [Zoffsets.D, Xbase]"
  public static unsafe void Scatter8BitWithByteOffsetsNarrowing(Vector<long> mask, sbyte* address, Vector<ulong> offsets, Vector<long> data);

    /// void svstnt1b_scatter_[u64]offset[_u64](svbool_t pg, uint8_t *base, svuint64_t offsets, svuint64_t data) : "STNT1B Zdata.D, Pg, [Zoffsets.D, Xbase]"
  public static unsafe void Scatter8BitWithByteOffsetsNarrowing(Vector<ulong> mask, byte* address, Vector<ulong> offsets, Vector<ulong> data);

    /// ScatterNonTemporal : Non-truncating store, non-temporal

    /// void svstnt1_scatter[_u32base_f32](svbool_t pg, svuint32_t bases, svfloat32_t data) : "STNT1W Zdata.S, Pg, [Zbases.S, XZR]"
  public static unsafe void ScatterNonTemporal(Vector<float> mask, Vector<uint> addresses, Vector<float> data);

    /// void svstnt1_scatter[_u32base_s32](svbool_t pg, svuint32_t bases, svint32_t data) : "STNT1W Zdata.S, Pg, [Zbases.S, XZR]"
  public static unsafe void ScatterNonTemporal(Vector<int> mask, Vector<uint> addresses, Vector<int> data);

    /// void svstnt1_scatter[_u32base_u32](svbool_t pg, svuint32_t bases, svuint32_t data) : "STNT1W Zdata.S, Pg, [Zbases.S, XZR]"
  public static unsafe void ScatterNonTemporal(Vector<uint> mask, Vector<uint> addresses, Vector<uint> data);

    /// void svstnt1_scatter[_u64base_f64](svbool_t pg, svuint64_t bases, svfloat64_t data) : "STNT1D Zdata.D, Pg, [Zbases.D, XZR]"
  public static unsafe void ScatterNonTemporal(Vector<double> mask, Vector<ulong> addresses, Vector<double> data);

    /// void svstnt1_scatter[_u64base_s64](svbool_t pg, svuint64_t bases, svint64_t data) : "STNT1D Zdata.D, Pg, [Zbases.D, XZR]"
  public static unsafe void ScatterNonTemporal(Vector<long> mask, Vector<ulong> addresses, Vector<long> data);

    /// void svstnt1_scatter[_u64base_u64](svbool_t pg, svuint64_t bases, svuint64_t data) : "STNT1D Zdata.D, Pg, [Zbases.D, XZR]"
  public static unsafe void ScatterNonTemporal(Vector<ulong> mask, Vector<ulong> addresses, Vector<ulong> data);

    /// void svstnt1_scatter_[u32]offset[_f32](svbool_t pg, float32_t *base, svuint32_t offsets, svfloat32_t data) : "STNT1W Zdata.S, Pg, [Zoffsets.S, Xbase]"
  public static unsafe void ScatterNonTemporal(Vector<float> mask, float* base, Vector<uint> offsets, Vector<float> data);

    /// void svstnt1_scatter_[u32]offset[_s32](svbool_t pg, int32_t *base, svuint32_t offsets, svint32_t data) : "STNT1W Zdata.S, Pg, [Zoffsets.S, Xbase]"
  public static unsafe void ScatterNonTemporal(Vector<int> mask, int* base, Vector<uint> offsets, Vector<int> data);

    /// void svstnt1_scatter_[u32]offset[_u32](svbool_t pg, uint32_t *base, svuint32_t offsets, svuint32_t data) : "STNT1W Zdata.S, Pg, [Zoffsets.S, Xbase]"
  public static unsafe void ScatterNonTemporal(Vector<uint> mask, uint* base, Vector<uint> offsets, Vector<uint> data);

    /// void svstnt1_scatter_[s64]offset[_f64](svbool_t pg, float64_t *base, svint64_t offsets, svfloat64_t data) : "STNT1D Zdata.D, Pg, [Zoffsets.D, Xbase]"
  public static unsafe void ScatterNonTemporal(Vector<double> mask, double* base, Vector<long> offsets, Vector<double> data);

    /// void svstnt1_scatter_[s64]offset[_s64](svbool_t pg, int64_t *base, svint64_t offsets, svint64_t data) : "STNT1D Zdata.D, Pg, [Zoffsets.D, Xbase]"
  public static unsafe void ScatterNonTemporal(Vector<long> mask, long* base, Vector<long> offsets, Vector<long> data);

    /// void svstnt1_scatter_[s64]offset[_u64](svbool_t pg, uint64_t *base, svint64_t offsets, svuint64_t data) : "STNT1D Zdata.D, Pg, [Zoffsets.D, Xbase]"
  public static unsafe void ScatterNonTemporal(Vector<ulong> mask, ulong* base, Vector<long> offsets, Vector<ulong> data);

    /// void svstnt1_scatter_[u64]offset[_f64](svbool_t pg, float64_t *base, svuint64_t offsets, svfloat64_t data) : "STNT1D Zdata.D, Pg, [Zoffsets.D, Xbase]"
  public static unsafe void ScatterNonTemporal(Vector<double> mask, double* base, Vector<ulong> offsets, Vector<double> data);

    /// void svstnt1_scatter_[u64]offset[_s64](svbool_t pg, int64_t *base, svuint64_t offsets, svint64_t data) : "STNT1D Zdata.D, Pg, [Zoffsets.D, Xbase]"
  public static unsafe void ScatterNonTemporal(Vector<long> mask, long* base, Vector<ulong> offsets, Vector<long> data);

    /// void svstnt1_scatter_[u64]offset[_u64](svbool_t pg, uint64_t *base, svuint64_t offsets, svuint64_t data) : "STNT1D Zdata.D, Pg, [Zoffsets.D, Xbase]"
  public static unsafe void ScatterNonTemporal(Vector<ulong> mask, ulong* base, Vector<ulong> offsets, Vector<ulong> data);

    /// void svstnt1_scatter_[s64]index[_f64](svbool_t pg, float64_t *base, svint64_t indices, svfloat64_t data) : "STNT1D Zdata.D, Pg, [Zoffsets.D, Xbase]"
  public static unsafe void ScatterNonTemporal(Vector<double> mask, double* base, Vector<long> indices, Vector<double> data);

    /// void svstnt1_scatter_[s64]index[_s64](svbool_t pg, int64_t *base, svint64_t indices, svint64_t data) : "STNT1D Zdata.D, Pg, [Zoffsets.D, Xbase]"
  public static unsafe void ScatterNonTemporal(Vector<long> mask, long* base, Vector<long> indices, Vector<long> data);

    /// void svstnt1_scatter_[s64]index[_u64](svbool_t pg, uint64_t *base, svint64_t indices, svuint64_t data) : "STNT1D Zdata.D, Pg, [Zoffsets.D, Xbase]"
  public static unsafe void ScatterNonTemporal(Vector<ulong> mask, ulong* base, Vector<long> indices, Vector<ulong> data);

    /// void svstnt1_scatter_[u64]index[_f64](svbool_t pg, float64_t *base, svuint64_t indices, svfloat64_t data) : "STNT1D Zdata.D, Pg, [Zoffsets.D, Xbase]"
  public static unsafe void ScatterNonTemporal(Vector<double> mask, double* base, Vector<ulong> indices, Vector<double> data);

    /// void svstnt1_scatter_[u64]index[_s64](svbool_t pg, int64_t *base, svuint64_t indices, svint64_t data) : "STNT1D Zdata.D, Pg, [Zoffsets.D, Xbase]"
  public static unsafe void ScatterNonTemporal(Vector<long> mask, long* base, Vector<ulong> indices, Vector<long> data);

    /// void svstnt1_scatter_[u64]index[_u64](svbool_t pg, uint64_t *base, svuint64_t indices, svuint64_t data) : "STNT1D Zdata.D, Pg, [Zoffsets.D, Xbase]"
  public static unsafe void ScatterNonTemporal(Vector<ulong> mask, ulong* base, Vector<ulong> indices, Vector<ulong> data);

  /// total method signatures: 55
  /// total method names:      7
}
a74nh commented 1 year ago

  /// Rejected:
  ///   public static unsafe void Scatter16BitWithByteOffsetsNarrowing(Vector<int> mask, Vector<uint> address, long offset, Vector<int> data); // svstnt1h_scatter[_u32base]_offset[_s32]
  ///   public static unsafe void Scatter16BitWithByteOffsetsNarrowing(Vector<uint> mask, Vector<uint> address, long offset, Vector<uint> data); // svstnt1h_scatter[_u32base]_offset[_u32]
  ///   public static unsafe void Scatter16BitWithByteOffsetsNarrowing(Vector<long> mask, Vector<ulong> address, long offset, Vector<long> data); // svstnt1h_scatter[_u64base]_offset[_s64]
  ///   public static unsafe void Scatter16BitWithByteOffsetsNarrowing(Vector<ulong> mask, Vector<ulong> address, long offset, Vector<ulong> data); // svstnt1h_scatter[_u64base]_offset[_u64]
  ///   public static unsafe void Scatter16BitWithByteOffsetsNarrowing(Vector<int> mask, Vector<uint> address, long index, Vector<int> data); // svstnt1h_scatter[_u32base]_index[_s32]
  ///   public static unsafe void Scatter16BitWithByteOffsetsNarrowing(Vector<uint> mask, Vector<uint> address, long index, Vector<uint> data); // svstnt1h_scatter[_u32base]_index[_u32]
  ///   public static unsafe void Scatter16BitWithByteOffsetsNarrowing(Vector<long> mask, Vector<ulong> address, long index, Vector<long> data); // svstnt1h_scatter[_u64base]_index[_s64]
  ///   public static unsafe void Scatter16BitWithByteOffsetsNarrowing(Vector<ulong> mask, Vector<ulong> address, long index, Vector<ulong> data); // svstnt1h_scatter[_u64base]_index[_u64]
  ///   public static unsafe void Scatter32BitWithByteOffsetsNarrowing(Vector<long> mask, Vector<ulong> address, long offset, Vector<long> data); // svstnt1w_scatter[_u64base]_offset[_s64]
  ///   public static unsafe void Scatter32BitWithByteOffsetsNarrowing(Vector<ulong> mask, Vector<ulong> address, long offset, Vector<ulong> data); // svstnt1w_scatter[_u64base]_offset[_u64]
  ///   public static unsafe void Scatter32BitWithByteOffsetsNarrowing(Vector<long> mask, Vector<ulong> address, long index, Vector<long> data); // svstnt1w_scatter[_u64base]_index[_s64]
  ///   public static unsafe void Scatter32BitWithByteOffsetsNarrowing(Vector<ulong> mask, Vector<ulong> address, long index, Vector<ulong> data); // svstnt1w_scatter[_u64base]_index[_u64]
  ///   public static unsafe void Scatter8BitWithByteOffsetsNarrowing(Vector<int> mask, Vector<uint> address, long offset, Vector<int> data); // svstnt1b_scatter[_u32base]_offset[_s32]
  ///   public static unsafe void Scatter8BitWithByteOffsetsNarrowing(Vector<uint> mask, Vector<uint> address, long offset, Vector<uint> data); // svstnt1b_scatter[_u32base]_offset[_u32]
  ///   public static unsafe void Scatter8BitWithByteOffsetsNarrowing(Vector<long> mask, Vector<ulong> address, long offset, Vector<long> data); // svstnt1b_scatter[_u64base]_offset[_s64]
  ///   public static unsafe void Scatter8BitWithByteOffsetsNarrowing(Vector<ulong> mask, Vector<ulong> address, long offset, Vector<ulong> data); // svstnt1b_scatter[_u64base]_offset[_u64]
  ///   public static unsafe void ScatterNonTemporal(Vector<float> mask, Vector<uint> bases, long offset, Vector<float> data); // svstnt1_scatter[_u32base]_offset[_f32]
  ///   public static unsafe void ScatterNonTemporal(Vector<int> mask, Vector<uint> bases, long offset, Vector<int> data); // svstnt1_scatter[_u32base]_offset[_s32]
  ///   public static unsafe void ScatterNonTemporal(Vector<uint> mask, Vector<uint> bases, long offset, Vector<uint> data); // svstnt1_scatter[_u32base]_offset[_u32]
  ///   public static unsafe void ScatterNonTemporal(Vector<double> mask, Vector<ulong> bases, long offset, Vector<double> data); // svstnt1_scatter[_u64base]_offset[_f64]
  ///   public static unsafe void ScatterNonTemporal(Vector<long> mask, Vector<ulong> bases, long offset, Vector<long> data); // svstnt1_scatter[_u64base]_offset[_s64]
  ///   public static unsafe void ScatterNonTemporal(Vector<ulong> mask, Vector<ulong> bases, long offset, Vector<ulong> data); // svstnt1_scatter[_u64base]_offset[_u64]
  ///   public static unsafe void ScatterNonTemporal(Vector<float> mask, Vector<uint> bases, long index, Vector<float> data); // svstnt1_scatter[_u32base]_index[_f32]
  ///   public static unsafe void ScatterNonTemporal(Vector<int> mask, Vector<uint> bases, long index, Vector<int> data); // svstnt1_scatter[_u32base]_index[_s32]
  ///   public static unsafe void ScatterNonTemporal(Vector<uint> mask, Vector<uint> bases, long index, Vector<uint> data); // svstnt1_scatter[_u32base]_index[_u32]
  ///   public static unsafe void ScatterNonTemporal(Vector<double> mask, Vector<ulong> bases, long index, Vector<double> data); // svstnt1_scatter[_u64base]_index[_f64]
  ///   public static unsafe void ScatterNonTemporal(Vector<long> mask, Vector<ulong> bases, long index, Vector<long> data); // svstnt1_scatter[_u64base]_index[_s64]
  ///   public static unsafe void ScatterNonTemporal(Vector<ulong> mask, Vector<ulong> bases, long index, Vector<ulong> data); // svstnt1_scatter[_u64base]_index[_u64]
  ///   Total Rejected: 28

  /// Total ACLE covered across API:      83
a74nh commented 1 year ago

This contributes to https://github.com/dotnet/runtime/issues/93095

It covers instructions in FEAT_SVE2 related to bitwise operations. They are similar to the SVE scatter store methods.

This list was auto generated from the C ACLE for SVE, and is in three parts:

The methods list reduced down to Vector versions. All possible varaints of T are given above the method. The complete list of all methods. The corresponding ACLE methods and SVE instructions are given above the method. All rejected ACLE methods. These are methods we have agreed that do not need including in C#. Where possible, existing C# naming conventions have been matched.

Many of the C functions include predicate argument(s), of type svbool_t as the first argument. These are missing from the C# method. It is expected that the Jit will create predicates where required, or combine with uses of conditionalSelect(). For more discussion see https://github.com/dotnet/runtime/issues/88140 comment.

a74nh commented 1 year ago

Updated to reflect review comments from other API proposals.

a74nh commented 2 months ago

Updated to match implemented SVE1 methods.