12a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik/* 22a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik * Copyright (C) 2016 The Android Open Source Project 32a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik * 42a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik * Licensed under the Apache License, Version 2.0 (the "License"); 52a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik * you may not use this file except in compliance with the License. 62a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik * You may obtain a copy of the License at 72a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik * 82a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik * http://www.apache.org/licenses/LICENSE-2.0 92a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik * 102a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik * Unless required by applicable law or agreed to in writing, software 112a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik * distributed under the License is distributed on an "AS IS" BASIS, 122a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik * See the License for the specific language governing permissions and 142a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik * limitations under the License. 152a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik */ 162a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik 172a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bikpublic class Main { 182a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik 192a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik /// CHECK-START: int Main.f2int(float) instruction_simplifier (before) 202a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik /// CHECK-DAG: <<Result:i\d+>> InvokeStaticOrDirect intrinsic:FloatFloatToIntBits 212a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik /// CHECK-DAG: Return [<<Result>>] 222a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik // 232a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik /// CHECK-START: int Main.f2int(float) instruction_simplifier (after) 2420adf2776c2d81facf7c5ba3f82f27d4ee58340dGoran Jakovljevic // Note: The ArtMethod* (typed as int or long) is optional after sharpening. 2520adf2776c2d81facf7c5ba3f82f27d4ee58340dGoran Jakovljevic /// CHECK-DAG: <<Raw:i\d+>> InvokeStaticOrDirect [<<Arg:f\d+>>{{(,[ij]\d+)?}}] intrinsic:FloatFloatToRawIntBits 262a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik /// CHECK-DAG: <<Cond:z\d+>> NotEqual [<<Arg>>,<<Arg>>] 272a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik /// CHECK-DAG: <<Result:i\d+>> Select [<<Raw>>,{{i\d+}},<<Cond>>] 282a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik /// CHECK-DAG: Return [<<Result>>] 292a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik private static int f2int(float f) { 302a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik return Float.floatToIntBits(f); 312a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik } 322a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik 332a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik /// CHECK-START: long Main.d2long(double) instruction_simplifier (before) 342a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik /// CHECK-DAG: <<Result:j\d+>> InvokeStaticOrDirect intrinsic:DoubleDoubleToLongBits 352a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik /// CHECK-DAG: Return [<<Result>>] 362a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik // 372a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik /// CHECK-START: long Main.d2long(double) instruction_simplifier (after) 3820adf2776c2d81facf7c5ba3f82f27d4ee58340dGoran Jakovljevic // Note: The ArtMethod* (typed as int or long) is optional after sharpening. 3920adf2776c2d81facf7c5ba3f82f27d4ee58340dGoran Jakovljevic /// CHECK-DAG: <<Raw:j\d+>> InvokeStaticOrDirect [<<Arg:d\d+>>{{(,[ij]\d+)?}}] intrinsic:DoubleDoubleToRawLongBits 402a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik /// CHECK-DAG: <<Cond:z\d+>> NotEqual [<<Arg>>,<<Arg>>] 412a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik /// CHECK-DAG: <<Result:j\d+>> Select [<<Raw>>,{{j\d+}},<<Cond>>] 422a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik /// CHECK-DAG: Return [<<Result>>] 432a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik private static long d2long(double d) { 442a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik return Double.doubleToLongBits(d); 452a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik } 462a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik 472a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik public static void main(String args[]) { 482a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik // A few distinct numbers. 492a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik expectEquals32(0xff800000, f2int(Float.NEGATIVE_INFINITY)); 502a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik expectEquals32(0xbf800000, f2int(-1.0f)); 512a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik expectEquals32(0x80000000, f2int(-0.0f)); 522a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik expectEquals32(0x00000000, f2int(+0.0f)); 532a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik expectEquals32(0x3f800000, f2int(+1.0f)); 542a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik expectEquals32(0x7f800000, f2int(Float.POSITIVE_INFINITY)); 552a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik 562a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik // A few others. 572a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik for (int i = 0; i <= 100; i++) { 582a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik expectEquals32(i, f2int(Float.intBitsToFloat(i))); 592a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik } 602a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik 612a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik // A few NaN numbers. 622a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik float[] fvals = { 632a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik Float.intBitsToFloat(0x7f800001), 642a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik Float.intBitsToFloat(0x7fa00000), 652a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik Float.intBitsToFloat(0x7fc00000), 662a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik Float.intBitsToFloat(0x7fffffff), 672a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik Float.intBitsToFloat(0xff800001), 682a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik Float.intBitsToFloat(0xffa00000), 692a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik Float.intBitsToFloat(0xffc00000), 702a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik Float.intBitsToFloat(0xffffffff) 712a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik }; 722a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik for (int i = 0; i < fvals.length; i++) { 732a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik expectEquals32(0x7fc00000, f2int(fvals[i])); 742a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik } 752a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik 762a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik // A few distinct numbers. 772a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik expectEquals64(0xfff0000000000000L, d2long(Double.NEGATIVE_INFINITY)); 782a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik expectEquals64(0xbff0000000000000L, d2long(-1.0d)); 792a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik expectEquals64(0x8000000000000000L, d2long(-0.0d)); 802a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik expectEquals64(0x0000000000000000L, d2long(+0.0d)); 812a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik expectEquals64(0x3ff0000000000000L, d2long(+1.0d)); 822a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik expectEquals64(0x7ff0000000000000L, d2long(Double.POSITIVE_INFINITY)); 832a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik 842a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik // A few others. 852a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik for (long l = 0; l <= 100; l++) { 862a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik expectEquals64(l, d2long(Double.longBitsToDouble(l))); 872a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik } 882a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik 892a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik // A few NaN numbers. 902a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik double[] dvals = { 912a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik Double.longBitsToDouble(0x7ff0000000000001L), 922a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik Double.longBitsToDouble(0x7ff4000000000000L), 932a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik Double.longBitsToDouble(0x7ff8000000000000L), 942a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik Double.longBitsToDouble(0x7fffffffffffffffL), 952a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik Double.longBitsToDouble(0xfff0000000000001L), 962a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik Double.longBitsToDouble(0xfff4000000000000L), 972a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik Double.longBitsToDouble(0xfff8000000000000L), 982a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik Double.longBitsToDouble(0xffffffffffffffffL) 992a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik }; 1002a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik for (int i = 0; i < dvals.length; i++) { 1012a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik expectEquals64(0x7ff8000000000000L, d2long(dvals[i])); 1022a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik } 1032a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik 1042a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik System.out.println("passed"); 1052a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik } 1062a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik 1072a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik private static void expectEquals32(int expected, int result) { 1082a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik if (expected != result) { 1092a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik throw new Error("Expected: " 1102a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik + Integer.toHexString(expected) 1112a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik + ", found: " 1122a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik + Integer.toHexString(result)); 1132a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik } 1142a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik } 1152a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik 1162a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik private static void expectEquals64(long expected, long result) { 1172a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik if (expected != result) { 1182a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik throw new Error("Expected: " 1192a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik + Long.toHexString(expected) 1202a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik + ", found: " 1212a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik + Long.toHexString(result)); 1222a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik } 1232a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik } 1242a6aad9d388bd29bff04aeec3eb9429d436d1873Aart Bik} 125