Skip to content

[API Proposal]: ARM64 SVE/SVE2 : Unpredicated instructions (part 2) #93460

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

Closed
a74nh opened this issue Oct 13, 2023 · 3 comments
Closed

[API Proposal]: ARM64 SVE/SVE2 : Unpredicated instructions (part 2) #93460

a74nh opened this issue Oct 13, 2023 · 3 comments
Labels
api-suggestion Early API idea and discussion, it is NOT ready for implementation area-System.Runtime.Intrinsics

Comments

@a74nh
Copy link
Contributor

a74nh commented Oct 13, 2023

Background and motivation

174 methods

This continues the unpredicated SVE methods.

For details see part 1: 93459

API Proposal

namespace System.Runtime.Intrinsics.Arm

public class ArmSVE<T>
{
  public static unsafe Vector<float> MultiplyAddAddendFirst(Vector<float> op1, Vector<float> op2, Vector<float> op3, ulong imm_index);  // svmla_lane[_f32]: FMLA or MOVPRFX+FMLA
  public static unsafe Vector<double> MultiplyAddAddendFirst(Vector<double> op1, Vector<double> op2, Vector<double> op3, ulong imm_index);  // svmla_lane[_f64]: FMLA or MOVPRFX+FMLA
  public static unsafe Vector<short> MultiplyAddAddendFirst(Vector<short> op1, Vector<short> op2, Vector<short> op3, ulong imm_index);  // svmla_lane[_s16]: MLA or MOVPRFX+MLA
  public static unsafe Vector<int> MultiplyAddAddendFirst(Vector<int> op1, Vector<int> op2, Vector<int> op3, ulong imm_index);  // svmla_lane[_s32]: MLA or MOVPRFX+MLA
  public static unsafe Vector<long> MultiplyAddAddendFirst(Vector<long> op1, Vector<long> op2, Vector<long> op3, ulong imm_index);  // svmla_lane[_s64]: MLA or MOVPRFX+MLA
  public static unsafe Vector<ushort> MultiplyAddAddendFirst(Vector<ushort> op1, Vector<ushort> op2, Vector<ushort> op3, ulong imm_index);  // svmla_lane[_u16]: MLA or MOVPRFX+MLA
  public static unsafe Vector<uint> MultiplyAddAddendFirst(Vector<uint> op1, Vector<uint> op2, Vector<uint> op3, ulong imm_index);  // svmla_lane[_u32]: MLA or MOVPRFX+MLA
  public static unsafe Vector<ulong> MultiplyAddAddendFirst(Vector<ulong> op1, Vector<ulong> op2, Vector<ulong> op3, ulong imm_index);  // svmla_lane[_u64]: MLA or MOVPRFX+MLA

  public static unsafe Vector<short> MultiplyAddLongBottom(Vector<short> op1, Vector<sbyte> op2, Vector<sbyte> op3);  // svmlalb[_s16]: SMLALB or MOVPRFX+SMLALB
  public static unsafe Vector<int> MultiplyAddLongBottom(Vector<int> op1, Vector<short> op2, Vector<short> op3);  // svmlalb[_s32]: SMLALB or MOVPRFX+SMLALB
  public static unsafe Vector<long> MultiplyAddLongBottom(Vector<long> op1, Vector<int> op2, Vector<int> op3);  // svmlalb[_s64]: SMLALB or MOVPRFX+SMLALB
  public static unsafe Vector<ushort> MultiplyAddLongBottom(Vector<ushort> op1, Vector<byte> op2, Vector<byte> op3);  // svmlalb[_u16]: UMLALB or MOVPRFX+UMLALB
  public static unsafe Vector<uint> MultiplyAddLongBottom(Vector<uint> op1, Vector<ushort> op2, Vector<ushort> op3);  // svmlalb[_u32]: UMLALB or MOVPRFX+UMLALB
  public static unsafe Vector<ulong> MultiplyAddLongBottom(Vector<ulong> op1, Vector<uint> op2, Vector<uint> op3);  // svmlalb[_u64]: UMLALB or MOVPRFX+UMLALB
  public static unsafe Vector<short> MultiplyAddLongBottom(Vector<short> op1, Vector<sbyte> op2, sbyte op3);  // svmlalb[_n_s16]: SMLALB or MOVPRFX+SMLALB
  public static unsafe Vector<int> MultiplyAddLongBottom(Vector<int> op1, Vector<short> op2, short op3);  // svmlalb[_n_s32]: SMLALB or MOVPRFX+SMLALB
  public static unsafe Vector<long> MultiplyAddLongBottom(Vector<long> op1, Vector<int> op2, int op3);  // svmlalb[_n_s64]: SMLALB or MOVPRFX+SMLALB
  public static unsafe Vector<ushort> MultiplyAddLongBottom(Vector<ushort> op1, Vector<byte> op2, byte op3);  // svmlalb[_n_u16]: UMLALB or MOVPRFX+UMLALB
  public static unsafe Vector<uint> MultiplyAddLongBottom(Vector<uint> op1, Vector<ushort> op2, ushort op3);  // svmlalb[_n_u32]: UMLALB or MOVPRFX+UMLALB
  public static unsafe Vector<ulong> MultiplyAddLongBottom(Vector<ulong> op1, Vector<uint> op2, uint op3);  // svmlalb[_n_u64]: UMLALB or MOVPRFX+UMLALB
  public static unsafe Vector<int> MultiplyAddLongBottom(Vector<int> op1, Vector<short> op2, Vector<short> op3, ulong imm_index);  // svmlalb_lane[_s32]: SMLALB or MOVPRFX+SMLALB
  public static unsafe Vector<long> MultiplyAddLongBottom(Vector<long> op1, Vector<int> op2, Vector<int> op3, ulong imm_index);  // svmlalb_lane[_s64]: SMLALB or MOVPRFX+SMLALB
  public static unsafe Vector<uint> MultiplyAddLongBottom(Vector<uint> op1, Vector<ushort> op2, Vector<ushort> op3, ulong imm_index);  // svmlalb_lane[_u32]: UMLALB or MOVPRFX+UMLALB
  public static unsafe Vector<ulong> MultiplyAddLongBottom(Vector<ulong> op1, Vector<uint> op2, Vector<uint> op3, ulong imm_index);  // svmlalb_lane[_u64]: UMLALB or MOVPRFX+UMLALB

  public static unsafe Vector<short> MultiplyAddLongTop(Vector<short> op1, Vector<sbyte> op2, Vector<sbyte> op3);  // svmlalt[_s16]: SMLALT or MOVPRFX+SMLALT
  public static unsafe Vector<int> MultiplyAddLongTop(Vector<int> op1, Vector<short> op2, Vector<short> op3);  // svmlalt[_s32]: SMLALT or MOVPRFX+SMLALT
  public static unsafe Vector<long> MultiplyAddLongTop(Vector<long> op1, Vector<int> op2, Vector<int> op3);  // svmlalt[_s64]: SMLALT or MOVPRFX+SMLALT
  public static unsafe Vector<ushort> MultiplyAddLongTop(Vector<ushort> op1, Vector<byte> op2, Vector<byte> op3);  // svmlalt[_u16]: UMLALT or MOVPRFX+UMLALT
  public static unsafe Vector<uint> MultiplyAddLongTop(Vector<uint> op1, Vector<ushort> op2, Vector<ushort> op3);  // svmlalt[_u32]: UMLALT or MOVPRFX+UMLALT
  public static unsafe Vector<ulong> MultiplyAddLongTop(Vector<ulong> op1, Vector<uint> op2, Vector<uint> op3);  // svmlalt[_u64]: UMLALT or MOVPRFX+UMLALT
  public static unsafe Vector<short> MultiplyAddLongTop(Vector<short> op1, Vector<sbyte> op2, sbyte op3);  // svmlalt[_n_s16]: SMLALT or MOVPRFX+SMLALT
  public static unsafe Vector<int> MultiplyAddLongTop(Vector<int> op1, Vector<short> op2, short op3);  // svmlalt[_n_s32]: SMLALT or MOVPRFX+SMLALT
  public static unsafe Vector<long> MultiplyAddLongTop(Vector<long> op1, Vector<int> op2, int op3);  // svmlalt[_n_s64]: SMLALT or MOVPRFX+SMLALT
  public static unsafe Vector<ushort> MultiplyAddLongTop(Vector<ushort> op1, Vector<byte> op2, byte op3);  // svmlalt[_n_u16]: UMLALT or MOVPRFX+UMLALT
  public static unsafe Vector<uint> MultiplyAddLongTop(Vector<uint> op1, Vector<ushort> op2, ushort op3);  // svmlalt[_n_u32]: UMLALT or MOVPRFX+UMLALT
  public static unsafe Vector<ulong> MultiplyAddLongTop(Vector<ulong> op1, Vector<uint> op2, uint op3);  // svmlalt[_n_u64]: UMLALT or MOVPRFX+UMLALT
  public static unsafe Vector<int> MultiplyAddLongTop(Vector<int> op1, Vector<short> op2, Vector<short> op3, ulong imm_index);  // svmlalt_lane[_s32]: SMLALT or MOVPRFX+SMLALT
  public static unsafe Vector<long> MultiplyAddLongTop(Vector<long> op1, Vector<int> op2, Vector<int> op3, ulong imm_index);  // svmlalt_lane[_s64]: SMLALT or MOVPRFX+SMLALT
  public static unsafe Vector<uint> MultiplyAddLongTop(Vector<uint> op1, Vector<ushort> op2, Vector<ushort> op3, ulong imm_index);  // svmlalt_lane[_u32]: UMLALT or MOVPRFX+UMLALT
  public static unsafe Vector<ulong> MultiplyAddLongTop(Vector<ulong> op1, Vector<uint> op2, Vector<uint> op3, ulong imm_index);  // svmlalt_lane[_u64]: UMLALT or MOVPRFX+UMLALT

  public static unsafe Vector<float> MultiplySubtractMinuendFirst(Vector<float> op1, Vector<float> op2, Vector<float> op3, ulong imm_index);  // svmls_lane[_f32]: FMLS or MOVPRFX+FMLS
  public static unsafe Vector<double> MultiplySubtractMinuendFirst(Vector<double> op1, Vector<double> op2, Vector<double> op3, ulong imm_index);  // svmls_lane[_f64]: FMLS or MOVPRFX+FMLS
  public static unsafe Vector<short> MultiplySubtractMinuendFirst(Vector<short> op1, Vector<short> op2, Vector<short> op3, ulong imm_index);  // svmls_lane[_s16]: MLS or MOVPRFX+MLS
  public static unsafe Vector<int> MultiplySubtractMinuendFirst(Vector<int> op1, Vector<int> op2, Vector<int> op3, ulong imm_index);  // svmls_lane[_s32]: MLS or MOVPRFX+MLS
  public static unsafe Vector<long> MultiplySubtractMinuendFirst(Vector<long> op1, Vector<long> op2, Vector<long> op3, ulong imm_index);  // svmls_lane[_s64]: MLS or MOVPRFX+MLS
  public static unsafe Vector<ushort> MultiplySubtractMinuendFirst(Vector<ushort> op1, Vector<ushort> op2, Vector<ushort> op3, ulong imm_index);  // svmls_lane[_u16]: MLS or MOVPRFX+MLS
  public static unsafe Vector<uint> MultiplySubtractMinuendFirst(Vector<uint> op1, Vector<uint> op2, Vector<uint> op3, ulong imm_index);  // svmls_lane[_u32]: MLS or MOVPRFX+MLS
  public static unsafe Vector<ulong> MultiplySubtractMinuendFirst(Vector<ulong> op1, Vector<ulong> op2, Vector<ulong> op3, ulong imm_index);  // svmls_lane[_u64]: MLS or MOVPRFX+MLS

  public static unsafe Vector<short> MultiplySubtractLongBottom(Vector<short> op1, Vector<sbyte> op2, Vector<sbyte> op3);  // svmlslb[_s16]: SMLSLB or MOVPRFX+SMLSLB
  public static unsafe Vector<int> MultiplySubtractLongBottom(Vector<int> op1, Vector<short> op2, Vector<short> op3);  // svmlslb[_s32]: SMLSLB or MOVPRFX+SMLSLB
  public static unsafe Vector<long> MultiplySubtractLongBottom(Vector<long> op1, Vector<int> op2, Vector<int> op3);  // svmlslb[_s64]: SMLSLB or MOVPRFX+SMLSLB
  public static unsafe Vector<ushort> MultiplySubtractLongBottom(Vector<ushort> op1, Vector<byte> op2, Vector<byte> op3);  // svmlslb[_u16]: UMLSLB or MOVPRFX+UMLSLB
  public static unsafe Vector<uint> MultiplySubtractLongBottom(Vector<uint> op1, Vector<ushort> op2, Vector<ushort> op3);  // svmlslb[_u32]: UMLSLB or MOVPRFX+UMLSLB
  public static unsafe Vector<ulong> MultiplySubtractLongBottom(Vector<ulong> op1, Vector<uint> op2, Vector<uint> op3);  // svmlslb[_u64]: UMLSLB or MOVPRFX+UMLSLB
  public static unsafe Vector<short> MultiplySubtractLongBottom(Vector<short> op1, Vector<sbyte> op2, sbyte op3);  // svmlslb[_n_s16]: SMLSLB or MOVPRFX+SMLSLB
  public static unsafe Vector<int> MultiplySubtractLongBottom(Vector<int> op1, Vector<short> op2, short op3);  // svmlslb[_n_s32]: SMLSLB or MOVPRFX+SMLSLB
  public static unsafe Vector<long> MultiplySubtractLongBottom(Vector<long> op1, Vector<int> op2, int op3);  // svmlslb[_n_s64]: SMLSLB or MOVPRFX+SMLSLB
  public static unsafe Vector<ushort> MultiplySubtractLongBottom(Vector<ushort> op1, Vector<byte> op2, byte op3);  // svmlslb[_n_u16]: UMLSLB or MOVPRFX+UMLSLB
  public static unsafe Vector<uint> MultiplySubtractLongBottom(Vector<uint> op1, Vector<ushort> op2, ushort op3);  // svmlslb[_n_u32]: UMLSLB or MOVPRFX+UMLSLB
  public static unsafe Vector<ulong> MultiplySubtractLongBottom(Vector<ulong> op1, Vector<uint> op2, uint op3);  // svmlslb[_n_u64]: UMLSLB or MOVPRFX+UMLSLB
  public static unsafe Vector<int> MultiplySubtractLongBottom(Vector<int> op1, Vector<short> op2, Vector<short> op3, ulong imm_index);  // svmlslb_lane[_s32]: SMLSLB or MOVPRFX+SMLSLB
  public static unsafe Vector<long> MultiplySubtractLongBottom(Vector<long> op1, Vector<int> op2, Vector<int> op3, ulong imm_index);  // svmlslb_lane[_s64]: SMLSLB or MOVPRFX+SMLSLB
  public static unsafe Vector<uint> MultiplySubtractLongBottom(Vector<uint> op1, Vector<ushort> op2, Vector<ushort> op3, ulong imm_index);  // svmlslb_lane[_u32]: UMLSLB or MOVPRFX+UMLSLB
  public static unsafe Vector<ulong> MultiplySubtractLongBottom(Vector<ulong> op1, Vector<uint> op2, Vector<uint> op3, ulong imm_index);  // svmlslb_lane[_u64]: UMLSLB or MOVPRFX+UMLSLB

  public static unsafe Vector<short> MultiplySubtractLongTop(Vector<short> op1, Vector<sbyte> op2, Vector<sbyte> op3);  // svmlslt[_s16]: SMLSLT or MOVPRFX+SMLSLT
  public static unsafe Vector<int> MultiplySubtractLongTop(Vector<int> op1, Vector<short> op2, Vector<short> op3);  // svmlslt[_s32]: SMLSLT or MOVPRFX+SMLSLT
  public static unsafe Vector<long> MultiplySubtractLongTop(Vector<long> op1, Vector<int> op2, Vector<int> op3);  // svmlslt[_s64]: SMLSLT or MOVPRFX+SMLSLT
  public static unsafe Vector<ushort> MultiplySubtractLongTop(Vector<ushort> op1, Vector<byte> op2, Vector<byte> op3);  // svmlslt[_u16]: UMLSLT or MOVPRFX+UMLSLT
  public static unsafe Vector<uint> MultiplySubtractLongTop(Vector<uint> op1, Vector<ushort> op2, Vector<ushort> op3);  // svmlslt[_u32]: UMLSLT or MOVPRFX+UMLSLT
  public static unsafe Vector<ulong> MultiplySubtractLongTop(Vector<ulong> op1, Vector<uint> op2, Vector<uint> op3);  // svmlslt[_u64]: UMLSLT or MOVPRFX+UMLSLT
  public static unsafe Vector<short> MultiplySubtractLongTop(Vector<short> op1, Vector<sbyte> op2, sbyte op3);  // svmlslt[_n_s16]: SMLSLT or MOVPRFX+SMLSLT
  public static unsafe Vector<int> MultiplySubtractLongTop(Vector<int> op1, Vector<short> op2, short op3);  // svmlslt[_n_s32]: SMLSLT or MOVPRFX+SMLSLT
  public static unsafe Vector<long> MultiplySubtractLongTop(Vector<long> op1, Vector<int> op2, int op3);  // svmlslt[_n_s64]: SMLSLT or MOVPRFX+SMLSLT
  public static unsafe Vector<ushort> MultiplySubtractLongTop(Vector<ushort> op1, Vector<byte> op2, byte op3);  // svmlslt[_n_u16]: UMLSLT or MOVPRFX+UMLSLT
  public static unsafe Vector<uint> MultiplySubtractLongTop(Vector<uint> op1, Vector<ushort> op2, ushort op3);  // svmlslt[_n_u32]: UMLSLT or MOVPRFX+UMLSLT
  public static unsafe Vector<ulong> MultiplySubtractLongTop(Vector<ulong> op1, Vector<uint> op2, uint op3);  // svmlslt[_n_u64]: UMLSLT or MOVPRFX+UMLSLT
  public static unsafe Vector<int> MultiplySubtractLongTop(Vector<int> op1, Vector<short> op2, Vector<short> op3, ulong imm_index);  // svmlslt_lane[_s32]: SMLSLT or MOVPRFX+SMLSLT
  public static unsafe Vector<long> MultiplySubtractLongTop(Vector<long> op1, Vector<int> op2, Vector<int> op3, ulong imm_index);  // svmlslt_lane[_s64]: SMLSLT or MOVPRFX+SMLSLT
  public static unsafe Vector<uint> MultiplySubtractLongTop(Vector<uint> op1, Vector<ushort> op2, Vector<ushort> op3, ulong imm_index);  // svmlslt_lane[_u32]: UMLSLT or MOVPRFX+UMLSLT
  public static unsafe Vector<ulong> MultiplySubtractLongTop(Vector<ulong> op1, Vector<uint> op2, Vector<uint> op3, ulong imm_index);  // svmlslt_lane[_u64]: UMLSLT or MOVPRFX+UMLSLT

  public static unsafe Vector<int> MatrixMultiplyAccumulate(Vector<int> op1, Vector<sbyte> op2, Vector<sbyte> op3);  // svmmla[_s32]: SMMLA or MOVPRFX+SMMLA
  public static unsafe Vector<uint> MatrixMultiplyAccumulate(Vector<uint> op1, Vector<byte> op2, Vector<byte> op3);  // svmmla[_u32]: UMMLA or MOVPRFX+UMMLA
  public static unsafe Vector<float> MatrixMultiplyAccumulate(Vector<float> op1, Vector<float> op2, Vector<float> op3);  // svmmla[_f32]: FMMLA or MOVPRFX+FMMLA
  public static unsafe Vector<double> MatrixMultiplyAccumulate(Vector<double> op1, Vector<double> op2, Vector<double> op3);  // svmmla[_f64]: FMMLA or MOVPRFX+FMMLA

  public static unsafe Vector<short> MoveLongBottom(Vector<sbyte> op);  // svmovlb[_s16]: SSHLLB
  public static unsafe Vector<int> MoveLongBottom(Vector<short> op);  // svmovlb[_s32]: SSHLLB
  public static unsafe Vector<long> MoveLongBottom(Vector<int> op);  // svmovlb[_s64]: SSHLLB
  public static unsafe Vector<ushort> MoveLongBottom(Vector<byte> op);  // svmovlb[_u16]: USHLLB
  public static unsafe Vector<uint> MoveLongBottom(Vector<ushort> op);  // svmovlb[_u32]: USHLLB
  public static unsafe Vector<ulong> MoveLongBottom(Vector<uint> op);  // svmovlb[_u64]: USHLLB

  public static unsafe Vector<short> MoveLongTop(Vector<sbyte> op);  // svmovlt[_s16]: SSHLLT
  public static unsafe Vector<int> MoveLongTop(Vector<short> op);  // svmovlt[_s32]: SSHLLT
  public static unsafe Vector<long> MoveLongTop(Vector<int> op);  // svmovlt[_s64]: SSHLLT
  public static unsafe Vector<ushort> MoveLongTop(Vector<byte> op);  // svmovlt[_u16]: USHLLT
  public static unsafe Vector<uint> MoveLongTop(Vector<ushort> op);  // svmovlt[_u32]: USHLLT
  public static unsafe Vector<ulong> MoveLongTop(Vector<uint> op);  // svmovlt[_u64]: USHLLT

  public static unsafe Vector<float> Multiply(Vector<float> op1, Vector<float> op2, ulong imm_index);  // svmul_lane[_f32]: FMUL
  public static unsafe Vector<double> Multiply(Vector<double> op1, Vector<double> op2, ulong imm_index);  // svmul_lane[_f64]: FMUL
  public static unsafe Vector<short> Multiply(Vector<short> op1, Vector<short> op2, ulong imm_index);  // svmul_lane[_s16]: MUL
  public static unsafe Vector<int> Multiply(Vector<int> op1, Vector<int> op2, ulong imm_index);  // svmul_lane[_s32]: MUL
  public static unsafe Vector<long> Multiply(Vector<long> op1, Vector<long> op2, ulong imm_index);  // svmul_lane[_s64]: MUL
  public static unsafe Vector<ushort> Multiply(Vector<ushort> op1, Vector<ushort> op2, ulong imm_index);  // svmul_lane[_u16]: MUL
  public static unsafe Vector<uint> Multiply(Vector<uint> op1, Vector<uint> op2, ulong imm_index);  // svmul_lane[_u32]: MUL
  public static unsafe Vector<ulong> Multiply(Vector<ulong> op1, Vector<ulong> op2, ulong imm_index);  // svmul_lane[_u64]: MUL

  public static unsafe Vector<short> MultiplyLongBottom(Vector<sbyte> op1, Vector<sbyte> op2);  // svmullb[_s16]: SMULLB
  public static unsafe Vector<int> MultiplyLongBottom(Vector<short> op1, Vector<short> op2);  // svmullb[_s32]: SMULLB
  public static unsafe Vector<long> MultiplyLongBottom(Vector<int> op1, Vector<int> op2);  // svmullb[_s64]: SMULLB
  public static unsafe Vector<ushort> MultiplyLongBottom(Vector<byte> op1, Vector<byte> op2);  // svmullb[_u16]: UMULLB
  public static unsafe Vector<uint> MultiplyLongBottom(Vector<ushort> op1, Vector<ushort> op2);  // svmullb[_u32]: UMULLB
  public static unsafe Vector<ulong> MultiplyLongBottom(Vector<uint> op1, Vector<uint> op2);  // svmullb[_u64]: UMULLB
  public static unsafe Vector<short> MultiplyLongBottom(Vector<sbyte> op1, sbyte op2);  // svmullb[_n_s16]: SMULLB
  public static unsafe Vector<int> MultiplyLongBottom(Vector<short> op1, short op2);  // svmullb[_n_s32]: SMULLB
  public static unsafe Vector<long> MultiplyLongBottom(Vector<int> op1, int op2);  // svmullb[_n_s64]: SMULLB
  public static unsafe Vector<ushort> MultiplyLongBottom(Vector<byte> op1, byte op2);  // svmullb[_n_u16]: UMULLB
  public static unsafe Vector<uint> MultiplyLongBottom(Vector<ushort> op1, ushort op2);  // svmullb[_n_u32]: UMULLB
  public static unsafe Vector<ulong> MultiplyLongBottom(Vector<uint> op1, uint op2);  // svmullb[_n_u64]: UMULLB
  public static unsafe Vector<int> MultiplyLongBottom(Vector<short> op1, Vector<short> op2, ulong imm_index);  // svmullb_lane[_s32]: SMULLB
  public static unsafe Vector<long> MultiplyLongBottom(Vector<int> op1, Vector<int> op2, ulong imm_index);  // svmullb_lane[_s64]: SMULLB
  public static unsafe Vector<uint> MultiplyLongBottom(Vector<ushort> op1, Vector<ushort> op2, ulong imm_index);  // svmullb_lane[_u32]: UMULLB
  public static unsafe Vector<ulong> MultiplyLongBottom(Vector<uint> op1, Vector<uint> op2, ulong imm_index);  // svmullb_lane[_u64]: UMULLB

