Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[API Proposal]: Arm64: FEAT_SVE: scatter stores #94014

Open
a74nh opened this issue Oct 26, 2023 · 9 comments
Open

[API Proposal]: Arm64: FEAT_SVE: scatter stores #94014

a74nh opened this issue Oct 26, 2023 · 9 comments
Labels
api-approved API was approved in API review, it can be implemented area-System.Runtime.Intrinsics arm-sve Work related to arm64 SVE/SVE2 support
Milestone

Comments

@a74nh
Copy link
Contributor

a74nh commented Oct 26, 2023

namespace System.Runtime.Intrinsics.Arm;

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

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

  /// T: [float, int], [int, int], [uint, int], [float, uint], [int, uint], [uint, uint], [double, long], [long, long], [ulong, long], [double, ulong], [long, ulong], [ulong, ulong]
  public static unsafe void Scatter(Vector<T> mask, T* address, Vector<T2> indices, Vector<T> data); // ST1W or ST1D

  /// T: [float, int], [int, int], [uint, int], [float, uint], [int, uint], [uint, uint], [double, long], [long, long], [ulong, long], [double, ulong], [long, ulong], [ulong, ulong]
  public static unsafe void ScatterWithByteOffsets(Vector<T> mask, T* address, Vector<T2> offsets, Vector<T> data); // ST1W or ST1D

  public static unsafe void Scatter16BitNarrowing(Vector<int> mask, Vector<uint> addresses, Vector<int> data); // ST1H

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

  public static unsafe void Scatter16BitWithByteOffsetsNarrowing(Vector<uint> mask, ushort* address, Vector<int> offsets, Vector<uint> data); // ST1H

  public static unsafe void Scatter16BitNarrowing(Vector<int> mask, short* address, Vector<int> indices, Vector<int> data); // ST1H

  public static unsafe void Scatter16BitNarrowing(Vector<uint> mask, ushort* address, Vector<int> indices, Vector<uint> data); // ST1H

  public static unsafe void Scatter8BitNarrowing(Vector<int> mask, Vector<uint> addresses, Vector<int> data); // ST1B

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

  public static unsafe void Scatter8BitWithByteOffsetsNarrowing(Vector<uint> mask, byte* address, Vector<int> offsets, Vector<uint> data); // ST1B

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

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

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

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

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

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

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

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

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

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

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

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

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

  public static unsafe void Scatter8BitNarrowing(Vector<uint> mask, Vector<uint> addresses, Vector<uint> data); // ST1B

  public static unsafe void Scatter8BitWithByteOffsetsNarrowing(Vector<int> mask, sbyte* address, Vector<uint> offsets, Vector<int> data); // ST1B

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

  public static unsafe void Scatter16BitNarrowing(Vector<uint> mask, Vector<uint> addresses, Vector<uint> data); // ST1H

  public static unsafe void Scatter16BitWithByteOffsetsNarrowing(Vector<int> mask, short* address, Vector<uint> offsets, Vector<int> data); // ST1H

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

  public static unsafe void Scatter16BitNarrowing(Vector<int> mask, short* address, Vector<uint> indices, Vector<int> data); // ST1H

  public static unsafe void Scatter16BitNarrowing(Vector<uint> mask, ushort* address, Vector<uint> indices, Vector<uint> data); // ST1H

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

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

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

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

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

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

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

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

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

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

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

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

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

  /// total method signatures: 62
}
@ghost ghost added the untriaged New issue has not been triaged by the area owner label Oct 26, 2023
@ghost
Copy link

ghost commented Oct 26, 2023

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

Issue Details
namespace System.Runtime.Intrinsics.Arm

/// VectorT Summary
public abstract class Sve : AdvSimd /// Feature: FEAT_SVE  Category: scatterstores
{
  /// T: [uint, float], [uint, int], [ulong, double], [ulong, long]
  public static unsafe void ScatterStoreVector(Vector<T> bases, Vector<T2> data); // ST1W or ST1D

  /// T: uint, ulong
  public static unsafe void ScatterStoreVector(Vector<T> bases, Vector<T> data); // ST1W or ST1D

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

  /// T: int, uint, long, ulong
  public static unsafe void ScatterStoreVector(T *base, Vector<T> offsets, Vector<T> data); // ST1W or ST1D

  /// T: [int, float], [int, uint], [uint, float], [uint, int], [long, double], [long, ulong], [ulong, double], [ulong, long]
  public static unsafe void ScatterStoreVector(T2 *base, Vector<T> indices, Vector<T2> data); // ST1W or ST1D

  /// T: int, uint, long, ulong
  public static unsafe void ScatterStoreVector(T *base, Vector<T> indices, Vector<T> data); // ST1W or ST1D

  /// T: [uint, float], [uint, int], [ulong, double], [ulong, long]
  public static unsafe void ScatterStoreVector(Vector<T> bases, long offset, Vector<T2> data); // ST1W or ST1D

  /// T: uint, ulong
  public static unsafe void ScatterStoreVector(Vector<T> bases, long offset, Vector<T> data); // ST1W or ST1D

  /// T: [uint, float], [uint, int], [ulong, double], [ulong, long]
  public static unsafe void ScatterStoreVector(Vector<T> bases, long index, Vector<T2> data); // ST1W or ST1D

  /// T: uint, ulong
  public static unsafe void ScatterStoreVector(Vector<T> bases, long index, Vector<T> data); // ST1W or ST1D

  /// T: [uint, int], [ulong, long]
  public static unsafe void ScatterStoreVectorTruncate16(Vector<T> bases, Vector<T2> data); // ST1H

  /// T: uint, ulong
  public static unsafe void ScatterStoreVectorTruncate16(Vector<T> bases, Vector<T> data); // ST1H

  /// T: int, long
  public static unsafe void ScatterStoreVectorTruncate16(short *base, Vector<T> offsets, Vector<T> data); // ST1H

