Mercurial > hg > truffle
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; + } }