  public static unsafe Vector<short> MultiplyLongTop(Vector<sbyte> op1, Vector<sbyte> op2);  // svmullt[_s16]: SMULLT
  public static unsafe Vector<int> MultiplyLongTop(Vector<short> op1, Vector<short> op2);  // svmullt[_s32]: SMULLT
  public static unsafe Vector<long> MultiplyLongTop(Vector<int> op1, Vector<int> op2);  // svmullt[_s64]: SMULLT
  public static unsafe Vector<ushort> MultiplyLongTop(Vector<byte> op1, Vector<byte> op2);  // svmullt[_u16]: UMULLT
  public static unsafe Vector<uint> MultiplyLongTop(Vector<ushort> op1, Vector<ushort> op2);  // svmullt[_u32]: UMULLT
  public static unsafe Vector<ulong> MultiplyLongTop(Vector<uint> op1, Vector<uint> op2);  // svmullt[_u64]: UMULLT
  public static unsafe Vector<short> MultiplyLongTop(Vector<sbyte> op1, sbyte op2);  // svmullt[_n_s16]: SMULLT
  public static unsafe Vector<int> MultiplyLongTop(Vector<short> op1, short op2);  // svmullt[_n_s32]: SMULLT
  public static unsafe Vector<long> MultiplyLongTop(Vector<int> op1, int op2);  // svmullt[_n_s64]: SMULLT
  public static unsafe Vector<ushort> MultiplyLongTop(Vector<byte> op1, byte op2);  // svmullt[_n_u16]: UMULLT
  public static unsafe Vector<uint> MultiplyLongTop(Vector<ushort> op1, ushort op2);  // svmullt[_n_u32]: UMULLT
  public static unsafe Vector<ulong> MultiplyLongTop(Vector<uint> op1, uint op2);  // svmullt[_n_u64]: UMULLT
  public static unsafe Vector<int> MultiplyLongTop(Vector<short> op1, Vector<short> op2, ulong imm_index);  // svmullt_lane[_s32]: SMULLT
  public static unsafe Vector<long> MultiplyLongTop(Vector<int> op1, Vector<int> op2, ulong imm_index);  // svmullt_lane[_s64]: SMULLT
  public static unsafe Vector<uint> MultiplyLongTop(Vector<ushort> op1, Vector<ushort> op2, ulong imm_index);  // svmullt_lane[_u32]: UMULLT
  public static unsafe Vector<ulong> MultiplyLongTop(Vector<uint> op1, Vector<uint> op2, ulong imm_index);  // svmullt_lane[_u64]: UMULLT

  public static unsafe Vector<sbyte> BitwiseSelectInverted(Vector<sbyte> op1, Vector<sbyte> op2, Vector<sbyte> op3);  // svnbsl[_s8]: NBSL or MOVPRFX+NBSL
  public static unsafe Vector<short> BitwiseSelectInverted(Vector<short> op1, Vector<short> op2, Vector<short> op3);  // svnbsl[_s16]: NBSL or MOVPRFX+NBSL
  public static unsafe Vector<int> BitwiseSelectInverted(Vector<int> op1, Vector<int> op2, Vector<int> op3);  // svnbsl[_s32]: NBSL or MOVPRFX+NBSL
  public static unsafe Vector<long> BitwiseSelectInverted(Vector<long> op1, Vector<long> op2, Vector<long> op3);  // svnbsl[_s64]: NBSL or MOVPRFX+NBSL
  public static unsafe Vector<byte> BitwiseSelectInverted(Vector<byte> op1, Vector<byte> op2, Vector<byte> op3);  // svnbsl[_u8]: NBSL or MOVPRFX+NBSL
  public static unsafe Vector<ushort> BitwiseSelectInverted(Vector<ushort> op1, Vector<ushort> op2, Vector<ushort> op3);  // svnbsl[_u16]: NBSL or MOVPRFX+NBSL
  public static unsafe Vector<uint> BitwiseSelectInverted(Vector<uint> op1, Vector<uint> op2, Vector<uint> op3);  // svnbsl[_u32]: NBSL or MOVPRFX+NBSL
  public static unsafe Vector<ulong> BitwiseSelectInverted(Vector<ulong> op1, Vector<ulong> op2, Vector<ulong> op3);  // svnbsl[_u64]: NBSL or MOVPRFX+NBSL
  public static unsafe Vector<sbyte> BitwiseSelectInverted(Vector<sbyte> op1, Vector<sbyte> op2, sbyte op3);  // svnbsl[_n_s8]: NBSL or MOVPRFX+NBSL
  public static unsafe Vector<short> BitwiseSelectInverted(Vector<short> op1, Vector<short> op2, short op3);  // svnbsl[_n_s16]: NBSL or MOVPRFX+NBSL
  public static unsafe Vector<int> BitwiseSelectInverted(Vector<int> op1, Vector<int> op2, int op3);  // svnbsl[_n_s32]: NBSL or MOVPRFX+NBSL
  public static unsafe Vector<long> BitwiseSelectInverted(Vector<long> op1, Vector<long> op2, long op3);  // svnbsl[_n_s64]: NBSL or MOVPRFX+NBSL
  public static unsafe Vector<byte> BitwiseSelectInverted(Vector<byte> op1, Vector<byte> op2, byte op3);  // svnbsl[_n_u8]: NBSL or MOVPRFX+NBSL
  public static unsafe Vector<ushort> BitwiseSelectInverted(Vector<ushort> op1, Vector<ushort> op2, ushort op3);  // svnbsl[_n_u16]: NBSL or MOVPRFX+NBSL
  public static unsafe Vector<uint> BitwiseSelectInverted(Vector<uint> op1, Vector<uint> op2, uint op3);  // svnbsl[_n_u32]: NBSL or MOVPRFX+NBSL
  public static unsafe Vector<ulong> BitwiseSelectInverted(Vector<ulong> op1, Vector<ulong> op2, ulong op3);  // svnbsl[_n_u64]: NBSL or MOVPRFX+NBSL

  public static unsafe Vector<byte> PolynomialMultiply(Vector<byte> op1, Vector<byte> op2);  // svpmul[_u8]: PMUL
  public static unsafe Vector<byte> PolynomialMultiply(Vector<byte> op1, byte op2);  // svpmul[_n_u8]: PMUL

  public static unsafe Vector<ushort> PolynomialMultiplyLongBottom(Vector<byte> op1, Vector<byte> op2);  // svpmullb[_u16]: PMULLB
  public static unsafe Vector<ulong> PolynomialMultiplyLongBottom(Vector<uint> op1, Vector<uint> op2);  // svpmullb[_u64]: PMULLB
  public static unsafe Vector<ushort> PolynomialMultiplyLongBottom(Vector<byte> op1, byte op2);  // svpmullb[_n_u16]: PMULLB
  public static unsafe Vector<ulong> PolynomialMultiplyLongBottom(Vector<uint> op1, uint op2);  // svpmullb[_n_u64]: PMULLB
  public static unsafe Vector<byte> PolynomialMultiplyLongBottom(Vector<byte> op1, Vector<byte> op2);  // svpmullb_pair[_u8]: PMULLB
  public static unsafe Vector<uint> PolynomialMultiplyLongBottom(Vector<uint> op1, Vector<uint> op2);  // svpmullb_pair[_u32]: PMULLB
  public static unsafe Vector<byte> PolynomialMultiplyLongBottom(Vector<byte> op1, byte op2);  // svpmullb_pair[_n_u8]: PMULLB
  public static unsafe Vector<uint> PolynomialMultiplyLongBottom(Vector<uint> op1, uint op2);  // svpmullb_pair[_n_u32]: PMULLB
  public static unsafe Vector<ulong> PolynomialMultiplyLongBottom(Vector<ulong> op1, Vector<ulong> op2);  // svpmullb_pair[_u64]: PMULLB
  public static unsafe Vector<ulong> PolynomialMultiplyLongBottom(Vector<ulong> op1, ulong op2);  // svpmullb_pair[_n_u64]: PMULLB

  public static unsafe Vector<ushort> PolynomialMultiplyLongTop(Vector<byte> op1, Vector<byte> op2);  // svpmullt[_u16]: PMULLT
  public static unsafe Vector<ulong> PolynomialMultiplyLongTop(Vector<uint> op1, Vector<uint> op2);  // svpmullt[_u64]: PMULLT
  public static unsafe Vector<ushort> PolynomialMultiplyLongTop(Vector<byte> op1, byte op2);  // svpmullt[_n_u16]: PMULLT
  public static unsafe Vector<ulong> PolynomialMultiplyLongTop(Vector<uint> op1, uint op2);  // svpmullt[_n_u64]: PMULLT
  public static unsafe Vector<byte> PolynomialMultiplyLongTop(Vector<byte> op1, Vector<byte> op2);  // svpmullt_pair[_u8]: PMULLT
  public static unsafe Vector<uint> PolynomialMultiplyLongTop(Vector<uint> op1, Vector<uint> op2);  // svpmullt_pair[_u32]: PMULLT
  public static unsafe Vector<byte> PolynomialMultiplyLongTop(Vector<byte> op1, byte op2);  // svpmullt_pair[_n_u8]: PMULLT
  public static unsafe Vector<uint> PolynomialMultiplyLongTop(Vector<uint> op1, uint op2);  // svpmullt_pair[_n_u32]: PMULLT
  public static unsafe Vector<ulong> PolynomialMultiplyLongTop(Vector<ulong> op1, Vector<ulong> op2);  // svpmullt_pair[_u64]: PMULLT
  public static unsafe Vector<ulong> PolynomialMultiplyLongTop(Vector<ulong> op1, ulong op2);  // svpmullt_pair[_n_u64]: PMULLT
}

API Usage

See part 1: 93459

Alternative Designs

No response

Risks

No response

@a74nh a74nh added the api-suggestion Early API idea and discussion, it is NOT ready for implementation label Oct 13, 2023
@ghost ghost added area-System.Runtime.Intrinsics untriaged New issue has not been triaged by the area owner labels Oct 13, 2023
@ghost
Copy link