  /// T: [int, uint], [long, ulong]
  public static unsafe void ScatterStoreVectorTruncate16(ushort *base, Vector<T> offsets, Vector<T2> data); // ST1H

  /// T: [uint, int], [ulong, long]
  public static unsafe void ScatterStoreVectorTruncate16(short *base, Vector<T> offsets, Vector<T2> data); // ST1H

  /// T: uint, ulong
  public static unsafe void ScatterStoreVectorTruncate16(ushort *base, Vector<T> offsets, Vector<T> data); // ST1H

  /// T: int, long
  public static unsafe void ScatterStoreVectorTruncate16(short *base, Vector<T> indices, Vector<T> data); // ST1H

  /// T: [int, uint], [long, ulong]
  public static unsafe void ScatterStoreVectorTruncate16(ushort *base, Vector<T> indices, Vector<T2> data); // ST1H

  /// T: [uint, int], [ulong, long]
  public static unsafe void ScatterStoreVectorTruncate16(short *base, Vector<T> indices, Vector<T2> data); // ST1H

  /// T: uint, ulong
  public static unsafe void ScatterStoreVectorTruncate16(ushort *base, Vector<T> indices, Vector<T> data); // ST1H

  /// T: [uint, int], [ulong, long]
  public static unsafe void ScatterStoreVectorTruncate16(Vector<T> bases, long offset, Vector<T2> data); // ST1H

  /// T: uint, ulong
  public static unsafe void ScatterStoreVectorTruncate16(Vector<T> bases, long offset, Vector<T> data); // ST1H

  /// T: [uint, int], [ulong, long]
  public static unsafe void ScatterStoreVectorTruncate16(Vector<T> bases, long index, Vector<T2> data); // ST1H

  /// T: uint, ulong
  public static unsafe void ScatterStoreVectorTruncate16(Vector<T> bases, long index, Vector<T> data); // ST1H

  public static unsafe void ScatterStoreVectorTruncate32(Vector<ulong> bases, Vector<long> data);

  public static unsafe void ScatterStoreVectorTruncate32(Vector<ulong> bases, Vector<ulong> data);

  public static unsafe void ScatterStoreVectorTruncate32(int *base, Vector<long> offsets, Vector<long> data);

  public static unsafe void ScatterStoreVectorTruncate32(uint *base, Vector<long> offsets, Vector<ulong> data);

  public static unsafe void ScatterStoreVectorTruncate32(int *base, Vector<ulong> offsets, Vector<long> data);

  public static unsafe void ScatterStoreVectorTruncate32(uint *base, Vector<ulong> offsets, Vector<ulong> data);

  public static unsafe void ScatterStoreVectorTruncate32(int *base, Vector<long> indices, Vector<long> data);

  public static unsafe void ScatterStoreVectorTruncate32(uint *base, Vector<long> indices, Vector<ulong> data);

  public static unsafe void ScatterStoreVectorTruncate32(int *base, Vector<ulong> indices, Vector<long> data);

  public static unsafe void ScatterStoreVectorTruncate32(uint *base, Vector<ulong> indices, Vector<ulong> data);

  public static unsafe void ScatterStoreVectorTruncate32(Vector<ulong> bases, long offset, Vector<long> data);

  public static unsafe void ScatterStoreVectorTruncate32(Vector<ulong> bases, long offset, Vector<ulong> data);

  public static unsafe void ScatterStoreVectorTruncate32(Vector<ulong> bases, long index, Vector<long> data);

  public static unsafe void ScatterStoreVectorTruncate32(Vector<ulong> bases, long index, Vector<ulong> data);

  /// T: [uint, int], [ulong, long]
  public static unsafe void ScatterStoreVectorTruncate8(Vector<T> bases, Vector<T2> data); // ST1B

  /// T: uint, ulong
  public static unsafe void ScatterStoreVectorTruncate8(Vector<T> bases, Vector<T> data); // ST1B

  /// T: int, long
  public static unsafe void ScatterStoreVectorTruncate8(sbyte *base, Vector<T> offsets, Vector<T> data); // ST1B

  /// T: [int, uint], [long, ulong]
  public static unsafe void ScatterStoreVectorTruncate8(byte *base, Vector<T> offsets, Vector<T2> data); // ST1B

  /// T: [uint, int], [ulong, long]
  public static unsafe void ScatterStoreVectorTruncate8(sbyte *base, Vector<T> offsets, Vector<T2> data); // ST1B

  /// T: uint, ulong
  public static unsafe void ScatterStoreVectorTruncate8(byte *base, Vector<T> offsets, Vector<T> data); // ST1B

  /// T: [uint, int], [ulong, long]
  public static unsafe void ScatterStoreVectorTruncate8(Vector<T> bases, long offset, Vector<T2> data); // ST1B

  /// T: uint, ulong
  public static unsafe void ScatterStoreVectorTruncate8(Vector<T> bases, long offset, Vector<T> data); // ST1B

  /// total method signatures: 46
}
Author: a74nh
Assignees: -
Labels:

area-System.Runtime.Intrinsics

Milestone: -

@a74nh
Copy link
Contributor Author

a74nh commented Oct 26, 2023

/// Full API
public abstract partial class Sve : AdvSimd /// Feature: FEAT_SVE  Category: scatterstores
{
    /// Scatter : Non-truncating store

    /// void svst1_scatter[_u32base_f32](svbool_t pg, svuint32_t bases, svfloat32_t data) : "ST1W Zdata.S, Pg, [Zbases.S, #0]"
  public static unsafe void Scatter(Vector<float> mask, Vector<uint> bases, Vector<float> data);

    /// void svst1_scatter[_u32base_s32](svbool_t pg, svuint32_t bases, svint32_t data) : "ST1W Zdata.S, Pg, [Zbases.S, #0]"
  public static unsafe void Scatter(Vector<int> mask, Vector<uint> bases, Vector<int> data);

