Skip to content
This repository has been archived by the owner on Jan 23, 2023. It is now read-only.

Commit

Permalink
Add more tests for AVX Insert/Extract intrinsics
Browse files Browse the repository at this point in the history
  • Loading branch information
FeiPengIntel committed Mar 19, 2018
1 parent 3968088 commit 2205498
Show file tree
Hide file tree
Showing 20 changed files with 5,104 additions and 0 deletions.
16 changes: 16 additions & 0 deletions tests/src/JIT/HardwareIntrinsics/X86/Avx/Avx_r.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,14 @@
<Compile Include="Extract.UInt64.1.cs" />
<Compile Include="Extract.Int64.3.cs" />
<Compile Include="Extract.UInt64.3.cs" />
<Compile Include="Extract.Byte.52.cs" />
<Compile Include="Extract.SByte.52.cs" />
<Compile Include="Extract.Int16.27.cs" />
<Compile Include="Extract.UInt16.27.cs" />
<Compile Include="Extract.Int32.22.cs" />
<Compile Include="Extract.UInt32.22.cs" />
<Compile Include="Extract.Int64.19.cs" />
<Compile Include="Extract.UInt64.19.cs" />
<Compile Include="ExtendToVector256.Byte.cs" />
<Compile Include="ExtendToVector256.Double.cs" />
<Compile Include="ExtendToVector256.Int16.cs" />
Expand Down Expand Up @@ -96,6 +104,14 @@
<Compile Include="Insert.UInt64.1.cs" />
<Compile Include="Insert.Int64.3.cs" />
<Compile Include="Insert.UInt64.3.cs" />
<Compile Include="Insert.Byte.52.cs" />
<Compile Include="Insert.SByte.52.cs" />
<Compile Include="Insert.Int16.27.cs" />
<Compile Include="Insert.UInt16.27.cs" />
<Compile Include="Insert.Int32.22.cs" />
<Compile Include="Insert.UInt32.22.cs" />
<Compile Include="Insert.Int64.19.cs" />
<Compile Include="Insert.UInt64.19.cs" />
<Compile Include="InsertVector128.Byte.1.Load.cs" />
<Compile Include="InsertVector128.SByte.1.Load.cs" />
<Compile Include="InsertVector128.Int16.1.Load.cs" />
Expand Down
16 changes: 16 additions & 0 deletions tests/src/JIT/HardwareIntrinsics/X86/Avx/Avx_ro.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,14 @@
<Compile Include="Extract.UInt64.1.cs" />
<Compile Include="Extract.Int64.3.cs" />
<Compile Include="Extract.UInt64.3.cs" />
<Compile Include="Extract.Byte.52.cs" />
<Compile Include="Extract.SByte.52.cs" />
<Compile Include="Extract.Int16.27.cs" />
<Compile Include="Extract.UInt16.27.cs" />
<Compile Include="Extract.Int32.22.cs" />
<Compile Include="Extract.UInt32.22.cs" />
<Compile Include="Extract.Int64.19.cs" />
<Compile Include="Extract.UInt64.19.cs" />
<Compile Include="ExtendToVector256.Byte.cs" />
<Compile Include="ExtendToVector256.Double.cs" />
<Compile Include="ExtendToVector256.Int16.cs" />
Expand Down Expand Up @@ -96,6 +104,14 @@
<Compile Include="Insert.UInt64.1.cs" />
<Compile Include="Insert.Int64.3.cs" />
<Compile Include="Insert.UInt64.3.cs" />
<Compile Include="Insert.Byte.52.cs" />
<Compile Include="Insert.SByte.52.cs" />
<Compile Include="Insert.Int16.27.cs" />
<Compile Include="Insert.UInt16.27.cs" />
<Compile Include="Insert.Int32.22.cs" />
<Compile Include="Insert.UInt32.22.cs" />
<Compile Include="Insert.Int64.19.cs" />
<Compile Include="Insert.UInt64.19.cs" />
<Compile Include="InsertVector128.Byte.1.Load.cs" />
<Compile Include="InsertVector128.SByte.1.Load.cs" />
<Compile Include="InsertVector128.Int16.1.Load.cs" />
Expand Down
309 changes: 309 additions & 0 deletions tests/src/JIT/HardwareIntrinsics/X86/Avx/Extract.Byte.52.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,309 @@
// 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.

/******************************************************************************
* This file is auto-generated from a template file by the GenerateTests.csx *
* script in tests\src\JIT\HardwareIntrinsics\X86\Shared. In order to make *
* changes, please update the corresponding template and run according to the *
* directions listed in the file. *
******************************************************************************/

using System;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Intrinsics;
using System.Runtime.Intrinsics.X86;

