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