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 TestSignum { 18*795d594fSAndroid Build Coastguard Worker 19*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestSignum.signByte(byte) builder (after) 20*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Result:i\d+>> Compare 21*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Return [<<Result>>] 22*795d594fSAndroid Build Coastguard Worker 23*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestSignum.signByte(byte) builder (after) 24*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: InvokeStaticOrDirect 25*795d594fSAndroid Build Coastguard Worker signByte(byte x)26*795d594fSAndroid Build Coastguard Worker private static int signByte(byte x) { 27*795d594fSAndroid Build Coastguard Worker return Integer.signum(x); 28*795d594fSAndroid Build Coastguard Worker } 29*795d594fSAndroid Build Coastguard Worker 30*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestSignum.signShort(short) builder (after) 31*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Result:i\d+>> Compare 32*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Return [<<Result>>] 33*795d594fSAndroid Build Coastguard Worker 34*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestSignum.signShort(short) builder (after) 35*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: InvokeStaticOrDirect 36*795d594fSAndroid Build Coastguard Worker signShort(short x)37*795d594fSAndroid Build Coastguard Worker private static int signShort(short x) { 38*795d594fSAndroid Build Coastguard Worker return Integer.signum(x); 39*795d594fSAndroid Build Coastguard Worker } 40*795d594fSAndroid Build Coastguard Worker 41*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestSignum.signChar(char) builder (after) 42*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Result:i\d+>> Compare 43*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Return [<<Result>>] 44*795d594fSAndroid Build Coastguard Worker 45*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestSignum.signChar(char) builder (after) 46*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: InvokeStaticOrDirect 47*795d594fSAndroid Build Coastguard Worker signChar(char x)48*795d594fSAndroid Build Coastguard Worker private static int signChar(char x) { 49*795d594fSAndroid Build Coastguard Worker return Integer.signum(x); 50*795d594fSAndroid Build Coastguard Worker } 51*795d594fSAndroid Build Coastguard Worker 52*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestSignum.signInt(int) builder (after) 53*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Result:i\d+>> Compare 54*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Return [<<Result>>] 55*795d594fSAndroid Build Coastguard Worker 56*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestSignum.signInt(int) builder (after) 57*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: InvokeStaticOrDirect 58*795d594fSAndroid Build Coastguard Worker signInt(int x)59*795d594fSAndroid Build Coastguard Worker private static int signInt(int x) { 60*795d594fSAndroid Build Coastguard Worker return Integer.signum(x); 61*795d594fSAndroid Build Coastguard Worker } 62*795d594fSAndroid Build Coastguard Worker 63*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestSignum.signLong(long) builder (after) 64*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Result:i\d+>> Compare 65*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Return [<<Result>>] 66*795d594fSAndroid Build Coastguard Worker 67*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestSignum.signLong(long) builder (after) 68*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: InvokeStaticOrDirect 69*795d594fSAndroid Build Coastguard Worker signLong(long x)70*795d594fSAndroid Build Coastguard Worker private static int signLong(long x) { 71*795d594fSAndroid Build Coastguard Worker return Long.signum(x); 72*795d594fSAndroid Build Coastguard Worker } 73*795d594fSAndroid Build Coastguard Worker 74*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestSignum.signBoolean(boolean) builder (after) 75*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Zero:i\d+>> IntConstant 0 76*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<One:i\d+>> IntConstant 1 77*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Phi:i\d+>> Phi [<<One>>,<<Zero>>] 78*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Result:i\d+>> Compare [<<Phi>>,<<Zero>>] 79*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Return [<<Result>>] 80*795d594fSAndroid Build Coastguard Worker 81*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestSignum.signBoolean(boolean) builder (after) 82*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: InvokeStaticOrDirect 83*795d594fSAndroid Build Coastguard Worker 84*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestSignum.signBoolean(boolean) select_generator (after) 85*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Arg:z\d+>> ParameterValue 86*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Zero:i\d+>> IntConstant 0 87*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<One:i\d+>> IntConstant 1 88*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Sel:i\d+>> Select [<<Zero>>,<<One>>,<<Arg>>] 89*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Result:i\d+>> Compare [<<Sel>>,<<Zero>>] 90*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Return [<<Result>>] 91*795d594fSAndroid Build Coastguard Worker 92*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestSignum.signBoolean(boolean) select_generator (after) 93*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Phi 94*795d594fSAndroid Build Coastguard Worker 95*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestSignum.signBoolean(boolean) instruction_simplifier$after_gvn (after) 96*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Arg:z\d+>> ParameterValue 97*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Return [<<Arg>>] 98*795d594fSAndroid Build Coastguard Worker 99*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestSignum.signBoolean(boolean) instruction_simplifier$after_gvn (after) 100*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Select 101*795d594fSAndroid Build Coastguard Worker signBoolean(boolean x)102*795d594fSAndroid Build Coastguard Worker private static int signBoolean(boolean x) { 103*795d594fSAndroid Build Coastguard Worker // Note: D8 would replace the ternary expression `x ? 1 : 0` with `x` 104*795d594fSAndroid Build Coastguard Worker // but explicit `if` is preserved. 105*795d594fSAndroid Build Coastguard Worker 106*795d594fSAndroid Build Coastguard Worker // Use `Integer.` here to have the clinit check now instead of later, which would block the 107*795d594fSAndroid Build Coastguard Worker // optimization when run without an image. 108*795d594fSAndroid Build Coastguard Worker int src_x = 0; 109*795d594fSAndroid Build Coastguard Worker if (Integer.signum(src_x) == -1) { 110*795d594fSAndroid Build Coastguard Worker return -1; 111*795d594fSAndroid Build Coastguard Worker } 112*795d594fSAndroid Build Coastguard Worker 113*795d594fSAndroid Build Coastguard Worker if (x) { 114*795d594fSAndroid Build Coastguard Worker src_x = 1; 115*795d594fSAndroid Build Coastguard Worker } else { 116*795d594fSAndroid Build Coastguard Worker src_x = 0; 117*795d594fSAndroid Build Coastguard Worker } 118*795d594fSAndroid Build Coastguard Worker return Integer.signum(src_x); 119*795d594fSAndroid Build Coastguard Worker } 120*795d594fSAndroid Build Coastguard Worker testSignBoolean()121*795d594fSAndroid Build Coastguard Worker public static void testSignBoolean() { 122*795d594fSAndroid Build Coastguard Worker expectEquals(0, signBoolean(false)); 123*795d594fSAndroid Build Coastguard Worker expectEquals(1, signBoolean(true)); 124*795d594fSAndroid Build Coastguard Worker } 125*795d594fSAndroid Build Coastguard Worker testSignByte()126*795d594fSAndroid Build Coastguard Worker public static void testSignByte() { 127*795d594fSAndroid Build Coastguard Worker expectEquals(-1, signByte((byte)Byte.MIN_VALUE)); 128*795d594fSAndroid Build Coastguard Worker expectEquals(-1, signByte((byte)-64)); 129*795d594fSAndroid Build Coastguard Worker expectEquals(-1, signByte((byte)-1)); 130*795d594fSAndroid Build Coastguard Worker expectEquals(0, signByte((byte)0)); 131*795d594fSAndroid Build Coastguard Worker expectEquals(1, signByte((byte)1)); 132*795d594fSAndroid Build Coastguard Worker expectEquals(1, signByte((byte)64)); 133*795d594fSAndroid Build Coastguard Worker expectEquals(1, signByte((byte)Byte.MAX_VALUE)); 134*795d594fSAndroid Build Coastguard Worker } 135*795d594fSAndroid Build Coastguard Worker testSignShort()136*795d594fSAndroid Build Coastguard Worker public static void testSignShort() { 137*795d594fSAndroid Build Coastguard Worker expectEquals(-1, signShort((short)Short.MIN_VALUE)); 138*795d594fSAndroid Build Coastguard Worker expectEquals(-1, signShort((short)-12345)); 139*795d594fSAndroid Build Coastguard Worker expectEquals(-1, signShort((short)-1)); 140*795d594fSAndroid Build Coastguard Worker expectEquals(0, signShort((short)0)); 141*795d594fSAndroid Build Coastguard Worker expectEquals(1, signShort((short)1)); 142*795d594fSAndroid Build Coastguard Worker expectEquals(1, signShort((short)12345)); 143*795d594fSAndroid Build Coastguard Worker expectEquals(1, signShort((short)Short.MAX_VALUE)); 144*795d594fSAndroid Build Coastguard Worker } 145*795d594fSAndroid Build Coastguard Worker testSignChar()146*795d594fSAndroid Build Coastguard Worker public static void testSignChar() { 147*795d594fSAndroid Build Coastguard Worker expectEquals(0, signChar((char)0)); 148*795d594fSAndroid Build Coastguard Worker expectEquals(1, signChar((char)1)); 149*795d594fSAndroid Build Coastguard Worker expectEquals(1, signChar((char)12345)); 150*795d594fSAndroid Build Coastguard Worker expectEquals(1, signChar((char)Character.MAX_VALUE)); 151*795d594fSAndroid Build Coastguard Worker } 152*795d594fSAndroid Build Coastguard Worker testSignInt()153*795d594fSAndroid Build Coastguard Worker public static void testSignInt() { 154*795d594fSAndroid Build Coastguard Worker expectEquals(-1, signInt(Integer.MIN_VALUE)); 155*795d594fSAndroid Build Coastguard Worker expectEquals(-1, signInt(-12345)); 156*795d594fSAndroid Build Coastguard Worker expectEquals(-1, signInt(-1)); 157*795d594fSAndroid Build Coastguard Worker expectEquals(0, signInt(0)); 158*795d594fSAndroid Build Coastguard Worker expectEquals(1, signInt(1)); 159*795d594fSAndroid Build Coastguard Worker expectEquals(1, signInt(12345)); 160*795d594fSAndroid Build Coastguard Worker expectEquals(1, signInt(Integer.MAX_VALUE)); 161*795d594fSAndroid Build Coastguard Worker 162*795d594fSAndroid Build Coastguard Worker for (int i = -11; i <= 11; i++) { 163*795d594fSAndroid Build Coastguard Worker int expected = 0; 164*795d594fSAndroid Build Coastguard Worker if (i < 0) expected = -1; 165*795d594fSAndroid Build Coastguard Worker else if (i > 0) expected = 1; 166*795d594fSAndroid Build Coastguard Worker expectEquals(expected, signInt(i)); 167*795d594fSAndroid Build Coastguard Worker } 168*795d594fSAndroid Build Coastguard Worker } 169*795d594fSAndroid Build Coastguard Worker testSignLong()170*795d594fSAndroid Build Coastguard Worker public static void testSignLong() { 171*795d594fSAndroid Build Coastguard Worker expectEquals(-1, signLong(Long.MIN_VALUE)); 172*795d594fSAndroid Build Coastguard Worker expectEquals(-1, signLong(-12345L)); 173*795d594fSAndroid Build Coastguard Worker expectEquals(-1, signLong(-1L)); 174*795d594fSAndroid Build Coastguard Worker expectEquals(0, signLong(0L)); 175*795d594fSAndroid Build Coastguard Worker expectEquals(1, signLong(1L)); 176*795d594fSAndroid Build Coastguard Worker expectEquals(1, signLong(12345L)); 177*795d594fSAndroid Build Coastguard Worker expectEquals(1, signLong(Long.MAX_VALUE)); 178*795d594fSAndroid Build Coastguard Worker 179*795d594fSAndroid Build Coastguard Worker expectEquals(-1, signLong(0x800000007FFFFFFFL)); 180*795d594fSAndroid Build Coastguard Worker expectEquals(-1, signLong(0x80000000FFFFFFFFL)); 181*795d594fSAndroid Build Coastguard Worker expectEquals(1, signLong(0x000000007FFFFFFFL)); 182*795d594fSAndroid Build Coastguard Worker expectEquals(1, signLong(0x00000000FFFFFFFFL)); 183*795d594fSAndroid Build Coastguard Worker expectEquals(1, signLong(0x7FFFFFFF7FFFFFFFL)); 184*795d594fSAndroid Build Coastguard Worker expectEquals(1, signLong(0x7FFFFFFFFFFFFFFFL)); 185*795d594fSAndroid Build Coastguard Worker 186*795d594fSAndroid Build Coastguard Worker for (long i = -11L; i <= 11L; i++) { 187*795d594fSAndroid Build Coastguard Worker int expected = 0; 188*795d594fSAndroid Build Coastguard Worker if (i < 0) expected = -1; 189*795d594fSAndroid Build Coastguard Worker else if (i > 0) expected = 1; 190*795d594fSAndroid Build Coastguard Worker expectEquals(expected, signLong(i)); 191*795d594fSAndroid Build Coastguard Worker } 192*795d594fSAndroid Build Coastguard Worker 193*795d594fSAndroid Build Coastguard Worker for (long i = Long.MIN_VALUE; i <= Long.MIN_VALUE + 11L; i++) { 194*795d594fSAndroid Build Coastguard Worker expectEquals(-1, signLong(i)); 195*795d594fSAndroid Build Coastguard Worker } 196*795d594fSAndroid Build Coastguard Worker 197*795d594fSAndroid Build Coastguard Worker for (long i = Long.MAX_VALUE; i >= Long.MAX_VALUE - 11L; i--) { 198*795d594fSAndroid Build Coastguard Worker expectEquals(1, signLong(i)); 199*795d594fSAndroid Build Coastguard Worker } 200*795d594fSAndroid Build Coastguard Worker } 201*795d594fSAndroid Build Coastguard Worker 202*795d594fSAndroid Build Coastguard Worker main()203*795d594fSAndroid Build Coastguard Worker public static void main() { 204*795d594fSAndroid Build Coastguard Worker testSignBoolean(); 205*795d594fSAndroid Build Coastguard Worker testSignByte(); 206*795d594fSAndroid Build Coastguard Worker testSignShort(); 207*795d594fSAndroid Build Coastguard Worker testSignChar(); 208*795d594fSAndroid Build Coastguard Worker testSignInt(); 209*795d594fSAndroid Build Coastguard Worker testSignLong(); 210*795d594fSAndroid Build Coastguard Worker 211*795d594fSAndroid Build Coastguard Worker System.out.println("TestSignum passed"); 212*795d594fSAndroid Build Coastguard Worker } 213*795d594fSAndroid Build Coastguard Worker expectEquals(int expected, int result)214*795d594fSAndroid Build Coastguard Worker private static void expectEquals(int expected, int result) { 215*795d594fSAndroid Build Coastguard Worker if (expected != result) { 216*795d594fSAndroid Build Coastguard Worker throw new Error("Expected: " + expected + ", found: " + result); 217*795d594fSAndroid Build Coastguard Worker } 218*795d594fSAndroid Build Coastguard Worker } 219*795d594fSAndroid Build Coastguard Worker } 220