Skip to content

[API Proposal]: Arm64: FEAT_FP16 #94026

Open
@a74nh

Description

@a74nh
namespace System.Runtime.Intrinsics.Arm;

/// VectorT Summary
public abstract partial class SveFp16 : AdvSimd /// Feature: FEAT_FP16
{

  public static unsafe Vector<half> Abs(Vector<half> value); // FABS // predicated, MOVPRFX

  public static unsafe Vector<half> AbsoluteCompareGreaterThan(Vector<half> left, Vector<half> right); // FACGT // predicated

  public static unsafe Vector<half> AbsoluteCompareGreaterThanOrEqual(Vector<half> left, Vector<half> right); // FACGE // predicated

  public static unsafe Vector<half> AbsoluteCompareLessThan(Vector<half> left, Vector<half> right); // FACGT // predicated

  public static unsafe Vector<half> AbsoluteCompareLessThanOrEqual(Vector<half> left, Vector<half> right); // FACGE // predicated

  public static unsafe Vector<half> AbsoluteDifference(Vector<half> left, Vector<half> right); // FABD // predicated, MOVPRFX

  public static unsafe Vector<half> Add(Vector<half> left, Vector<half> right); // FADD // predicated, MOVPRFX

  public static unsafe Vector<half> AddAcross(Vector<half> value); // FADDV // predicated

  public static unsafe Vector<half> AddPairwise(Vector<half> left, Vector<half> right); // FADDP // predicated, MOVPRFX

  public static unsafe Vector<half> AddRotateComplex(Vector<half> left, Vector<half> right, [ConstantExpected] byte rotation); // FCADD // predicated, MOVPRFX

  public static unsafe Vector<half> AddSequentialAcross(Vector<half> initial, Vector<half> value); // FADDA // predicated

  public static unsafe Vector<half> CompareEqual(Vector<half> left, Vector<half> right); // FCMEQ // predicated

  public static unsafe Vector<half> CompareGreaterThan(Vector<half> left, Vector<half> right); // FCMGT // predicated

  public static unsafe Vector<half> CompareGreaterThanOrEqual(Vector<half> left, Vector<half> right); // FCMGE // predicated

  public static unsafe Vector<half> CompareLessThan(Vector<half> left, Vector<half> right); // FCMGT // predicated

  public static unsafe Vector<half> CompareLessThanOrEqual(Vector<half> left, Vector<half> right); // FCMGE // predicated

  public static unsafe Vector<half> CompareNotEqualTo(Vector<half> left, Vector<half> right); // FCMNE // predicated

  public static unsafe Vector<half> CompareUnordered(Vector<half> left, Vector<half> right); // FCMUO // predicated

  public static unsafe Vector<half> ConcatenateEvenInt128FromTwoInputs(Vector<half> left, Vector<half> right); // UZP1

  public static unsafe Vector<half> ConcatenateOddInt128FromTwoInputs(Vector<half> left, Vector<half> right); // UZP2

  public static unsafe Vector<half> ConditionalExtractAfterLastActiveElement(Vector<half> mask, Vector<half> defaultValue, Vector<half> data); // CLASTA // MOVPRFX

  public static unsafe half ConditionalExtractAfterLastActiveElement(Vector<half> mask, half defaultValues, Vector<half> data); // CLASTA // MOVPRFX

  public static unsafe Vector<half> ConditionalExtractAfterLastActiveElementAndReplicate(Vector<half> mask, Vector<half> defaultScalar, Vector<half> data); // CLASTA // MOVPRFX

  public static unsafe Vector<half> ConditionalExtractLastActiveElement(Vector<half> mask, Vector<half> defaultValue, Vector<half> data); // CLASTB // MOVPRFX

  public static unsafe half ConditionalExtractLastActiveElement(Vector<half> mask, half defaultValues, Vector<half> data); // CLASTB // MOVPRFX

  public static unsafe Vector<half> ConditionalExtractLastActiveElementAndReplicate(Vector<half> mask, Vector<half> fallback, Vector<half> data); // CLASTB // MOVPRFX

  public static unsafe Vector<half> ConditionalSelect(Vector<half> mask, Vector<half> left, Vector<half> right); // SEL

  public static unsafe Vector<double> ConvertToDouble(Vector<half> value); // FCVT // predicated, MOVPRFX

  /// T: [half, float], [half, double], [half, short], [half, int], [half, long], [half, ushort], [half, uint], [half, ulong]
  public static unsafe Vector<T> ConvertToHalf(Vector<T2> value); // FCVT or SCVTF or UCVTF // predicated, MOVPRFX

  public static unsafe Vector<short> ConvertToInt16(Vector<half> value); // FCVTZS // predicated, MOVPRFX

  public static unsafe Vector<int> ConvertToInt32(Vector<half> value); // FCVTZS // predicated, MOVPRFX

  public static unsafe Vector<long> ConvertToInt64(Vector<half> value); // FCVTZS // predicated, MOVPRFX

  public static unsafe Vector<float> ConvertToSingle(Vector<half> value); // FCVT // predicated, MOVPRFX

  public static unsafe Vector<ushort> ConvertToUInt16(Vector<half> value); // FCVTZU // predicated, MOVPRFX

  public static unsafe Vector<uint> ConvertToUInt32(Vector<half> value); // FCVTZU // predicated, MOVPRFX

  public static unsafe Vector<ulong> ConvertToUInt64(Vector<half> value); // FCVTZU // predicated, MOVPRFX

  public static unsafe Vector<half> CreateFalseMaskHalf(); // PFALSE

  public static unsafe Vector<half> CreateTrueMaskHalf([ConstantExpected] SveMaskPattern pattern = SveMaskPattern.All); // PTRUE

  public static unsafe Vector<half> CreateWhileReadAfterWriteMask(half* left, half* right); // WHILERW

  public static unsafe Vector<half> CreateWhileWriteAfterReadMask(half* left, half* right); // WHILEWR

  public static unsafe Vector<half> Divide(Vector<half> left, Vector<half> right); // FDIV or FDIVR // predicated, MOVPRFX

  public static unsafe Vector<half> DownConvertNarrowingUpper(Vector<float> value); // FCVTNT // predicated

  public static unsafe Vector<half> DuplicateSelectedScalarToVector(Vector<half> data, [ConstantExpected] byte index); // DUP or TBL

  public static unsafe half ExtractAfterLastScalar(Vector<half> value); // LASTA // predicated

  public static unsafe Vector<half> ExtractAfterLastVector(Vector<half> value); // LASTA // predicated

  public static unsafe half ExtractLastScalar(Vector<half> value); // LASTB // predicated

  public static unsafe Vector<half> ExtractLastVector(Vector<half> value); // LASTB // predicated

  public static unsafe Vector<half> ExtractVector(Vector<half> upper, Vector<half> lower, [ConstantExpected] byte index); // EXT // MOVPRFX

  public static unsafe Vector<half> FloatingPointExponentialAccelerator(Vector<ushort> value); // FEXPA

  public static unsafe Vector<half> FusedMultiplyAdd(Vector<half> addend, Vector<half> left, Vector<half> right); // FMLA or FMAD // predicated, MOVPRFX

  public static unsafe Vector<half> FusedMultiplyAddBySelectedScalar(Vector<half> addend, Vector<half> left, Vector<half> right, [ConstantExpected] byte rightIndex); // FMLA // MOVPRFX

  public static unsafe Vector<half> FusedMultiplyAddNegated(Vector<half> addend, Vector<half> left, Vector<half> right); // FNMLA or FNMAD // predicated, MOVPRFX

  public static unsafe Vector<half> FusedMultiplySubtract(Vector<half> minuend, Vector<half> left, Vector<half> right); // FMLS or FMSB // predicated, MOVPRFX

  public static unsafe Vector<half> FusedMultiplySubtractBySelectedScalar(Vector<half> minuend, Vector<half> left, Vector<half> right, [ConstantExpected] byte rightIndex); // FMLS // MOVPRFX

  public static unsafe Vector<half> FusedMultiplySubtractNegated(Vector<half> minuend, Vector<half> left, Vector<half> right); // FNMLS or FNMSB // predicated, MOVPRFX

  public static unsafe ulong GetActiveElementCount(Vector<half> mask, Vector<half> from); // CNTP

  public static unsafe Vector<half> InsertIntoShiftedVector(Vector<half> left, half right); // INSR

  public static unsafe Vector<half> InterleaveEvenInt128FromTwoInputs(Vector<half> left, Vector<half> right); // TRN1

  public static unsafe Vector<half> InterleaveInt128FromHighHalvesOfTwoInputs(Vector<half> left, Vector<half> right); // ZIP2

  public static unsafe Vector<half> InterleaveInt128FromLowHalvesOfTwoInputs(Vector<half> left, Vector<half> right); // ZIP1

  public static unsafe Vector<half> InterleaveOddInt128FromTwoInputs(Vector<half> left, Vector<half> right); // TRN2

  public static unsafe Vector<half> LoadVector(Vector<half> mask, half* address); // LD1H

  public static unsafe Vector<half> LoadVector128AndReplicateToVector(Vector<half> mask, half* address); // LD1RQH

  public static unsafe Vector<half> LoadVector256AndReplicateToVector(Vector<half> mask, half* address); // LD1ROH

  public static unsafe Vector<half> LoadVectorFirstFaulting(Vector<half> mask, half* address); // LDFF1H

  public static unsafe Vector<half> LoadVectorNonFaulting(half* address); // LDNF1H // predicated

  public static unsafe Vector<half> LoadVectorNonTemporal(Vector<half> mask, half* address); // LDNT1H

  public static unsafe (Vector<half>, Vector<half>) LoadVectorx2(Vector<half> mask, half* address); // LD2H

  public static unsafe (Vector<half>, Vector<half>, Vector<half>) LoadVectorx3(Vector<half> mask, half* address); // LD3H

  public static unsafe (Vector<half>, Vector<half>, Vector<half>, Vector<half>) LoadVectorx4(Vector<half> mask, half* address); // LD4H

  public static unsafe Vector<short> Log2(Vector<half> value); // FLOGB // predicated, MOVPRFX

  public static unsafe Vector<half> Max(Vector<half> left, Vector<half> right); // FMAX // predicated, MOVPRFX

  public static unsafe Vector<half> MaxAcross(Vector<half> value); // FMAXV // predicated

  public static unsafe Vector<half> MaxNumber(Vector<half> left, Vector<half> right); // FMAXNM // predicated, MOVPRFX

  public static unsafe Vector<half> MaxNumberAcross(Vector<half> value); // FMAXNMV // predicated

  public static unsafe Vector<half> MaxNumberPairwise(Vector<half> left, Vector<half> right); // FMAXNMP // predicated, MOVPRFX

  public static unsafe Vector<half> MaxPairwise(Vector<half> left, Vector<half> right); // FMAXP // predicated, MOVPRFX

  public static unsafe Vector<half> Min(Vector<half> left, Vector<half> right); // FMIN // predicated, MOVPRFX

  public static unsafe Vector<half> MinAcross(Vector<half> value); // FMINV // predicated

  public static unsafe Vector<half> MinNumber(Vector<half> left, Vector<half> right); // FMINNM // predicated, MOVPRFX

  public static unsafe Vector<half> MinNumberAcross(Vector<half> value); // FMINNMV // predicated

  public static unsafe Vector<half> MinNumberPairwise(Vector<half> left, Vector<half> right); // FMINNMP // predicated, MOVPRFX

  public static unsafe Vector<half> MinPairwise(Vector<half> left, Vector<half> right); // FMINP // predicated, MOVPRFX

  public static unsafe Vector<half> Multiply(Vector<half> left, Vector<half> right); // FMUL // predicated, MOVPRFX

  public static unsafe Vector<half> MultiplyAddRotateComplex(Vector<half> addend, Vector<half> left, Vector<half> right, [ConstantExpected] byte rotation); // FCMLA // predicated, MOVPRFX

  public static unsafe Vector<half> MultiplyAddRotateComplexBySelectedScalar(Vector<half> addend, Vector<half> left, Vector<half> right, [ConstantExpected] byte rightIndex, [ConstantExpected] byte rotation); // FCMLA // MOVPRFX

  public static unsafe Vector<float> MultiplyAddWideningLower(Vector<float> op1, Vector<half> op2, Vector<half> op3); // FMLALB // MOVPRFX

  public static unsafe Vector<float> MultiplyAddWideningLower(Vector<float> op1, Vector<half> op2, Vector<half> op3, ulong imm_index); // FMLALB // MOVPRFX

  public static unsafe Vector<float> MultiplyAddWideningUpper(Vector<float> op1, Vector<half> op2, Vector<half> op3); // FMLALT // MOVPRFX

  public static unsafe Vector<float> MultiplyAddWideningUpper(Vector<float> op1, Vector<half> op2, Vector<half> op3, ulong imm_index); // FMLALT // MOVPRFX

  public static unsafe Vector<half> MultiplyBySelectedScalar(Vector<half> left, Vector<half> right, [ConstantExpected] byte rightIndex); // FMUL

  public static unsafe Vector<half> MultiplyExtended(Vector<half> left, Vector<half> right); // FMULX // predicated, MOVPRFX

  public static unsafe Vector<float> MultiplySubtractWideningLower(Vector<float> op1, Vector<half> op2, Vector<half> op3); // FMLSLB // MOVPRFX

  public static unsafe Vector<float> MultiplySubtractWideningLower(Vector<float> op1, Vector<half> op2, Vector<half> op3, ulong imm_index); // FMLSLB // MOVPRFX

  public static unsafe Vector<float> MultiplySubtractWideningUpper(Vector<float> op1, Vector<half> op2, Vector<half> op3); // FMLSLT // MOVPRFX

  public static unsafe Vector<float> MultiplySubtractWideningUpper(Vector<float> op1, Vector<half> op2, Vector<half> op3, ulong imm_index); // FMLSLT // MOVPRFX

  public static unsafe Vector<half> Negate(Vector<half> value); // FNEG // predicated, MOVPRFX

  public static unsafe Vector<ushort> PopCount(Vector<half> value); // CNT // predicated, MOVPRFX

  public static unsafe Vector<half> ReciprocalEstimate(Vector<half> value); // FRECPE

  public static unsafe Vector<half> ReciprocalExponent(Vector<half> value); // FRECPX // predicated, MOVPRFX

  public static unsafe Vector<half> ReciprocalSqrtEstimate(Vector<half> value); // FRSQRTE

  public static unsafe Vector<half> ReciprocalSqrtStep(Vector<half> left, Vector<half> right); // FRSQRTS

  public static unsafe Vector<half> ReciprocalStep(Vector<half> left, Vector<half> right); // FRECPS

  public static unsafe Vector<half> ReverseElement(Vector<half> value); // REV

  public static unsafe Vector<half> RoundAwayFromZero(Vector<half> value); // FRINTA // predicated, MOVPRFX

  public static unsafe Vector<half> RoundToNearest(Vector<half> value); // FRINTN // predicated, MOVPRFX

  public static unsafe Vector<half> RoundToNegativeInfinity(Vector<half> value); // FRINTM // predicated, MOVPRFX

  public static unsafe Vector<half> RoundToPositiveInfinity(Vector<half> value); // FRINTP // predicated, MOVPRFX

  public static unsafe Vector<half> RoundToZero(Vector<half> value); // FRINTZ // predicated, MOVPRFX

  public static unsafe Vector<half> Scale(Vector<half> left, Vector<short> right); // FSCALE // predicated, MOVPRFX

  public static unsafe Vector<half> Splice(Vector<half> mask, Vector<half> left, Vector<half> right); // SPLICE // MOVPRFX

  public static unsafe Vector<half> Sqrt(Vector<half> value); // FSQRT // predicated, MOVPRFX

  public static unsafe void Store(Vector<half> mask, half* address, Vector<half> data); // ST1H

  public static unsafe void Store(Vector<half> mask, half* address, (Vector<half> Value1, Vector<half> Value2) data); // ST2H

  public static unsafe void Store(Vector<half> mask, half* address, (Vector<half> Value1, Vector<half> Value2, Vector<half> Value3) data); // ST3H

  public static unsafe void Store(Vector<half> mask, half* address, (Vector<half> Value1, Vector<half> Value2, Vector<half> Value3, Vector<half> Value4) data); // ST4H

  public static unsafe void StoreNonTemporal(Vector<half> mask, half* address, Vector<half> data); // STNT1H

  public static unsafe Vector<half> Subtract(Vector<half> left, Vector<half> right); // FSUB or FSUBR // predicated, MOVPRFX

  public static unsafe Vector<half> TransposeEven(Vector<half> left, Vector<half> right); // TRN1

  public static unsafe Vector<half> TransposeOdd(Vector<half> left, Vector<half> right); // TRN2

  public static unsafe Vector<half> TrigonometricMultiplyAddCoefficient(Vector<half> left, Vector<half> right, [ConstantExpected] byte control); // FTMAD // MOVPRFX

  public static unsafe Vector<half> TrigonometricSelectCoefficient(Vector<half> value, Vector<ushort> selector); // FTSSEL

  public static unsafe Vector<half> TrigonometricStartingValue(Vector<half> value, Vector<ushort> sign); // FTSMUL

  public static unsafe Vector<half> UnzipEven(Vector<half> left, Vector<half> right); // UZP1

  public static unsafe Vector<half> UnzipOdd(Vector<half> left, Vector<half> right); // UZP2

  public static unsafe Vector<float> UpConvertWideningUpper(Vector<half> value); // FCVTLT // predicated

  public static unsafe Vector<half> VectorTableLookup(Vector<half> data, Vector<ushort> indices); // TBL

  public static unsafe Vector<half> VectorTableLookup((Vector<half> data1, Vector<half> data2), Vector<ushort> indices); // TBL

  public static unsafe Vector<half> VectorTableLookupExtension(Vector<half> fallback, Vector<half> data, Vector<ushort> indices); // TBX

  public static unsafe Vector<half> ZipHigh(Vector<half> left, Vector<half> right); // ZIP2

  public static unsafe Vector<half> ZipLow(Vector<half> left, Vector<half> right); // ZIP1


  // All patterns used by PTRUE.
  public enum SveMaskPattern : byte
  {
    LargestPowerOf2 = 0,   // The largest power of 2.
    VectorCount1 = 1,    // 1 element.
    VectorCount2 = 2,    // 2 elements.
    VectorCount3 = 3,    // 3 elements.
    VectorCount4 = 4,    // 4 elements.
    VectorCount5 = 5,    // 5 elements.
    VectorCount6 = 6,    // 6 elements.
    VectorCount7 = 7,    // 7 elements.
    VectorCount8 = 8,    // 8 elements.
    VectorCount16 = 9,   // 16 elements.
    VectorCount32 = 10,  // 32 elements.
    VectorCount64 = 11,  // 64 elements.
    VectorCount128 = 12, // 128 elements.
    VectorCount256 = 13, // 256 elements.
    LargestMultipleOf4 = 29,  // The largest multiple of 4.
    LargestMultipleOf3 = 30,  // The largest multiple of 3.
    All  = 31    // All available (implicitly a multiple of two).
  };

  /// total method signatures: 131


  /// Optional Entries:

  public static unsafe Vector<half> AbsoluteCompareGreaterThan(Vector<half> left, half right); // FACGT // predicated

  public static unsafe Vector<half> AbsoluteCompareGreaterThanOrEqual(Vector<half> left, half right); // FACGE // predicated

  public static unsafe Vector<half> AbsoluteCompareLessThan(Vector<half> left, half right); // FACGT // predicated

  public static unsafe Vector<half> AbsoluteCompareLessThanOrEqual(Vector<half> left, half right); // FACGE // predicated

  public static unsafe Vector<half> AbsoluteDifference(Vector<half> left, half right); // FABD // predicated, MOVPRFX

  public static unsafe Vector<half> Add(Vector<half> left, half right); // FADD or FSUB // predicated, MOVPRFX

  public static unsafe Vector<half> CompareEqual(Vector<half> left, half right); // FCMEQ // predicated

  public static unsafe Vector<half> CompareGreaterThan(Vector<half> left, half right); // FCMGT // predicated

  public static unsafe Vector<half> CompareGreaterThanOrEqual(Vector<half> left, half right); // FCMGE // predicated

  public static unsafe Vector<half> CompareLessThan(Vector<half> left, half right); // FCMLT or FCMGT // predicated

  public static unsafe Vector<half> CompareLessThanOrEqual(Vector<half> left, half right); // FCMLE or FCMGE // predicated

  public static unsafe Vector<half> CompareNotEqualTo(Vector<half> left, half right); // FCMNE // predicated

  public static unsafe Vector<half> CompareUnordered(Vector<half> left, half right); // FCMUO // predicated

  public static unsafe half ConditionalExtractAfterLastActiveElement(Vector<half> mask, half defaultValue, Vector<half> data); // CLASTA

  public static unsafe half ConditionalExtractAfterLastActiveElementAndReplicate(Vector<half> mask, half defaultScalar, Vector<half> data); // CLASTA

  public static unsafe half ConditionalExtractLastActiveElement(Vector<half> mask, half defaultValue, Vector<half> data); // CLASTB

  public static unsafe half ConditionalExtractLastActiveElementAndReplicate(Vector<half> mask, half fallback, Vector<half> data); // CLASTB

  public static unsafe Vector<half> Divide(Vector<half> left, half right); // FDIV or FDIVR // predicated, MOVPRFX

  public static unsafe Vector<half> Max(Vector<half> left, half right); // FMAX // predicated, MOVPRFX

  public static unsafe Vector<half> MaxNumber(Vector<half> left, half right); // FMAXNM // predicated, MOVPRFX

  public static unsafe Vector<half> Min(Vector<half> left, half right); // FMIN // predicated, MOVPRFX

  public static unsafe Vector<half> MinNumber(Vector<half> left, half right); // FMINNM // predicated, MOVPRFX

  public static unsafe Vector<half> Multiply(Vector<half> left, half right); // FMUL // predicated, MOVPRFX

  public static unsafe Vector<half> MultiplyAdd(Vector<half> addend, Vector<half> left, half right); // FMLA or FMAD // predicated, MOVPRFX

  public static unsafe Vector<half> MultiplyAddNegated(Vector<half> addend, Vector<half> left, half right); // FNMLA or FNMAD // predicated, MOVPRFX

  public static unsafe Vector<float> MultiplyAddWideningLower(Vector<float> op1, Vector<half> op2, half op3); // FMLALB // MOVPRFX

  public static unsafe Vector<float> MultiplyAddWideningUpper(Vector<float> op1, Vector<half> op2, half op3); // FMLALT // MOVPRFX

  public static unsafe Vector<half> MultiplyExtended(Vector<half> left, half right); // FMULX // predicated, MOVPRFX

  public static unsafe Vector<half> MultiplySubtract(Vector<half> minuend, Vector<half> left, half right); // FMLS or FMSB // predicated, MOVPRFX

  public static unsafe Vector<half> MultiplySubtractNegated(Vector<half> minuend, Vector<half> left, half right); // FNMLS or FNMSB // predicated, MOVPRFX

  public static unsafe Vector<float> MultiplySubtractWideningLower(Vector<float> op1, Vector<half> op2, half op3); // FMLSLB // MOVPRFX

  public static unsafe Vector<float> MultiplySubtractWideningUpper(Vector<float> op1, Vector<half> op2, half op3); // FMLSLT // MOVPRFX

  public static unsafe Vector<half> Subtract(Vector<half> left, half right); // FSUB or FADD or FSUBR // predicated, MOVPRFX

  /// total optional method signatures: 33

}

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions