# HG changeset patch # User Andreas Woess # Date 1392300255 -3600 # Node ID 5f077aa050c7a63e2c83f25047d049f95b6346f0 # Parent fca29edf5667642efc1d256dbc4c859d5899c57a method substitution for unsafeGetFinal* diff -r fca29edf5667 -r 5f077aa050c7 graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/nodes/typesystem/CustomizedUnsafeLoadFinalNode.java --- 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 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 load(Object object, long offset, boolean condition, Object locationIdentity, @ConstantNodeParameter Kind kind) { + return UnsafeLoadNode.load(object, offset, kind, null); + } } diff -r fca29edf5667 -r 5f077aa050c7 graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/substitutions/CompilerDirectivesSubstitutions.java --- 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); + } }