File: TestSignumIntrinsic.java

package info (click to toggle)
openjdk-17 17.0.12%2B7-2~deb11u1
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 761,492 kB
  • sloc: java: 5,260,864; xml: 1,291,612; cpp: 1,195,623; ansic: 417,064; asm: 404,978; objc: 20,747; sh: 15,482; javascript: 10,900; python: 6,402; makefile: 2,378; perl: 357; awk: 351; sed: 172; jsp: 24; csh: 3
file content (119 lines) | stat: -rw-r--r-- 4,539 bytes parent folder | download | duplicates (6)
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
/*
 * Copyright (c) 2020, 2021, Oracle and/or its affiliates. All rights reserved.
 * Copyright (c) 2020, BELLSOFT. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */

/*
 * @test
 * @summary Test compiler intrinsics for signum
 * @library /test/lib
 *
 * @run main/othervm
 *      -XX:+IgnoreUnrecognizedVMOptions -XX:+UnlockDiagnosticVMOptions
 *      -XX:+UseSignumIntrinsic
 *      compiler.intrinsics.math.TestSignumIntrinsic
 * @run main/othervm
 *      -XX:+IgnoreUnrecognizedVMOptions -XX:+UnlockDiagnosticVMOptions
 *      -XX:-UseSignumIntrinsic -XX:+UseCopySignIntrinsic
 *      compiler.intrinsics.math.TestSignumIntrinsic
 */

package compiler.intrinsics.math;

import jdk.test.lib.Asserts;

public class TestSignumIntrinsic {

    private static final float[][] float_cases = {
        {123.4f,                       1.0f},
        {-56.7f,                      -1.0f},
        {7e30f,                        1.0f},
        {-0.3e30f,                    -1.0f},
        {Float.MAX_VALUE,              1.0f},
        {-Float.MAX_VALUE,            -1.0f},
        {Float.MIN_VALUE,              1.0f},
        {-Float.MIN_VALUE,            -1.0f},
        {0.0f,                         0.0f},
        {-0.0f,                       -0.0f},
        {Float.POSITIVE_INFINITY,      1.0f},
        {Float.NEGATIVE_INFINITY,     -1.0f},
        {Float.NaN,               Float.NaN},
        {Float.MIN_NORMAL,             1.0f},
        {-Float.MIN_NORMAL,           -1.0f},
        {0x0.0002P-126f,               1.0f},
        {-0x0.0002P-126f,             -1.0f}
    };

    private static final double[][] double_cases = {
        {123.4d,                         1.0d},
        {-56.7d,                        -1.0d},
        {7e30d,                          1.0d},
        {-0.3e30d,                      -1.0d},
        {Double.MAX_VALUE,               1.0d},
        {-Double.MAX_VALUE,             -1.0d},
        {Double.MIN_VALUE,               1.0d},
        {-Double.MIN_VALUE,             -1.0d},
        {0.0d,                           0.0d},
        {-0.0d,                         -0.0d},
        {Double.POSITIVE_INFINITY,       1.0d},
        {Double.NEGATIVE_INFINITY,      -1.0d},
        {Double.NaN,               Double.NaN},
        {Double.MIN_NORMAL,              1.0d},
        {-Double.MIN_NORMAL,            -1.0d},
        {0x0.00000001P-1022,             1.0d},
        {-0x0.00000001P-1022,           -1.0d}
    };

    public static void main(String[] args) throws Exception {
        float fAccum = 0.0f;
        double dAccum = 0.0d;
        for (int i = 0; i < 100_000; i++) {
            fAccum += floatTest();
            dAccum += doubleTest();
        }
        System.out.println("SUCCESS. Accum values: " + fAccum + " and " + dAccum);
    }

    private static float floatTest() {
        float accum = 0.0f;
        for (float[] fcase : float_cases) {
            float arg = fcase[0];
            float expected = fcase[1];
            float calculated = Math.signum(arg);
            Asserts.assertEQ(expected, calculated, "Unexpected float result from " + arg);
            accum += calculated;
        }
        return accum;
    }

    private static double doubleTest() {
        double accum = 0.0d;
        for (double[] dcase : double_cases) {
            double arg = dcase[0];
            double expected = dcase[1];
            double calculated = Math.signum(arg);
            Asserts.assertEQ(expected, calculated, "Unexpected double result from " + arg);
            accum += calculated;
        }
        return accum;
    }
}