| /* |
| * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. |
| * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
| * |
| * This code is free software; you can redistribute it and/or modify it |
| * under the terms of the GNU General Public License version 2 only, as |
| * published by the Free Software Foundation. |
| * |
| * This code is distributed in the hope that it will be useful, but WITHOUT |
| * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
| * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
| * version 2 for more details (a copy is included in the LICENSE file that |
| * accompanied this code). |
| * |
| * You should have received a copy of the GNU General Public License version |
| * 2 along with this work; if not, write to the Free Software Foundation, |
| * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
| * |
| * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
| * or visit www.oracle.com if you need additional information or have any |
| * questions. |
| */ |
| |
| /* |
| * @test |
| * @bug 4169183 |
| * @summary Check for correct inlining by the interpreter (widefp and strictfp). |
| * The default is widefp. A strictfp method was getting inlined |
| * into a widefp method. |
| */ |
| |
| import java.io.PrintStream; |
| |
| public class WideStrictInline { |
| static PrintStream out; |
| static float halfUlp; |
| |
| static { |
| halfUlp = 1; |
| for ( int i = 127 - 24; i > 0; i-- ) |
| halfUlp *= 2; |
| } |
| |
| public static void main(String argv[]) throws Exception { |
| out = System.err; |
| pr(-1,"halfUlp",halfUlp); |
| WideStrictInline obj = new WideStrictInline(); |
| for( int i=0; i<48; i++ ) |
| obj.instanceMethod( i ); |
| } |
| |
| private static void pr(int i, String desc, float r) { |
| out.print(" i=("+i+") "+desc+" ; == "+r); |
| out.println(" , 0x"+Integer.toHexString(Float.floatToIntBits(r))); |
| } |
| |
| private static strictfp float WideStrictInline(float par) { |
| return par; |
| } |
| |
| public static strictfp float strictValue(int i) { |
| float r; |
| switch (i%4) { |
| case 0: r = -Float.MAX_VALUE; break; |
| case 1: r = Float.MAX_VALUE; break; |
| case 2: r = Float.MIN_VALUE; break; |
| default : r = 1L << 24; |
| } |
| return r; |
| } |
| |
| void instanceMethod (int i) throws Exception { |
| float r; |
| switch (i%4) { |
| case 0: |
| if (!Float.isInfinite( WideStrictInline(strictValue(i)*2) + |
| Float.MAX_VALUE )) |
| { |
| pr(i, |
| "WideStrictInline(-Float.MAX_VALUE * 2) " + |
| "!= Float.NEGATIVE_INFINITY" |
| ,WideStrictInline(strictValue(i)*2) + Float.MAX_VALUE); |
| } |
| r = WideStrictInline(strictValue(i)*2) + Float.MAX_VALUE; |
| if ( !Float.isInfinite( r ) ) { |
| pr(i,"r != Float.NEGATIVE_INFINITY",r); |
| throw new RuntimeException(); |
| } |
| break; |
| case 1: |
| if (!Float.isInfinite(WideStrictInline(strictValue(i)+halfUlp) - |
| Float.MAX_VALUE )) { |
| pr(i,"WideStrictInline(Float.MAX_VALUE+halfUlp) " + |
| "!= Float.POSITIVE_INFINITY" |
| ,WideStrictInline(strictValue(i)+halfUlp) - Float.MAX_VALUE); |
| } |
| r = WideStrictInline(strictValue(i)+halfUlp) - Float.MAX_VALUE; |
| if ( !Float.isInfinite( r ) ) { |
| pr(i,"r != Float.POSITIVE_INFINITY",r); |
| throw new RuntimeException(); |
| } |
| break; |
| case 2: |
| if (WideStrictInline(strictValue(i)/2) != 0) { |
| pr(i,"WideStrictInline(Float.MIN_VALUE/2) != 0", |
| WideStrictInline(strictValue(i)/2)); |
| } |
| r = WideStrictInline(strictValue(i)/2); |
| if ( r != 0 ) { |
| pr(i,"r != 0",r); |
| throw new RuntimeException(); |
| } |
| break; |
| default: |
| if (WideStrictInline(strictValue(i)-0.5f) - strictValue(i) != 0) { |
| pr(i,"WideStrictInline(2^24-0.5) != 2^24", |
| WideStrictInline(strictValue(i)-0.5f)); |
| } |
| r = WideStrictInline(strictValue(i)-0.5f); |
| if ( r - strictValue(i) != 0 ) { |
| pr(i,"r != 2^24",r); |
| throw new RuntimeException(); |
| } |
| } |
| } |
| |
| } |