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 ******************************************************************************/
13 using System.Runtime.CompilerServices;
14 using System.Runtime.InteropServices;
15 using System.Runtime.Intrinsics;
16 using System.Runtime.Intrinsics.X86;
18 namespace JIT.HardwareIntrinsics.X86
20 public static partial class Program
22 private static void CompareEqualSByte()
24 var test = new SimpleBinaryOpTest__CompareEqualSByte();
28 // Validates basic functionality works, using Unsafe.Read
29 test.RunBasicScenario_UnsafeRead();
31 // Validates basic functionality works, using Load
32 test.RunBasicScenario_Load();
34 // Validates basic functionality works, using LoadAligned
35 test.RunBasicScenario_LoadAligned();
37 // Validates calling via reflection works, using Unsafe.Read
38 test.RunReflectionScenario_UnsafeRead();
40 // Validates calling via reflection works, using Load
41 test.RunReflectionScenario_Load();
43 // Validates calling via reflection works, using LoadAligned
44 test.RunReflectionScenario_LoadAligned();
46 // Validates passing a static member works
47 test.RunClsVarScenario();
49 // Validates passing a local works, using Unsafe.Read
50 test.RunLclVarScenario_UnsafeRead();
52 // Validates passing a local works, using Load
53 test.RunLclVarScenario_Load();
55 // Validates passing a local works, using LoadAligned
56 test.RunLclVarScenario_LoadAligned();
58 // Validates passing the field of a local works
59 test.RunLclFldScenario();
61 // Validates passing an instance member works
62 test.RunFldScenario();
66 // Validates we throw on unsupported hardware
67 test.RunUnsupportedScenario();
72 throw new Exception("One or more scenarios did not complete as expected.");
77 public sealed unsafe class SimpleBinaryOpTest__CompareEqualSByte
79 private const int VectorSize = 16;
80 private const int ElementCount = VectorSize / sizeof(SByte);
82 private static SByte[] _data1 = new SByte[ElementCount];
83 private static SByte[] _data2 = new SByte[ElementCount];
85 private static Vector128<SByte> _clsVar1;
86 private static Vector128<SByte> _clsVar2;
88 private Vector128<SByte> _fld1;
89 private Vector128<SByte> _fld2;
91 private SimpleBinaryOpTest__DataTable<SByte> _dataTable;
93 static SimpleBinaryOpTest__CompareEqualSByte()
95 var random = new Random();
97 for (var i = 0; i < ElementCount; i++) { _data1[i] = (sbyte)(random.Next(sbyte.MinValue, sbyte.MaxValue)); _data2[i] = (sbyte)(random.Next(sbyte.MinValue, sbyte.MaxValue)); }
98 Unsafe.CopyBlockUnaligned(ref Unsafe.As<Vector128<SByte>, byte>(ref _clsVar1), ref Unsafe.As<SByte, byte>(ref _data2[0]), VectorSize);
99 Unsafe.CopyBlockUnaligned(ref Unsafe.As<Vector128<SByte>, byte>(ref _clsVar2), ref Unsafe.As<SByte, byte>(ref _data1[0]), VectorSize);
102 public SimpleBinaryOpTest__CompareEqualSByte()
106 var random = new Random();
108 for (var i = 0; i < ElementCount; i++) { _data1[i] = (sbyte)(random.Next(sbyte.MinValue, sbyte.MaxValue)); _data2[i] = (sbyte)(random.Next(sbyte.MinValue, sbyte.MaxValue)); }
109 Unsafe.CopyBlockUnaligned(ref Unsafe.As<Vector128<SByte>, byte>(ref _fld1), ref Unsafe.As<SByte, byte>(ref _data1[0]), VectorSize);
110 Unsafe.CopyBlockUnaligned(ref Unsafe.As<Vector128<SByte>, byte>(ref _fld2), ref Unsafe.As<SByte, byte>(ref _data2[0]), VectorSize);
112 for (var i = 0; i < ElementCount; i++) { _data1[i] = (sbyte)(random.Next(sbyte.MinValue, sbyte.MaxValue)); _data2[i] = (sbyte)(random.Next(sbyte.MinValue, sbyte.MaxValue)); }
113 _dataTable = new SimpleBinaryOpTest__DataTable<SByte>(_data1, _data2, new SByte[ElementCount], VectorSize);
116 public bool IsSupported => Sse2.IsSupported;
118 public bool Succeeded { get; set; }
120 public void RunBasicScenario_UnsafeRead()
122 var result = Sse2.CompareEqual(
123 Unsafe.Read<Vector128<SByte>>(_dataTable.inArray1Ptr),
124 Unsafe.Read<Vector128<SByte>>(_dataTable.inArray2Ptr)
127 Unsafe.Write(_dataTable.outArrayPtr, result);
128 ValidateResult(_dataTable.inArray1Ptr, _dataTable.inArray2Ptr, _dataTable.outArrayPtr);
131 public void RunBasicScenario_Load()
133 var result = Sse2.CompareEqual(
134 Sse2.LoadVector128((SByte*)(_dataTable.inArray1Ptr)),
135 Sse2.LoadVector128((SByte*)(_dataTable.inArray2Ptr))
138 Unsafe.Write(_dataTable.outArrayPtr, result);
139 ValidateResult(_dataTable.inArray1Ptr, _dataTable.inArray2Ptr, _dataTable.outArrayPtr);
142 public void RunBasicScenario_LoadAligned()
144 var result = Sse2.CompareEqual(
145 Sse2.LoadAlignedVector128((SByte*)(_dataTable.inArray1Ptr)),
146 Sse2.LoadAlignedVector128((SByte*)(_dataTable.inArray2Ptr))
149 Unsafe.Write(_dataTable.outArrayPtr, result);
150 ValidateResult(_dataTable.inArray1Ptr, _dataTable.inArray2Ptr, _dataTable.outArrayPtr);
153 public void RunReflectionScenario_UnsafeRead()
155 var result = typeof(Sse2).GetMethod(nameof(Sse2.CompareEqual), new Type[] { typeof(Vector128<SByte>), typeof(Vector128<SByte>) })
156 .Invoke(null, new object[] {
157 Unsafe.Read<Vector128<SByte>>(_dataTable.inArray1Ptr),
158 Unsafe.Read<Vector128<SByte>>(_dataTable.inArray2Ptr)
161 Unsafe.Write(_dataTable.outArrayPtr, (Vector128<SByte>)(result));
162 ValidateResult(_dataTable.inArray1Ptr, _dataTable.inArray2Ptr, _dataTable.outArrayPtr);
165 public void RunReflectionScenario_Load()
167 var result = typeof(Sse2).GetMethod(nameof(Sse2.CompareEqual), new Type[] { typeof(Vector128<SByte>), typeof(Vector128<SByte>) })
168 .Invoke(null, new object[] {
169 Sse2.LoadVector128((SByte*)(_dataTable.inArray1Ptr)),
170 Sse2.LoadVector128((SByte*)(_dataTable.inArray2Ptr))
173 Unsafe.Write(_dataTable.outArrayPtr, (Vector128<SByte>)(result));
174 ValidateResult(_dataTable.inArray1Ptr, _dataTable.inArray2Ptr, _dataTable.outArrayPtr);
177 public void RunReflectionScenario_LoadAligned()
179 var result = typeof(Sse2).GetMethod(nameof(Sse2.CompareEqual), new Type[] { typeof(Vector128<SByte>), typeof(Vector128<SByte>) })
180 .Invoke(null, new object[] {
181 Sse2.LoadAlignedVector128((SByte*)(_dataTable.inArray1Ptr)),
182 Sse2.LoadAlignedVector128((SByte*)(_dataTable.inArray2Ptr))
185 Unsafe.Write(_dataTable.outArrayPtr, (Vector128<SByte>)(result));
186 ValidateResult(_dataTable.inArray1Ptr, _dataTable.inArray2Ptr, _dataTable.outArrayPtr);
189 public void RunClsVarScenario()
191 var result = Sse2.CompareEqual(
196 Unsafe.Write(_dataTable.outArrayPtr, result);
197 ValidateResult(_clsVar1, _clsVar2, _dataTable.outArrayPtr);
200 public void RunLclVarScenario_UnsafeRead()
202 var left = Unsafe.Read<Vector128<SByte>>(_dataTable.inArray1Ptr);
203 var right = Unsafe.Read<Vector128<SByte>>(_dataTable.inArray2Ptr);
204 var result = Sse2.CompareEqual(left, right);
206 Unsafe.Write(_dataTable.outArrayPtr, result);
207 ValidateResult(left, right, _dataTable.outArrayPtr);
210 public void RunLclVarScenario_Load()
212 var left = Sse2.LoadVector128((SByte*)(_dataTable.inArray1Ptr));
213 var right = Sse2.LoadVector128((SByte*)(_dataTable.inArray2Ptr));
214 var result = Sse2.CompareEqual(left, right);
216 Unsafe.Write(_dataTable.outArrayPtr, result);
217 ValidateResult(left, right, _dataTable.outArrayPtr);
220 public void RunLclVarScenario_LoadAligned()
222 var left = Sse2.LoadAlignedVector128((SByte*)(_dataTable.inArray1Ptr));
223 var right = Sse2.LoadAlignedVector128((SByte*)(_dataTable.inArray2Ptr));
224 var result = Sse2.CompareEqual(left, right);
226 Unsafe.Write(_dataTable.outArrayPtr, result);
227 ValidateResult(left, right, _dataTable.outArrayPtr);
230 public void RunLclFldScenario()
232 var test = new SimpleBinaryOpTest__CompareEqualSByte();
233 var result = Sse2.CompareEqual(test._fld1, test._fld2);
235 Unsafe.Write(_dataTable.outArrayPtr, result);
236 ValidateResult(test._fld1, test._fld2, _dataTable.outArrayPtr);
239 public void RunFldScenario()
241 var result = Sse2.CompareEqual(_fld1, _fld2);
243 Unsafe.Write(_dataTable.outArrayPtr, result);
244 ValidateResult(_fld1, _fld2, _dataTable.outArrayPtr);
247 public void RunUnsupportedScenario()
253 RunBasicScenario_UnsafeRead();
255 catch (PlatformNotSupportedException)
261 private void ValidateResult(Vector128<SByte> left, Vector128<SByte> right, void* result, [CallerMemberName] string method = "")
263 SByte[] inArray1 = new SByte[ElementCount];
264 SByte[] inArray2 = new SByte[ElementCount];
265 SByte[] outArray = new SByte[ElementCount];
267 Unsafe.Write(Unsafe.AsPointer(ref inArray1[0]), left);
268 Unsafe.Write(Unsafe.AsPointer(ref inArray2[0]), right);
269 Unsafe.CopyBlockUnaligned(ref Unsafe.As<SByte, byte>(ref outArray[0]), ref Unsafe.AsRef<byte>(result), VectorSize);
271 ValidateResult(inArray1, inArray2, outArray, method);
274 private void ValidateResult(void* left, void* right, void* result, [CallerMemberName] string method = "")
276 SByte[] inArray1 = new SByte[ElementCount];
277 SByte[] inArray2 = new SByte[ElementCount];
278 SByte[] outArray = new SByte[ElementCount];
280 Unsafe.CopyBlockUnaligned(ref Unsafe.As<SByte, byte>(ref inArray1[0]), ref Unsafe.AsRef<byte>(left), VectorSize);
281 Unsafe.CopyBlockUnaligned(ref Unsafe.As<SByte, byte>(ref inArray2[0]), ref Unsafe.AsRef<byte>(right), VectorSize);
282 Unsafe.CopyBlockUnaligned(ref Unsafe.As<SByte, byte>(ref outArray[0]), ref Unsafe.AsRef<byte>(result), VectorSize);
284 ValidateResult(inArray1, inArray2, outArray, method);
287 private void ValidateResult(SByte[] left, SByte[] right, SByte[] result, [CallerMemberName] string method = "")
289 if (result[0] != ((left[0] == right[0]) ? unchecked((sbyte)(-1)) : 0))
295 for (var i = 1; i < left.Length; i++)
297 if (result[i] != ((left[i] == right[i]) ? unchecked((sbyte)(-1)) : 0))
307 Console.WriteLine($"{nameof(Sse2)}.{nameof(Sse2.CompareEqual)}<SByte>: {method} failed:");
308 Console.WriteLine($" left: ({string.Join(", ", left)})");
309 Console.WriteLine($" right: ({string.Join(", ", right)})");
310 Console.WriteLine($" result: ({string.Join(", ", result)})");