blob: defc988f096bfcc7db5c9b68c1a8fcdaecab084b [file] [log] [blame]
Aart Bik2286da22018-03-22 10:50:22 -07001/*
2 * Copyright (C) 2018 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17/**
18 * Functional tests for detecting abs.
19 */
Vladimir Markoc2a769d2020-04-21 18:06:43 +010020public class TestAbs {
Aart Bik2286da22018-03-22 10:50:22 -070021
Aart Bik6d057002018-04-09 15:39:58 -070022 //
23 // Intrinsics.
24 //
25
Vladimir Markoc2a769d2020-04-21 18:06:43 +010026 /// CHECK-START: int TestAbs.absI(int) builder (after)
Aart Bikc6eec4b2018-03-29 17:22:00 -070027 /// CHECK-DAG: <<Par:i\d+>> ParameterValue
28 /// CHECK-DAG: <<Abs:i\d+>> Abs [<<Par>>]
29 /// CHECK-DAG: Return [<<Abs>>]
30 //
Vladimir Markoc2a769d2020-04-21 18:06:43 +010031 /// CHECK-START: int TestAbs.absI(int) builder (after)
Aart Bikc6eec4b2018-03-29 17:22:00 -070032 /// CHECK-NOT: InvokeStaticOrDirect
33 public static int absI(int a) {
34 return Math.abs(a);
35 }
36
Vladimir Markoc2a769d2020-04-21 18:06:43 +010037 /// CHECK-START: long TestAbs.absL(long) builder (after)
Aart Bikc6eec4b2018-03-29 17:22:00 -070038 /// CHECK-DAG: <<Par:j\d+>> ParameterValue
39 /// CHECK-DAG: <<Abs:j\d+>> Abs [<<Par>>]
40 /// CHECK-DAG: Return [<<Abs>>]
41 //
Vladimir Markoc2a769d2020-04-21 18:06:43 +010042 /// CHECK-START: long TestAbs.absL(long) builder (after)
Aart Bikc6eec4b2018-03-29 17:22:00 -070043 /// CHECK-NOT: InvokeStaticOrDirect
44 public static long absL(long a) {
45 return Math.abs(a);
46 }
47
Aart Bik6d057002018-04-09 15:39:58 -070048 //
49 // Types.
50 //
51
Vladimir Markoc2a769d2020-04-21 18:06:43 +010052 /// CHECK-START: int TestAbs.abs1(int) instruction_simplifier$after_gvn (before)
Aart Bik2286da22018-03-22 10:50:22 -070053 /// CHECK-DAG: <<Par:i\d+>> ParameterValue
54 /// CHECK-DAG: <<Zer:i\d+>> IntConstant 0
55 /// CHECK-DAG: <<Cnd:z\d+>> GreaterThanOrEqual [<<Par>>,<<Zer>>]
56 /// CHECK-DAG: <<Neg:i\d+>> [<<Par>>]
57 /// CHECK-DAG: <<Sel:i\d+>> Select [<<Neg>>,<<Par>>,<<Cnd>>]
58 /// CHECK-DAG: Return [<<Sel>>]
59 //
Vladimir Markoc2a769d2020-04-21 18:06:43 +010060 /// CHECK-START: int TestAbs.abs1(int) instruction_simplifier$after_gvn (after)
Aart Bik2286da22018-03-22 10:50:22 -070061 /// CHECK-DAG: <<Par:i\d+>> ParameterValue
62 /// CHECK-DAG: <<Abs:i\d+>> Abs [<<Par>>]
63 /// CHECK-DAG: Return [<<Abs>>]
64 //
Vladimir Markoc2a769d2020-04-21 18:06:43 +010065 /// CHECK-START: int TestAbs.abs1(int) instruction_simplifier$after_gvn (after)
Aart Bik2286da22018-03-22 10:50:22 -070066 /// CHECK-NOT: Select
67 public static int abs1(int a) {
68 return a < 0 ? -a : a;
69 }
70
Vladimir Markoc2a769d2020-04-21 18:06:43 +010071 /// CHECK-START: int TestAbs.abs2(int) instruction_simplifier$after_gvn (before)
Aart Bik2286da22018-03-22 10:50:22 -070072 /// CHECK-DAG: <<Par:i\d+>> ParameterValue
73 /// CHECK-DAG: <<Zer:i\d+>> IntConstant 0
74 /// CHECK-DAG: <<Cnd:z\d+>> GreaterThan [<<Par>>,<<Zer>>]
75 /// CHECK-DAG: <<Neg:i\d+>> [<<Par>>]
76 /// CHECK-DAG: <<Sel:i\d+>> Select [<<Neg>>,<<Par>>,<<Cnd>>]
77 /// CHECK-DAG: Return [<<Sel>>]
78 //
Vladimir Markoc2a769d2020-04-21 18:06:43 +010079 /// CHECK-START: int TestAbs.abs2(int) instruction_simplifier$after_gvn (after)
Aart Bik2286da22018-03-22 10:50:22 -070080 /// CHECK-DAG: <<Par:i\d+>> ParameterValue
81 /// CHECK-DAG: <<Abs:i\d+>> Abs [<<Par>>]
82 /// CHECK-DAG: Return [<<Abs>>]
83 //
Vladimir Markoc2a769d2020-04-21 18:06:43 +010084 /// CHECK-START: int TestAbs.abs2(int) instruction_simplifier$after_gvn (after)
Aart Bik2286da22018-03-22 10:50:22 -070085 /// CHECK-NOT: Select
86 public static int abs2(int a) {
87 return a <= 0 ? -a : a;
88 }
89
Vladimir Markoc2a769d2020-04-21 18:06:43 +010090 /// CHECK-START: int TestAbs.abs3(int) instruction_simplifier$after_gvn (before)
Aart Bik2286da22018-03-22 10:50:22 -070091 /// CHECK-DAG: <<Par:i\d+>> ParameterValue
92 /// CHECK-DAG: <<Zer:i\d+>> IntConstant 0
93 /// CHECK-DAG: <<Cnd:z\d+>> LessThanOrEqual [<<Par>>,<<Zer>>]
94 /// CHECK-DAG: <<Neg:i\d+>> [<<Par>>]
95 /// CHECK-DAG: <<Sel:i\d+>> Select [<<Par>>,<<Neg>>,<<Cnd>>]
96 /// CHECK-DAG: Return [<<Sel>>]
97 //
Vladimir Markoc2a769d2020-04-21 18:06:43 +010098 /// CHECK-START: int TestAbs.abs3(int) instruction_simplifier$after_gvn (after)
Aart Bik2286da22018-03-22 10:50:22 -070099 /// CHECK-DAG: <<Par:i\d+>> ParameterValue
100 /// CHECK-DAG: <<Abs:i\d+>> Abs [<<Par>>]
101 /// CHECK-DAG: Return [<<Abs>>]
102 //
Vladimir Markoc2a769d2020-04-21 18:06:43 +0100103 /// CHECK-START: int TestAbs.abs3(int) instruction_simplifier$after_gvn (after)
Aart Bik2286da22018-03-22 10:50:22 -0700104 /// CHECK-NOT: Select
105 public static int abs3(int a) {
106 return a > 0 ? a : -a;
107 }
108
Vladimir Markoc2a769d2020-04-21 18:06:43 +0100109 /// CHECK-START: int TestAbs.abs4(int) instruction_simplifier$after_gvn (before)
Aart Bik2286da22018-03-22 10:50:22 -0700110 /// CHECK-DAG: <<Par:i\d+>> ParameterValue
111 /// CHECK-DAG: <<Zer:i\d+>> IntConstant 0
112 /// CHECK-DAG: <<Cnd:z\d+>> LessThan [<<Par>>,<<Zer>>]
113 /// CHECK-DAG: <<Neg:i\d+>> [<<Par>>]
114 /// CHECK-DAG: <<Sel:i\d+>> Select [<<Par>>,<<Neg>>,<<Cnd>>]
115 /// CHECK-DAG: Return [<<Sel>>]
116 //
Vladimir Markoc2a769d2020-04-21 18:06:43 +0100117 /// CHECK-START: int TestAbs.abs4(int) instruction_simplifier$after_gvn (after)
Aart Bik2286da22018-03-22 10:50:22 -0700118 /// CHECK-DAG: <<Par:i\d+>> ParameterValue
119 /// CHECK-DAG: <<Abs:i\d+>> Abs [<<Par>>]
120 /// CHECK-DAG: Return [<<Abs>>]
121 //
Vladimir Markoc2a769d2020-04-21 18:06:43 +0100122 /// CHECK-START: int TestAbs.abs4(int) instruction_simplifier$after_gvn (after)
Aart Bik2286da22018-03-22 10:50:22 -0700123 /// CHECK-NOT: Select
124 public static int abs4(int a) {
125 return a >= 0 ? a : -a;
126 }
127
Vladimir Markoc2a769d2020-04-21 18:06:43 +0100128 /// CHECK-START: int TestAbs.abs5(short) instruction_simplifier$after_gvn (before)
Aart Bik2286da22018-03-22 10:50:22 -0700129 /// CHECK-DAG: <<Par:s\d+>> ParameterValue
130 /// CHECK-DAG: <<Zer:i\d+>> IntConstant 0
131 /// CHECK-DAG: <<Cnd:z\d+>> LessThan [<<Par>>,<<Zer>>]
132 /// CHECK-DAG: <<Neg:i\d+>> [<<Par>>]
133 /// CHECK-DAG: <<Sel:i\d+>> Select [<<Par>>,<<Neg>>,<<Cnd>>]
134 /// CHECK-DAG: Return [<<Sel>>]
135 //
Vladimir Markoc2a769d2020-04-21 18:06:43 +0100136 /// CHECK-START: int TestAbs.abs5(short) instruction_simplifier$after_gvn (after)
Aart Bik2286da22018-03-22 10:50:22 -0700137 /// CHECK-DAG: <<Par:s\d+>> ParameterValue
138 /// CHECK-DAG: <<Abs:i\d+>> Abs [<<Par>>]
139 /// CHECK-DAG: Return [<<Abs>>]
140 //
Vladimir Markoc2a769d2020-04-21 18:06:43 +0100141 /// CHECK-START: int TestAbs.abs5(short) instruction_simplifier$after_gvn (after)
Aart Bik2286da22018-03-22 10:50:22 -0700142 /// CHECK-NOT: Select
143 public static int abs5(short a) {
144 return a >= 0 ? a : -a;
145 }
146
Vladimir Markoc2a769d2020-04-21 18:06:43 +0100147 /// CHECK-START: int TestAbs.abs6(byte) instruction_simplifier$after_gvn (before)
Aart Bik2286da22018-03-22 10:50:22 -0700148 /// CHECK-DAG: <<Par:b\d+>> ParameterValue
149 /// CHECK-DAG: <<Zer:i\d+>> IntConstant 0
150 /// CHECK-DAG: <<Cnd:z\d+>> LessThan [<<Par>>,<<Zer>>]
151 /// CHECK-DAG: <<Neg:i\d+>> [<<Par>>]
152 /// CHECK-DAG: <<Sel:i\d+>> Select [<<Par>>,<<Neg>>,<<Cnd>>]
153 /// CHECK-DAG: Return [<<Sel>>]
154 //
Vladimir Markoc2a769d2020-04-21 18:06:43 +0100155 /// CHECK-START: int TestAbs.abs6(byte) instruction_simplifier$after_gvn (after)
Aart Bik2286da22018-03-22 10:50:22 -0700156 /// CHECK-DAG: <<Par:b\d+>> ParameterValue
157 /// CHECK-DAG: <<Abs:i\d+>> Abs [<<Par>>]
158 /// CHECK-DAG: Return [<<Abs>>]
159 //
Vladimir Markoc2a769d2020-04-21 18:06:43 +0100160 /// CHECK-START: int TestAbs.abs6(byte) instruction_simplifier$after_gvn (after)
Aart Bik2286da22018-03-22 10:50:22 -0700161 /// CHECK-NOT: Select
162 public static int abs6(byte a) {
163 return a >= 0 ? a : -a;
164 }
165
Vladimir Markoc2a769d2020-04-21 18:06:43 +0100166 /// CHECK-START: long TestAbs.abs7(long) instruction_simplifier$after_gvn (before)
Aart Bik2286da22018-03-22 10:50:22 -0700167 /// CHECK-DAG: <<Par:j\d+>> ParameterValue
168 /// CHECK-DAG: <<Zer:j\d+>> LongConstant 0
169 /// CHECK-DAG: <<Cnd:z\d+>> LessThan [<<Par>>,<<Zer>>]
170 /// CHECK-DAG: <<Neg:j\d+>> [<<Par>>]
171 /// CHECK-DAG: <<Sel:j\d+>> Select [<<Par>>,<<Neg>>,<<Cnd>>]
172 /// CHECK-DAG: Return [<<Sel>>]
173 //
Vladimir Markoc2a769d2020-04-21 18:06:43 +0100174 /// CHECK-START: long TestAbs.abs7(long) instruction_simplifier$after_gvn (after)
Aart Bik2286da22018-03-22 10:50:22 -0700175 /// CHECK-DAG: <<Par:j\d+>> ParameterValue
176 /// CHECK-DAG: <<Abs:j\d+>> Abs [<<Par>>]
177 /// CHECK-DAG: Return [<<Abs>>]
178 //
Vladimir Markoc2a769d2020-04-21 18:06:43 +0100179 /// CHECK-START: long TestAbs.abs7(long) instruction_simplifier$after_gvn (after)
Aart Bik2286da22018-03-22 10:50:22 -0700180 /// CHECK-NOT: Select
181 public static long abs7(long a) {
182 return a >= 0 ? a : -a;
183 }
184
Aart Bikc6eec4b2018-03-29 17:22:00 -0700185 //
Aart Bik6d057002018-04-09 15:39:58 -0700186 // Complications.
187 //
188
Vladimir Markoc2a769d2020-04-21 18:06:43 +0100189 /// CHECK-START: int TestAbs.abs0(int[]) instruction_simplifier$after_gvn (before)
Aart Bik6d057002018-04-09 15:39:58 -0700190 /// CHECK-DAG: <<Zer:i\d+>> IntConstant 0
191 /// CHECK-DAG: <<Arr:i\d+>> ArrayGet [{{l\d+}},{{i\d+}}]
192 /// CHECK-DAG: <<Cnd:z\d+>> LessThan [<<Arr>>,<<Zer>>]
193 /// CHECK-DAG: <<Neg:i\d+>> [<<Arr>>]
194 /// CHECK-DAG: <<Sel:i\d+>> Select [<<Arr>>,<<Neg>>,<<Cnd>>]
195 /// CHECK-DAG: Return [<<Sel>>]
196 //
Vladimir Markoc2a769d2020-04-21 18:06:43 +0100197 /// CHECK-START: int TestAbs.abs0(int[]) instruction_simplifier$after_gvn (after)
Aart Bik6d057002018-04-09 15:39:58 -0700198 /// CHECK-DAG: <<Arr:i\d+>> ArrayGet [{{l\d+}},{{i\d+}}]
199 /// CHECK-DAG: <<Abs:i\d+>> Abs [<<Arr>>]
200 /// CHECK-DAG: Return [<<Abs>>]
201 //
Vladimir Markoc2a769d2020-04-21 18:06:43 +0100202 /// CHECK-START: int TestAbs.abs0(int[]) instruction_simplifier$after_gvn (after)
Aart Bik6d057002018-04-09 15:39:58 -0700203 /// CHECK-NOT: Select
204 public static int abs0(int[] a) {
205 return a[0] >= 0 ? a[0] : -a[0];
206 }
207
208 //
Aart Bikc6eec4b2018-03-29 17:22:00 -0700209 // Nop zero extension.
210 //
211
Vladimir Markoc2a769d2020-04-21 18:06:43 +0100212 /// CHECK-START: int TestAbs.zabs1(byte) instruction_simplifier (before)
Aart Bikc6eec4b2018-03-29 17:22:00 -0700213 /// CHECK-DAG: <<Par:b\d+>> ParameterValue
214 /// CHECK-DAG: <<Msk:i\d+>> IntConstant 255
215 /// CHECK-DAG: <<And:i\d+>> [<<Par>>,<<Msk>>]
Vladimir Marko5f846072020-04-09 13:20:11 +0100216 /// CHECK-DAG: <<Abs:i\d+>> Abs
Aart Bikc6eec4b2018-03-29 17:22:00 -0700217 /// CHECK-DAG: Return [<<Abs>>]
218 //
Vladimir Markoc2a769d2020-04-21 18:06:43 +0100219 /// CHECK-START: int TestAbs.zabs1(byte) instruction_simplifier (after)
Aart Bikc6eec4b2018-03-29 17:22:00 -0700220 /// CHECK-DAG: <<Par:b\d+>> ParameterValue
221 /// CHECK-DAG: <<Cnv:a\d+>> TypeConversion [<<Par>>]
222 /// CHECK-DAG: Return [<<Cnv>>]
223 //
Vladimir Markoc2a769d2020-04-21 18:06:43 +0100224 /// CHECK-START: int TestAbs.zabs1(byte) instruction_simplifier (after)
Aart Bikc6eec4b2018-03-29 17:22:00 -0700225 /// CHECK-NOT: Abs
226 public static int zabs1(byte a) {
227 return Math.abs(a & 0xff);
228 }
229
Vladimir Markoc2a769d2020-04-21 18:06:43 +0100230 /// CHECK-START: int TestAbs.zabs2(short) instruction_simplifier (before)
Aart Bikc6eec4b2018-03-29 17:22:00 -0700231 /// CHECK-DAG: <<Par:s\d+>> ParameterValue
232 /// CHECK-DAG: <<Msk:i\d+>> IntConstant 65535
233 /// CHECK-DAG: <<And:i\d+>> [<<Msk>>,<<Par>>]
Vladimir Marko5f846072020-04-09 13:20:11 +0100234 /// CHECK-DAG: <<Abs:i\d+>> Abs
Aart Bikc6eec4b2018-03-29 17:22:00 -0700235 /// CHECK-DAG: Return [<<Abs>>]
236 //
Vladimir Markoc2a769d2020-04-21 18:06:43 +0100237 /// CHECK-START: int TestAbs.zabs2(short) instruction_simplifier (after)
Aart Bikc6eec4b2018-03-29 17:22:00 -0700238 /// CHECK-DAG: <<Par:s\d+>> ParameterValue
239 /// CHECK-DAG: <<Cnv:c\d+>> TypeConversion [<<Par>>]
240 /// CHECK-DAG: Return [<<Cnv>>]
241 //
Vladimir Markoc2a769d2020-04-21 18:06:43 +0100242 /// CHECK-START: int TestAbs.zabs2(short) instruction_simplifier (after)
Aart Bikc6eec4b2018-03-29 17:22:00 -0700243 /// CHECK-NOT: Abs
244 public static int zabs2(short a) {
245 return Math.abs(a & 0xffff);
246 }
247
Vladimir Markoc2a769d2020-04-21 18:06:43 +0100248 /// CHECK-START: int TestAbs.zabs3(char) instruction_simplifier (before)
Aart Bikc6eec4b2018-03-29 17:22:00 -0700249 /// CHECK-DAG: <<Par:c\d+>> ParameterValue
Vladimir Marko5f846072020-04-09 13:20:11 +0100250 /// CHECK-DAG: <<Abs:i\d+>> Abs
Aart Bikc6eec4b2018-03-29 17:22:00 -0700251 /// CHECK-DAG: Return [<<Abs>>]
252 //
Vladimir Markoc2a769d2020-04-21 18:06:43 +0100253 /// CHECK-START: int TestAbs.zabs3(char) instruction_simplifier (after)
Aart Bikc6eec4b2018-03-29 17:22:00 -0700254 /// CHECK-DAG: <<Par:c\d+>> ParameterValue
Aart Bikc6eec4b2018-03-29 17:22:00 -0700255 /// CHECK-DAG: Return [<<Par>>]
256 //
Vladimir Markoc2a769d2020-04-21 18:06:43 +0100257 /// CHECK-START: int TestAbs.zabs3(char) instruction_simplifier (after)
Aart Bikc6eec4b2018-03-29 17:22:00 -0700258 /// CHECK-NOT: Abs
259 public static int zabs3(char a) {
260 return Math.abs(a);
261 }
262
Vladimir Markoc2a769d2020-04-21 18:06:43 +0100263 public static void main() {
Aart Bik6d057002018-04-09 15:39:58 -0700264 // Intrinsics.
Aart Bikc6eec4b2018-03-29 17:22:00 -0700265 expectEquals(10, absI(-10));
266 expectEquals(20, absI(20));
267 expectEquals(10L, absL(-10L));
268 expectEquals(20L, absL(20L));
Aart Bik6d057002018-04-09 15:39:58 -0700269 // Types.
Aart Bik2286da22018-03-22 10:50:22 -0700270 expectEquals(10, abs1(-10));
271 expectEquals(20, abs1(20));
272 expectEquals(10, abs2(-10));
273 expectEquals(20, abs2(20));
274 expectEquals(10, abs3(-10));
275 expectEquals(20, abs3(20));
276 expectEquals(10, abs4(-10));
277 expectEquals(20, abs4(20));
278 expectEquals(10, abs4((short) -10));
279 expectEquals(20, abs4((short) 20));
280 expectEquals(10, abs6((byte) -10));
281 expectEquals(20, abs6((byte) 20));
282 expectEquals(10L, abs7(-10L));
283 expectEquals(20L, abs7(20L));
Aart Bik6d057002018-04-09 15:39:58 -0700284 // Complications.
285 int[] a = { 13 };
286 int[] b = { -11 };
287 expectEquals(13, abs0(a));
288 expectEquals(11, abs0(b));
289 // Nop zero extension.
Aart Bikc6eec4b2018-03-29 17:22:00 -0700290 expectEquals(1, zabs1((byte) 1));
291 expectEquals(0xff, zabs1((byte) -1));
292 expectEquals(1, zabs2((short) 1));
293 expectEquals(0xffff, zabs2((short) -1));
294 expectEquals(1, zabs3((char) 1));
295 expectEquals(0xffff, zabs3((char) -1));
Vladimir Markoc2a769d2020-04-21 18:06:43 +0100296 System.out.println("TestAbs passed");
Aart Bik2286da22018-03-22 10:50:22 -0700297 }
298
299 private static void expectEquals(int expected, int result) {
300 if (expected != result) {
301 throw new Error("Expected: " + expected + ", found: " + result);
302 }
303 }
304
305 private static void expectEquals(long expected, long result) {
306 if (expected != result) {
307 throw new Error("Expected: " + expected + ", found: " + result);
308 }
309 }
310}