# HG changeset patch # User Lukas Stadler # Date 1403085467 -7200 # Node ID 17af09bd9e7573f38fe92fa65286419aa1d99cfe # Parent d568574e644807182edf23c8e0d483239ac5268e infer stamps for IntegerMulHighNode diff -r d568574e6448 -r 17af09bd9e75 graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/nodes/arithmetic/IntegerMulHighNode.java --- a/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/nodes/arithmetic/IntegerMulHighNode.java Wed Jun 18 11:28:23 2014 +0200 +++ b/graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/nodes/arithmetic/IntegerMulHighNode.java Wed Jun 18 11:57:47 2014 +0200 @@ -57,6 +57,27 @@ } @Override + public boolean inferStamp() { + IntegerStamp xStamp = (IntegerStamp) x().stamp(); + IntegerStamp yStamp = (IntegerStamp) y().stamp(); + + Kind kind = getKind(); + assert kind == Kind.Int || kind == Kind.Long; + long[] xExtremes = {xStamp.lowerBound(), xStamp.upperBound()}; + long[] yExtremes = {yStamp.lowerBound(), yStamp.upperBound()}; + long min = Long.MAX_VALUE; + long max = Long.MIN_VALUE; + for (long a : xExtremes) { + for (long b : yExtremes) { + long result = kind == Kind.Int ? ExactMath.multiplyHigh((int) a, (int) b) : ExactMath.multiplyHigh(a, b); + min = Math.min(min, result); + max = Math.max(max, result); + } + } + return updateStamp(StampFactory.forInteger(getKind(), min, max)); + } + + @Override public void generate(NodeMappableLIRBuilder builder, ArithmeticLIRGenerator gen) { Value a = builder.operand(x()); Value b = builder.operand(y());