1 // Licensed to the .NET Foundation under one or more agreements.
2 // The .NET Foundation licenses this file to you under the MIT license.
3 // See the LICENSE file in the project root for more information.
5 /******************************************************************************
6 * This file is auto-generated from a template file by the GenerateTests.csx *
7 * script in tests\src\JIT\HardwareIntrinsics\X86\Shared. In order to make *
8 * changes, please update the corresponding template and run according to the *
9 * directions listed in the file. *
10 ******************************************************************************/
14 using System.Runtime.CompilerServices;
15 using System.Runtime.InteropServices;
16 using System.Runtime.Intrinsics;
17 using System.Runtime.Intrinsics.X86;
19 namespace JIT.HardwareIntrinsics.X86
21 public static partial class Program
23 private static void TestAllOnesInt64()
25 var test = new BooleanComparisonOpTest__TestAllOnesInt64();
29 // Validates basic functionality works, using Unsafe.Read
30 test.RunBasicScenario_UnsafeRead();
34 // Validates basic functionality works, using Load
35 test.RunBasicScenario_Load();
37 // Validates basic functionality works, using LoadAligned
38 test.RunBasicScenario_LoadAligned();
41 // Validates calling via reflection works, using Unsafe.Read
42 test.RunReflectionScenario_UnsafeRead();
46 // Validates calling via reflection works, using Load
47 test.RunReflectionScenario_Load();
49 // Validates calling via reflection works, using LoadAligned
50 test.RunReflectionScenario_LoadAligned();
53 // Validates passing a static member works
54 test.RunClsVarScenario();
56 // Validates passing a local works, using Unsafe.Read
57 test.RunLclVarScenario_UnsafeRead();
61 // Validates passing a local works, using Load
62 test.RunLclVarScenario_Load();
64 // Validates passing a local works, using LoadAligned
65 test.RunLclVarScenario_LoadAligned();
68 // Validates passing the field of a local works
69 test.RunLclFldScenario();
71 // Validates passing an instance member works
72 test.RunFldScenario();
76 // Validates we throw on unsupported hardware
77 test.RunUnsupportedScenario();
82 throw new Exception("One or more scenarios did not complete as expected.");
87 public sealed unsafe class BooleanComparisonOpTest__TestAllOnesInt64
89 private const int VectorSize = 16;
91 private const int Op1ElementCount = VectorSize / sizeof(Int64);
93 private static Int64[] _data = new Int64[Op1ElementCount];
95 private static Vector128<Int64> _clsVar;
97 private Vector128<Int64> _fld;
99 private BooleanUnaryOpTest__DataTable<Int64> _dataTable;
101 static BooleanComparisonOpTest__TestAllOnesInt64()
103 var random = new Random();
105 for (var i = 0; i < Op1ElementCount; i++) { _data[i] = (long)(random.Next(int.MinValue, int.MaxValue)); }
106 Unsafe.CopyBlockUnaligned(ref Unsafe.As<Vector128<Int64>, byte>(ref _clsVar), ref Unsafe.As<Int64, byte>(ref _data[0]), VectorSize);
109 public BooleanComparisonOpTest__TestAllOnesInt64()
113 var random = new Random();
115 for (var i = 0; i < Op1ElementCount; i++) { _data[i] = (long)(random.Next(int.MinValue, int.MaxValue)); }
116 Unsafe.CopyBlockUnaligned(ref Unsafe.As<Vector128<Int64>, byte>(ref _fld), ref Unsafe.As<Int64, byte>(ref _data[0]), VectorSize);
118 for (var i = 0; i < Op1ElementCount; i++) { _data[i] = (long)(random.Next(int.MinValue, int.MaxValue)); }
119 _dataTable = new BooleanUnaryOpTest__DataTable<Int64>(_data, VectorSize);
122 public bool IsSupported => Sse41.IsSupported;
124 public bool Succeeded { get; set; }
126 public void RunBasicScenario_UnsafeRead()
128 var result = Sse41.TestAllOnes(
129 Unsafe.Read<Vector128<Int64>>(_dataTable.inArrayPtr)
132 ValidateResult(_dataTable.inArrayPtr, result);
135 public void RunBasicScenario_Load()
137 var result = Sse41.TestAllOnes(
138 Sse2.LoadVector128((Int64*)(_dataTable.inArrayPtr))
141 ValidateResult(_dataTable.inArrayPtr, result);
144 public void RunBasicScenario_LoadAligned()
146 var result = Sse41.TestAllOnes(
147 Sse2.LoadAlignedVector128((Int64*)(_dataTable.inArrayPtr))
150 ValidateResult(_dataTable.inArrayPtr, result);
153 public void RunReflectionScenario_UnsafeRead()
155 var result = typeof(Sse41).GetMethod(nameof(Sse41.TestAllOnes), new Type[] { typeof(Vector128<Int64>) })
156 .Invoke(null, new object[] {
157 Unsafe.Read<Vector128<Int64>>(_dataTable.inArrayPtr)
160 ValidateResult(_dataTable.inArrayPtr, (bool)(result));
163 public void RunReflectionScenario_Load()
165 var result = typeof(Sse41).GetMethod(nameof(Sse41.TestAllOnes), new Type[] { typeof(Vector128<Int64>) })
166 .Invoke(null, new object[] {
167 Sse2.LoadVector128((Int64*)(_dataTable.inArrayPtr))
170 ValidateResult(_dataTable.inArrayPtr, (bool)(result));
173 public void RunReflectionScenario_LoadAligned()
175 var result = typeof(Sse41).GetMethod(nameof(Sse41.TestAllOnes), new Type[] { typeof(Vector128<Int64>) })
176 .Invoke(null, new object[] {
177 Sse2.LoadAlignedVector128((Int64*)(_dataTable.inArrayPtr))
180 ValidateResult(_dataTable.inArrayPtr, (bool)(result));
183 public void RunClsVarScenario()
185 var result = Sse41.TestAllOnes(
189 ValidateResult(_clsVar, result);
192 public void RunLclVarScenario_UnsafeRead()
194 var value = Unsafe.Read<Vector128<Int64>>(_dataTable.inArrayPtr);
195 var result = Sse41.TestAllOnes(value);
197 ValidateResult(value, result);
200 public void RunLclVarScenario_Load()
202 var value = Sse2.LoadVector128((Int64*)(_dataTable.inArrayPtr));
203 var result = Sse41.TestAllOnes(value);
205 ValidateResult(value, result);
208 public void RunLclVarScenario_LoadAligned()
210 var value = Sse2.LoadAlignedVector128((Int64*)(_dataTable.inArrayPtr));
211 var result = Sse41.TestAllOnes(value);
213 ValidateResult(value, result);
216 public void RunLclFldScenario()
218 var test = new BooleanComparisonOpTest__TestAllOnesInt64();
219 var result = Sse41.TestAllOnes(test._fld);
221 ValidateResult(test._fld, result);
224 public void RunFldScenario()
226 var result = Sse41.TestAllOnes(_fld);
228 ValidateResult(_fld, result);
231 public void RunUnsupportedScenario()
237 RunBasicScenario_UnsafeRead();
239 catch (PlatformNotSupportedException)
245 private void ValidateResult(Vector128<Int64> value, bool result, [CallerMemberName] string method = "")
247 Int64[] inArray = new Int64[Op1ElementCount];
249 Unsafe.WriteUnaligned(ref Unsafe.As<Int64, byte>(ref inArray[0]), value);
251 ValidateResult(inArray, result, method);
254 private void ValidateResult(void* value, bool result, [CallerMemberName] string method = "")
256 Int64[] inArray = new Int64[Op1ElementCount];
258 Unsafe.CopyBlockUnaligned(ref Unsafe.As<Int64, byte>(ref inArray[0]), ref Unsafe.AsRef<byte>(value), VectorSize);
260 ValidateResult(inArray, result, method);
263 private void ValidateResult(Int64[] value, bool result, [CallerMemberName] string method = "")
265 var expectedResult = true;
267 for (var i = 0; i < Op1ElementCount; i++)
269 expectedResult &= ((~value[i] & -1) == 0);
272 if (expectedResult != result)
276 Console.WriteLine($"{nameof(Sse41)}.{nameof(Sse41.TestAllOnes)}<Int64>(Vector128<Int64>): {method} failed:");
277 Console.WriteLine($" value: ({string.Join(", ", value)})");
278 Console.WriteLine($" result: ({string.Join(", ", result)})");