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;
17 using static System.Runtime.Intrinsics.X86.Sse;
18 using static System.Runtime.Intrinsics.X86.Sse2;
20 namespace JIT.HardwareIntrinsics.X86
22 public static partial class Program
24 private static void InsertVector128Int321()
26 var test = new SimpleBinaryOpTest__InsertVector128Int321();
30 // Validates basic functionality works, using Unsafe.Read
31 test.RunBasicScenario_UnsafeRead();
35 // Validates basic functionality works, using Load
36 test.RunBasicScenario_Load();
38 // Validates basic functionality works, using LoadAligned
39 test.RunBasicScenario_LoadAligned();
42 // Validates calling via reflection works, using Unsafe.Read
43 test.RunReflectionScenario_UnsafeRead();
47 // Validates calling via reflection works, using Load
48 test.RunReflectionScenario_Load();
50 // Validates calling via reflection works, using LoadAligned
51 test.RunReflectionScenario_LoadAligned();
54 // Validates passing a static member works
55 test.RunClsVarScenario();
57 // Validates passing a local works, using Unsafe.Read
58 test.RunLclVarScenario_UnsafeRead();
62 // Validates passing a local works, using Load
63 test.RunLclVarScenario_Load();
65 // Validates passing a local works, using LoadAligned
66 test.RunLclVarScenario_LoadAligned();
69 // Validates passing the field of a local works
70 test.RunLclFldScenario();
72 // Validates passing an instance member works
73 test.RunFldScenario();
77 // Validates we throw on unsupported hardware
78 test.RunUnsupportedScenario();
83 throw new Exception("One or more scenarios did not complete as expected.");
88 public sealed unsafe class SimpleBinaryOpTest__InsertVector128Int321
90 private static readonly int LargestVectorSize = 32;
92 private static readonly int Op1ElementCount = Unsafe.SizeOf<Vector256<Int32>>() / sizeof(Int32);
93 private static readonly int Op2ElementCount = Unsafe.SizeOf<Vector128<Int32>>() / sizeof(Int32);
94 private static readonly int RetElementCount = Unsafe.SizeOf<Vector256<Int32>>() / sizeof(Int32);
96 private static Int32[] _data1 = new Int32[Op1ElementCount];
97 private static Int32[] _data2 = new Int32[Op2ElementCount];
99 private static Vector256<Int32> _clsVar1;
100 private static Vector128<Int32> _clsVar2;
102 private Vector256<Int32> _fld1;
103 private Vector128<Int32> _fld2;
105 private SimpleBinaryOpTest__DataTable<Int32, Int32, Int32> _dataTable;
107 static SimpleBinaryOpTest__InsertVector128Int321()
109 var random = new Random();
111 for (var i = 0; i < Op1ElementCount; i++) { _data1[i] = (int)(random.Next(0, int.MaxValue)); }
112 Unsafe.CopyBlockUnaligned(ref Unsafe.As<Vector256<Int32>, byte>(ref _clsVar1), ref Unsafe.As<Int32, byte>(ref _data1[0]), (uint)Unsafe.SizeOf<Vector256<Int32>>());
113 for (var i = 0; i < Op2ElementCount; i++) { _data2[i] = (int)(random.Next(0, int.MaxValue)); }
114 Unsafe.CopyBlockUnaligned(ref Unsafe.As<Vector128<Int32>, byte>(ref _clsVar2), ref Unsafe.As<Int32, byte>(ref _data2[0]), (uint)Unsafe.SizeOf<Vector128<Int32>>());
117 public SimpleBinaryOpTest__InsertVector128Int321()
121 var random = new Random();
123 for (var i = 0; i < Op1ElementCount; i++) { _data1[i] = (int)(random.Next(0, int.MaxValue)); }
124 Unsafe.CopyBlockUnaligned(ref Unsafe.As<Vector256<Int32>, byte>(ref _fld1), ref Unsafe.As<Int32, byte>(ref _data1[0]), (uint)Unsafe.SizeOf<Vector256<Int32>>());
125 for (var i = 0; i < Op2ElementCount; i++) { _data2[i] = (int)(random.Next(0, int.MaxValue)); }
126 Unsafe.CopyBlockUnaligned(ref Unsafe.As<Vector128<Int32>, byte>(ref _fld2), ref Unsafe.As<Int32, byte>(ref _data2[0]), (uint)Unsafe.SizeOf<Vector128<Int32>>());
128 for (var i = 0; i < Op1ElementCount; i++) { _data1[i] = (int)(random.Next(0, int.MaxValue)); }
129 for (var i = 0; i < Op2ElementCount; i++) { _data2[i] = (int)(random.Next(0, int.MaxValue)); }
130 _dataTable = new SimpleBinaryOpTest__DataTable<Int32, Int32, Int32>(_data1, _data2, new Int32[RetElementCount], LargestVectorSize);
133 public bool IsSupported => Avx2.IsSupported;
135 public bool Succeeded { get; set; }
137 public void RunBasicScenario_UnsafeRead()
139 var result = Avx2.InsertVector128(
140 Unsafe.Read<Vector256<Int32>>(_dataTable.inArray1Ptr),
141 Unsafe.Read<Vector128<Int32>>(_dataTable.inArray2Ptr),
145 Unsafe.Write(_dataTable.outArrayPtr, result);
146 ValidateResult(_dataTable.inArray1Ptr, _dataTable.inArray2Ptr, _dataTable.outArrayPtr);
149 public void RunBasicScenario_Load()
151 var result = Avx2.InsertVector128(
152 Avx.LoadVector256((Int32*)(_dataTable.inArray1Ptr)),
153 LoadVector128((Int32*)(_dataTable.inArray2Ptr)),
157 Unsafe.Write(_dataTable.outArrayPtr, result);
158 ValidateResult(_dataTable.inArray1Ptr, _dataTable.inArray2Ptr, _dataTable.outArrayPtr);
161 public void RunBasicScenario_LoadAligned()
163 var result = Avx2.InsertVector128(
164 Avx.LoadAlignedVector256((Int32*)(_dataTable.inArray1Ptr)),
165 LoadAlignedVector128((Int32*)(_dataTable.inArray2Ptr)),
169 Unsafe.Write(_dataTable.outArrayPtr, result);
170 ValidateResult(_dataTable.inArray1Ptr, _dataTable.inArray2Ptr, _dataTable.outArrayPtr);
173 public void RunReflectionScenario_UnsafeRead()
175 var result = typeof(Avx2).GetMethod(nameof(Avx2.InsertVector128), new Type[] { typeof(Vector256<Int32>), typeof(Vector128<Int32>), typeof(byte) })
176 .Invoke(null, new object[] {
177 Unsafe.Read<Vector256<Int32>>(_dataTable.inArray1Ptr),
178 Unsafe.Read<Vector128<Int32>>(_dataTable.inArray2Ptr),
182 Unsafe.Write(_dataTable.outArrayPtr, (Vector256<Int32>)(result));
183 ValidateResult(_dataTable.inArray1Ptr, _dataTable.inArray2Ptr, _dataTable.outArrayPtr);
186 public void RunReflectionScenario_Load()
188 var result = typeof(Avx2).GetMethod(nameof(Avx2.InsertVector128), new Type[] { typeof(Vector256<Int32>), typeof(Vector128<Int32>), typeof(byte) })
189 .Invoke(null, new object[] {
190 Avx.LoadVector256((Int32*)(_dataTable.inArray1Ptr)),
191 LoadVector128((Int32*)(_dataTable.inArray2Ptr)),
195 Unsafe.Write(_dataTable.outArrayPtr, (Vector256<Int32>)(result));
196 ValidateResult(_dataTable.inArray1Ptr, _dataTable.inArray2Ptr, _dataTable.outArrayPtr);
199 public void RunReflectionScenario_LoadAligned()
201 var result = typeof(Avx2).GetMethod(nameof(Avx2.InsertVector128), new Type[] { typeof(Vector256<Int32>), typeof(Vector128<Int32>), typeof(byte) })
202 .Invoke(null, new object[] {
203 Avx.LoadAlignedVector256((Int32*)(_dataTable.inArray1Ptr)),
204 LoadAlignedVector128((Int32*)(_dataTable.inArray2Ptr)),
208 Unsafe.Write(_dataTable.outArrayPtr, (Vector256<Int32>)(result));
209 ValidateResult(_dataTable.inArray1Ptr, _dataTable.inArray2Ptr, _dataTable.outArrayPtr);
212 public void RunClsVarScenario()
214 var result = Avx2.InsertVector128(
220 Unsafe.Write(_dataTable.outArrayPtr, result);
221 ValidateResult(_clsVar1, _clsVar2, _dataTable.outArrayPtr);
224 public void RunLclVarScenario_UnsafeRead()
226 var left = Unsafe.Read<Vector256<Int32>>(_dataTable.inArray1Ptr);
227 var right = Unsafe.Read<Vector128<Int32>>(_dataTable.inArray2Ptr);
228 var result = Avx2.InsertVector128(left, right, 1);
230 Unsafe.Write(_dataTable.outArrayPtr, result);
231 ValidateResult(left, right, _dataTable.outArrayPtr);
234 public void RunLclVarScenario_Load()
236 var left = Avx.LoadVector256((Int32*)(_dataTable.inArray1Ptr));
237 var right = LoadVector128((Int32*)(_dataTable.inArray2Ptr));
238 var result = Avx2.InsertVector128(left, right, 1);
240 Unsafe.Write(_dataTable.outArrayPtr, result);
241 ValidateResult(left, right, _dataTable.outArrayPtr);
244 public void RunLclVarScenario_LoadAligned()
246 var left = Avx.LoadAlignedVector256((Int32*)(_dataTable.inArray1Ptr));
247 var right = LoadAlignedVector128((Int32*)(_dataTable.inArray2Ptr));
248 var result = Avx2.InsertVector128(left, right, 1);
250 Unsafe.Write(_dataTable.outArrayPtr, result);
251 ValidateResult(left, right, _dataTable.outArrayPtr);
254 public void RunLclFldScenario()
256 var test = new SimpleBinaryOpTest__InsertVector128Int321();
257 var result = Avx2.InsertVector128(test._fld1, test._fld2, 1);
259 Unsafe.Write(_dataTable.outArrayPtr, result);
260 ValidateResult(test._fld1, test._fld2, _dataTable.outArrayPtr);
263 public void RunFldScenario()
265 var result = Avx2.InsertVector128(_fld1, _fld2, 1);
267 Unsafe.Write(_dataTable.outArrayPtr, result);
268 ValidateResult(_fld1, _fld2, _dataTable.outArrayPtr);
271 public void RunUnsupportedScenario()
277 RunBasicScenario_UnsafeRead();
279 catch (PlatformNotSupportedException)
285 private void ValidateResult(Vector256<Int32> left, Vector128<Int32> right, void* result, [CallerMemberName] string method = "")
287 Int32[] inArray1 = new Int32[Op1ElementCount];
288 Int32[] inArray2 = new Int32[Op2ElementCount];
289 Int32[] outArray = new Int32[RetElementCount];
291 Unsafe.WriteUnaligned(ref Unsafe.As<Int32, byte>(ref inArray1[0]), left);
292 Unsafe.WriteUnaligned(ref Unsafe.As<Int32, byte>(ref inArray2[0]), right);
293 Unsafe.CopyBlockUnaligned(ref Unsafe.As<Int32, byte>(ref outArray[0]), ref Unsafe.AsRef<byte>(result), (uint)Unsafe.SizeOf<Vector256<Int32>>());
295 ValidateResult(inArray1, inArray2, outArray, method);
298 private void ValidateResult(void* left, void* right, void* result, [CallerMemberName] string method = "")
300 Int32[] inArray1 = new Int32[Op1ElementCount];
301 Int32[] inArray2 = new Int32[Op2ElementCount];
302 Int32[] outArray = new Int32[RetElementCount];
304 Unsafe.CopyBlockUnaligned(ref Unsafe.As<Int32, byte>(ref inArray1[0]), ref Unsafe.AsRef<byte>(left), (uint)Unsafe.SizeOf<Vector256<Int32>>());
305 Unsafe.CopyBlockUnaligned(ref Unsafe.As<Int32, byte>(ref inArray2[0]), ref Unsafe.AsRef<byte>(right), (uint)Unsafe.SizeOf<Vector128<Int32>>());
306 Unsafe.CopyBlockUnaligned(ref Unsafe.As<Int32, byte>(ref outArray[0]), ref Unsafe.AsRef<byte>(result), (uint)Unsafe.SizeOf<Vector256<Int32>>());
308 ValidateResult(inArray1, inArray2, outArray, method);
311 private void ValidateResult(Int32[] left, Int32[] right, Int32[] result, [CallerMemberName] string method = "")
313 if (result[0] != left[0])
319 for (var i = 1; i < RetElementCount; i++)
321 if ((i > 3 ? result[i] != right[i - 4] : result[i] != left[i]))
331 Console.WriteLine($"{nameof(Avx2)}.{nameof(Avx2.InsertVector128)}<Int32>(Vector256<Int32>, Vector128<Int32>.1): {method} failed:");
332 Console.WriteLine($" left: ({string.Join(", ", left)})");
333 Console.WriteLine($" right: ({string.Join(", ", right)})");
334 Console.WriteLine($" result: ({string.Join(", ", result)})");