namespace JIT.HardwareIntrinsics.X86
{
public static partial class Program
{
private static void ExtractByte52()
{
var test = new SimpleUnaryOpTest__ExtractByte52();

try
{
if (test.IsSupported)
{
// Validates basic functionality works, using Unsafe.Read
test.RunBasicScenario_UnsafeRead();

if (Avx.IsSupported)
{
// Validates basic functionality works, using Load
test.RunBasicScenario_Load();

// Validates basic functionality works, using LoadAligned
test.RunBasicScenario_LoadAligned();
}

// Validates calling via reflection works, using Unsafe.Read
test.RunReflectionScenario_UnsafeRead();

if (Avx.IsSupported)
{
// Validates calling via reflection works, using Load
test.RunReflectionScenario_Load();

// Validates calling via reflection works, using LoadAligned
test.RunReflectionScenario_LoadAligned();
}

// Validates passing a static member works
test.RunClsVarScenario();

// Validates passing a local works, using Unsafe.Read
test.RunLclVarScenario_UnsafeRead();

if (Avx.IsSupported)
{
// Validates passing a local works, using Load
test.RunLclVarScenario_Load();

// Validates passing a local works, using LoadAligned
test.RunLclVarScenario_LoadAligned();
}

// Validates passing the field of a local works
test.RunLclFldScenario();

// Validates passing an instance member works
test.RunFldScenario();
}
else
{
// Validates we throw on unsupported hardware
test.RunUnsupportedScenario();
}
}
catch (PlatformNotSupportedException)
{
test.Succeeded = true;
}

if (!test.Succeeded)
{
throw new Exception("One or more scenarios did not complete as expected.");
}
}
}

public sealed unsafe class SimpleUnaryOpTest__ExtractByte52
{
private const int VectorSize = 32;

private const int Op1ElementCount = VectorSize / sizeof(Byte);
private const int RetElementCount = VectorSize / sizeof(Byte);

private static Byte[] _data = new Byte[Op1ElementCount];

private static Vector256<Byte> _clsVar;

private Vector256<Byte> _fld;

private SimpleUnaryOpTest__DataTable<Byte, Byte> _dataTable;

static SimpleUnaryOpTest__ExtractByte52()
{
var random = new Random();

for (var i = 0; i < Op1ElementCount; i++) { _data[i] = (byte)(random.Next(0, byte.MaxValue)); }
Unsafe.CopyBlockUnaligned(ref Unsafe.As<Vector256<Byte>, byte>(ref _clsVar), ref Unsafe.As<Byte, byte>(ref _data[0]), VectorSize);
}

public SimpleUnaryOpTest__ExtractByte52()
{
Succeeded = true;

var random = new Random();

for (var i = 0; i < Op1ElementCount; i++) { _data[i] = (byte)(random.Next(0, byte.MaxValue)); }
Unsafe.CopyBlockUnaligned(ref Unsafe.As<Vector256<Byte>, byte>(ref _fld), ref Unsafe.As<Byte, byte>(ref _data[0]), VectorSize);

for (var i = 0; i < Op1ElementCount; i++) { _data[i] = (byte)(random.Next(0, byte.MaxValue)); }
_dataTable = new SimpleUnaryOpTest__DataTable<Byte, Byte>(_data, new Byte[RetElementCount], VectorSize);
}

public bool IsSupported => Avx.IsSupported;

public bool Succeeded { get; set; }

public void RunBasicScenario_UnsafeRead()
{
var result = Avx.Extract(
Unsafe.Read<Vector256<Byte>>(_dataTable.inArrayPtr),
52
);

Unsafe.Write(_dataTable.outArrayPtr, result);
ValidateResult(_dataTable.inArrayPtr, _dataTable.outArrayPtr);
}

public void RunBasicScenario_Load()
{
var result = Avx.Extract(
Avx.LoadVector256((Byte*)(_dataTable.inArrayPtr)),
52
);

Unsafe.Write(_dataTable.outArrayPtr, result);
ValidateResult(_dataTable.inArrayPtr, _dataTable.outArrayPtr);
}

public void RunBasicScenario_LoadAligned()
{
var result = Avx.Extract(
Avx.LoadAlignedVector256((Byte*)(_dataTable.inArrayPtr)),
52
);

Unsafe.Write(_dataTable.outArrayPtr, result);
ValidateResult(_dataTable.inArrayPtr, _dataTable.outArrayPtr);
}

public void RunReflectionScenario_UnsafeRead()
{
var result = typeof(Avx).GetMethod(nameof(Avx.Extract), new Type[] { typeof(Vector256<Byte>), typeof(byte) })
.Invoke(null, new object[] {
Unsafe.Read<Vector256<Byte>>(_dataTable.inArrayPtr),
(byte)52
});

Unsafe.Write(_dataTable.outArrayPtr, (Byte)(result));
ValidateResult(_dataTable.inArrayPtr, _dataTable.outArrayPtr);
}

public void RunReflectionScenario_Load()
{
var result = typeof(Avx).GetMethod(nameof(Avx.Extract), new Type[] { typeof(Vector256<Byte>), typeof(byte) })
.Invoke(null, new object[] {
Avx.LoadVector256((Byte*)(_dataTable.inArrayPtr)),
(byte)52
});

Unsafe.Write(_dataTable.outArrayPtr, (Byte)(result));
ValidateResult(_dataTable.inArrayPtr, _dataTable.outArrayPtr);
}

public void RunReflectionScenario_LoadAligned()
{
var result = typeof(Avx).GetMethod(nameof(Avx.Extract), new Type[] { typeof(Vector256<Byte>), typeof(byte) })
.Invoke(null, new object[] {
Avx.LoadAlignedVector256((Byte*)(_dataTable.inArrayPtr)),
(byte)52
});

Unsafe.Write(_dataTable.outArrayPtr, (Byte)(result));
ValidateResult(_dataTable.inArrayPtr, _dataTable.outArrayPtr);
}

public void RunClsVarScenario()
{
var result = Avx.Extract(
_clsVar,
52
);

Unsafe.Write(_dataTable.outArrayPtr, result);
ValidateResult(_clsVar, _dataTable.outArrayPtr);
}

public void RunLclVarScenario_UnsafeRead()
{
var firstOp = Unsafe.Read<Vector256<Byte>>(_dataTable.inArrayPtr);
var result = Avx.Extract(firstOp, 52);

Unsafe.Write(_dataTable.outArrayPtr, result);
ValidateResult(firstOp, _dataTable.outArrayPtr);
}

public void RunLclVarScenario_Load()
{
var firstOp = Avx.LoadVector256((Byte*)(_dataTable.inArrayPtr));
var result = Avx.Extract(firstOp, 52);

Unsafe.Write(_dataTable.outArrayPtr, result);
ValidateResult(firstOp, _dataTable.outArrayPtr);
}

public void RunLclVarScenario_LoadAligned()
{
var firstOp = Avx.LoadAlignedVector256((Byte*)(_dataTable.inArrayPtr));
var result = Avx.Extract(firstOp, 52);

Unsafe.Write(_dataTable.outArrayPtr, result);
ValidateResult(firstOp, _dataTable.outArrayPtr);
}

public void RunLclFldScenario()
{
var test = new SimpleUnaryOpTest__ExtractByte52();
var result = Avx.Extract(test._fld, 52);

Unsafe.Write(_dataTable.outArrayPtr, result);
ValidateResult(test._fld, _dataTable.outArrayPtr);
}

public void RunFldScenario()
{
var result = Avx.Extract(_fld, 52);

Unsafe.Write(_dataTable.outArrayPtr, result);
ValidateResult(_fld, _dataTable.outArrayPtr);
}

public void RunUnsupportedScenario()
{
Succeeded = false;

try
{
RunBasicScenario_UnsafeRead();
}
catch (PlatformNotSupportedException)
{
Succeeded = true;
}
}

private void ValidateResult(Vector256<Byte> firstOp, void* result, [CallerMemberName] string method = "")
{
Byte[] inArray = new Byte[Op1ElementCount];
Byte[] outArray = new Byte[RetElementCount];

Unsafe.Write(Unsafe.AsPointer(ref inArray[0]), firstOp);
Unsafe.CopyBlockUnaligned(ref Unsafe.As<Byte, byte>(ref outArray[0]), ref Unsafe.AsRef<byte>(result), VectorSize);

ValidateResult(inArray, outArray, method);
}

private void ValidateResult(void* firstOp, void* result, [CallerMemberName] string method = "")
{
Byte[] inArray = new Byte[Op1ElementCount];
Byte[] outArray = new Byte[RetElementCount];

Unsafe.CopyBlockUnaligned(ref Unsafe.As<Byte, byte>(ref inArray[0]), ref Unsafe.AsRef<byte>(firstOp), VectorSize);
Unsafe.CopyBlockUnaligned(ref Unsafe.As<Byte, byte>(ref outArray[0]), ref Unsafe.AsRef<byte>(result), VectorSize);

ValidateResult(inArray, outArray, method);
}

private void ValidateResult(Byte[] firstOp, Byte[] result, [CallerMemberName] string method = "")
{
if ((result[0] != firstOp[20]))
{
Succeeded = false;
}

if (!Succeeded)
{
Console.WriteLine($"{nameof(Avx)}.{nameof(Avx.Extract)}<Byte>(Vector256<Byte><9>): {method} failed:");
Console.WriteLine($" firstOp: ({string.Join(", ", firstOp)})");
Console.WriteLine($" result: ({string.Join(", ", result)})");
Console.WriteLine();
}
}
}
}
Loading

0 comments on commit 2205498

Please sign in to comment.