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());