diff graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerConvertNode.java @ 17344:98e60bdf6d05

Use ArithmeticOpTable for primitive convert operations.
author Roland Schatz <roland.schatz@oracle.com>
date Mon, 06 Oct 2014 11:51:32 +0200
parents c9bb0da795d4
children b3c10156d3d7
line wrap: on
line diff
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerConvertNode.java	Mon Oct 06 10:40:55 2014 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/IntegerConvertNode.java	Mon Oct 06 11:51:32 2014 +0200
@@ -22,7 +22,10 @@
  */
 package com.oracle.graal.nodes.calc;
 
+import com.oracle.graal.api.meta.*;
+import com.oracle.graal.compiler.common.type.ArithmeticOpTable.IntegerConvertOp;
 import com.oracle.graal.compiler.common.type.*;
+import com.oracle.graal.graph.spi.*;
 import com.oracle.graal.nodeinfo.*;
 import com.oracle.graal.nodes.*;
 import com.oracle.graal.nodes.spi.*;
@@ -31,12 +34,17 @@
  * An {@code IntegerConvert} converts an integer to an integer of different width.
  */
 @NodeInfo
-public abstract class IntegerConvertNode extends ConvertNode implements ArithmeticLIRLowerable {
+public abstract class IntegerConvertNode extends UnaryNode implements ConvertNode, ArithmeticLIRLowerable {
+
+    protected final IntegerConvertOp op;
+    protected final IntegerConvertOp reverseOp;
 
     protected final int resultBits;
 
-    protected IntegerConvertNode(Stamp stamp, ValueNode input, int resultBits) {
-        super(stamp, input);
+    protected IntegerConvertNode(IntegerConvertOp op, IntegerConvertOp reverseOp, int resultBits, ValueNode input) {
+        super(op.foldStamp(resultBits, input.stamp()), input);
+        this.op = op;
+        this.reverseOp = reverseOp;
         this.resultBits = resultBits;
     }
 
@@ -52,13 +60,29 @@
         }
     }
 
-    protected ValueNode canonicalConvert(@SuppressWarnings("hiding") ValueNode value) {
+    @Override
+    public Constant convert(Constant c) {
+        return op.foldConstant(getInputBits(), getResultBits(), c);
+    }
+
+    @Override
+    public Constant reverse(Constant c) {
+        return reverseOp.foldConstant(getResultBits(), getInputBits(), c);
+    }
+
+    @Override
+    public boolean inferStamp() {
+        return updateStamp(op.foldStamp(resultBits, getValue().stamp()));
+    }
+
+    @Override
+    public ValueNode canonical(CanonicalizerTool tool, ValueNode forValue) {
         if (value.stamp() instanceof IntegerStamp) {
             int inputBits = ((IntegerStamp) value.stamp()).getBits();
             if (inputBits == resultBits) {
                 return value;
             } else if (value.isConstant()) {
-                return ConstantNode.forIntegerBits(resultBits, evalConst(value.asConstant()).asLong());
+                return ConstantNode.forPrimitive(stamp(), convert(forValue.asConstant()));
             }
         }
         return this;