xref: /aosp_15_r20/art/test/567-checker-builder-intrinsics/src/TestAbs.java (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
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