    /// void svst1_scatter[_u32base_u32](svbool_t pg, svuint32_t bases, svuint32_t data) : "ST1W Zdata.S, Pg, [Zbases.S, #0]"
  public static unsafe void Scatter(Vector<uint> mask, Vector<uint> bases, Vector<uint> data);

    /// void svst1_scatter[_u64base_f64](svbool_t pg, svuint64_t bases, svfloat64_t data) : "ST1D Zdata.D, Pg, [Zbases.D, #0]"
  public static unsafe void Scatter(Vector<double> mask, Vector<ulong> bases, Vector<double> data);

    /// void svst1_scatter[_u64base_s64](svbool_t pg, svuint64_t bases, svint64_t data) : "ST1D Zdata.D, Pg, [Zbases.D, #0]"
  public static unsafe void Scatter(Vector<long> mask, Vector<ulong> bases, Vector<long> data);

    /// void svst1_scatter[_u64base_u64](svbool_t pg, svuint64_t bases, svuint64_t data) : "ST1D Zdata.D, Pg, [Zbases.D, #0]"
  public static unsafe void Scatter(Vector<ulong> mask, Vector<ulong> bases, Vector<ulong> data);

    /// void svst1_scatter_[s32]offset[_f32](svbool_t pg, float32_t *base, svint32_t offsets, svfloat32_t data) : "ST1W Zdata.S, Pg, [Xbase, Zoffsets.S, SXTW]"
  public static unsafe void Scatter(Vector<float> mask, float* base, Vector<int> offsets, Vector<float> data);

    /// void svst1_scatter_[s32]offset[_s32](svbool_t pg, int32_t *base, svint32_t offsets, svint32_t data) : "ST1W Zdata.S, Pg, [Xbase, Zoffsets.S, SXTW]"
  public static unsafe void Scatter(Vector<int> mask, int* base, Vector<int> offsets, Vector<int> data);

    /// void svst1_scatter_[s32]offset[_u32](svbool_t pg, uint32_t *base, svint32_t offsets, svuint32_t data) : "ST1W Zdata.S, Pg, [Xbase, Zoffsets.S, SXTW]"
  public static unsafe void Scatter(Vector<uint> mask, uint* base, Vector<int> offsets, Vector<uint> data);

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

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

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

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

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

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

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

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

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

    /// void svst1_scatter_[s32]index[_f32](svbool_t pg, float32_t *base, svint32_t indices, svfloat32_t data) : "ST1W Zdata.S, Pg, [Xbase, Zindices.S, SXTW #2]"
  public static unsafe void Scatter(Vector<float> mask, float* base, Vector<int> indices, Vector<float> data);

    /// void svst1_scatter_[s32]index[_s32](svbool_t pg, int32_t *base, svint32_t indices, svint32_t data) : "ST1W Zdata.S, Pg, [Xbase, Zindices.S, SXTW #2]"
  public static unsafe void Scatter(Vector<int> mask, int* base, Vector<int> indices, Vector<int> data);

    /// void svst1_scatter_[s32]index[_u32](svbool_t pg, uint32_t *base, svint32_t indices, svuint32_t data) : "ST1W Zdata.S, Pg, [Xbase, Zindices.S, SXTW #2]"
  public static unsafe void Scatter(Vector<uint> mask, uint* base, Vector<int> indices, Vector<uint> data);

    /// void svst1_scatter_[u32]index[_f32](svbool_t pg, float32_t *base, svuint32_t indices, svfloat32_t data) : "ST1W Zdata.S, Pg, [Xbase, Zindices.S, UXTW #2]"
  public static unsafe void Scatter(Vector<float> mask, float* base, Vector<uint> indices, Vector<float> data);

    /// void svst1_scatter_[u32]index[_s32](svbool_t pg, int32_t *base, svuint32_t indices, svint32_t data) : "ST1W Zdata.S, Pg, [Xbase, Zindices.S, UXTW #2]"
  public static unsafe void Scatter(Vector<int> mask, int* base, Vector<uint> indices, Vector<int> data);

    /// void svst1_scatter_[u32]index[_u32](svbool_t pg, uint32_t *base, svuint32_t indices, svuint32_t data) : "ST1W Zdata.S, Pg, [Xbase, Zindices.S, UXTW #2]"
  public static unsafe void Scatter(Vector<uint> mask, uint* base, Vector<uint> indices, Vector<uint> data);

    /// void svst1_scatter_[s64]index[_f64](svbool_t pg, float64_t *base, svint64_t indices, svfloat64_t data) : "ST1D Zdata.D, Pg, [Xbase, Zindices.D, LSL #3]"
  public static unsafe void Scatter(Vector<double> mask, double* base, Vector<long> indices, Vector<double> data);

    /// void svst1_scatter_[s64]index[_s64](svbool_t pg, int64_t *base, svint64_t indices, svint64_t data) : "ST1D Zdata.D, Pg, [Xbase, Zindices.D, LSL #3]"
  public static unsafe void Scatter(Vector<long> mask, long* base, Vector<long> indices, Vector<long> data);

    /// void svst1_scatter_[s64]index[_u64](svbool_t pg, uint64_t *base, svint64_t indices, svuint64_t data) : "ST1D Zdata.D, Pg, [Xbase, Zindices.D, LSL #3]"
  public static unsafe void Scatter(Vector<ulong> mask, ulong* base, Vector<long> indices, Vector<ulong> data);

    /// void svst1_scatter_[u64]index[_f64](svbool_t pg, float64_t *base, svuint64_t indices, svfloat64_t data) : "ST1D Zdata.D, Pg, [Xbase, Zindices.D, LSL #3]"
  public static unsafe void Scatter(Vector<double> mask, double* base, Vector<ulong> indices, Vector<double> data);

