Mercurial > hg > graal-compiler
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;