changeset 6443:5b419d76b406

Make RuntimeCall more extensible by changing it from an enum to a class
author Christian Wimmer <christian.wimmer@oracle.com>
date Tue, 25 Sep 2012 09:28:03 -0700
parents 45f682f7fea8
children 5ebe3e5a892b
files graal/com.oracle.graal.api.code/src/com/oracle/graal/api/code/RuntimeCall.java graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/LIRGenerator.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/extended/RuntimeCallNode.java graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/spi/LIRGeneratorTool.java
diffstat 4 files changed, 43 insertions(+), 36 deletions(-) [+]
line wrap: on
line diff
--- 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;
     }
 }
--- 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<Value> 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);
 
--- 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;
     }
 
--- 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);