annotate graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/CompressionNode.java @ 21526:1da7aef31a08

created com.oracle.graal.hotspot.jvmci package and moved classes destined for future JVMCI module into it (JBS:GRAAL-53)
author Doug Simon <doug.simon@oracle.com>
date Tue, 19 May 2015 23:16:07 +0200
parents 8fc336a04d77
children 93c50cefb9e8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
14943
e5a55d280f24 Floating nodes for compressing and uncompressing pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
1 /*
19396
7e2c87dae93e Create static final NodeClass field named TYPE in Node subclasses.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18998
diff changeset
2 * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved.
14943
e5a55d280f24 Floating nodes for compressing and uncompressing pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
e5a55d280f24 Floating nodes for compressing and uncompressing pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
4 *
e5a55d280f24 Floating nodes for compressing and uncompressing pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
e5a55d280f24 Floating nodes for compressing and uncompressing pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
e5a55d280f24 Floating nodes for compressing and uncompressing pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
7 * published by the Free Software Foundation.
e5a55d280f24 Floating nodes for compressing and uncompressing pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
8 *
e5a55d280f24 Floating nodes for compressing and uncompressing pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
e5a55d280f24 Floating nodes for compressing and uncompressing pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
e5a55d280f24 Floating nodes for compressing and uncompressing pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
e5a55d280f24 Floating nodes for compressing and uncompressing pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
e5a55d280f24 Floating nodes for compressing and uncompressing pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
13 * accompanied this code).
e5a55d280f24 Floating nodes for compressing and uncompressing pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
14 *
e5a55d280f24 Floating nodes for compressing and uncompressing pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
e5a55d280f24 Floating nodes for compressing and uncompressing pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
e5a55d280f24 Floating nodes for compressing and uncompressing pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
e5a55d280f24 Floating nodes for compressing and uncompressing pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
18 *
e5a55d280f24 Floating nodes for compressing and uncompressing pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
e5a55d280f24 Floating nodes for compressing and uncompressing pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
e5a55d280f24 Floating nodes for compressing and uncompressing pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
21 * questions.
e5a55d280f24 Floating nodes for compressing and uncompressing pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
22 */
e5a55d280f24 Floating nodes for compressing and uncompressing pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
23 package com.oracle.graal.hotspot.nodes;
e5a55d280f24 Floating nodes for compressing and uncompressing pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
24
e5a55d280f24 Floating nodes for compressing and uncompressing pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
25 import com.oracle.graal.api.meta.*;
15193
96bb07a5d667 Spit up and move GraalInternalError.
Josef Eisl <josef.eisl@jku.at>
parents: 15132
diff changeset
26 import com.oracle.graal.compiler.common.*;
15198
2c0cfbf454b5 Move LIRTypeTool and Stamp to graal.compiler.common.
Josef Eisl <josef.eisl@jku.at>
parents: 15193
diff changeset
27 import com.oracle.graal.compiler.common.type.*;
19396
7e2c87dae93e Create static final NodeClass field named TYPE in Node subclasses.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18998
diff changeset
28 import com.oracle.graal.graph.*;
14943
e5a55d280f24 Floating nodes for compressing and uncompressing pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
29 import com.oracle.graal.graph.spi.*;
e5a55d280f24 Floating nodes for compressing and uncompressing pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
30 import com.oracle.graal.hotspot.*;
21526
1da7aef31a08 created com.oracle.graal.hotspot.jvmci package and moved classes destined for future JVMCI module into it (JBS:GRAAL-53)
Doug Simon <doug.simon@oracle.com>
parents: 19526
diff changeset
31 import com.oracle.graal.hotspot.jvmci.*;
1da7aef31a08 created com.oracle.graal.hotspot.jvmci package and moved classes destined for future JVMCI module into it (JBS:GRAAL-53)
Doug Simon <doug.simon@oracle.com>
parents: 19526
diff changeset
32 import com.oracle.graal.hotspot.jvmci.HotSpotVMConfig.*;
14943
e5a55d280f24 Floating nodes for compressing and uncompressing pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
33 import com.oracle.graal.hotspot.nodes.type.*;
16841
cbd42807a31f moved NodeInfo and friends into separate com.oracle.graal.nodeinfo project so that annotation processor can be applied to the base Node class
Doug Simon <doug.simon@oracle.com>
parents: 16837
diff changeset
34 import com.oracle.graal.nodeinfo.*;
14943
e5a55d280f24 Floating nodes for compressing and uncompressing pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
35 import com.oracle.graal.nodes.*;
e5a55d280f24 Floating nodes for compressing and uncompressing pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
36 import com.oracle.graal.nodes.calc.*;
e5a55d280f24 Floating nodes for compressing and uncompressing pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
37 import com.oracle.graal.nodes.spi.*;
e5a55d280f24 Floating nodes for compressing and uncompressing pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
38 import com.oracle.graal.nodes.type.*;
e5a55d280f24 Floating nodes for compressing and uncompressing pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
39
e5a55d280f24 Floating nodes for compressing and uncompressing pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
40 /**
e5a55d280f24 Floating nodes for compressing and uncompressing pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
41 * Compress or uncompress an oop or metaspace pointer.
e5a55d280f24 Floating nodes for compressing and uncompressing pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
42 */
e5a55d280f24 Floating nodes for compressing and uncompressing pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
43 @NodeInfo(nameTemplate = "{p#op/s}")
18998
ec0733b5a90a Allow final modifier on node subclasses and start adding the modifier to leaf classes.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18845
diff changeset
44 public final class CompressionNode extends UnaryNode implements ConvertNode, LIRLowerable {
14943
e5a55d280f24 Floating nodes for compressing and uncompressing pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
45
19526
8fc336a04d77 Create TYPE fields for LIRInstruction and CompositeValue. Renaming NodeClass#get to NodeClass#create.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 19403
diff changeset
46 public static final NodeClass<CompressionNode> TYPE = NodeClass.create(CompressionNode.class);
19396
7e2c87dae93e Create static final NodeClass field named TYPE in Node subclasses.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18998
diff changeset
47
18178
b9f31ed0643b Unit tests for data patches.
Roland Schatz <roland.schatz@oracle.com>
parents: 18176
diff changeset
48 public enum CompressionOp {
14943
e5a55d280f24 Floating nodes for compressing and uncompressing pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
49 Compress,
e5a55d280f24 Floating nodes for compressing and uncompressing pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
50 Uncompress
e5a55d280f24 Floating nodes for compressing and uncompressing pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
51 }
e5a55d280f24 Floating nodes for compressing and uncompressing pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
52
17328
c9bb0da795d4 Backed out of changeset 17322:655f3e6b467b
Doug Simon <doug.simon@oracle.com>
parents: 17327
diff changeset
53 protected final CompressionOp op;
c9bb0da795d4 Backed out of changeset 17322:655f3e6b467b
Doug Simon <doug.simon@oracle.com>
parents: 17327
diff changeset
54 protected final CompressEncoding encoding;
14943
e5a55d280f24 Floating nodes for compressing and uncompressing pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
55
18845
f57d86eb036f removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents: 18720
diff changeset
56 public CompressionNode(CompressionOp op, ValueNode input, CompressEncoding encoding) {
19396
7e2c87dae93e Create static final NodeClass field named TYPE in Node subclasses.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 18998
diff changeset
57 super(TYPE, mkStamp(op, input.stamp(), encoding), input);
14943
e5a55d280f24 Floating nodes for compressing and uncompressing pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
58 this.op = op;
e5a55d280f24 Floating nodes for compressing and uncompressing pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
59 this.encoding = encoding;
e5a55d280f24 Floating nodes for compressing and uncompressing pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
60 }
e5a55d280f24 Floating nodes for compressing and uncompressing pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
61
16593
ba48a694e4c1 inferStamp for CompressionNode
Lukas Stadler <lukas.stadler@oracle.com>
parents: 16216
diff changeset
62 @Override
ba48a694e4c1 inferStamp for CompressionNode
Lukas Stadler <lukas.stadler@oracle.com>
parents: 16216
diff changeset
63 public boolean inferStamp() {
ba48a694e4c1 inferStamp for CompressionNode
Lukas Stadler <lukas.stadler@oracle.com>
parents: 16216
diff changeset
64 return updateStamp(mkStamp(op, getValue().stamp(), encoding));
ba48a694e4c1 inferStamp for CompressionNode
Lukas Stadler <lukas.stadler@oracle.com>
parents: 16216
diff changeset
65 }
ba48a694e4c1 inferStamp for CompressionNode
Lukas Stadler <lukas.stadler@oracle.com>
parents: 16216
diff changeset
66
14943
e5a55d280f24 Floating nodes for compressing and uncompressing pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
67 public static CompressionNode compress(ValueNode input, CompressEncoding encoding) {
18845
f57d86eb036f removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents: 18720
diff changeset
68 return input.graph().unique(new CompressionNode(CompressionOp.Compress, input, encoding));
14943
e5a55d280f24 Floating nodes for compressing and uncompressing pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
69 }
e5a55d280f24 Floating nodes for compressing and uncompressing pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
70
e5a55d280f24 Floating nodes for compressing and uncompressing pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
71 public static CompressionNode uncompress(ValueNode input, CompressEncoding encoding) {
18845
f57d86eb036f removed Node factory methods
Doug Simon <doug.simon@oracle.com>
parents: 18720
diff changeset
72 return input.graph().unique(new CompressionNode(CompressionOp.Uncompress, input, encoding));
14943
e5a55d280f24 Floating nodes for compressing and uncompressing pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
73 }
e5a55d280f24 Floating nodes for compressing and uncompressing pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
74
18188
8652481a1110 Introduce new Constant interface for use in high-level graph.
Roland Schatz <roland.schatz@oracle.com>
parents: 18187
diff changeset
75 private static Constant compress(Constant c, CompressEncoding encoding) {
18490
ca81508f2a19 Generalize NULL handling to work on arbitrary pointers.
Roland Schatz <roland.schatz@oracle.com>
parents: 18487
diff changeset
76 if (JavaConstant.NULL_POINTER.equals(c)) {
15912
c44f617fb8d7 Optimize compare compressed pattern.
Roland Schatz <roland.schatz@oracle.com>
parents: 15817
diff changeset
77 return HotSpotCompressedNullConstant.COMPRESSED_NULL;
c44f617fb8d7 Optimize compare compressed pattern.
Roland Schatz <roland.schatz@oracle.com>
parents: 15817
diff changeset
78 } else if (c instanceof HotSpotObjectConstant) {
c44f617fb8d7 Optimize compare compressed pattern.
Roland Schatz <roland.schatz@oracle.com>
parents: 15817
diff changeset
79 return ((HotSpotObjectConstant) c).compress();
c44f617fb8d7 Optimize compare compressed pattern.
Roland Schatz <roland.schatz@oracle.com>
parents: 15817
diff changeset
80 } else if (c instanceof HotSpotMetaspaceConstant) {
18266
ae181ec869c5 converted HotSpotMetaspaceConstant to an interface
Doug Simon <doug.simon@oracle.com>
parents: 18188
diff changeset
81 return ((HotSpotMetaspaceConstant) c).compress(encoding);
15912
c44f617fb8d7 Optimize compare compressed pattern.
Roland Schatz <roland.schatz@oracle.com>
parents: 15817
diff changeset
82 } else {
c44f617fb8d7 Optimize compare compressed pattern.
Roland Schatz <roland.schatz@oracle.com>
parents: 15817
diff changeset
83 throw GraalInternalError.shouldNotReachHere("invalid constant input for compress op: " + c);
c44f617fb8d7 Optimize compare compressed pattern.
Roland Schatz <roland.schatz@oracle.com>
parents: 15817
diff changeset
84 }
c44f617fb8d7 Optimize compare compressed pattern.
Roland Schatz <roland.schatz@oracle.com>
parents: 15817
diff changeset
85 }
c44f617fb8d7 Optimize compare compressed pattern.
Roland Schatz <roland.schatz@oracle.com>
parents: 15817
diff changeset
86
18188
8652481a1110 Introduce new Constant interface for use in high-level graph.
Roland Schatz <roland.schatz@oracle.com>
parents: 18187
diff changeset
87 private static Constant uncompress(Constant c, CompressEncoding encoding) {
15912
c44f617fb8d7 Optimize compare compressed pattern.
Roland Schatz <roland.schatz@oracle.com>
parents: 15817
diff changeset
88 if (HotSpotCompressedNullConstant.COMPRESSED_NULL.equals(c)) {
18490
ca81508f2a19 Generalize NULL handling to work on arbitrary pointers.
Roland Schatz <roland.schatz@oracle.com>
parents: 18487
diff changeset
89 return JavaConstant.NULL_POINTER;
15912
c44f617fb8d7 Optimize compare compressed pattern.
Roland Schatz <roland.schatz@oracle.com>
parents: 15817
diff changeset
90 } else if (c instanceof HotSpotObjectConstant) {
c44f617fb8d7 Optimize compare compressed pattern.
Roland Schatz <roland.schatz@oracle.com>
parents: 15817
diff changeset
91 return ((HotSpotObjectConstant) c).uncompress();
c44f617fb8d7 Optimize compare compressed pattern.
Roland Schatz <roland.schatz@oracle.com>
parents: 15817
diff changeset
92 } else if (c instanceof HotSpotMetaspaceConstant) {
18266
ae181ec869c5 converted HotSpotMetaspaceConstant to an interface
Doug Simon <doug.simon@oracle.com>
parents: 18188
diff changeset
93 return ((HotSpotMetaspaceConstant) c).uncompress(encoding);
15912
c44f617fb8d7 Optimize compare compressed pattern.
Roland Schatz <roland.schatz@oracle.com>
parents: 15817
diff changeset
94 } else {
c44f617fb8d7 Optimize compare compressed pattern.
Roland Schatz <roland.schatz@oracle.com>
parents: 15817
diff changeset
95 throw GraalInternalError.shouldNotReachHere("invalid constant input for uncompress op: " + c);
c44f617fb8d7 Optimize compare compressed pattern.
Roland Schatz <roland.schatz@oracle.com>
parents: 15817
diff changeset
96 }
c44f617fb8d7 Optimize compare compressed pattern.
Roland Schatz <roland.schatz@oracle.com>
parents: 15817
diff changeset
97 }
c44f617fb8d7 Optimize compare compressed pattern.
Roland Schatz <roland.schatz@oracle.com>
parents: 15817
diff changeset
98
c44f617fb8d7 Optimize compare compressed pattern.
Roland Schatz <roland.schatz@oracle.com>
parents: 15817
diff changeset
99 @Override
18720
ab9d3ff6829b Pass constant reflection into ConvertNode.convert
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 18490
diff changeset
100 public Constant convert(Constant c, ConstantReflectionProvider constantReflection) {
15912
c44f617fb8d7 Optimize compare compressed pattern.
Roland Schatz <roland.schatz@oracle.com>
parents: 15817
diff changeset
101 switch (op) {
c44f617fb8d7 Optimize compare compressed pattern.
Roland Schatz <roland.schatz@oracle.com>
parents: 15817
diff changeset
102 case Compress:
c44f617fb8d7 Optimize compare compressed pattern.
Roland Schatz <roland.schatz@oracle.com>
parents: 15817
diff changeset
103 return compress(c, encoding);
c44f617fb8d7 Optimize compare compressed pattern.
Roland Schatz <roland.schatz@oracle.com>
parents: 15817
diff changeset
104 case Uncompress:
c44f617fb8d7 Optimize compare compressed pattern.
Roland Schatz <roland.schatz@oracle.com>
parents: 15817
diff changeset
105 return uncompress(c, encoding);
c44f617fb8d7 Optimize compare compressed pattern.
Roland Schatz <roland.schatz@oracle.com>
parents: 15817
diff changeset
106 default:
c44f617fb8d7 Optimize compare compressed pattern.
Roland Schatz <roland.schatz@oracle.com>
parents: 15817
diff changeset
107 throw GraalInternalError.shouldNotReachHere();
c44f617fb8d7 Optimize compare compressed pattern.
Roland Schatz <roland.schatz@oracle.com>
parents: 15817
diff changeset
108 }
c44f617fb8d7 Optimize compare compressed pattern.
Roland Schatz <roland.schatz@oracle.com>
parents: 15817
diff changeset
109 }
c44f617fb8d7 Optimize compare compressed pattern.
Roland Schatz <roland.schatz@oracle.com>
parents: 15817
diff changeset
110
c44f617fb8d7 Optimize compare compressed pattern.
Roland Schatz <roland.schatz@oracle.com>
parents: 15817
diff changeset
111 @Override
18720
ab9d3ff6829b Pass constant reflection into ConvertNode.convert
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 18490
diff changeset
112 public Constant reverse(Constant c, ConstantReflectionProvider constantReflection) {
15912
c44f617fb8d7 Optimize compare compressed pattern.
Roland Schatz <roland.schatz@oracle.com>
parents: 15817
diff changeset
113 switch (op) {
c44f617fb8d7 Optimize compare compressed pattern.
Roland Schatz <roland.schatz@oracle.com>
parents: 15817
diff changeset
114 case Compress:
c44f617fb8d7 Optimize compare compressed pattern.
Roland Schatz <roland.schatz@oracle.com>
parents: 15817
diff changeset
115 return uncompress(c, encoding);
c44f617fb8d7 Optimize compare compressed pattern.
Roland Schatz <roland.schatz@oracle.com>
parents: 15817
diff changeset
116 case Uncompress:
c44f617fb8d7 Optimize compare compressed pattern.
Roland Schatz <roland.schatz@oracle.com>
parents: 15817
diff changeset
117 return compress(c, encoding);
c44f617fb8d7 Optimize compare compressed pattern.
Roland Schatz <roland.schatz@oracle.com>
parents: 15817
diff changeset
118 default:
c44f617fb8d7 Optimize compare compressed pattern.
Roland Schatz <roland.schatz@oracle.com>
parents: 15817
diff changeset
119 throw GraalInternalError.shouldNotReachHere();
c44f617fb8d7 Optimize compare compressed pattern.
Roland Schatz <roland.schatz@oracle.com>
parents: 15817
diff changeset
120 }
c44f617fb8d7 Optimize compare compressed pattern.
Roland Schatz <roland.schatz@oracle.com>
parents: 15817
diff changeset
121 }
c44f617fb8d7 Optimize compare compressed pattern.
Roland Schatz <roland.schatz@oracle.com>
parents: 15817
diff changeset
122
c44f617fb8d7 Optimize compare compressed pattern.
Roland Schatz <roland.schatz@oracle.com>
parents: 15817
diff changeset
123 @Override
c44f617fb8d7 Optimize compare compressed pattern.
Roland Schatz <roland.schatz@oracle.com>
parents: 15817
diff changeset
124 public boolean isLossless() {
c44f617fb8d7 Optimize compare compressed pattern.
Roland Schatz <roland.schatz@oracle.com>
parents: 15817
diff changeset
125 return true;
c44f617fb8d7 Optimize compare compressed pattern.
Roland Schatz <roland.schatz@oracle.com>
parents: 15817
diff changeset
126 }
c44f617fb8d7 Optimize compare compressed pattern.
Roland Schatz <roland.schatz@oracle.com>
parents: 15817
diff changeset
127
14943
e5a55d280f24 Floating nodes for compressing and uncompressing pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
128 private static Stamp mkStamp(CompressionOp op, Stamp input, CompressEncoding encoding) {
e5a55d280f24 Floating nodes for compressing and uncompressing pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
129 switch (op) {
e5a55d280f24 Floating nodes for compressing and uncompressing pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
130 case Compress:
e5a55d280f24 Floating nodes for compressing and uncompressing pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
131 if (input instanceof ObjectStamp) {
e5a55d280f24 Floating nodes for compressing and uncompressing pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
132 // compressed oop
15817
8b24f4684aa0 Introduce AbstractObjectStamp, make ObjectStamp and NarrowOopStamp incompatible.
Roland Schatz <roland.schatz@oracle.com>
parents: 15532
diff changeset
133 return NarrowOopStamp.compressed((ObjectStamp) input, encoding);
18481
f91e40c4bb47 Create separate stamps for Klass* and Method*, and make them hotspot specific.
Roland Schatz <roland.schatz@oracle.com>
parents: 18400
diff changeset
134 } else if (input instanceof KlassPointerStamp) {
f91e40c4bb47 Create separate stamps for Klass* and Method*, and make them hotspot specific.
Roland Schatz <roland.schatz@oracle.com>
parents: 18400
diff changeset
135 // compressed klass pointer
f91e40c4bb47 Create separate stamps for Klass* and Method*, and make them hotspot specific.
Roland Schatz <roland.schatz@oracle.com>
parents: 18400
diff changeset
136 return ((KlassPointerStamp) input).compressed(encoding);
14943
e5a55d280f24 Floating nodes for compressing and uncompressing pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
137 }
e5a55d280f24 Floating nodes for compressing and uncompressing pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
138 break;
e5a55d280f24 Floating nodes for compressing and uncompressing pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
139 case Uncompress:
e5a55d280f24 Floating nodes for compressing and uncompressing pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
140 if (input instanceof NarrowOopStamp) {
e5a55d280f24 Floating nodes for compressing and uncompressing pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
141 // oop
e5a55d280f24 Floating nodes for compressing and uncompressing pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
142 assert encoding.equals(((NarrowOopStamp) input).getEncoding());
e5a55d280f24 Floating nodes for compressing and uncompressing pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
143 return ((NarrowOopStamp) input).uncompressed();
18481
f91e40c4bb47 Create separate stamps for Klass* and Method*, and make them hotspot specific.
Roland Schatz <roland.schatz@oracle.com>
parents: 18400
diff changeset
144 } else if (input instanceof KlassPointerStamp) {
14943
e5a55d280f24 Floating nodes for compressing and uncompressing pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
145 // metaspace pointer
18481
f91e40c4bb47 Create separate stamps for Klass* and Method*, and make them hotspot specific.
Roland Schatz <roland.schatz@oracle.com>
parents: 18400
diff changeset
146 assert encoding.equals(((KlassPointerStamp) input).getEncoding());
f91e40c4bb47 Create separate stamps for Klass* and Method*, and make them hotspot specific.
Roland Schatz <roland.schatz@oracle.com>
parents: 18400
diff changeset
147 return ((KlassPointerStamp) input).uncompressed();
14943
e5a55d280f24 Floating nodes for compressing and uncompressing pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
148 }
e5a55d280f24 Floating nodes for compressing and uncompressing pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
149 break;
e5a55d280f24 Floating nodes for compressing and uncompressing pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
150 }
15531
a71192a503fe Fix stamp of LoweredAtomicReadAndWriteNode.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents: 15370
diff changeset
151 throw GraalInternalError.shouldNotReachHere(String.format("Unexpected input stamp %s", input));
14943
e5a55d280f24 Floating nodes for compressing and uncompressing pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
152 }
e5a55d280f24 Floating nodes for compressing and uncompressing pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
153
15522
589c3627fab8 special cases for addresses involving compressed references
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 15370
diff changeset
154 public CompressEncoding getEncoding() {
589c3627fab8 special cases for addresses involving compressed references
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 15370
diff changeset
155 return encoding;
589c3627fab8 special cases for addresses involving compressed references
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 15370
diff changeset
156 }
589c3627fab8 special cases for addresses involving compressed references
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 15370
diff changeset
157
14943
e5a55d280f24 Floating nodes for compressing and uncompressing pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
158 @Override
16216
388b787a5fe6 implement Canonicalizable.Unary in the UnaryNode hierarchy
Lukas Stadler <lukas.stadler@oracle.com>
parents: 16156
diff changeset
159 public ValueNode canonical(CanonicalizerTool tool, ValueNode forValue) {
388b787a5fe6 implement Canonicalizable.Unary in the UnaryNode hierarchy
Lukas Stadler <lukas.stadler@oracle.com>
parents: 16156
diff changeset
160 if (forValue.isConstant()) {
18720
ab9d3ff6829b Pass constant reflection into ConvertNode.convert
Tom Rodriguez <tom.rodriguez@oracle.com>
parents: 18490
diff changeset
161 return ConstantNode.forConstant(stamp(), convert(forValue.asConstant(), tool.getConstantReflection()), tool.getMetaAccess());
16216
388b787a5fe6 implement Canonicalizable.Unary in the UnaryNode hierarchy
Lukas Stadler <lukas.stadler@oracle.com>
parents: 16156
diff changeset
162 } else if (forValue instanceof CompressionNode) {
388b787a5fe6 implement Canonicalizable.Unary in the UnaryNode hierarchy
Lukas Stadler <lukas.stadler@oracle.com>
parents: 16156
diff changeset
163 CompressionNode other = (CompressionNode) forValue;
14943
e5a55d280f24 Floating nodes for compressing and uncompressing pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
164 if (op != other.op && encoding.equals(other.encoding)) {
16156
0993768dfc8e new UnaryNode base class
Lukas Stadler <lukas.stadler@oracle.com>
parents: 16003
diff changeset
165 return other.getValue();
14943
e5a55d280f24 Floating nodes for compressing and uncompressing pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
166 }
e5a55d280f24 Floating nodes for compressing and uncompressing pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
167 }
e5a55d280f24 Floating nodes for compressing and uncompressing pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
168 return this;
e5a55d280f24 Floating nodes for compressing and uncompressing pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
169 }
e5a55d280f24 Floating nodes for compressing and uncompressing pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
170
e5a55d280f24 Floating nodes for compressing and uncompressing pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
171 @Override
14950
d5a1206e1923 NodeLIRBuilderTool: fix typo in interface name.
Josef Eisl <josef.eisl@jku.at>
parents: 14943
diff changeset
172 public void generate(NodeLIRBuilderTool gen) {
14943
e5a55d280f24 Floating nodes for compressing and uncompressing pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
173 HotSpotLIRGenerator hsGen = (HotSpotLIRGenerator) gen.getLIRGeneratorTool();
15058
895e9ecedfe8 Fix code generation for compressed metaspace pointers.
Roland Schatz <roland.schatz@oracle.com>
parents: 14950
diff changeset
174 boolean nonNull;
16156
0993768dfc8e new UnaryNode base class
Lukas Stadler <lukas.stadler@oracle.com>
parents: 16003
diff changeset
175 if (getValue().stamp() instanceof AbstractObjectStamp) {
18490
ca81508f2a19 Generalize NULL handling to work on arbitrary pointers.
Roland Schatz <roland.schatz@oracle.com>
parents: 18487
diff changeset
176 nonNull = StampTool.isPointerNonNull(getValue().stamp());
15058
895e9ecedfe8 Fix code generation for compressed metaspace pointers.
Roland Schatz <roland.schatz@oracle.com>
parents: 14950
diff changeset
177 } else {
895e9ecedfe8 Fix code generation for compressed metaspace pointers.
Roland Schatz <roland.schatz@oracle.com>
parents: 14950
diff changeset
178 // metaspace pointers are never null
895e9ecedfe8 Fix code generation for compressed metaspace pointers.
Roland Schatz <roland.schatz@oracle.com>
parents: 14950
diff changeset
179 nonNull = true;
895e9ecedfe8 Fix code generation for compressed metaspace pointers.
Roland Schatz <roland.schatz@oracle.com>
parents: 14950
diff changeset
180 }
895e9ecedfe8 Fix code generation for compressed metaspace pointers.
Roland Schatz <roland.schatz@oracle.com>
parents: 14950
diff changeset
181
14943
e5a55d280f24 Floating nodes for compressing and uncompressing pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
182 Value result;
e5a55d280f24 Floating nodes for compressing and uncompressing pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
183 switch (op) {
e5a55d280f24 Floating nodes for compressing and uncompressing pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
184 case Compress:
16156
0993768dfc8e new UnaryNode base class
Lukas Stadler <lukas.stadler@oracle.com>
parents: 16003
diff changeset
185 result = hsGen.emitCompress(gen.operand(getValue()), encoding, nonNull);
14943
e5a55d280f24 Floating nodes for compressing and uncompressing pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
186 break;
e5a55d280f24 Floating nodes for compressing and uncompressing pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
187 case Uncompress:
16156
0993768dfc8e new UnaryNode base class
Lukas Stadler <lukas.stadler@oracle.com>
parents: 16003
diff changeset
188 result = hsGen.emitUncompress(gen.operand(getValue()), encoding, nonNull);
14943
e5a55d280f24 Floating nodes for compressing and uncompressing pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
189 break;
e5a55d280f24 Floating nodes for compressing and uncompressing pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
190 default:
e5a55d280f24 Floating nodes for compressing and uncompressing pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
191 throw GraalInternalError.shouldNotReachHere();
e5a55d280f24 Floating nodes for compressing and uncompressing pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
192 }
e5a55d280f24 Floating nodes for compressing and uncompressing pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
193 gen.setResult(this, result);
e5a55d280f24 Floating nodes for compressing and uncompressing pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
194 }
18178
b9f31ed0643b Unit tests for data patches.
Roland Schatz <roland.schatz@oracle.com>
parents: 18176
diff changeset
195
b9f31ed0643b Unit tests for data patches.
Roland Schatz <roland.schatz@oracle.com>
parents: 18176
diff changeset
196 @NodeIntrinsic
b9f31ed0643b Unit tests for data patches.
Roland Schatz <roland.schatz@oracle.com>
parents: 18176
diff changeset
197 public static native Object compression(@ConstantNodeParameter CompressionOp op, Object object, @ConstantNodeParameter CompressEncoding encoding);
14943
e5a55d280f24 Floating nodes for compressing and uncompressing pointers.
Roland Schatz <roland.schatz@oracle.com>
parents:
diff changeset
198 }