Skip to content
New issue

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

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

Already on GitHub? # 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 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
# for free to subscribe to this conversation on GitHub. Already have an account? #.
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