    /// void svst1_scatter_[u64]index[_s64](svbool_t pg, int64_t *base, svuint64_t indices, svint64_t data) : "ST1D Zdata.D, Pg, [Xbase, Zindices.D, LSL #3]"
  public static unsafe void Scatter(Vector<long> mask, long* base, Vector<ulong> indices, Vector<long> data);

    /// void svst1_scatter_[u64]index[_u64](svbool_t pg, uint64_t *base, svuint64_t indices, svuint64_t data) : "ST1D Zdata.D, Pg, [Xbase, Zindices.D, LSL #3]"
  public static unsafe void Scatter(Vector<ulong> mask, ulong* base, Vector<ulong> indices, Vector<ulong> data);

    /// void svst1_scatter[_u32base]_offset[_f32](svbool_t pg, svuint32_t bases, int64_t offset, svfloat32_t data) : "ST1W Zdata.S, Pg, [Zbases.S, #offset]" or "ST1W Zdata.S, Pg, [Xoffset, Zbases.S, UXTW]"
  public static unsafe void Scatter(Vector<float> mask, Vector<uint> bases, long offset, Vector<float> data);

    /// void svst1_scatter[_u32base]_offset[_s32](svbool_t pg, svuint32_t bases, int64_t offset, svint32_t data) : "ST1W Zdata.S, Pg, [Zbases.S, #offset]" or "ST1W Zdata.S, Pg, [Xoffset, Zbases.S, UXTW]"
  public static unsafe void Scatter(Vector<int> mask, Vector<uint> bases, long offset, Vector<int> data);

    /// void svst1_scatter[_u32base]_offset[_u32](svbool_t pg, svuint32_t bases, int64_t offset, svuint32_t data) : "ST1W Zdata.S, Pg, [Zbases.S, #offset]" or "ST1W Zdata.S, Pg, [Xoffset, Zbases.S, UXTW]"
  public static unsafe void Scatter(Vector<uint> mask, Vector<uint> bases, long offset, Vector<uint> data);

    /// void svst1_scatter[_u64base]_offset[_f64](svbool_t pg, svuint64_t bases, int64_t offset, svfloat64_t data) : "ST1D Zdata.D, Pg, [Zbases.D, #offset]" or "ST1D Zdata.D, Pg, [Xoffset, Zbases.D]"
  public static unsafe void Scatter(Vector<double> mask, Vector<ulong> bases, long offset, Vector<double> data);

    /// void svst1_scatter[_u64base]_offset[_s64](svbool_t pg, svuint64_t bases, int64_t offset, svint64_t data) : "ST1D Zdata.D, Pg, [Zbases.D, #offset]" or "ST1D Zdata.D, Pg, [Xoffset, Zbases.D]"
  public static unsafe void Scatter(Vector<long> mask, Vector<ulong> bases, long offset, Vector<long> data);

    /// void svst1_scatter[_u64base]_offset[_u64](svbool_t pg, svuint64_t bases, int64_t offset, svuint64_t data) : "ST1D Zdata.D, Pg, [Zbases.D, #offset]" or "ST1D Zdata.D, Pg, [Xoffset, Zbases.D]"
  public static unsafe void Scatter(Vector<ulong> mask, Vector<ulong> bases, long offset, Vector<ulong> data);

    /// void svst1_scatter[_u32base]_index[_f32](svbool_t pg, svuint32_t bases, int64_t index, svfloat32_t data) : "ST1W Zdata.S, Pg, [Zbases.S, #index * 4]" or "ST1W Zdata.S, Pg, [Xoffset, Zbases.S, UXTW]"
  public static unsafe void Scatter(Vector<float> mask, Vector<uint> bases, long index, Vector<float> data);

    /// void svst1_scatter[_u32base]_index[_s32](svbool_t pg, svuint32_t bases, int64_t index, svint32_t data) : "ST1W Zdata.S, Pg, [Zbases.S, #index * 4]" or "ST1W Zdata.S, Pg, [Xoffset, Zbases.S, UXTW]"
  public static unsafe void Scatter(Vector<int> mask, Vector<uint> bases, long index, Vector<int> data);

    /// void svst1_scatter[_u32base]_index[_u32](svbool_t pg, svuint32_t bases, int64_t index, svuint32_t data) : "ST1W Zdata.S, Pg, [Zbases.S, #index * 4]" or "ST1W Zdata.S, Pg, [Xoffset, Zbases.S, UXTW]"
  public static unsafe void Scatter(Vector<uint> mask, Vector<uint> bases, long index, Vector<uint> data);

    /// void svst1_scatter[_u64base]_index[_f64](svbool_t pg, svuint64_t bases, int64_t index, svfloat64_t data) : "ST1D Zdata.D, Pg, [Zbases.D, #index * 8]" or "ST1D Zdata.D, Pg, [Xoffset, Zbases.D]"
  public static unsafe void Scatter(Vector<double> mask, Vector<ulong> bases, long index, Vector<double> data);

    /// void svst1_scatter[_u64base]_index[_s64](svbool_t pg, svuint64_t bases, int64_t index, svint64_t data) : "ST1D Zdata.D, Pg, [Zbases.D, #index * 8]" or "ST1D Zdata.D, Pg, [Xoffset, Zbases.D]"
  public static unsafe void Scatter(Vector<long> mask, Vector<ulong> bases, long index, Vector<long> data);

    /// void svst1_scatter[_u64base]_index[_u64](svbool_t pg, svuint64_t bases, int64_t index, svuint64_t data) : "ST1D Zdata.D, Pg, [Zbases.D, #index * 8]" or "ST1D Zdata.D, Pg, [Xoffset, Zbases.D]"
  public static unsafe void Scatter(Vector<ulong> mask, Vector<ulong> bases, long index, Vector<ulong> data);


    /// ScatterInt32NarrowToInt16 : Truncate to 16 bits and store

