1 /*
2  * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * This code is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 only, as
7  * published by the Free Software Foundation.
8  *
9  * This code is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12  * version 2 for more details (a copy is included in the LICENSE file that
13  * accompanied this code).
14  *
15  * You should have received a copy of the GNU General Public License version
16  * 2 along with this work; if not, write to the Free Software Foundation,
17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18  *
19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20  * or visit www.oracle.com if you need additional information or have any
21  * questions.
22  *
23  */
24 
25 /**
26  * @test
27  * @bug 8031321
28  * @summary Verify that results of computations are the same w/
29  *          and w/o usage of ANDN instruction
30  * @library /testlibrary /testlibrary/whitebox
31  * @build TestAndnI BMITestRunner Expr
32  * @run main ClassFileInstaller sun.hotspot.WhiteBox
33  * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions
34  *                   -XX:+WhiteBoxAPI TestAndnI
35  */
36 
37 import sun.hotspot.cpuinfo.CPUInfo;
38 
39 public class TestAndnI {
40 
main(String args[])41     public static void main(String args[]) throws Throwable {
42         if (!CPUInfo.hasFeature("bmi1")) {
43             System.out.println("CPU does not support bmi1 feature. "+
44                                "Test skipped.");
45             return;
46         }
47 
48         BMITestRunner.runTests(AndnIExpr.class, args,
49                                "-XX:+UseBMI1Instructions");
50         BMITestRunner.runTests(AndnICommutativeExpr.class, args,
51                                "-XX:+UseBMI1Instructions");
52     }
53 
54     public static class AndnIExpr extends Expr.BMIBinaryIntExpr {
55 
intExpr(int src1, int src2)56         public int intExpr(int src1, int src2) {
57             return ~src1 & src2;
58         }
59 
intExpr(int src1, Expr.MemI src2)60         public int intExpr(int src1, Expr.MemI src2) {
61             if (src2 != null) {
62                 return ~src1 & src2.value;
63             } else {
64                 return 0;
65             }
66         }
67 
intExpr(Expr.MemI src1, int src2)68         public int intExpr(Expr.MemI src1, int src2) {
69             if (src1 != null) {
70                 return ~src1.value & src2;
71             } else {
72                 return 0;
73             }
74         }
75 
intExpr(Expr.MemI src1, Expr.MemI src2)76         public int intExpr(Expr.MemI src1, Expr.MemI src2) {
77             if (src1 != null && src2 != null) {
78                 return ~src1.value & src2.value;
79             } else {
80                 return 0;
81             }
82         }
83     }
84 
85     public static class AndnICommutativeExpr extends Expr.BMIBinaryIntExpr {
86 
intExpr(int src1, int src2)87         public int intExpr(int src1, int src2) {
88             return src1 & ~src2;
89         }
90 
intExpr(int src1, Expr.MemI src2)91         public int intExpr(int src1, Expr.MemI src2) {
92             if (src2 != null) {
93                 return src1 & ~src2.value;
94             } else {
95                 return 0;
96             }
97         }
98 
intExpr(Expr.MemI src1, int src2)99         public int intExpr(Expr.MemI src1, int src2) {
100             if (src1 != null) {
101                 return src1.value & ~src2;
102             } else {
103                 return 0;
104             }
105         }
106 
intExpr(Expr.MemI src1, Expr.MemI src2)107         public int intExpr(Expr.MemI src1, Expr.MemI src2) {
108             if (src1 != null && src2 != null) {
109                 return src1.value & ~src2.value;
110             } else {
111                 return 0;
112             }
113         }
114     }
115 }
116