Summary
We've exposed several APIs on Vector64/128/256 and recently approved Vector512. However, there are notably a few missing APIs that make it feel "incomplete". Such APIs were likely simply missed as part of previous review.
API Proposal
namespaceSystem.Numerics{publicstaticpartialclassVector{// Has AsVectorByte and friends, not AsByte and friendspublicstaticVector<T>Divide(Vector<T>left,Tright);publicstaticTGetElement<T>(thisVector<T>vector,intindex)whereT:struct;publicstaticVector<T>Load<T>(T*source)whereT: unmanaged;publicstaticVector<T>LoadAligned<T>(T*source)whereT: unmanaged;publicstaticVector<T>LoadAlignedNonTemporal<T>(T*source)whereT: unmanaged;publicstaticVector<T>LoadUnsafe<T>(refTsource)whereT:struct;publicstaticVector<T>LoadUnsafe<T>(refTsource,nuintindex)whereT:struct;// Shuffle is difficult to expose because the indices often should be "constant"// Has SquareRoot, not SqrtpublicstaticunsafevoidStore<T>(thisVector<T>source,T*destination)whereT: unmanaged;publicstaticunsafevoidStoreAligned<T>(thisVector<T>source,T*destination)whereT: unmanaged;publicstaticunsafevoidStoreAlignedNonTemporal<T>(thisVector<T>source,T*destination)whereT: unmanaged;publicstaticunsafevoidStoreUnsafe<T>(thisVector<T>source,refTdestination)whereT:struct;publicstaticunsafevoidStoreUnsafe<T>(thisVector<T>source,refTdestination,nuintindex)whereT:struct;publicstaticTToScalar<T>(thisVector<T>vector)whereT:struct;publicstaticVector<T>WithElement<T>(thisVector<T>vector,intindex,Tvalue)whereT:struct;}publicpartialstructVector<T>{publicstaticVector<T>AllBitsSet{get;}// Has constructors, not Vector.Create()// Has explicit cast operatorspublicstaticVector<T>operator/(Vector<T>left,Tright);publicstaticVector<T>operator+(Vector<T>value);}}namespaceSystem.Runtime.Intrinsics.X86{publicstaticpartialclassVector64{publicstaticVector64<T>CreateScalar<T>(Tvalue)whereT:struct;publicstaticVector64<T>CreateScalarUnsafe<T>(Tvalue)whereT:struct;publicstaticVector64<long>CreateScalarUnsafe(doublevalue);publicstaticVector64<long>CreateScalarUnsafe(longvalue);publicstaticVector64<ulong>CreateScalarUnsafe(ulongvalue);publicstaticVector64<T>Divide(Vector64<T>left,Tright);publicstaticVector64<ushort>WidenLower(Vector64<byte>value);publicstaticVector64<int>WidenLower(Vector64<short>value);publicstaticVector64<long>WidenLower(Vector64<int>value);publicstaticVector64<short>WidenLower(Vector64<sbyte>value);publicstaticVector64<double>WidenLower(Vector64<float>value);publicstaticVector64<uint>WidenLower(Vector64<ushort>value);publicstaticVector64<ulong>WidenLower(Vector64<uint>value);publicstaticVector64<ushort>WidenUpper(Vector64<byte>value);publicstaticVector64<int>WidenUpper(Vector64<short>value);publicstaticVector64<long>WidenUpper(Vector64<int>value);publicstaticVector64<short>WidenUpper(Vector64<sbyte>value);publicstaticVector64<double>WidenUpper(Vector64<float>value);publicstaticVector64<uint>WidenUpper(Vector64<ushort>value);publicstaticVector64<ulong>WidenUpper(Vector64<uint>value);}publicpartialstructVector64<T>{publicstaticVector64<T>One{get;}publicstaticVector64<T>operator/(Vector64<T>left,Tright);publicstaticVector64<T>operator<<(Vector64<T>left,intshiftAmount);publicstaticVector64<T>operator>>(Vector64<T>left,intshiftAmount);publicstaticVector64<T>operator>>>(Vector64<T>left,intshiftAmount);}publicstaticpartialclassVector128{publicstaticVector128<T>Create<T>(Vector64<T>lower,Vector64<T>upper)whereT:struct;publicstaticVector128<nint>Create(Vector64<nint>lower,Vector64<nint>upper);publicstaticVector128<nuint>Create(Vector64<nuint>lower,Vector64<nuint>upper);publicstaticVector128<T>CreateScalar<T>(Tvalue)whereT:struct;publicstaticVector128<T>CreateScalarUnsafe<T>(Tvalue)whereT:struct;publicstaticVector128<T>Divide(Vector128<T>left,Tright);publicstaticVector128<ushort>WidenLower(Vector128<byte>value);publicstaticVector128<int>WidenLower(Vector128<short>value);publicstaticVector128<long>WidenLower(Vector128<int>value);publicstaticVector128<short>WidenLower(Vector128<sbyte>value);publicstaticVector128<double>WidenLower(Vector128<float>value);publicstaticVector128<uint>WidenLower(Vector128<ushort>value);publicstaticVector128<ulong>WidenLower(Vector128<uint>value);publicstaticVector128<ushort>WidenUpper(Vector128<byte>value);publicstaticVector128<int>WidenUpper(Vector128<short>value);publicstaticVector128<long>WidenUpper(Vector128<int>value);publicstaticVector128<short>WidenUpper(Vector128<sbyte>value);publicstaticVector128<double>WidenUpper(Vector128<float>value);publicstaticVector128<uint>WidenUpper(Vector128<ushort>value);publicstaticVector128<ulong>WidenUpper(Vector128<uint>value);}publicpartialstructVector128<T>{publicstaticVector128<T>One{get;}publicstaticVector128<T>operator/(Vector128<T>left,Tright);publicstaticVector128<T>operator<<(Vector128<T>left,intshiftAmount);publicstaticVector128<T>operator>>(Vector128<T>left,intshiftAmount);publicstaticVector128<T>operator>>>(Vector128<T>left,intshiftAmount);}publicstaticpartialclassVector256{publicstaticVector256<T>Create<T>(Vector128<T>lower,Vector128<T>upper)whereT:struct;publicstaticVector256<nint>Create(Vector128<nint>lower,Vector128<nint>upper);publicstaticVector256<nuint>Create(Vector128<nuint>lower,Vector128<nuint>upper);publicstaticVector256<T>CreateScalar<T>(Tvalue)whereT:struct;publicstaticVector256<T>CreateScalarUnsafe<T>(Tvalue)whereT:struct;publicstaticVector256<T>Divide(Vector256<T>left,Tright);publicstaticVector256<ushort>WidenLower(Vector256<byte>value);publicstaticVector256<int>WidenLower(Vector256<short>value);publicstaticVector256<long>WidenLower(Vector256<int>value);publicstaticVector256<short>WidenLower(Vector256<sbyte>value);publicstaticVector256<double>WidenLower(Vector256<float>value);publicstaticVector256<uint>WidenLower(Vector256<ushort>value);publicstaticVector256<ulong>WidenLower(Vector256<uint>value);publicstaticVector256<ushort>WidenUpper(Vector256<byte>value);publicstaticVector256<int>WidenUpper(Vector256<short>value);publicstaticVector256<long>WidenUpper(Vector256<int>value);publicstaticVector256<short>WidenUpper(Vector256<sbyte>value);publicstaticVector256<double>WidenUpper(Vector256<float>value);publicstaticVector256<uint>WidenUpper(Vector256<ushort>value);publicstaticVector256<ulong>WidenUpper(Vector256<uint>value);}publicpartialstructVector256<T>{publicstaticVector256<T>One{get;}publicstaticVector256<T>operator/(Vector256<T>left,Tright);publicstaticVector256<T>operator<<(Vector256<T>left,intshiftAmount);publicstaticVector256<T>operator>>(Vector256<T>left,intshiftAmount);publicstaticVector256<T>operator>>>(Vector256<T>left,intshiftAmount);}}Considerations
We expose == and != with the semantics of "All". Exposing <, <=, >, and >= with the same semantics likely makes sense. If we do this, then IComparable should likely also be implemented.
Summary
We've exposed several APIs on Vector64/128/256 and recently approved Vector512. However, there are notably a few missing APIs that make it feel "incomplete". Such APIs were likely simply missed as part of previous review.
API Proposal
Considerations
We expose
==and!=with the semantics of "All". Exposing<,<=,>, and>=with the same semantics likely makes sense. If we do this, thenIComparableshould likely also be implemented.