    /// void svst1h_scatter[_u32base_s32](svbool_t pg, svuint32_t bases, svint32_t data) : "ST1H Zdata.S, Pg, [Zbases.S, #0]"
  public static unsafe void ScatterInt32NarrowToInt16(Vector<int> mask, Vector<uint> bases, Vector<int> data);

    /// void svst1h_scatter_[s32]offset[_s32](svbool_t pg, int16_t *base, svint32_t offsets, svint32_t data) : "ST1H Zdata.S, Pg, [Xbase, Zoffsets.S, SXTW]"
  public static unsafe void ScatterInt32NarrowToInt16(Vector<int> mask, short* base, Vector<int> offsets, Vector<int> data);

    /// void svst1h_scatter_[s32]offset[_u32](svbool_t pg, uint16_t *base, svint32_t offsets, svuint32_t data) : "ST1H Zdata.S, Pg, [Xbase, Zoffsets.S, SXTW]"
  public static unsafe void ScatterInt32NarrowToInt16(Vector<uint> mask, ushort* base, Vector<int> offsets, Vector<uint> data);

    /// void svst1h_scatter_[s32]index[_s32](svbool_t pg, int16_t *base, svint32_t indices, svint32_t data) : "ST1H Zdata.S, Pg, [Xbase, Zindices.S, SXTW #1]"
  public static unsafe void ScatterInt32NarrowToInt16(Vector<int> mask, short* base, Vector<int> indices, Vector<int> data);

    /// void svst1h_scatter_[s32]index[_u32](svbool_t pg, uint16_t *base, svint32_t indices, svuint32_t data) : "ST1H Zdata.S, Pg, [Xbase, Zindices.S, SXTW #1]"
  public static unsafe void ScatterInt32NarrowToInt16(Vector<uint> mask, ushort* base, Vector<int> indices, Vector<uint> data);


    /// ScatterInt32NarrowToSByte : Truncate to 8 bits and store

    /// void svst1b_scatter[_u32base_s32](svbool_t pg, svuint32_t bases, svint32_t data) : "ST1B Zdata.S, Pg, [Zbases.S, #0]"
  public static unsafe void ScatterInt32NarrowToSByte(Vector<int> mask, Vector<uint> bases, Vector<int> data);

    /// void svst1b_scatter_[s32]offset[_s32](svbool_t pg, int8_t *base, svint32_t offsets, svint32_t data) : "ST1B Zdata.S, Pg, [Xbase, Zoffsets.S, SXTW]"
  public static unsafe void ScatterInt32NarrowToSByte(Vector<int> mask, sbyte* base, Vector<int> offsets, Vector<int> data);

    /// void svst1b_scatter_[s32]offset[_u32](svbool_t pg, uint8_t *base, svint32_t offsets, svuint32_t data) : "ST1B Zdata.S, Pg, [Xbase, Zoffsets.S, SXTW]"
  public static unsafe void ScatterInt32NarrowToSByte(Vector<uint> mask, byte* base, Vector<int> offsets, Vector<uint> data);


    /// ScatterInt64NarrowToInt16 : Truncate to 16 bits and store

    /// void svst1h_scatter[_u64base_s64](svbool_t pg, svuint64_t bases, svint64_t data) : "ST1H Zdata.D, Pg, [Zbases.D, #0]"
  public static unsafe void ScatterInt64NarrowToInt16(Vector<long> mask, Vector<ulong> bases, Vector<long> data);

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

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

    /// void svst1h_scatter_[s64]index[_s64](svbool_t pg, int16_t *base, svint64_t indices, svint64_t data) : "ST1H Zdata.D, Pg, [Xbase, Zindices.D, LSL #1]"
  public static unsafe void ScatterInt64NarrowToInt16(Vector<long> mask, short* base, Vector<long> indices, Vector<long> data);

    /// void svst1h_scatter_[s64]index[_u64](svbool_t pg, uint16_t *base, svint64_t indices, svuint64_t data) : "ST1H Zdata.D, Pg, [Xbase, Zindices.D, LSL #1]"
  public static unsafe void ScatterInt64NarrowToInt16(Vector<ulong> mask, ushort* base, Vector<long> indices, Vector<ulong> data);


    /// ScatterInt64NarrowToInt32 : Truncate to 32 bits and store

    /// void svst1w_scatter[_u64base_s64](svbool_t pg, svuint64_t bases, svint64_t data) : "ST1W Zdata.D, Pg, [Zbases.D, #0]"
  public static unsafe void ScatterInt64NarrowToInt32(Vector<long> mask, Vector<ulong> bases, Vector<long> data);

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

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

    /// void svst1w_scatter_[s64]index[_s64](svbool_t pg, int32_t *base, svint64_t indices, svint64_t data) : "ST1W Zdata.D, Pg, [Xbase, Zindices.D, LSL #2]"
  public static unsafe void ScatterInt64NarrowToInt32(Vector<long> mask, int* base, Vector<long> indices, Vector<long> data);

    /// void svst1w_scatter_[s64]index[_u64](svbool_t pg, uint32_t *base, svint64_t indices, svuint64_t data) : "ST1W Zdata.D, Pg, [Xbase, Zindices.D, LSL #2]"
  public static unsafe void ScatterInt64NarrowToInt32(Vector<ulong> mask, uint* base, Vector<long> indices, Vector<ulong> data);


    /// ScatterInt64NarrowToSByte : Truncate to 8 bits and store

    /// void svst1b_scatter[_u64base_s64](svbool_t pg, svuint64_t bases, svint64_t data) : "ST1B Zdata.D, Pg, [Zbases.D, #0]"
  public static unsafe void ScatterInt64NarrowToSByte(Vector<long> mask, Vector<ulong> bases, Vector<long> data);

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

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


    /// ScatterTruncate16UInt16 : Truncate to 16 bits and store

