changeset 2585:3e0e65161345

new node layout: Op2
author Lukas Stadler <lukas.stadler@jku.at>
date Thu, 05 May 2011 14:12:19 +0200
parents 06b2eac2f5d3
children 421da5f53b5e
files graal/GraalCompiler/src/com/sun/c1x/ir/Instruction.java graal/GraalCompiler/src/com/sun/c1x/ir/Op2.java
diffstat 2 files changed, 51 insertions(+), 33 deletions(-) [+]
line wrap: on
line diff
--- a/graal/GraalCompiler/src/com/sun/c1x/ir/Instruction.java	Thu May 05 14:02:34 2011 +0200
+++ b/graal/GraalCompiler/src/com/sun/c1x/ir/Instruction.java	Thu May 05 14:12:19 2011 +0200
@@ -43,10 +43,10 @@
  */
 public abstract class Instruction extends Value {
 
-    public static final int INPUT_COUNT = 0;
+    private static final int INPUT_COUNT = 0;
 
-    public static final int SUCCESSOR_COUNT = 1;
-    public static final int SUCCESSOR_NEXT = 0;
+    private static final int SUCCESSOR_COUNT = 1;
+    private static final int SUCCESSOR_NEXT = 0;
 
     @Override
     protected int inputCount() {
@@ -84,7 +84,6 @@
      */
     private List<ExceptionHandler> exceptionHandlers = ExceptionHandler.ZERO_HANDLERS;
 
-
     private boolean isAppended = false;
 
     /**
--- a/graal/GraalCompiler/src/com/sun/c1x/ir/Op2.java	Thu May 05 14:02:34 2011 +0200
+++ b/graal/GraalCompiler/src/com/sun/c1x/ir/Op2.java	Thu May 05 14:12:19 2011 +0200
@@ -33,14 +33,49 @@
  */
 public abstract class Op2 extends Instruction {
 
+    private static final int INPUT_COUNT = 2;
+    private static final int INPUT_X = 0;
+    private static final int INPUT_Y = 1;
+
+    private static final int SUCCESSOR_COUNT = 0;
+
+    @Override
+    protected int inputCount() {
+        return super.inputCount() + INPUT_COUNT;
+    }
+
+    @Override
+    protected int successorCount() {
+        return super.successorCount() + SUCCESSOR_COUNT;
+    }
+
+    /**
+     * The first input to this instruction
+     */
+     public Value x() {
+        return (Value) inputs().get(super.inputCount() + INPUT_X);
+    }
+
+    public Value setX(Value n) {
+        return (Value) inputs().set(super.inputCount() + INPUT_X, n);
+    }
+
+    /**
+     * The second input to this instruction
+     */
+    public Value y() {
+        return (Value) inputs().get(super.inputCount() + INPUT_Y);
+    }
+
+    public Value setY(Value n) {
+        return (Value) inputs().set(super.inputCount() + INPUT_Y, n);
+    }
+
     /**
      * The opcode of this instruction.
      */
     public final int opcode;
 
-    Value x;
-    Value y;
-
     /**
      * Creates a new Op2 instance.
      * @param kind the result type of this instruction
@@ -49,26 +84,10 @@
      * @param y the second input instruction
      */
     public Op2(CiKind kind, int opcode, Value x, Value y) {
-        super(kind);
+        super(kind, INPUT_COUNT, SUCCESSOR_COUNT, null);
         this.opcode = opcode;
-        this.x = x;
-        this.y = y;
-    }
-
-    /**
-     * Gets the first input to this instruction.
-     * @return the first input to this instruction
-     */
-    public final Value x() {
-        return x;
-    }
-
-    /**
-     * Gets the second input to this instruction.
-     * @return the second input to this instruction
-     */
-    public final Value y() {
-        return y;
+        setX(x);
+        setY(y);
     }
 
     /**
@@ -76,9 +95,9 @@
      */
     public void swapOperands() {
         assert Bytecodes.isCommutative(opcode);
-        Value t = x;
-        x = y;
-        y = t;
+        Value t = x();
+        setX(y());
+        setY(t);
     }
 
     /**
@@ -87,20 +106,20 @@
      */
     @Override
     public void inputValuesDo(ValueClosure closure) {
-        x = closure.apply(x);
-        y = closure.apply(y);
+        setX(closure.apply(x()));
+        setY(closure.apply(y()));
     }
 
     @Override
     public int valueNumber() {
-        return Util.hash2(opcode, x, y);
+        return Util.hash2(opcode, x(), y());
     }
 
     @Override
     public boolean valueEqual(Instruction i) {
         if (i instanceof Op2) {
             Op2 o = (Op2) i;
-            return opcode == o.opcode && x == o.x && y == o.y;
+            return opcode == o.opcode && x() == o.x() && y() == o.y();
         }
         return false;
     }