Mercurial > hg > truffle
changeset 19931:9aa9db862403
Implement foldStamp for Float to Integer ops
author | Gilles Duboscq <duboscq@ssw.jku.at> |
---|---|
date | Wed, 08 Oct 2014 16:20:38 +0200 |
parents | fa11aa10bf2c |
children | 6303a7a525c5 |
files | graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/FloatStamp.java |
diffstat | 1 files changed, 58 insertions(+), 12 deletions(-) [+] |
line wrap: on
line diff
--- a/graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/FloatStamp.java Wed Oct 08 15:27:10 2014 +0200 +++ b/graal/com.oracle.graal.compiler.common/src/com/oracle/graal/compiler/common/type/FloatStamp.java Wed Oct 08 16:20:38 2014 +0200 @@ -666,8 +666,19 @@ @Override public Stamp foldStamp(Stamp stamp) { - assert stamp instanceof FloatStamp && ((FloatStamp) stamp).getBits() == 32; - return StampFactory.forKind(Kind.Int); + FloatStamp floatStamp = (FloatStamp) stamp; + assert floatStamp.getBits() == 32; + boolean mustHaveZero = !floatStamp.isNonNaN(); + int lowerBound = (int) floatStamp.lowerBound(); + int upperBound = (int) floatStamp.upperBound(); + if (mustHaveZero) { + if (lowerBound > 0) { + lowerBound = 0; + } else if (upperBound < 0) { + upperBound = 0; + } + } + return StampFactory.forInteger(Kind.Int, lowerBound, upperBound); } }, @@ -681,8 +692,19 @@ @Override public Stamp foldStamp(Stamp stamp) { - assert stamp instanceof FloatStamp && ((FloatStamp) stamp).getBits() == 32; - return StampFactory.forKind(Kind.Long); + FloatStamp floatStamp = (FloatStamp) stamp; + assert floatStamp.getBits() == 32; + boolean mustHaveZero = !floatStamp.isNonNaN(); + long lowerBound = (long) floatStamp.lowerBound(); + long upperBound = (long) floatStamp.upperBound(); + if (mustHaveZero) { + if (lowerBound > 0) { + lowerBound = 0; + } else if (upperBound < 0) { + upperBound = 0; + } + } + return StampFactory.forInteger(Kind.Long, lowerBound, upperBound); } }, @@ -696,8 +718,19 @@ @Override public Stamp foldStamp(Stamp stamp) { - assert stamp instanceof FloatStamp && ((FloatStamp) stamp).getBits() == 64; - return StampFactory.forKind(Kind.Int); + FloatStamp floatStamp = (FloatStamp) stamp; + assert floatStamp.getBits() == 64; + boolean mustHaveZero = !floatStamp.isNonNaN(); + int lowerBound = (int) floatStamp.lowerBound(); + int upperBound = (int) floatStamp.upperBound(); + if (mustHaveZero) { + if (lowerBound > 0) { + lowerBound = 0; + } else if (upperBound < 0) { + upperBound = 0; + } + } + return StampFactory.forInteger(Kind.Int, lowerBound, upperBound); } }, @@ -711,8 +744,19 @@ @Override public Stamp foldStamp(Stamp stamp) { - assert stamp instanceof FloatStamp && ((FloatStamp) stamp).getBits() == 64; - return StampFactory.forKind(Kind.Long); + FloatStamp floatStamp = (FloatStamp) stamp; + assert floatStamp.getBits() == 64; + boolean mustHaveZero = !floatStamp.isNonNaN(); + long lowerBound = (long) floatStamp.lowerBound(); + long upperBound = (long) floatStamp.upperBound(); + if (mustHaveZero) { + if (lowerBound > 0) { + lowerBound = 0; + } else if (upperBound < 0) { + upperBound = 0; + } + } + return StampFactory.forInteger(Kind.Long, lowerBound, upperBound); } }, @@ -726,8 +770,9 @@ @Override public Stamp foldStamp(Stamp stamp) { - assert stamp instanceof FloatStamp && ((FloatStamp) stamp).getBits() == 32; - return StampFactory.forKind(Kind.Double); + FloatStamp floatStamp = (FloatStamp) stamp; + assert floatStamp.getBits() == 32; + return StampFactory.forFloat(Kind.Double, floatStamp.lowerBound(), floatStamp.upperBound(), floatStamp.isNonNaN()); } }, @@ -741,8 +786,9 @@ @Override public Stamp foldStamp(Stamp stamp) { - assert stamp instanceof FloatStamp && ((FloatStamp) stamp).getBits() == 64; - return StampFactory.forKind(Kind.Float); + FloatStamp floatStamp = (FloatStamp) stamp; + assert floatStamp.getBits() == 64; + return StampFactory.forFloat(Kind.Float, (float) floatStamp.lowerBound(), (float) floatStamp.upperBound(), floatStamp.isNonNaN()); } }); }