    /// void svst1h_scatter[_u32base]_offset[_s32](svbool_t pg, svuint32_t bases, int64_t offset, svint32_t data) : "ST1H Zdata.S, Pg, [Zbases.S, #offset]" or "ST1H Zdata.S, Pg, [Xoffset, Zbases.S, UXTW]"
  public static unsafe void ScatterTruncate16UInt16(Vector<int> mask, Vector<uint> bases, long offset, Vector<int> data);

    /// void svst1h_scatter[_u32base]_offset[_u32](svbool_t pg, svuint32_t bases, int64_t offset, svuint32_t data) : "ST1H Zdata.S, Pg, [Zbases.S, #offset]" or "ST1H Zdata.S, Pg, [Xoffset, Zbases.S, UXTW]"
  public static unsafe void ScatterTruncate16UInt16(Vector<uint> mask, Vector<uint> bases, long offset, Vector<uint> data);

    /// void svst1h_scatter[_u64base]_offset[_s64](svbool_t pg, svuint64_t bases, int64_t offset, svint64_t data) : "ST1H Zdata.D, Pg, [Zbases.D, #offset]" or "ST1H Zdata.D, Pg, [Xoffset, Zbases.D]"
  public static unsafe void ScatterTruncate16UInt16(Vector<long> mask, Vector<ulong> bases, long offset, Vector<long> data);

    /// void svst1h_scatter[_u64base]_offset[_u64](svbool_t pg, svuint64_t bases, int64_t offset, svuint64_t data) : "ST1H Zdata.D, Pg, [Zbases.D, #offset]" or "ST1H Zdata.D, Pg, [Xoffset, Zbases.D]"
  public static unsafe void ScatterTruncate16UInt16(Vector<ulong> mask, Vector<ulong> bases, long offset, Vector<ulong> data);

    /// void svst1h_scatter[_u32base]_index[_s32](svbool_t pg, svuint32_t bases, int64_t index, svint32_t data) : "ST1H Zdata.S, Pg, [Zbases.S, #index * 2]" or "ST1H Zdata.S, Pg, [Xoffset, Zbases.S, UXTW]"
  public static unsafe void ScatterTruncate16UInt16(Vector<int> mask, Vector<uint> bases, long index, Vector<int> data);

    /// void svst1h_scatter[_u32base]_index[_u32](svbool_t pg, svuint32_t bases, int64_t index, svuint32_t data) : "ST1H Zdata.S, Pg, [Zbases.S, #index * 2]" or "ST1H Zdata.S, Pg, [Xoffset, Zbases.S, UXTW]"
  public static unsafe void ScatterTruncate16UInt16(Vector<uint> mask, Vector<uint> bases, long index, Vector<uint> data);

    /// void svst1h_scatter[_u64base]_index[_s64](svbool_t pg, svuint64_t bases, int64_t index, svint64_t data) : "ST1H Zdata.D, Pg, [Zbases.D, #index * 2]" or "ST1H Zdata.D, Pg, [Xoffset, Zbases.D]"
  public static unsafe void ScatterTruncate16UInt16(Vector<long> mask, Vector<ulong> bases, long index, Vector<long> data);

    /// void svst1h_scatter[_u64base]_index[_u64](svbool_t pg, svuint64_t bases, int64_t index, svuint64_t data) : "ST1H Zdata.D, Pg, [Zbases.D, #index * 2]" or "ST1H Zdata.D, Pg, [Xoffset, Zbases.D]"
  public static unsafe void ScatterTruncate16UInt16(Vector<ulong> mask, Vector<ulong> bases, long index, Vector<ulong> data);


    /// ScatterTruncate32UInt32 : Truncate to 32 bits and store

    /// void svst1w_scatter[_u64base]_offset[_s64](svbool_t pg, svuint64_t bases, int64_t offset, svint64_t data) : "ST1W Zdata.D, Pg, [Zbases.D, #offset]" or "ST1W Zdata.D, Pg, [Xoffset, Zbases.D]"
  public static unsafe void ScatterTruncate32UInt32(Vector<long> mask, Vector<ulong> bases, long offset, Vector<long> data);

    /// void svst1w_scatter[_u64base]_offset[_u64](svbool_t pg, svuint64_t bases, int64_t offset, svuint64_t data) : "ST1W Zdata.D, Pg, [Zbases.D, #offset]" or "ST1W Zdata.D, Pg, [Xoffset, Zbases.D]"
  public static unsafe void ScatterTruncate32UInt32(Vector<ulong> mask, Vector<ulong> bases, long offset, Vector<ulong> data);

    /// void svst1w_scatter[_u64base]_index[_s64](svbool_t pg, svuint64_t bases, int64_t index, svint64_t data) : "ST1W Zdata.D, Pg, [Zbases.D, #index * 4]" or "ST1W Zdata.D, Pg, [Xoffset, Zbases.D]"
  public static unsafe void ScatterTruncate32UInt32(Vector<long> mask, Vector<ulong> bases, long index, Vector<long> data);

    /// void svst1w_scatter[_u64base]_index[_u64](svbool_t pg, svuint64_t bases, int64_t index, svuint64_t data) : "ST1W Zdata.D, Pg, [Zbases.D, #index * 4]" or "ST1W Zdata.D, Pg, [Xoffset, Zbases.D]"
  public static unsafe void ScatterTruncate32UInt32(Vector<ulong> mask, Vector<ulong> bases, long index, Vector<ulong> data);


    /// ScatterTruncate8Byte : Truncate to 8 bits and store

    /// void svst1b_scatter[_u32base]_offset[_s32](svbool_t pg, svuint32_t bases, int64_t offset, svint32_t data) : "ST1B Zdata.S, Pg, [Zbases.S, #offset]" or "ST1B Zdata.S, Pg, [Xoffset, Zbases.S, UXTW]"
  public static unsafe void ScatterTruncate8Byte(Vector<int> mask, Vector<uint> bases, long offset, Vector<int> data);

