Mercurial > hg > truffle
changeset 16134:17af09bd9e75
infer stamps for IntegerMulHighNode
author | Lukas Stadler <lukas.stadler@oracle.com> |
---|---|
date | Wed, 18 Jun 2014 11:57:47 +0200 |
parents | d568574e6448 |
children | f3330ba9974c |
files | graal/com.oracle.graal.truffle/src/com/oracle/graal/truffle/nodes/arithmetic/IntegerMulHighNode.java |
diffstat | 1 files changed, 21 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- 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());