Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Arm64] LoadPairVector64 and LoadPairVector128 #39243

Closed
Tracked by #43051 ...
echesakov opened this issue Jul 14, 2020 · 7 comments · Fixed by #64864
Closed
Tracked by #43051 ...

[Arm64] LoadPairVector64 and LoadPairVector128 #39243

echesakov opened this issue Jul 14, 2020 · 7 comments · Fixed by #64864
Assignees
Labels
api-approved API was approved in API review, it can be implemented arch-arm64 area-System.Runtime.Intrinsics
Milestone

Comments

@echesakov
Copy link
Contributor

echesakov commented Jul 14, 2020

namespace System.Runtime.Intrinsics.Arm
{
    public static class AdvSimd
    {
        public static unsafe (Vector64<byte> Value1,    Vector64<byte> Value2)    LoadPairVector64(byte*   address);
        public static unsafe (Vector64<sbyte> Value1,   Vector64<sbyte> Value2)   LoadPairVector64(sbyte*  address);
        public static unsafe (Vector64<short> Value1,   Vector64<short> Value2)   LoadPairVector64(short*  address);
        public static unsafe (Vector64<ushort> Value1,  Vector64<ushort> Value2)  LoadPairVector64(ushort* address);
        public static unsafe (Vector64<int> Value1,     Vector64<int> Value2)     LoadPairVector64(int*    address);
        public static unsafe (Vector64<uint> Value1,    Vector64<uint> Value2)    LoadPairVector64(uint*   address);
        public static unsafe (Vector64<float> Value1,   Vector64<float> Value2)   LoadPairVector64(float*  address);

        public static unsafe (Vector128<byte> Value1,   Vector128<byte> Value2)   LoadPairVector128(byte*   address);
        public static unsafe (Vector128<sbyte> Value1,  Vector128<sbyte> Value2)  LoadPairVector128(sbyte*  address);
        public static unsafe (Vector128<short> Value1,  Vector128<short> Value2)  LoadPairVector128(short*  address);
        public static unsafe (Vector128<ushort> Value1, Vector128<ushort> Value2) LoadPairVector128(ushort* address);
        public static unsafe (Vector128<int> Value1,    Vector128<int> Value2)    LoadPairVector128(int*    address);
        public static unsafe (Vector128<uint> Value1,   Vector128<uint> Value2)   LoadPairVector128(uint*   address);
        public static unsafe (Vector128<long> Value1,   Vector128<long> Value2)   LoadPairVector128(long*   address);
        public static unsafe (Vector128<ulong> Value1,  Vector128<ulong> Value2)  LoadPairVector128(ulong*  address);
        public static unsafe (Vector128<float> Value1,  Vector128<float> Value2)  LoadPairVector128(float*  address);

        public static unsafe (Vector64<int> Value1,     Vector64<int> Value2)     LoadPairScalarVector64(int*  address);
        public static unsafe (Vector64<uint> Value1,    Vector64<uint> Value2)    LoadPairScalarVector64(uint* address);
        public static unsafe (Vector64<long> Value1,    Vector64<long> Value2)    LoadPairScalarVector64(long*  address);
        public static unsafe (Vector64<ulong> Value1,   Vector64<ulong> Value2)   LoadPairScalarVector64(ulong* address);
        public static unsafe (Vector64<float> Value1,   Vector64<float> Value2)   LoadPairScalarVector64(float* address);
        public static unsafe (Vector64<double> Value1,  Vector64<double> Value2)  LoadPairScalarVector64(double* address);

        public static unsafe (Vector64<byte> Value1,    Vector64<byte> Value2)    LoadPairVector64NonTemporal(byte*   address);
        public static unsafe (Vector64<sbyte> Value1,   Vector64<sbyte> Value2)   LoadPairVector64NonTemporal(sbyte*  address);
        public static unsafe (Vector64<short> Value1,   Vector64<short> Value2)   LoadPairVector64NonTemporal(short*  address);
        public static unsafe (Vector64<ushort> Value1,  Vector64<ushort> Value2)  LoadPairVector64NonTemporal(ushort* address);
        public static unsafe (Vector64<int> Value1,     Vector64<int> Value2)     LoadPairVector64NonTemporal(int*    address);
        public static unsafe (Vector64<uint> Value1,    Vector64<uint> Value2)    LoadPairVector64NonTemporal(uint*   address);
        public static unsafe (Vector64<float> Value1,   Vector64<float> Value2)   LoadPairVector64NonTemporal(float*  address);

        public static unsafe (Vector128<byte> Value1,   Vector128<byte> Value2)   LoadPairVector128NonTemporal(byte*   address);
        public static unsafe (Vector128<sbyte> Value1,  Vector128<sbyte> Value2)  LoadPairVector128NonTemporal(sbyte*  address);
        public static unsafe (Vector128<short> Value1,  Vector128<short> Value2)  LoadPairVector128NonTemporal(short*  address);
        public static unsafe (Vector128<ushort> Value1, Vector128<ushort> Value2) LoadPairVector128NonTemporal(ushort* address);
        public static unsafe (Vector128<int> Value1,    Vector128<int> Value2)    LoadPairVector128NonTemporal(int*    address);
        public static unsafe (Vector128<uint> Value1,   Vector128<uint> Value2)   LoadPairVector128NonTemporal(uint*   address);
        public static unsafe (Vector128<long> Value1,   Vector128<long> Value2)   LoadPairVector128NonTemporal(long*   address);
        public static unsafe (Vector128<ulong> Value1,  Vector128<ulong> Value2)  LoadPairVector128NonTemporal(ulong*  address);
        public static unsafe (Vector128<float> Value1,  Vector128<float> Value2)  LoadPairVector128NonTemporal(float*  address);

        public static unsafe (Vector64<int> Value1,     Vector64<int> Value2)     LoadPairScalarVector64NonTemporal(int*  address);
        public static unsafe (Vector64<uint> Value1,    Vector64<uint> Value2)    LoadPairScalarVector64NonTemporal(uint* address);
        public static unsafe (Vector64<long> Value1,    Vector64<long> Value2)    LoadPairScalarVector64NonTemporal(long*  address);
        public static unsafe (Vector64<ulong> Value1,   Vector64<ulong> Value2)   LoadPairScalarVector64NonTemporal(ulong* address);
        public static unsafe (Vector64<float> Value1,   Vector64<float> Value2)   LoadPairScalarVector64NonTemporal(float* address);
        public static unsafe (Vector64<double> Value1,  Vector64<double> Value2)  LoadPairScalarVector64NonTemporal(double* address);

Extracted from #37014, see #37014 (comment)

@echesakov echesakov added api-approved API was approved in API review, it can be implemented arch-arm64 area-System.Runtime.Intrinsics labels Jul 14, 2020
@ghost
Copy link

ghost commented Jul 14, 2020

Tagging subscribers to this area: @tannergooding
Notify danmosemsft if you want to be subscribed.

@Dotnet-GitSync-Bot Dotnet-GitSync-Bot added the untriaged New issue has not been triaged by the area owner label Jul 14, 2020
@echesakov echesakov added this to the 5.0.0 milestone Jul 14, 2020
@echesakov echesakov self-assigned this Jul 14, 2020
@echesakov echesakov removed the untriaged New issue has not been triaged by the area owner label Jul 14, 2020
@Gnbrkm41
Copy link
Contributor

Did we settle on using ValueTuples for the return type instead of a custom type?

@echesakov
Copy link
Contributor Author

Did we settle on using ValueTuples for the return type instead of a custom type?

@Gnbrkm41 Yes, during the last API review Video

@echesakov
Copy link
Contributor Author

Pushing this to 6.0

@ghost ghost added the in-pr There is an active PR which will close this issue when it is merged label May 7, 2021
@ghost ghost removed the in-pr There is an active PR which will close this issue when it is merged label Jun 9, 2021
@tannergooding
Copy link
Member

@echesakovMSFT, are you still planning on doing this for 6.0.0? If not, we should change the milestone to future

@echesakov
Copy link
Contributor Author

@tannergooding Yes, I am planning to finish this for .NET 6 - I discovered an issue with struct promotion while testing #52424 and working on the fix at the moment.

@ghost ghost added the in-pr There is an active PR which will close this issue when it is merged label Jun 25, 2021
@echesakov
Copy link
Contributor Author

As I mentioned in #52424 (comment) there are issues with current implementation of multi-reg nodes. I would need to fix these first before implementing the API.

@echesakov echesakov modified the milestones: 6.0.0, Future Jul 8, 2021
@echesakov echesakov removed the in-pr There is an active PR which will close this issue when it is merged label Jul 8, 2021
@JulieLeeMSFT JulieLeeMSFT modified the milestones: Future, 7.0.0 Oct 18, 2021
@jamshedd jamshedd added the User Story A single user-facing feature. Can be grouped under an epic. label Dec 3, 2021
@jamshedd jamshedd modified the milestones: 7.0.0, .NET 7.0 Dec 3, 2021
@karelz karelz modified the milestones: .NET 7.0, 7.0.0 Dec 6, 2021
@jamshedd jamshedd modified the milestones: 7.0.0, .NET 7.0 Dec 8, 2021
@JulieLeeMSFT JulieLeeMSFT removed the User Story A single user-facing feature. Can be grouped under an epic. label Feb 7, 2022
@ghost ghost locked as resolved and limited conversation to collaborators Mar 13, 2022
@karelz karelz modified the milestones: .NET 7.0, 7.0.0 May 23, 2022
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
api-approved API was approved in API review, it can be implemented arch-arm64 area-System.Runtime.Intrinsics
Projects
Archived in project
7 participants