-
Notifications
You must be signed in to change notification settings - Fork 5.3k
Closed
Labels
api-approvedAPI was approved in API review, it can be implementedAPI was approved in API review, it can be implementedarch-arm64area-System.Runtime.Intrinsics
Milestone
Description
Follow-up on #24794 (comment)
namespace System.Runtime.Intrinsics.Arm
{
public abstract class AdvSimd
{
public abstract class Arm64
{
/// <summary>
/// Floating-point fused Multiply-Add to accumulator
/// For each element result[elem] = addend[elem] + left[elem] * right[rightIndex]
/// Corresponds to vector forms of FMLA
/// </summary>
public static Vector64<float> FusedMultiplyAddBySelectedScalar(Vector64<float> addend, Vector64<float> left, Vector64<float> right, byte rightIndex);
public static Vector64<float> FusedMultiplyAddBySelectedScalar(Vector64<float> addend, Vector64<float> left, Vector128<float> right, byte rightIndex);
public static Vector128<double> FusedMultiplyAddBySelectedScalar(Vector128<double> addend, Vector128<double> left, Vector128<double> right, byte rightIndex);
public static Vector128<float> FusedMultiplyAddBySelectedScalar(Vector128<float> addend, Vector128<float> left, Vector64<float> right, byte rightIndex);
public static Vector128<float> FusedMultiplyAddBySelectedScalar(Vector128<float> addend, Vector128<float> left, Vector128<float> right, byte rightIndex);
public static Vector64<double> FusedMultiplyAddScalarBySelectedScalar(Vector64<double> addend, Vector64<double> left, Vector128<double> right, byte rightIndex);
public static Vector64<float> FusedMultiplyAddScalarBySelectedScalar(Vector64<float> addend, Vector64<float> left, Vector64<float> right, byte rightIndex);
public static Vector64<float> FusedMultiplyAddScalarBySelectedScalar(Vector64<float> addend, Vector64<float> left, Vector128<float> right, byte rightIndex);
public static Vector64<double> FusedMultiplyAddScalar(Vector64<double> addend, Vector64<double> left, Vector64<double> right);
public static Vector128<double> FusedMultiplyAddByScalar(Vector128<double> addend, Vector128<double> left, Vector64<double> right);
/// <summary>
/// Floating-point fused Multiply-Subtract from accumulator
/// For each element result[elem] = minuend[elem] - left[elem] * right[rightIndex]
/// Corresponds to vector forms of FMLA
/// </summary>
public static Vector64<float> FusedMultiplySubtractBySelectedScalar(Vector64<float> minuend, Vector64<float> left, Vector64<float> right, byte rightIndex);
public static Vector64<float> FusedMultiplySubtractBySelectedScalar(Vector64<float> minuend, Vector64<float> left, Vector128<float> right, byte rightIndex);
public static Vector128<double> FusedMultiplySubtractBySelectedScalar(Vector128<double> minuend, Vector128<double> left, Vector128<double> right, byte rightIndex);
public static Vector128<float> FusedMultiplySubtractBySelectedScalar(Vector128<float> minuend, Vector128<float> left, Vector64<float> right, byte rightIndex);
public static Vector128<float> FusedMultiplySubtractBySelectedScalar(Vector128<float> minuend, Vector128<float> left, Vector128<float> right, byte rightIndex);
public static Vector64<double> FusedMultiplySubtractScalarBySelectedScalar(Vector64<double> minuend, Vector64<double> left, Vector128<double> right, byte rightIndex);
public static Vector64<float> FusedMultiplySubtractScalarBySelectedScalar(Vector64<float> minuend, Vector64<float> left, Vector64<float> right, byte rightIndex);
public static Vector64<float> FusedMultiplySubtractScalarBySelectedScalar(Vector64<float> minuend, Vector64<float> left, Vector128<float> right, byte rightIndex);
public static Vector64<double> FusedMultiplySubtractScalar(Vector64<double> minuend, Vector64<double> left, Vector64<double> right);
public static Vector128<double> FusedMultiplySubtractByScalar(Vector128<double> minuend, Vector128<double> left, Vector64<double> right);
/// <summary>
/// Floating-point Multiply
/// For each element result[elem] = left[elem] * right[rightIndex]
/// Corresponds to vector forms of FMUL
/// </summary>
public static Vector64<float> MultiplyBySelectedScalar(Vector64<float> left, Vector64<float> right, byte rightIndex);
public static Vector64<float> MultiplyBySelectedScalar(Vector64<float> left, Vector128<float> right, byte rightIndex);
public static Vector128<double> MultiplyBySelectedScalar(Vector128<double> left, Vector128<double> right, byte rightIndex);
public static Vector128<float> MultiplyBySelectedScalar(Vector128<float> left, Vector64<float> right, byte rightIndex);
public static Vector128<float> MultiplyBySelectedScalar(Vector128<float> left, Vector128<float> right, byte rightIndex);
public static Vector64<double> MultiplyScalarBySelectedScalar(Vector64<double> left, Vector128<double> right, byte rightIndex);
public static Vector64<float> MultiplyScalarBySelectedScalar(Vector64<float> left, Vector64<float> right, byte rightIndex);
public static Vector64<float> MultiplyScalarBySelectedScalar(Vector64<float> left, Vector128<float> right, byte rightIndex);
public static Vector64<double> MultiplyScalar(Vector64<double> left, Vector64<double> right);
public static Vector128<double> MultiplyByScalar(Vector128<double> left, Vector64<double> right);
/// <summary>
/// Floating-point Multiply extended
/// For each element result[elem] = left[elem] * right[rightIndex]
/// Corresponds to vector forms of FMULX
/// </summary>
// public static Vector64<float> MultiplyExtendedBySelectedScalar(Vector64<float> left, Vector64<float> right, byte rightIndex);
public static Vector64<float> MultiplyExtendedBySelectedScalar(Vector64<float> left, Vector128<float> right, byte rightIndex);
// public static Vector128<double> MultiplyExtendedBySelectedScalar(Vector128<double> left, Vector128<double> right, byte rightIndex);
public static Vector128<float> MultiplyExtendedBySelectedScalar(Vector128<float> left, Vector64<float> right, byte rightIndex);
// public static Vector128<float> MultiplyExtendedBySelectedScalar(Vector128<float> left, Vector128<float> right, byte rightIndex);
public static Vector64<double> MultiplyExtendedScalarBySelectedScalar(Vector64<double> left, Vector128<double> right, byte rightIndex);
public static Vector64<float> MultiplyExtendedScalarBySelectedScalar(Vector64<float> left, Vector64<float> right, byte rightIndex);
public static Vector64<float> MultiplyExtendedScalarBySelectedScalar(Vector64<float> left, Vector128<float> right, byte rightIndex);
public static Vector64<double> MultiplyExtendedScalar(Vector64<double> left, Vector64<double> right);
public static Vector128<double> MultiplyExtendedByScalar(Vector128<double> left, Vector64<double> right);
/// <summary>
/// Multiply-Add to accumulator
/// For each element result[elem] = addend[elem] + left[elem] * right[rightIndex]
/// Corresponds to vector forms of MLA
/// </summary>
// public static Vector64<byte> MultiplyAddBySelectedScalar(Vector64<byte> addend, Vector64<byte> left, Vector64<byte> right, byte rightIndex);
// public static Vector64<sbyte> MultiplyAddBySelectedScalar(Vector64<sbyte> addend, Vector64<sbyte> left, Vector64<sbyte> right, byte rightIndex);
// public static Vector64<ushort> MultiplyAddBySelectedScalar(Vector64<ushort> addend, Vector64<ushort> left, Vector64<ushort> right, byte rightIndex);
// public static Vector64<short> MultiplyAddBySelectedScalar(Vector64<short> addend, Vector64<short> left, Vector64<short> right, byte rightIndex);
// public static Vector64<uint> MultiplyAddBySelectedScalar(Vector64<uint> addend, Vector64<uint> left, Vector64<uint> right, byte rightIndex);
// public static Vector64<int> MultiplyAddBySelectedScalar(Vector64<int> addend, Vector64<int> left, Vector64<int> right, byte rightIndex);
public static Vector64<byte> MultiplyAddBySelectedScalar(Vector64<byte> addend, Vector64<byte> left, Vector128<byte> right, byte rightIndex);
public static Vector64<sbyte> MultiplyAddBySelectedScalar(Vector64<sbyte> addend, Vector64<sbyte> left, Vector128<sbyte> right, byte rightIndex);
public static Vector64<ushort> MultiplyAddBySelectedScalar(Vector64<ushort> addend, Vector64<ushort> left, Vector128<ushort> right, byte rightIndex);
public static Vector64<short> MultiplyAddBySelectedScalar(Vector64<short> addend, Vector64<short> left, Vector128<short> right, byte rightIndex);
public static Vector64<uint> MultiplyAddBySelectedScalar(Vector64<uint> addend, Vector64<uint> left, Vector128<uint> right, byte rightIndex);
public static Vector64<int> MultiplyAddBySelectedScalar(Vector64<int> addend, Vector64<int> left, Vector128<int> right, byte rightIndex);
public static Vector128<byte> MultiplyAddBySelectedScalar(Vector128<byte> addend, Vector128<byte> left, Vector64<byte> right, byte rightIndex);
public static Vector128<sbyte> MultiplyAddBySelectedScalar(Vector128<sbyte> addend, Vector128<sbyte> left, Vector64<sbyte> right, byte rightIndex);
public static Vector128<ushort> MultiplyAddBySelectedScalar(Vector128<ushort> addend, Vector128<ushort> left, Vector64<ushort> right, byte rightIndex);
public static Vector128<short> MultiplyAddBySelectedScalar(Vector128<short> addend, Vector128<short> left, Vector64<short> right, byte rightIndex);
public static Vector128<uint> MultiplyAddBySelectedScalar(Vector128<uint> addend, Vector128<uint> left, Vector64<uint> right, byte rightIndex);
public static Vector128<int> MultiplyAddBySelectedScalar(Vector128<int> addend, Vector128<int> left, Vector64<int> right, byte rightIndex);
// public static Vector128<byte> MultiplyAddBySelectedScalar(Vector128<byte> addend, Vector128<byte> left, Vector128<byte> right, byte rightIndex);
// public static Vector128<sbyte> MultiplyAddBySelectedScalar(Vector128<sbyte> addend, Vector128<sbyte> left, Vector128<sbyte> right, byte rightIndex);
// public static Vector128<ushort> MultiplyAddBySelectedScalar(Vector128<ushort> addend, Vector128<ushort> left, Vector128<ushort> right, byte rightIndex);
// public static Vector128<short> MultiplyAddBySelectedScalar(Vector128<short> addend, Vector128<short> left, Vector128<short> right, byte rightIndex);
// public static Vector128<uint> MultiplyAddBySelectedScalar(Vector128<uint> addend, Vector128<uint> left, Vector128<uint> right, byte rightIndex);
// public static Vector128<int> MultiplyAddBySelectedScalar(Vector128<int> addend, Vector128<int> left, Vector128<int> right, byte rightIndex);
/// <summary>
/// Multiply-Subtract from accumulator
/// For each element result[elem] = minuend - left[elem] * right[rightIndex]
/// Corresponds to vector forms of MLS
/// </summary>
// public static Vector64<byte> MultiplySubtractBySelectedScalar(Vector64<byte> minuend, Vector64<byte> left, Vector64<byte> right, byte rightIndex);
// public static Vector64<sbyte> MultiplySubtractBySelectedScalar(Vector64<sbyte> minuend, Vector64<sbyte> left, Vector64<sbyte> right, byte rightIndex);
// public static Vector64<ushort> MultiplySubtractBySelectedScalar(Vector64<ushort> minuend, Vector64<ushort> left, Vector64<ushort> right, byte rightIndex);
// public static Vector64<short> MultiplySubtractBySelectedScalar(Vector64<short> minuend, Vector64<short> left, Vector64<short> right, byte rightIndex);
// public static Vector64<uint> MultiplySubtractBySelectedScalar(Vector64<uint> minuend, Vector64<uint> left, Vector64<uint> right, byte rightIndex);
// public static Vector64<int> MultiplySubtractBySelectedScalar(Vector64<int> minuend, Vector64<int> left, Vector64<int> right, byte rightIndex);
public static Vector64<byte> MultiplySubtractBySelectedScalar(Vector64<byte> minuend, Vector64<byte> left, Vector128<byte> right, byte rightIndex);
public static Vector64<sbyte> MultiplySubtractBySelectedScalar(Vector64<sbyte> minuend, Vector64<sbyte> left, Vector128<sbyte> right, byte rightIndex);
public static Vector64<ushort> MultiplySubtractBySelectedScalar(Vector64<ushort> minuend, Vector64<ushort> left, Vector128<ushort> right, byte rightIndex);
public static Vector64<short> MultiplySubtractBySelectedScalar(Vector64<short> minuend, Vector64<short> left, Vector128<short> right, byte rightIndex);
public static Vector64<uint> MultiplySubtractBySelectedScalar(Vector64<uint> minuend, Vector64<uint> left, Vector128<uint> right, byte rightIndex);
public static Vector64<int> MultiplySubtractBySelectedScalar(Vector64<int> minuend, Vector64<int> left, Vector128<int> right, byte rightIndex);
public static Vector128<byte> MultiplySubtractBySelectedScalar(Vector128<byte> minuend, Vector128<byte> left, Vector64<byte> right, byte rightIndex);
public static Vector128<sbyte> MultiplySubtractBySelectedScalar(Vector128<sbyte> minuend, Vector128<sbyte> left, Vector64<sbyte> right, byte rightIndex);
public static Vector128<ushort> MultiplySubtractBySelectedScalar(Vector128<ushort> minuend, Vector128<ushort> left, Vector64<ushort> right, byte rightIndex);
public static Vector128<short> MultiplySubtractBySelectedScalar(Vector128<short> minuend, Vector128<short> left, Vector64<short> right, byte rightIndex);
public static Vector128<uint> MultiplySubtractBySelectedScalar(Vector128<uint> minuend, Vector128<uint> left, Vector64<uint> right, byte rightIndex);
public static Vector128<int> MultiplySubtractBySelectedScalar(Vector128<int> minuend, Vector128<int> left, Vector64<int> right, byte rightIndex);
// public static Vector128<byte> MultiplySubtractBySelectedScalar(Vector128<byte> minuend, Vector128<byte> left, Vector128<byte> right, byte rightIndex);
// public static Vector128<sbyte> MultiplySubtractBySelectedScalar(Vector128<sbyte> minuend, Vector128<sbyte> left, Vector128<sbyte> right, byte rightIndex);
// public static Vector128<ushort> MultiplySubtractBySelectedScalar(Vector128<ushort> minuend, Vector128<ushort> left, Vector128<ushort> right, byte rightIndex);
// public static Vector128<short> MultiplySubtractBySelectedScalar(Vector128<short> minuend, Vector128<short> left, Vector128<short> right, byte rightIndex);
// public static Vector128<uint> MultiplySubtractBySelectedScalar(Vector128<uint> minuend, Vector128<uint> left, Vector128<uint> right, byte rightIndex);
// public static Vector128<int> MultiplySubtractBySelectedScalar(Vector128<int> minuend, Vector128<int> left, Vector128<int> right, byte rightIndex);
/// <summary>
/// Multiply
/// For each element result[elem] = left[elem] * right[rightIndex]
/// Corresponds to vector forms of MUL
/// </summary>
public static Vector64<byte> MultiplyBySelectedScalar(Vector64<byte> left, Vector64<byte> right, byte rightIndex);
public static Vector64<sbyte> MultiplyBySelectedScalar(Vector64<sbyte> left, Vector64<sbyte> right, byte rightIndex);
public static Vector64<ushort> MultiplyBySelectedScalar(Vector64<ushort> left, Vector64<ushort> right, byte rightIndex);
public static Vector64<short> MultiplyBySelectedScalar(Vector64<short> left, Vector64<short> right, byte rightIndex);
public static Vector64<uint> MultiplyBySelectedScalar(Vector64<uint> left, Vector64<uint> right, byte rightIndex);
public static Vector64<int> MultiplyBySelectedScalar(Vector64<int> left, Vector64<int> right, byte rightIndex);
public static Vector64<byte> MultiplyBySelectedScalar(Vector64<byte> left, Vector128<byte> right, byte rightIndex);
public static Vector64<sbyte> MultiplyBySelectedScalar(Vector64<sbyte> left, Vector128<sbyte> right, byte rightIndex);
public static Vector64<ushort> MultiplyBySelectedScalar(Vector64<ushort> left, Vector128<ushort> right, byte rightIndex);
public static Vector64<short> MultiplyBySelectedScalar(Vector64<short> left, Vector128<short> right, byte rightIndex);
public static Vector64<uint> MultiplyBySelectedScalar(Vector64<uint> left, Vector128<uint> right, byte rightIndex);
public static Vector64<int> MultiplyBySelectedScalar(Vector64<int> left, Vector128<int> right, byte rightIndex);
public static Vector128<byte> MultiplyBySelectedScalar(Vector128<byte> left, Vector64<byte> right, byte rightIndex);
public static Vector128<sbyte> MultiplyBySelectedScalar(Vector128<sbyte> left, Vector64<sbyte> right, byte rightIndex);
public static Vector128<ushort> MultiplyBySelectedScalar(Vector128<ushort> left, Vector64<ushort> right, byte rightIndex);
public static Vector128<short> MultiplyBySelectedScalar(Vector128<short> left, Vector64<short> right, byte rightIndex);
public static Vector128<uint> MultiplyBySelectedScalar(Vector128<uint> left, Vector64<uint> right, byte rightIndex);
public static Vector128<int> MultiplyBySelectedScalar(Vector128<int> left, Vector64<int> right, byte rightIndex);
public static Vector128<byte> MultiplyBySelectedScalar(Vector128<byte> left, Vector128<byte> right, byte rightIndex);
public static Vector128<sbyte> MultiplyBySelectedScalar(Vector128<sbyte> left, Vector128<sbyte> right, byte rightIndex);
public static Vector128<ushort> MultiplyBySelectedScalar(Vector128<ushort> left, Vector128<ushort> right, byte rightIndex);
public static Vector128<short> MultiplyBySelectedScalar(Vector128<short> left, Vector128<short> right, byte rightIndex);
public static Vector128<uint> MultiplyBySelectedScalar(Vector128<uint> left, Vector128<uint> right, byte rightIndex);
public static Vector128<int> MultiplyBySelectedScalar(Vector128<int> left, Vector128<int> right, byte rightIndex);
/// <summary>
/// Signed or Unsigned Multiply-Add Long
/// For each element result[elem] = addend[elem] + left[elem] * right[rightIndex]
/// Corresponds to vector forms of SMLAL and UMLAL
/// </summary>
public static Vector128<int> MultiplyWideningLowerAndAdd(Vector128<int> addend, Vector64<short> left, Vector64<short> right, byte rightIndex);
public static Vector128<uint> MultiplyWideningLowerAndAdd(Vector128<uint> addend, Vector64<ushort> left, Vector64<ushort> right, byte rightIndex);
public static Vector128<long> MultiplyWideningLowerAndAdd(Vector128<long> addend, Vector64<int> left, Vector64<int> right, byte rightIndex);
public static Vector128<ulong> MultiplyWideningLowerAndAdd(Vector128<ulong> addend, Vector64<uint> left, Vector64<uint> right, byte rightIndex);
public static Vector128<int> MultiplyWideningLowerAndAdd(Vector128<int> addend, Vector64<short> left, Vector128<short> right, byte rightIndex);
public static Vector128<uint> MultiplyWideningLowerAndAdd(Vector128<uint> addend, Vector64<ushort> left, Vector128<ushort> right, byte rightIndex);
public static Vector128<long> MultiplyWideningLowerAndAdd(Vector128<long> addend, Vector64<int> left, Vector128<int> right, byte rightIndex);
public static Vector128<ulong> MultiplyWideningLowerAndAdd(Vector128<ulong> addend, Vector64<uint> left, Vector128<uint> right, byte rightIndex);
/// <summary>
/// Signed or Unsigned Multiply-Add Long
/// For each element result[elem] = addend[elem] + left[elem] * right[rightIndex]
/// Corresponds to vector forms of SMLAL2 and UMLAL2
/// </summary>
public static Vector128<int> MultiplyWideningUpperAndAdd(Vector128<int> addend, Vector128<short> left, Vector128<short> right, byte rightIndex);
public static Vector128<uint> MultiplyWideningUpperAndAdd(Vector128<uint> addend, Vector128<ushort> left, Vector128<ushort> right, byte rightIndex);
public static Vector128<long> MultiplyWideningUpperAndAdd(Vector128<long> addend, Vector128<int> left, Vector128<int> right, byte rightIndex);
public static Vector128<ulong> MultiplyWideningUpperAndAdd(Vector128<ulong> addend, Vector128<uint> left, Vector128<uint> right, byte rightIndex);
public static Vector128<int> MultiplyWideningUpperAndAdd(Vector128<int> addend, Vector128<short> left, Vector128<short> right, byte rightIndex);
public static Vector128<uint> MultiplyWideningUpperAndAdd(Vector128<uint> addend, Vector128<ushort> left, Vector128<ushort> right, byte rightIndex);
public static Vector128<long> MultiplyWideningUpperAndAdd(Vector128<long> addend, Vector128<int> left, Vector128<int> right, byte rightIndex);
public static Vector128<ulong> MultiplyWideningUpperAndAdd(Vector128<ulong> addend, Vector128<uint> left, Vector128<uint> right, byte rightIndex);
/// <summary>
/// Signed or Unsigned Multiply-Subtract Long
/// For each element result[elem] = minuend[elem] - left[elem] * right[rightIndex]
/// Corresponds to vector forms of SMLSL and UMLSL
/// </summary>
public static Vector128<int> MultiplyWideningLowerAndSubtract(Vector128<int> addend, Vector64<short> left, Vector64<short> right, byte rightIndex);
public static Vector128<uint> MultiplyWideningLowerAndSubtract(Vector128<uint> addend, Vector64<ushort> left, Vector64<ushort> right, byte rightIndex);
public static Vector128<long> MultiplyWideningLowerAndSubtract(Vector128<long> addend, Vector64<int> left, Vector64<int> right, byte rightIndex);
public static Vector128<ulong> MultiplyWideningLowerAndSubtract(Vector128<ulong> addend, Vector64<uint> left, Vector64<uint> right, byte rightIndex);
public static Vector128<int> MultiplyWideningLowerAndSubtract(Vector128<int> addend, Vector64<short> left, Vector128<short> right, byte rightIndex);
public static Vector128<uint> MultiplyWideningLowerAndSubtract(Vector128<uint> addend, Vector64<ushort> left, Vector128<ushort> right, byte rightIndex);
public static Vector128<long> MultiplyWideningLowerAndSubtract(Vector128<long> addend, Vector64<int> left, Vector128<int> right, byte rightIndex);
public static Vector128<ulong> MultiplyWideningLowerAndSubtract(Vector128<ulong> addend, Vector64<uint> left, Vector128<uint> right, byte rightIndex);
/// <summary>
/// Signed or Unsigned Multiply-Subtract Long
/// For each element result[elem] = minuend[elem] - left[elem] * right[rightIndex]
/// Corresponds to vector forms of SMLSL2 and UMLSL2
/// </summary>
public static Vector128<int> MultiplyWideningUpperAndSubtract(Vector128<int> addend, Vector128<short> left, Vector128<short> right, byte rightIndex);
public static Vector128<uint> MultiplyWideningUpperAndSubtract(Vector128<uint> addend, Vector128<ushort> left, Vector128<ushort> right, byte rightIndex);
public static Vector128<long> MultiplyWideningUpperAndSubtract(Vector128<long> addend, Vector128<int> left, Vector128<int> right, byte rightIndex);
public static Vector128<ulong> MultiplyWideningUpperAndSubtract(Vector128<ulong> addend, Vector128<uint> left, Vector128<uint> right, byte rightIndex);
public static Vector128<int> MultiplyWideningUpperAndSubtract(Vector128<int> addend, Vector128<short> left, Vector128<short> right, byte rightIndex);
public static Vector128<uint> MultiplyWideningUpperAndSubtract(Vector128<uint> addend, Vector128<ushort> left, Vector128<ushort> right, byte rightIndex);
public static Vector128<long> MultiplyWideningUpperAndSubtract(Vector128<long> addend, Vector128<int> left, Vector128<int> right, byte rightIndex);
public static Vector128<ulong> MultiplyWideningUpperAndSubtract(Vector128<ulong> addend, Vector128<uint> left, Vector128<uint> right, byte rightIndex);
/// <summary>
/// Signed or Unsigned Multiply Long
/// For each element result[elem] = left[elem] * right[rightIndex]
/// Corresponds to vector forms of SMULL and UMULL
/// </summary>
public static Vector128<int> MultiplyWideningLower(Vector64<short> left, Vector64<short> right, byte rightIndex);
public static Vector128<uint> MultiplyWideningLower(Vector64<ushort> left, Vector64<ushort> right, byte rightIndex);
public static Vector128<long> MultiplyWideningLower(Vector64<int> left, Vector64<int> right, byte rightIndex);
public static Vector128<ulong> MultiplyWideningLower(Vector64<uint> left, Vector64<uint> right, byte rightIndex);
public static Vector128<int> MultiplyWideningLower(Vector64<short> left, Vector128<short> right, byte rightIndex);
public static Vector128<uint> MultiplyWideningLower(Vector64<ushort> left, Vector128<ushort> right, byte rightIndex);
public static Vector128<long> MultiplyWideningLower(Vector64<int> left, Vector128<int> right, byte rightIndex);
public static Vector128<ulong> MultiplyWideningLower(Vector64<uint> left, Vector128<uint> right, byte rightIndex);
/// <summary>
/// Signed or Unsigned Multiply Long
/// For each element result[elem] = left[elem] * right[rightIndex]
/// Corresponds to vector forms of SMULL2 and UMULL2
/// </summary>
public static Vector128<int> MultiplyWideningUpper(Vector128<short> left, Vector128<short> right, byte rightIndex);
public static Vector128<uint> MultiplyWideningUpper(Vector128<ushort> left, Vector128<ushort> right, byte rightIndex);
public static Vector128<long> MultiplyWideningUpper(Vector128<int> left, Vector128<int> right, byte rightIndex);
public static Vector128<ulong> MultiplyWideningUpper(Vector128<uint> left, Vector128<uint> right, byte rightIndex);
public static Vector128<int> MultiplyWideningUpper(Vector128<short> left, Vector128<short> right, byte rightIndex);
public static Vector128<uint> MultiplyWideningUpper(Vector128<ushort> left, Vector128<ushort> right, byte rightIndex);
public static Vector128<long> MultiplyWideningUpper(Vector128<int> left, Vector128<int> right, byte rightIndex);
public static Vector128<ulong> MultiplyWideningUpper(Vector128<uint> left, Vector128<uint> right, byte rightIndex);
}
}
}cc @terrajobst @tannergooding @TamarChristinaArm
One more question: do we need rightIndex parameter at all for FusedMultiplyAddBySelectedScalar(Vector128<double> addend, Vector128<double> left, Vector64<double> right, byte rightIndex) since it only can have one value (i.e. 0)
We might just have FusedMultiplyAddByScalar(Vector128<double> addend, Vector128<double> left, Vector64<double> right) for this one instead ? However, this could be confused with FusedMultiplyAddScalar(Vector64<double> acc, Vector64<double> left, Vector64<double> right)...
Metadata
Metadata
Assignees
Labels
api-approvedAPI was approved in API review, it can be implementedAPI was approved in API review, it can be implementedarch-arm64area-System.Runtime.Intrinsics