From 8cea6241b9f5ea0fd082a6e84afcfd18bb72cc57 Mon Sep 17 00:00:00 2001 From: Mike Danes Date: Tue, 24 Jan 2017 18:49:16 +0200 Subject: [PATCH] Add Vector.op_Explicit tests --- tests/src/JIT/SIMD/VectorCast.cs | 204 ++++++++++++++++++++++++++++++++ tests/src/JIT/SIMD/VectorCast_r.csproj | 38 ++++++ tests/src/JIT/SIMD/VectorCast_ro.csproj | 38 ++++++ 3 files changed, 280 insertions(+) create mode 100644 tests/src/JIT/SIMD/VectorCast.cs create mode 100644 tests/src/JIT/SIMD/VectorCast_r.csproj create mode 100644 tests/src/JIT/SIMD/VectorCast_ro.csproj diff --git a/tests/src/JIT/SIMD/VectorCast.cs b/tests/src/JIT/SIMD/VectorCast.cs new file mode 100644 index 0000000..073c775 --- /dev/null +++ b/tests/src/JIT/SIMD/VectorCast.cs @@ -0,0 +1,204 @@ +// 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. +// + +using System; +using System.Numerics; +using System.Runtime.CompilerServices; + +internal partial class VectorTest +{ + const int Pass = 100; + const int Fail = -1; + + // An array containing 1,2,3,4... + static readonly byte[] bytePattern; + + static VectorTest() + { + bytePattern = new byte[64]; // enough to test up to 512 bit SIMD vectors + + for (int i = 0; i < bytePattern.Length; i++) + bytePattern[i] = (byte)(i + 1); + } + + static T[] GetPatternAs() where T : struct + { + T[] pattern = new T[bytePattern.Length]; // should be bytes.Length / sizeof(T) but sizeof(T) doesn't work + // so we'll settle for a larger than needed array + Buffer.BlockCopy(bytePattern, 0, pattern, 0, bytePattern.Length); + return pattern; + } + + // Get a Vector containing a specific bit pattern + [MethodImpl(MethodImplOptions.NoInlining)] + static Vector GetVector() where T : struct => new Vector(GetPatternAs()); + + // Cast a Vector to specific vector type (we can cast from a generic value but the cast itself can't + // be generic so we need one method for each possible vector element type). + static Vector To_Byte (Vector from) where T : struct => (Vector ) from; + static Vector To_SByte (Vector from) where T : struct => (Vector ) from; + static Vector To_UInt16 (Vector from) where T : struct => (Vector) from; + static Vector To_Int16 (Vector from) where T : struct => (Vector ) from; + static Vector To_UInt32 (Vector from) where T : struct => (Vector) from; + static Vector To_Int32 (Vector from) where T : struct => (Vector ) from; + static Vector To_UInt64 (Vector from) where T : struct => (Vector) from; + static Vector To_Int64 (Vector from) where T : struct => (Vector ) from; + static Vector To_Single (Vector from) where T : struct => (Vector) from; + static Vector To_Double (Vector from) where T : struct => (Vector) from; + + // Check the result of casting Vector to a specific vector type. + static bool Test_Byte () where T : struct => GetVector () == To_Byte ( GetVector() ); + static bool Test_SByte () where T : struct => GetVector () == To_SByte ( GetVector() ); + static bool Test_UInt16 () where T : struct => GetVector() == To_UInt16 ( GetVector() ); + static bool Test_Int16 () where T : struct => GetVector () == To_Int16 ( GetVector() ); + static bool Test_UInt32 () where T : struct => GetVector() == To_UInt32 ( GetVector() ); + static bool Test_Int32 () where T : struct => GetVector () == To_Int32 ( GetVector() ); + static bool Test_UInt64 () where T : struct => GetVector() == To_UInt64 ( GetVector() ); + static bool Test_Int64 () where T : struct => GetVector () == To_Int64 ( GetVector() ); + static bool Test_Single () where T : struct => GetVector() == To_Single ( GetVector() ); + static bool Test_Double () where T : struct => GetVector() == To_Double ( GetVector() ); + + [MethodImpl(MethodImplOptions.NoInlining)] + static bool ReportFailure(bool success, [CallerLineNumber] int line = 0) + { + if (!success) + { + Console.WriteLine($"Line {line} - FAIL"); + } + + return success; + } + + static int Main() + { + bool succeeded = true; + + succeeded &= ReportFailure( Test_Byte () ); + succeeded &= ReportFailure( Test_SByte () ); + succeeded &= ReportFailure( Test_UInt16() ); + succeeded &= ReportFailure( Test_Int16 () ); + succeeded &= ReportFailure( Test_UInt32() ); + succeeded &= ReportFailure( Test_Int32 () ); + succeeded &= ReportFailure( Test_UInt64() ); + succeeded &= ReportFailure( Test_Int64 () ); + succeeded &= ReportFailure( Test_Single() ); + succeeded &= ReportFailure( Test_Double() ); + + succeeded &= ReportFailure( Test_Byte () ); + succeeded &= ReportFailure( Test_SByte () ); + succeeded &= ReportFailure( Test_UInt16() ); + succeeded &= ReportFailure( Test_Int16 () ); + succeeded &= ReportFailure( Test_UInt32() ); + succeeded &= ReportFailure( Test_Int32 () ); + succeeded &= ReportFailure( Test_UInt64() ); + succeeded &= ReportFailure( Test_Int64 () ); + succeeded &= ReportFailure( Test_Single() ); + succeeded &= ReportFailure( Test_Double() ); + + succeeded &= ReportFailure( Test_Byte () ); + succeeded &= ReportFailure( Test_SByte () ); + succeeded &= ReportFailure( Test_UInt16() ); + succeeded &= ReportFailure( Test_Int16 () ); + succeeded &= ReportFailure( Test_UInt32() ); + succeeded &= ReportFailure( Test_Int32 () ); + succeeded &= ReportFailure( Test_UInt64() ); + succeeded &= ReportFailure( Test_Int64 () ); + succeeded &= ReportFailure( Test_Single() ); + succeeded &= ReportFailure( Test_Double() ); + + succeeded &= ReportFailure( Test_Byte () ); + succeeded &= ReportFailure( Test_SByte () ); + succeeded &= ReportFailure( Test_UInt16() ); + succeeded &= ReportFailure( Test_Int16 () ); + succeeded &= ReportFailure( Test_UInt32() ); + succeeded &= ReportFailure( Test_Int32 () ); + succeeded &= ReportFailure( Test_UInt64() ); + succeeded &= ReportFailure( Test_Int64 () ); + succeeded &= ReportFailure( Test_Single() ); + succeeded &= ReportFailure( Test_Double() ); + + succeeded &= ReportFailure( Test_Byte () ); + succeeded &= ReportFailure( Test_SByte () ); + succeeded &= ReportFailure( Test_UInt16() ); + succeeded &= ReportFailure( Test_Int16 () ); + succeeded &= ReportFailure( Test_UInt32() ); + succeeded &= ReportFailure( Test_Int32 () ); + succeeded &= ReportFailure( Test_UInt64() ); + succeeded &= ReportFailure( Test_Int64 () ); + succeeded &= ReportFailure( Test_Single() ); + succeeded &= ReportFailure( Test_Double() ); + + succeeded &= ReportFailure( Test_Byte () ); + succeeded &= ReportFailure( Test_SByte () ); + succeeded &= ReportFailure( Test_UInt16() ); + succeeded &= ReportFailure( Test_Int16 () ); + succeeded &= ReportFailure( Test_UInt32() ); + succeeded &= ReportFailure( Test_Int32 () ); + succeeded &= ReportFailure( Test_UInt64() ); + succeeded &= ReportFailure( Test_Int64 () ); + succeeded &= ReportFailure( Test_Single() ); + succeeded &= ReportFailure( Test_Double() ); + + succeeded &= ReportFailure( Test_Byte () ); + succeeded &= ReportFailure( Test_SByte () ); + succeeded &= ReportFailure( Test_UInt16() ); + succeeded &= ReportFailure( Test_Int16 () ); + succeeded &= ReportFailure( Test_UInt32() ); + succeeded &= ReportFailure( Test_Int32 () ); + succeeded &= ReportFailure( Test_UInt64() ); + succeeded &= ReportFailure( Test_Int64 () ); + succeeded &= ReportFailure( Test_Single() ); + succeeded &= ReportFailure( Test_Double() ); + + succeeded &= ReportFailure( Test_Byte () ); + succeeded &= ReportFailure( Test_SByte () ); + succeeded &= ReportFailure( Test_UInt16() ); + succeeded &= ReportFailure( Test_Int16 () ); + succeeded &= ReportFailure( Test_UInt32() ); + succeeded &= ReportFailure( Test_Int32 () ); + succeeded &= ReportFailure( Test_UInt64() ); + succeeded &= ReportFailure( Test_Int64 () ); + succeeded &= ReportFailure( Test_Single() ); + succeeded &= ReportFailure( Test_Double() ); + + succeeded &= ReportFailure( Test_Byte () ); + succeeded &= ReportFailure( Test_SByte () ); + succeeded &= ReportFailure( Test_UInt16() ); + succeeded &= ReportFailure( Test_Int16 () ); + succeeded &= ReportFailure( Test_UInt32() ); + succeeded &= ReportFailure( Test_Int32 () ); + succeeded &= ReportFailure( Test_UInt64() ); + succeeded &= ReportFailure( Test_Int64 () ); + succeeded &= ReportFailure( Test_Single() ); + succeeded &= ReportFailure( Test_Double() ); + + succeeded &= ReportFailure( Test_Byte () ); + succeeded &= ReportFailure( Test_SByte () ); + succeeded &= ReportFailure( Test_UInt16() ); + succeeded &= ReportFailure( Test_Int16 () ); + succeeded &= ReportFailure( Test_UInt32() ); + succeeded &= ReportFailure( Test_Int32 () ); + succeeded &= ReportFailure( Test_UInt64() ); + succeeded &= ReportFailure( Test_Int64 () ); + succeeded &= ReportFailure( Test_Single() ); + succeeded &= ReportFailure( Test_Double() ); + + using (JitLog jitLog = new JitLog()) + { + succeeded &= ReportFailure( jitLog.Check("op_Explicit", "Byte" ) ); + succeeded &= ReportFailure( jitLog.Check("op_Explicit", "SByte" ) ); + succeeded &= ReportFailure( jitLog.Check("op_Explicit", "UInt16") ); + succeeded &= ReportFailure( jitLog.Check("op_Explicit", "Int16" ) ); + succeeded &= ReportFailure( jitLog.Check("op_Explicit", "UInt32") ); + succeeded &= ReportFailure( jitLog.Check("op_Explicit", "Int32" ) ); + succeeded &= ReportFailure( jitLog.Check("op_Explicit", "UInt64") ); + succeeded &= ReportFailure( jitLog.Check("op_Explicit", "Int64" ) ); + succeeded &= ReportFailure( jitLog.Check("op_Explicit", "Single") ); + succeeded &= ReportFailure( jitLog.Check("op_Explicit", "Double") ); + } + + return succeeded ? Pass : Fail; + } +} diff --git a/tests/src/JIT/SIMD/VectorCast_r.csproj b/tests/src/JIT/SIMD/VectorCast_r.csproj new file mode 100644 index 0000000..b22b8d5 --- /dev/null +++ b/tests/src/JIT/SIMD/VectorCast_r.csproj @@ -0,0 +1,38 @@ + + + + + Debug + AnyCPU + 2.0 + {95DFC527-4DC1-495E-97D7-E94EE1F7140D} + Exe + {786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + ..\..\ + + + + + + + False + + + + None + + + + + + + + + + + + + diff --git a/tests/src/JIT/SIMD/VectorCast_ro.csproj b/tests/src/JIT/SIMD/VectorCast_ro.csproj new file mode 100644 index 0000000..ff75d36 --- /dev/null +++ b/tests/src/JIT/SIMD/VectorCast_ro.csproj @@ -0,0 +1,38 @@ + + + + + Debug + AnyCPU + 2.0 + {95DFC527-4DC1-495E-97D7-E94EE1F7140D} + Exe + {786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + ..\..\ + + + + + + + False + + + + None + True + + + + + + + + + + + + -- 2.7.4