summaryrefslogtreecommitdiff
path: root/tests/src/JIT/Regression/JitBlue/GitHub_8220/GitHub_8220.cs
blob: f38d5ba6980be23d91713acc66f233956b486c93 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
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;
        }
    }
}