ghost commented Oct 13, 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

Background and motivation

174 methods (of 1229)

This continues the unpredicated SVE methods.

For details see part 1: 93459

API Proposal

namespace System.Runtime.Intrinsics.Arm

public class ArmSVE<T>
{
  public static unsafe Vector<float> MultiplyAddAddendFirst(Vector<float> op1, Vector<float> op2, Vector<float> op3, ulong imm_index);  // svmla_lane[_f32]: FMLA or MOVPRFX+FMLA
  public static unsafe Vector<double> MultiplyAddAddendFirst(Vector<double> op1, Vector<double> op2, Vector<double> op3, ulong imm_index);  // svmla_lane[_f64]: FMLA or MOVPRFX+FMLA
  public static unsafe Vector<short> MultiplyAddAddendFirst(Vector<short> op1, Vector<short> op2, Vector<short> op3, ulong imm_index);  // svmla_lane[_s16]: MLA or MOVPRFX+MLA
  public static unsafe Vector<int> MultiplyAddAddendFirst(Vector<int> op1, Vector<int> op2, Vector<int> op3, ulong imm_index);  // svmla_lane[_s32]: MLA or MOVPRFX+MLA
  public static unsafe Vector<long> MultiplyAddAddendFirst(Vector<long> op1, Vector<long> op2, Vector<long> op3, ulong imm_index);  // svmla_lane[_s64]: MLA or MOVPRFX+MLA
  public static unsafe Vector<ushort> MultiplyAddAddendFirst(Vector<ushort> op1, Vector<ushort> op2, Vector<ushort> op3, ulong imm_index);  // svmla_lane[_u16]: MLA or MOVPRFX+MLA
  public static unsafe Vector<uint> MultiplyAddAddendFirst(Vector<uint> op1, Vector<uint> op2, Vector<uint> op3, ulong imm_index);  // svmla_lane[_u32]: MLA or MOVPRFX+MLA
  public static unsafe Vector<ulong> MultiplyAddAddendFirst(Vector<ulong> op1, Vector<ulong> op2, Vector<ulong> op3, ulong imm_index);  // svmla_lane[_u64]: MLA or MOVPRFX+MLA

  public static unsafe Vector<short> MultiplyAddLongBottom(Vector<short> op1, Vector<sbyte> op2, Vector<sbyte> op3);  // svmlalb[_s16]: SMLALB or MOVPRFX+SMLALB
  public static unsafe Vector<int> MultiplyAddLongBottom(Vector<int> op1, Vector<short> op2, Vector<short> op3);  // svmlalb[_s32]: SMLALB or MOVPRFX+SMLALB
  public static unsafe Vector<long> MultiplyAddLongBottom(Vector<long> op1, Vector<int> op2, Vector<int> op3);  // svmlalb[_s64]: SMLALB or MOVPRFX+SMLALB
  public static unsafe Vector<ushort> MultiplyAddLongBottom(Vector<ushort> op1, Vector<byte> op2, Vector<byte> op3);  // svmlalb[_u16]: UMLALB or MOVPRFX+UMLALB
  public static unsafe Vector<uint> MultiplyAddLongBottom(Vector<uint> op1, Vector<ushort> op2, Vector<ushort> op3);  // svmlalb[_u32]: UMLALB or MOVPRFX+UMLALB
  public static unsafe Vector<ulong> MultiplyAddLongBottom(Vector<ulong> op1, Vector<uint> op2, Vector<uint> op3);  // svmlalb[_u64]: UMLALB or MOVPRFX+UMLALB
  public static unsafe Vector<short> MultiplyAddLongBottom(Vector<short> op1, Vector<sbyte> op2, sbyte op3);  // svmlalb[_n_s16]: SMLALB or MOVPRFX+SMLALB
  public static unsafe Vector<int> MultiplyAddLongBottom(Vector<int> op1, Vector<short> op2, short op3);  // svmlalb[_n_s32]: SMLALB or MOVPRFX+SMLALB
  public static unsafe Vector<long> MultiplyAddLongBottom(Vector<long> op1, Vector<int> op2, int op3);  // svmlalb[_n_s64]: SMLALB or MOVPRFX+SMLALB
  public static unsafe Vector<ushort> MultiplyAddLongBottom(Vector<ushort> op1, Vector<byte> op2, byte op3);  // svmlalb[_n_u16]: UMLALB or MOVPRFX+UMLALB
  public static unsafe Vector<uint> MultiplyAddLongBottom(Vector<uint> op1, Vector<ushort> op2, ushort op3);  // svmlalb[_n_u32]: UMLALB or MOVPRFX+UMLALB
  public static unsafe Vector<ulong> MultiplyAddLongBottom(Vector<ulong> op1, Vector<uint> op2, uint op3);  // svmlalb[_n_u64]: UMLALB or MOVPRFX+UMLALB
  public static unsafe Vector<int> MultiplyAddLongBottom(Vector<int> op1, Vector<short> op2, Vector<short> op3, ulong imm_index);  // svmlalb_lane[_s32]: SMLALB or MOVPRFX+SMLALB
  public static unsafe Vector<long> MultiplyAddLongBottom(Vector<long> op1, Vector<int> op2, Vector<int> op3, ulong imm_index);  // svmlalb_lane[_s64]: SMLALB or MOVPRFX+SMLALB
  public static unsafe Vector<uint> MultiplyAddLongBottom(Vector<uint> op1, Vector<ushort> op2, Vector<ushort> op3, ulong imm_index);  // svmlalb_lane[_u32]: UMLALB or MOVPRFX+UMLALB
  public static unsafe Vector<ulong> MultiplyAddLongBottom(Vector<ulong> op1, Vector<uint> op2, Vector<uint> op3, ulong imm_index);  // svmlalb_lane[_u64]: UMLALB or MOVPRFX+UMLALB

  public static unsafe Vector<short> MultiplyAddLongTop(Vector<short> op1, Vector<sbyte> op2, Vector<sbyte> op3);  // svmlalt[_s16]: SMLALT or MOVPRFX+SMLALT
  public static unsafe Vector<int> MultiplyAddLongTop(Vector<int> op1, Vector<short> op2, Vector<short> op3);  // svmlalt[_s32]: SMLALT or MOVPRFX+SMLALT
  public static unsafe Vector<long> MultiplyAddLongTop(Vector<long> op1, Vector<int> op2, Vector<int> op3);  // svmlalt[_s64]: SMLALT or MOVPRFX+SMLALT
  public static unsafe Vector<ushort> MultiplyAddLongTop(Vector<ushort> op1, Vector<byte> op2, Vector<byte> op3);  // svmlalt[_u16]: UMLALT or MOVPRFX+UMLALT
  public static unsafe Vector<uint> MultiplyAddLongTop(Vector<uint> op1, Vector<ushort> op2, Vector<ushort> op3);  // svmlalt[_u32]: UMLALT or MOVPRFX+UMLALT
  public static unsafe Vector<ulong> MultiplyAddLongTop(Vector<ulong> op1, Vector<uint> op2, Vector<uint> op3);  // svmlalt[_u64]: UMLALT or MOVPRFX+UMLALT
  public static unsafe Vector<short> MultiplyAddLongTop(Vector<short> op1, Vector<sbyte> op2, sbyte op3);  // svmlalt[_n_s16]: SMLALT or MOVPRFX+SMLALT
  public static unsafe Vector<int> MultiplyAddLongTop(Vector<int> op1, Vector<short> op2, short op3);  // svmlalt[_n_s32]: SMLALT or MOVPRFX+SMLALT
  public static unsafe Vector<long> MultiplyAddLongTop(Vector<long> op1, Vector<int> op2, int op3);  // svmlalt[_n_s64]: SMLALT or MOVPRFX+SMLALT
  public static unsafe Vector<ushort> MultiplyAddLongTop(Vector<ushort> op1, Vector<byte> op2, byte op3);  // svmlalt[_n_u16]: UMLALT or MOVPRFX+UMLALT
  public static unsafe Vector<uint> MultiplyAddLongTop(Vector<uint> op1, Vector<ushort> op2, ushort op3);  // svmlalt[_n_u32]: UMLALT or MOVPRFX+UMLALT
  public static unsafe Vector<ulong> MultiplyAddLongTop(Vector<ulong> op1, Vector<uint> op2, uint op3);  // svmlalt[_n_u64]: UMLALT or MOVPRFX+UMLALT
  public static unsafe Vector<int> MultiplyAddLongTop(Vector<int> op1, Vector<short> op2, Vector<short> op3, ulong imm_index);  // svmlalt_lane[_s32]: SMLALT or MOVPRFX+SMLALT
  public static unsafe Vector<long> MultiplyAddLongTop(Vector<long> op1, Vector<int> op2, Vector<int> op3, ulong imm_index);  // svmlalt_lane[_s64]: SMLALT or MOVPRFX+SMLALT
  public static unsafe Vector<uint> MultiplyAddLongTop(Vector<uint> op1, Vector<ushort> op2, Vector<ushort> op3, ulong imm_index);  // svmlalt_lane[_u32]: UMLALT or MOVPRFX+UMLALT
  public static unsafe Vector<ulong> MultiplyAddLongTop(Vector<ulong> op1, Vector<uint> op2, Vector<uint> op3, ulong imm_index);  // svmlalt_lane[_u64]: UMLALT or MOVPRFX+UMLALT

