Merge pull request #16217 from adamsitnik/eventPipeAssert
[platform/upstream/coreclr.git] / tests / src / JIT / HardwareIntrinsics / X86 / Sse2 / CompareEqual.SByte.cs
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.
4
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  ******************************************************************************/
11
12 using System;
13 using System.Runtime.CompilerServices;
14 using System.Runtime.InteropServices;
15 using System.Runtime.Intrinsics;
16 using System.Runtime.Intrinsics.X86;
17
18 namespace JIT.HardwareIntrinsics.X86
19 {
20     public static partial class Program
21     {
22         private static void CompareEqualSByte()
23         {
24             var test = new SimpleBinaryOpTest__CompareEqualSByte();
25
26             if (test.IsSupported)
27             {
28                 // Validates basic functionality works, using Unsafe.Read
29                 test.RunBasicScenario_UnsafeRead();
30
31                 // Validates basic functionality works, using Load
32                 test.RunBasicScenario_Load();
33
34                 // Validates basic functionality works, using LoadAligned
35                 test.RunBasicScenario_LoadAligned();
36
37                 // Validates calling via reflection works, using Unsafe.Read
38                 test.RunReflectionScenario_UnsafeRead();
39
40                 // Validates calling via reflection works, using Load
41                 test.RunReflectionScenario_Load();
42
43                 // Validates calling via reflection works, using LoadAligned
44                 test.RunReflectionScenario_LoadAligned();
45
46                 // Validates passing a static member works
47                 test.RunClsVarScenario();
48
49                 // Validates passing a local works, using Unsafe.Read
50                 test.RunLclVarScenario_UnsafeRead();
51
52                 // Validates passing a local works, using Load
53                 test.RunLclVarScenario_Load();
54
55                 // Validates passing a local works, using LoadAligned
56                 test.RunLclVarScenario_LoadAligned();
57
58                 // Validates passing the field of a local works
59                 test.RunLclFldScenario();
60
61                 // Validates passing an instance member works
62                 test.RunFldScenario();
63             }
64             else
65             {
66                 // Validates we throw on unsupported hardware
67                 test.RunUnsupportedScenario();
68             }
69
70             if (!test.Succeeded)
71             {
72                 throw new Exception("One or more scenarios did not complete as expected.");
73             }
74         }
75     }
76
77     public sealed unsafe class SimpleBinaryOpTest__CompareEqualSByte
78     {
79         private const int VectorSize = 16;
80         private const int ElementCount = VectorSize / sizeof(SByte);
81
82         private static SByte[] _data1 = new SByte[ElementCount];
83         private static SByte[] _data2 = new SByte[ElementCount];
84
85         private static Vector128<SByte> _clsVar1;
86         private static Vector128<SByte> _clsVar2;
87
88         private Vector128<SByte> _fld1;
89         private Vector128<SByte> _fld2;
90
91         private SimpleBinaryOpTest__DataTable<SByte> _dataTable;
92
93         static SimpleBinaryOpTest__CompareEqualSByte()
94         {
95             var random = new Random();
96
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);
100         }
101
102         public SimpleBinaryOpTest__CompareEqualSByte()
103         {
104             Succeeded = true;
105
106             var random = new Random();
107
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);
111
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);
114         }
115
116         public bool IsSupported => Sse2.IsSupported;
117
118         public bool Succeeded { get; set; }
119
120         public void RunBasicScenario_UnsafeRead()
121         {
122             var result = Sse2.CompareEqual(
123                 Unsafe.Read<Vector128<SByte>>(_dataTable.inArray1Ptr),
124                 Unsafe.Read<Vector128<SByte>>(_dataTable.inArray2Ptr)
125             );
126
127             Unsafe.Write(_dataTable.outArrayPtr, result);
128             ValidateResult(_dataTable.inArray1Ptr, _dataTable.inArray2Ptr, _dataTable.outArrayPtr);
129         }
130
131         public void RunBasicScenario_Load()
132         {
133             var result = Sse2.CompareEqual(
134                 Sse2.LoadVector128((SByte*)(_dataTable.inArray1Ptr)),
135                 Sse2.LoadVector128((SByte*)(_dataTable.inArray2Ptr))
136             );
137
138             Unsafe.Write(_dataTable.outArrayPtr, result);
139             ValidateResult(_dataTable.inArray1Ptr, _dataTable.inArray2Ptr, _dataTable.outArrayPtr);
140         }
141
142         public void RunBasicScenario_LoadAligned()
143         {
144             var result = Sse2.CompareEqual(
145                 Sse2.LoadAlignedVector128((SByte*)(_dataTable.inArray1Ptr)),
146                 Sse2.LoadAlignedVector128((SByte*)(_dataTable.inArray2Ptr))
147             );
148
149             Unsafe.Write(_dataTable.outArrayPtr, result);
150             ValidateResult(_dataTable.inArray1Ptr, _dataTable.inArray2Ptr, _dataTable.outArrayPtr);
151         }
152
153         public void RunReflectionScenario_UnsafeRead()
154         {
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)
159                                      });
160
161             Unsafe.Write(_dataTable.outArrayPtr, (Vector128<SByte>)(result));
162             ValidateResult(_dataTable.inArray1Ptr, _dataTable.inArray2Ptr, _dataTable.outArrayPtr);
163         }
164
165         public void RunReflectionScenario_Load()
166         {
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))
171                                      });
172
173             Unsafe.Write(_dataTable.outArrayPtr, (Vector128<SByte>)(result));
174             ValidateResult(_dataTable.inArray1Ptr, _dataTable.inArray2Ptr, _dataTable.outArrayPtr);
175         }
176
177         public void RunReflectionScenario_LoadAligned()
178         {
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))
183                                      });
184
185             Unsafe.Write(_dataTable.outArrayPtr, (Vector128<SByte>)(result));
186             ValidateResult(_dataTable.inArray1Ptr, _dataTable.inArray2Ptr, _dataTable.outArrayPtr);
187         }
188
189         public void RunClsVarScenario()
190         {
191             var result = Sse2.CompareEqual(
192                 _clsVar1,
193                 _clsVar2
194             );
195
196             Unsafe.Write(_dataTable.outArrayPtr, result);
197             ValidateResult(_clsVar1, _clsVar2, _dataTable.outArrayPtr);
198         }
199
200         public void RunLclVarScenario_UnsafeRead()
201         {
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);
205
206             Unsafe.Write(_dataTable.outArrayPtr, result);
207             ValidateResult(left, right, _dataTable.outArrayPtr);
208         }
209
210         public void RunLclVarScenario_Load()
211         {
212             var left = Sse2.LoadVector128((SByte*)(_dataTable.inArray1Ptr));
213             var right = Sse2.LoadVector128((SByte*)(_dataTable.inArray2Ptr));
214             var result = Sse2.CompareEqual(left, right);
215
216             Unsafe.Write(_dataTable.outArrayPtr, result);
217             ValidateResult(left, right, _dataTable.outArrayPtr);
218         }
219
220         public void RunLclVarScenario_LoadAligned()
221         {
222             var left = Sse2.LoadAlignedVector128((SByte*)(_dataTable.inArray1Ptr));
223             var right = Sse2.LoadAlignedVector128((SByte*)(_dataTable.inArray2Ptr));
224             var result = Sse2.CompareEqual(left, right);
225
226             Unsafe.Write(_dataTable.outArrayPtr, result);
227             ValidateResult(left, right, _dataTable.outArrayPtr);
228         }
229
230         public void RunLclFldScenario()
231         {
232             var test = new SimpleBinaryOpTest__CompareEqualSByte();
233             var result = Sse2.CompareEqual(test._fld1, test._fld2);
234
235             Unsafe.Write(_dataTable.outArrayPtr, result);
236             ValidateResult(test._fld1, test._fld2, _dataTable.outArrayPtr);
237         }
238
239         public void RunFldScenario()
240         {
241             var result = Sse2.CompareEqual(_fld1, _fld2);
242
243             Unsafe.Write(_dataTable.outArrayPtr, result);
244             ValidateResult(_fld1, _fld2, _dataTable.outArrayPtr);
245         }
246
247         public void RunUnsupportedScenario()
248         {
249             Succeeded = false;
250
251             try
252             {
253                 RunBasicScenario_UnsafeRead();
254             }
255             catch (PlatformNotSupportedException)
256             {
257                 Succeeded = true;
258             }
259         }
260
261         private void ValidateResult(Vector128<SByte> left, Vector128<SByte> right, void* result, [CallerMemberName] string method = "")
262         {
263             SByte[] inArray1 = new SByte[ElementCount];
264             SByte[] inArray2 = new SByte[ElementCount];
265             SByte[] outArray = new SByte[ElementCount];
266
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);
270
271             ValidateResult(inArray1, inArray2, outArray, method);
272         }
273
274         private void ValidateResult(void* left, void* right, void* result, [CallerMemberName] string method = "")
275         {
276             SByte[] inArray1 = new SByte[ElementCount];
277             SByte[] inArray2 = new SByte[ElementCount];
278             SByte[] outArray = new SByte[ElementCount];
279
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);
283
284             ValidateResult(inArray1, inArray2, outArray, method);
285         }
286
287         private void ValidateResult(SByte[] left, SByte[] right, SByte[] result, [CallerMemberName] string method = "")
288         {
289             if (result[0] != ((left[0] == right[0]) ? unchecked((sbyte)(-1)) : 0))
290             {
291                 Succeeded = false;
292             }
293             else
294             {
295                 for (var i = 1; i < left.Length; i++)
296                 {
297                     if (result[i] != ((left[i] == right[i]) ? unchecked((sbyte)(-1)) : 0))
298                     {
299                         Succeeded = false;
300                         break;
301                     }
302                 }
303             }
304
305             if (!Succeeded)
306             {
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)})");
311                 Console.WriteLine();
312             }
313         }
314     }
315 }