Skip to content

[Arm64] More overloads for *BySelectedScalar methods #33683

Description

@echesakov

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)...

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions