23 package org.graalvm.compiler.hotspot.meta;
24
25 import static org.graalvm.compiler.core.common.LocationIdentity.any;
26 import static org.graalvm.compiler.hotspot.word.HotSpotOperation.HotspotOpcode.POINTER_EQ;
27 import static org.graalvm.compiler.hotspot.word.HotSpotOperation.HotspotOpcode.POINTER_NE;
28 import static org.graalvm.compiler.nodes.ConstantNode.forBoolean;
29
30 import org.graalvm.compiler.api.replacements.SnippetReflectionProvider;
31 import org.graalvm.compiler.bytecode.BridgeMethodUtils;
32 import org.graalvm.compiler.core.common.LocationIdentity;
33 import org.graalvm.compiler.core.common.type.Stamp;
34 import org.graalvm.compiler.core.common.type.StampFactory;
35 import org.graalvm.compiler.debug.GraalError;
36 import org.graalvm.compiler.hotspot.nodes.LoadIndexedPointerNode;
37 import org.graalvm.compiler.hotspot.nodes.type.KlassPointerStamp;
38 import org.graalvm.compiler.hotspot.nodes.type.MetaspacePointerStamp;
39 import org.graalvm.compiler.hotspot.nodes.type.MethodPointerStamp;
40 import org.graalvm.compiler.hotspot.word.HotSpotOperation;
41 import org.graalvm.compiler.hotspot.word.HotSpotOperation.HotspotOpcode;
42 import org.graalvm.compiler.hotspot.word.PointerCastNode;
43 import org.graalvm.compiler.nodes.AbstractBeginNode;
44 import org.graalvm.compiler.nodes.LogicNode;
45 import org.graalvm.compiler.nodes.ValueNode;
46 import org.graalvm.compiler.nodes.calc.ConditionalNode;
47 import org.graalvm.compiler.nodes.calc.IsNullNode;
48 import org.graalvm.compiler.nodes.calc.PointerEqualsNode;
49 import org.graalvm.compiler.nodes.graphbuilderconf.GraphBuilderContext;
50 import org.graalvm.compiler.nodes.java.LoadIndexedNode;
51 import org.graalvm.compiler.nodes.memory.HeapAccess.BarrierType;
52 import org.graalvm.compiler.nodes.memory.ReadNode;
53 import org.graalvm.compiler.nodes.memory.address.AddressNode;
54 import org.graalvm.compiler.nodes.type.StampTool;
55 import org.graalvm.compiler.replacements.WordOperationPlugin;
56 import org.graalvm.compiler.word.WordTypes;
57
58 import jdk.vm.ci.meta.JavaKind;
59 import jdk.vm.ci.meta.ResolvedJavaMethod;
60 import jdk.vm.ci.meta.ResolvedJavaType;
61
62 /**
63 * Extends {@link WordOperationPlugin} to handle {@linkplain HotSpotOperation HotSpot word
132 b.addPush(returnKind, new PointerCastNode(KlassPointerStamp.klass(), args[0]));
133 break;
134
135 case TO_METHOD_POINTER:
136 assert args.length == 1;
137 b.addPush(returnKind, new PointerCastNode(MethodPointerStamp.method(), args[0]));
138 break;
139
140 case READ_KLASS_POINTER:
141 assert args.length == 2 || args.length == 3;
142 Stamp readStamp = KlassPointerStamp.klass();
143 AddressNode address = makeAddress(b, args[0], args[1]);
144 LocationIdentity location;
145 if (args.length == 2) {
146 location = any();
147 } else {
148 assert args[2].isConstant();
149 location = snippetReflection.asObject(LocationIdentity.class, args[2].asJavaConstant());
150 }
151 ReadNode read = b.add(new ReadNode(address, location, readStamp, BarrierType.NONE));
152 /*
153 * The read must not float outside its block otherwise it may float above an
154 * explicit zero check on its base address.
155 */
156 read.setGuard(AbstractBeginNode.prevBegin(read));
157 b.push(returnKind, read);
158 break;
159
160 default:
161 throw GraalError.shouldNotReachHere("unknown operation: " + operation.opcode());
162 }
163 }
164 }
|
23 package org.graalvm.compiler.hotspot.meta;
24
25 import static org.graalvm.compiler.core.common.LocationIdentity.any;
26 import static org.graalvm.compiler.hotspot.word.HotSpotOperation.HotspotOpcode.POINTER_EQ;
27 import static org.graalvm.compiler.hotspot.word.HotSpotOperation.HotspotOpcode.POINTER_NE;
28 import static org.graalvm.compiler.nodes.ConstantNode.forBoolean;
29
30 import org.graalvm.compiler.api.replacements.SnippetReflectionProvider;
31 import org.graalvm.compiler.bytecode.BridgeMethodUtils;
32 import org.graalvm.compiler.core.common.LocationIdentity;
33 import org.graalvm.compiler.core.common.type.Stamp;
34 import org.graalvm.compiler.core.common.type.StampFactory;
35 import org.graalvm.compiler.debug.GraalError;
36 import org.graalvm.compiler.hotspot.nodes.LoadIndexedPointerNode;
37 import org.graalvm.compiler.hotspot.nodes.type.KlassPointerStamp;
38 import org.graalvm.compiler.hotspot.nodes.type.MetaspacePointerStamp;
39 import org.graalvm.compiler.hotspot.nodes.type.MethodPointerStamp;
40 import org.graalvm.compiler.hotspot.word.HotSpotOperation;
41 import org.graalvm.compiler.hotspot.word.HotSpotOperation.HotspotOpcode;
42 import org.graalvm.compiler.hotspot.word.PointerCastNode;
43 import org.graalvm.compiler.nodes.LogicNode;
44 import org.graalvm.compiler.nodes.ValueNode;
45 import org.graalvm.compiler.nodes.calc.ConditionalNode;
46 import org.graalvm.compiler.nodes.calc.IsNullNode;
47 import org.graalvm.compiler.nodes.calc.PointerEqualsNode;
48 import org.graalvm.compiler.nodes.graphbuilderconf.GraphBuilderContext;
49 import org.graalvm.compiler.nodes.java.LoadIndexedNode;
50 import org.graalvm.compiler.nodes.memory.HeapAccess.BarrierType;
51 import org.graalvm.compiler.nodes.memory.ReadNode;
52 import org.graalvm.compiler.nodes.memory.address.AddressNode;
53 import org.graalvm.compiler.nodes.type.StampTool;
54 import org.graalvm.compiler.replacements.WordOperationPlugin;
55 import org.graalvm.compiler.word.WordTypes;
56
57 import jdk.vm.ci.meta.JavaKind;
58 import jdk.vm.ci.meta.ResolvedJavaMethod;
59 import jdk.vm.ci.meta.ResolvedJavaType;
60
61 /**
62 * Extends {@link WordOperationPlugin} to handle {@linkplain HotSpotOperation HotSpot word
131 b.addPush(returnKind, new PointerCastNode(KlassPointerStamp.klass(), args[0]));
132 break;
133
134 case TO_METHOD_POINTER:
135 assert args.length == 1;
136 b.addPush(returnKind, new PointerCastNode(MethodPointerStamp.method(), args[0]));
137 break;
138
139 case READ_KLASS_POINTER:
140 assert args.length == 2 || args.length == 3;
141 Stamp readStamp = KlassPointerStamp.klass();
142 AddressNode address = makeAddress(b, args[0], args[1]);
143 LocationIdentity location;
144 if (args.length == 2) {
145 location = any();
146 } else {
147 assert args[2].isConstant();
148 location = snippetReflection.asObject(LocationIdentity.class, args[2].asJavaConstant());
149 }
150 ReadNode read = b.add(new ReadNode(address, location, readStamp, BarrierType.NONE));
151 b.push(returnKind, read);
152 break;
153
154 default:
155 throw GraalError.shouldNotReachHere("unknown operation: " + operation.opcode());
156 }
157 }
158 }
|