changeset 13957:5f077aa050c7

method substitution for unsafeGetFinal*
author Andreas Woess <andreas.woess@jku.at>
date Thu, 13 Feb 2014 15:04:15 +0100
parents fca29edf5667
children f80a8503cf24
files graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/nodes/typesystem/CustomizedUnsafeLoadFinalNode.java graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/substitutions/CompilerDirectivesSubstitutions.java
diffstat 2 files changed, 50 insertions(+), 31 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/nodes/typesystem/CustomizedUnsafeLoadFinalNode.java	Fri Feb 14 16:45:53 2014 +0100
+++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/nodes/typesystem/CustomizedUnsafeLoadFinalNode.java	Thu Feb 13 15:04:15 2014 +0100
@@ -28,35 +28,29 @@
 import com.oracle.graal.nodes.*;
 import com.oracle.graal.nodes.calc.*;
 import com.oracle.graal.nodes.extended.*;
-import com.oracle.graal.nodes.java.*;
 import com.oracle.graal.nodes.spi.*;
+import com.oracle.graal.nodes.type.*;
 import com.oracle.truffle.api.*;
 
 /**
- * Macro node for method {@link CompilerDirectives#unsafeGetFinalObject} and friends.
+ * Load of a final value from a location specified as an offset relative to an object.
+ * 
+ * Substitution for method {@link CompilerDirectives#unsafeGetFinalObject} and friends.
  */
 public class CustomizedUnsafeLoadFinalNode extends FixedWithNextNode implements Canonicalizable, Virtualizable, Lowerable {
-    private static final int ARGUMENT_COUNT = 4;
-    private static final int OBJECT_ARGUMENT_INDEX = 0;
-    private static final int OFFSET_ARGUMENT_INDEX = 1;
-    private static final int CONDITION_ARGUMENT_INDEX = 2;
-    private static final int LOCATION_ARGUMENT_INDEX = 3;
-
     @Input private ValueNode object;
     @Input private ValueNode offset;
     @Input private ValueNode condition;
     @Input private ValueNode location;
     private final Kind accessKind;
 
-    public CustomizedUnsafeLoadFinalNode(Invoke invoke) {
-        super(invoke.asNode().stamp());
-        NodeInputList<ValueNode> arguments = invoke.callTarget().arguments();
-        assert arguments.size() == ARGUMENT_COUNT;
-        this.object = arguments.get(OBJECT_ARGUMENT_INDEX);
-        this.offset = arguments.get(OFFSET_ARGUMENT_INDEX);
-        this.condition = arguments.get(CONDITION_ARGUMENT_INDEX);
-        this.location = arguments.get(LOCATION_ARGUMENT_INDEX);
-        this.accessKind = ((MethodCallTargetNode) invoke.callTarget()).targetMethod().getSignature().getReturnKind();
+    public CustomizedUnsafeLoadFinalNode(ValueNode object, ValueNode offset, ValueNode condition, ValueNode location, Kind accessKind) {
+        super(StampFactory.forKind(accessKind.getStackKind()));
+        this.object = object;
+        this.offset = offset;
+        this.condition = condition;
+        this.location = location;
+        this.accessKind = accessKind;
     }
 
     @Override
@@ -103,4 +97,10 @@
         graph().replaceFixedWithFixed(this, result);
         result.lower(tool);
     }
+
+    @SuppressWarnings("unused")
+    @NodeIntrinsic
+    public static <T> T load(Object object, long offset, boolean condition, Object locationIdentity, @ConstantNodeParameter Kind kind) {
+        return UnsafeLoadNode.load(object, offset, kind, null);
+    }
 }
--- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/substitutions/CompilerDirectivesSubstitutions.java	Fri Feb 14 16:45:53 2014 +0100
+++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/substitutions/CompilerDirectivesSubstitutions.java	Thu Feb 13 15:04:15 2014 +0100
@@ -126,24 +126,43 @@
     @MacroSubstitution(macro = CustomizedUnsafeStoreMacroNode.class, isStatic = true)
     public static native void unsafePutObject(Object receiver, long offset, Object value, Object locationIdentity);
 
-    @MacroSubstitution(macro = CustomizedUnsafeLoadFinalNode.class, isStatic = true)
-    public static native boolean unsafeGetFinalBoolean(Object receiver, long offset, boolean condition, Object locationIdentity);
+    @MethodSubstitution
+    public static boolean unsafeGetFinalBoolean(Object receiver, long offset, boolean condition, Object locationIdentity) {
+        return CustomizedUnsafeLoadFinalNode.load(receiver, offset, condition, locationIdentity, Kind.Boolean);
+    }
+
+    @MethodSubstitution
+    public static byte unsafeGetFinalByte(Object receiver, long offset, boolean condition, Object locationIdentity) {
+        return CustomizedUnsafeLoadFinalNode.load(receiver, offset, condition, locationIdentity, Kind.Byte);
+    }
 
-    @MacroSubstitution(macro = CustomizedUnsafeLoadFinalNode.class, isStatic = true)
-    public static native byte unsafeGetFinalByte(Object receiver, long offset, boolean condition, Object locationIdentity);
+    @MethodSubstitution
+    public static short unsafeGetFinalShort(Object receiver, long offset, boolean condition, Object locationIdentity) {
+        return CustomizedUnsafeLoadFinalNode.load(receiver, offset, condition, locationIdentity, Kind.Short);
+    }
 
-    @MacroSubstitution(macro = CustomizedUnsafeLoadFinalNode.class, isStatic = true)
-    public static native short unsafeGetFinalShort(Object receiver, long offset, boolean condition, Object locationIdentity);
+    @MethodSubstitution
+    public static int unsafeGetFinalInt(Object receiver, long offset, boolean condition, Object locationIdentity) {
+        return CustomizedUnsafeLoadFinalNode.load(receiver, offset, condition, locationIdentity, Kind.Int);
+    }
 
-    @MacroSubstitution(macro = CustomizedUnsafeLoadFinalNode.class, isStatic = true)
-    public static native int unsafeGetFinalInt(Object receiver, long offset, boolean condition, Object locationIdentity);
+    @MethodSubstitution
+    public static long unsafeGetFinalLong(Object receiver, long offset, boolean condition, Object locationIdentity) {
+        return CustomizedUnsafeLoadFinalNode.load(receiver, offset, condition, locationIdentity, Kind.Long);
+    }
 
-    @MacroSubstitution(macro = CustomizedUnsafeLoadFinalNode.class, isStatic = true)
-    public static native float unsafeGetFinalFloat(Object receiver, long offset, boolean condition, Object locationIdentity);
+    @MethodSubstitution
+    public static float unsafeGetFinalFloat(Object receiver, long offset, boolean condition, Object locationIdentity) {
+        return CustomizedUnsafeLoadFinalNode.load(receiver, offset, condition, locationIdentity, Kind.Float);
+    }
 
-    @MacroSubstitution(macro = CustomizedUnsafeLoadFinalNode.class, isStatic = true)
-    public static native double unsafeGetFinalDouble(Object receiver, long offset, boolean condition, Object locationIdentity);
+    @MethodSubstitution
+    public static double unsafeGetFinalDouble(Object receiver, long offset, boolean condition, Object locationIdentity) {
+        return CustomizedUnsafeLoadFinalNode.load(receiver, offset, condition, locationIdentity, Kind.Double);
+    }
 
-    @MacroSubstitution(macro = CustomizedUnsafeLoadFinalNode.class, isStatic = true)
-    public static native Object unsafeGetFinalObject(Object receiver, long offset, boolean condition, Object locationIdentity);
+    @MethodSubstitution
+    public static Object unsafeGetFinalObject(Object receiver, long offset, boolean condition, Object locationIdentity) {
+        return CustomizedUnsafeLoadFinalNode.load(receiver, offset, condition, locationIdentity, Kind.Object);
+    }
 }