    /// void svst1b_scatter[_u32base]_offset[_u32](svbool_t pg, svuint32_t bases, int64_t offset, svuint32_t data) : "ST1B Zdata.S, Pg, [Zbases.S, #offset]" or "ST1B Zdata.S, Pg, [Xoffset, Zbases.S, UXTW]"
  public static unsafe void ScatterTruncate8Byte(Vector<uint> mask, Vector<uint> bases, long offset, Vector<uint> data);

    /// void svst1b_scatter[_u64base]_offset[_s64](svbool_t pg, svuint64_t bases, int64_t offset, svint64_t data) : "ST1B Zdata.D, Pg, [Zbases.D, #offset]" or "ST1B Zdata.D, Pg, [Xoffset, Zbases.D]"
  public static unsafe void ScatterTruncate8Byte(Vector<long> mask, Vector<ulong> bases, long offset, Vector<long> data);

    /// void svst1b_scatter[_u64base]_offset[_u64](svbool_t pg, svuint64_t bases, int64_t offset, svuint64_t data) : "ST1B Zdata.D, Pg, [Zbases.D, #offset]" or "ST1B Zdata.D, Pg, [Xoffset, Zbases.D]"
  public static unsafe void ScatterTruncate8Byte(Vector<ulong> mask, Vector<ulong> bases, long offset, Vector<ulong> data);


    /// ScatterUInt32NarrowToByte : Truncate to 8 bits and store

    /// void svst1b_scatter[_u32base_u32](svbool_t pg, svuint32_t bases, svuint32_t data) : "ST1B Zdata.S, Pg, [Zbases.S, #0]"
  public static unsafe void ScatterUInt32NarrowToByte(Vector<uint> mask, Vector<uint> bases, Vector<uint> data);

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

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


    /// ScatterUInt32NarrowToUInt16 : Truncate to 16 bits and store

    /// void svst1h_scatter[_u32base_u32](svbool_t pg, svuint32_t bases, svuint32_t data) : "ST1H Zdata.S, Pg, [Zbases.S, #0]"
  public static unsafe void ScatterUInt32NarrowToUInt16(Vector<uint> mask, Vector<uint> bases, Vector<uint> data);

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

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

    /// void svst1h_scatter_[u32]index[_s32](svbool_t pg, int16_t *base, svuint32_t indices, svint32_t data) : "ST1H Zdata.S, Pg, [Xbase, Zindices.S, UXTW #1]"
  public static unsafe void ScatterUInt32NarrowToUInt16(Vector<int> mask, short* base, Vector<uint> indices, Vector<int> data);

    /// void svst1h_scatter_[u32]index[_u32](svbool_t pg, uint16_t *base, svuint32_t indices, svuint32_t data) : "ST1H Zdata.S, Pg, [Xbase, Zindices.S, UXTW #1]"
  public static unsafe void ScatterUInt32NarrowToUInt16(Vector<uint> mask, ushort* base, Vector<uint> indices, Vector<uint> data);


    /// ScatterUInt64NarrowToByte : Truncate to 8 bits and store

    /// void svst1b_scatter[_u64base_u64](svbool_t pg, svuint64_t bases, svuint64_t data) : "ST1B Zdata.D, Pg, [Zbases.D, #0]"
  public static unsafe void ScatterUInt64NarrowToByte(Vector<ulong> mask, Vector<ulong> bases, Vector<ulong> data);

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

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


    /// ScatterUInt64NarrowToUInt16 : Truncate to 16 bits and store

    /// void svst1h_scatter[_u64base_u64](svbool_t pg, svuint64_t bases, svuint64_t data) : "ST1H Zdata.D, Pg, [Zbases.D, #0]"
  public static unsafe void ScatterUInt64NarrowToUInt16(Vector<ulong> mask, Vector<ulong> bases, Vector<ulong> data);

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

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

    /// void svst1h_scatter_[u64]index[_s64](svbool_t pg, int16_t *base, svuint64_t indices, svint64_t data) : "ST1H Zdata.D, Pg, [Xbase, Zindices.D, LSL #1]"
  public static unsafe void ScatterUInt64NarrowToUInt16(Vector<long> mask, short* base, Vector<ulong> indices, Vector<long> data);

    /// void svst1h_scatter_[u64]index[_u64](svbool_t pg, uint16_t *base, svuint64_t indices, svuint64_t data) : "ST1H Zdata.D, Pg, [Xbase, Zindices.D, LSL #1]"
  public static unsafe void ScatterUInt64NarrowToUInt16(Vector<ulong> mask, ushort* base, Vector<ulong> indices, Vector<ulong> data);


    /// ScatterUInt64NarrowToUInt32 : Truncate to 32 bits and store

    /// void svst1w_scatter[_u64base_u64](svbool_t pg, svuint64_t bases, svuint64_t data) : "ST1W Zdata.D, Pg, [Zbases.D, #0]"
  public static unsafe void ScatterUInt64NarrowToUInt32(Vector<ulong> mask, Vector<ulong> bases, Vector<ulong> data);

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

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

    /// void svst1w_scatter_[u64]index[_s64](svbool_t pg, int32_t *base, svuint64_t indices, svint64_t data) : "ST1W Zdata.D, Pg, [Xbase, Zindices.D, LSL #2]"
  public static unsafe void ScatterUInt64NarrowToUInt32(Vector<long> mask, int* base, Vector<ulong> indices, Vector<long> data);

    /// void svst1w_scatter_[u64]index[_u64](svbool_t pg, uint32_t *base, svuint64_t indices, svuint64_t data) : "ST1W Zdata.D, Pg, [Xbase, Zindices.D, LSL #2]"
  public static unsafe void ScatterUInt64NarrowToUInt32(Vector<ulong> mask, uint* base, Vector<ulong> indices, Vector<ulong> data);


  /// total method signatures: 100
  /// total method names:      14
}


  /// Total ACLE covered across API:      100

@a74nh
Copy link
Contributor Author

a74nh commented Oct 26, 2023

