Skip to content

ARM Doubling Multiply intrinsics #36696

@tannergooding

Description

@tannergooding
namespace System.Runtime.Intrinsics.Arm
{
    public abstract class AdvSimd
    {
        /// <summary>
        /// Signed saturating doubling multiply returning high half
        /// Corresponds to vector forms of SQDMULH and VQDMULH
        /// </summary>
        public static Vector64<short> DoublingMultiplySaturateHigh(Vector64<short> left, Vector64<short> right);
        public static Vector64<int> DoublingMultiplySaturateHigh(Vector64<int> left, Vector64<int> right);
        public static Vector128<short> DoublingMultiplySaturateHigh(Vector128<short> left, Vector128<short> right);
        public static Vector128<int> DoublingMultiplySaturateHigh(Vector128<int> left, Vector128<int> right);

        public static Vector64<short> DoublingMultiplyBySelectedScalarSaturateHigh(Vector64<short> left, Vector64<short> right, byte rightIndex);
        public static Vector64<int> DoublingMultiplyBySelectedScalarSaturateHigh(Vector64<int> left, Vector64<int> right, byte rightIndex);
        public static Vector64<short> DoublingMultiplyBySelectedScalarSaturateHigh(Vector64<short> left, Vector128<short> right, byte rightIndex);
        public static Vector64<int> DoublingMultiplyBySelectedScalarSaturateHigh(Vector64<int> left, Vector128<int> right, byte rightIndex);
        public static Vector128<short> DoublingMultiplyBySelectedScalarSaturateHigh(Vector128<short> left, Vector64<short> right, byte rightIndex);
        public static Vector128<int> DoublingMultiplyBySelectedScalarSaturateHigh(Vector128<int> left, Vector64<int> right, byte rightIndex);
        public static Vector128<short> DoublingMultiplyBySelectedScalarSaturateHigh(Vector128<short> left, Vector128<short> right, byte rightIndex);
        public static Vector128<int> DoublingMultiplyBySelectedScalarSaturateHigh(Vector128<int> left, Vector128<int> right, byte rightIndex);

        public static Vector64<short> DoublingMultiplySaturateHighScalar(Vector64<short> left, Vector64<short> right);
        public static Vector64<int> DoublingMultiplySaturateHighScalar(Vector64<int> left, Vector64<int> right);

        // TODO: Scalar BySelectedScalar variant

        /// <summary>
        /// Signed saturating rounding doubling multiply returning high half
        /// Corresponds to vector forms of SQRDMULH and VQRDMULH
        /// </summary>
        public static Vector64<short> RoundedDoublingMultiplySaturateHigh(Vector64<short> left, Vector64<short> right);
        public static Vector64<int> RoundedDoublingMultiplySaturateHigh(Vector64<int> left, Vector64<int> right);
        public static Vector128<short> RoundedDoublingMultiplySaturateHigh(Vector128<short> left, Vector128<short> right);
        public static Vector128<int> RoundedDoublingMultiplySaturateHigh(Vector128<int> left, Vector128<int> right);

        public static Vector64<short> RoundedDoublingMultiplyBySelectedScalarSaturateHigh(Vector64<short> left, Vector64<short> right, byte rightIndex);
        public static Vector64<int> RoundedDoublingMultiplyBySelectedScalarSaturateHigh(Vector64<int> left, Vector64<int> right, byte rightIndex);
        public static Vector64<short> RoundedDoublingMultiplyBySelectedScalarSaturateHigh(Vector64<short> left, Vector128<short> right, byte rightIndex);
        public static Vector64<int> RoundedDoublingMultiplyBySelectedScalarSaturateHigh(Vector64<int> left, Vector128<int> right, byte rightIndex);
        public static Vector128<short> RoundedDoublingMultiplyBySelectedScalarSaturateHigh(Vector128<short> left, Vector64<short> right, byte rightIndex);
        public static Vector128<int> RoundedDoublingMultiplyBySelectedScalarSaturateHigh(Vector128<int> left, Vector64<int> right, byte rightIndex);
        public static Vector128<short> RoundedDoublingMultiplyBySelectedScalarSaturateHigh(Vector128<short> left, Vector128<short> right, byte rightIndex);
        public static Vector128<int> RoundedDoublingMultiplyBySelectedScalarSaturateHigh(Vector128<int> left, Vector128<int> right, byte rightIndex);

        public static Vector64<short> RoundedDoublingMultiplySaturateHighScalar(Vector64<short> left, Vector64<short> right);
        public static Vector64<int> RoundedDoublingMultiplySaturateHighScalar(Vector64<int> left, Vector64<int> right);

        // TODO: Scalar BySelectedScalar variant

        /// <summary>
        /// Signed Saturating Rounding Doubling Multiply Accumulate returning High Half
        /// Corresponds to vector forms of SQRDMLAH and VQRDMLAH
        /// </summary>
        public static Vector64<short> RoundedDoublingMultiplyAddSaturateHigh(Vector64<short> addend, Vector64<short> left, Vector64<short> right);
        public static Vector64<int> RoundedDoublingMultiplyAddSaturateHigh(Vector64<int> addend, Vector64<int> left, Vector64<int> right);
        public static Vector128<short> RoundedDoublingMultiplyAddSaturateHigh(Vector128<short> addend, Vector128<short> left, Vector128<short> right);
        public static Vector128<int> RoundedDoublingMultiplyAddSaturateHigh(Vector128<int> addend, Vector128<int> left, Vector128<int> right);

        public static Vector64<short> RoundedDoublingMultiplyAddBySelectedScalarSaturateHigh(Vector64<short> addend, Vector64<short> left, Vector64<short> right, byte rightIndex);
        public static Vector64<int> RoundedDoublingMultiplyAddBySelectedScalarSaturateHigh(Vector64<int> addend, Vector64<int> left, Vector64<int> right, byte rightIndex);
        public static Vector64<short> RoundedDoublingMultiplyAddBySelectedScalarSaturateHigh(Vector64<short> addend, Vector64<short> left, Vector128<short> right, byte rightIndex);
        public static Vector64<int> RoundedDoublingMultiplyAddBySelectedScalarSaturateHigh(Vector64<int> addend, Vector64<int> left, Vector128<int> right, byte rightIndex);
        public static Vector128<short> RoundedDoublingMultiplyAddBySelectedScalarSaturateHigh(Vector128<short> addend, Vector128<short> left, Vector64<short> right, byte rightIndex);
        public static Vector128<int> RoundedDoublingMultiplyAddBySelectedScalarSaturateHigh(Vector128<int> addend, Vector128<int> left, Vector64<int> right, byte rightIndex);
        public static Vector128<short> RoundedDoublingMultiplyAddBySelectedScalarSaturateHigh(Vector128<short> addend, Vector128<short> left, Vector128<short> right, byte rightIndex);
        public static Vector128<int> RoundedDoublingMultiplyAddBySelectedScalarSaturateHigh(Vector128<int> addend, Vector128<int> left, Vector128<int> right, byte rightIndex);

        public static Vector64<short> RoundedDoublingMultiplyAddSaturateHighScalar(Vector64<short> addend, Vector64<short> left, Vector64<short> right);
        public static Vector64<int> RoundedDoublingMultiplyAddSaturateHighScalar(Vector64<int> addend, Vector64<int> left, Vector64<int> right);

        // TODO: Scalar BySelectedScalar variant

        /// <summary>
        /// Signed saturating rounding doubling multiply subtract returning high half
        /// Corresponds to vector forms of SQRDMLSH and VQRDMLSH
        /// </summary>
        public static Vector64<short> RoundedDoublingMultiplySubtractSaturateHigh(Vector64<short> minuend, Vector64<short> left, Vector64<short> right);
        public static Vector64<int> RoundedDoublingMultiplySubtractSaturateHigh(Vector64<int> minuend, Vector64<int> left, Vector64<int> right);
        public static Vector128<short> RoundedDoublingMultiplySubtractSaturateHigh(Vector128<short> minuend, Vector128<short> left, Vector128<short> right);
        public static Vector128<int> RoundedDoublingMultiplySubtractSaturateHigh(Vector128<int> minuend, Vector128<int> left, Vector128<int> right);

        public static Vector64<short> RoundedDoublingMultiplySubtractBySelectedScalarSaturateHigh(Vector64<short> minuend, Vector64<short> left, Vector64<short> right, byte rightIndex);
        public static Vector64<int> RoundedDoublingMultiplySubtractBySelectedScalarSaturateHigh(Vector64<int> minuend, Vector64<int> left, Vector64<int> right, byte rightIndex);
        public static Vector64<short> RoundedDoublingMultiplySubtractBySelectedScalarSaturateHigh(Vector64<short> minuend, Vector64<short> left, Vector128<short> right, byte rightIndex);
        public static Vector64<int> RoundedDoublingMultiplySubtractBySelectedScalarSaturateHigh(Vector64<int> minuend, Vector64<int> left, Vector128<int> right, byte rightIndex);
        public static Vector128<short> RoundedDoublingMultiplySubtractBySelectedScalarSaturateHigh(Vector128<short> minuend, Vector128<short> left, Vector64<short> right, byte rightIndex);
        public static Vector128<int> RoundedDoublingMultiplySubtractBySelectedScalarSaturateHigh(Vector128<int> minuend, Vector128<int> left, Vector64<int> right, byte rightIndex);
        public static Vector128<short> RoundedDoublingMultiplySubtractBySelectedScalarSaturateHigh(Vector128<short> minuend, Vector128<short> left, Vector128<short> right, byte rightIndex);
        public static Vector128<int> RoundedDoublingMultiplySubtractBySelectedScalarSaturateHigh(Vector128<int> minuend, Vector128<int> left, Vector128<int> right, byte rightIndex);

        public static Vector64<short> RoundedDoublingMultiplySubtractSaturateHighScalar(Vector64<short> minuend, Vector64<short> left, Vector64<short> right);
        public static Vector64<int> RoundedDoublingMultiplySubtractSaturateHighScalar(Vector64<int> minuend, Vector64<int> left, Vector64<int> right);

        // TODO: Scalar BySelectedScalar variant

        /// <summary>
        /// Signed saturating Doubling Multiply-Add Long
        /// Corresponds to vector forms of SQDMULL and VQDMULL
        /// </summary>
        public static Vector64<short> DoublingMultiplyWideningLowerSaturate(Vector64<short> left, Vector64<short> right);
        public static Vector64<int> DoublingMultiplyWideningLowerSaturate(Vector64<int> left, Vector64<int> right);
        public static Vector128<short> DoublingMultiplyWideningLowerSaturate(Vector128<short> left, Vector128<short> right);
        public static Vector128<int> DoublingMultiplyWideningLowerSaturate(Vector128<int> left, Vector128<int> right);

        public static Vector64<short> DoublingMultiplyWideningLowerBySelectedScalarSaturate(Vector64<short> left, Vector64<short> right, byte rightIndex);
        public static Vector64<int> DoublingMultiplyWideningLowerBySelectedScalarSaturate(Vector64<int> left, Vector64<int> right, byte rightIndex);
        public static Vector64<short> DoublingMultiplyWideningLowerBySelectedScalarSaturate(Vector64<short> left, Vector128<short> right, byte rightIndex);
        public static Vector64<int> DoublingMultiplyWideningLowerBySelectedScalarSaturate(Vector64<int> left, Vector128<int> right, byte rightIndex);
        public static Vector128<short> DoublingMultiplyWideningLowerBySelectedScalarSaturate(Vector128<short> left, Vector64<short> right, byte rightIndex);
        public static Vector128<int> DoublingMultiplyWideningLowerBySelectedScalarSaturate(Vector128<int> left, Vector64<int> right, byte rightIndex);
        public static Vector128<short> DoublingMultiplyWideningLowerBySelectedScalarSaturate(Vector128<short> left, Vector128<short> right, byte rightIndex);
        public static Vector128<int> DoublingMultiplyWideningLowerBySelectedScalarSaturate(Vector128<int> left, Vector128<int> right, byte rightIndex);

        public static Vector64<short> DoublingMultiplyWideningLowerSaturateScalar(Vector64<short> left, Vector64<short> right);
        public static Vector64<int> DoublingMultiplyWideningLowerSaturateScalar(Vector64<int> left, Vector64<int> right);

        // TODO: Scalar BySelectedScalar variant

        /// <summary>
        /// Signed saturating Doubling Multiply-Add Long
        /// Corresponds to vector forms of SQDMLAL and VQDMLAL
        /// </summary>
        public static Vector64<short> DoublingMultiplyAddWideningLowerSaturate(Vector64<short> addend, Vector64<short> left, Vector64<short> right);
        public static Vector64<int> DoublingMultiplyAddWideningLowerSaturate(Vector64<int> addend, Vector64<int> left, Vector64<int> right);
        public static Vector128<short> DoublingMultiplyAddWideningLowerSaturate(Vector128<short> addend, Vector128<short> left, Vector128<short> right);
        public static Vector128<int> DoublingMultiplyAddWideningLowerSaturate(Vector128<int> addend, Vector128<int> left, Vector128<int> right);

        public static Vector64<short> DoublingMultiplyAddWideningLowerBySelectedScalarSaturate(Vector64<short> addend, Vector64<short> left, Vector64<short> right, byte rightIndex);
        public static Vector64<int> DoublingMultiplyAddWideningLowerBySelectedScalarSaturate(Vector64<int> addend, Vector64<int> left, Vector64<int> right, byte rightIndex);
        public static Vector64<short> DoublingMultiplyAddWideningLowerBySelectedScalarSaturate(Vector64<short> addend, Vector64<short> left, Vector128<short> right, byte rightIndex);
        public static Vector64<int> DoublingMultiplyAddWideningLowerBySelectedScalarSaturate(Vector64<int> addend, Vector64<int> left, Vector128<int> right, byte rightIndex);
        public static Vector128<short> DoublingMultiplyAddWideningLowerBySelectedScalarSaturate(Vector128<short> addend, Vector128<short> left, Vector64<short> right, byte rightIndex);
        public static Vector128<int> DoublingMultiplyAddWideningLowerBySelectedScalarSaturate(Vector128<int> addend, Vector128<int> left, Vector64<int> right, byte rightIndex);
        public static Vector128<short> DoublingMultiplyAddWideningLowerBySelectedScalarSaturate(Vector128<short> addend, Vector128<short> left, Vector128<short> right, byte rightIndex);
        public static Vector128<int> DoublingMultiplyAddWideningLowerBySelectedScalarSaturate(Vector128<int> addend, Vector128<int> left, Vector128<int> right, byte rightIndex);

        public static Vector64<short> DoublingMultiplyAddWideningLowerSaturateScalar(Vector64<short> addend, Vector64<short> left, Vector64<short> right);
        public static Vector64<int> DoublingMultiplyAddWideningLowerSaturateScalar(Vector64<int> addend, Vector64<int> left, Vector64<int> right);

        // TODO: Scalar BySelectedScalar variant

        /// <summary>
        /// Signed saturating Doubling Multiply-Subtract Long
        /// Corresponds to vector forms of SQDMLSL and VQDMLSL
        /// </summary>
        public static Vector64<short> DoublingMultiplySubtractWideningLowerSaturate(Vector64<short> minuend, Vector64<short> left, Vector64<short> right);
        public static Vector64<int> DoublingMultiplySubtractWideningLowerSaturate(Vector64<int> minuend, Vector64<int> left, Vector64<int> right);
        public static Vector128<short> DoublingMultiplySubtractWideningLowerSaturate(Vector128<short> minuend, Vector128<short> left, Vector128<short> right);
        public static Vector128<int> DoublingMultiplySubtractWideningLowerSaturate(Vector128<int> minuend, Vector128<int> left, Vector128<int> right);

        public static Vector64<short> DoublingMultiplySubtractWideningLowerBySelectedScalarSaturate(Vector64<short> minuend, Vector64<short> left, Vector64<short> right, byte rightIndex);
        public static Vector64<int> DoublingMultiplySubtractWideningLowerBySelectedScalarSaturate(Vector64<int> minuend, Vector64<int> left, Vector64<int> right, byte rightIndex);
        public static Vector64<short> DoublingMultiplySubtractWideningLowerBySelectedScalarSaturate(Vector64<short> minuend, Vector64<short> left, Vector128<short> right, byte rightIndex);
        public static Vector64<int> DoublingMultiplySubtractWideningLowerBySelectedScalarSaturate(Vector64<int> minuend, Vector64<int> left, Vector128<int> right, byte rightIndex);
        public static Vector128<short> DoublingMultiplySubtractWideningLowerBySelectedScalarSaturate(Vector128<short> minuend, Vector128<short> left, Vector64<short> right, byte rightIndex);
        public static Vector128<int> DoublingMultiplySubtractWideningLowerBySelectedScalarSaturate(Vector128<int> minuend, Vector128<int> left, Vector64<int> right, byte rightIndex);
        public static Vector128<short> DoublingMultiplySubtractWideningLowerBySelectedScalarSaturate(Vector128<short> minuend, Vector128<short> left, Vector128<short> right, byte rightIndex);
        public static Vector128<int> DoublingMultiplySubtractWideningLowerBySelectedScalarSaturate(Vector128<int> minuend, Vector128<int> left, Vector128<int> right, byte rightIndex);

        public static Vector64<short> DoublingMultiplySubtractWideningLowerSaturateScalar(Vector64<short> minuend, Vector64<short> left, Vector64<short> right);
        public static Vector64<int> DoublingMultiplySubtractWideningLowerSaturateScalar(Vector64<int> minuend, Vector64<int> left, Vector64<int> right);

        // TODO: Scalar BySelectedScalar variant
    }
}

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions