diff options
Diffstat (limited to 'tests/src/JIT/HardwareIntrinsics/X86/Sse/LoadAlignedVector128.cs')
-rw-r--r-- | tests/src/JIT/HardwareIntrinsics/X86/Sse/LoadAlignedVector128.cs | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/tests/src/JIT/HardwareIntrinsics/X86/Sse/LoadAlignedVector128.cs b/tests/src/JIT/HardwareIntrinsics/X86/Sse/LoadAlignedVector128.cs new file mode 100644 index 0000000000..eaf6909941 --- /dev/null +++ b/tests/src/JIT/HardwareIntrinsics/X86/Sse/LoadAlignedVector128.cs @@ -0,0 +1,62 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. +// + +using System; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Runtime.Intrinsics.X86; +using System.Runtime.Intrinsics; + +namespace IntelHardwareIntrinsicTest +{ + class Program + { + const int Pass = 100; + const int Fail = 0; + + static unsafe int Main(string[] args) + { + int testResult = Pass; + + if (Sse.IsSupported) + { + byte* inBuffer = stackalloc byte[32]; + float* inArray = Align(inBuffer, 16); + float* outArray = stackalloc float[4]; + + var vf = Sse.LoadAlignedVector128(inArray); + Unsafe.Write(outArray, vf); + + for (var i = 0; i < 4; i++) + { + if (BitConverter.SingleToInt32Bits(inArray[i]) != BitConverter.SingleToInt32Bits(outArray[i])) + { + Console.WriteLine("SSE LoadAlignedVector128 failed on float:"); + for (var n = 0; n < 4; n++) + { + Console.Write(outArray[n] + ", "); + } + Console.WriteLine(); + + testResult = Fail; + break; + } + } + } + + return testResult; + } + + static unsafe float* Align(byte* buffer, byte expectedAlignment) + { + // Compute how bad the misalignment is, which is at most (expectedAlignment - 1). + // Then subtract that from the expectedAlignment and add it to the original address + // to compute the aligned address. + + var misalignment = expectedAlignment - ((ulong)(buffer) % expectedAlignment); + return (float*)(buffer + misalignment); + } + } +} |