# HG changeset patch # User Roland Schatz # Date 1377867429 -7200 # Node ID 4b41416685e97d41627c4255cb7b3b7d1d199d32 # Parent 1cd98fee213964d1586994da2b46195699fc087a New static factory methods for constants and arithmetic. diff -r 1cd98fee2139 -r 4b41416685e9 graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/Constant.java --- a/graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/Constant.java Fri Aug 30 14:07:59 2013 +0200 +++ b/graal/com.oracle.graal.api.meta/src/com/oracle/graal/api/meta/Constant.java Fri Aug 30 14:57:09 2013 +0200 @@ -454,4 +454,102 @@ throw new IllegalArgumentException(kind.toString()); } } + + /** + * Returns the zero value for a given numeric kind. + */ + public static Constant zero(Kind kind) { + switch (kind) { + case Byte: + return forByte((byte) 0); + case Char: + return forChar((char) 0); + case Double: + return DOUBLE_0; + case Float: + return FLOAT_0; + case Int: + return INT_0; + case Long: + return LONG_0; + case Short: + return forShort((short) 0); + default: + throw new IllegalArgumentException(kind.toString()); + } + } + + /** + * Returns the one value for a given numeric kind. + */ + public static Constant one(Kind kind) { + switch (kind) { + case Byte: + return forByte((byte) 1); + case Char: + return forChar((char) 1); + case Double: + return DOUBLE_1; + case Float: + return FLOAT_1; + case Int: + return INT_1; + case Long: + return LONG_1; + case Short: + return forShort((short) 1); + default: + throw new IllegalArgumentException(kind.toString()); + } + } + + /** + * Adds two numeric constants. + */ + public static Constant add(Constant x, Constant y) { + assert x.getKind() == y.getKind(); + switch (x.getKind()) { + case Byte: + return forByte((byte) (x.asInt() + y.asInt())); + case Char: + return forChar((char) (x.asInt() + y.asInt())); + case Double: + return forDouble(x.asDouble() + y.asDouble()); + case Float: + return forFloat(x.asFloat() + y.asFloat()); + case Int: + return forInt(x.asInt() + y.asInt()); + case Long: + return forLong(x.asLong() + y.asLong()); + case Short: + return forShort((short) (x.asInt() + y.asInt())); + default: + throw new IllegalArgumentException(x.getKind().toString()); + } + } + + /** + * Multiplies two numeric constants. + */ + public static Constant mul(Constant x, Constant y) { + assert x.getKind() == y.getKind(); + switch (x.getKind()) { + case Byte: + return forByte((byte) (x.asInt() * y.asInt())); + case Char: + return forChar((char) (x.asInt() * y.asInt())); + case Double: + return forDouble(x.asDouble() * y.asDouble()); + case Float: + return forFloat(x.asFloat() * y.asFloat()); + case Int: + return forInt(x.asInt() * y.asInt()); + case Long: + return forLong(x.asLong() * y.asLong()); + case Short: + return forShort((short) (x.asInt() * y.asInt())); + default: + throw new IllegalArgumentException(x.getKind().toString()); + } + } } diff -r 1cd98fee2139 -r 4b41416685e9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ConstantNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ConstantNode.java Fri Aug 30 14:07:59 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/ConstantNode.java Fri Aug 30 14:57:09 2013 +0200 @@ -77,6 +77,14 @@ } /** + * Returns a node for a primitive constant. + */ + public static ConstantNode forPrimitive(Constant constant, Graph graph) { + assert constant.getKind() != Kind.Object; + return forConstant(constant, null, graph); + } + + /** * Returns a node for a double constant. * * @param d the double value for which to create the instruction diff -r 1cd98fee2139 -r 4b41416685e9 graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/BinaryNode.java --- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/BinaryNode.java Fri Aug 30 14:07:59 2013 +0200 +++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/calc/BinaryNode.java Fri Aug 30 14:57:09 2013 +0200 @@ -83,6 +83,57 @@ } } + public static BinaryNode add(ValueNode x, ValueNode y) { + assert x.kind() == y.kind(); + switch (x.kind()) { + case Byte: + case Char: + case Short: + case Int: + case Long: + return IntegerArithmeticNode.add(x, y); + case Float: + case Double: + return x.graph().unique(new FloatAddNode(x.kind(), x, y, false)); + default: + throw GraalInternalError.shouldNotReachHere(); + } + } + + public static BinaryNode sub(ValueNode x, ValueNode y) { + assert x.kind() == y.kind(); + switch (x.kind()) { + case Byte: + case Char: + case Short: + case Int: + case Long: + return IntegerArithmeticNode.sub(x, y); + case Float: + case Double: + return x.graph().unique(new FloatSubNode(x.kind(), x, y, false)); + default: + throw GraalInternalError.shouldNotReachHere(); + } + } + + public static BinaryNode mul(ValueNode x, ValueNode y) { + assert x.kind() == y.kind(); + switch (x.kind()) { + case Byte: + case Char: + case Short: + case Int: + case Long: + return IntegerArithmeticNode.mul(x, y); + case Float: + case Double: + return x.graph().unique(new FloatMulNode(x.kind(), x, y, false)); + default: + throw GraalInternalError.shouldNotReachHere(); + } + } + public static boolean canTryReassociate(BinaryNode node) { return node instanceof IntegerAddNode || node instanceof IntegerSubNode || node instanceof IntegerMulNode || node instanceof AndNode || node instanceof OrNode || node instanceof XorNode; }