< prev index next >

src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.core.common/src/org/graalvm/compiler/core/common/type/FloatStamp.java

Print this page




 301         return super.equals(other);
 302     }
 303 
 304     @Override
 305     public JavaConstant asConstant() {
 306         if (isConstant()) {
 307             switch (getBits()) {
 308                 case 32:
 309                     return JavaConstant.forFloat((float) lowerBound);
 310                 case 64:
 311                     return JavaConstant.forDouble(lowerBound);
 312             }
 313         }
 314         return null;
 315     }
 316 
 317     private boolean isConstant() {
 318         /*
 319          * There are many forms of NaNs and any operations on them can silently convert them into
 320          * the canonical NaN.


 321          */
 322         return (Double.compare(lowerBound, upperBound) == 0 && nonNaN);
 323     }
 324 
 325     private static FloatStamp stampForConstant(Constant constant) {
 326         FloatStamp result;
 327         PrimitiveConstant value = (PrimitiveConstant) constant;
 328         switch (value.getJavaKind()) {
 329             case Float:
 330                 if (Float.isNaN(value.asFloat())) {
 331                     result = new FloatStamp(32, Double.NaN, Double.NaN, false);
 332                 } else {
 333                     result = new FloatStamp(32, value.asFloat(), value.asFloat(), !Float.isNaN(value.asFloat()));
 334                 }
 335                 break;
 336             case Double:
 337                 if (Double.isNaN(value.asDouble())) {
 338                     result = new FloatStamp(64, Double.NaN, Double.NaN, false);
 339                 } else {
 340                     result = new FloatStamp(64, value.asDouble(), value.asDouble(), !Double.isNaN(value.asDouble()));
 341                 }
 342                 break;




 301         return super.equals(other);
 302     }
 303 
 304     @Override
 305     public JavaConstant asConstant() {
 306         if (isConstant()) {
 307             switch (getBits()) {
 308                 case 32:
 309                     return JavaConstant.forFloat((float) lowerBound);
 310                 case 64:
 311                     return JavaConstant.forDouble(lowerBound);
 312             }
 313         }
 314         return null;
 315     }
 316 
 317     private boolean isConstant() {
 318         /*
 319          * There are many forms of NaNs and any operations on them can silently convert them into
 320          * the canonical NaN.
 321          *
 322          * We need to exclude 0 here since it can contain -0.0 && 0.0 .
 323          */
 324         return (Double.compare(lowerBound, upperBound) == 0 && nonNaN) && lowerBound != 0;
 325     }
 326 
 327     private static FloatStamp stampForConstant(Constant constant) {
 328         FloatStamp result;
 329         PrimitiveConstant value = (PrimitiveConstant) constant;
 330         switch (value.getJavaKind()) {
 331             case Float:
 332                 if (Float.isNaN(value.asFloat())) {
 333                     result = new FloatStamp(32, Double.NaN, Double.NaN, false);
 334                 } else {
 335                     result = new FloatStamp(32, value.asFloat(), value.asFloat(), !Float.isNaN(value.asFloat()));
 336                 }
 337                 break;
 338             case Double:
 339                 if (Double.isNaN(value.asDouble())) {
 340                     result = new FloatStamp(64, Double.NaN, Double.NaN, false);
 341                 } else {
 342                     result = new FloatStamp(64, value.asDouble(), value.asDouble(), !Double.isNaN(value.asDouble()));
 343                 }
 344                 break;


< prev index next >