/// Rejected:
/// None yet

@a74nh
Copy link
Contributor Author

a74nh commented Oct 26, 2023

This contributes to #93095

It covers instructions in FEAT_SVE related to scatter stores - the inverse of gather loads

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 #88140 comment.

@tannergooding tannergooding added the api-suggestion Early API idea and discussion, it is NOT ready for implementation label Oct 26, 2023
@tannergooding tannergooding added this to the 9.0.0 milestone Oct 26, 2023
@ghost ghost removed the untriaged New issue has not been triaged by the area owner label Oct 26, 2023
@tannergooding
Copy link
Member

For xarch, we just use the term Scatter, we don't specify it as ScatterStore. We could probably do the same here for simplicity.

Otherwise the same general comments apply as the main Store API.

@tannergooding tannergooding added the needs-author-action An issue or pull request that requires more info or actions from the author. label Oct 26, 2023
@ghost
Copy link

ghost commented Oct 26, 2023

This issue has been marked needs-author-action and may be missing some important information.

@a74nh
Copy link
Contributor Author

a74nh commented Oct 31, 2023

For xarch, we just use the term Scatter, we don't specify it as ScatterStore. We could probably do the same here for simplicity.

Otherwise the same general comments apply as the main Store API.

All done.

@ghost ghost added needs-further-triage Issue has been initially triaged, but needs deeper consideration or reconsideration and removed needs-author-action An issue or pull request that requires more info or actions from the author. labels Oct 31, 2023
@tannergooding tannergooding added api-ready-for-review API is ready for review, it is NOT ready for implementation and removed api-suggestion Early API idea and discussion, it is NOT ready for implementation needs-further-triage Issue has been initially triaged, but needs deeper consideration or reconsideration labels Oct 31, 2023
@bartonjs
Copy link
Member

bartonjs commented Feb 8, 2024

Video

  • Because ScatterNarrowing(Vector,Vector,Vector) is an ambiguous overload across saving as 8/16/32 bits, all of the narrowings are renamed to ScatterNBitNarrowing(Vector,Vector,Vector)
    • But the non-narrowing ones can all stay as just Scatter
namespace System.Runtime.Intrinsics.Arm;

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

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

  /// T: [float, int], [int, int], [uint, int], [float, uint], [int, uint], [uint, uint], [double, long], [long, long], [ulong, long], [double, ulong], [long, ulong], [ulong, ulong]
  public static unsafe void Scatter(Vector<T> mask, T* address, Vector<T2> indices, Vector<T> data); // ST1W or ST1D

  /// T: [float, int], [int, int], [uint, int], [float, uint], [int, uint], [uint, uint], [double, long], [long, long], [ulong, long], [double, ulong], [long, ulong], [ulong, ulong]
  public static unsafe void ScatterWithByteOffsets(Vector<T> mask, T* address, Vector<T2> offsets, Vector<T> data); // ST1W or ST1D

  public static unsafe void Scatter16BitNarrowing(Vector<int> mask, Vector<uint> addresses, Vector<int> data); // ST1H

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

  public static unsafe void Scatter16BitWithByteOffsetsNarrowing(Vector<uint> mask, ushort* address, Vector<int> offsets, Vector<uint> data); // ST1H

  public static unsafe void Scatter16BitNarrowing(Vector<int> mask, short* address, Vector<int> indices, Vector<int> data); // ST1H

  public static unsafe void Scatter16BitNarrowing(Vector<uint> mask, ushort* address, Vector<int> indices, Vector<uint> data); // ST1H

  public static unsafe void Scatter8BitNarrowing(Vector<int> mask, Vector<uint> addresses, Vector<int> data); // ST1B

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

  public static unsafe void Scatter8BitWithByteOffsetsNarrowing(Vector<uint> mask, byte* address, Vector<int> offsets, Vector<uint> data); // ST1B

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

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

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

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

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

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

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

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

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

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

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

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

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

  public static unsafe void Scatter8BitNarrowing(Vector<uint> mask, Vector<uint> addresses, Vector<uint> data); // ST1B

  public static unsafe void Scatter8BitWithByteOffsetsNarrowing(Vector<int> mask, sbyte* address, Vector<uint> offsets, Vector<int> data); // ST1B

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

  public static unsafe void Scatter16BitNarrowing(Vector<uint> mask, Vector<uint> addresses, Vector<uint> data); // ST1H

  public static unsafe void Scatter16BitWithByteOffsetsNarrowing(Vector<int> mask, short* address, Vector<uint> offsets, Vector<int> data); // ST1H

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

  public static unsafe void Scatter16BitNarrowing(Vector<int> mask, short* address, Vector<uint> indices, Vector<int> data); // ST1H

  public static unsafe void Scatter16BitNarrowing(Vector<uint> mask, ushort* address, Vector<uint> indices, Vector<uint> data); // ST1H

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

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

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

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

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

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

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

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

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

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

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

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

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

  /// total method signatures: 62
}

@bartonjs bartonjs added api-approved API was approved in API review, it can be implemented and removed api-ready-for-review API is ready for review, it is NOT ready for implementation labels Feb 8, 2024
@a74nh
Copy link
Contributor Author

a74nh commented Feb 15, 2024

Trying to match the ByteOffset variants back to the instruction.

Scatter32BitWithByteOffsetsNarrowing - this is the 32-bit unpacked unscaled offset variation from here ?

ScatterWithByteOffsets with uint or long - this is the 64-bit unscaled offset variation also from here ?

@jeffhandley jeffhandley added the arm-sve Work related to arm64 SVE/SVE2 support label Jul 28, 2024
@jeffhandley jeffhandley modified the milestones: 9.0.0, 10.0.0 Jul 28, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
api-approved API was approved in API review, it can be implemented area-System.Runtime.Intrinsics arm-sve Work related to arm64 SVE/SVE2 support
Projects
None yet
Development

No branches or pull requests

4 participants