  public static unsafe Vector<float> MultiplySubtractMinuendFirst(Vector<float> op1, Vector<float> op2, Vector<float> op3, ulong imm_index);  // svmls_lane[_f32]: FMLS or MOVPRFX+FMLS
  public static unsafe Vector<double> MultiplySubtractMinuendFirst(Vector<double> op1, Vector<double> op2, Vector<double> op3, ulong imm_index);  // svmls_lane[_f64]: FMLS or MOVPRFX+FMLS
  public static unsafe Vector<short> MultiplySubtractMinuendFirst(Vector<short> op1, Vector<short> op2, Vector<short> op3, ulong imm_index);  // svmls_lane[_s16]: MLS or MOVPRFX+MLS
  public static unsafe Vector<int> MultiplySubtractMinuendFirst(Vector<int> op1, Vector<int> op2, Vector<int> op3, ulong imm_index);  // svmls_lane[_s32]: MLS or MOVPRFX+MLS
  public static unsafe Vector<long> MultiplySubtractMinuendFirst(Vector<long> op1, Vector<long> op2, Vector<long> op3, ulong imm_index);  // svmls_lane[_s64]: MLS or MOVPRFX+MLS
  public static unsafe Vector<ushort> MultiplySubtractMinuendFirst(Vector<ushort> op1, Vector<ushort> op2, Vector<ushort> op3, ulong imm_index);  // svmls_lane[_u16]: MLS or MOVPRFX+MLS
  public static unsafe Vector<uint> MultiplySubtractMinuendFirst(Vector<uint> op1, Vector<uint> op2, Vector<uint> op3, ulong imm_index);  // svmls_lane[_u32]: MLS or MOVPRFX+MLS
  public static unsafe Vector<ulong> MultiplySubtractMinuendFirst(Vector<ulong> op1, Vector<ulong> op2, Vector<ulong> op3, ulong imm_index);  // svmls_lane[_u64]: MLS or MOVPRFX+MLS

  public static unsafe Vector<short> MultiplySubtractLongBottom(Vector<short> op1, Vector<sbyte> op2, Vector<sbyte> op3);  // svmlslb[_s16]: SMLSLB or MOVPRFX+SMLSLB
  public static unsafe Vector<int> MultiplySubtractLongBottom(Vector<int> op1, Vector<short> op2, Vector<short> op3);  // svmlslb[_s32]: SMLSLB or MOVPRFX+SMLSLB
  public static unsafe Vector<long> MultiplySubtractLongBottom(Vector<long> op1, Vector<int> op2, Vector<int> op3);  // svmlslb[_s64]: SMLSLB or MOVPRFX+SMLSLB
  public static unsafe Vector<ushort> MultiplySubtractLongBottom(Vector<ushort> op1, Vector<byte> op2, Vector<byte> op3);  // svmlslb[_u16]: UMLSLB or MOVPRFX+UMLSLB
  public static unsafe Vector<uint> MultiplySubtractLongBottom(Vector<uint> op1, Vector<ushort> op2, Vector<ushort> op3);  // svmlslb[_u32]: UMLSLB or MOVPRFX+UMLSLB
  public static unsafe Vector<ulong> MultiplySubtractLongBottom(Vector<ulong> op1, Vector<uint> op2, Vector<uint> op3);  // svmlslb[_u64]: UMLSLB or MOVPRFX+UMLSLB
  public static unsafe Vector<short> MultiplySubtractLongBottom(Vector<short> op1, Vector<sbyte> op2, sbyte op3);  // svmlslb[_n_s16]: SMLSLB or MOVPRFX+SMLSLB
  public static unsafe Vector<int> MultiplySubtractLongBottom(Vector<int> op1, Vector<short> op2, short op3);  // svmlslb[_n_s32]: SMLSLB or MOVPRFX+SMLSLB
  public static unsafe Vector<long> MultiplySubtractLongBottom(Vector<long> op1, Vector<int> op2, int op3);  // svmlslb[_n_s64]: SMLSLB or MOVPRFX+SMLSLB
  public static unsafe Vector<ushort> MultiplySubtractLongBottom(Vector<ushort> op1, Vector<byte> op2, byte op3);  // svmlslb[_n_u16]: UMLSLB or MOVPRFX+UMLSLB
  public static unsafe Vector<uint> MultiplySubtractLongBottom(Vector<uint> op1, Vector<ushort> op2, ushort op3);  // svmlslb[_n_u32]: UMLSLB or MOVPRFX+UMLSLB
  public static unsafe Vector<ulong> MultiplySubtractLongBottom(Vector<ulong> op1, Vector<uint> op2, uint op3);  // svmlslb[_n_u64]: UMLSLB or MOVPRFX+UMLSLB
  public static unsafe Vector<int> MultiplySubtractLongBottom(Vector<int> op1, Vector<short> op2, Vector<short> op3, ulong imm_index);  // svmlslb_lane[_s32]: SMLSLB or MOVPRFX+SMLSLB
  public static unsafe Vector<long> MultiplySubtractLongBottom(Vector<long> op1, Vector<int> op2, Vector<int> op3, ulong imm_index);  // svmlslb_lane[_s64]: SMLSLB or MOVPRFX+SMLSLB
  public static unsafe Vector<uint> MultiplySubtractLongBottom(Vector<uint> op1, Vector<ushort> op2, Vector<ushort> op3, ulong imm_index);  // svmlslb_lane[_u32]: UMLSLB or MOVPRFX+UMLSLB
  public static unsafe Vector<ulong> MultiplySubtractLongBottom(Vector<ulong> op1, Vector<uint> op2, Vector<uint> op3, ulong imm_index);  // svmlslb_lane[_u64]: UMLSLB or MOVPRFX+UMLSLB

  public static unsafe Vector<short> MultiplySubtractLongTop(Vector<short> op1, Vector<sbyte> op2, Vector<sbyte> op3);  // svmlslt[_s16]: SMLSLT or MOVPRFX+SMLSLT
  public static unsafe Vector<int> MultiplySubtractLongTop(Vector<int> op1, Vector<short> op2, Vector<short> op3);  // svmlslt[_s32]: SMLSLT or MOVPRFX+SMLSLT
  public static unsafe Vector<long> MultiplySubtractLongTop(Vector<long> op1, Vector<int> op2, Vector<int> op3);  // svmlslt[_s64]: SMLSLT or MOVPRFX+SMLSLT
  public static unsafe Vector<ushort> MultiplySubtractLongTop(Vector<ushort> op1, Vector<byte> op2, Vector<byte> op3);  // svmlslt[_u16]: UMLSLT or MOVPRFX+UMLSLT
  public static unsafe Vector<uint> MultiplySubtractLongTop(Vector<uint> op1, Vector<ushort> op2, Vector<ushort> op3);  // svmlslt[_u32]: UMLSLT or MOVPRFX+UMLSLT
  public static unsafe Vector<ulong> MultiplySubtractLongTop(Vector<ulong> op1, Vector<uint> op2, Vector<uint> op3);  // svmlslt[_u64]: UMLSLT or MOVPRFX+UMLSLT
  public static unsafe Vector<short> MultiplySubtractLongTop(Vector<short> op1, Vector<sbyte> op2, sbyte op3);  // svmlslt[_n_s16]: SMLSLT or MOVPRFX+SMLSLT
  public static unsafe Vector<int> MultiplySubtractLongTop(Vector<int> op1, Vector<short> op2, short op3);  // svmlslt[_n_s32]: SMLSLT or MOVPRFX+SMLSLT
  public static unsafe Vector<long> MultiplySubtractLongTop(Vector<long> op1, Vector<int> op2, int op3);  // svmlslt[_n_s64]: SMLSLT or MOVPRFX+SMLSLT
  public static unsafe Vector<ushort> MultiplySubtractLongTop(Vector<ushort> op1, Vector<byte> op2, byte op3);  // svmlslt[_n_u16]: UMLSLT or MOVPRFX+UMLSLT
  public static unsafe Vector<uint> MultiplySubtractLongTop(Vector<uint> op1, Vector<ushort> op2, ushort op3);  // svmlslt[_n_u32]: UMLSLT or MOVPRFX+UMLSLT
  public static unsafe Vector<ulong> MultiplySubtractLongTop(Vector<ulong> op1, Vector<uint> op2, uint op3);  // svmlslt[_n_u64]: UMLSLT or MOVPRFX+UMLSLT
  public static unsafe Vector<int> MultiplySubtractLongTop(Vector<int> op1, Vector<short> op2, Vector<short> op3, ulong imm_index);  // svmlslt_lane[_s32]: SMLSLT or MOVPRFX+SMLSLT
  public static unsafe Vector<long> MultiplySubtractLongTop(Vector<long> op1, Vector<int> op2, Vector<int> op3, ulong imm_index);  // svmlslt_lane[_s64]: SMLSLT or MOVPRFX+SMLSLT
  public static unsafe Vector<uint> MultiplySubtractLongTop(Vector<uint> op1, Vector<ushort> op2, Vector<ushort> op3, ulong imm_index);  // svmlslt_lane[_u32]: UMLSLT or MOVPRFX+UMLSLT
  public static unsafe Vector<ulong> MultiplySubtractLongTop(Vector<ulong> op1, Vector<uint> op2, Vector<uint> op3, ulong imm_index);  // svmlslt_lane[_u64]: UMLSLT or MOVPRFX+UMLSLT

