summaryrefslogtreecommitdiff
path: root/tests/src/JIT/Regression/JitBlue/GitHub_8220/GitHub_8220.cs
diff options
context:
space:
mode:
Diffstat (limited to 'tests/src/JIT/Regression/JitBlue/GitHub_8220/GitHub_8220.cs')
-rw-r--r--tests/src/JIT/Regression/JitBlue/GitHub_8220/GitHub_8220.cs170
1 files changed, 170 insertions, 0 deletions
diff --git a/tests/src/JIT/Regression/JitBlue/GitHub_8220/GitHub_8220.cs b/tests/src/JIT/Regression/JitBlue/GitHub_8220/GitHub_8220.cs
new file mode 100644
index 0000000000..f38d5ba698
--- /dev/null
+++ b/tests/src/JIT/Regression/JitBlue/GitHub_8220/GitHub_8220.cs
@@ -0,0 +1,170 @@
+// 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.
+
+// Regression test for Vector3 intrinsics using upper non-zero'd bits from
+// a byref return.
+
+using System;
+using System.Diagnostics;
+using System.Runtime.CompilerServices;
+using System.Numerics;
+
+namespace Test
+{
+
+ public class Program
+ {
+ static Random random;
+
+ static Program()
+ {
+ random = new Random(1);
+ }
+
+ [MethodImpl( MethodImplOptions.NoInlining )]
+ public static double StackScribble()
+ {
+ double d1 = random.NextDouble();
+ double d2 = random.NextDouble();
+ double d3 = random.NextDouble();
+ double d4 = random.NextDouble();
+ double d5 = random.NextDouble();
+ double d6 = random.NextDouble();
+ double d7 = random.NextDouble();
+ double d8 = random.NextDouble();
+ double d9 = random.NextDouble();
+ double d10 = random.NextDouble();
+ double d11 = random.NextDouble();
+ double d12 = random.NextDouble();
+ double d13 = random.NextDouble();
+ double d14 = random.NextDouble();
+ double d15 = random.NextDouble();
+ double d16 = random.NextDouble();
+ double d17 = random.NextDouble();
+ double d18 = random.NextDouble();
+ double d19 = random.NextDouble();
+ double d20 = random.NextDouble();
+ double d21 = random.NextDouble();
+ double d22 = random.NextDouble();
+ double d23 = random.NextDouble();
+ double d24 = random.NextDouble();
+ double d25 = random.NextDouble();
+ double d26 = random.NextDouble();
+ double d27 = random.NextDouble();
+ double d28 = random.NextDouble();
+ double d29 = random.NextDouble();
+ double d30 = random.NextDouble();
+ double d31 = random.NextDouble();
+ double d32 = random.NextDouble();
+ double d33 = random.NextDouble();
+ double d34 = random.NextDouble();
+ double d35 = random.NextDouble();
+ double d36 = random.NextDouble();
+ double d37 = random.NextDouble();
+ double d38 = random.NextDouble();
+ double d39 = random.NextDouble();
+ double d40 = random.NextDouble();
+ return d1 + d2 + d3 + d4 + d5 + d6 + d7 + d8 + d9 + d10 +
+ d11 + d12 + d13 + d14 + d15 + d16 + d17 + d18 + d19 + d20 +
+ d21 + d22 + d23 + d24 + d25 + d26 + d27 + d28 + d29 + d20 +
+ d31 + d32 + d33 + d34 + d35 + d36 + d37 + d38 + d39 + d40;
+ }
+
+ [MethodImpl( MethodImplOptions.NoInlining )]
+ public static Vector3 getTestValue(float f1, float f2, float f3)
+ {
+ return new Vector3(f1, f2, f3);
+ }
+
+ public static bool Check(float value, float expectedValue)
+ {
+ // These may differ in the last place.
+ float expectedValueLow;
+ float expectedValueHigh;
+
+ unsafe
+ {
+ UInt32 expectedValueUInt = *(UInt32*)&expectedValue;
+ UInt32 expectedValueUIntLow = (expectedValueUInt == 0) ? 0 : expectedValueUInt - 1;
+ UInt32 expectedValueUIntHigh = (expectedValueUInt == 0xffffffff) ? 0xffffffff : expectedValueUInt + 1;
+ expectedValueLow = *(float*)&expectedValueUIntLow;
+ expectedValueHigh = *(float*)&expectedValueUIntHigh;
+ }
+ float errorMargin = Math.Abs(expectedValueHigh - expectedValueLow);
+ if (Math.Abs(value - expectedValue) > errorMargin)
+ {
+ return false;
+ }
+ return true;
+ }
+
+ [MethodImpl(MethodImplOptions.NoInlining)]
+ public static int testDotProduct(Vector3 v0)
+ {
+ float f1 = (float)random.NextDouble();
+ float f2 = (float)random.NextDouble();
+ float f3 = (float)random.NextDouble();
+
+ Vector3 v1 = Vector3.Normalize(getTestValue(f1, f2, f3) - v0);
+ Vector3 v2 = new Vector3(f1, f2, f3) - v0;
+ v2 = v2 / v2.Length();
+
+ if (!Check(v1.X, v2.X) || !Check(v1.Y, v2.Y) || !Check(v1.Z, v2.Z))
+ {
+ Console.WriteLine("Vectors do not match " + v1 + v2);
+ return -1;
+ }
+
+ return 100;
+ }
+
+ [MethodImpl(MethodImplOptions.NoInlining)]
+ public static int testEquals(Vector3 v0)
+ {
+ float f1 = (float)random.NextDouble();
+ float f2 = (float)random.NextDouble();
+ float f3 = (float)random.NextDouble();
+
+ Vector3 v1 = new Vector3(f1, f2, f3) - v0;
+ bool result = v1.Equals(getTestValue(f1, f2, f3) - v0);
+
+ if ((result == false) || !v1.Equals(getTestValue(f1, f2, f3) - v0))
+ {
+ Console.WriteLine("Equals returns wrong value " + v1);
+ return -1;
+ }
+
+ return 100;
+ }
+
+ public static int Main()
+ {
+ int returnValue = 100;
+ Console.WriteLine("Testing Dot Product");
+ for (int i = 0; i < 10; i++)
+ {
+ StackScribble();
+ if (testDotProduct(new Vector3(1.0F, 2.0F, 3.0F)) != 100)
+ {
+ Console.WriteLine("Failed on iteration " + i);
+ returnValue = -1;
+ break;
+ }
+ }
+ Console.WriteLine("Testing Equals");
+ for (int i = 0; i < 10; i++)
+ {
+ StackScribble();
+ if (testEquals(new Vector3(1.0F, 2.0F, 3.0F)) != 100)
+ {
+ Console.WriteLine("Failed on iteration " + i);
+ returnValue = -1;
+ break;
+ }
+ }
+ return returnValue;
+ }
+ }
+}
+