annotate graal/com.oracle.graal.replacements.test/src/com/oracle/graal/replacements/test/BitOpNodesTest.java @ 21556:48c1ebd24120

renamed com.oracle.graal.api[meta|code] modules to com.oracle.jvmci.[meta|code] (JBS:GRAAL-53)
author Doug Simon <doug.simon@oracle.com>
date Wed, 27 May 2015 00:36:16 +0200
parents cc3131ff7ce2
children 0e095e2c24e2
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
16163
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
1 /*
18187
9619ba4daf4c Rename Constant to JavaConstant.
Roland Schatz <roland.schatz@oracle.com>
parents: 16714
diff changeset
2 * Copyright (c) 2012, 2014, Oracle and/or its affiliates. All rights reserved.
16163
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
4 *
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
7 * published by the Free Software Foundation.
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
8 *
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
13 * accompanied this code).
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
14 *
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
18 *
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
21 * questions.
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
22 */
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
23 package com.oracle.graal.replacements.test;
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
24
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
25 import org.junit.*;
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
26
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
27 import com.oracle.graal.compiler.common.type.*;
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
28 import com.oracle.graal.compiler.test.*;
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
29 import com.oracle.graal.nodes.*;
19306
a0a760b0fb5f pulled method evolution dependencies out of Assumptions and directly into StructuredGraph
Doug Simon <doug.simon@oracle.com>
parents: 19250
diff changeset
30 import com.oracle.graal.nodes.StructuredGraph.AllowAssumptions;
16163
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
31 import com.oracle.graal.phases.common.*;
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
32 import com.oracle.graal.phases.common.inlining.*;
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
33 import com.oracle.graal.phases.tiers.*;
16591
86eee6794713 BitScanReverseNode stamp tests should only be used with BitScanReverseNode
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16163
diff changeset
34 import com.oracle.graal.replacements.nodes.*;
21556
48c1ebd24120 renamed com.oracle.graal.api[meta|code] modules to com.oracle.jvmci.[meta|code] (JBS:GRAAL-53)
Doug Simon <doug.simon@oracle.com>
parents: 20068
diff changeset
35 import com.oracle.jvmci.meta.*;
16163
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
36
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
37 public class BitOpNodesTest extends GraalCompilerTest {
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
38
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
39 private static final int INT_CONSTANT_1 = 0x80100010;
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
40 private static final int INT_CONSTANT_2 = 0x00011110;
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
41 private static final int INT_CONSTANT_3 = 0x00000000;
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
42
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
43 private static final long LONG_CONSTANT_1 = 0x8000000000100010L;
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
44 private static final long LONG_CONSTANT_2 = 0x0000000000011110L;
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
45 private static final long LONG_CONSTANT_3 = 0x0000000000000000L;
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
46
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
47 public static long dummyField;
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
48
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
49 /*
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
50 * Tests for BitCountNode canonicalizations.
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
51 */
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
52
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
53 public static int bitCountIntConstantSnippet() {
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
54 return Integer.bitCount(INT_CONSTANT_1) + Integer.bitCount(INT_CONSTANT_2) + Integer.bitCount(INT_CONSTANT_3);
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
55 }
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
56
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
57 @Test
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
58 public void testBitCountIntConstant() {
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
59 ValueNode result = parseAndInline("bitCountIntConstantSnippet");
18187
9619ba4daf4c Rename Constant to JavaConstant.
Roland Schatz <roland.schatz@oracle.com>
parents: 16714
diff changeset
60 Assert.assertEquals(7, result.asJavaConstant().asInt());
16163
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
61 }
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
62
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
63 public static int bitCountLongConstantSnippet() {
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
64 return Long.bitCount(LONG_CONSTANT_1) + Long.bitCount(LONG_CONSTANT_2) + Long.bitCount(LONG_CONSTANT_3);
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
65 }
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
66
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
67 public static int bitCountIntSnippet(int v) {
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
68 return Integer.bitCount(v & 0xFFFFFF | 0xFF);
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
69 }
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
70
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
71 @Test
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
72 public void testBitCountInt() {
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
73 ValueNode result = parseAndInline("bitCountIntSnippet");
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
74 Assert.assertEquals(StampFactory.forInteger(Kind.Int, 8, 24), result.stamp());
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
75 }
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
76
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
77 public static int bitCountIntEmptySnippet(int v) {
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
78 return Integer.bitCount(v & 0xFFFFFF);
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
79 }
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
80
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
81 @Test
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
82 public void testBitCountIntEmpty() {
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
83 ValueNode result = parseAndInline("bitCountIntEmptySnippet");
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
84 Assert.assertEquals(StampFactory.forInteger(Kind.Int, 0, 24), result.stamp());
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
85 }
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
86
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
87 @Test
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
88 public void testBitCountLongConstant() {
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
89 ValueNode result = parseAndInline("bitCountLongConstantSnippet");
18187
9619ba4daf4c Rename Constant to JavaConstant.
Roland Schatz <roland.schatz@oracle.com>
parents: 16714
diff changeset
90 Assert.assertEquals(7, result.asJavaConstant().asInt());
16163
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
91 }
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
92
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
93 public static int bitCountLongSnippet(long v) {
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
94 return Long.bitCount(v & 0xFFFFFFFFFFL | 0xFFL);
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
95 }
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
96
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
97 @Test
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
98 public void testBitCountLong() {
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
99 ValueNode result = parseAndInline("bitCountLongSnippet");
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
100 Assert.assertEquals(StampFactory.forInteger(Kind.Int, 8, 40), result.stamp());
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
101 }
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
102
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
103 public static int bitCountLongEmptySnippet(long v) {
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
104 return Long.bitCount(v & 0xFFFFFFFFFFL);
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
105 }
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
106
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
107 @Test
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
108 public void testBitCountLongEmpty() {
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
109 ValueNode result = parseAndInline("bitCountLongEmptySnippet");
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
110 Assert.assertEquals(StampFactory.forInteger(Kind.Int, 0, 40), result.stamp());
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
111 }
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
112
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
113 /*
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
114 * Tests for BitScanForwardNode
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
115 */
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
116
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
117 public static int scanForwardIntConstantSnippet() {
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
118 return Integer.numberOfTrailingZeros(INT_CONSTANT_1) + Integer.numberOfTrailingZeros(INT_CONSTANT_2) + Integer.numberOfTrailingZeros(INT_CONSTANT_3);
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
119 }
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
120
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
121 @Test
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
122 public void testScanForwardIntConstant() {
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
123 ValueNode result = parseAndInline("scanForwardIntConstantSnippet");
18187
9619ba4daf4c Rename Constant to JavaConstant.
Roland Schatz <roland.schatz@oracle.com>
parents: 16714
diff changeset
124 Assert.assertEquals(40, result.asJavaConstant().asInt());
16163
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
125 }
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
126
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
127 public static int scanForwardIntSnippet(int v) {
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
128 return Integer.numberOfTrailingZeros(v & 0xFFF0 | 0xFF00);
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
129 }
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
130
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
131 @Test
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
132 public void testScanForwardInt() {
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
133 ValueNode result = parseAndInline("scanForwardIntSnippet");
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
134 Assert.assertEquals(StampFactory.forInteger(Kind.Int, 4, 8), result.stamp());
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
135 }
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
136
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
137 public static int scanForwardLongConstantSnippet() {
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
138 return Long.numberOfTrailingZeros(LONG_CONSTANT_1) + Long.numberOfTrailingZeros(LONG_CONSTANT_2) + Long.numberOfTrailingZeros(LONG_CONSTANT_3);
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
139 }
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
140
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
141 @Test
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
142 public void testScanForwardLongConstant() {
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
143 ValueNode result = parseAndInline("scanForwardLongConstantSnippet");
18187
9619ba4daf4c Rename Constant to JavaConstant.
Roland Schatz <roland.schatz@oracle.com>
parents: 16714
diff changeset
144 Assert.assertEquals(72, result.asJavaConstant().asInt());
16163
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
145 }
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
146
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
147 public static int scanForwardLongSnippet(long v) {
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
148 return Long.numberOfTrailingZeros(v & 0xFFFF000000L | 0xFF00000000L);
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
149 }
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
150
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
151 @Test
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
152 public void testScanForwardLong() {
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
153 ValueNode result = parseAndInline("scanForwardLongSnippet");
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
154 Assert.assertEquals(StampFactory.forInteger(Kind.Int, 24, 32), result.stamp());
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
155 }
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
156
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
157 public static int scanForwardLongEmptySnippet(long v) {
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
158 int result = Long.numberOfTrailingZeros(v & 0xFFFF000000L);
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
159 dummyField = result;
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
160 return result;
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
161 }
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
162
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
163 @Test
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
164 public void testScanForwardLongEmpty() {
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
165 ValueNode result = parseAndInline("scanForwardLongEmptySnippet");
18415
6dc4f0be9a70 Add support of lzcnt and tzcnt
Gilles Duboscq <duboscq@ssw.jku.at>
parents: 18187
diff changeset
166 Assert.assertEquals(StampFactory.forInteger(Kind.Int, 24, 64), result.stamp());
16163
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
167 }
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
168
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
169 /*
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
170 * Tests for BitScanReverseNode
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
171 */
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
172
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
173 public static int scanReverseIntConstantSnippet() {
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
174 return Integer.numberOfLeadingZeros(INT_CONSTANT_1) + Integer.numberOfLeadingZeros(INT_CONSTANT_2) + Integer.numberOfLeadingZeros(INT_CONSTANT_3);
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
175 }
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
176
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
177 @Test
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
178 public void testScanReverseIntConstant() {
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
179 ValueNode result = parseAndInline("scanReverseIntConstantSnippet");
18187
9619ba4daf4c Rename Constant to JavaConstant.
Roland Schatz <roland.schatz@oracle.com>
parents: 16714
diff changeset
180 Assert.assertEquals(47, result.asJavaConstant().asInt());
16163
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
181 }
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
182
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
183 public static int scanReverseIntSnippet(int v) {
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
184 return Integer.numberOfLeadingZeros(v & 0xFFF0 | 0xFF0);
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
185 }
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
186
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
187 @Test
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
188 public void testScanReverseInt() {
16618
0b0726730fbd add some comments to BitOpNodesTest.java
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16591
diff changeset
189 /* This test isn't valid unless the BitScanReverseNode intrinsic is used. */
16591
86eee6794713 BitScanReverseNode stamp tests should only be used with BitScanReverseNode
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16163
diff changeset
190 ValueNode result = parseAndInline("scanReverseIntSnippet", BitScanReverseNode.class);
86eee6794713 BitScanReverseNode stamp tests should only be used with BitScanReverseNode
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16163
diff changeset
191 if (result != null) {
86eee6794713 BitScanReverseNode stamp tests should only be used with BitScanReverseNode
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16163
diff changeset
192 Assert.assertEquals(StampFactory.forInteger(Kind.Int, 16, 20), result.stamp());
86eee6794713 BitScanReverseNode stamp tests should only be used with BitScanReverseNode
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16163
diff changeset
193 }
16163
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
194 }
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
195
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
196 public static int scanReverseLongConstantSnippet() {
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
197 return Long.numberOfLeadingZeros(LONG_CONSTANT_1) + Long.numberOfLeadingZeros(LONG_CONSTANT_2) + Long.numberOfLeadingZeros(LONG_CONSTANT_3);
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
198 }
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
199
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
200 @Test
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
201 public void testScanReverseLongConstant() {
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
202 ValueNode result = parseAndInline("scanReverseLongConstantSnippet");
18187
9619ba4daf4c Rename Constant to JavaConstant.
Roland Schatz <roland.schatz@oracle.com>
parents: 16714
diff changeset
203 Assert.assertEquals(111, result.asJavaConstant().asInt());
16163
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
204 }
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
205
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
206 public static int scanReverseLongSnippet(long v) {
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
207 int result = Long.numberOfLeadingZeros(v & 0xFFF0);
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
208 dummyField = result;
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
209 return result;
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
210 }
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
211
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
212 @Test
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
213 public void testScanReverseLong() {
16618
0b0726730fbd add some comments to BitOpNodesTest.java
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16591
diff changeset
214 /* This test isn't valid unless the BitScanReverseNode intrinsic is used. */
16591
86eee6794713 BitScanReverseNode stamp tests should only be used with BitScanReverseNode
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16163
diff changeset
215 ValueNode result = parseAndInline("scanReverseLongSnippet", BitScanReverseNode.class);
86eee6794713 BitScanReverseNode stamp tests should only be used with BitScanReverseNode
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16163
diff changeset
216 if (result != null) {
86eee6794713 BitScanReverseNode stamp tests should only be used with BitScanReverseNode
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16163
diff changeset
217 Assert.assertEquals(StampFactory.forInteger(Kind.Int, 48, 64), result.stamp());
86eee6794713 BitScanReverseNode stamp tests should only be used with BitScanReverseNode
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16163
diff changeset
218 }
16163
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
219 }
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
220
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
221 public static int scanReverseLongEmptySnippet(long v) {
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
222 int result = Long.numberOfLeadingZeros(v & 0xFFFF000000L);
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
223 dummyField = result;
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
224 return result;
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
225 }
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
226
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
227 @Test
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
228 public void testScanReverseLongEmpty() {
16618
0b0726730fbd add some comments to BitOpNodesTest.java
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16591
diff changeset
229 /* This test isn't valid unless the BitScanReverseNode intrinsic is used. */
16591
86eee6794713 BitScanReverseNode stamp tests should only be used with BitScanReverseNode
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16163
diff changeset
230 ValueNode result = parseAndInline("scanReverseLongEmptySnippet", BitScanReverseNode.class);
86eee6794713 BitScanReverseNode stamp tests should only be used with BitScanReverseNode
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16163
diff changeset
231 if (result != null) {
86eee6794713 BitScanReverseNode stamp tests should only be used with BitScanReverseNode
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16163
diff changeset
232 Assert.assertEquals(StampFactory.forInteger(Kind.Int, 24, 64), result.stamp());
86eee6794713 BitScanReverseNode stamp tests should only be used with BitScanReverseNode
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16163
diff changeset
233 }
16163
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
234 }
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
235
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
236 private ValueNode parseAndInline(String name) {
16591
86eee6794713 BitScanReverseNode stamp tests should only be used with BitScanReverseNode
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16163
diff changeset
237 return parseAndInline(name, null);
86eee6794713 BitScanReverseNode stamp tests should only be used with BitScanReverseNode
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16163
diff changeset
238 }
86eee6794713 BitScanReverseNode stamp tests should only be used with BitScanReverseNode
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16163
diff changeset
239
16618
0b0726730fbd add some comments to BitOpNodesTest.java
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16591
diff changeset
240 /**
0b0726730fbd add some comments to BitOpNodesTest.java
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16591
diff changeset
241 * Parse and optimize {@code name}. If {@code expectedClass} is non-null and a node of that type
0b0726730fbd add some comments to BitOpNodesTest.java
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16591
diff changeset
242 * isn't found simply return null. Otherwise return the node returned by the graph.
0b0726730fbd add some comments to BitOpNodesTest.java
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16591
diff changeset
243 *
0b0726730fbd add some comments to BitOpNodesTest.java
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16591
diff changeset
244 * @param name
0b0726730fbd add some comments to BitOpNodesTest.java
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16591
diff changeset
245 * @param expectedClass
0b0726730fbd add some comments to BitOpNodesTest.java
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16591
diff changeset
246 * @return the returned value or null if {@code expectedClass} is not found in the graph.
0b0726730fbd add some comments to BitOpNodesTest.java
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16591
diff changeset
247 */
0b0726730fbd add some comments to BitOpNodesTest.java
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16591
diff changeset
248 private ValueNode parseAndInline(String name, Class<? extends ValueNode> expectedClass) {
19306
a0a760b0fb5f pulled method evolution dependencies out of Assumptions and directly into StructuredGraph
Doug Simon <doug.simon@oracle.com>
parents: 19250
diff changeset
249 StructuredGraph graph = parseEager(name, AllowAssumptions.YES);
20068
cc3131ff7ce2 Remove GraphCache option.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 19716
diff changeset
250 HighTierContext context = getDefaultHighTierContext();
19716
2fd45bb25118 Initial version of new dominator-based conditional elimination phase.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 19410
diff changeset
251 CanonicalizerPhase canonicalizer = new CanonicalizerPhase();
16163
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
252 canonicalizer.apply(graph, context);
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
253 new InliningPhase(canonicalizer).apply(graph, context);
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
254 canonicalizer.apply(graph, context);
19410
61d3cb8e1280 Add generic parameter to NodeClass. Change Graph#getNodes(Class) to Graph#getNodes(NodeClass).
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 19306
diff changeset
255 Assert.assertEquals(1, graph.getNodes(ReturnNode.TYPE).count());
16618
0b0726730fbd add some comments to BitOpNodesTest.java
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16591
diff changeset
256 if (expectedClass != null) {
0b0726730fbd add some comments to BitOpNodesTest.java
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16591
diff changeset
257 if (graph.getNodes().filter(expectedClass).count() == 0) {
16591
86eee6794713 BitScanReverseNode stamp tests should only be used with BitScanReverseNode
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16163
diff changeset
258 return null;
86eee6794713 BitScanReverseNode stamp tests should only be used with BitScanReverseNode
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16163
diff changeset
259 }
86eee6794713 BitScanReverseNode stamp tests should only be used with BitScanReverseNode
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 16163
diff changeset
260 }
19410
61d3cb8e1280 Add generic parameter to NodeClass. Change Graph#getNodes(Class) to Graph#getNodes(NodeClass).
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 19306
diff changeset
261 return graph.getNodes(ReturnNode.TYPE).first().result();
16163
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
262 }
d5e66f2adf8f tests for bit operations
Lukas Stadler <lukas.stadler@oracle.com>
parents:
diff changeset
263 }