blob: e0a76ca0223fbea82c1d907f6d895681fe53b602 [file] [log] [blame]
David Brazdilfb502702016-02-02 10:09:14 +00001/*
2 * Copyright (C) 2015 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
17public class Main {
18
Alexandre Rames880f1192016-06-13 16:04:50 +010019 static boolean doThrow = false;
20
David Brazdilfb502702016-02-02 10:09:14 +000021 /// CHECK-START: int Main.BoolCond_IntVarVar(boolean, int, int) register (after)
22 /// CHECK: Select [{{i\d+}},{{i\d+}},{{z\d+}}]
23
David Brazdilc0b601b2016-02-08 14:20:45 +000024 /// CHECK-START-ARM64: int Main.BoolCond_IntVarVar(boolean, int, int) disassembly (after)
25 /// CHECK: Select
26 /// CHECK-NEXT: cmp
27 /// CHECK-NEXT: csel ne
28
Mark Mendell7c0b44f2016-02-01 10:08:35 -050029 /// CHECK-START-X86_64: int Main.BoolCond_IntVarVar(boolean, int, int) disassembly (after)
30 /// CHECK: <<Cond:z\d+>> ParameterValue
31 /// CHECK: Select [{{i\d+}},{{i\d+}},<<Cond>>]
32 /// CHECK: cmovnz/ne
33
Mark Mendell0c5b18e2016-02-06 13:58:35 -050034 /// CHECK-START-X86: int Main.BoolCond_IntVarVar(boolean, int, int) disassembly (after)
35 /// CHECK: <<Cond:z\d+>> ParameterValue
36 /// CHECK: Select [{{i\d+}},{{i\d+}},<<Cond>>]
37 /// CHECK: cmovnz/ne
38
David Brazdilfb502702016-02-02 10:09:14 +000039 public static int BoolCond_IntVarVar(boolean cond, int x, int y) {
Alexandre Rames880f1192016-06-13 16:04:50 +010040 if (doThrow) {
41 // Try defeating inlining.
42 throw new Error();
43 }
David Brazdilfb502702016-02-02 10:09:14 +000044 return cond ? x : y;
45 }
46
47 /// CHECK-START: int Main.BoolCond_IntVarCst(boolean, int) register (after)
48 /// CHECK: Select [{{i\d+}},{{i\d+}},{{z\d+}}]
49
David Brazdilc0b601b2016-02-08 14:20:45 +000050 /// CHECK-START-ARM64: int Main.BoolCond_IntVarCst(boolean, int) disassembly (after)
51 /// CHECK: Select
52 /// CHECK-NEXT: cmp
53 /// CHECK-NEXT: csinc ne
54
Mark Mendell7c0b44f2016-02-01 10:08:35 -050055 /// CHECK-START-X86_64: int Main.BoolCond_IntVarCst(boolean, int) disassembly (after)
56 /// CHECK: <<Cond:z\d+>> ParameterValue
57 /// CHECK: Select [{{i\d+}},{{i\d+}},<<Cond>>]
58 /// CHECK: cmovnz/ne
59
Mark Mendell0c5b18e2016-02-06 13:58:35 -050060 /// CHECK-START-X86: int Main.BoolCond_IntVarCst(boolean, int) disassembly (after)
61 /// CHECK: <<Cond:z\d+>> ParameterValue
62 /// CHECK: Select [{{i\d+}},{{i\d+}},<<Cond>>]
63 /// CHECK: cmovnz/ne
64
David Brazdilfb502702016-02-02 10:09:14 +000065 public static int BoolCond_IntVarCst(boolean cond, int x) {
Alexandre Rames880f1192016-06-13 16:04:50 +010066 if (doThrow) {
67 // Try defeating inlining.
68 throw new Error();
69 }
David Brazdilfb502702016-02-02 10:09:14 +000070 return cond ? x : 1;
71 }
72
73 /// CHECK-START: int Main.BoolCond_IntCstVar(boolean, int) register (after)
74 /// CHECK: Select [{{i\d+}},{{i\d+}},{{z\d+}}]
75
David Brazdilc0b601b2016-02-08 14:20:45 +000076 /// CHECK-START-ARM64: int Main.BoolCond_IntCstVar(boolean, int) disassembly (after)
77 /// CHECK: Select
78 /// CHECK-NEXT: cmp
79 /// CHECK-NEXT: csinc eq
80
Mark Mendell7c0b44f2016-02-01 10:08:35 -050081 /// CHECK-START-X86_64: int Main.BoolCond_IntCstVar(boolean, int) disassembly (after)
82 /// CHECK: <<Cond:z\d+>> ParameterValue
83 /// CHECK: Select [{{i\d+}},{{i\d+}},<<Cond>>]
84 /// CHECK: cmovnz/ne
85
Mark Mendell0c5b18e2016-02-06 13:58:35 -050086 /// CHECK-START-X86: int Main.BoolCond_IntCstVar(boolean, int) disassembly (after)
87 /// CHECK: <<Cond:z\d+>> ParameterValue
88 /// CHECK: Select [{{i\d+}},{{i\d+}},<<Cond>>]
89 /// CHECK: cmovnz/ne
90
David Brazdilfb502702016-02-02 10:09:14 +000091 public static int BoolCond_IntCstVar(boolean cond, int y) {
Alexandre Rames880f1192016-06-13 16:04:50 +010092 if (doThrow) {
93 // Try defeating inlining.
94 throw new Error();
95 }
David Brazdilfb502702016-02-02 10:09:14 +000096 return cond ? 1 : y;
97 }
98
Mark Mendell7c0b44f2016-02-01 10:08:35 -050099 /// CHECK-START: long Main.BoolCond_LongVarVar(boolean, long, long) register (after)
100 /// CHECK: Select [{{j\d+}},{{j\d+}},{{z\d+}}]
101
David Brazdilc0b601b2016-02-08 14:20:45 +0000102 /// CHECK-START-ARM64: long Main.BoolCond_LongVarVar(boolean, long, long) disassembly (after)
103 /// CHECK: Select
104 /// CHECK-NEXT: cmp
105 /// CHECK-NEXT: csel ne
106
Mark Mendell7c0b44f2016-02-01 10:08:35 -0500107 /// CHECK-START-X86_64: long Main.BoolCond_LongVarVar(boolean, long, long) disassembly (after)
108 /// CHECK: <<Cond:z\d+>> ParameterValue
109 /// CHECK: Select [{{j\d+}},{{j\d+}},<<Cond>>]
110 /// CHECK: cmovnz/neq
111
Mark Mendell0c5b18e2016-02-06 13:58:35 -0500112 /// CHECK-START-X86: long Main.BoolCond_LongVarVar(boolean, long, long) disassembly (after)
113 /// CHECK: <<Cond:z\d+>> ParameterValue
114 /// CHECK: Select [{{j\d+}},{{j\d+}},<<Cond>>]
115 /// CHECK: cmovnz/ne
116 /// CHECK-NEXT: cmovnz/ne
117
Mark Mendell7c0b44f2016-02-01 10:08:35 -0500118 public static long BoolCond_LongVarVar(boolean cond, long x, long y) {
Alexandre Rames880f1192016-06-13 16:04:50 +0100119 if (doThrow) {
120 // Try defeating inlining.
121 throw new Error();
122 }
Mark Mendell7c0b44f2016-02-01 10:08:35 -0500123 return cond ? x : y;
124 }
125
126 /// CHECK-START: long Main.BoolCond_LongVarCst(boolean, long) register (after)
127 /// CHECK: Select [{{j\d+}},{{j\d+}},{{z\d+}}]
128
David Brazdilc0b601b2016-02-08 14:20:45 +0000129 /// CHECK-START-ARM64: long Main.BoolCond_LongVarCst(boolean, long) disassembly (after)
130 /// CHECK: Select
131 /// CHECK-NEXT: cmp
132 /// CHECK-NEXT: csinc ne
133
Mark Mendell7c0b44f2016-02-01 10:08:35 -0500134 /// CHECK-START-X86_64: long Main.BoolCond_LongVarCst(boolean, long) disassembly (after)
135 /// CHECK: <<Cond:z\d+>> ParameterValue
136 /// CHECK: Select [{{j\d+}},{{j\d+}},<<Cond>>]
137 /// CHECK: cmovnz/neq
138
Mark Mendell0c5b18e2016-02-06 13:58:35 -0500139 /// CHECK-START-X86: long Main.BoolCond_LongVarCst(boolean, long) disassembly (after)
140 /// CHECK: <<Cond:z\d+>> ParameterValue
141 /// CHECK: Select [{{j\d+}},{{j\d+}},<<Cond>>]
142 /// CHECK: cmovnz/ne
143 /// CHECK-NEXT: cmovnz/ne
144
Mark Mendell7c0b44f2016-02-01 10:08:35 -0500145 public static long BoolCond_LongVarCst(boolean cond, long x) {
Alexandre Rames880f1192016-06-13 16:04:50 +0100146 if (doThrow) {
147 // Try defeating inlining.
148 throw new Error();
149 }
Mark Mendell7c0b44f2016-02-01 10:08:35 -0500150 return cond ? x : 1L;
151 }
152
153 /// CHECK-START: long Main.BoolCond_LongCstVar(boolean, long) register (after)
154 /// CHECK: Select [{{j\d+}},{{j\d+}},{{z\d+}}]
155
David Brazdilc0b601b2016-02-08 14:20:45 +0000156 /// CHECK-START-ARM64: long Main.BoolCond_LongCstVar(boolean, long) disassembly (after)
157 /// CHECK: Select
158 /// CHECK-NEXT: cmp
159 /// CHECK-NEXT: csinc eq
160
Mark Mendell7c0b44f2016-02-01 10:08:35 -0500161 /// CHECK-START-X86_64: long Main.BoolCond_LongCstVar(boolean, long) disassembly (after)
162 /// CHECK: <<Cond:z\d+>> ParameterValue
163 /// CHECK: Select [{{j\d+}},{{j\d+}},<<Cond>>]
164 /// CHECK: cmovnz/neq
165
Mark Mendell0c5b18e2016-02-06 13:58:35 -0500166 /// CHECK-START-X86: long Main.BoolCond_LongCstVar(boolean, long) disassembly (after)
167 /// CHECK: <<Cond:z\d+>> ParameterValue
168 /// CHECK: Select [{{j\d+}},{{j\d+}},<<Cond>>]
169 /// CHECK: cmovnz/ne
170 /// CHECK-NEXT: cmovnz/ne
171
Mark Mendell7c0b44f2016-02-01 10:08:35 -0500172 public static long BoolCond_LongCstVar(boolean cond, long y) {
Alexandre Rames880f1192016-06-13 16:04:50 +0100173 if (doThrow) {
174 // Try defeating inlining.
175 throw new Error();
176 }
Mark Mendell7c0b44f2016-02-01 10:08:35 -0500177 return cond ? 1L : y;
178 }
179
David Brazdilfb502702016-02-02 10:09:14 +0000180 /// CHECK-START: float Main.BoolCond_FloatVarVar(boolean, float, float) register (after)
181 /// CHECK: Select [{{f\d+}},{{f\d+}},{{z\d+}}]
182
David Brazdilc0b601b2016-02-08 14:20:45 +0000183 /// CHECK-START-ARM64: float Main.BoolCond_FloatVarVar(boolean, float, float) disassembly (after)
184 /// CHECK: Select
185 /// CHECK-NEXT: cmp
186 /// CHECK-NEXT: fcsel ne
187
David Brazdilfb502702016-02-02 10:09:14 +0000188 public static float BoolCond_FloatVarVar(boolean cond, float x, float y) {
Alexandre Rames880f1192016-06-13 16:04:50 +0100189 if (doThrow) {
190 // Try defeating inlining.
191 throw new Error();
192 }
David Brazdilfb502702016-02-02 10:09:14 +0000193 return cond ? x : y;
194 }
195
196 /// CHECK-START: float Main.BoolCond_FloatVarCst(boolean, float) register (after)
197 /// CHECK: Select [{{f\d+}},{{f\d+}},{{z\d+}}]
198
David Brazdilc0b601b2016-02-08 14:20:45 +0000199 /// CHECK-START-ARM64: float Main.BoolCond_FloatVarCst(boolean, float) disassembly (after)
200 /// CHECK: Select
201 /// CHECK-NEXT: cmp
202 /// CHECK-NEXT: fcsel ne
203
David Brazdilfb502702016-02-02 10:09:14 +0000204 public static float BoolCond_FloatVarCst(boolean cond, float x) {
Alexandre Rames880f1192016-06-13 16:04:50 +0100205 if (doThrow) {
206 // Try defeating inlining.
207 throw new Error();
208 }
David Brazdilfb502702016-02-02 10:09:14 +0000209 return cond ? x : 1.0f;
210 }
211
212 /// CHECK-START: float Main.BoolCond_FloatCstVar(boolean, float) register (after)
213 /// CHECK: Select [{{f\d+}},{{f\d+}},{{z\d+}}]
214
David Brazdilc0b601b2016-02-08 14:20:45 +0000215 /// CHECK-START-ARM64: float Main.BoolCond_FloatCstVar(boolean, float) disassembly (after)
216 /// CHECK: Select
217 /// CHECK-NEXT: cmp
218 /// CHECK-NEXT: fcsel ne
219
David Brazdilfb502702016-02-02 10:09:14 +0000220 public static float BoolCond_FloatCstVar(boolean cond, float y) {
Alexandre Rames880f1192016-06-13 16:04:50 +0100221 if (doThrow) {
222 // Try defeating inlining.
223 throw new Error();
224 }
David Brazdilfb502702016-02-02 10:09:14 +0000225 return cond ? 1.0f : y;
226 }
227
228 /// CHECK-START: int Main.IntNonmatCond_IntVarVar(int, int, int, int) register (after)
229 /// CHECK: <<Cond:z\d+>> LessThanOrEqual [{{i\d+}},{{i\d+}}]
230 /// CHECK-NEXT: Select [{{i\d+}},{{i\d+}},<<Cond>>]
231
David Brazdilc0b601b2016-02-08 14:20:45 +0000232 /// CHECK-START-ARM64: int Main.IntNonmatCond_IntVarVar(int, int, int, int) disassembly (after)
233 /// CHECK: Select
234 /// CHECK-NEXT: cmp
235 /// CHECK-NEXT: csel le
236
Mark Mendell7c0b44f2016-02-01 10:08:35 -0500237 /// CHECK-START-X86_64: int Main.IntNonmatCond_IntVarVar(int, int, int, int) disassembly (after)
238 /// CHECK: <<Cond:z\d+>> LessThanOrEqual [{{i\d+}},{{i\d+}}]
239 /// CHECK-NEXT: Select [{{i\d+}},{{i\d+}},<<Cond>>]
240 /// CHECK: cmovle/ng
241
Mark Mendell0c5b18e2016-02-06 13:58:35 -0500242 /// CHECK-START-X86: int Main.IntNonmatCond_IntVarVar(int, int, int, int) disassembly (after)
243 /// CHECK: <<Cond:z\d+>> LessThanOrEqual [{{i\d+}},{{i\d+}}]
244 /// CHECK-NEXT: Select [{{i\d+}},{{i\d+}},<<Cond>>]
245 /// CHECK: cmovle/ng
246
David Brazdilfb502702016-02-02 10:09:14 +0000247 public static int IntNonmatCond_IntVarVar(int a, int b, int x, int y) {
Alexandre Rames880f1192016-06-13 16:04:50 +0100248 if (doThrow) {
249 // Try defeating inlining.
250 throw new Error();
251 }
David Brazdilfb502702016-02-02 10:09:14 +0000252 return a > b ? x : y;
253 }
254
255 /// CHECK-START: int Main.IntMatCond_IntVarVar(int, int, int, int) register (after)
256 /// CHECK: <<Cond:z\d+>> LessThanOrEqual [{{i\d+}},{{i\d+}}]
257 /// CHECK-NEXT: <<Sel:i\d+>> Select [{{i\d+}},{{i\d+}},{{z\d+}}]
258 /// CHECK-NEXT: Add [<<Cond>>,<<Sel>>]
259
David Brazdilc0b601b2016-02-08 14:20:45 +0000260 /// CHECK-START-ARM64: int Main.IntMatCond_IntVarVar(int, int, int, int) disassembly (after)
261 /// CHECK: LessThanOrEqual
262 /// CHECK-NEXT: cmp
263 /// CHECK-NEXT: cset le
264 /// CHECK: Select
265 /// CHECK-NEXT: csel le
266
Mark Mendell7c0b44f2016-02-01 10:08:35 -0500267 /// CHECK-START-X86_64: int Main.IntMatCond_IntVarVar(int, int, int, int) disassembly (after)
268 /// CHECK: <<Cond:z\d+>> LessThanOrEqual [{{i\d+}},{{i\d+}}]
269 /// CHECK: Select [{{i\d+}},{{i\d+}},<<Cond>>]
270 /// CHECK: cmovle/ng
271
Mark Mendell0c5b18e2016-02-06 13:58:35 -0500272 /// CHECK-START-X86: int Main.IntMatCond_IntVarVar(int, int, int, int) disassembly (after)
273 /// CHECK: <<Cond:z\d+>> LessThanOrEqual [{{i\d+}},{{i\d+}}]
274 /// CHECK: Select [{{i\d+}},{{i\d+}},<<Cond>>]
275 /// CHECK: cmovle/ng
276
David Brazdilfb502702016-02-02 10:09:14 +0000277 public static int IntMatCond_IntVarVar(int a, int b, int x, int y) {
Alexandre Rames880f1192016-06-13 16:04:50 +0100278 if (doThrow) {
279 // Try defeating inlining.
280 throw new Error();
281 }
David Brazdilfb502702016-02-02 10:09:14 +0000282 int result = (a > b ? x : y);
283 return result + (a > b ? 0 : 1);
284 }
285
Mark Mendell7c0b44f2016-02-01 10:08:35 -0500286 /// CHECK-START: long Main.IntNonmatCond_LongVarVar(int, int, long, long) register (after)
287 /// CHECK: <<Cond:z\d+>> LessThanOrEqual [{{i\d+}},{{i\d+}}]
288 /// CHECK-NEXT: Select [{{j\d+}},{{j\d+}},<<Cond>>]
289
David Brazdilc0b601b2016-02-08 14:20:45 +0000290 /// CHECK-START-ARM64: long Main.IntNonmatCond_LongVarVar(int, int, long, long) disassembly (after)
291 /// CHECK: Select
292 /// CHECK-NEXT: cmp
293 /// CHECK-NEXT: csel le
294
Mark Mendell7c0b44f2016-02-01 10:08:35 -0500295 /// CHECK-START-X86_64: long Main.IntNonmatCond_LongVarVar(int, int, long, long) disassembly (after)
296 /// CHECK: <<Cond:z\d+>> LessThanOrEqual [{{i\d+}},{{i\d+}}]
297 /// CHECK-NEXT: Select [{{j\d+}},{{j\d+}},<<Cond>>]
298 /// CHECK: cmovle/ngq
299
Mark Mendell0c5b18e2016-02-06 13:58:35 -0500300 /// CHECK-START-X86: long Main.IntNonmatCond_LongVarVar(int, int, long, long) disassembly (after)
301 /// CHECK: <<Cond:z\d+>> LessThanOrEqual [{{i\d+}},{{i\d+}}]
302 /// CHECK-NEXT: Select [{{j\d+}},{{j\d+}},<<Cond>>]
303 /// CHECK: cmovle/ng
304 /// CHECK-NEXT: cmovle/ng
305
Mark Mendell7c0b44f2016-02-01 10:08:35 -0500306 public static long IntNonmatCond_LongVarVar(int a, int b, long x, long y) {
Alexandre Rames880f1192016-06-13 16:04:50 +0100307 if (doThrow) {
308 // Try defeating inlining.
309 throw new Error();
310 }
Mark Mendell7c0b44f2016-02-01 10:08:35 -0500311 return a > b ? x : y;
312 }
313
314 /// CHECK-START: long Main.IntMatCond_LongVarVar(int, int, long, long) register (after)
315 /// CHECK: <<Cond:z\d+>> LessThanOrEqual [{{i\d+}},{{i\d+}}]
316 /// CHECK: <<Sel1:j\d+>> Select [{{j\d+}},{{j\d+}},<<Cond>>]
317 /// CHECK: <<Sel2:j\d+>> Select [{{j\d+}},{{j\d+}},<<Cond>>]
318 /// CHECK: Add [<<Sel2>>,<<Sel1>>]
319
David Brazdilc0b601b2016-02-08 14:20:45 +0000320 /// CHECK-START-ARM64: long Main.IntMatCond_LongVarVar(int, int, long, long) disassembly (after)
321 /// CHECK: LessThanOrEqual
322 /// CHECK-NEXT: cmp
323 /// CHECK-NEXT: cset le
324 /// CHECK: Select
325 /// CHECK-NEXT: csel le
326
Mark Mendell7c0b44f2016-02-01 10:08:35 -0500327 /// CHECK-START-X86_64: long Main.IntMatCond_LongVarVar(int, int, long, long) disassembly (after)
328 /// CHECK: <<Cond:z\d+>> LessThanOrEqual [{{i\d+}},{{i\d+}}]
329 /// CHECK: Select [{{j\d+}},{{j\d+}},<<Cond>>]
330 /// CHECK: cmovle/ngq
331 /// CHECK: Select [{{j\d+}},{{j\d+}},<<Cond>>]
332 /// CHECK: cmovnz/neq
333
Mark Mendell0c5b18e2016-02-06 13:58:35 -0500334 /// CHECK-START-X86: long Main.IntMatCond_LongVarVar(int, int, long, long) disassembly (after)
335 /// CHECK: <<Cond:z\d+>> LessThanOrEqual [{{i\d+}},{{i\d+}}]
336 /// CHECK: Select [{{j\d+}},{{j\d+}},<<Cond>>]
337 /// CHECK-NEXT: cmovle/ng
338 /// CHECK-NEXT: cmovle/ng
339 /// CHECK: Select [{{j\d+}},{{j\d+}},<<Cond>>]
340 /// CHECK: cmovnz/ne
341 /// CHECK-NEXT: cmovnz/ne
342
Mark Mendell7c0b44f2016-02-01 10:08:35 -0500343 public static long IntMatCond_LongVarVar(int a, int b, long x, long y) {
Alexandre Rames880f1192016-06-13 16:04:50 +0100344 if (doThrow) {
345 // Try defeating inlining.
346 throw new Error();
347 }
Mark Mendell7c0b44f2016-02-01 10:08:35 -0500348 long result = (a > b ? x : y);
349 return result + (a > b ? 0L : 1L);
350 }
351
352 /// CHECK-START: long Main.LongNonmatCond_LongVarVar(long, long, long, long) register (after)
353 /// CHECK: <<Cond:z\d+>> LessThanOrEqual [{{j\d+}},{{j\d+}}]
354 /// CHECK: Select [{{j\d+}},{{j\d+}},<<Cond>>]
355
David Brazdilc0b601b2016-02-08 14:20:45 +0000356 /// CHECK-START-ARM64: long Main.LongNonmatCond_LongVarVar(long, long, long, long) disassembly (after)
357 /// CHECK: Select
358 /// CHECK-NEXT: cmp
359 /// CHECK-NEXT: csel le
360
Mark Mendell7c0b44f2016-02-01 10:08:35 -0500361 /// CHECK-START-X86_64: long Main.LongNonmatCond_LongVarVar(long, long, long, long) disassembly (after)
362 /// CHECK: <<Cond:z\d+>> LessThanOrEqual [{{j\d+}},{{j\d+}}]
363 /// CHECK: Select [{{j\d+}},{{j\d+}},<<Cond>>]
364 /// CHECK: cmovle/ngq
365
366 public static long LongNonmatCond_LongVarVar(long a, long b, long x, long y) {
Alexandre Rames880f1192016-06-13 16:04:50 +0100367 if (doThrow) {
368 // Try defeating inlining.
369 throw new Error();
370 }
Mark Mendell7c0b44f2016-02-01 10:08:35 -0500371 return a > b ? x : y;
372 }
373
374 /// CHECK-START: long Main.LongMatCond_LongVarVar(long, long, long, long) register (after)
375 /// CHECK: <<Cond:z\d+>> LessThanOrEqual [{{j\d+}},{{j\d+}}]
376 /// CHECK: <<Sel1:j\d+>> Select [{{j\d+}},{{j\d+}},<<Cond>>]
377 /// CHECK: <<Sel2:j\d+>> Select [{{j\d+}},{{j\d+}},<<Cond>>]
378 /// CHECK: Add [<<Sel2>>,<<Sel1>>]
379
David Brazdilc0b601b2016-02-08 14:20:45 +0000380 /// CHECK-START-ARM64: long Main.LongMatCond_LongVarVar(long, long, long, long) disassembly (after)
381 /// CHECK: LessThanOrEqual
382 /// CHECK-NEXT: cmp
383 /// CHECK-NEXT: cset le
384 /// CHECK: Select
385 /// CHECK-NEXT: csel le
386
Mark Mendell7c0b44f2016-02-01 10:08:35 -0500387 /// CHECK-START-X86_64: long Main.LongMatCond_LongVarVar(long, long, long, long) disassembly (after)
388 /// CHECK: <<Cond:z\d+>> LessThanOrEqual [{{j\d+}},{{j\d+}}]
389 /// CHECK: Select [{{j\d+}},{{j\d+}},<<Cond>>]
390 /// CHECK: cmovle/ngq
391 /// CHECK: Select [{{j\d+}},{{j\d+}},<<Cond>>]
392 /// CHECK: cmovnz/neq
393
394 public static long LongMatCond_LongVarVar(long a, long b, long x, long y) {
Alexandre Rames880f1192016-06-13 16:04:50 +0100395 if (doThrow) {
396 // Try defeating inlining.
397 throw new Error();
398 }
Mark Mendell7c0b44f2016-02-01 10:08:35 -0500399 long result = (a > b ? x : y);
400 return result + (a > b ? 0L : 1L);
401 }
402
David Brazdilfb502702016-02-02 10:09:14 +0000403 /// CHECK-START: int Main.FloatLtNonmatCond_IntVarVar(float, float, int, int) register (after)
404 /// CHECK: <<Cond:z\d+>> LessThanOrEqual [{{f\d+}},{{f\d+}}]
405 /// CHECK-NEXT: Select [{{i\d+}},{{i\d+}},<<Cond>>]
406
David Brazdilc0b601b2016-02-08 14:20:45 +0000407 /// CHECK-START-ARM64: int Main.FloatLtNonmatCond_IntVarVar(float, float, int, int) disassembly (after)
408 /// CHECK: LessThanOrEqual
409 /// CHECK: Select
410 /// CHECK-NEXT: fcmp
411 /// CHECK-NEXT: csel le
412
David Brazdilfb502702016-02-02 10:09:14 +0000413 public static int FloatLtNonmatCond_IntVarVar(float a, float b, int x, int y) {
Alexandre Rames880f1192016-06-13 16:04:50 +0100414 if (doThrow) {
415 // Try defeating inlining.
416 throw new Error();
417 }
David Brazdilfb502702016-02-02 10:09:14 +0000418 return a > b ? x : y;
419 }
420
421 /// CHECK-START: int Main.FloatGtNonmatCond_IntVarVar(float, float, int, int) register (after)
422 /// CHECK: <<Cond:z\d+>> GreaterThanOrEqual [{{f\d+}},{{f\d+}}]
423 /// CHECK-NEXT: Select [{{i\d+}},{{i\d+}},<<Cond>>]
424
David Brazdilc0b601b2016-02-08 14:20:45 +0000425 /// CHECK-START-ARM64: int Main.FloatGtNonmatCond_IntVarVar(float, float, int, int) disassembly (after)
426 /// CHECK: GreaterThanOrEqual
427 /// CHECK: Select
428 /// CHECK-NEXT: fcmp
429 /// CHECK-NEXT: csel hs
430
David Brazdilfb502702016-02-02 10:09:14 +0000431 public static int FloatGtNonmatCond_IntVarVar(float a, float b, int x, int y) {
Alexandre Rames880f1192016-06-13 16:04:50 +0100432 if (doThrow) {
433 // Try defeating inlining.
434 throw new Error();
435 }
David Brazdilfb502702016-02-02 10:09:14 +0000436 return a < b ? x : y;
437 }
438
439 /// CHECK-START: float Main.FloatGtNonmatCond_FloatVarVar(float, float, float, float) register (after)
440 /// CHECK: <<Cond:z\d+>> GreaterThanOrEqual [{{f\d+}},{{f\d+}}]
441 /// CHECK-NEXT: Select [{{f\d+}},{{f\d+}},<<Cond>>]
442
David Brazdilc0b601b2016-02-08 14:20:45 +0000443 /// CHECK-START-ARM64: float Main.FloatGtNonmatCond_FloatVarVar(float, float, float, float) disassembly (after)
444 /// CHECK: GreaterThanOrEqual
445 /// CHECK: Select
446 /// CHECK-NEXT: fcmp
447 /// CHECK-NEXT: fcsel hs
448
David Brazdilfb502702016-02-02 10:09:14 +0000449 public static float FloatGtNonmatCond_FloatVarVar(float a, float b, float x, float y) {
Alexandre Rames880f1192016-06-13 16:04:50 +0100450 if (doThrow) {
451 // Try defeating inlining.
452 throw new Error();
453 }
David Brazdilfb502702016-02-02 10:09:14 +0000454 return a < b ? x : y;
455 }
456
457 /// CHECK-START: int Main.FloatLtMatCond_IntVarVar(float, float, int, int) register (after)
458 /// CHECK: <<Cond:z\d+>> LessThanOrEqual [{{f\d+}},{{f\d+}}]
459 /// CHECK-NEXT: <<Sel:i\d+>> Select [{{i\d+}},{{i\d+}},<<Cond>>]
460 /// CHECK-NEXT: Add [<<Cond>>,<<Sel>>]
461
David Brazdilc0b601b2016-02-08 14:20:45 +0000462 /// CHECK-START-ARM64: int Main.FloatLtMatCond_IntVarVar(float, float, int, int) disassembly (after)
463 /// CHECK: LessThanOrEqual
464 /// CHECK-NEXT: fcmp
465 /// CHECK-NEXT: cset le
466 /// CHECK: Select
467 /// CHECK-NEXT: csel le
468
David Brazdilfb502702016-02-02 10:09:14 +0000469 public static int FloatLtMatCond_IntVarVar(float a, float b, int x, int y) {
Alexandre Rames880f1192016-06-13 16:04:50 +0100470 if (doThrow) {
471 // Try defeating inlining.
472 throw new Error();
473 }
David Brazdilfb502702016-02-02 10:09:14 +0000474 int result = (a > b ? x : y);
475 return result + (a > b ? 0 : 1);
476 }
477
478 /// CHECK-START: int Main.FloatGtMatCond_IntVarVar(float, float, int, int) register (after)
479 /// CHECK: <<Cond:z\d+>> GreaterThanOrEqual [{{f\d+}},{{f\d+}}]
480 /// CHECK-NEXT: <<Sel:i\d+>> Select [{{i\d+}},{{i\d+}},<<Cond>>]
481 /// CHECK-NEXT: Add [<<Cond>>,<<Sel>>]
482
David Brazdilc0b601b2016-02-08 14:20:45 +0000483 /// CHECK-START-ARM64: int Main.FloatGtMatCond_IntVarVar(float, float, int, int) disassembly (after)
484 /// CHECK: GreaterThanOrEqual
485 /// CHECK-NEXT: fcmp
486 /// CHECK-NEXT: cset hs
487 /// CHECK: Select
488 /// CHECK-NEXT: csel hs
489
David Brazdilfb502702016-02-02 10:09:14 +0000490 public static int FloatGtMatCond_IntVarVar(float a, float b, int x, int y) {
Alexandre Rames880f1192016-06-13 16:04:50 +0100491 if (doThrow) {
492 // Try defeating inlining.
493 throw new Error();
494 }
David Brazdilfb502702016-02-02 10:09:14 +0000495 int result = (a < b ? x : y);
496 return result + (a < b ? 0 : 1);
497 }
498
499 /// CHECK-START: float Main.FloatGtMatCond_FloatVarVar(float, float, float, float) register (after)
500 /// CHECK: <<Cond:z\d+>> GreaterThanOrEqual
501 /// CHECK-NEXT: <<Sel:f\d+>> Select [{{f\d+}},{{f\d+}},<<Cond>>]
502 /// CHECK-NEXT: TypeConversion [<<Cond>>]
503
David Brazdilc0b601b2016-02-08 14:20:45 +0000504 /// CHECK-START-ARM64: float Main.FloatGtMatCond_FloatVarVar(float, float, float, float) disassembly (after)
505 /// CHECK: GreaterThanOrEqual
506 /// CHECK-NEXT: fcmp
507 /// CHECK-NEXT: cset hs
508 /// CHECK: Select
509 /// CHECK-NEXT: fcsel hs
510
David Brazdilfb502702016-02-02 10:09:14 +0000511 public static float FloatGtMatCond_FloatVarVar(float a, float b, float x, float y) {
Alexandre Rames880f1192016-06-13 16:04:50 +0100512 if (doThrow) {
513 // Try defeating inlining.
514 throw new Error();
515 }
David Brazdilfb502702016-02-02 10:09:14 +0000516 float result = (a < b ? x : y);
517 return result + (a < b ? 0 : 1);
518 }
519
Alexandre Rames880f1192016-06-13 16:04:50 +0100520 /// CHECK-START: int Main.BoolCond_0_m1(boolean) register (after)
521 /// CHECK: <<Cond:z\d+>> ParameterValue
522 /// CHECK: Select [{{i\d+}},{{i\d+}},<<Cond>>]
523
524 /// CHECK-START-ARM64: int Main.BoolCond_0_m1(boolean) disassembly (after)
525 /// CHECK: <<Cond:z\d+>> ParameterValue
526 /// CHECK: Select [{{i\d+}},{{i\d+}},<<Cond>>]
527 /// CHECK-NEXT: cmp {{w\d+}}, #0x0 (0)
528 /// CHECK-NEXT: csetm {{w\d+}}, eq
529
530 /// CHECK-START-X86_64: int Main.BoolCond_0_m1(boolean) disassembly (after)
531 /// CHECK: <<Cond:z\d+>> ParameterValue
532 /// CHECK: Select [{{i\d+}},{{i\d+}},<<Cond>>]
533 /// CHECK: cmovnz/ne
534
535 /// CHECK-START-X86: int Main.BoolCond_0_m1(boolean) disassembly (after)
536 /// CHECK: <<Cond:z\d+>> ParameterValue
537 /// CHECK: Select [{{i\d+}},{{i\d+}},<<Cond>>]
538 /// CHECK: cmovnz/ne
539
540 public static int BoolCond_0_m1(boolean cond) {
541 if (doThrow) {
542 // Try defeating inlining.
543 throw new Error();
544 }
545 return cond ? 0 : -1;
546 }
547
548 /// CHECK-START: int Main.BoolCond_m1_0(boolean) register (after)
549 /// CHECK: <<Cond:z\d+>> ParameterValue
550 /// CHECK: Select [{{i\d+}},{{i\d+}},<<Cond>>]
551
552 /// CHECK-START-ARM64: int Main.BoolCond_m1_0(boolean) disassembly (after)
553 /// CHECK: <<Cond:z\d+>> ParameterValue
554 /// CHECK: Select [{{i\d+}},{{i\d+}},<<Cond>>]
555 /// CHECK-NEXT: cmp {{w\d+}}, #0x0 (0)
556 /// CHECK-NEXT: csetm {{w\d+}}, ne
557
558 /// CHECK-START-X86_64: int Main.BoolCond_m1_0(boolean) disassembly (after)
559 /// CHECK: <<Cond:z\d+>> ParameterValue
560 /// CHECK: Select [{{i\d+}},{{i\d+}},<<Cond>>]
561 /// CHECK: cmovnz/ne
562
563 /// CHECK-START-X86: int Main.BoolCond_m1_0(boolean) disassembly (after)
564 /// CHECK: <<Cond:z\d+>> ParameterValue
565 /// CHECK: Select [{{i\d+}},{{i\d+}},<<Cond>>]
566 /// CHECK: cmovnz/ne
567
568 public static int BoolCond_m1_0(boolean cond) {
569 if (doThrow) {
570 // Try defeating inlining.
571 throw new Error();
572 }
573 return cond ? -1 : 0;
574 }
575
David Brazdilfb502702016-02-02 10:09:14 +0000576 public static void assertEqual(int expected, int actual) {
577 if (expected != actual) {
578 throw new Error("Assertion failed: " + expected + " != " + actual);
579 }
580 }
581
582 public static void assertEqual(float expected, float actual) {
583 if (expected != actual) {
584 throw new Error("Assertion failed: " + expected + " != " + actual);
585 }
586 }
587
588 public static void main(String[] args) {
589 assertEqual(5, BoolCond_IntVarVar(true, 5, 7));
590 assertEqual(7, BoolCond_IntVarVar(false, 5, 7));
591 assertEqual(5, BoolCond_IntVarCst(true, 5));
592 assertEqual(1, BoolCond_IntVarCst(false, 5));
593 assertEqual(1, BoolCond_IntCstVar(true, 7));
594 assertEqual(7, BoolCond_IntCstVar(false, 7));
595
Mark Mendell7c0b44f2016-02-01 10:08:35 -0500596 assertEqual(5L, BoolCond_LongVarVar(true, 5L, 7L));
597 assertEqual(7L, BoolCond_LongVarVar(false, 5L, 7L));
598 assertEqual(5L, BoolCond_LongVarCst(true, 5L));
599 assertEqual(1L, BoolCond_LongVarCst(false, 5L));
600 assertEqual(1L, BoolCond_LongCstVar(true, 7L));
601 assertEqual(7L, BoolCond_LongCstVar(false, 7L));
602
David Brazdilfb502702016-02-02 10:09:14 +0000603 assertEqual(5, BoolCond_FloatVarVar(true, 5, 7));
604 assertEqual(7, BoolCond_FloatVarVar(false, 5, 7));
605 assertEqual(5, BoolCond_FloatVarCst(true, 5));
606 assertEqual(1, BoolCond_FloatVarCst(false, 5));
607 assertEqual(1, BoolCond_FloatCstVar(true, 7));
608 assertEqual(7, BoolCond_FloatCstVar(false, 7));
609
610 assertEqual(5, IntNonmatCond_IntVarVar(3, 2, 5, 7));
611 assertEqual(7, IntNonmatCond_IntVarVar(2, 3, 5, 7));
612 assertEqual(5, IntMatCond_IntVarVar(3, 2, 5, 7));
613 assertEqual(8, IntMatCond_IntVarVar(2, 3, 5, 7));
614
615 assertEqual(5, FloatLtNonmatCond_IntVarVar(3, 2, 5, 7));
616 assertEqual(7, FloatLtNonmatCond_IntVarVar(2, 3, 5, 7));
617 assertEqual(7, FloatLtNonmatCond_IntVarVar(Float.NaN, 2, 5, 7));
618 assertEqual(7, FloatLtNonmatCond_IntVarVar(2, Float.NaN, 5, 7));
619
620 assertEqual(5, FloatGtNonmatCond_IntVarVar(2, 3, 5, 7));
621 assertEqual(7, FloatGtNonmatCond_IntVarVar(3, 2, 5, 7));
622 assertEqual(7, FloatGtNonmatCond_IntVarVar(Float.NaN, 2, 5, 7));
623 assertEqual(7, FloatGtNonmatCond_IntVarVar(2, Float.NaN, 5, 7));
624
625 assertEqual(5, FloatGtNonmatCond_FloatVarVar(2, 3, 5, 7));
626 assertEqual(7, FloatGtNonmatCond_FloatVarVar(3, 2, 5, 7));
627 assertEqual(7, FloatGtNonmatCond_FloatVarVar(Float.NaN, 2, 5, 7));
628 assertEqual(7, FloatGtNonmatCond_FloatVarVar(2, Float.NaN, 5, 7));
629
630 assertEqual(5, FloatLtMatCond_IntVarVar(3, 2, 5, 7));
631 assertEqual(8, FloatLtMatCond_IntVarVar(2, 3, 5, 7));
632 assertEqual(8, FloatLtMatCond_IntVarVar(Float.NaN, 2, 5, 7));
633 assertEqual(8, FloatLtMatCond_IntVarVar(2, Float.NaN, 5, 7));
634
635 assertEqual(5, FloatGtMatCond_IntVarVar(2, 3, 5, 7));
636 assertEqual(8, FloatGtMatCond_IntVarVar(3, 2, 5, 7));
637 assertEqual(8, FloatGtMatCond_IntVarVar(Float.NaN, 2, 5, 7));
638 assertEqual(8, FloatGtMatCond_IntVarVar(2, Float.NaN, 5, 7));
639
640 assertEqual(5, FloatGtMatCond_FloatVarVar(2, 3, 5, 7));
641 assertEqual(8, FloatGtMatCond_FloatVarVar(3, 2, 5, 7));
642 assertEqual(8, FloatGtMatCond_FloatVarVar(Float.NaN, 2, 5, 7));
643 assertEqual(8, FloatGtMatCond_FloatVarVar(2, Float.NaN, 5, 7));
Alexandre Rames880f1192016-06-13 16:04:50 +0100644
645 assertEqual(0, BoolCond_0_m1(true));
646 assertEqual(-1, BoolCond_0_m1(false));
647 assertEqual(-1, BoolCond_m1_0(true));
648 assertEqual(0, BoolCond_m1_0(false));
David Brazdilfb502702016-02-02 10:09:14 +0000649 }
650}