1*795d594fSAndroid Build Coastguard Worker /* 2*795d594fSAndroid Build Coastguard Worker * Copyright (C) 2018 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 /** 18*795d594fSAndroid Build Coastguard Worker * Functional tests for detecting abs. 19*795d594fSAndroid Build Coastguard Worker */ 20*795d594fSAndroid Build Coastguard Worker public class TestAbs { 21*795d594fSAndroid Build Coastguard Worker 22*795d594fSAndroid Build Coastguard Worker // 23*795d594fSAndroid Build Coastguard Worker // Intrinsics. 24*795d594fSAndroid Build Coastguard Worker // 25*795d594fSAndroid Build Coastguard Worker 26*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestAbs.absI(int) builder (after) 27*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Par:i\d+>> ParameterValue 28*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Abs:i\d+>> Abs [<<Par>>] 29*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Return [<<Abs>>] 30*795d594fSAndroid Build Coastguard Worker // 31*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestAbs.absI(int) builder (after) 32*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: InvokeStaticOrDirect absI(int a)33*795d594fSAndroid Build Coastguard Worker public static int absI(int a) { 34*795d594fSAndroid Build Coastguard Worker return Math.abs(a); 35*795d594fSAndroid Build Coastguard Worker } 36*795d594fSAndroid Build Coastguard Worker 37*795d594fSAndroid Build Coastguard Worker /// CHECK-START: long TestAbs.absL(long) builder (after) 38*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Par:j\d+>> ParameterValue 39*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Abs:j\d+>> Abs [<<Par>>] 40*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Return [<<Abs>>] 41*795d594fSAndroid Build Coastguard Worker // 42*795d594fSAndroid Build Coastguard Worker /// CHECK-START: long TestAbs.absL(long) builder (after) 43*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: InvokeStaticOrDirect absL(long a)44*795d594fSAndroid Build Coastguard Worker public static long absL(long a) { 45*795d594fSAndroid Build Coastguard Worker return Math.abs(a); 46*795d594fSAndroid Build Coastguard Worker } 47*795d594fSAndroid Build Coastguard Worker 48*795d594fSAndroid Build Coastguard Worker // 49*795d594fSAndroid Build Coastguard Worker // Types. 50*795d594fSAndroid Build Coastguard Worker // 51*795d594fSAndroid Build Coastguard Worker 52*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestAbs.abs1(int) instruction_simplifier$after_gvn (before) 53*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Par:i\d+>> ParameterValue 54*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Zer:i\d+>> IntConstant 0 55*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Cnd:z\d+>> GreaterThanOrEqual [<<Par>>,<<Zer>>] 56*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Neg:i\d+>> [<<Par>>] 57*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Sel:i\d+>> Select [<<Neg>>,<<Par>>,<<Cnd>>] 58*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Return [<<Sel>>] 59*795d594fSAndroid Build Coastguard Worker // 60*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestAbs.abs1(int) instruction_simplifier$after_gvn (after) 61*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Par:i\d+>> ParameterValue 62*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Abs:i\d+>> Abs [<<Par>>] 63*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Return [<<Abs>>] 64*795d594fSAndroid Build Coastguard Worker // 65*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestAbs.abs1(int) instruction_simplifier$after_gvn (after) 66*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Select abs1(int a)67*795d594fSAndroid Build Coastguard Worker public static int abs1(int a) { 68*795d594fSAndroid Build Coastguard Worker return a < 0 ? -a : a; 69*795d594fSAndroid Build Coastguard Worker } 70*795d594fSAndroid Build Coastguard Worker 71*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestAbs.abs2(int) instruction_simplifier$after_gvn (before) 72*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Par:i\d+>> ParameterValue 73*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Zer:i\d+>> IntConstant 0 74*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Cnd:z\d+>> GreaterThan [<<Par>>,<<Zer>>] 75*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Neg:i\d+>> [<<Par>>] 76*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Sel:i\d+>> Select [<<Neg>>,<<Par>>,<<Cnd>>] 77*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Return [<<Sel>>] 78*795d594fSAndroid Build Coastguard Worker // 79*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestAbs.abs2(int) instruction_simplifier$after_gvn (after) 80*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Par:i\d+>> ParameterValue 81*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Abs:i\d+>> Abs [<<Par>>] 82*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Return [<<Abs>>] 83*795d594fSAndroid Build Coastguard Worker // 84*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestAbs.abs2(int) instruction_simplifier$after_gvn (after) 85*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Select abs2(int a)86*795d594fSAndroid Build Coastguard Worker public static int abs2(int a) { 87*795d594fSAndroid Build Coastguard Worker return a <= 0 ? -a : a; 88*795d594fSAndroid Build Coastguard Worker } 89*795d594fSAndroid Build Coastguard Worker 90*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestAbs.abs3(int) instruction_simplifier$after_gvn (before) 91*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Par:i\d+>> ParameterValue 92*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Zer:i\d+>> IntConstant 0 93*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Cnd:z\d+>> LessThanOrEqual [<<Par>>,<<Zer>>] 94*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Neg:i\d+>> [<<Par>>] 95*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Sel:i\d+>> Select [<<Par>>,<<Neg>>,<<Cnd>>] 96*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Return [<<Sel>>] 97*795d594fSAndroid Build Coastguard Worker // 98*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestAbs.abs3(int) instruction_simplifier$after_gvn (after) 99*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Par:i\d+>> ParameterValue 100*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Abs:i\d+>> Abs [<<Par>>] 101*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Return [<<Abs>>] 102*795d594fSAndroid Build Coastguard Worker // 103*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestAbs.abs3(int) instruction_simplifier$after_gvn (after) 104*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Select abs3(int a)105*795d594fSAndroid Build Coastguard Worker public static int abs3(int a) { 106*795d594fSAndroid Build Coastguard Worker return a > 0 ? a : -a; 107*795d594fSAndroid Build Coastguard Worker } 108*795d594fSAndroid Build Coastguard Worker 109*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestAbs.abs4(int) instruction_simplifier$after_gvn (before) 110*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Par:i\d+>> ParameterValue 111*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Zer:i\d+>> IntConstant 0 112*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Cnd:z\d+>> LessThan [<<Par>>,<<Zer>>] 113*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Neg:i\d+>> [<<Par>>] 114*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Sel:i\d+>> Select [<<Par>>,<<Neg>>,<<Cnd>>] 115*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Return [<<Sel>>] 116*795d594fSAndroid Build Coastguard Worker // 117*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestAbs.abs4(int) instruction_simplifier$after_gvn (after) 118*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Par:i\d+>> ParameterValue 119*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Abs:i\d+>> Abs [<<Par>>] 120*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Return [<<Abs>>] 121*795d594fSAndroid Build Coastguard Worker // 122*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestAbs.abs4(int) instruction_simplifier$after_gvn (after) 123*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Select abs4(int a)124*795d594fSAndroid Build Coastguard Worker public static int abs4(int a) { 125*795d594fSAndroid Build Coastguard Worker return a >= 0 ? a : -a; 126*795d594fSAndroid Build Coastguard Worker } 127*795d594fSAndroid Build Coastguard Worker 128*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestAbs.abs5(short) instruction_simplifier$after_gvn (before) 129*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Par:s\d+>> ParameterValue 130*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Zer:i\d+>> IntConstant 0 131*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Cnd:z\d+>> LessThan [<<Par>>,<<Zer>>] 132*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Neg:i\d+>> [<<Par>>] 133*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Sel:i\d+>> Select [<<Par>>,<<Neg>>,<<Cnd>>] 134*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Return [<<Sel>>] 135*795d594fSAndroid Build Coastguard Worker // 136*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestAbs.abs5(short) instruction_simplifier$after_gvn (after) 137*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Par:s\d+>> ParameterValue 138*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Abs:i\d+>> Abs [<<Par>>] 139*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Return [<<Abs>>] 140*795d594fSAndroid Build Coastguard Worker // 141*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestAbs.abs5(short) instruction_simplifier$after_gvn (after) 142*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Select abs5(short a)143*795d594fSAndroid Build Coastguard Worker public static int abs5(short a) { 144*795d594fSAndroid Build Coastguard Worker return a >= 0 ? a : -a; 145*795d594fSAndroid Build Coastguard Worker } 146*795d594fSAndroid Build Coastguard Worker 147*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestAbs.abs6(byte) instruction_simplifier$after_gvn (before) 148*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Par:b\d+>> ParameterValue 149*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Zer:i\d+>> IntConstant 0 150*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Cnd:z\d+>> LessThan [<<Par>>,<<Zer>>] 151*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Neg:i\d+>> [<<Par>>] 152*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Sel:i\d+>> Select [<<Par>>,<<Neg>>,<<Cnd>>] 153*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Return [<<Sel>>] 154*795d594fSAndroid Build Coastguard Worker // 155*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestAbs.abs6(byte) instruction_simplifier$after_gvn (after) 156*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Par:b\d+>> ParameterValue 157*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Abs:i\d+>> Abs [<<Par>>] 158*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Return [<<Abs>>] 159*795d594fSAndroid Build Coastguard Worker // 160*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestAbs.abs6(byte) instruction_simplifier$after_gvn (after) 161*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Select abs6(byte a)162*795d594fSAndroid Build Coastguard Worker public static int abs6(byte a) { 163*795d594fSAndroid Build Coastguard Worker return a >= 0 ? a : -a; 164*795d594fSAndroid Build Coastguard Worker } 165*795d594fSAndroid Build Coastguard Worker 166*795d594fSAndroid Build Coastguard Worker /// CHECK-START: long TestAbs.abs7(long) instruction_simplifier$after_gvn (before) 167*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Par:j\d+>> ParameterValue 168*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Zer:j\d+>> LongConstant 0 169*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Cnd:z\d+>> LessThan [<<Par>>,<<Zer>>] 170*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Neg:j\d+>> [<<Par>>] 171*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Sel:j\d+>> Select [<<Par>>,<<Neg>>,<<Cnd>>] 172*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Return [<<Sel>>] 173*795d594fSAndroid Build Coastguard Worker // 174*795d594fSAndroid Build Coastguard Worker /// CHECK-START: long TestAbs.abs7(long) instruction_simplifier$after_gvn (after) 175*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Par:j\d+>> ParameterValue 176*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Abs:j\d+>> Abs [<<Par>>] 177*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Return [<<Abs>>] 178*795d594fSAndroid Build Coastguard Worker // 179*795d594fSAndroid Build Coastguard Worker /// CHECK-START: long TestAbs.abs7(long) instruction_simplifier$after_gvn (after) 180*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Select abs7(long a)181*795d594fSAndroid Build Coastguard Worker public static long abs7(long a) { 182*795d594fSAndroid Build Coastguard Worker return a >= 0 ? a : -a; 183*795d594fSAndroid Build Coastguard Worker } 184*795d594fSAndroid Build Coastguard Worker 185*795d594fSAndroid Build Coastguard Worker // 186*795d594fSAndroid Build Coastguard Worker // Complications. 187*795d594fSAndroid Build Coastguard Worker // 188*795d594fSAndroid Build Coastguard Worker 189*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestAbs.abs0(int[]) instruction_simplifier$after_gvn (before) 190*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Zer:i\d+>> IntConstant 0 191*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Arr:i\d+>> ArrayGet [{{l\d+}},{{i\d+}}] 192*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Cnd:z\d+>> LessThan [<<Arr>>,<<Zer>>] 193*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Neg:i\d+>> [<<Arr>>] 194*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Sel:i\d+>> Select [<<Arr>>,<<Neg>>,<<Cnd>>] 195*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Return [<<Sel>>] 196*795d594fSAndroid Build Coastguard Worker // 197*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestAbs.abs0(int[]) instruction_simplifier$after_gvn (after) 198*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Arr:i\d+>> ArrayGet [{{l\d+}},{{i\d+}}] 199*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Abs:i\d+>> Abs [<<Arr>>] 200*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Return [<<Abs>>] 201*795d594fSAndroid Build Coastguard Worker // 202*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestAbs.abs0(int[]) instruction_simplifier$after_gvn (after) 203*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Select abs0(int[] a)204*795d594fSAndroid Build Coastguard Worker public static int abs0(int[] a) { 205*795d594fSAndroid Build Coastguard Worker return a[0] >= 0 ? a[0] : -a[0]; 206*795d594fSAndroid Build Coastguard Worker } 207*795d594fSAndroid Build Coastguard Worker 208*795d594fSAndroid Build Coastguard Worker // 209*795d594fSAndroid Build Coastguard Worker // Nop zero extension. 210*795d594fSAndroid Build Coastguard Worker // 211*795d594fSAndroid Build Coastguard Worker 212*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestAbs.zabs1(byte) instruction_simplifier (before) 213*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Par:b\d+>> ParameterValue 214*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Msk:i\d+>> IntConstant 255 215*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<And:i\d+>> [<<Par>>,<<Msk>>] 216*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Abs:i\d+>> Abs 217*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Return [<<Abs>>] 218*795d594fSAndroid Build Coastguard Worker // 219*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestAbs.zabs1(byte) instruction_simplifier (after) 220*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Par:b\d+>> ParameterValue 221*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Cnv:a\d+>> TypeConversion [<<Par>>] 222*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Return [<<Cnv>>] 223*795d594fSAndroid Build Coastguard Worker // 224*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestAbs.zabs1(byte) instruction_simplifier (after) 225*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Abs zabs1(byte a)226*795d594fSAndroid Build Coastguard Worker public static int zabs1(byte a) { 227*795d594fSAndroid Build Coastguard Worker return Math.abs(a & 0xff); 228*795d594fSAndroid Build Coastguard Worker } 229*795d594fSAndroid Build Coastguard Worker 230*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestAbs.zabs2(short) instruction_simplifier (before) 231*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Par:s\d+>> ParameterValue 232*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Msk:i\d+>> IntConstant 65535 233*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<And:i\d+>> [<<Msk>>,<<Par>>] 234*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Abs:i\d+>> Abs 235*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Return [<<Abs>>] 236*795d594fSAndroid Build Coastguard Worker // 237*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestAbs.zabs2(short) instruction_simplifier (after) 238*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Par:s\d+>> ParameterValue 239*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Cnv:c\d+>> TypeConversion [<<Par>>] 240*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Return [<<Cnv>>] 241*795d594fSAndroid Build Coastguard Worker // 242*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestAbs.zabs2(short) instruction_simplifier (after) 243*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Abs zabs2(short a)244*795d594fSAndroid Build Coastguard Worker public static int zabs2(short a) { 245*795d594fSAndroid Build Coastguard Worker return Math.abs(a & 0xffff); 246*795d594fSAndroid Build Coastguard Worker } 247*795d594fSAndroid Build Coastguard Worker 248*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestAbs.zabs3(char) instruction_simplifier (before) 249*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Par:c\d+>> ParameterValue 250*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Abs:i\d+>> Abs 251*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Return [<<Abs>>] 252*795d594fSAndroid Build Coastguard Worker // 253*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestAbs.zabs3(char) instruction_simplifier (after) 254*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Par:c\d+>> ParameterValue 255*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Return [<<Par>>] 256*795d594fSAndroid Build Coastguard Worker // 257*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestAbs.zabs3(char) instruction_simplifier (after) 258*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Abs zabs3(char a)259*795d594fSAndroid Build Coastguard Worker public static int zabs3(char a) { 260*795d594fSAndroid Build Coastguard Worker return Math.abs(a); 261*795d594fSAndroid Build Coastguard Worker } 262*795d594fSAndroid Build Coastguard Worker main()263*795d594fSAndroid Build Coastguard Worker public static void main() { 264*795d594fSAndroid Build Coastguard Worker // Intrinsics. 265*795d594fSAndroid Build Coastguard Worker expectEquals(10, absI(-10)); 266*795d594fSAndroid Build Coastguard Worker expectEquals(20, absI(20)); 267*795d594fSAndroid Build Coastguard Worker expectEquals(10L, absL(-10L)); 268*795d594fSAndroid Build Coastguard Worker expectEquals(20L, absL(20L)); 269*795d594fSAndroid Build Coastguard Worker // Types. 270*795d594fSAndroid Build Coastguard Worker expectEquals(10, abs1(-10)); 271*795d594fSAndroid Build Coastguard Worker expectEquals(20, abs1(20)); 272*795d594fSAndroid Build Coastguard Worker expectEquals(10, abs2(-10)); 273*795d594fSAndroid Build Coastguard Worker expectEquals(20, abs2(20)); 274*795d594fSAndroid Build Coastguard Worker expectEquals(10, abs3(-10)); 275*795d594fSAndroid Build Coastguard Worker expectEquals(20, abs3(20)); 276*795d594fSAndroid Build Coastguard Worker expectEquals(10, abs4(-10)); 277*795d594fSAndroid Build Coastguard Worker expectEquals(20, abs4(20)); 278*795d594fSAndroid Build Coastguard Worker expectEquals(10, abs4((short) -10)); 279*795d594fSAndroid Build Coastguard Worker expectEquals(20, abs4((short) 20)); 280*795d594fSAndroid Build Coastguard Worker expectEquals(10, abs6((byte) -10)); 281*795d594fSAndroid Build Coastguard Worker expectEquals(20, abs6((byte) 20)); 282*795d594fSAndroid Build Coastguard Worker expectEquals(10L, abs7(-10L)); 283*795d594fSAndroid Build Coastguard Worker expectEquals(20L, abs7(20L)); 284*795d594fSAndroid Build Coastguard Worker // Complications. 285*795d594fSAndroid Build Coastguard Worker int[] a = { 13 }; 286*795d594fSAndroid Build Coastguard Worker int[] b = { -11 }; 287*795d594fSAndroid Build Coastguard Worker expectEquals(13, abs0(a)); 288*795d594fSAndroid Build Coastguard Worker expectEquals(11, abs0(b)); 289*795d594fSAndroid Build Coastguard Worker // Nop zero extension. 290*795d594fSAndroid Build Coastguard Worker expectEquals(1, zabs1((byte) 1)); 291*795d594fSAndroid Build Coastguard Worker expectEquals(0xff, zabs1((byte) -1)); 292*795d594fSAndroid Build Coastguard Worker expectEquals(1, zabs2((short) 1)); 293*795d594fSAndroid Build Coastguard Worker expectEquals(0xffff, zabs2((short) -1)); 294*795d594fSAndroid Build Coastguard Worker expectEquals(1, zabs3((char) 1)); 295*795d594fSAndroid Build Coastguard Worker expectEquals(0xffff, zabs3((char) -1)); 296*795d594fSAndroid Build Coastguard Worker System.out.println("TestAbs passed"); 297*795d594fSAndroid Build Coastguard Worker } 298*795d594fSAndroid Build Coastguard Worker expectEquals(int expected, int result)299*795d594fSAndroid Build Coastguard Worker private static void expectEquals(int expected, int result) { 300*795d594fSAndroid Build Coastguard Worker if (expected != result) { 301*795d594fSAndroid Build Coastguard Worker throw new Error("Expected: " + expected + ", found: " + result); 302*795d594fSAndroid Build Coastguard Worker } 303*795d594fSAndroid Build Coastguard Worker } 304*795d594fSAndroid Build Coastguard Worker expectEquals(long expected, long result)305*795d594fSAndroid Build Coastguard Worker private static void expectEquals(long expected, long result) { 306*795d594fSAndroid Build Coastguard Worker if (expected != result) { 307*795d594fSAndroid Build Coastguard Worker throw new Error("Expected: " + expected + ", found: " + result); 308*795d594fSAndroid Build Coastguard Worker } 309*795d594fSAndroid Build Coastguard Worker } 310*795d594fSAndroid Build Coastguard Worker } 311