diff graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/type/StampTool.java @ 6313:7ac010ae8c97

Add inferStamp for a number of ConvertNode's operations
author Gilles Duboscq <duboscq@ssw.jku.at>
date Tue, 04 Sep 2012 17:10:42 +0200
parents 1ed726759f65
children 6e66d97a16ae
line wrap: on
line diff
--- a/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/type/StampTool.java	Tue Sep 04 17:09:46 2012 +0200
+++ b/graal/com.oracle.graal.nodes/src/com/oracle/graal/nodes/type/StampTool.java	Tue Sep 04 17:10:42 2012 +0200
@@ -165,4 +165,55 @@
         }
         return StampFactory.forKind(kind);
     }
+
+    public static Stamp intToLong(IntegerStamp intStamp) {
+        long mask;
+        if (intStamp.isPositive()) {
+            mask = intStamp.mask();
+        } else {
+            mask = 0xffffffff00000000L | intStamp.mask();
+        }
+        return StampFactory.forInteger(Kind.Long, intStamp.lowerBound(), intStamp.upperBound(), mask);
+    }
+
+    private static Stamp narrowingKindConvertion(IntegerStamp fromStamp, Kind toKind) {
+        long mask = fromStamp.mask() & IntegerStamp.defaultMask(toKind);
+        long lowerBound = saturate(fromStamp.lowerBound(), toKind);
+        long upperBound = saturate(fromStamp.upperBound(), toKind);
+        if (fromStamp.lowerBound() < toKind.minValue()) {
+            upperBound = toKind.maxValue();
+        }
+        if (fromStamp.upperBound() > toKind.maxValue()) {
+            lowerBound = toKind.minValue();
+        }
+        return StampFactory.forInteger(toKind.stackKind(), lowerBound, upperBound, mask);
+    }
+
+    public static Stamp intToByte(IntegerStamp intStamp) {
+        return narrowingKindConvertion(intStamp, Kind.Byte);
+    }
+
+    public static Stamp intToShort(IntegerStamp intStamp) {
+        return narrowingKindConvertion(intStamp, Kind.Short);
+    }
+
+    public static Stamp intToChar(IntegerStamp intStamp) {
+        return narrowingKindConvertion(intStamp, Kind.Char);
+    }
+
+    public static Stamp longToInt(IntegerStamp longStamp) {
+        return narrowingKindConvertion(longStamp, Kind.Int);
+    }
+
+    public static long saturate(long v, Kind kind) {
+        long max = kind.maxValue();
+        if (v > max) {
+            return max;
+        }
+        long min = kind.minValue();
+        if (v < min) {
+            return min;
+        }
+        return v;
+    }
 }