1*795d594fSAndroid Build Coastguard Worker /* 2*795d594fSAndroid Build Coastguard Worker * Copyright (C) 2016 The Android Open Source Project 3*795d594fSAndroid Build Coastguard Worker * 4*795d594fSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*795d594fSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*795d594fSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*795d594fSAndroid Build Coastguard Worker * 8*795d594fSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*795d594fSAndroid Build Coastguard Worker * 10*795d594fSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*795d594fSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*795d594fSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*795d594fSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*795d594fSAndroid Build Coastguard Worker * limitations under the License. 15*795d594fSAndroid Build Coastguard Worker */ 16*795d594fSAndroid Build Coastguard Worker 17*795d594fSAndroid Build Coastguard Worker public class Main { 18*795d594fSAndroid Build Coastguard Worker 19*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int Main.round32(float) builder (after) 20*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Result:i\d+>> InvokeStaticOrDirect intrinsic:MathRoundFloat 21*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Return [<<Result>>] round32(float f)22*795d594fSAndroid Build Coastguard Worker private static int round32(float f) { 23*795d594fSAndroid Build Coastguard Worker return Math.round(f); 24*795d594fSAndroid Build Coastguard Worker } 25*795d594fSAndroid Build Coastguard Worker 26*795d594fSAndroid Build Coastguard Worker /// CHECK-START: long Main.round64(double) builder (after) 27*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Result:j\d+>> InvokeStaticOrDirect intrinsic:MathRoundDouble 28*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Return [<<Result>>] round64(double d)29*795d594fSAndroid Build Coastguard Worker private static long round64(double d) { 30*795d594fSAndroid Build Coastguard Worker return Math.round(d); 31*795d594fSAndroid Build Coastguard Worker } 32*795d594fSAndroid Build Coastguard Worker main(String args[])33*795d594fSAndroid Build Coastguard Worker public static void main(String args[]) { 34*795d594fSAndroid Build Coastguard Worker // A few obvious numbers. 35*795d594fSAndroid Build Coastguard Worker expectEquals32(-2147483648, round32(Float.NEGATIVE_INFINITY)); 36*795d594fSAndroid Build Coastguard Worker expectEquals32(-2, round32(-1.51f)); 37*795d594fSAndroid Build Coastguard Worker expectEquals32(-1, round32(-1.2f)); 38*795d594fSAndroid Build Coastguard Worker expectEquals32(-1, round32(-1.0f)); 39*795d594fSAndroid Build Coastguard Worker expectEquals32(-1, round32(-0.5000001f)); 40*795d594fSAndroid Build Coastguard Worker expectEquals32(0, round32(-0.5f)); 41*795d594fSAndroid Build Coastguard Worker expectEquals32(0, round32(-0.2f)); 42*795d594fSAndroid Build Coastguard Worker expectEquals32(0, round32(-0.0f)); 43*795d594fSAndroid Build Coastguard Worker expectEquals32(0, round32(+0.0f)); 44*795d594fSAndroid Build Coastguard Worker expectEquals32(0, round32(+0.2f)); 45*795d594fSAndroid Build Coastguard Worker expectEquals32(1, round32(+0.5f)); 46*795d594fSAndroid Build Coastguard Worker expectEquals32(1, round32(+1.0f)); 47*795d594fSAndroid Build Coastguard Worker expectEquals32(1, round32(+1.2f)); 48*795d594fSAndroid Build Coastguard Worker expectEquals32(2, round32(+1.5f)); 49*795d594fSAndroid Build Coastguard Worker expectEquals32(2147483647, round32(Float.POSITIVE_INFINITY)); 50*795d594fSAndroid Build Coastguard Worker 51*795d594fSAndroid Build Coastguard Worker // Near minint. 52*795d594fSAndroid Build Coastguard Worker expectEquals32(-2147483648, round32(Math.nextAfter(-2147483648.0f, Float.NEGATIVE_INFINITY))); 53*795d594fSAndroid Build Coastguard Worker expectEquals32(-2147483648, round32(-2147483648.0f)); 54*795d594fSAndroid Build Coastguard Worker expectEquals32(-2147483520, round32(Math.nextAfter(-2147483648.0f, Float.POSITIVE_INFINITY))); 55*795d594fSAndroid Build Coastguard Worker 56*795d594fSAndroid Build Coastguard Worker // Near maxint. 57*795d594fSAndroid Build Coastguard Worker expectEquals32(2147483520, round32(Math.nextAfter(2147483648.0f, Float.NEGATIVE_INFINITY))); 58*795d594fSAndroid Build Coastguard Worker expectEquals32(2147483647, round32(2147483648.0f)); 59*795d594fSAndroid Build Coastguard Worker expectEquals32(2147483647, round32(Math.nextAfter(2147483648.0f, Float.POSITIVE_INFINITY))); 60*795d594fSAndroid Build Coastguard Worker 61*795d594fSAndroid Build Coastguard Worker // Some others. 62*795d594fSAndroid Build Coastguard Worker for (int i = -100; i <= 100; ++i) { 63*795d594fSAndroid Build Coastguard Worker expectEquals32(i - 1, round32((float) i - 0.51f)); 64*795d594fSAndroid Build Coastguard Worker expectEquals32(i, round32((float) i - 0.5f)); 65*795d594fSAndroid Build Coastguard Worker expectEquals32(i, round32((float) i)); 66*795d594fSAndroid Build Coastguard Worker expectEquals32(i + 1, round32((float) i + 0.5f)); 67*795d594fSAndroid Build Coastguard Worker expectEquals32(i + 1, round32((float) i + 0.51f)); 68*795d594fSAndroid Build Coastguard Worker } 69*795d594fSAndroid Build Coastguard Worker for (float f = -1.5f; f <= -1.499f; f = Math.nextAfter(f, Float.POSITIVE_INFINITY)) { 70*795d594fSAndroid Build Coastguard Worker expectEquals32(-1, round32(f)); 71*795d594fSAndroid Build Coastguard Worker } 72*795d594fSAndroid Build Coastguard Worker 73*795d594fSAndroid Build Coastguard Worker // Some harder. 74*795d594fSAndroid Build Coastguard Worker float[] fvals = { 75*795d594fSAndroid Build Coastguard Worker -16777215.5f, 76*795d594fSAndroid Build Coastguard Worker -16777215.0f, 77*795d594fSAndroid Build Coastguard Worker -0.49999998f, 78*795d594fSAndroid Build Coastguard Worker -0.4999999701976776123046875f, 79*795d594fSAndroid Build Coastguard Worker 0.4999999701976776123046875f, 80*795d594fSAndroid Build Coastguard Worker 0.49999998f, 81*795d594fSAndroid Build Coastguard Worker 16777215.0f, 82*795d594fSAndroid Build Coastguard Worker 16777215.5f 83*795d594fSAndroid Build Coastguard Worker }; 84*795d594fSAndroid Build Coastguard Worker int[] ivals = { 85*795d594fSAndroid Build Coastguard Worker -16777216, 86*795d594fSAndroid Build Coastguard Worker -16777215, 87*795d594fSAndroid Build Coastguard Worker 0, 88*795d594fSAndroid Build Coastguard Worker 0, 89*795d594fSAndroid Build Coastguard Worker 0, 90*795d594fSAndroid Build Coastguard Worker 0, 91*795d594fSAndroid Build Coastguard Worker 16777215, 92*795d594fSAndroid Build Coastguard Worker 16777216 93*795d594fSAndroid Build Coastguard Worker }; 94*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < fvals.length; i++) { 95*795d594fSAndroid Build Coastguard Worker expectEquals32(ivals[i], round32(fvals[i])); 96*795d594fSAndroid Build Coastguard Worker } 97*795d594fSAndroid Build Coastguard Worker 98*795d594fSAndroid Build Coastguard Worker // A few NaN numbers. 99*795d594fSAndroid Build Coastguard Worker float[] fnans = { 100*795d594fSAndroid Build Coastguard Worker Float.intBitsToFloat(0x7f800001), 101*795d594fSAndroid Build Coastguard Worker Float.intBitsToFloat(0x7fa00000), 102*795d594fSAndroid Build Coastguard Worker Float.intBitsToFloat(0x7fc00000), 103*795d594fSAndroid Build Coastguard Worker Float.intBitsToFloat(0x7fffffff), 104*795d594fSAndroid Build Coastguard Worker Float.intBitsToFloat(0xff800001), 105*795d594fSAndroid Build Coastguard Worker Float.intBitsToFloat(0xffa00000), 106*795d594fSAndroid Build Coastguard Worker Float.intBitsToFloat(0xffc00000), 107*795d594fSAndroid Build Coastguard Worker Float.intBitsToFloat(0xffffffff) 108*795d594fSAndroid Build Coastguard Worker }; 109*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < fnans.length; i++) { 110*795d594fSAndroid Build Coastguard Worker expectEquals32(0, round32(fnans[i])); 111*795d594fSAndroid Build Coastguard Worker } 112*795d594fSAndroid Build Coastguard Worker 113*795d594fSAndroid Build Coastguard Worker // A few obvious numbers. 114*795d594fSAndroid Build Coastguard Worker expectEquals64(-9223372036854775808L, round64(Double.NEGATIVE_INFINITY)); 115*795d594fSAndroid Build Coastguard Worker expectEquals64(-2L, round64(-1.51d)); 116*795d594fSAndroid Build Coastguard Worker expectEquals64(-1L, round64(-1.2d)); 117*795d594fSAndroid Build Coastguard Worker expectEquals64(-1L, round64(-1.0d)); 118*795d594fSAndroid Build Coastguard Worker expectEquals64(-1L, round64(-0.5000001f)); 119*795d594fSAndroid Build Coastguard Worker expectEquals64(0L, round64(-0.5d)); 120*795d594fSAndroid Build Coastguard Worker expectEquals64(0L, round64(-0.2d)); 121*795d594fSAndroid Build Coastguard Worker expectEquals64(0L, round64(-0.0d)); 122*795d594fSAndroid Build Coastguard Worker expectEquals64(0L, round64(+0.0d)); 123*795d594fSAndroid Build Coastguard Worker expectEquals64(0L, round64(+0.2d)); 124*795d594fSAndroid Build Coastguard Worker expectEquals64(1L, round64(+0.5d)); 125*795d594fSAndroid Build Coastguard Worker expectEquals64(1L, round64(+1.0d)); 126*795d594fSAndroid Build Coastguard Worker expectEquals64(1L, round64(+1.2d)); 127*795d594fSAndroid Build Coastguard Worker expectEquals64(2L, round64(+1.5d)); 128*795d594fSAndroid Build Coastguard Worker expectEquals64(9223372036854775807L, round64(Double.POSITIVE_INFINITY)); 129*795d594fSAndroid Build Coastguard Worker 130*795d594fSAndroid Build Coastguard Worker // Near minlong. 131*795d594fSAndroid Build Coastguard Worker expectEquals64(-9223372036854775808L, 132*795d594fSAndroid Build Coastguard Worker round64(Math.nextAfter(-9223372036854775808.0, Double.NEGATIVE_INFINITY))); 133*795d594fSAndroid Build Coastguard Worker expectEquals64(-9223372036854775808L, round64(-9223372036854775808.0)); 134*795d594fSAndroid Build Coastguard Worker expectEquals64(-9223372036854774784L, 135*795d594fSAndroid Build Coastguard Worker round64(Math.nextAfter(-9223372036854775809.0, Double.POSITIVE_INFINITY))); 136*795d594fSAndroid Build Coastguard Worker 137*795d594fSAndroid Build Coastguard Worker // Near maxlong. 138*795d594fSAndroid Build Coastguard Worker expectEquals64(9223372036854774784L, 139*795d594fSAndroid Build Coastguard Worker round64(Math.nextAfter(9223372036854775808.0, Double.NEGATIVE_INFINITY))); 140*795d594fSAndroid Build Coastguard Worker expectEquals64(9223372036854775807L, round64(9223372036854775808.0)); 141*795d594fSAndroid Build Coastguard Worker expectEquals64(9223372036854775807L, 142*795d594fSAndroid Build Coastguard Worker round64(Math.nextAfter(9223372036854775808.0, Double.POSITIVE_INFINITY))); 143*795d594fSAndroid Build Coastguard Worker 144*795d594fSAndroid Build Coastguard Worker // Some others. 145*795d594fSAndroid Build Coastguard Worker for (long l = -100; l <= 100; ++l) { 146*795d594fSAndroid Build Coastguard Worker expectEquals64(l - 1, round64((double) l - 0.51d)); 147*795d594fSAndroid Build Coastguard Worker expectEquals64(l, round64((double) l - 0.5d)); 148*795d594fSAndroid Build Coastguard Worker expectEquals64(l, round64((double) l)); 149*795d594fSAndroid Build Coastguard Worker expectEquals64(l + 1, round64((double) l + 0.5d)); 150*795d594fSAndroid Build Coastguard Worker expectEquals64(l + 1, round64((double) l + 0.51d)); 151*795d594fSAndroid Build Coastguard Worker } 152*795d594fSAndroid Build Coastguard Worker for (double d = -1.5d; d <= -1.49999999999d; d = Math.nextAfter(d, Double.POSITIVE_INFINITY)) { 153*795d594fSAndroid Build Coastguard Worker expectEquals64(-1L, round64(d)); 154*795d594fSAndroid Build Coastguard Worker } 155*795d594fSAndroid Build Coastguard Worker 156*795d594fSAndroid Build Coastguard Worker // Some harder. 157*795d594fSAndroid Build Coastguard Worker double[] dvals = { 158*795d594fSAndroid Build Coastguard Worker -9007199254740991.5d, 159*795d594fSAndroid Build Coastguard Worker -9007199254740991.0d, 160*795d594fSAndroid Build Coastguard Worker -0.49999999999999997d, 161*795d594fSAndroid Build Coastguard Worker -0.49999999999999994d, 162*795d594fSAndroid Build Coastguard Worker 0.49999999999999994d, 163*795d594fSAndroid Build Coastguard Worker 0.49999999999999997d, 164*795d594fSAndroid Build Coastguard Worker 9007199254740991.0d, 165*795d594fSAndroid Build Coastguard Worker 9007199254740991.5d 166*795d594fSAndroid Build Coastguard Worker }; 167*795d594fSAndroid Build Coastguard Worker long[] lvals = { 168*795d594fSAndroid Build Coastguard Worker -9007199254740992L, 169*795d594fSAndroid Build Coastguard Worker -9007199254740991L, 170*795d594fSAndroid Build Coastguard Worker 0L, 171*795d594fSAndroid Build Coastguard Worker 0L, 172*795d594fSAndroid Build Coastguard Worker 0L, 173*795d594fSAndroid Build Coastguard Worker 0L, 174*795d594fSAndroid Build Coastguard Worker 9007199254740991L, 175*795d594fSAndroid Build Coastguard Worker 9007199254740992L 176*795d594fSAndroid Build Coastguard Worker }; 177*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < dvals.length; i++) { 178*795d594fSAndroid Build Coastguard Worker expectEquals64(lvals[i], round64(dvals[i])); 179*795d594fSAndroid Build Coastguard Worker } 180*795d594fSAndroid Build Coastguard Worker 181*795d594fSAndroid Build Coastguard Worker // A few NaN numbers. 182*795d594fSAndroid Build Coastguard Worker double[] dnans = { 183*795d594fSAndroid Build Coastguard Worker Double.longBitsToDouble(0x7ff0000000000001L), 184*795d594fSAndroid Build Coastguard Worker Double.longBitsToDouble(0x7ff4000000000000L), 185*795d594fSAndroid Build Coastguard Worker Double.longBitsToDouble(0x7ff8000000000000L), 186*795d594fSAndroid Build Coastguard Worker Double.longBitsToDouble(0x7fffffffffffffffL), 187*795d594fSAndroid Build Coastguard Worker Double.longBitsToDouble(0xfff0000000000001L), 188*795d594fSAndroid Build Coastguard Worker Double.longBitsToDouble(0xfff4000000000000L), 189*795d594fSAndroid Build Coastguard Worker Double.longBitsToDouble(0xfff8000000000000L), 190*795d594fSAndroid Build Coastguard Worker Double.longBitsToDouble(0xffffffffffffffffL) 191*795d594fSAndroid Build Coastguard Worker }; 192*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < dnans.length; i++) { 193*795d594fSAndroid Build Coastguard Worker expectEquals64(0L, round64(dnans[i])); 194*795d594fSAndroid Build Coastguard Worker } 195*795d594fSAndroid Build Coastguard Worker 196*795d594fSAndroid Build Coastguard Worker System.out.println("passed"); 197*795d594fSAndroid Build Coastguard Worker } 198*795d594fSAndroid Build Coastguard Worker expectEquals32(int expected, int result)199*795d594fSAndroid Build Coastguard Worker private static void expectEquals32(int expected, int result) { 200*795d594fSAndroid Build Coastguard Worker if (expected != result) { 201*795d594fSAndroid Build Coastguard Worker throw new Error("Expected: " + expected + ", found: " + result); 202*795d594fSAndroid Build Coastguard Worker } 203*795d594fSAndroid Build Coastguard Worker } 204*795d594fSAndroid Build Coastguard Worker expectEquals64(long expected, long result)205*795d594fSAndroid Build Coastguard Worker private static void expectEquals64(long expected, long result) { 206*795d594fSAndroid Build Coastguard Worker if (expected != result) { 207*795d594fSAndroid Build Coastguard Worker throw new Error("Expected: " + expected + ", found: " + result); 208*795d594fSAndroid Build Coastguard Worker } 209*795d594fSAndroid Build Coastguard Worker } 210*795d594fSAndroid Build Coastguard Worker } 211