Also to make things easier to read I combined the documentation headers for the proposal. They will of course be separated out in the actual implementation
namespaceSystem.Runtime.Intrinsics.Arm{publicstaticclassArmBase{publicstaticboolIsSupported{get{thrownull;}}/// <summary>/// vslid_n_[su]64////// A64: SLI/// A32: VSLI/// </summary>publicstaticlongLeftShiftAndInsert(longleft,longright,uintshift)=>{thrownull};publicstaticulongLeftShiftAndInsert(ulongleft,ulongright,uintshift)=>{thrownull};/// <summary>/// vsrid_n_[su]64////// A64: SRI/// A32: VSRI/// </summary>publicstaticlongRightShiftAndInsert(longleft,longright,uintshift)=>{thrownull};publicstaticulongRightShiftAndInsert(ulongleft,ulongright,uintshift)=>{thrownull};}publicstaticclassAdvSimd{publicstaticboolIsSupported{get{thrownull;}}/// <summary>/// vsli[q]_n_[su][8,16,32,64]///// A64: SLI/// A32: VSLI/// </summary>publicstaticVector64<byte>LeftShiftAndInsert(Vector64<byte>left,Vector64<byte>right,uintshift)=>{thrownull};publicstaticVector64<ushort>LeftShiftAndInsert(Vector64<ushort>left,Vector64<ushort>right,uintshift)=>{thrownull};publicstaticVector64<uint>LeftShiftAndInsert(Vector64<uint>left,Vector64<uint>right,uintshift)=>{thrownull};publicstaticVector64<sbyte>LeftShiftAndInsert(Vector64<sbyte>left,Vector64<sbyte>right,uintshift)=>{thrownull};publicstaticVector64<short>LeftShiftAndInsert(Vector64<short>left,Vector64<short>right,uintshift)=>{thrownull};publicstaticVector64<int>LeftShiftAndInsert(Vector64<int>left,Vector64<int>right,uintshift)=>{thrownull};publicstaticVector128<byte>LeftShiftAndInsert(Vector128<byte>left,Vector128<byte>right,uintshift)=>{thrownull};publicstaticVector128<ushort>LeftShiftAndInsert(Vector128<ushort>left,Vector128<ushort>right,uintshift)=>{thrownull};publicstaticVector128<uint>LeftShiftAndInsert(Vector128<uint>left,Vector128<uint>right,uintshift)=>{thrownull};publicstaticVector128<ulong>LeftShiftAndInsert(Vector128<ulong>left,Vector128<ulong>right,uintshift)=>{thrownull};publicstaticVector128<sbyte>LeftShiftAndInsert(Vector128<sbyte>left,Vector128<sbyte>right,uintshift)=>{thrownull};publicstaticVector128<short>LeftShiftAndInsert(Vector128<short>left,Vector128<short>right,uintshift)=>{thrownull};publicstaticVector128<int>LeftShiftAndInsert(Vector128<int>left,Vector128<int>right,uintshift)=>{thrownull};publicstaticVector128<long>LeftShiftAndInsert(Vector128<long>left,Vector128<long>right,uintshift)=>{thrownull};/// <summary>/// vsri[q]_n_[su][8,16,32,64]////// A64: SRI/// A32: VSRI/// </summary>publicstaticVector64<byte>RightShiftAndInsert(Vector64<byte>left,Vector64<byte>right,uintshift)=>{thrownull};publicstaticVector64<ushort>RightShiftAndInsert(Vector64<ushort>left,Vector64<ushort>right,uintshift)=>{thrownull};publicstaticVector64<uint>RightShiftAndInsert(Vector64<uint>left,Vector64<uint>right,uintshift)=>{thrownull};publicstaticVector64<sbyte>RightShiftAndInsert(Vector64<sbyte>left,Vector64<sbyte>right,uintshift)=>{thrownull};publicstaticVector64<short>RightShiftAndInsert(Vector64<short>left,Vector64<short>right,uintshift)=>{thrownull};publicstaticVector64<int>RightShiftAndInsert(Vector64<int>left,Vector64<int>right,uintshift)=>{thrownull};publicstaticVector128<byte>RightShiftAndInsert(Vector128<byte>left,Vector128<byte>right,uintshift)=>{thrownull};publicstaticVector128<ushort>RightShiftAndInsert(Vector128<ushort>left,Vector128<ushort>right,uintshift)=>{thrownull};publicstaticVector128<uint>RightShiftAndInsert(Vector128<uint>left,Vector128<uint>right,uintshift)=>{thrownull};publicstaticVector128<ulong>RightShiftAndInsert(Vector128<ulong>left,Vector128<ulong>right,uintshift)=>{thrownull};publicstaticVector128<sbyte>RightShiftAndInsert(Vector128<sbyte>left,Vector128<sbyte>right,uintshift)=>{thrownull};publicstaticVector128<short>RightShiftAndInsert(Vector128<short>left,Vector128<short>right,uintshift)=>{thrownull};publicstaticVector128<int>RightShiftAndInsert(Vector128<int>left,Vector128<int>right,uintshift)=>{thrownull};publicstaticVector128<long>RightShiftAndInsert(Vector128<long>left,Vector128<long>right,uintshift)=>{thrownull};/// <summary>/// vmovn_[su][16,32,64]////// A64: XTN/// A32: VMOVN/// </summary>publicstaticVector64<sbyte>ExtractAndNarrowLow(Vector128<short>value)=>{thrownull};publicstaticVector64<short>ExtractAndNarrowLow(Vector128<int>value)=>{thrownull};publicstaticVector64<int>ExtractAndNarrowLow(Vector128<long>value)=>{thrownull};publicstaticVector64<byte>ExtractAndNarrowLow(Vector128<ushort>value)=>{thrownull};publicstaticVector64<ushort>ExtractAndNarrowLow(Vector128<uint>value)=>{thrownull};publicstaticVector64<uint>ExtractAndNarrowLow(Vector128<ulong>value)=>{thrownull};/// <summary>/// vmovn_high_[su][16,32,64]///// A64: XTN2/// A32: VMOVN/// </summary>publicstaticVector128<sbyte>ExtractAndNarrowHigh(Vector64<sbyte>accum,Vector128<short>value)=>{thrownull};publicstaticVector128<short>ExtractAndNarrowHigh(Vector64<short>accum,Vector128<int>value)=>{thrownull};publicstaticVector128<int>ExtractAndNarrowHigh(Vector64<int>accum,Vector128<long>value)=>{thrownull};publicstaticVector128<byte>ExtractAndNarrowHigh(Vector64<byte>accum,Vector128<ushort>value)=>{thrownull};publicstaticVector128<ushort>ExtractAndNarrowHigh(Vector64<ushort>accum,Vector128<uint>value)=>{thrownull};publicstaticVector128<uint>ExtractAndNarrowHigh(Vector64<uint>accum,Vector128<ulong>value)=>{thrownull};publicstaticclassArm64{publicstaticboolIsSupported{get{thrownull;}}/// <summary>/// vtrn1[q]_[suf][8,16,32,64]////// A64: UZP1/// </summary>publicstaticVector64<sbyte>UnzipEven(Vector64<sbyte>left,Vector64<sbyte>right)=>{thrownull};publicstaticVector64<short>UnzipEven(Vector64<short>left,Vector64<short>right)=>{thrownull};publicstaticVector64<int>UnzipEven(Vector64<int>left,Vector64<int>right)=>{thrownull};publicstaticVector64<byte>UnzipEven(Vector64<byte>left,Vector64<byte>right)=>{thrownull};publicstaticVector64<ushort>UnzipEven(Vector64<ushort>left,Vector64<ushort>right)=>{thrownull};publicstaticVector64<uint>UnzipEven(Vector64<uint>left,Vector64<uint>right)=>{thrownull};publicstaticVector64<float>UnzipEven(Vector64<float>left,Vector64<float>right)=>{thrownull};publicstaticVector128<sbyte>UnzipEven(Vector128<sbyte>left,Vector128<sbyte>right)=>{thrownull};publicstaticVector128<short>UnzipEven(Vector128<short>left,Vector128<short>right)=>{thrownull};publicstaticVector128<int>UnzipEven(Vector128<int>left,Vector128<int>right)=>{thrownull};publicstaticVector128<long>UnzipEven(Vector128<long>left,Vector128<long>right)=>{thrownull};publicstaticVector128<byte>UnzipEven(Vector128<byte>left,Vector128<byte>right)=>{thrownull};publicstaticVector128<ushort>UnzipEven(Vector128<ushort>left,Vector128<ushort>right)=>{thrownull};publicstaticVector128<uint>UnzipEven(Vector128<uint>left,Vector128<uint>right)=>{thrownull};publicstaticVector128<ulong>UnzipEven(Vector128<ulong>left,Vector128<ulong>right)=>{thrownull};publicstaticVector128<float>UnzipEven(Vector128<float>left,Vector128<float>right)=>{thrownull};publicstaticVector128<double>UnzipEven(Vector128<double>left,Vector128<double>right)=>{thrownull};/// <summary>/// vtrn2[q]_[suf][8,16,32,64]////// A64: UZP2/// </summary>publicstaticVector64<sbyte>UnzipOdd(Vector64<sbyte>left,Vector64<sbyte>right)=>{thrownull};publicstaticVector64<short>UnzipOdd(Vector64<short>left,Vector64<short>right)=>{thrownull};publicstaticVector64<int>UnzipOdd(Vector64<int>left,Vector64<int>right)=>{thrownull};publicstaticVector64<byte>UnzipOdd(Vector64<byte>left,Vector64<byte>right)=>{thrownull};publicstaticVector64<ushort>UnzipOdd(Vector64<ushort>left,Vector64<ushort>right)=>{thrownull};publicstaticVector64<uint>UnzipOdd(Vector64<uint>left,Vector64<uint>right)=>{thrownull};publicstaticVector64<float>UnzipOdd(Vector64<float>left,Vector64<float>right)=>{thrownull};publicstaticVector128<sbyte>UnzipOdd(Vector128<sbyte>left,Vector128<sbyte>right)=>{thrownull};publicstaticVector128<short>UnzipOdd(Vector128<short>left,Vector128<short>right)=>{thrownull};publicstaticVector128<int>UnzipOdd(Vector128<int>left,Vector128<int>right)=>{thrownull};publicstaticVector128<long>UnzipOdd(Vector128<long>left,Vector128<long>right)=>{thrownull};publicstaticVector128<byte>UnzipOdd(Vector128<byte>left,Vector128<byte>right)=>{thrownull};publicstaticVector128<ushort>UnzipOdd(Vector128<ushort>left,Vector128<ushort>right)=>{thrownull};publicstaticVector128<uint>UnzipOdd(Vector128<uint>left,Vector128<uint>right)=>{thrownull};publicstaticVector128<ulong>UnzipOdd(Vector128<ulong>left,Vector128<ulong>right)=>{thrownull};publicstaticVector128<float>UnzipOdd(Vector128<float>left,Vector128<float>right)=>{thrownull};publicstaticVector128<double>UnzipOdd(Vector128<double>left,Vector128<double>right)=>{thrownull};/// <summary>/// vzip1[q]_[suf][8,16,32,64]////// A64: ZIP1/// </summary>publicstaticVector64<sbyte>ZipLow(Vector64<sbyte>left,Vector64<sbyte>right)=>{thrownull};publicstaticVector64<short>ZipLow(Vector64<short>left,Vector64<short>right)=>{thrownull};publicstaticVector64<int>ZipLow(Vector64<int>left,Vector64<int>right)=>{thrownull};publicstaticVector64<byte>ZipLow(Vector64<byte>left,Vector64<byte>right)=>{thrownull};publicstaticVector64<ushort>ZipLow(Vector64<ushort>left,Vector64<ushort>right)=>{thrownull};publicstaticVector64<uint>ZipLow(Vector64<uint>left,Vector64<uint>right)=>{thrownull};publicstaticVector64<float>ZipLow(Vector64<float>left,Vector64<float>right)=>{thrownull};publicstaticVector128<sbyte>ZipLow(Vector128<sbyte>left,Vector128<sbyte>right)=>{thrownull};publicstaticVector128<short>ZipLow(Vector128<short>left,Vector128<short>right)=>{thrownull};publicstaticVector128<int>ZipLow(Vector128<int>left,Vector128<int>right)=>{thrownull};publicstaticVector128<long>ZipLow(Vector128<long>left,Vector128<long>right)=>{thrownull};publicstaticVector128<byte>ZipLow(Vector128<byte>left,Vector128<byte>right)=>{thrownull};publicstaticVector128<ushort>ZipLow(Vector128<ushort>left,Vector128<ushort>right)=>{thrownull};publicstaticVector128<uint>ZipLow(Vector128<uint>left,Vector128<uint>right)=>{thrownull};publicstaticVector128<ulong>ZipLow(Vector128<ulong>left,Vector128<ulong>right)=>{thrownull};publicstaticVector128<float>ZipLow(Vector128<float>left,Vector128<float>right)=>{thrownull};publicstaticVector128<double>ZipLow(Vector128<double>left,Vector128<double>right)=>{thrownull};/// <summary>/// vzip2[q]_[suf][8,16,32,64]////// A64: ZIP2/// </summary>publicstaticVector64<sbyte>ZipHigh(Vector64<sbyte>left,Vector64<sbyte>right)=>{thrownull};publicstaticVector64<short>ZipHigh(Vector64<short>left,Vector64<short>right)=>{thrownull};publicstaticVector64<int>ZipHigh(Vector64<int>left,Vector64<int>right)=>{thrownull};publicstaticVector64<byte>ZipHigh(Vector64<byte>left,Vector64<byte>right)=>{thrownull};publicstaticVector64<ushort>ZipHigh(Vector64<ushort>left,Vector64<ushort>right)=>{thrownull};publicstaticVector64<uint>ZipHigh(Vector64<uint>left,Vector64<uint>right)=>{thrownull};publicstaticVector64<float>ZipHigh(Vector64<float>left,Vector64<float>right)=>{thrownull};publicstaticVector128<sbyte>ZipHigh(Vector128<sbyte>left,Vector128<sbyte>right)=>{thrownull};publicstaticVector128<short>ZipHigh(Vector128<short>left,Vector128<short>right)=>{thrownull};publicstaticVector128<int>ZipHigh(Vector128<int>left,Vector128<int>right)=>{thrownull};publicstaticVector128<long>ZipHigh(Vector128<long>left,Vector128<long>right)=>{thrownull};publicstaticVector128<byte>ZipHigh(Vector128<byte>left,Vector128<byte>right)=>{thrownull};publicstaticVector128<ushort>ZipHigh(Vector128<ushort>left,Vector128<ushort>right)=>{thrownull};publicstaticVector128<uint>ZipHigh(Vector128<uint>left,Vector128<uint>right)=>{thrownull};publicstaticVector128<ulong>ZipHigh(Vector128<ulong>left,Vector128<ulong>right)=>{thrownull};publicstaticVector128<float>ZipHigh(Vector128<float>left,Vector128<float>right)=>{thrownull};publicstaticVector128<double>ZipHigh(Vector128<double>left,Vector128<double>right)=>{thrownull};/// <summary>/// vtrn1[q]_[suf][8,16,32,64]////// A64: TRN1/// </summary>publicstaticVector64<sbyte>TransposeEven(Vector64<sbyte>left,Vector64<sbyte>right)=>{thrownull};publicstaticVector64<short>TransposeEven(Vector64<short>left,Vector64<short>right)=>{thrownull};publicstaticVector64<int>TransposeEven(Vector64<int>left,Vector64<int>right)=>{thrownull};publicstaticVector64<byte>TransposeEven(Vector64<byte>left,Vector64<byte>right)=>{thrownull};publicstaticVector64<ushort>TransposeEven(Vector64<ushort>left,Vector64<ushort>right)=>{thrownull};publicstaticVector64<uint>TransposeEven(Vector64<uint>left,Vector64<uint>right)=>{thrownull};publicstaticVector64<float>TransposeEven(Vector64<float>left,Vector64<float>right)=>{thrownull};publicstaticVector128<sbyte>TransposeEven(Vector128<sbyte>left,Vector128<sbyte>right)=>{thrownull};publicstaticVector128<short>TransposeEven(Vector128<short>left,Vector128<short>right)=>{thrownull};publicstaticVector128<int>TransposeEven(Vector128<int>left,Vector128<int>right)=>{thrownull};publicstaticVector128<long>TransposeEven(Vector128<long>left,Vector128<long>right)=>{thrownull};publicstaticVector128<byte>TransposeEven(Vector128<byte>left,Vector128<byte>right)=>{thrownull};publicstaticVector128<ushort>TransposeEven(Vector128<ushort>left,Vector128<ushort>right)=>{thrownull};publicstaticVector128<uint>TransposeEven(Vector128<uint>left,Vector128<uint>right)=>{thrownull};publicstaticVector128<ulong>TransposeEven(Vector128<ulong>left,Vector128<ulong>right)=>{thrownull};publicstaticVector128<float>TransposeEven(Vector128<float>left,Vector128<float>right)=>{thrownull};publicstaticVector128<double>TransposeEven(Vector128<double>left,Vector128<double>right)=>{thrownull};/// <summary>/// vtrn2[q]_[suf][8,16,32,64]////// A64: TRN2/// </summary>publicstaticVector64<sbyte>TransposeOdd(Vector64<sbyte>left,Vector64<sbyte>right)=>{thrownull};publicstaticVector64<short>TransposeOdd(Vector64<short>left,Vector64<short>right)=>{thrownull};publicstaticVector64<int>TransposeOdd(Vector64<int>left,Vector64<int>right)=>{thrownull};publicstaticVector64<byte>TransposeOdd(Vector64<byte>left,Vector64<byte>right)=>{thrownull};publicstaticVector64<ushort>TransposeOdd(Vector64<ushort>left,Vector64<ushort>right)=>{thrownull};publicstaticVector64<uint>TransposeOdd(Vector64<uint>left,Vector64<uint>right)=>{thrownull};publicstaticVector64<float>TransposeOdd(Vector64<float>left,Vector64<float>right)=>{thrownull};publicstaticVector128<sbyte>TransposeOdd(Vector128<sbyte>left,Vector128<sbyte>right)=>{thrownull};publicstaticVector128<short>TransposeOdd(Vector128<short>left,Vector128<short>right)=>{thrownull};publicstaticVector128<int>TransposeOdd(Vector128<int>left,Vector128<int>right)=>{thrownull};publicstaticVector128<long>TransposeOdd(Vector128<long>left,Vector128<long>right)=>{thrownull};publicstaticVector128<byte>TransposeOdd(Vector128<byte>left,Vector128<byte>right)=>{thrownull};publicstaticVector128<ushort>TransposeOdd(Vector128<ushort>left,Vector128<ushort>right)=>{thrownull};publicstaticVector128<uint>TransposeOdd(Vector128<uint>left,Vector128<uint>right)=>{thrownull};publicstaticVector128<ulong>TransposeOdd(Vector128<ulong>left,Vector128<ulong>right)=>{thrownull};publicstaticVector128<float>TransposeOdd(Vector128<float>left,Vector128<float>right)=>{thrownull};publicstaticVector128<double>TransposeOdd(Vector128<double>left,Vector128<double>right)=>{thrownull};}}}
The
A32variants of these are blocked pending resolution of the<lanes>x<copies>implementation in #24790 (e.g.int32x2x2). The permute instructions such asZIP1andZIP2present an interesting challenge. Since intrinsics in CoreCLR/CoreFX are supposed to match down to a single hardware instruction this makes it a bit awkward, since onA32ZIP, TRN, UZPare destructive operations which perform both theOddandEvenshuffles at the same time. So while you could do the intrinsics forA32by copying the vector and ignoring one of the outputs I believe that goes counter to the philosophy here (unless I'm mistaken.). It also means that if they were to be implemented onA32for efficiency aZIP1, ZIP2combo should be combined toZIPand the moves not generated.This also means that the Arm
ZIP, TRN, UZPintrinsics can't be implemented inA64as a single intrinsics but rather the user needs to make two calls. This is the reason that in this proposal the intrinsics areA64only, but it makes intrinsics code betweenA32andA64a bit less portable in this case.Also to make things easier to read I combined the documentation headers for the proposal. They will of course be separated out in the actual implementation
cc @tannergooding@CarolEidt @echesakovMSFT