# HG changeset patch # User Christian Wimmer # Date 1348590483 25200 # Node ID 5b419d76b406c0e02ffa377015b554a792c3ed62 # Parent 45f682f7fea857d53c8ac64d359e26ff28e9b7ab Make RuntimeCall more extensible by changing it from an enum to a class diff -r 45f682f7fea8 -r 5b419d76b406 graal/com.oracle.graal.api.code/src/com/oracle/graal/api/code/RuntimeCall.java --- a/graal/com.oracle.graal.api.code/src/com/oracle/graal/api/code/RuntimeCall.java Tue Sep 25 09:23:45 2012 -0700 +++ b/graal/com.oracle.graal.api.code/src/com/oracle/graal/api/code/RuntimeCall.java Tue Sep 25 09:28:03 2012 -0700 @@ -27,43 +27,50 @@ import com.oracle.graal.api.meta.*; /** - * Enumerates the calls that must be provided by the runtime system. The compiler - * may generate code that calls the runtime services for unresolved and slow cases of some - * bytecodes. + * Enumerates the calls that must be provided by the runtime system. The compiler may generate code that calls the + * runtime services for unresolved and slow cases of some bytecodes. */ -public enum RuntimeCall { - UnwindException(Void, Object), - Deoptimize(Void), - RegisterFinalizer(Void, Object), - SetDeoptInfo(Void, Object), - CreateNullPointerException(Object), - CreateOutOfBoundsException(Object, Int), - JavaTimeMillis(Long), - JavaTimeNanos(Long), - Debug(Void), - ArithmeticFrem(Float, Float, Float), - ArithmeticDrem(Double, Double, Double), - ArithmeticCos(Double, Double), - ArithmeticTan(Double, Double), - ArithmeticSin(Double, Double), - GenericCallback(Object, Object, Object), - LogPrimitive(Void, Int, Long, Boolean), - LogObject(Void, Object, Int); +public class RuntimeCall { - public final Kind resultKind; - public final Kind[] arguments; + // TODO Move the singletons to projects where they are actually used. A couple of them + // are HotSpot-specific. + public static final RuntimeCall UnwindException = new RuntimeCall(Void, true, Object); + public static final RuntimeCall Deoptimize = new RuntimeCall(Void, true); + public static final RuntimeCall RegisterFinalizer = new RuntimeCall(Void, true, Object); + public static final RuntimeCall SetDeoptInfo = new RuntimeCall(Void, true, Object); + public static final RuntimeCall CreateNullPointerException = new RuntimeCall(Object, true); + public static final RuntimeCall CreateOutOfBoundsException = new RuntimeCall(Object, true, Int); + public static final RuntimeCall JavaTimeMillis = new RuntimeCall(Long, false); + public static final RuntimeCall JavaTimeNanos = new RuntimeCall(Long, false); + public static final RuntimeCall Debug = new RuntimeCall(Void, true); + public static final RuntimeCall ArithmeticFrem = new RuntimeCall(Float, false, Float, Float); + public static final RuntimeCall ArithmeticDrem = new RuntimeCall(Double, false, Double, Double); + public static final RuntimeCall ArithmeticCos = new RuntimeCall(Double, false, Double); + public static final RuntimeCall ArithmeticTan = new RuntimeCall(Double, false, Double); + public static final RuntimeCall ArithmeticSin = new RuntimeCall(Double, false, Double); + public static final RuntimeCall GenericCallback = new RuntimeCall(Object, true, Object, Object); + public static final RuntimeCall LogPrimitive = new RuntimeCall(Void, false, Int, Long, Boolean); + public static final RuntimeCall LogObject = new RuntimeCall(Void, false, Object, Int); - private RuntimeCall(Kind resultKind, Kind... args) { + private final Kind resultKind; + private final Kind[] argumentKinds; + private final boolean hasSideEffect; + + public RuntimeCall(Kind resultKind, boolean hasSideEffect, Kind... args) { this.resultKind = resultKind; - this.arguments = args; + this.argumentKinds = args; + this.hasSideEffect = hasSideEffect; + } + + public Kind getResultKind() { + return resultKind; + } + + public Kind[] getArgumentKinds() { + return argumentKinds; } public boolean hasSideEffect() { - switch (this) { - case LogObject: - case LogPrimitive: - return false; - } - return true; + return hasSideEffect; } } diff -r 45f682f7fea8 -r 5b419d76b406 graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/LIRGenerator.java --- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/LIRGenerator.java Tue Sep 25 09:23:45 2012 -0700 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/LIRGenerator.java Tue Sep 25 09:28:03 2012 -0700 @@ -996,7 +996,7 @@ @Override public void emitRuntimeCall(RuntimeCallNode x) { Value resultOperand = resultOperandFor(x.kind()); - CallingConvention cc = frameMap.registerConfig.getCallingConvention(RuntimeCall, x.call().arguments, target(), false); + CallingConvention cc = frameMap.registerConfig.getCallingConvention(RuntimeCall, x.call().getArgumentKinds(), target(), false); frameMap.callsMethod(cc, RuntimeCall); List argList = visitInvokeArguments(cc, x.arguments()); @@ -1320,8 +1320,8 @@ protected final Value callRuntime(RuntimeCall runtimeCall, LIRFrameState info, Value... args) { // get a result register - Kind result = runtimeCall.resultKind; - Kind[] arguments = runtimeCall.arguments; + Kind result = runtimeCall.getResultKind(); + Kind[] arguments = runtimeCall.getArgumentKinds(); Value physReg = result.isVoid() ? IllegalValue : resultOperandFor(result); diff -r 45f682f7fea8 -r 5b419d76b406 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/RuntimeCallNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/RuntimeCallNode.java Tue Sep 25 09:23:45 2012 -0700 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/RuntimeCallNode.java Tue Sep 25 09:28:03 2012 -0700 @@ -42,7 +42,7 @@ } public RuntimeCallNode(RuntimeCall call, ValueNode... arguments) { - super(StampFactory.forKind(call.resultKind), arguments); + super(StampFactory.forKind(call.getResultKind()), arguments); this.call = call; } diff -r 45f682f7fea8 -r 5b419d76b406 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/LIRGeneratorTool.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/LIRGeneratorTool.java Tue Sep 25 09:23:45 2012 -0700 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/LIRGeneratorTool.java Tue Sep 25 09:28:03 2012 -0700 @@ -85,7 +85,7 @@ public abstract void emitDeoptimize(DeoptimizationAction action, DeoptimizationReason reason, Object deoptInfo, long leafGraphId); public abstract Value emitCall(Object target, Kind result, Kind[] arguments, boolean canTrap, Value... args); public final Value emitCall(RuntimeCall runtimeCall, boolean canTrap, Value... args) { - return emitCall(runtimeCall, runtimeCall.resultKind, runtimeCall.arguments, canTrap, args); + return emitCall(runtimeCall, runtimeCall.getResultKind(), runtimeCall.getArgumentKinds(), canTrap, args); } public abstract void emitIf(IfNode i);