  public static unsafe Vector<int> MatrixMultiplyAccumulate(Vector<int> op1, Vector<sbyte> op2, Vector<sbyte> op3);  // svmmla[_s32]: SMMLA or MOVPRFX+SMMLA
  public static unsafe Vector<uint> MatrixMultiplyAccumulate(Vector<uint> op1, Vector<byte> op2, Vector<byte> op3);  // svmmla[_u32]: UMMLA or MOVPRFX+UMMLA
  public static unsafe Vector<float> MatrixMultiplyAccumulate(Vector<float> op1, Vector<float> op2, Vector<float> op3);  // svmmla[_f32]: FMMLA or MOVPRFX+FMMLA
  public static unsafe Vector<double> MatrixMultiplyAccumulate(Vector<double> op1, Vector<double> op2, Vector<double> op3);  // svmmla[_f64]: FMMLA or MOVPRFX+FMMLA

  public static unsafe Vector<short> MoveLongBottom(Vector<sbyte> op);  // svmovlb[_s16]: SSHLLB
  public static unsafe Vector<int> MoveLongBottom(Vector<short> op);  // svmovlb[_s32]: SSHLLB
  public static unsafe Vector<long> MoveLongBottom(Vector<int> op);  // svmovlb[_s64]: SSHLLB
  public static unsafe Vector<ushort> MoveLongBottom(Vector<byte> op);  // svmovlb[_u16]: USHLLB
  public static unsafe Vector<uint> MoveLongBottom(Vector<ushort> op);  // svmovlb[_u32]: USHLLB
  public static unsafe Vector<ulong> MoveLongBottom(Vector<uint> op);  // svmovlb[_u64]: USHLLB

  public static unsafe Vector<short> MoveLongTop(Vector<sbyte> op);  // svmovlt[_s16]: SSHLLT
  public static unsafe Vector<int> MoveLongTop(Vector<short> op);  // svmovlt[_s32]: SSHLLT
  public static unsafe Vector<long> MoveLongTop(Vector<int> op);  // svmovlt[_s64]: SSHLLT
  public static unsafe Vector<ushort> MoveLongTop(Vector<byte> op);  // svmovlt[_u16]: USHLLT
  public static unsafe Vector<uint> MoveLongTop(Vector<ushort> op);  // svmovlt[_u32]: USHLLT
  public static unsafe Vector<ulong> MoveLongTop(Vector<uint> op);  // svmovlt[_u64]: USHLLT

  public static unsafe Vector<float> Multiply(Vector<float> op1, Vector<float> op2, ulong imm_index);  // svmul_lane[_f32]: FMUL
  public static unsafe Vector<double> Multiply(Vector<double> op1, Vector<double> op2, ulong imm_index);  // svmul_lane[_f64]: FMUL
  public static unsafe Vector<short> Multiply(Vector<short> op1, Vector<short> op2, ulong imm_index);  // svmul_lane[_s16]: MUL
  public static unsafe Vector<int> Multiply(Vector<int> op1, Vector<int> op2, ulong imm_index);  // svmul_lane[_s32]: MUL
  public static unsafe Vector<long> Multiply(Vector<long> op1, Vector<long> op2, ulong imm_index);  // svmul_lane[_s64]: MUL
  public static unsafe Vector<ushort> Multiply(Vector<ushort> op1, Vector<ushort> op2, ulong imm_index);  // svmul_lane[_u16]: MUL
  public static unsafe Vector<uint> Multiply(Vector<uint> op1, Vector<uint> op2, ulong imm_index);  // svmul_lane[_u32]: MUL
  public static unsafe Vector<ulong> Multiply(Vector<ulong> op1, Vector<ulong> op2, ulong imm_index);  // svmul_lane[_u64]: MUL

  public static unsafe Vector<short> MultiplyLongBottom(Vector<sbyte> op1, Vector<sbyte> op2);  // svmullb[_s16]: SMULLB
  public static unsafe Vector<int> MultiplyLongBottom(Vector<short> op1, Vector<short> op2);  // svmullb[_s32]: SMULLB
  public static unsafe Vector<long> MultiplyLongBottom(Vector<int> op1, Vector<int> op2);  // svmullb[_s64]: SMULLB
  public static unsafe Vector<ushort> MultiplyLongBottom(Vector<byte> op1, Vector<byte> op2);  // svmullb[_u16]: UMULLB
  public static unsafe Vector<uint> MultiplyLongBottom(Vector<ushort> op1, Vector<ushort> op2);  // svmullb[_u32]: UMULLB
  public static unsafe Vector<ulong> MultiplyLongBottom(Vector<uint> op1, Vector<uint> op2);  // svmullb[_u64]: UMULLB
  public static unsafe Vector<short> MultiplyLongBottom(Vector<sbyte> op1, sbyte op2);  // svmullb[_n_s16]: SMULLB
  public static unsafe Vector<int> MultiplyLongBottom(Vector<short> op1, short op2);  // svmullb[_n_s32]: SMULLB
  public static unsafe Vector<long> MultiplyLongBottom(Vector<int> op1, int op2);  // svmullb[_n_s64]: SMULLB
  public static unsafe Vector<ushort> MultiplyLongBottom(Vector<byte> op1, byte op2);  // svmullb[_n_u16]: UMULLB
  public static unsafe Vector<uint> MultiplyLongBottom(Vector<ushort> op1, ushort op2);  // svmullb[_n_u32]: UMULLB
  public static unsafe Vector<ulong> MultiplyLongBottom(Vector<uint> op1, uint op2);  // svmullb[_n_u64]: UMULLB
  public static unsafe Vector<int> MultiplyLongBottom(Vector<short> op1, Vector<short> op2, ulong imm_index);  // svmullb_lane[_s32]: SMULLB
  public static unsafe Vector<long> MultiplyLongBottom(Vector<int> op1, Vector<int> op2, ulong imm_index);  // svmullb_lane[_s64]: SMULLB
  public static unsafe Vector<uint> MultiplyLongBottom(Vector<ushort> op1, Vector<ushort> op2, ulong imm_index);  // svmullb_lane[_u32]: UMULLB
  public static unsafe Vector<ulong> MultiplyLongBottom(Vector<uint> op1, Vector<uint> op2, ulong imm_index);  // svmullb_lane[_u64]: UMULLB

  public static unsafe Vector<short> MultiplyLongTop(Vector<sbyte> op1, Vector<sbyte> op2);  // svmullt[_s16]: SMULLT
  public static unsafe Vector<int> MultiplyLongTop(Vector<short> op1, Vector<short> op2);  // svmullt[_s32]: SMULLT
  public static unsafe Vector<long> MultiplyLongTop(Vector<int> op1, Vector<int> op2);  // svmullt[_s64]: SMULLT
  public static unsafe Vector<ushort> MultiplyLongTop(Vector<byte> op1, Vector<byte> op2);  // svmullt[_u16]: UMULLT
  public static unsafe Vector<uint> MultiplyLongTop(Vector<ushort> op1, Vector<ushort> op2);  // svmullt[_u32]: UMULLT
  public static unsafe Vector<ulong> MultiplyLongTop(Vector<uint> op1, Vector<uint> op2);  // svmullt[_u64]: UMULLT
  public static unsafe Vector<short> MultiplyLongTop(Vector<sbyte> op1, sbyte op2);  // svmullt[_n_s16]: SMULLT
  public static unsafe Vector<int> MultiplyLongTop(Vector<short> op1, short op2);  // svmullt[_n_s32]: SMULLT
  public static unsafe Vector<long> MultiplyLongTop(Vector<int> op1, int op2);  // svmullt[_n_s64]: SMULLT
  public static unsafe Vector<ushort> MultiplyLongTop(Vector<byte> op1, byte op2);  // svmullt[_n_u16]: UMULLT
  public static unsafe Vector<uint> MultiplyLongTop(Vector<ushort> op1, ushort op2);  // svmullt[_n_u32]: UMULLT
  public static unsafe Vector<ulong> MultiplyLongTop(Vector<uint> op1, uint op2);  // svmullt[_n_u64]: UMULLT
  public static unsafe Vector<int> MultiplyLongTop(Vector<short> op1, Vector<short> op2, ulong imm_index);  // svmullt_lane[_s32]: SMULLT
  public static unsafe Vector<long> MultiplyLongTop(Vector<int> op1, Vector<int> op2, ulong imm_index);  // svmullt_lane[_s64]: SMULLT
  public static unsafe Vector<uint> MultiplyLongTop(Vector<ushort> op1, Vector<ushort> op2, ulong imm_index);  // svmullt_lane[_u32]: UMULLT
  public static unsafe Vector<ulong> MultiplyLongTop(Vector<uint> op1, Vector<uint> op2, ulong imm_index);  // svmullt_lane[_u64]: UMULLT

