comparison test/compiler/6823354/Test6823354.java @ 775:93c14e5562c4

6823354: Add intrinsics for {Integer,Long}.{numberOfLeadingZeros,numberOfTrailingZeros}() Summary: These methods can be instrinsified by using bit scan, bit test, and population count instructions. Reviewed-by: kvn, never
author twisti
date Wed, 06 May 2009 00:27:52 -0700
parents
children c18cbe5936b8
comparison
equal deleted inserted replaced
755:36ee9b69616e 775:93c14e5562c4
1 /*
2 * Copyright 2009 Sun Microsystems, Inc. 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
20 * CA 95054 USA or visit www.sun.com if you need additional information or
21 * have any questions.
22 */
23
24 /**
25 * @test
26 * @bug 6823354
27 * @summary These methods can be instrinsified by using bit scan, bit test, and population count instructions.
28 *
29 * @run main/othervm -Xcomp -XX:CompileOnly=Test6823354.lzcomp,Test6823354.tzcomp,.dolzcomp,.dotzcomp Test6823354
30 */
31
32 import java.net.URLClassLoader;
33
34 public class Test6823354 {
35 // Arrays of corner case values.
36 static final int[] ia = new int[] { 0, 1, -1, Integer.MIN_VALUE, Integer.MAX_VALUE };
37 static final long[] la = new long[] { 0L, 1L, -1L, Long.MIN_VALUE, Long.MAX_VALUE };
38
39 public static void main(String[] args) throws Exception {
40 // Load the classes and the methods.
41 Integer.numberOfLeadingZeros(0);
42 Integer.numberOfTrailingZeros(0);
43 Long.numberOfLeadingZeros(0);
44 Long.numberOfTrailingZeros(0);
45
46 lz();
47 tz();
48 }
49
50 static void lz() throws Exception {
51 // int
52
53 // Test corner cases.
54 for (int i = 0; i < ia.length; i++) {
55 int x = ia[i];
56 check(x, lzcomp(x), lzint(x));
57 }
58
59 // Test all possible return values.
60 for (int i = 0; i < Integer.SIZE; i++) {
61 int x = 1 << i;
62 check(x, lzcomp(x), lzint(x));
63 }
64
65 String classname = "Test6823354$lzconI";
66
67 // Test Ideal optimizations (constant values).
68 for (int i = 0; i < ia.length; i++) {
69 testclass(classname, ia[i]);
70 }
71
72 // Test Ideal optimizations (constant values).
73 for (int i = 0; i < Integer.SIZE; i++) {
74 int x = 1 << i;
75 testclass(classname, x);
76 }
77
78
79 // long
80
81 // Test corner cases.
82 for (int i = 0; i < ia.length; i++) {
83 long x = la[i];
84 check(x, lzcomp(x), lzint(x));
85 }
86
87 // Test all possible return values.
88 for (int i = 0; i < Long.SIZE; i++) {
89 long x = 1L << i;
90 check(x, lzcomp(x), lzint(x));
91 }
92
93 classname = "Test6823354$lzconL";
94
95 // Test Ideal optimizations (constant values).
96 for (int i = 0; i < la.length; i++) {
97 testclass(classname, la[i]);
98 }
99
100 // Test Ideal optimizations (constant values).
101 for (int i = 0; i < Long.SIZE; i++) {
102 long x = 1L << i;
103 testclass(classname, x);
104 }
105 }
106
107 static void tz() throws Exception {
108 // int
109
110 // Test corner cases.
111 for (int i = 0; i < ia.length; i++) {
112 int x = ia[i];
113 check(x, tzcomp(x), tzint(x));
114 }
115
116 // Test all possible return values.
117 for (int i = 0; i < Integer.SIZE; i++) {
118 int x = 1 << i;
119 check(x, tzcomp(x), tzint(x));
120 }
121
122 String classname = "Test6823354$tzconI";
123
124 // Test Ideal optimizations (constant values).
125 for (int i = 0; i < ia.length; i++) {
126 testclass(classname, ia[i]);
127 }
128
129 // Test Ideal optimizations (constant values).
130 for (int i = 0; i < Integer.SIZE; i++) {
131 int x = 1 << i;
132 testclass(classname, x);
133 }
134
135
136 // long
137
138 // Test corner cases.
139 for (int i = 0; i < la.length; i++) {
140 long x = la[i];
141 check(x, tzcomp(x), tzint(x));
142 }
143
144 // Test all possible return values.
145 for (int i = 0; i < Long.SIZE; i++) {
146 long x = 1L << i;
147 check(x, tzcomp(x), tzint(x));
148 }
149
150 classname = "Test6823354$tzconL";
151
152 // Test Ideal optimizations (constant values).
153 for (int i = 0; i < la.length; i++) {
154 testclass(classname, la[i]);
155 }
156
157 // Test Ideal optimizations (constant values).
158 for (int i = 0; i < Long.SIZE; i++) {
159 long x = 1L << i;
160 testclass(classname, x);
161 }
162 }
163
164 static void check(int value, int result, int expected) {
165 //System.out.println(value + ": " + result + ", " + expected);
166 if (result != expected)
167 throw new InternalError(value + " failed: " + result + " != " + expected);
168 }
169
170 static void check(long value, long result, long expected) {
171 //System.out.println(value + ": " + result + ", " + expected);
172 if (result != expected)
173 throw new InternalError(value + " failed: " + result + " != " + expected);
174 }
175
176 static int lzint( int i) { return Integer.numberOfLeadingZeros(i); }
177 static int lzcomp(int i) { return Integer.numberOfLeadingZeros(i); }
178
179 static int lzint( long l) { return Long.numberOfLeadingZeros(l); }
180 static int lzcomp(long l) { return Long.numberOfLeadingZeros(l); }
181
182 static int tzint( int i) { return Integer.numberOfTrailingZeros(i); }
183 static int tzcomp(int i) { return Integer.numberOfTrailingZeros(i); }
184
185 static int tzint( long l) { return Long.numberOfTrailingZeros(l); }
186 static int tzcomp(long l) { return Long.numberOfTrailingZeros(l); }
187
188 static void testclass(String classname, int x) throws Exception {
189 System.setProperty("value", "" + x);
190 loadandrunclass(classname);
191 }
192
193 static void testclass(String classname, long x) throws Exception {
194 System.setProperty("value", "" + x);
195 loadandrunclass(classname);
196 }
197
198 static void loadandrunclass(String classname) throws Exception {
199 Class cl = Class.forName(classname);
200 URLClassLoader apploader = (URLClassLoader) cl.getClassLoader();
201 ClassLoader loader = new URLClassLoader(apploader.getURLs(), apploader.getParent());
202 Class c = loader.loadClass(classname);
203 Runnable r = (Runnable) c.newInstance();
204 r.run();
205 }
206
207 public static class lzconI implements Runnable {
208 static final int VALUE;
209
210 static {
211 int value = 0;
212 try {
213 value = Integer.decode(System.getProperty("value"));
214 } catch (Throwable e) {}
215 VALUE = value;
216 }
217
218 public void run() { check(VALUE, lzint(VALUE), dolzcomp()); }
219 static int dolzcomp() { return lzcomp(VALUE); }
220 }
221
222 public static class lzconL implements Runnable {
223 static final long VALUE;
224
225 static {
226 long value = 0;
227 try {
228 value = Long.decode(System.getProperty("value"));
229 } catch (Throwable e) {}
230 VALUE = value;
231 }
232
233 public void run() { check(VALUE, lzint(VALUE), dolzcomp()); }
234 static int dolzcomp() { return lzcomp(VALUE); }
235 }
236
237 public static class tzconI implements Runnable {
238 static final int VALUE;
239
240 static {
241 int value = 0;
242 try {
243 value = Integer.decode(System.getProperty("value"));
244 } catch (Throwable e) {}
245 VALUE = value;
246 }
247
248 public void run() { check(VALUE, tzint(VALUE), dotzcomp()); }
249 static int dotzcomp() { return tzcomp(VALUE); }
250 }
251
252 public static class tzconL implements Runnable {
253 static final long VALUE;
254
255 static {
256 long value = 0;
257 try {
258 value = Long.decode(System.getProperty("value"));
259 } catch (Throwable e) {}
260 VALUE = value;
261 }
262
263 public void run() { check(VALUE, tzint(VALUE), dotzcomp()); }
264 static int dotzcomp() { return tzcomp(VALUE); }
265 }
266 }