  public static unsafe Vector<sbyte> BitwiseSelectInverted(Vector<sbyte> op1, Vector<sbyte> op2, Vector<sbyte> op3);  // svnbsl[_s8]: NBSL or MOVPRFX+NBSL
  public static unsafe Vector<short> BitwiseSelectInverted(Vector<short> op1, Vector<short> op2, Vector<short> op3);  // svnbsl[_s16]: NBSL or MOVPRFX+NBSL
  public static unsafe Vector<int> BitwiseSelectInverted(Vector<int> op1, Vector<int> op2, Vector<int> op3);  // svnbsl[_s32]: NBSL or MOVPRFX+NBSL
  public static unsafe Vector<long> BitwiseSelectInverted(Vector<long> op1, Vector<long> op2, Vector<long> op3);  // svnbsl[_s64]: NBSL or MOVPRFX+NBSL
  public static unsafe Vector<byte> BitwiseSelectInverted(Vector<byte> op1, Vector<byte> op2, Vector<byte> op3);  // svnbsl[_u8]: NBSL or MOVPRFX+NBSL
  public static unsafe Vector<ushort> BitwiseSelectInverted(Vector<ushort> op1, Vector<ushort> op2, Vector<ushort> op3);  // svnbsl[_u16]: NBSL or MOVPRFX+NBSL
  public static unsafe Vector<uint> BitwiseSelectInverted(Vector<uint> op1, Vector<uint> op2, Vector<uint> op3);  // svnbsl[_u32]: NBSL or MOVPRFX+NBSL
  public static unsafe Vector<ulong> BitwiseSelectInverted(Vector<ulong> op1, Vector<ulong> op2, Vector<ulong> op3);  // svnbsl[_u64]: NBSL or MOVPRFX+NBSL
  public static unsafe Vector<sbyte> BitwiseSelectInverted(Vector<sbyte> op1, Vector<sbyte> op2, sbyte op3);  // svnbsl[_n_s8]: NBSL or MOVPRFX+NBSL
  public static unsafe Vector<short> BitwiseSelectInverted(Vector<short> op1, Vector<short> op2, short op3);  // svnbsl[_n_s16]: NBSL or MOVPRFX+NBSL
  public static unsafe Vector<int> BitwiseSelectInverted(Vector<int> op1, Vector<int> op2, int op3);  // svnbsl[_n_s32]: NBSL or MOVPRFX+NBSL
  public static unsafe Vector<long> BitwiseSelectInverted(Vector<long> op1, Vector<long> op2, long op3);  // svnbsl[_n_s64]: NBSL or MOVPRFX+NBSL
  public static unsafe Vector<byte> BitwiseSelectInverted(Vector<byte> op1, Vector<byte> op2, byte op3);  // svnbsl[_n_u8]: NBSL or MOVPRFX+NBSL
  public static unsafe Vector<ushort> BitwiseSelectInverted(Vector<ushort> op1, Vector<ushort> op2, ushort op3);  // svnbsl[_n_u16]: NBSL or MOVPRFX+NBSL
  public static unsafe Vector<uint> BitwiseSelectInverted(Vector<uint> op1, Vector<uint> op2, uint op3);  // svnbsl[_n_u32]: NBSL or MOVPRFX+NBSL
  public static unsafe Vector<ulong> BitwiseSelectInverted(Vector<ulong> op1, Vector<ulong> op2, ulong op3);  // svnbsl[_n_u64]: NBSL or MOVPRFX+NBSL

  public static unsafe Vector<byte> PolynomialMultiply(Vector<byte> op1, Vector<byte> op2);  // svpmul[_u8]: PMUL
  public static unsafe Vector<byte> PolynomialMultiply(Vector<byte> op1, byte op2);  // svpmul[_n_u8]: PMUL

  public static unsafe Vector<ushort> PolynomialMultiplyLongBottom(Vector<byte> op1, Vector<byte> op2);  // svpmullb[_u16]: PMULLB
  public static unsafe Vector<ulong> PolynomialMultiplyLongBottom(Vector<uint> op1, Vector<uint> op2);  // svpmullb[_u64]: PMULLB
  public static unsafe Vector<ushort> PolynomialMultiplyLongBottom(Vector<byte> op1, byte op2);  // svpmullb[_n_u16]: PMULLB
  public static unsafe Vector<ulong> PolynomialMultiplyLongBottom(Vector<uint> op1, uint op2);  // svpmullb[_n_u64]: PMULLB
  public static unsafe Vector<byte> PolynomialMultiplyLongBottom(Vector<byte> op1, Vector<byte> op2);  // svpmullb_pair[_u8]: PMULLB
  public static unsafe Vector<uint> PolynomialMultiplyLongBottom(Vector<uint> op1, Vector<uint> op2);  // svpmullb_pair[_u32]: PMULLB
  public static unsafe Vector<byte> PolynomialMultiplyLongBottom(Vector<byte> op1, byte op2);  // svpmullb_pair[_n_u8]: PMULLB
  public static unsafe Vector<uint> PolynomialMultiplyLongBottom(Vector<uint> op1, uint op2);  // svpmullb_pair[_n_u32]: PMULLB
  public static unsafe Vector<ulong> PolynomialMultiplyLongBottom(Vector<ulong> op1, Vector<ulong> op2);  // svpmullb_pair[_u64]: PMULLB
  public static unsafe Vector<ulong> PolynomialMultiplyLongBottom(Vector<ulong> op1, ulong op2);  // svpmullb_pair[_n_u64]: PMULLB

  public static unsafe Vector<ushort> PolynomialMultiplyLongTop(Vector<byte> op1, Vector<byte> op2);  // svpmullt[_u16]: PMULLT
  public static unsafe Vector<ulong> PolynomialMultiplyLongTop(Vector<uint> op1, Vector<uint> op2);  // svpmullt[_u64]: PMULLT
  public static unsafe Vector<ushort> PolynomialMultiplyLongTop(Vector<byte> op1, byte op2);  // svpmullt[_n_u16]: PMULLT
  public static unsafe Vector<ulong> PolynomialMultiplyLongTop(Vector<uint> op1, uint op2);  // svpmullt[_n_u64]: PMULLT
  public static unsafe Vector<byte> PolynomialMultiplyLongTop(Vector<byte> op1, Vector<byte> op2);  // svpmullt_pair[_u8]: PMULLT
  public static unsafe Vector<uint> PolynomialMultiplyLongTop(Vector<uint> op1, Vector<uint> op2);  // svpmullt_pair[_u32]: PMULLT
  public static unsafe Vector<byte> PolynomialMultiplyLongTop(Vector<byte> op1, byte op2);  // svpmullt_pair[_n_u8]: PMULLT
  public static unsafe Vector<uint> PolynomialMultiplyLongTop(Vector<uint> op1, uint op2);  // svpmullt_pair[_n_u32]: PMULLT
  public static unsafe Vector<ulong> PolynomialMultiplyLongTop(Vector<ulong> op1, Vector<ulong> op2);  // svpmullt_pair[_u64]: PMULLT
  public static unsafe Vector<ulong> PolynomialMultiplyLongTop(Vector<ulong> op1, ulong op2);  // svpmullt_pair[_n_u64]: PMULLT
}

API Usage

See part 1: 93459

Alternative Designs

No response

Risks

No response

Author: a74nh
Assignees: -
Labels:

api-suggestion, area-System.Runtime.Intrinsics

Milestone: -

@a74nh
Copy link
Contributor Author

a74nh commented Oct 13, 2023

@a74nh
Copy link
Contributor Author

a74nh commented Oct 17, 2023

Closing this. Replaced by newer issues.

@a74nh a74nh closed this as completed Oct 17, 2023
@ghost ghost removed the untriaged New issue has not been triaged by the area owner label Oct 17, 2023
@ghost ghost locked as resolved and limited conversation to collaborators Nov 16, 2023
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
api-suggestion Early API idea and discussion, it is NOT ready for implementation area-System.Runtime.Intrinsics
Projects
None yet
Development

No branches or pull requests

1 participant