1 /*
2 * Copyright (c) 2022, 2025, Arm Limited. All rights reserved.
3 * Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved.
4 * Copyright (c) 2025, Rivos Inc. All rights reserved.
5 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
6 *
7 * This code is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License version 2 only, as
9 * published by the Free Software Foundation.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26 package compiler.c2.irTests;
27
28 import compiler.lib.ir_framework.*;
29 import java.util.Random;
30 import jdk.test.lib.Asserts;
31 import jdk.test.lib.Utils;
32
33 /*
34 * @test
35 * @bug 8289422 8306088 8313720
36 * @key randomness
37 * @summary Auto-vectorization enhancement to support vector conditional move.
38 * @library /test/lib /
39 * @run driver ${test.main.class}
40 */
41
42 public class TestConditionalMove {
43 final private static int SIZE = 1024;
44 private static final Random RANDOM = Utils.getRandomInstance();
45
46 public static void main(String[] args) {
47 // Vectorizaion: +UseCMoveUnconditionally, +UseVectorCmov
48 // Cross-product: +-AlignVector and +-UseCompactObjectHeaders
49 TestFramework.runWithFlags("-XX:+UseCMoveUnconditionally", "-XX:+UseVectorCmov",
50 "-XX:-UseCompactObjectHeaders", "-XX:-AlignVector");
51 TestFramework.runWithFlags("-XX:+UseCMoveUnconditionally", "-XX:+UseVectorCmov",
52 "-XX:-UseCompactObjectHeaders", "-XX:+AlignVector");
53 TestFramework.runWithFlags("-XX:+UseCMoveUnconditionally", "-XX:+UseVectorCmov",
54 "-XX:+UseCompactObjectHeaders", "-XX:-AlignVector");
55 TestFramework.runWithFlags("-XX:+UseCMoveUnconditionally", "-XX:+UseVectorCmov",
56 "-XX:+UseCompactObjectHeaders", "-XX:+AlignVector");
57
58 // Scalar: +UseCMoveUnconditionally, -UseVectorCmov
59 TestFramework.runWithFlags("-XX:+UseCMoveUnconditionally", "-XX:-UseVectorCmov",
60 "-XX:+UnlockExperimentalVMOptions", "-XX:-UseCompactObjectHeaders");
61 TestFramework.runWithFlags("-XX:+UseCMoveUnconditionally", "-XX:-UseVectorCmov",
62 "-XX:+UnlockExperimentalVMOptions", "-XX:+UseCompactObjectHeaders");
63 }
64
65 // Compare 2 values, and pick one of them
66 private float cmoveFloatGT(float a, float b) {
67 return (a > b) ? a : b;
68 }
69
70 private float cmoveFloatGTSwap(float a, float b) {
71 return (b > a) ? a : b;
72 }
73
74 private float cmoveFloatLT(float a, float b) {
75 return (a < b) ? a : b;
76 }
77
78 private float cmoveFloatLTSwap(float a, float b) {
79 return (b < a) ? a : b;
80 }
81
82 private float cmoveFloatEQ(float a, float b) {
83 return (a == b) ? a : b;
84 }
85
86 private double cmoveDoubleLE(double a, double b) {
87 return (a <= b) ? a : b;
88 }
89
90 private double cmoveDoubleLESwap(double a, double b) {
91 return (b <= a) ? a : b;
92 }
93
94 private double cmoveDoubleGE(double a, double b) {
95 return (a >= b) ? a : b;
96 }
97
98 private double cmoveDoubleGESwap(double a, double b) {
99 return (b >= a) ? a : b;
100 }
101
102 private double cmoveDoubleNE(double a, double b) {
103 return (a != b) ? a : b;
104 }
105
106 // Extensions: compare 2 values, and pick from 2 consts
107 private float cmoveFGTforFConst(float a, float b) {
108 return (a > b) ? 0.1f : -0.1f;
109 }
110
111 private float cmoveFGEforFConst(float a, float b) {
112 return (a >= b) ? 0.1f : -0.1f;
113 }
114
115 private float cmoveFLTforFConst(float a, float b) {
116 return (a < b) ? 0.1f : -0.1f;
117 }
118
119 private float cmoveFLEforFConst(float a, float b) {
120 return (a <= b) ? 0.1f : -0.1f;
121 }
122
123 private float cmoveFEQforFConst(float a, float b) {
124 return (a == b) ? 0.1f : -0.1f;
125 }
126
127 private float cmoveFNEQforFConst(float a, float b) {
128 return (a != b) ? 0.1f : -0.1f;
129 }
130
131 private double cmoveDGTforDConst(double a, double b) {
132 return (a > b) ? 0.1 : -0.1;
133 }
134
135 private double cmoveDGEforDConst(double a, double b) {
136 return (a >= b) ? 0.1 : -0.1;
137 }
138
139 private double cmoveDLTforDConst(double a, double b) {
140 return (a < b) ? 0.1 : -0.1;
141 }
142
143 private double cmoveDLEforDConst(double a, double b) {
144 return (a <= b) ? 0.1 : -0.1;
145 }
146
147 private double cmoveDEQforDConst(double a, double b) {
148 return (a == b) ? 0.1 : -0.1;
149 }
150
151 private double cmoveDNEQforDConst(double a, double b) {
152 return (a != b) ? 0.1 : -0.1;
153 }
154
155 // Extension: Compare 2 ILFD values, and pick from 2 ILFD values
156 // Signed comparison: I/L
157 // I for I
158 private int cmoveIEQforI(int a, int b, int c, int d) {
159 return (a == b) ? c : d;
160 }
161
162 private int cmoveINEforI(int a, int b, int c, int d) {
163 return (a != b) ? c : d;
164 }
165
166 private int cmoveIGTforI(int a, int b, int c, int d) {
167 return (a > b) ? c : d;
168 }
169
170 private int cmoveIGEforI(int a, int b, int c, int d) {
171 return (a >= b) ? c : d;
172 }
173
174 private int cmoveILTforI(int a, int b, int c, int d) {
175 return (a < b) ? c : d;
176 }
177
178 private int cmoveILEforI(int a, int b, int c, int d) {
179 return (a <= b) ? c : d;
180 }
181
182 // I for L
183 private long cmoveIEQforL(int a, int b, long c, long d) {
184 return (a == b) ? c : d;
185 }
186
187 private long cmoveINEforL(int a, int b, long c, long d) {
188 return (a != b) ? c : d;
189 }
190
191 private long cmoveIGTforL(int a, int b, long c, long d) {
192 return (a > b) ? c : d;
193 }
194
195 private long cmoveIGEforL(int a, int b, long c, long d) {
196 return (a >= b) ? c : d;
197 }
198
199 private long cmoveILTforL(int a, int b, long c, long d) {
200 return (a < b) ? c : d;
201 }
202
203 private long cmoveILEforL(int a, int b, long c, long d) {
204 return (a <= b) ? c : d;
205 }
206
207 // I for F
208 private float cmoveIEQforF(int a, int b, float c, float d) {
209 return (a == b) ? c : d;
210 }
211
212 private float cmoveINEforF(int a, int b, float c, float d) {
213 return (a != b) ? c : d;
214 }
215
216 private float cmoveIGTforF(int a, int b, float c, float d) {
217 return (a > b) ? c : d;
218 }
219
220 private float cmoveIGEforF(int a, int b, float c, float d) {
221 return (a >= b) ? c : d;
222 }
223
224 private float cmoveILTforF(int a, int b, float c, float d) {
225 return (a < b) ? c : d;
226 }
227
228 private float cmoveILEforF(int a, int b, float c, float d) {
229 return (a <= b) ? c : d;
230 }
231
232 // I for D
233 private double cmoveIEQforD(int a, int b, double c, double d) {
234 return (a == b) ? c : d;
235 }
236
237 private double cmoveINEforD(int a, int b, double c, double d) {
238 return (a != b) ? c : d;
239 }
240
241 private double cmoveIGTforD(int a, int b, double c, double d) {
242 return (a > b) ? c : d;
243 }
244
245 private double cmoveIGEforD(int a, int b, double c, double d) {
246 return (a >= b) ? c : d;
247 }
248
249 private double cmoveILTforD(int a, int b, double c, double d) {
250 return (a < b) ? c : d;
251 }
252
253 private double cmoveILEforD(int a, int b, double c, double d) {
254 return (a <= b) ? c : d;
255 }
256
257 // L for I
258 private int cmoveLEQforI(long a, long b, int c, int d) {
259 return (a == b) ? c : d;
260 }
261
262 private int cmoveLNEforI(long a, long b, int c, int d) {
263 return (a != b) ? c : d;
264 }
265
266 private int cmoveLGTforI(long a, long b, int c, int d) {
267 return (a > b) ? c : d;
268 }
269
270 private int cmoveLGEforI(long a, long b, int c, int d) {
271 return (a >= b) ? c : d;
272 }
273
274 private int cmoveLLTforI(long a, long b, int c, int d) {
275 return (a < b) ? c : d;
276 }
277
278 private int cmoveLLEforI(long a, long b, int c, int d) {
279 return (a <= b) ? c : d;
280 }
281
282 // L for L
283 private long cmoveLEQforL(long a, long b, long c, long d) {
284 return (a == b) ? c : d;
285 }
286
287 private long cmoveLNEforL(long a, long b, long c, long d) {
288 return (a != b) ? c : d;
289 }
290
291 private long cmoveLGTforL(long a, long b, long c, long d) {
292 return (a > b) ? c : d;
293 }
294
295 private long cmoveLGEforL(long a, long b, long c, long d) {
296 return (a >= b) ? c : d;
297 }
298
299 private long cmoveLLTforL(long a, long b, long c, long d) {
300 return (a < b) ? c : d;
301 }
302
303 private long cmoveLLEforL(long a, long b, long c, long d) {
304 return (a <= b) ? c : d;
305 }
306
307 // L for F
308 private float cmoveLEQforF(long a, long b, float c, float d) {
309 return (a == b) ? c : d;
310 }
311
312 private float cmoveLNEforF(long a, long b, float c, float d) {
313 return (a != b) ? c : d;
314 }
315
316 private float cmoveLGTforF(long a, long b, float c, float d) {
317 return (a > b) ? c : d;
318 }
319
320 private float cmoveLGEforF(long a, long b, float c, float d) {
321 return (a >= b) ? c : d;
322 }
323
324 private float cmoveLLTforF(long a, long b, float c, float d) {
325 return (a < b) ? c : d;
326 }
327
328 private float cmoveLLEforF(long a, long b, float c, float d) {
329 return (a <= b) ? c : d;
330 }
331
332 // L for D
333 private double cmoveLEQforD(long a, long b, double c, double d) {
334 return (a == b) ? c : d;
335 }
336
337 private double cmoveLNEforD(long a, long b, double c, double d) {
338 return (a != b) ? c : d;
339 }
340
341 private double cmoveLGTforD(long a, long b, double c, double d) {
342 return (a > b) ? c : d;
343 }
344
345 private double cmoveLGEforD(long a, long b, double c, double d) {
346 return (a >= b) ? c : d;
347 }
348
349 private double cmoveLLTforD(long a, long b, double c, double d) {
350 return (a < b) ? c : d;
351 }
352
353 private double cmoveLLEforD(long a, long b, double c, double d) {
354 return (a <= b) ? c : d;
355 }
356
357 // Unsigned comparison: I/L
358 // I for I
359 private int cmoveUIEQforI(int a, int b, int c, int d) {
360 return Integer.compareUnsigned(a, b) == 0 ? c : d;
361 }
362
363 private int cmoveUINEforI(int a, int b, int c, int d) {
364 return Integer.compareUnsigned(a, b) != 0 ? c : d;
365 }
366
367 private int cmoveUIGTforI(int a, int b, int c, int d) {
368 return Integer.compareUnsigned(a, b) > 0 ? c : d;
369 }
370
371 private int cmoveUIGEforI(int a, int b, int c, int d) {
372 return Integer.compareUnsigned(a, b) >= 0 ? c : d;
373 }
374
375 private int cmoveUILTforI(int a, int b, int c, int d) {
376 return Integer.compareUnsigned(a, b) < 0 ? c : d;
377 }
378
379 private int cmoveUILEforI(int a, int b, int c, int d) {
380 return Integer.compareUnsigned(a, b) <= 0 ? c : d;
381 }
382
383 // I for L
384 private long cmoveUIEQforL(int a, int b, long c, long d) {
385 return Integer.compareUnsigned(a, b) == 0 ? c : d;
386 }
387
388 private long cmoveUINEforL(int a, int b, long c, long d) {
389 return Integer.compareUnsigned(a, b) != 0 ? c : d;
390 }
391
392 private long cmoveUIGTforL(int a, int b, long c, long d) {
393 return Integer.compareUnsigned(a, b) > 0 ? c : d;
394 }
395
396 private long cmoveUIGEforL(int a, int b, long c, long d) {
397 return Integer.compareUnsigned(a, b) >= 0 ? c : d;
398 }
399
400 private long cmoveUILTforL(int a, int b, long c, long d) {
401 return Integer.compareUnsigned(a, b) < 0 ? c : d;
402 }
403
404 private long cmoveUILEforL(int a, int b, long c, long d) {
405 return Integer.compareUnsigned(a, b) <= 0 ? c : d;
406 }
407
408 // I for F
409 private float cmoveUIEQforF(int a, int b, float c, float d) {
410 return Integer.compareUnsigned(a, b) == 0 ? c : d;
411 }
412
413 private float cmoveUINEforF(int a, int b, float c, float d) {
414 return Integer.compareUnsigned(a, b) != 0 ? c : d;
415 }
416
417 private float cmoveUIGTforF(int a, int b, float c, float d) {
418 return Integer.compareUnsigned(a, b) > 0 ? c : d;
419 }
420
421 private float cmoveUIGEforF(int a, int b, float c, float d) {
422 return Integer.compareUnsigned(a, b) >= 0 ? c : d;
423 }
424
425 private float cmoveUILTforF(int a, int b, float c, float d) {
426 return Integer.compareUnsigned(a, b) < 0 ? c : d;
427 }
428
429 private float cmoveUILEforF(int a, int b, float c, float d) {
430 return Integer.compareUnsigned(a, b) <= 0 ? c : d;
431 }
432
433 // I for D
434 private double cmoveUIEQforD(int a, int b, double c, double d) {
435 return Integer.compareUnsigned(a, b) == 0 ? c : d;
436 }
437
438 private double cmoveUINEforD(int a, int b, double c, double d) {
439 return Integer.compareUnsigned(a, b) != 0 ? c : d;
440 }
441
442 private double cmoveUIGTforD(int a, int b, double c, double d) {
443 return Integer.compareUnsigned(a, b) > 0 ? c : d;
444 }
445
446 private double cmoveUIGEforD(int a, int b, double c, double d) {
447 return Integer.compareUnsigned(a, b) >= 0 ? c : d;
448 }
449
450 private double cmoveUILTforD(int a, int b, double c, double d) {
451 return Integer.compareUnsigned(a, b) < 0 ? c : d;
452 }
453
454 private double cmoveUILEforD(int a, int b, double c, double d) {
455 return Integer.compareUnsigned(a, b) <= 0 ? c : d;
456 }
457
458 // L for I
459 private int cmoveULEQforI(long a, long b, int c, int d) {
460 return Long.compareUnsigned(a, b) == 0 ? c : d;
461 }
462
463 private int cmoveULNEforI(long a, long b, int c, int d) {
464 return Long.compareUnsigned(a, b) != 0 ? c : d;
465 }
466
467 private int cmoveULGTforI(long a, long b, int c, int d) {
468 return Long.compareUnsigned(a, b) > 0 ? c : d;
469 }
470
471 private int cmoveULGEforI(long a, long b, int c, int d) {
472 return Long.compareUnsigned(a, b) >= 0 ? c : d;
473 }
474
475 private int cmoveULLTforI(long a, long b, int c, int d) {
476 return Long.compareUnsigned(a, b) < 0 ? c : d;
477 }
478
479 private int cmoveULLEforI(long a, long b, int c, int d) {
480 return Long.compareUnsigned(a, b) <= 0 ? c : d;
481 }
482
483 // L for L
484 private long cmoveULEQforL(long a, long b, long c, long d) {
485 return Long.compareUnsigned(a, b) == 0 ? c : d;
486 }
487
488 private long cmoveULNEforL(long a, long b, long c, long d) {
489 return Long.compareUnsigned(a, b) != 0 ? c : d;
490 }
491
492 private long cmoveULGTforL(long a, long b, long c, long d) {
493 return Long.compareUnsigned(a, b) > 0 ? c : d;
494 }
495
496 private long cmoveULGEforL(long a, long b, long c, long d) {
497 return Long.compareUnsigned(a, b) >= 0 ? c : d;
498 }
499
500 private long cmoveULLTforL(long a, long b, long c, long d) {
501 return Long.compareUnsigned(a, b) < 0 ? c : d;
502 }
503
504 private long cmoveULLEforL(long a, long b, long c, long d) {
505 return Long.compareUnsigned(a, b) <= 0 ? c : d;
506 }
507
508 // L for F
509 private float cmoveULEQforF(long a, long b, float c, float d) {
510 return Long.compareUnsigned(a, b) == 0 ? c : d;
511 }
512
513 private float cmoveULNEforF(long a, long b, float c, float d) {
514 return Long.compareUnsigned(a, b) != 0 ? c : d;
515 }
516
517 private float cmoveULGTforF(long a, long b, float c, float d) {
518 return Long.compareUnsigned(a, b) > 0 ? c : d;
519 }
520
521 private float cmoveULGEforF(long a, long b, float c, float d) {
522 return Long.compareUnsigned(a, b) >= 0 ? c : d;
523 }
524
525 private float cmoveULLTforF(long a, long b, float c, float d) {
526 return Long.compareUnsigned(a, b) < 0 ? c : d;
527 }
528
529 private float cmoveULLEforF(long a, long b, float c, float d) {
530 return Long.compareUnsigned(a, b) <= 0 ? c : d;
531 }
532
533 // L for D
534 private double cmoveULEQforD(long a, long b, double c, double d) {
535 return Long.compareUnsigned(a, b) == 0 ? c : d;
536 }
537
538 private double cmoveULNEforD(long a, long b, double c, double d) {
539 return Long.compareUnsigned(a, b) != 0 ? c : d;
540 }
541
542 private double cmoveULGTforD(long a, long b, double c, double d) {
543 return Long.compareUnsigned(a, b) > 0 ? c : d;
544 }
545
546 private double cmoveULGEforD(long a, long b, double c, double d) {
547 return Long.compareUnsigned(a, b) >= 0 ? c : d;
548 }
549
550 private double cmoveULLTforD(long a, long b, double c, double d) {
551 return Long.compareUnsigned(a, b) < 0 ? c : d;
552 }
553
554 private double cmoveULLEforD(long a, long b, double c, double d) {
555 return Long.compareUnsigned(a, b) <= 0 ? c : d;
556 }
557
558 // Float comparison
559 private int cmoveFGTforI(float a, float b, int c, int d) {
560 return (a > b) ? c : d;
561 }
562
563 private long cmoveFGTforL(float a, float b, long c, long d) {
564 return (a > b) ? c : d;
565 }
566
567 private float cmoveFGTforF(float a, float b, float c, float d) {
568 return (a > b) ? c : d;
569 }
570
571 private double cmoveFGTforD(float a, float b, double c, double d) {
572 return (a > b) ? c : d;
573 }
574
575 // Double comparison
576 private int cmoveDGTforI(double a, double b, int c, int d) {
577 return (a > b) ? c : d;
578 }
579
580 private long cmoveDGTforL(double a, double b, long c, long d) {
581 return (a > b) ? c : d;
582 }
583
584 private float cmoveDGTforF(double a, double b, float c, float d) {
585 return (a > b) ? c : d;
586 }
587
588 private double cmoveDGTforD(double a, double b, double c, double d) {
589 return (a > b) ? c : d;
590 }
591
592 // Compare 2 values, and pick one of them
593 @Test
594 @IR(counts = {IRNode.LOAD_VECTOR_F, ">0",
595 IRNode.VECTOR_MASK_CMP_F, ">0",
596 IRNode.VECTOR_BLEND_F, ">0",
597 IRNode.STORE_VECTOR, ">0"},
598 applyIfCPUFeatureOr = {"avx", "true", "asimd", "true", "rvv", "true"},
599 applyIf = {"UseVectorCmov", "true"})
600 @IR(failOn = {IRNode.STORE_VECTOR},
601 applyIf = {"UseVectorCmov", "false"})
602 @IR(counts = {IRNode.CMOVE_F, ">0", IRNode.CMP_F, ">0"},
603 applyIf = {"UseVectorCmov", "false"},
604 applyIfPlatformOr = {"riscv64", "true", "x64", "true", "aarch64", "true"})
605 private static void testCMoveVFGT(float[] a, float[] b, float[] c) {
606 for (int i = 0; i < a.length; i++) {
607 c[i] = (a[i] > b[i]) ? a[i] : b[i];
608 }
609 }
610
611 @Test
612 @IR(counts = {IRNode.LOAD_VECTOR_F, ">0",
613 IRNode.VECTOR_MASK_CMP_F, ">0",
614 IRNode.VECTOR_BLEND_F, ">0",
615 IRNode.STORE_VECTOR, ">0"},
616 applyIfCPUFeatureOr = {"avx", "true", "asimd", "true", "rvv", "true"},
617 applyIf = {"UseVectorCmov", "true"})
618 @IR(failOn = {IRNode.STORE_VECTOR},
619 applyIf = {"UseVectorCmov", "false"})
620 @IR(counts = {IRNode.CMOVE_F, ">0", IRNode.CMP_F, ">0"},
621 applyIf = {"UseVectorCmov", "false"},
622 applyIfPlatformOr = {"riscv64", "true", "x64", "true", "aarch64", "true"})
623 private static void testCMoveVFGTSwap(float[] a, float[] b, float[] c) {
624 for (int i = 0; i < a.length; i++) {
625 c[i] = (b[i] > a[i]) ? a[i] : b[i];
626 }
627 }
628
629 @Test
630 @IR(counts = {IRNode.LOAD_VECTOR_F, ">0",
631 IRNode.VECTOR_MASK_CMP_F, ">0",
632 IRNode.VECTOR_BLEND_F, ">0",
633 IRNode.STORE_VECTOR, ">0"},
634 applyIfCPUFeatureOr = {"avx", "true", "asimd", "true", "rvv", "true"},
635 applyIf = {"UseVectorCmov", "true"})
636 @IR(failOn = {IRNode.STORE_VECTOR},
637 applyIf = {"UseVectorCmov", "false"})
638 @IR(counts = {IRNode.CMOVE_F, ">0", IRNode.CMP_F, ">0"},
639 applyIf = {"UseVectorCmov", "false"},
640 applyIfPlatformOr = {"riscv64", "true", "x64", "true", "aarch64", "true"})
641 private static void testCMoveVFLT(float[] a, float[] b, float[] c) {
642 for (int i = 0; i < a.length; i++) {
643 c[i] = (a[i] < b[i]) ? a[i] : b[i];
644 }
645 }
646
647 @Test
648 @IR(counts = {IRNode.LOAD_VECTOR_F, ">0",
649 IRNode.VECTOR_MASK_CMP_F, ">0",
650 IRNode.VECTOR_BLEND_F, ">0",
651 IRNode.STORE_VECTOR, ">0"},
652 applyIfCPUFeatureOr = {"avx", "true", "asimd", "true", "rvv", "true"},
653 applyIf = {"UseVectorCmov", "true"})
654 @IR(failOn = {IRNode.STORE_VECTOR},
655 applyIf = {"UseVectorCmov", "false"})
656 @IR(counts = {IRNode.CMOVE_F, ">0", IRNode.CMP_F, ">0"},
657 applyIf = {"UseVectorCmov", "false"},
658 applyIfPlatformOr = {"riscv64", "true", "x64", "true", "aarch64", "true"})
659 private static void testCMoveVFLTSwap(float[] a, float[] b, float[] c) {
660 for (int i = 0; i < a.length; i++) {
661 c[i] = (b[i] < a[i]) ? a[i] : b[i];
662 }
663 }
664
665 @Test
666 @IR(counts = {IRNode.LOAD_VECTOR_F, ">0",
667 IRNode.VECTOR_MASK_CMP_F, ">0",
668 IRNode.VECTOR_BLEND_F, ">0",
669 IRNode.STORE_VECTOR, ">0"},
670 applyIfCPUFeatureOr = {"avx", "true", "asimd", "true", "rvv", "true"},
671 applyIf = {"UseVectorCmov", "true"})
672 @IR(failOn = {IRNode.STORE_VECTOR},
673 applyIf = {"UseVectorCmov", "false"})
674 @IR(counts = {IRNode.CMOVE_F, ">0", IRNode.CMP_F, ">0"},
675 applyIf = {"UseVectorCmov", "false"},
676 applyIfPlatformOr = {"riscv64", "true", "x64", "true", "aarch64", "true"})
677 private static void testCMoveVFEQ(float[] a, float[] b, float[] c) {
678 for (int i = 0; i < a.length; i++) {
679 c[i] = (a[i] == b[i]) ? a[i] : b[i];
680 }
681 }
682
683 @Test
684 @IR(counts = {IRNode.LOAD_VECTOR_D, ">0",
685 IRNode.VECTOR_MASK_CMP_D, ">0",
686 IRNode.VECTOR_BLEND_D, ">0",
687 IRNode.STORE_VECTOR, ">0"},
688 applyIfCPUFeatureOr = {"avx", "true", "asimd", "true", "rvv", "true"},
689 applyIf = {"UseVectorCmov", "true"})
690 @IR(failOn = {IRNode.STORE_VECTOR},
691 applyIf = {"UseVectorCmov", "false"})
692 @IR(counts = {IRNode.CMOVE_D, ">0", IRNode.CMP_D, ">0"},
693 applyIf = {"UseVectorCmov", "false"},
694 applyIfPlatformOr = {"riscv64", "true", "x64", "true", "aarch64", "true"})
695 private static void testCMoveVDLE(double[] a, double[] b, double[] c) {
696 for (int i = 0; i < a.length; i++) {
697 c[i] = (a[i] <= b[i]) ? a[i] : b[i];
698 }
699 }
700
701 @Test
702 @IR(counts = {IRNode.LOAD_VECTOR_D, ">0",
703 IRNode.VECTOR_MASK_CMP_D, ">0",
704 IRNode.VECTOR_BLEND_D, ">0",
705 IRNode.STORE_VECTOR, ">0"},
706 applyIfCPUFeatureOr = {"avx", "true", "asimd", "true", "rvv", "true"},
707 applyIf = {"UseVectorCmov", "true"})
708 @IR(failOn = {IRNode.STORE_VECTOR},
709 applyIf = {"UseVectorCmov", "false"})
710 @IR(counts = {IRNode.CMOVE_D, ">0", IRNode.CMP_D, ">0"},
711 applyIf = {"UseVectorCmov", "false"},
712 applyIfPlatformOr = {"riscv64", "true", "x64", "true", "aarch64", "true"})
713 private static void testCMoveVDLESwap(double[] a, double[] b, double[] c) {
714 for (int i = 0; i < a.length; i++) {
715 c[i] = (b[i] <= a[i]) ? a[i] : b[i];
716 }
717 }
718
719 @Test
720 @IR(counts = {IRNode.LOAD_VECTOR_D, ">0",
721 IRNode.VECTOR_MASK_CMP_D, ">0",
722 IRNode.VECTOR_BLEND_D, ">0",
723 IRNode.STORE_VECTOR, ">0"},
724 applyIfCPUFeatureOr = {"avx", "true", "asimd", "true", "rvv", "true"},
725 applyIf = {"UseVectorCmov", "true"})
726 @IR(failOn = {IRNode.STORE_VECTOR},
727 applyIf = {"UseVectorCmov", "false"})
728 @IR(counts = {IRNode.CMOVE_D, ">0", IRNode.CMP_D, ">0"},
729 applyIf = {"UseVectorCmov", "false"},
730 applyIfPlatformOr = {"riscv64", "true", "x64", "true", "aarch64", "true"})
731 private static void testCMoveVDGE(double[] a, double[] b, double[] c) {
732 for (int i = 0; i < a.length; i++) {
733 c[i] = (a[i] >= b[i]) ? a[i] : b[i];
734 }
735 }
736
737 @Test
738 @IR(counts = {IRNode.LOAD_VECTOR_D, ">0",
739 IRNode.VECTOR_MASK_CMP_D, ">0",
740 IRNode.VECTOR_BLEND_D, ">0",
741 IRNode.STORE_VECTOR, ">0"},
742 applyIfCPUFeatureOr = {"avx", "true", "asimd", "true", "rvv", "true"},
743 applyIf = {"UseVectorCmov", "true"})
744 @IR(failOn = {IRNode.STORE_VECTOR},
745 applyIf = {"UseVectorCmov", "false"})
746 @IR(counts = {IRNode.CMOVE_D, ">0", IRNode.CMP_D, ">0"},
747 applyIf = {"UseVectorCmov", "false"},
748 applyIfPlatformOr = {"riscv64", "true", "x64", "true", "aarch64", "true"})
749 private static void testCMoveVDGESwap(double[] a, double[] b, double[] c) {
750 for (int i = 0; i < a.length; i++) {
751 c[i] = (b[i] >= a[i]) ? a[i] : b[i];
752 }
753 }
754
755 @Test
756 @IR(counts = {IRNode.LOAD_VECTOR_D, ">0",
757 IRNode.VECTOR_MASK_CMP_D, ">0",
758 IRNode.VECTOR_BLEND_D, ">0",
759 IRNode.STORE_VECTOR, ">0"},
760 applyIfCPUFeatureOr = {"avx", "true", "asimd", "true", "rvv", "true"},
761 applyIf = {"UseVectorCmov", "true"})
762 @IR(failOn = {IRNode.STORE_VECTOR},
763 applyIf = {"UseVectorCmov", "false"})
764 @IR(counts = {IRNode.CMOVE_D, ">0", IRNode.CMP_D, ">0"},
765 applyIf = {"UseVectorCmov", "false"},
766 applyIfPlatformOr = {"riscv64", "true", "x64", "true", "aarch64", "true"})
767 private static void testCMoveVDNE(double[] a, double[] b, double[] c) {
768 for (int i = 0; i < a.length; i++) {
769 c[i] = (a[i] != b[i]) ? a[i] : b[i];
770 }
771 }
772
773 // Extensions: compare 2 values, and pick from 2 consts
774 @Test
775 @IR(counts = {IRNode.LOAD_VECTOR_F, ">0",
776 IRNode.VECTOR_MASK_CMP_F, ">0",
777 IRNode.VECTOR_BLEND_F, ">0",
778 IRNode.STORE_VECTOR, ">0"},
779 applyIfCPUFeatureOr = {"avx", "true", "asimd", "true", "rvv", "true"},
780 applyIf = {"UseVectorCmov", "true"})
781 @IR(failOn = {IRNode.STORE_VECTOR},
782 applyIf = {"UseVectorCmov", "false"})
783 @IR(counts = {IRNode.CMOVE_F, ">0", IRNode.CMP_F, ">0"},
784 applyIf = {"UseVectorCmov", "false"},
785 applyIfPlatformOr = {"riscv64", "true", "x64", "true", "aarch64", "true"})
786 private static void testCMoveFGTforFConst(float[] a, float[] b, float[] c) {
787 for (int i = 0; i < a.length; i++) {
788 c[i] = (a[i] > b[i]) ? 0.1f : -0.1f;
789 }
790 }
791
792 @Test
793 @IR(counts = {IRNode.LOAD_VECTOR_F, ">0",
794 IRNode.VECTOR_MASK_CMP_F, ">0",
795 IRNode.VECTOR_BLEND_F, ">0",
796 IRNode.STORE_VECTOR, ">0"},
797 applyIfCPUFeatureOr = {"avx", "true", "asimd", "true", "rvv", "true"},
798 applyIf = {"UseVectorCmov", "true"})
799 @IR(failOn = {IRNode.STORE_VECTOR},
800 applyIf = {"UseVectorCmov", "false"})
801 @IR(counts = {IRNode.CMOVE_F, ">0", IRNode.CMP_F, ">0"},
802 applyIf = {"UseVectorCmov", "false"},
803 applyIfPlatformOr = {"riscv64", "true", "x64", "true", "aarch64", "true"})
804 private static void testCMoveFGEforFConst(float[] a, float[] b, float[] c) {
805 for (int i = 0; i < a.length; i++) {
806 c[i] = (a[i] >= b[i]) ? 0.1f : -0.1f;
807 }
808 }
809
810 @Test
811 @IR(counts = {IRNode.LOAD_VECTOR_F, ">0",
812 IRNode.VECTOR_MASK_CMP_F, ">0",
813 IRNode.VECTOR_BLEND_F, ">0",
814 IRNode.STORE_VECTOR, ">0"},
815 applyIfCPUFeatureOr = {"avx", "true", "asimd", "true", "rvv", "true"},
816 applyIf = {"UseVectorCmov", "true"})
817 @IR(failOn = {IRNode.STORE_VECTOR},
818 applyIf = {"UseVectorCmov", "false"})
819 @IR(counts = {IRNode.CMOVE_F, ">0", IRNode.CMP_F, ">0"},
820 applyIf = {"UseVectorCmov", "false"},
821 applyIfPlatformOr = {"riscv64", "true", "x64", "true", "aarch64", "true"})
822 private static void testCMoveFLTforFConst(float[] a, float[] b, float[] c) {
823 for (int i = 0; i < a.length; i++) {
824 c[i] = (a[i] < b[i]) ? 0.1f : -0.1f;
825 }
826 }
827
828 @Test
829 @IR(counts = {IRNode.LOAD_VECTOR_F, ">0",
830 IRNode.VECTOR_MASK_CMP_F, ">0",
831 IRNode.VECTOR_BLEND_F, ">0",
832 IRNode.STORE_VECTOR, ">0"},
833 applyIfCPUFeatureOr = {"avx", "true", "asimd", "true", "rvv", "true"},
834 applyIf = {"UseVectorCmov", "true"})
835 @IR(failOn = {IRNode.STORE_VECTOR},
836 applyIf = {"UseVectorCmov", "false"})
837 @IR(counts = {IRNode.CMOVE_F, ">0", IRNode.CMP_F, ">0"},
838 applyIf = {"UseVectorCmov", "false"},
839 applyIfPlatformOr = {"riscv64", "true", "x64", "true", "aarch64", "true"})
840 private static void testCMoveFLEforFConst(float[] a, float[] b, float[] c) {
841 for (int i = 0; i < a.length; i++) {
842 c[i] = (a[i] <= b[i]) ? 0.1f : -0.1f;
843 }
844 }
845
846 @Test
847 @IR(counts = {IRNode.LOAD_VECTOR_F, ">0",
848 IRNode.VECTOR_MASK_CMP_F, ">0",
849 IRNode.VECTOR_BLEND_F, ">0",
850 IRNode.STORE_VECTOR, ">0"},
851 applyIfCPUFeatureOr = {"avx", "true", "asimd", "true", "rvv", "true"},
852 applyIf = {"UseVectorCmov", "true"})
853 @IR(failOn = {IRNode.STORE_VECTOR},
854 applyIf = {"UseVectorCmov", "false"})
855 @IR(counts = {IRNode.CMOVE_F, ">0", IRNode.CMP_F, ">0"},
856 applyIf = {"UseVectorCmov", "false"},
857 applyIfPlatformOr = {"riscv64", "true", "x64", "true", "aarch64", "true"})
858 private static void testCMoveFEQforFConst(float[] a, float[] b, float[] c) {
859 for (int i = 0; i < a.length; i++) {
860 c[i] = (a[i] == b[i]) ? 0.1f : -0.1f;
861 }
862 }
863
864 @Test
865 @IR(counts = {IRNode.LOAD_VECTOR_F, ">0",
866 IRNode.VECTOR_MASK_CMP_F, ">0",
867 IRNode.VECTOR_BLEND_F, ">0",
868 IRNode.STORE_VECTOR, ">0"},
869 applyIfCPUFeatureOr = {"avx", "true", "asimd", "true", "rvv", "true"},
870 applyIf = {"UseVectorCmov", "true"})
871 @IR(failOn = {IRNode.STORE_VECTOR},
872 applyIf = {"UseVectorCmov", "false"})
873 @IR(counts = {IRNode.CMOVE_F, ">0", IRNode.CMP_F, ">0"},
874 applyIf = {"UseVectorCmov", "false"},
875 applyIfPlatformOr = {"riscv64", "true", "x64", "true", "aarch64", "true"})
876 private static void testCMoveFNEQforFConst(float[] a, float[] b, float[] c) {
877 for (int i = 0; i < a.length; i++) {
878 c[i] = (a[i] != b[i]) ? 0.1f : -0.1f;
879 }
880 }
881
882 @Test
883 @IR(counts = {IRNode.LOAD_VECTOR_F, ">0",
884 IRNode.VECTOR_MASK_CMP_F, ">0",
885 IRNode.VECTOR_BLEND_F, ">0",
886 IRNode.STORE_VECTOR, ">0"},
887 applyIfAnd = {"UseCompactObjectHeaders", "false", "UseVectorCmov", "true"},
888 applyIfCPUFeatureOr = {"avx", "true", "asimd", "true", "rvv", "true"})
889 @IR(counts = {IRNode.LOAD_VECTOR_F, ">0",
890 IRNode.VECTOR_MASK_CMP_F, ">0",
891 IRNode.VECTOR_BLEND_F, ">0",
892 IRNode.STORE_VECTOR, ">0"},
893 applyIfAnd = {"AlignVector", "false", "UseVectorCmov", "true"},
894 applyIfCPUFeatureOr = {"avx", "true", "asimd", "true", "rvv", "true"})
895 @IR(failOn = {IRNode.STORE_VECTOR},
896 applyIf = {"UseVectorCmov", "false"})
897 @IR(counts = {IRNode.CMOVE_F, ">0", IRNode.CMP_F, ">0"},
898 applyIf = {"UseVectorCmov", "false"},
899 applyIfPlatformOr = {"riscv64", "true", "x64", "true", "aarch64", "true"})
900 private static void testCMoveFLTforFConstH2(float[] a, float[] b, float[] c) {
901 for (int i = 0; i < a.length; i+=2) {
902 c[i+0] = (a[i+0] < b[i+0]) ? 0.1f : -0.1f;
903 c[i+1] = (a[i+1] < b[i+1]) ? 0.1f : -0.1f;
904 // With AlignVector, we need 8-byte alignment of vector loads/stores.
905 // UseCompactObjectHeaders=false UseCompactObjectHeaders=true
906 // adr = base + 16 + 8*i -> always adr = base + 12 + 8*i -> never
907 // -> vectorize -> no vectorization
908 }
909 }
910
911 @Test
912 @IR(counts = {IRNode.LOAD_VECTOR_F, ">0",
913 IRNode.VECTOR_MASK_CMP_F, ">0",
914 IRNode.VECTOR_BLEND_F, ">0",
915 IRNode.STORE_VECTOR, ">0"},
916 applyIfAnd = {"UseCompactObjectHeaders", "false", "UseVectorCmov", "true"},
917 applyIfCPUFeatureOr = {"avx", "true", "asimd", "true", "rvv", "true"})
918 @IR(counts = {IRNode.LOAD_VECTOR_F, ">0",
919 IRNode.VECTOR_MASK_CMP_F, ">0",
920 IRNode.VECTOR_BLEND_F, ">0",
921 IRNode.STORE_VECTOR, ">0"},
922 applyIfAnd = {"AlignVector", "false", "UseVectorCmov", "true"},
923 applyIfCPUFeatureOr = {"avx", "true", "asimd", "true", "rvv", "true"})
924 @IR(failOn = {IRNode.STORE_VECTOR},
925 applyIf = {"UseVectorCmov", "false"})
926 @IR(counts = {IRNode.CMOVE_F, ">0", IRNode.CMP_F, ">0"},
927 applyIf = {"UseVectorCmov", "false"},
928 applyIfPlatformOr = {"riscv64", "true", "x64", "true", "aarch64", "true"})
929 private static void testCMoveFLEforFConstH2(float[] a, float[] b, float[] c) {
930 for (int i = 0; i < a.length; i+=2) {
931 c[i+0] = (a[i+0] <= b[i+0]) ? 0.1f : -0.1f;
932 c[i+1] = (a[i+1] <= b[i+1]) ? 0.1f : -0.1f;
933 // With AlignVector, we need 8-byte alignment of vector loads/stores.
934 // UseCompactObjectHeaders=false UseCompactObjectHeaders=true
935 // adr = base + 16 + 8*i -> always adr = base + 12 + 8*i -> never
936 // -> vectorize -> no vectorization
937 }
938 }
939
940 @Test
941 @IR(counts = {IRNode.LOAD_VECTOR_F, "=0",
942 IRNode.VECTOR_MASK_CMP_F, "=0",
943 IRNode.VECTOR_BLEND_F, "=0",
944 IRNode.STORE_VECTOR, "=0"},
945 applyIfCPUFeatureOr = {"avx", "true", "asimd", "true", "rvv", "true"},
946 applyIf = {"UseVectorCmov", "true"})
947 @IR(failOn = {IRNode.STORE_VECTOR},
948 applyIf = {"UseVectorCmov", "false"})
949 @IR(counts = {IRNode.CMOVE_F, ">0", IRNode.CMP_F, ">0"},
950 applyIf = {"UseVectorCmov", "false"},
951 applyIfPlatformOr = {"riscv64", "true", "x64", "true", "aarch64", "true"})
952 private static void testCMoveFYYforFConstH2(float[] a, float[] b, float[] c) {
953 for (int i = 0; i < a.length; i+=2) {
954 c[i+0] = (a[i+0] <= b[i+0]) ? 0.1f : -0.1f;
955 c[i+1] = (a[i+1] < b[i+1]) ? 0.1f : -0.1f;
956 }
957 }
958
959 @Test
960 @IR(counts = {IRNode.LOAD_VECTOR_F, "=0",
961 IRNode.VECTOR_MASK_CMP_F, "=0",
962 IRNode.VECTOR_BLEND_F, "=0",
963 IRNode.STORE_VECTOR, "=0"},
964 applyIfCPUFeatureOr = {"avx", "true", "asimd", "true", "rvv", "true"},
965 applyIf = {"UseVectorCmov", "true"})
966 @IR(failOn = {IRNode.STORE_VECTOR},
967 applyIf = {"UseVectorCmov", "false"})
968 @IR(counts = {IRNode.CMOVE_F, ">0", IRNode.CMP_F, ">0"},
969 applyIf = {"UseVectorCmov", "false"},
970 applyIfPlatformOr = {"riscv64", "true", "x64", "true", "aarch64", "true"})
971 private static void testCMoveFXXforFConstH2(float[] a, float[] b, float[] c) {
972 for (int i = 0; i < a.length; i+=2) {
973 c[i+0] = (a[i+0] < b[i+0]) ? 0.1f : -0.1f;
974 c[i+1] = (a[i+1] <= b[i+1]) ? 0.1f : -0.1f;
975 }
976 }
977
978 @Test
979 @IR(counts = {IRNode.LOAD_VECTOR_D, ">0",
980 IRNode.VECTOR_MASK_CMP_D, ">0",
981 IRNode.VECTOR_BLEND_D, ">0",
982 IRNode.STORE_VECTOR, ">0"},
983 applyIfCPUFeatureOr = {"avx", "true", "asimd", "true", "rvv", "true"},
984 applyIf = {"UseVectorCmov", "true"})
985 @IR(failOn = {IRNode.STORE_VECTOR},
986 applyIf = {"UseVectorCmov", "false"})
987 @IR(counts = {IRNode.CMOVE_D, ">0", IRNode.CMP_D, ">0"},
988 applyIf = {"UseVectorCmov", "false"},
989 applyIfPlatformOr = {"riscv64", "true", "x64", "true", "aarch64", "true"})
990 private static void testCMoveDGTforDConst(double[] a, double[] b, double[] c) {
991 for (int i = 0; i < a.length; i++) {
992 c[i] = (a[i] > b[i]) ? 0.1 : -0.1;
993 }
994 }
995
996 @Test
997 @IR(counts = {IRNode.LOAD_VECTOR_D, ">0",
998 IRNode.VECTOR_MASK_CMP_D, ">0",
999 IRNode.VECTOR_BLEND_D, ">0",
1000 IRNode.STORE_VECTOR, ">0"},
1001 applyIfCPUFeatureOr = {"avx", "true", "asimd", "true", "rvv", "true"},
1002 applyIf = {"UseVectorCmov", "true"})
1003 @IR(failOn = {IRNode.STORE_VECTOR},
1004 applyIf = {"UseVectorCmov", "false"})
1005 @IR(counts = {IRNode.CMOVE_D, ">0", IRNode.CMP_D, ">0"},
1006 applyIf = {"UseVectorCmov", "false"},
1007 applyIfPlatformOr = {"riscv64", "true", "x64", "true", "aarch64", "true"})
1008 private static void testCMoveDGEforDConst(double[] a, double[] b, double[] c) {
1009 for (int i = 0; i < a.length; i++) {
1010 c[i] = (a[i] >= b[i]) ? 0.1 : -0.1;
1011 }
1012 }
1013
1014 @Test
1015 @IR(counts = {IRNode.LOAD_VECTOR_D, ">0",
1016 IRNode.VECTOR_MASK_CMP_D, ">0",
1017 IRNode.VECTOR_BLEND_D, ">0",
1018 IRNode.STORE_VECTOR, ">0"},
1019 applyIfCPUFeatureOr = {"avx", "true", "asimd", "true", "rvv", "true"},
1020 applyIf = {"UseVectorCmov", "true"})
1021 @IR(failOn = {IRNode.STORE_VECTOR},
1022 applyIf = {"UseVectorCmov", "false"})
1023 @IR(counts = {IRNode.CMOVE_D, ">0", IRNode.CMP_D, ">0"},
1024 applyIf = {"UseVectorCmov", "false"},
1025 applyIfPlatformOr = {"riscv64", "true", "x64", "true", "aarch64", "true"})
1026 private static void testCMoveDLTforDConst(double[] a, double[] b, double[] c) {
1027 for (int i = 0; i < a.length; i++) {
1028 c[i] = (a[i] < b[i]) ? 0.1 : -0.1;
1029 }
1030 }
1031
1032 @Test
1033 @IR(counts = {IRNode.LOAD_VECTOR_D, ">0",
1034 IRNode.VECTOR_MASK_CMP_D, ">0",
1035 IRNode.VECTOR_BLEND_D, ">0",
1036 IRNode.STORE_VECTOR, ">0"},
1037 applyIfCPUFeatureOr = {"avx", "true", "asimd", "true", "rvv", "true"},
1038 applyIf = {"UseVectorCmov", "true"})
1039 @IR(failOn = {IRNode.STORE_VECTOR},
1040 applyIf = {"UseVectorCmov", "false"})
1041 @IR(counts = {IRNode.CMOVE_D, ">0", IRNode.CMP_D, ">0"},
1042 applyIf = {"UseVectorCmov", "false"},
1043 applyIfPlatformOr = {"riscv64", "true", "x64", "true", "aarch64", "true"})
1044 private static void testCMoveDLEforDConst(double[] a, double[] b, double[] c) {
1045 for (int i = 0; i < a.length; i++) {
1046 c[i] = (a[i] <= b[i]) ? 0.1 : -0.1;
1047 }
1048 }
1049
1050 @Test
1051 @IR(counts = {IRNode.LOAD_VECTOR_D, ">0",
1052 IRNode.VECTOR_MASK_CMP_D, ">0",
1053 IRNode.VECTOR_BLEND_D, ">0",
1054 IRNode.STORE_VECTOR, ">0"},
1055 applyIfCPUFeatureOr = {"avx", "true", "asimd", "true", "rvv", "true"},
1056 applyIf = {"UseVectorCmov", "true"})
1057 @IR(failOn = {IRNode.STORE_VECTOR},
1058 applyIf = {"UseVectorCmov", "false"})
1059 @IR(counts = {IRNode.CMOVE_D, ">0", IRNode.CMP_D, ">0"},
1060 applyIf = {"UseVectorCmov", "false"},
1061 applyIfPlatformOr = {"riscv64", "true", "x64", "true", "aarch64", "true"})
1062 private static void testCMoveDEQforDConst(double[] a, double[] b, double[] c) {
1063 for (int i = 0; i < a.length; i++) {
1064 c[i] = (a[i] == b[i]) ? 0.1 : -0.1;
1065 }
1066 }
1067
1068 @Test
1069 @IR(counts = {IRNode.LOAD_VECTOR_D, ">0",
1070 IRNode.VECTOR_MASK_CMP_D, ">0",
1071 IRNode.VECTOR_BLEND_D, ">0",
1072 IRNode.STORE_VECTOR, ">0"},
1073 applyIfCPUFeatureOr = {"avx", "true", "asimd", "true", "rvv", "true"},
1074 applyIf = {"UseVectorCmov", "true"})
1075 @IR(failOn = {IRNode.STORE_VECTOR},
1076 applyIf = {"UseVectorCmov", "false"})
1077 @IR(counts = {IRNode.CMOVE_D, ">0", IRNode.CMP_D, ">0"},
1078 applyIf = {"UseVectorCmov", "false"},
1079 applyIfPlatformOr = {"riscv64", "true", "x64", "true", "aarch64", "true"})
1080 private static void testCMoveDNEQforDConst(double[] a, double[] b, double[] c) {
1081 for (int i = 0; i < a.length; i++) {
1082 c[i] = (a[i] != b[i]) ? 0.1 : -0.1;
1083 }
1084 }
1085
1086 @Test
1087 @IR(counts = {IRNode.LOAD_VECTOR_D, ">0",
1088 IRNode.VECTOR_MASK_CMP_D, ">0",
1089 IRNode.VECTOR_BLEND_D, ">0",
1090 IRNode.STORE_VECTOR, ">0"},
1091 applyIfCPUFeatureOr = {"avx", "true", "asimd", "true", "rvv", "true"},
1092 applyIf = {"UseVectorCmov", "true"})
1093 @IR(failOn = {IRNode.STORE_VECTOR},
1094 applyIf = {"UseVectorCmov", "false"})
1095 @IR(counts = {IRNode.CMOVE_D, ">0", IRNode.CMP_D, ">0"},
1096 applyIf = {"UseVectorCmov", "false"},
1097 applyIfPlatformOr = {"riscv64", "true", "x64", "true", "aarch64", "true"})
1098 private static void testCMoveDLTforDConstH2(double[] a, double[] b, double[] c) {
1099 for (int i = 0; i < a.length; i+=2) {
1100 c[i+0] = (a[i+0] < b[i+0]) ? 0.1 : -0.1;
1101 c[i+1] = (a[i+1] < b[i+1]) ? 0.1 : -0.1;
1102 }
1103 }
1104
1105 @Test
1106 @IR(counts = {IRNode.LOAD_VECTOR_D, ">0",
1107 IRNode.VECTOR_MASK_CMP_D, ">0",
1108 IRNode.VECTOR_BLEND_D, ">0",
1109 IRNode.STORE_VECTOR, ">0"},
1110 applyIfCPUFeatureOr = {"avx", "true", "asimd", "true", "rvv", "true"},
1111 applyIf = {"UseVectorCmov", "true"})
1112 @IR(failOn = {IRNode.STORE_VECTOR},
1113 applyIf = {"UseVectorCmov", "false"})
1114 @IR(counts = {IRNode.CMOVE_D, ">0", IRNode.CMP_D, ">0"},
1115 applyIf = {"UseVectorCmov", "false"},
1116 applyIfPlatformOr = {"riscv64", "true", "x64", "true", "aarch64", "true"})
1117 private static void testCMoveDLEforDConstH2(double[] a, double[] b, double[] c) {
1118 for (int i = 0; i < a.length; i+=2) {
1119 c[i+0] = (a[i+0] <= b[i+0]) ? 0.1 : -0.1;
1120 c[i+1] = (a[i+1] <= b[i+1]) ? 0.1 : -0.1;
1121 }
1122 }
1123
1124 @Test
1125 @IR(counts = {IRNode.LOAD_VECTOR_D, "=0",
1126 IRNode.VECTOR_MASK_CMP_D, "=0",
1127 IRNode.VECTOR_BLEND_D, "=0",
1128 IRNode.STORE_VECTOR, "=0"},
1129 applyIfCPUFeatureOr = {"avx", "true", "asimd", "true", "rvv", "true"},
1130 applyIf = {"UseVectorCmov", "true"})
1131 @IR(failOn = {IRNode.STORE_VECTOR},
1132 applyIf = {"UseVectorCmov", "false"})
1133 @IR(counts = {IRNode.CMOVE_D, ">0", IRNode.CMP_D, ">0"},
1134 applyIf = {"UseVectorCmov", "false"},
1135 applyIfPlatformOr = {"riscv64", "true", "x64", "true", "aarch64", "true"})
1136 private static void testCMoveDYYforDConstH2(double[] a, double[] b, double[] c) {
1137 for (int i = 0; i < a.length; i+=2) {
1138 c[i+0] = (a[i+0] <= b[i+0]) ? 0.1 : -0.1;
1139 c[i+1] = (a[i+1] < b[i+1]) ? 0.1 : -0.1;
1140 }
1141 }
1142
1143 @Test
1144 @IR(counts = {IRNode.LOAD_VECTOR_D, "=0",
1145 IRNode.VECTOR_MASK_CMP_D, "=0",
1146 IRNode.VECTOR_BLEND_D, "=0",
1147 IRNode.STORE_VECTOR, "=0"},
1148 applyIfCPUFeatureOr = {"avx", "true", "asimd", "true", "rvv", "true"},
1149 applyIf = {"UseVectorCmov", "true"})
1150 @IR(failOn = {IRNode.STORE_VECTOR},
1151 applyIf = {"UseVectorCmov", "false"})
1152 @IR(counts = {IRNode.CMOVE_D, ">0", IRNode.CMP_D, ">0"},
1153 applyIf = {"UseVectorCmov", "false"},
1154 applyIfPlatformOr = {"riscv64", "true", "x64", "true", "aarch64", "true"})
1155 private static void testCMoveDXXforDConstH2(double[] a, double[] b, double[] c) {
1156 for (int i = 0; i < a.length; i+=2) {
1157 c[i+0] = (a[i+0] < b[i+0]) ? 0.1 : -0.1;
1158 c[i+1] = (a[i+1] <= b[i+1]) ? 0.1 : -0.1;
1159 }
1160 }
1161
1162 // Extension: Compare 2 ILFD values, and pick from 2 ILFD values
1163 // Note:
1164 // To guarantee that CMove is introduced, I need to perform the loads before the branch. To ensure they
1165 // do not float down into the branches, I compute a value, and store it to r2 (same as r, except that the
1166 // compilation does not know that).
1167 // So far, vectorization only works for CMoveF/D, with same data-width comparison (F/I for F, D/L for D).
1168 // TODO: enable CMOVE_I/L verification when it's guaranteed to generate CMOVE_I/L, JDK-8371984.
1169 //
1170 // Signed comparison: I/L
1171 // I fo I
1172 @Test
1173 @IR(failOn = {IRNode.STORE_VECTOR})
1174 // @IR(counts = {IRNode.CMOVE_I, ">0", IRNode.CMP_I, ">0"},
1175 // applyIf = {"UseVectorCmov", "false"},
1176 // applyIfPlatform = {"riscv64", "true"})
1177 private static void testCMoveIEQforI(int[] a, int[] b, int[] c, int[] d, int[] r, int[] r2) {
1178 for (int i = 0; i < a.length; i++) {
1179 int cc = c[i];
1180 int dd = d[i];
1181 r2[i] = cc + dd;
1182 r[i] = (a[i] == b[i]) ? cc : dd;
1183 }
1184 }
1185
1186 @Test
1187 @IR(failOn = {IRNode.STORE_VECTOR})
1188 // @IR(counts = {IRNode.CMOVE_I, ">0", IRNode.CMP_I, ">0"},
1189 // applyIf = {"UseVectorCmov", "false"},
1190 // applyIfPlatform = {"riscv64", "true"})
1191 private static void testCMoveINEforI(int[] a, int[] b, int[] c, int[] d, int[] r, int[] r2) {
1192 for (int i = 0; i < a.length; i++) {
1193 int cc = c[i];
1194 int dd = d[i];
1195 r2[i] = cc + dd;
1196 r[i] = (a[i] != b[i]) ? cc : dd;
1197 }
1198 }
1199
1200 @Test
1201 @IR(failOn = {IRNode.STORE_VECTOR})
1202 // @IR(counts = {IRNode.CMOVE_I, ">0", IRNode.CMP_I, ">0"},
1203 // applyIf = {"UseVectorCmov", "false"},
1204 // applyIfPlatform = {"riscv64", "true"})
1205 private static void testCMoveIGTforI(int[] a, int[] b, int[] c, int[] d, int[] r, int[] r2) {
1206 for (int i = 0; i < a.length; i++) {
1207 int cc = c[i];
1208 int dd = d[i];
1209 r2[i] = cc + dd;
1210 r[i] = (a[i] > b[i]) ? cc : dd;
1211 }
1212 }
1213
1214 @Test
1215 @IR(failOn = {IRNode.STORE_VECTOR})
1216 // @IR(counts = {IRNode.CMOVE_I, ">0", IRNode.CMP_I, ">0"},
1217 // applyIf = {"UseVectorCmov", "false"},
1218 // applyIfPlatform = {"riscv64", "true"})
1219 private static void testCMoveIGEforI(int[] a, int[] b, int[] c, int[] d, int[] r, int[] r2) {
1220 for (int i = 0; i < a.length; i++) {
1221 int cc = c[i];
1222 int dd = d[i];
1223 r2[i] = cc + dd;
1224 r[i] = (a[i] >= b[i]) ? cc : dd;
1225 }
1226 }
1227
1228 @Test
1229 @IR(failOn = {IRNode.STORE_VECTOR})
1230 // @IR(counts = {IRNode.CMOVE_I, ">0", IRNode.CMP_I, ">0"},
1231 // applyIf = {"UseVectorCmov", "false"},
1232 // applyIfPlatform = {"riscv64", "true"})
1233 private static void testCMoveILTforI(int[] a, int[] b, int[] c, int[] d, int[] r, int[] r2) {
1234 for (int i = 0; i < a.length; i++) {
1235 int cc = c[i];
1236 int dd = d[i];
1237 r2[i] = cc + dd;
1238 r[i] = (a[i] < b[i]) ? cc : dd;
1239 }
1240 }
1241
1242 @Test
1243 @IR(failOn = {IRNode.STORE_VECTOR})
1244 // @IR(counts = {IRNode.CMOVE_I, ">0", IRNode.CMP_I, ">0"},
1245 // applyIf = {"UseVectorCmov", "false"},
1246 // applyIfPlatform = {"riscv64", "true"})
1247 private static void testCMoveILEforI(int[] a, int[] b, int[] c, int[] d, int[] r, int[] r2) {
1248 for (int i = 0; i < a.length; i++) {
1249 int cc = c[i];
1250 int dd = d[i];
1251 r2[i] = cc + dd;
1252 r[i] = (a[i] <= b[i]) ? cc : dd;
1253 }
1254 }
1255
1256 // I fo L
1257 @Test
1258 @IR(failOn = {IRNode.STORE_VECTOR})
1259 // @IR(counts = {IRNode.CMOVE_L, ">0", IRNode.CMP_I, ">0"},
1260 // applyIf = {"UseVectorCmov", "false"},
1261 // applyIfPlatform = {"riscv64", "true"})
1262 private static void testCMoveIEQforL(int[] a, int[] b, long[] c, long[] d, long[] r, long[] r2) {
1263 for (int i = 0; i < a.length; i++) {
1264 long cc = c[i];
1265 long dd = d[i];
1266 r2[i] = cc + dd;
1267 r[i] = (a[i] == b[i]) ? cc : dd;
1268 }
1269 }
1270
1271 @Test
1272 @IR(failOn = {IRNode.STORE_VECTOR})
1273 // @IR(counts = {IRNode.CMOVE_L, ">0", IRNode.CMP_I, ">0"},
1274 // applyIf = {"UseVectorCmov", "false"},
1275 // applyIfPlatform = {"riscv64", "true"})
1276 private static void testCMoveINEforL(int[] a, int[] b, long[] c, long[] d, long[] r, long[] r2) {
1277 for (int i = 0; i < a.length; i++) {
1278 long cc = c[i];
1279 long dd = d[i];
1280 r2[i] = cc + dd;
1281 r[i] = (a[i] != b[i]) ? cc : dd;
1282 }
1283 }
1284
1285 @Test
1286 @IR(failOn = {IRNode.STORE_VECTOR})
1287 // @IR(counts = {IRNode.CMOVE_L, ">0", IRNode.CMP_I, ">0"},
1288 // applyIf = {"UseVectorCmov", "false"},
1289 // applyIfPlatform = {"riscv64", "true"})
1290 private static void testCMoveIGTforL(int[] a, int[] b, long[] c, long[] d, long[] r, long[] r2) {
1291 for (int i = 0; i < a.length; i++) {
1292 long cc = c[i];
1293 long dd = d[i];
1294 r2[i] = cc + dd;
1295 r[i] = (a[i] > b[i]) ? cc : dd;
1296 }
1297 }
1298
1299 @Test
1300 @IR(failOn = {IRNode.STORE_VECTOR})
1301 // @IR(counts = {IRNode.CMOVE_L, ">0", IRNode.CMP_I, ">0"},
1302 // applyIf = {"UseVectorCmov", "false"},
1303 // applyIfPlatform = {"riscv64", "true"})
1304 private static void testCMoveIGEforL(int[] a, int[] b, long[] c, long[] d, long[] r, long[] r2) {
1305 for (int i = 0; i < a.length; i++) {
1306 long cc = c[i];
1307 long dd = d[i];
1308 r2[i] = cc + dd;
1309 r[i] = (a[i] >= b[i]) ? cc : dd;
1310 }
1311 }
1312
1313 @Test
1314 @IR(failOn = {IRNode.STORE_VECTOR})
1315 // @IR(counts = {IRNode.CMOVE_L, ">0", IRNode.CMP_I, ">0"},
1316 // applyIf = {"UseVectorCmov", "false"},
1317 // applyIfPlatform = {"riscv64", "true"})
1318 private static void testCMoveILTforL(int[] a, int[] b, long[] c, long[] d, long[] r, long[] r2) {
1319 for (int i = 0; i < a.length; i++) {
1320 long cc = c[i];
1321 long dd = d[i];
1322 r2[i] = cc + dd;
1323 r[i] = (a[i] < b[i]) ? cc : dd;
1324 }
1325 }
1326
1327 @Test
1328 @IR(failOn = {IRNode.STORE_VECTOR})
1329 // @IR(counts = {IRNode.CMOVE_L, ">0", IRNode.CMP_I, ">0"},
1330 // applyIf = {"UseVectorCmov", "false"},
1331 // applyIfPlatform = {"riscv64", "true"})
1332 private static void testCMoveILEforL(int[] a, int[] b, long[] c, long[] d, long[] r, long[] r2) {
1333 for (int i = 0; i < a.length; i++) {
1334 long cc = c[i];
1335 long dd = d[i];
1336 r2[i] = cc + dd;
1337 r[i] = (a[i] <= b[i]) ? cc : dd;
1338 }
1339 }
1340
1341 // I fo F
1342 @Test
1343 @IR(counts = {IRNode.LOAD_VECTOR_I, IRNode.VECTOR_SIZE + "min(max_int, max_float)", ">0",
1344 IRNode.LOAD_VECTOR_F, IRNode.VECTOR_SIZE + "min(max_int, max_float)", ">0",
1345 IRNode.VECTOR_MASK_CMP_I, IRNode.VECTOR_SIZE + "min(max_int, max_float)", ">0",
1346 IRNode.VECTOR_BLEND_F, IRNode.VECTOR_SIZE + "min(max_int, max_float)", ">0",
1347 IRNode.STORE_VECTOR, ">0"},
1348 applyIfCPUFeatureOr = {"avx", "true", "asimd", "true", "rvv", "true"},
1349 applyIf = {"UseVectorCmov", "true"})
1350 @IR(failOn = {IRNode.STORE_VECTOR},
1351 applyIf = {"UseVectorCmov", "false"})
1352 @IR(counts = {IRNode.CMOVE_F, ">0", IRNode.CMP_I, ">0"},
1353 applyIf = {"UseVectorCmov", "false"},
1354 applyIfPlatformOr = {"riscv64", "true", "x64", "true", "aarch64", "true"})
1355 private static void testCMoveIEQforF(int[] a, int[] b, float[] c, float[] d, float[] r, float[] r2) {
1356 for (int i = 0; i < a.length; i++) {
1357 float cc = c[i];
1358 float dd = d[i];
1359 r2[i] = cc + dd;
1360 r[i] = (a[i] == b[i]) ? cc : dd;
1361 }
1362 }
1363
1364 @Test
1365 @IR(counts = {IRNode.LOAD_VECTOR_I, IRNode.VECTOR_SIZE + "min(max_int, max_float)", ">0",
1366 IRNode.LOAD_VECTOR_F, IRNode.VECTOR_SIZE + "min(max_int, max_float)", ">0",
1367 IRNode.VECTOR_MASK_CMP_I, IRNode.VECTOR_SIZE + "min(max_int, max_float)", ">0",
1368 IRNode.VECTOR_BLEND_F, IRNode.VECTOR_SIZE + "min(max_int, max_float)", ">0",
1369 IRNode.STORE_VECTOR, ">0"},
1370 applyIfCPUFeatureOr = {"avx", "true", "asimd", "true", "rvv", "true"},
1371 applyIf = {"UseVectorCmov", "true"})
1372 @IR(failOn = {IRNode.STORE_VECTOR},
1373 applyIf = {"UseVectorCmov", "false"})
1374 @IR(counts = {IRNode.CMOVE_F, ">0", IRNode.CMP_I, ">0"},
1375 applyIf = {"UseVectorCmov", "false"},
1376 applyIfPlatformOr = {"riscv64", "true", "x64", "true", "aarch64", "true"})
1377 private static void testCMoveINEforF(int[] a, int[] b, float[] c, float[] d, float[] r, float[] r2) {
1378 for (int i = 0; i < a.length; i++) {
1379 float cc = c[i];
1380 float dd = d[i];
1381 r2[i] = cc + dd;
1382 r[i] = (a[i] != b[i]) ? cc : dd;
1383 }
1384 }
1385
1386 @Test
1387 @IR(counts = {IRNode.LOAD_VECTOR_I, IRNode.VECTOR_SIZE + "min(max_int, max_float)", ">0",
1388 IRNode.LOAD_VECTOR_F, IRNode.VECTOR_SIZE + "min(max_int, max_float)", ">0",
1389 IRNode.VECTOR_MASK_CMP_I, IRNode.VECTOR_SIZE + "min(max_int, max_float)", ">0",
1390 IRNode.VECTOR_BLEND_F, IRNode.VECTOR_SIZE + "min(max_int, max_float)", ">0",
1391 IRNode.STORE_VECTOR, ">0"},
1392 applyIfCPUFeatureOr = {"avx", "true", "asimd", "true", "rvv", "true"},
1393 applyIf = {"UseVectorCmov", "true"})
1394 @IR(failOn = {IRNode.STORE_VECTOR},
1395 applyIf = {"UseVectorCmov", "false"})
1396 @IR(counts = {IRNode.CMOVE_F, ">0", IRNode.CMP_I, ">0"},
1397 applyIf = {"UseVectorCmov", "false"},
1398 applyIfPlatformOr = {"riscv64", "true", "x64", "true", "aarch64", "true"})
1399 private static void testCMoveIGTforF(int[] a, int[] b, float[] c, float[] d, float[] r, float[] r2) {
1400 for (int i = 0; i < a.length; i++) {
1401 float cc = c[i];
1402 float dd = d[i];
1403 r2[i] = cc + dd;
1404 r[i] = (a[i] > b[i]) ? cc : dd;
1405 }
1406 }
1407
1408 @Test
1409 @IR(counts = {IRNode.LOAD_VECTOR_I, IRNode.VECTOR_SIZE + "min(max_int, max_float)", ">0",
1410 IRNode.LOAD_VECTOR_F, IRNode.VECTOR_SIZE + "min(max_int, max_float)", ">0",
1411 IRNode.VECTOR_MASK_CMP_I, IRNode.VECTOR_SIZE + "min(max_int, max_float)", ">0",
1412 IRNode.VECTOR_BLEND_F, IRNode.VECTOR_SIZE + "min(max_int, max_float)", ">0",
1413 IRNode.STORE_VECTOR, ">0"},
1414 applyIfCPUFeatureOr = {"avx", "true", "asimd", "true", "rvv", "true"},
1415 applyIf = {"UseVectorCmov", "true"})
1416 @IR(failOn = {IRNode.STORE_VECTOR},
1417 applyIf = {"UseVectorCmov", "false"})
1418 @IR(counts = {IRNode.CMOVE_F, ">0", IRNode.CMP_I, ">0"},
1419 applyIf = {"UseVectorCmov", "false"},
1420 applyIfPlatformOr = {"riscv64", "true", "x64", "true", "aarch64", "true"})
1421 private static void testCMoveIGEforF(int[] a, int[] b, float[] c, float[] d, float[] r, float[] r2) {
1422 for (int i = 0; i < a.length; i++) {
1423 float cc = c[i];
1424 float dd = d[i];
1425 r2[i] = cc + dd;
1426 r[i] = (a[i] >= b[i]) ? cc : dd;
1427 }
1428 }
1429
1430 @Test
1431 @IR(counts = {IRNode.LOAD_VECTOR_I, IRNode.VECTOR_SIZE + "min(max_int, max_float)", ">0",
1432 IRNode.LOAD_VECTOR_F, IRNode.VECTOR_SIZE + "min(max_int, max_float)", ">0",
1433 IRNode.VECTOR_MASK_CMP_I, IRNode.VECTOR_SIZE + "min(max_int, max_float)", ">0",
1434 IRNode.VECTOR_BLEND_F, IRNode.VECTOR_SIZE + "min(max_int, max_float)", ">0",
1435 IRNode.STORE_VECTOR, ">0"},
1436 applyIfCPUFeatureOr = {"avx", "true", "asimd", "true", "rvv", "true"},
1437 applyIf = {"UseVectorCmov", "true"})
1438 @IR(failOn = {IRNode.STORE_VECTOR},
1439 applyIf = {"UseVectorCmov", "false"})
1440 @IR(counts = {IRNode.CMOVE_F, ">0", IRNode.CMP_I, ">0"},
1441 applyIf = {"UseVectorCmov", "false"},
1442 applyIfPlatformOr = {"riscv64", "true", "x64", "true", "aarch64", "true"})
1443 private static void testCMoveILTforF(int[] a, int[] b, float[] c, float[] d, float[] r, float[] r2) {
1444 for (int i = 0; i < a.length; i++) {
1445 float cc = c[i];
1446 float dd = d[i];
1447 r2[i] = cc + dd;
1448 r[i] = (a[i] < b[i]) ? cc : dd;
1449 }
1450 }
1451
1452 @Test
1453 @IR(counts = {IRNode.LOAD_VECTOR_I, IRNode.VECTOR_SIZE + "min(max_int, max_float)", ">0",
1454 IRNode.LOAD_VECTOR_F, IRNode.VECTOR_SIZE + "min(max_int, max_float)", ">0",
1455 IRNode.VECTOR_MASK_CMP_I, IRNode.VECTOR_SIZE + "min(max_int, max_float)", ">0",
1456 IRNode.VECTOR_BLEND_F, IRNode.VECTOR_SIZE + "min(max_int, max_float)", ">0",
1457 IRNode.STORE_VECTOR, ">0"},
1458 applyIfCPUFeatureOr = {"avx", "true", "asimd", "true", "rvv", "true"},
1459 applyIf = {"UseVectorCmov", "true"})
1460 @IR(failOn = {IRNode.STORE_VECTOR},
1461 applyIf = {"UseVectorCmov", "false"})
1462 @IR(counts = {IRNode.CMOVE_F, ">0", IRNode.CMP_I, ">0"},
1463 applyIf = {"UseVectorCmov", "false"},
1464 applyIfPlatformOr = {"riscv64", "true", "x64", "true", "aarch64", "true"})
1465 private static void testCMoveILEforF(int[] a, int[] b, float[] c, float[] d, float[] r, float[] r2) {
1466 for (int i = 0; i < a.length; i++) {
1467 float cc = c[i];
1468 float dd = d[i];
1469 r2[i] = cc + dd;
1470 r[i] = (a[i] <= b[i]) ? cc : dd;
1471 }
1472 }
1473
1474 // I fo D
1475 @Test
1476 @IR(failOn = {IRNode.STORE_VECTOR})
1477 @IR(counts = {IRNode.CMOVE_D, ">0", IRNode.CMP_I, ">0"},
1478 applyIf = {"UseVectorCmov", "false"},
1479 applyIfPlatformOr = {"riscv64", "true", "x64", "true", "aarch64", "true"})
1480 private static void testCMoveIEQforD(int[] a, int[] b, double[] c, double[] d, double[] r, double[] r2) {
1481 for (int i = 0; i < a.length; i++) {
1482 double cc = c[i];
1483 double dd = d[i];
1484 r2[i] = cc + dd;
1485 r[i] = (a[i] == b[i]) ? cc : dd;
1486 }
1487 }
1488
1489 @Test
1490 @IR(failOn = {IRNode.STORE_VECTOR})
1491 @IR(counts = {IRNode.CMOVE_D, ">0", IRNode.CMP_I, ">0"},
1492 applyIf = {"UseVectorCmov", "false"},
1493 applyIfPlatformOr = {"riscv64", "true", "x64", "true", "aarch64", "true"})
1494 private static void testCMoveINEforD(int[] a, int[] b, double[] c, double[] d, double[] r, double[] r2) {
1495 for (int i = 0; i < a.length; i++) {
1496 double cc = c[i];
1497 double dd = d[i];
1498 r2[i] = cc + dd;
1499 r[i] = (a[i] != b[i]) ? cc : dd;
1500 }
1501 }
1502
1503 @Test
1504 @IR(failOn = {IRNode.STORE_VECTOR})
1505 @IR(counts = {IRNode.CMOVE_D, ">0", IRNode.CMP_I, ">0"},
1506 applyIf = {"UseVectorCmov", "false"},
1507 applyIfPlatformOr = {"riscv64", "true", "x64", "true", "aarch64", "true"})
1508 private static void testCMoveIGTforD(int[] a, int[] b, double[] c, double[] d, double[] r, double[] r2) {
1509 for (int i = 0; i < a.length; i++) {
1510 double cc = c[i];
1511 double dd = d[i];
1512 r2[i] = cc + dd;
1513 r[i] = (a[i] > b[i]) ? cc : dd;
1514 }
1515 }
1516
1517 @Test
1518 @IR(failOn = {IRNode.STORE_VECTOR})
1519 @IR(counts = {IRNode.CMOVE_D, ">0", IRNode.CMP_I, ">0"},
1520 applyIf = {"UseVectorCmov", "false"},
1521 applyIfPlatformOr = {"riscv64", "true", "x64", "true", "aarch64", "true"})
1522 private static void testCMoveIGEforD(int[] a, int[] b, double[] c, double[] d, double[] r, double[] r2) {
1523 for (int i = 0; i < a.length; i++) {
1524 double cc = c[i];
1525 double dd = d[i];
1526 r2[i] = cc + dd;
1527 r[i] = (a[i] >= b[i]) ? cc : dd;
1528 }
1529 }
1530
1531 @Test
1532 @IR(failOn = {IRNode.STORE_VECTOR})
1533 @IR(counts = {IRNode.CMOVE_D, ">0", IRNode.CMP_I, ">0"},
1534 applyIf = {"UseVectorCmov", "false"},
1535 applyIfPlatformOr = {"riscv64", "true", "x64", "true", "aarch64", "true"})
1536 private static void testCMoveILTforD(int[] a, int[] b, double[] c, double[] d, double[] r, double[] r2) {
1537 for (int i = 0; i < a.length; i++) {
1538 double cc = c[i];
1539 double dd = d[i];
1540 r2[i] = cc + dd;
1541 r[i] = (a[i] < b[i]) ? cc : dd;
1542 }
1543 }
1544
1545 @Test
1546 @IR(failOn = {IRNode.STORE_VECTOR})
1547 @IR(counts = {IRNode.CMOVE_D, ">0", IRNode.CMP_I, ">0"},
1548 applyIf = {"UseVectorCmov", "false"},
1549 applyIfPlatformOr = {"riscv64", "true", "x64", "true", "aarch64", "true"})
1550 private static void testCMoveILEforD(int[] a, int[] b, double[] c, double[] d, double[] r, double[] r2) {
1551 for (int i = 0; i < a.length; i++) {
1552 double cc = c[i];
1553 double dd = d[i];
1554 r2[i] = cc + dd;
1555 r[i] = (a[i] <= b[i]) ? cc : dd;
1556 }
1557 }
1558
1559 // L fo I
1560 @Test
1561 @IR(failOn = {IRNode.STORE_VECTOR})
1562 // @IR(counts = {IRNode.CMOVE_I, ">0", IRNode.CMP_L, ">0"},
1563 // applyIf = {"UseVectorCmov", "false"},
1564 // applyIfPlatform = {"riscv64", "true"})
1565 private static void testCMoveLEQforI(long[] a, long[] b, int[] c, int[] d, int[] r, int[] r2) {
1566 for (int i = 0; i < a.length; i++) {
1567 int cc = c[i];
1568 int dd = d[i];
1569 r2[i] = cc + dd;
1570 r[i] = (a[i] == b[i]) ? cc : dd;
1571 }
1572 }
1573
1574 @Test
1575 @IR(failOn = {IRNode.STORE_VECTOR})
1576 // @IR(counts = {IRNode.CMOVE_I, ">0", IRNode.CMP_L, ">0"},
1577 // applyIf = {"UseVectorCmov", "false"},
1578 // applyIfPlatform = {"riscv64", "true"})
1579 private static void testCMoveLNEforI(long[] a, long[] b, int[] c, int[] d, int[] r, int[] r2) {
1580 for (int i = 0; i < a.length; i++) {
1581 int cc = c[i];
1582 int dd = d[i];
1583 r2[i] = cc + dd;
1584 r[i] = (a[i] != b[i]) ? cc : dd;
1585 }
1586 }
1587
1588 @Test
1589 @IR(failOn = {IRNode.STORE_VECTOR})
1590 // @IR(counts = {IRNode.CMOVE_I, ">0", IRNode.CMP_L, ">0"},
1591 // applyIf = {"UseVectorCmov", "false"},
1592 // applyIfPlatform = {"riscv64", "true"})
1593 private static void testCMoveLGTforI(long[] a, long[] b, int[] c, int[] d, int[] r, int[] r2) {
1594 for (int i = 0; i < a.length; i++) {
1595 int cc = c[i];
1596 int dd = d[i];
1597 r2[i] = cc + dd;
1598 r[i] = (a[i] > b[i]) ? cc : dd;
1599 }
1600 }
1601
1602 @Test
1603 @IR(failOn = {IRNode.STORE_VECTOR})
1604 // @IR(counts = {IRNode.CMOVE_I, ">0", IRNode.CMP_L, ">0"},
1605 // applyIf = {"UseVectorCmov", "false"},
1606 // applyIfPlatform = {"riscv64", "true"})
1607 private static void testCMoveLGEforI(long[] a, long[] b, int[] c, int[] d, int[] r, int[] r2) {
1608 for (int i = 0; i < a.length; i++) {
1609 int cc = c[i];
1610 int dd = d[i];
1611 r2[i] = cc + dd;
1612 r[i] = (a[i] >= b[i]) ? cc : dd;
1613 }
1614 }
1615
1616 @Test
1617 @IR(failOn = {IRNode.STORE_VECTOR})
1618 // @IR(counts = {IRNode.CMOVE_I, ">0", IRNode.CMP_L, ">0"},
1619 // applyIf = {"UseVectorCmov", "false"},
1620 // applyIfPlatform = {"riscv64", "true"})
1621 private static void testCMoveLLTforI(long[] a, long[] b, int[] c, int[] d, int[] r, int[] r2) {
1622 for (int i = 0; i < a.length; i++) {
1623 int cc = c[i];
1624 int dd = d[i];
1625 r2[i] = cc + dd;
1626 r[i] = (a[i] < b[i]) ? cc : dd;
1627 }
1628 }
1629
1630 @Test
1631 @IR(failOn = {IRNode.STORE_VECTOR})
1632 // @IR(counts = {IRNode.CMOVE_I, ">0", IRNode.CMP_L, ">0"},
1633 // applyIf = {"UseVectorCmov", "false"},
1634 // applyIfPlatform = {"riscv64", "true"})
1635 private static void testCMoveLLEforI(long[] a, long[] b, int[] c, int[] d, int[] r, int[] r2) {
1636 for (int i = 0; i < a.length; i++) {
1637 int cc = c[i];
1638 int dd = d[i];
1639 r2[i] = cc + dd;
1640 r[i] = (a[i] <= b[i]) ? cc : dd;
1641 }
1642 }
1643
1644 // L fo L
1645 @Test
1646 @IR(failOn = {IRNode.STORE_VECTOR})
1647 // @IR(counts = {IRNode.CMOVE_L, ">0", IRNode.CMP_L, ">0"},
1648 // applyIf = {"UseVectorCmov", "false"},
1649 // applyIfPlatform = {"riscv64", "true"})
1650 private static void testCMoveLEQforL(long[] a, long[] b, long[] c, long[] d, long[] r, long[] r2) {
1651 for (int i = 0; i < a.length; i++) {
1652 long cc = c[i];
1653 long dd = d[i];
1654 r2[i] = cc + dd;
1655 r[i] = (a[i] == b[i]) ? cc : dd;
1656 }
1657 }
1658
1659 @Test
1660 @IR(failOn = {IRNode.STORE_VECTOR})
1661 // @IR(counts = {IRNode.CMOVE_L, ">0", IRNode.CMP_L, ">0"},
1662 // applyIf = {"UseVectorCmov", "false"},
1663 // applyIfPlatform = {"riscv64", "true"})
1664 private static void testCMoveLNEforL(long[] a, long[] b, long[] c, long[] d, long[] r, long[] r2) {
1665 for (int i = 0; i < a.length; i++) {
1666 long cc = c[i];
1667 long dd = d[i];
1668 r2[i] = cc + dd;
1669 r[i] = (a[i] != b[i]) ? cc : dd;
1670 }
1671 }
1672
1673 @Test
1674 @IR(failOn = {IRNode.STORE_VECTOR})
1675 // @IR(counts = {IRNode.CMOVE_L, ">0", IRNode.CMP_L, ">0"},
1676 // applyIf = {"UseVectorCmov", "false"},
1677 // applyIfPlatform = {"riscv64", "true"})
1678 private static void testCMoveLGTforL(long[] a, long[] b, long[] c, long[] d, long[] r, long[] r2) {
1679 for (int i = 0; i < a.length; i++) {
1680 long cc = c[i];
1681 long dd = d[i];
1682 r2[i] = cc + dd;
1683 r[i] = (a[i] > b[i]) ? cc : dd;
1684 }
1685 }
1686
1687 @Test
1688 @IR(failOn = {IRNode.STORE_VECTOR})
1689 // @IR(counts = {IRNode.CMOVE_L, ">0", IRNode.CMP_L, ">0"},
1690 // applyIf = {"UseVectorCmov", "false"},
1691 // applyIfPlatform = {"riscv64", "true"})
1692 private static void testCMoveLGEforL(long[] a, long[] b, long[] c, long[] d, long[] r, long[] r2) {
1693 for (int i = 0; i < a.length; i++) {
1694 long cc = c[i];
1695 long dd = d[i];
1696 r2[i] = cc + dd;
1697 r[i] = (a[i] >= b[i]) ? cc : dd;
1698 }
1699 }
1700
1701 @Test
1702 @IR(failOn = {IRNode.STORE_VECTOR})
1703 // @IR(counts = {IRNode.CMOVE_L, ">0", IRNode.CMP_L, ">0"},
1704 // applyIf = {"UseVectorCmov", "false"},
1705 // applyIfPlatform = {"riscv64", "true"})
1706 private static void testCMoveLLTforL(long[] a, long[] b, long[] c, long[] d, long[] r, long[] r2) {
1707 for (int i = 0; i < a.length; i++) {
1708 long cc = c[i];
1709 long dd = d[i];
1710 r2[i] = cc + dd;
1711 r[i] = (a[i] < b[i]) ? cc : dd;
1712 }
1713 }
1714
1715 @Test
1716 @IR(failOn = {IRNode.STORE_VECTOR})
1717 // @IR(counts = {IRNode.CMOVE_L, ">0", IRNode.CMP_L, ">0"},
1718 // applyIf = {"UseVectorCmov", "false"},
1719 // applyIfPlatform = {"riscv64", "true"})
1720 private static void testCMoveLLEforL(long[] a, long[] b, long[] c, long[] d, long[] r, long[] r2) {
1721 for (int i = 0; i < a.length; i++) {
1722 long cc = c[i];
1723 long dd = d[i];
1724 r2[i] = cc + dd;
1725 r[i] = (a[i] <= b[i]) ? cc : dd;
1726 }
1727 }
1728
1729 // L fo F
1730 @Test
1731 @IR(failOn = {IRNode.STORE_VECTOR})
1732 @IR(counts = {IRNode.CMOVE_F, ">0", IRNode.CMP_L, ">0"},
1733 applyIf = {"UseVectorCmov", "false"},
1734 applyIfPlatformOr = {"riscv64", "true", "x64", "true", "aarch64", "true"})
1735 private static void testCMoveLEQforF(long[] a, long[] b, float[] c, float[] d, float[] r, float[] r2) {
1736 for (int i = 0; i < a.length; i++) {
1737 float cc = c[i];
1738 float dd = d[i];
1739 r2[i] = cc + dd;
1740 r[i] = (a[i] == b[i]) ? cc : dd;
1741 }
1742 }
1743
1744 @Test
1745 @IR(failOn = {IRNode.STORE_VECTOR})
1746 @IR(counts = {IRNode.CMOVE_F, ">0", IRNode.CMP_L, ">0"},
1747 applyIf = {"UseVectorCmov", "false"},
1748 applyIfPlatformOr = {"riscv64", "true", "x64", "true", "aarch64", "true"})
1749 private static void testCMoveLNEforF(long[] a, long[] b, float[] c, float[] d, float[] r, float[] r2) {
1750 for (int i = 0; i < a.length; i++) {
1751 float cc = c[i];
1752 float dd = d[i];
1753 r2[i] = cc + dd;
1754 r[i] = (a[i] != b[i]) ? cc : dd;
1755 }
1756 }
1757
1758 @Test
1759 @IR(failOn = {IRNode.STORE_VECTOR})
1760 @IR(counts = {IRNode.CMOVE_F, ">0", IRNode.CMP_L, ">0"},
1761 applyIf = {"UseVectorCmov", "false"},
1762 applyIfPlatformOr = {"riscv64", "true", "x64", "true", "aarch64", "true"})
1763 private static void testCMoveLGTforF(long[] a, long[] b, float[] c, float[] d, float[] r, float[] r2) {
1764 for (int i = 0; i < a.length; i++) {
1765 float cc = c[i];
1766 float dd = d[i];
1767 r2[i] = cc + dd;
1768 r[i] = (a[i] > b[i]) ? cc : dd;
1769 }
1770 }
1771
1772 @Test
1773 @IR(failOn = {IRNode.STORE_VECTOR})
1774 @IR(counts = {IRNode.CMOVE_F, ">0", IRNode.CMP_L, ">0"},
1775 applyIf = {"UseVectorCmov", "false"},
1776 applyIfPlatformOr = {"riscv64", "true", "x64", "true", "aarch64", "true"})
1777 private static void testCMoveLGEforF(long[] a, long[] b, float[] c, float[] d, float[] r, float[] r2) {
1778 for (int i = 0; i < a.length; i++) {
1779 float cc = c[i];
1780 float dd = d[i];
1781 r2[i] = cc + dd;
1782 r[i] = (a[i] >= b[i]) ? cc : dd;
1783 }
1784 }
1785
1786 @Test
1787 @IR(failOn = {IRNode.STORE_VECTOR})
1788 @IR(counts = {IRNode.CMOVE_F, ">0", IRNode.CMP_L, ">0"},
1789 applyIf = {"UseVectorCmov", "false"},
1790 applyIfPlatformOr = {"riscv64", "true", "x64", "true", "aarch64", "true"})
1791 private static void testCMoveLLTforF(long[] a, long[] b, float[] c, float[] d, float[] r, float[] r2) {
1792 for (int i = 0; i < a.length; i++) {
1793 float cc = c[i];
1794 float dd = d[i];
1795 r2[i] = cc + dd;
1796 r[i] = (a[i] < b[i]) ? cc : dd;
1797 }
1798 }
1799
1800 @Test
1801 @IR(failOn = {IRNode.STORE_VECTOR})
1802 @IR(counts = {IRNode.CMOVE_F, ">0", IRNode.CMP_L, ">0"},
1803 applyIf = {"UseVectorCmov", "false"},
1804 applyIfPlatformOr = {"riscv64", "true", "x64", "true", "aarch64", "true"})
1805 private static void testCMoveLLEforF(long[] a, long[] b, float[] c, float[] d, float[] r, float[] r2) {
1806 for (int i = 0; i < a.length; i++) {
1807 float cc = c[i];
1808 float dd = d[i];
1809 r2[i] = cc + dd;
1810 r[i] = (a[i] <= b[i]) ? cc : dd;
1811 }
1812 }
1813
1814 // L fo D
1815 @Test
1816 @IR(counts = {IRNode.LOAD_VECTOR_L, IRNode.VECTOR_SIZE + "min(max_long, max_double)", ">0",
1817 IRNode.LOAD_VECTOR_D, IRNode.VECTOR_SIZE + "min(max_long, max_double)", ">0",
1818 IRNode.VECTOR_MASK_CMP_L, IRNode.VECTOR_SIZE + "min(max_long, max_double)", ">0",
1819 IRNode.VECTOR_BLEND_D, IRNode.VECTOR_SIZE + "min(max_long, max_double)", ">0",
1820 IRNode.STORE_VECTOR, ">0"},
1821 applyIfCPUFeatureOr = {"avx2", "true", "asimd", "true", "rvv", "true"},
1822 applyIf = {"UseVectorCmov", "true"})
1823 @IR(failOn = {IRNode.STORE_VECTOR},
1824 applyIf = {"UseVectorCmov", "false"})
1825 @IR(counts = {IRNode.CMOVE_D, ">0", IRNode.CMP_L, ">0"},
1826 applyIf = {"UseVectorCmov", "false"},
1827 applyIfPlatformOr = {"riscv64", "true", "x64", "true", "aarch64", "true"})
1828 // Requires avx2, else L is restricted to 16 byte, and D has 32. That leads to a vector elements mismatch of 2 to 4.
1829 private static void testCMoveLEQforD(long[] a, long[] b, double[] c, double[] d, double[] r, double[] r2) {
1830 for (int i = 0; i < a.length; i++) {
1831 double cc = c[i];
1832 double dd = d[i];
1833 r2[i] = cc + dd;
1834 r[i] = (a[i] == b[i]) ? cc : dd;
1835 }
1836 }
1837
1838 @Test
1839 @IR(counts = {IRNode.LOAD_VECTOR_L, IRNode.VECTOR_SIZE + "min(max_long, max_double)", ">0",
1840 IRNode.LOAD_VECTOR_D, IRNode.VECTOR_SIZE + "min(max_long, max_double)", ">0",
1841 IRNode.VECTOR_MASK_CMP_L, IRNode.VECTOR_SIZE + "min(max_long, max_double)", ">0",
1842 IRNode.VECTOR_BLEND_D, IRNode.VECTOR_SIZE + "min(max_long, max_double)", ">0",
1843 IRNode.STORE_VECTOR, ">0"},
1844 applyIfCPUFeatureOr = {"avx2", "true", "asimd", "true", "rvv", "true"},
1845 applyIf = {"UseVectorCmov", "true"})
1846 @IR(failOn = {IRNode.STORE_VECTOR},
1847 applyIf = {"UseVectorCmov", "false"})
1848 @IR(counts = {IRNode.CMOVE_D, ">0", IRNode.CMP_L, ">0"},
1849 applyIf = {"UseVectorCmov", "false"},
1850 applyIfPlatformOr = {"riscv64", "true", "x64", "true", "aarch64", "true"})
1851 // Requires avx2, else L is restricted to 16 byte, and D has 32. That leads to a vector elements mismatch of 2 to 4.
1852 private static void testCMoveLNEforD(long[] a, long[] b, double[] c, double[] d, double[] r, double[] r2) {
1853 for (int i = 0; i < a.length; i++) {
1854 double cc = c[i];
1855 double dd = d[i];
1856 r2[i] = cc + dd;
1857 r[i] = (a[i] != b[i]) ? cc : dd;
1858 }
1859 }
1860
1861 @Test
1862 @IR(counts = {IRNode.LOAD_VECTOR_L, IRNode.VECTOR_SIZE + "min(max_long, max_double)", ">0",
1863 IRNode.LOAD_VECTOR_D, IRNode.VECTOR_SIZE + "min(max_long, max_double)", ">0",
1864 IRNode.VECTOR_MASK_CMP_L, IRNode.VECTOR_SIZE + "min(max_long, max_double)", ">0",
1865 IRNode.VECTOR_BLEND_D, IRNode.VECTOR_SIZE + "min(max_long, max_double)", ">0",
1866 IRNode.STORE_VECTOR, ">0"},
1867 applyIfCPUFeatureOr = {"avx2", "true", "asimd", "true", "rvv", "true"},
1868 applyIf = {"UseVectorCmov", "true"})
1869 @IR(failOn = {IRNode.STORE_VECTOR},
1870 applyIf = {"UseVectorCmov", "false"})
1871 @IR(counts = {IRNode.CMOVE_D, ">0", IRNode.CMP_L, ">0"},
1872 applyIf = {"UseVectorCmov", "false"},
1873 applyIfPlatformOr = {"riscv64", "true", "x64", "true", "aarch64", "true"})
1874 // Requires avx2, else L is restricted to 16 byte, and D has 32. That leads to a vector elements mismatch of 2 to 4.
1875 private static void testCMoveLGTforD(long[] a, long[] b, double[] c, double[] d, double[] r, double[] r2) {
1876 for (int i = 0; i < a.length; i++) {
1877 double cc = c[i];
1878 double dd = d[i];
1879 r2[i] = cc + dd;
1880 r[i] = (a[i] > b[i]) ? cc : dd;
1881 }
1882 }
1883
1884 @Test
1885 @IR(counts = {IRNode.LOAD_VECTOR_L, IRNode.VECTOR_SIZE + "min(max_long, max_double)", ">0",
1886 IRNode.LOAD_VECTOR_D, IRNode.VECTOR_SIZE + "min(max_long, max_double)", ">0",
1887 IRNode.VECTOR_MASK_CMP_L, IRNode.VECTOR_SIZE + "min(max_long, max_double)", ">0",
1888 IRNode.VECTOR_BLEND_D, IRNode.VECTOR_SIZE + "min(max_long, max_double)", ">0",
1889 IRNode.STORE_VECTOR, ">0"},
1890 applyIfCPUFeatureOr = {"avx2", "true", "asimd", "true", "rvv", "true"},
1891 applyIf = {"UseVectorCmov", "true"})
1892 @IR(failOn = {IRNode.STORE_VECTOR},
1893 applyIf = {"UseVectorCmov", "false"})
1894 @IR(counts = {IRNode.CMOVE_D, ">0", IRNode.CMP_L, ">0"},
1895 applyIf = {"UseVectorCmov", "false"},
1896 applyIfPlatformOr = {"riscv64", "true", "x64", "true", "aarch64", "true"})
1897 // Requires avx2, else L is restricted to 16 byte, and D has 32. That leads to a vector elements mismatch of 2 to 4.
1898 private static void testCMoveLGEforD(long[] a, long[] b, double[] c, double[] d, double[] r, double[] r2) {
1899 for (int i = 0; i < a.length; i++) {
1900 double cc = c[i];
1901 double dd = d[i];
1902 r2[i] = cc + dd;
1903 r[i] = (a[i] >= b[i]) ? cc : dd;
1904 }
1905 }
1906
1907 @Test
1908 @IR(counts = {IRNode.LOAD_VECTOR_L, IRNode.VECTOR_SIZE + "min(max_long, max_double)", ">0",
1909 IRNode.LOAD_VECTOR_D, IRNode.VECTOR_SIZE + "min(max_long, max_double)", ">0",
1910 IRNode.VECTOR_MASK_CMP_L, IRNode.VECTOR_SIZE + "min(max_long, max_double)", ">0",
1911 IRNode.VECTOR_BLEND_D, IRNode.VECTOR_SIZE + "min(max_long, max_double)", ">0",
1912 IRNode.STORE_VECTOR, ">0"},
1913 applyIfCPUFeatureOr = {"avx2", "true", "asimd", "true", "rvv", "true"},
1914 applyIf = {"UseVectorCmov", "true"})
1915 @IR(failOn = {IRNode.STORE_VECTOR},
1916 applyIf = {"UseVectorCmov", "false"})
1917 @IR(counts = {IRNode.CMOVE_D, ">0", IRNode.CMP_L, ">0"},
1918 applyIf = {"UseVectorCmov", "false"},
1919 applyIfPlatformOr = {"riscv64", "true", "x64", "true", "aarch64", "true"})
1920 // Requires avx2, else L is restricted to 16 byte, and D has 32. That leads to a vector elements mismatch of 2 to 4.
1921 private static void testCMoveLLTforD(long[] a, long[] b, double[] c, double[] d, double[] r, double[] r2) {
1922 for (int i = 0; i < a.length; i++) {
1923 double cc = c[i];
1924 double dd = d[i];
1925 r2[i] = cc + dd;
1926 r[i] = (a[i] < b[i]) ? cc : dd;
1927 }
1928 }
1929
1930 @Test
1931 @IR(counts = {IRNode.LOAD_VECTOR_L, IRNode.VECTOR_SIZE + "min(max_long, max_double)", ">0",
1932 IRNode.LOAD_VECTOR_D, IRNode.VECTOR_SIZE + "min(max_long, max_double)", ">0",
1933 IRNode.VECTOR_MASK_CMP_L, IRNode.VECTOR_SIZE + "min(max_long, max_double)", ">0",
1934 IRNode.VECTOR_BLEND_D, IRNode.VECTOR_SIZE + "min(max_long, max_double)", ">0",
1935 IRNode.STORE_VECTOR, ">0"},
1936 applyIfCPUFeatureOr = {"avx2", "true", "asimd", "true", "rvv", "true"},
1937 applyIf = {"UseVectorCmov", "true"})
1938 @IR(failOn = {IRNode.STORE_VECTOR},
1939 applyIf = {"UseVectorCmov", "false"})
1940 @IR(counts = {IRNode.CMOVE_D, ">0", IRNode.CMP_L, ">0"},
1941 applyIf = {"UseVectorCmov", "false"},
1942 applyIfPlatformOr = {"riscv64", "true", "x64", "true", "aarch64", "true"})
1943 // Requires avx2, else L is restricted to 16 byte, and D has 32. That leads to a vector elements mismatch of 2 to 4.
1944 private static void testCMoveLLEforD(long[] a, long[] b, double[] c, double[] d, double[] r, double[] r2) {
1945 for (int i = 0; i < a.length; i++) {
1946 double cc = c[i];
1947 double dd = d[i];
1948 r2[i] = cc + dd;
1949 r[i] = (a[i] <= b[i]) ? cc : dd;
1950 }
1951 }
1952
1953 // Unsigned comparison: I/L
1954 // I fo I
1955 @Test
1956 @IR(failOn = {IRNode.STORE_VECTOR})
1957 // @IR(counts = {IRNode.CMOVE_I, ">0", IRNode.CMP_U, ">0"},
1958 // applyIf = {"UseVectorCmov", "false"},
1959 // applyIfPlatform = {"riscv64", "true"})
1960 private static void testCMoveUIEQforI(int[] a, int[] b, int[] c, int[] d, int[] r, int[] r2) {
1961 for (int i = 0; i < a.length; i++) {
1962 int cc = c[i];
1963 int dd = d[i];
1964 r2[i] = cc + dd;
1965 r[i] = Integer.compareUnsigned(a[i], b[i]) == 0 ? cc : dd;
1966 }
1967 }
1968
1969 @Test
1970 @IR(failOn = {IRNode.STORE_VECTOR})
1971 // @IR(counts = {IRNode.CMOVE_I, ">0", IRNode.CMP_U, ">0"},
1972 // applyIf = {"UseVectorCmov", "false"},
1973 // applyIfPlatform = {"riscv64", "true"})
1974 private static void testCMoveUINEforI(int[] a, int[] b, int[] c, int[] d, int[] r, int[] r2) {
1975 for (int i = 0; i < a.length; i++) {
1976 int cc = c[i];
1977 int dd = d[i];
1978 r2[i] = cc + dd;
1979 r[i] = Integer.compareUnsigned(a[i], b[i]) != 0 ? cc : dd;
1980 }
1981 }
1982
1983 @Test
1984 @IR(failOn = {IRNode.STORE_VECTOR})
1985 // @IR(counts = {IRNode.CMOVE_I, ">0", IRNode.CMP_U, ">0"},
1986 // applyIf = {"UseVectorCmov", "false"},
1987 // applyIfPlatform = {"riscv64", "true"})
1988 private static void testCMoveUIGTforI(int[] a, int[] b, int[] c, int[] d, int[] r, int[] r2) {
1989 for (int i = 0; i < a.length; i++) {
1990 int cc = c[i];
1991 int dd = d[i];
1992 r2[i] = cc + dd;
1993 r[i] = Integer.compareUnsigned(a[i], b[i]) > 0 ? cc : dd;
1994 }
1995 }
1996
1997 @Test
1998 @IR(failOn = {IRNode.STORE_VECTOR})
1999 // @IR(counts = {IRNode.CMOVE_I, ">0", IRNode.CMP_U, ">0"},
2000 // applyIf = {"UseVectorCmov", "false"},
2001 // applyIfPlatform = {"riscv64", "true"})
2002 private static void testCMoveUIGEforI(int[] a, int[] b, int[] c, int[] d, int[] r, int[] r2) {
2003 for (int i = 0; i < a.length; i++) {
2004 int cc = c[i];
2005 int dd = d[i];
2006 r2[i] = cc + dd;
2007 r[i] = Integer.compareUnsigned(a[i], b[i]) >= 0 ? cc : dd;
2008 }
2009 }
2010
2011 @Test
2012 @IR(failOn = {IRNode.STORE_VECTOR})
2013 // @IR(counts = {IRNode.CMOVE_I, ">0", IRNode.CMP_U, ">0"},
2014 // applyIf = {"UseVectorCmov", "false"},
2015 // applyIfPlatform = {"riscv64", "true"})
2016 private static void testCMoveUILTforI(int[] a, int[] b, int[] c, int[] d, int[] r, int[] r2) {
2017 for (int i = 0; i < a.length; i++) {
2018 int cc = c[i];
2019 int dd = d[i];
2020 r2[i] = cc + dd;
2021 r[i] = Integer.compareUnsigned(a[i], b[i]) < 0 ? cc : dd;
2022 }
2023 }
2024
2025 @Test
2026 @IR(failOn = {IRNode.STORE_VECTOR})
2027 // @IR(counts = {IRNode.CMOVE_I, ">0", IRNode.CMP_U, ">0"},
2028 // applyIf = {"UseVectorCmov", "false"},
2029 // applyIfPlatform = {"riscv64", "true"})
2030 private static void testCMoveUILEforI(int[] a, int[] b, int[] c, int[] d, int[] r, int[] r2) {
2031 for (int i = 0; i < a.length; i++) {
2032 int cc = c[i];
2033 int dd = d[i];
2034 r2[i] = cc + dd;
2035 r[i] = Integer.compareUnsigned(a[i], b[i]) <= 0 ? cc : dd;
2036 }
2037 }
2038
2039 // I fo L
2040 @Test
2041 @IR(failOn = {IRNode.STORE_VECTOR})
2042 // @IR(counts = {IRNode.CMOVE_L, ">0", IRNode.CMP_U, ">0"},
2043 // applyIf = {"UseVectorCmov", "false"},
2044 // applyIfPlatform = {"riscv64", "true"})
2045 private static void testCMoveUIEQforL(int[] a, int[] b, long[] c, long[] d, long[] r, long[] r2) {
2046 for (int i = 0; i < a.length; i++) {
2047 long cc = c[i];
2048 long dd = d[i];
2049 r2[i] = cc + dd;
2050 r[i] = Integer.compareUnsigned(a[i], b[i]) == 0 ? cc : dd;
2051 }
2052 }
2053
2054 @Test
2055 @IR(failOn = {IRNode.STORE_VECTOR})
2056 // @IR(counts = {IRNode.CMOVE_L, ">0", IRNode.CMP_U, ">0"},
2057 // applyIf = {"UseVectorCmov", "false"},
2058 // applyIfPlatform = {"riscv64", "true"})
2059 private static void testCMoveUINEforL(int[] a, int[] b, long[] c, long[] d, long[] r, long[] r2) {
2060 for (int i = 0; i < a.length; i++) {
2061 long cc = c[i];
2062 long dd = d[i];
2063 r2[i] = cc + dd;
2064 r[i] = Integer.compareUnsigned(a[i], b[i]) != 0 ? cc : dd;
2065 }
2066 }
2067
2068 @Test
2069 @IR(failOn = {IRNode.STORE_VECTOR})
2070 // @IR(counts = {IRNode.CMOVE_L, ">0", IRNode.CMP_U, ">0"},
2071 // applyIf = {"UseVectorCmov", "false"},
2072 // applyIfPlatform = {"riscv64", "true"})
2073 private static void testCMoveUIGTforL(int[] a, int[] b, long[] c, long[] d, long[] r, long[] r2) {
2074 for (int i = 0; i < a.length; i++) {
2075 long cc = c[i];
2076 long dd = d[i];
2077 r2[i] = cc + dd;
2078 r[i] = Integer.compareUnsigned(a[i], b[i]) > 0 ? cc : dd;
2079 }
2080 }
2081
2082 @Test
2083 @IR(failOn = {IRNode.STORE_VECTOR})
2084 // @IR(counts = {IRNode.CMOVE_L, ">0", IRNode.CMP_U, ">0"},
2085 // applyIf = {"UseVectorCmov", "false"},
2086 // applyIfPlatform = {"riscv64", "true"})
2087 private static void testCMoveUIGEforL(int[] a, int[] b, long[] c, long[] d, long[] r, long[] r2) {
2088 for (int i = 0; i < a.length; i++) {
2089 long cc = c[i];
2090 long dd = d[i];
2091 r2[i] = cc + dd;
2092 r[i] = Integer.compareUnsigned(a[i], b[i]) >= 0 ? cc : dd;
2093 }
2094 }
2095
2096 @Test
2097 @IR(failOn = {IRNode.STORE_VECTOR})
2098 // @IR(counts = {IRNode.CMOVE_L, ">0", IRNode.CMP_U, ">0"},
2099 // applyIf = {"UseVectorCmov", "false"},
2100 // applyIfPlatform = {"riscv64", "true"})
2101 private static void testCMoveUILTforL(int[] a, int[] b, long[] c, long[] d, long[] r, long[] r2) {
2102 for (int i = 0; i < a.length; i++) {
2103 long cc = c[i];
2104 long dd = d[i];
2105 r2[i] = cc + dd;
2106 r[i] = Integer.compareUnsigned(a[i], b[i]) < 0 ? cc : dd;
2107 }
2108 }
2109
2110 @Test
2111 @IR(failOn = {IRNode.STORE_VECTOR})
2112 // @IR(counts = {IRNode.CMOVE_L, ">0", IRNode.CMP_U, ">0"},
2113 // applyIf = {"UseVectorCmov", "false"},
2114 // applyIfPlatform = {"riscv64", "true"})
2115 private static void testCMoveUILEforL(int[] a, int[] b, long[] c, long[] d, long[] r, long[] r2) {
2116 for (int i = 0; i < a.length; i++) {
2117 long cc = c[i];
2118 long dd = d[i];
2119 r2[i] = cc + dd;
2120 r[i] = Integer.compareUnsigned(a[i], b[i]) <= 0 ? cc : dd;
2121 }
2122 }
2123
2124 // I fo F
2125 @Test
2126 @IR(counts = {IRNode.LOAD_VECTOR_I, IRNode.VECTOR_SIZE + "min(max_int, max_float)", ">0",
2127 IRNode.LOAD_VECTOR_F, IRNode.VECTOR_SIZE + "min(max_int, max_float)", ">0",
2128 IRNode.VECTOR_MASK_CMP_I, IRNode.VECTOR_SIZE + "min(max_int, max_float)", ">0",
2129 IRNode.VECTOR_BLEND_F, IRNode.VECTOR_SIZE + "min(max_int, max_float)", ">0",
2130 IRNode.STORE_VECTOR, ">0"},
2131 applyIfCPUFeatureOr = {"avx", "true", "asimd", "true", "rvv", "true"},
2132 applyIf = {"UseVectorCmov", "true"})
2133 @IR(failOn = {IRNode.STORE_VECTOR},
2134 applyIf = {"UseVectorCmov", "false"})
2135 @IR(counts = {IRNode.CMOVE_F, ">0", IRNode.CMP_U, ">0"},
2136 applyIf = {"UseVectorCmov", "false"},
2137 applyIfPlatformOr = {"riscv64", "true", "x64", "true", "aarch64", "true"})
2138 private static void testCMoveUIEQforF(int[] a, int[] b, float[] c, float[] d, float[] r, float[] r2) {
2139 for (int i = 0; i < a.length; i++) {
2140 float cc = c[i];
2141 float dd = d[i];
2142 r2[i] = cc + dd;
2143 r[i] = Integer.compareUnsigned(a[i], b[i]) == 0 ? cc : dd;
2144 }
2145 }
2146
2147 @Test
2148 @IR(counts = {IRNode.LOAD_VECTOR_I, IRNode.VECTOR_SIZE + "min(max_int, max_float)", ">0",
2149 IRNode.LOAD_VECTOR_F, IRNode.VECTOR_SIZE + "min(max_int, max_float)", ">0",
2150 IRNode.VECTOR_MASK_CMP_I, IRNode.VECTOR_SIZE + "min(max_int, max_float)", ">0",
2151 IRNode.VECTOR_BLEND_F, IRNode.VECTOR_SIZE + "min(max_int, max_float)", ">0",
2152 IRNode.STORE_VECTOR, ">0"},
2153 applyIfCPUFeatureOr = {"avx", "true", "asimd", "true", "rvv", "true"},
2154 applyIf = {"UseVectorCmov", "true"})
2155 @IR(failOn = {IRNode.STORE_VECTOR},
2156 applyIf = {"UseVectorCmov", "false"})
2157 @IR(counts = {IRNode.CMOVE_F, ">0", IRNode.CMP_U, ">0"},
2158 applyIf = {"UseVectorCmov", "false"},
2159 applyIfPlatformOr = {"riscv64", "true", "x64", "true", "aarch64", "true"})
2160 private static void testCMoveUINEforF(int[] a, int[] b, float[] c, float[] d, float[] r, float[] r2) {
2161 for (int i = 0; i < a.length; i++) {
2162 float cc = c[i];
2163 float dd = d[i];
2164 r2[i] = cc + dd;
2165 r[i] = Integer.compareUnsigned(a[i], b[i]) != 0 ? cc : dd;
2166 }
2167 }
2168
2169 @Test
2170 @IR(counts = {IRNode.LOAD_VECTOR_I, IRNode.VECTOR_SIZE + "min(max_int, max_float)", ">0",
2171 IRNode.LOAD_VECTOR_F, IRNode.VECTOR_SIZE + "min(max_int, max_float)", ">0",
2172 IRNode.VECTOR_MASK_CMP_I, IRNode.VECTOR_SIZE + "min(max_int, max_float)", ">0",
2173 IRNode.VECTOR_BLEND_F, IRNode.VECTOR_SIZE + "min(max_int, max_float)", ">0",
2174 IRNode.STORE_VECTOR, ">0"},
2175 applyIfCPUFeatureOr = {"avx", "true", "asimd", "true", "rvv", "true"},
2176 applyIf = {"UseVectorCmov", "true"})
2177 @IR(failOn = {IRNode.STORE_VECTOR},
2178 applyIf = {"UseVectorCmov", "false"})
2179 @IR(counts = {IRNode.CMOVE_F, ">0", IRNode.CMP_U, ">0"},
2180 applyIf = {"UseVectorCmov", "false"},
2181 applyIfPlatformOr = {"riscv64", "true", "x64", "true", "aarch64", "true"})
2182 private static void testCMoveUIGTforF(int[] a, int[] b, float[] c, float[] d, float[] r, float[] r2) {
2183 for (int i = 0; i < a.length; i++) {
2184 float cc = c[i];
2185 float dd = d[i];
2186 r2[i] = cc + dd;
2187 r[i] = Integer.compareUnsigned(a[i], b[i]) > 0 ? cc : dd;
2188 }
2189 }
2190
2191 @Test
2192 @IR(counts = {IRNode.LOAD_VECTOR_I, IRNode.VECTOR_SIZE + "min(max_int, max_float)", ">0",
2193 IRNode.LOAD_VECTOR_F, IRNode.VECTOR_SIZE + "min(max_int, max_float)", ">0",
2194 IRNode.VECTOR_MASK_CMP_I, IRNode.VECTOR_SIZE + "min(max_int, max_float)", ">0",
2195 IRNode.VECTOR_BLEND_F, IRNode.VECTOR_SIZE + "min(max_int, max_float)", ">0",
2196 IRNode.STORE_VECTOR, ">0"},
2197 applyIfCPUFeatureOr = {"avx", "true", "asimd", "true", "rvv", "true"},
2198 applyIf = {"UseVectorCmov", "true"})
2199 @IR(failOn = {IRNode.STORE_VECTOR},
2200 applyIf = {"UseVectorCmov", "false"})
2201 @IR(counts = {IRNode.CMOVE_F, ">0", IRNode.CMP_U, ">0"},
2202 applyIf = {"UseVectorCmov", "false"},
2203 applyIfPlatformOr = {"riscv64", "true", "x64", "true", "aarch64", "true"})
2204 private static void testCMoveUIGEforF(int[] a, int[] b, float[] c, float[] d, float[] r, float[] r2) {
2205 for (int i = 0; i < a.length; i++) {
2206 float cc = c[i];
2207 float dd = d[i];
2208 r2[i] = cc + dd;
2209 r[i] = Integer.compareUnsigned(a[i], b[i]) >= 0 ? cc : dd;
2210 }
2211 }
2212
2213 @Test
2214 @IR(counts = {IRNode.LOAD_VECTOR_I, IRNode.VECTOR_SIZE + "min(max_int, max_float)", ">0",
2215 IRNode.LOAD_VECTOR_F, IRNode.VECTOR_SIZE + "min(max_int, max_float)", ">0",
2216 IRNode.VECTOR_MASK_CMP_I, IRNode.VECTOR_SIZE + "min(max_int, max_float)", ">0",
2217 IRNode.VECTOR_BLEND_F, IRNode.VECTOR_SIZE + "min(max_int, max_float)", ">0",
2218 IRNode.STORE_VECTOR, ">0"},
2219 applyIfCPUFeatureOr = {"avx", "true", "asimd", "true", "rvv", "true"},
2220 applyIf = {"UseVectorCmov", "true"})
2221 @IR(failOn = {IRNode.STORE_VECTOR},
2222 applyIf = {"UseVectorCmov", "false"})
2223 @IR(counts = {IRNode.CMOVE_F, ">0", IRNode.CMP_U, ">0"},
2224 applyIf = {"UseVectorCmov", "false"},
2225 applyIfPlatformOr = {"riscv64", "true", "x64", "true", "aarch64", "true"})
2226 private static void testCMoveUILTforF(int[] a, int[] b, float[] c, float[] d, float[] r, float[] r2) {
2227 for (int i = 0; i < a.length; i++) {
2228 float cc = c[i];
2229 float dd = d[i];
2230 r2[i] = cc + dd;
2231 r[i] = Integer.compareUnsigned(a[i], b[i]) < 0 ? cc : dd;
2232 }
2233 }
2234
2235 @Test
2236 @IR(counts = {IRNode.LOAD_VECTOR_I, IRNode.VECTOR_SIZE + "min(max_int, max_float)", ">0",
2237 IRNode.LOAD_VECTOR_F, IRNode.VECTOR_SIZE + "min(max_int, max_float)", ">0",
2238 IRNode.VECTOR_MASK_CMP_I, IRNode.VECTOR_SIZE + "min(max_int, max_float)", ">0",
2239 IRNode.VECTOR_BLEND_F, IRNode.VECTOR_SIZE + "min(max_int, max_float)", ">0",
2240 IRNode.STORE_VECTOR, ">0"},
2241 applyIfCPUFeatureOr = {"avx", "true", "asimd", "true", "rvv", "true"},
2242 applyIf = {"UseVectorCmov", "true"})
2243 @IR(failOn = {IRNode.STORE_VECTOR},
2244 applyIf = {"UseVectorCmov", "false"})
2245 @IR(counts = {IRNode.CMOVE_F, ">0", IRNode.CMP_U, ">0"},
2246 applyIf = {"UseVectorCmov", "false"},
2247 applyIfPlatformOr = {"riscv64", "true", "x64", "true", "aarch64", "true"})
2248 private static void testCMoveUILEforF(int[] a, int[] b, float[] c, float[] d, float[] r, float[] r2) {
2249 for (int i = 0; i < a.length; i++) {
2250 float cc = c[i];
2251 float dd = d[i];
2252 r2[i] = cc + dd;
2253 r[i] = Integer.compareUnsigned(a[i], b[i]) <= 0 ? cc : dd;
2254 }
2255 }
2256
2257 // I fo D
2258 @Test
2259 @IR(failOn = {IRNode.STORE_VECTOR})
2260 @IR(counts = {IRNode.CMOVE_D, ">0", IRNode.CMP_U, ">0"},
2261 applyIf = {"UseVectorCmov", "false"},
2262 applyIfPlatformOr = {"riscv64", "true", "x64", "true", "aarch64", "true"})
2263 private static void testCMoveUIEQforD(int[] a, int[] b, double[] c, double[] d, double[] r, double[] r2) {
2264 for (int i = 0; i < a.length; i++) {
2265 double cc = c[i];
2266 double dd = d[i];
2267 r2[i] = cc + dd;
2268 r[i] = Integer.compareUnsigned(a[i], b[i]) == 0 ? cc : dd;
2269 }
2270 }
2271
2272 @Test
2273 @IR(failOn = {IRNode.STORE_VECTOR})
2274 @IR(counts = {IRNode.CMOVE_D, ">0", IRNode.CMP_U, ">0"},
2275 applyIf = {"UseVectorCmov", "false"},
2276 applyIfPlatformOr = {"riscv64", "true", "x64", "true", "aarch64", "true"})
2277 private static void testCMoveUINEforD(int[] a, int[] b, double[] c, double[] d, double[] r, double[] r2) {
2278 for (int i = 0; i < a.length; i++) {
2279 double cc = c[i];
2280 double dd = d[i];
2281 r2[i] = cc + dd;
2282 r[i] = Integer.compareUnsigned(a[i], b[i]) != 0 ? cc : dd;
2283 }
2284 }
2285
2286 @Test
2287 @IR(failOn = {IRNode.STORE_VECTOR})
2288 @IR(counts = {IRNode.CMOVE_D, ">0", IRNode.CMP_U, ">0"},
2289 applyIf = {"UseVectorCmov", "false"},
2290 applyIfPlatformOr = {"riscv64", "true", "x64", "true", "aarch64", "true"})
2291 private static void testCMoveUIGTforD(int[] a, int[] b, double[] c, double[] d, double[] r, double[] r2) {
2292 for (int i = 0; i < a.length; i++) {
2293 double cc = c[i];
2294 double dd = d[i];
2295 r2[i] = cc + dd;
2296 r[i] = Integer.compareUnsigned(a[i], b[i]) > 0 ? cc : dd;
2297 }
2298 }
2299
2300 @Test
2301 @IR(failOn = {IRNode.STORE_VECTOR})
2302 @IR(counts = {IRNode.CMOVE_D, ">0", IRNode.CMP_U, ">0"},
2303 applyIf = {"UseVectorCmov", "false"},
2304 applyIfPlatformOr = {"riscv64", "true", "x64", "true", "aarch64", "true"})
2305 private static void testCMoveUIGEforD(int[] a, int[] b, double[] c, double[] d, double[] r, double[] r2) {
2306 for (int i = 0; i < a.length; i++) {
2307 double cc = c[i];
2308 double dd = d[i];
2309 r2[i] = cc + dd;
2310 r[i] = Integer.compareUnsigned(a[i], b[i]) >= 0 ? cc : dd;
2311 }
2312 }
2313
2314 @Test
2315 @IR(failOn = {IRNode.STORE_VECTOR})
2316 @IR(counts = {IRNode.CMOVE_D, ">0", IRNode.CMP_U, ">0"},
2317 applyIf = {"UseVectorCmov", "false"},
2318 applyIfPlatformOr = {"riscv64", "true", "x64", "true", "aarch64", "true"})
2319 private static void testCMoveUILTforD(int[] a, int[] b, double[] c, double[] d, double[] r, double[] r2) {
2320 for (int i = 0; i < a.length; i++) {
2321 double cc = c[i];
2322 double dd = d[i];
2323 r2[i] = cc + dd;
2324 r[i] = Integer.compareUnsigned(a[i], b[i]) < 0 ? cc : dd;
2325 }
2326 }
2327
2328 @Test
2329 @IR(failOn = {IRNode.STORE_VECTOR})
2330 @IR(counts = {IRNode.CMOVE_D, ">0", IRNode.CMP_U, ">0"},
2331 applyIf = {"UseVectorCmov", "false"},
2332 applyIfPlatformOr = {"riscv64", "true", "x64", "true", "aarch64", "true"})
2333 private static void testCMoveUILEforD(int[] a, int[] b, double[] c, double[] d, double[] r, double[] r2) {
2334 for (int i = 0; i < a.length; i++) {
2335 double cc = c[i];
2336 double dd = d[i];
2337 r2[i] = cc + dd;
2338 r[i] = Integer.compareUnsigned(a[i], b[i]) <= 0 ? cc : dd;
2339 }
2340 }
2341
2342 // L fo I
2343 @Test
2344 @IR(failOn = {IRNode.STORE_VECTOR})
2345 // @IR(counts = {IRNode.CMOVE_I, ">0", IRNode.CMP_UL, ">0"},
2346 // applyIf = {"UseVectorCmov", "false"},
2347 // applyIfPlatform = {"riscv64", "true"})
2348 private static void testCMoveULEQforI(long[] a, long[] b, int[] c, int[] d, int[] r, int[] r2) {
2349 for (int i = 0; i < a.length; i++) {
2350 int cc = c[i];
2351 int dd = d[i];
2352 r2[i] = cc + dd;
2353 r[i] = Long.compareUnsigned(a[i], b[i]) == 0 ? cc : dd;
2354 }
2355 }
2356
2357 @Test
2358 @IR(failOn = {IRNode.STORE_VECTOR})
2359 // @IR(counts = {IRNode.CMOVE_I, ">0", IRNode.CMP_UL, ">0"},
2360 // applyIf = {"UseVectorCmov", "false"},
2361 // applyIfPlatform = {"riscv64", "true"})
2362 private static void testCMoveULNEforI(long[] a, long[] b, int[] c, int[] d, int[] r, int[] r2) {
2363 for (int i = 0; i < a.length; i++) {
2364 int cc = c[i];
2365 int dd = d[i];
2366 r2[i] = cc + dd;
2367 r[i] = Long.compareUnsigned(a[i], b[i]) != 0 ? cc : dd;
2368 }
2369 }
2370
2371 @Test
2372 @IR(failOn = {IRNode.STORE_VECTOR})
2373 // @IR(counts = {IRNode.CMOVE_I, ">0", IRNode.CMP_UL, ">0"},
2374 // applyIf = {"UseVectorCmov", "false"},
2375 // applyIfPlatform = {"riscv64", "true"})
2376 private static void testCMoveULGTforI(long[] a, long[] b, int[] c, int[] d, int[] r, int[] r2) {
2377 for (int i = 0; i < a.length; i++) {
2378 int cc = c[i];
2379 int dd = d[i];
2380 r2[i] = cc + dd;
2381 r[i] = Long.compareUnsigned(a[i], b[i]) > 0 ? cc : dd;
2382 }
2383 }
2384
2385 @Test
2386 @IR(failOn = {IRNode.STORE_VECTOR})
2387 // @IR(counts = {IRNode.CMOVE_I, ">0", IRNode.CMP_UL, ">0"},
2388 // applyIf = {"UseVectorCmov", "false"},
2389 // applyIfPlatform = {"riscv64", "true"})
2390 private static void testCMoveULGEforI(long[] a, long[] b, int[] c, int[] d, int[] r, int[] r2) {
2391 for (int i = 0; i < a.length; i++) {
2392 int cc = c[i];
2393 int dd = d[i];
2394 r2[i] = cc + dd;
2395 r[i] = Long.compareUnsigned(a[i], b[i]) >= 0 ? cc : dd;
2396 }
2397 }
2398
2399 @Test
2400 @IR(failOn = {IRNode.STORE_VECTOR})
2401 // @IR(counts = {IRNode.CMOVE_I, ">0", IRNode.CMP_UL, ">0"},
2402 // applyIf = {"UseVectorCmov", "false"},
2403 // applyIfPlatform = {"riscv64", "true"})
2404 private static void testCMoveULLTforI(long[] a, long[] b, int[] c, int[] d, int[] r, int[] r2) {
2405 for (int i = 0; i < a.length; i++) {
2406 int cc = c[i];
2407 int dd = d[i];
2408 r2[i] = cc + dd;
2409 r[i] = Long.compareUnsigned(a[i], b[i]) < 0 ? cc : dd;
2410 }
2411 }
2412
2413 @Test
2414 @IR(failOn = {IRNode.STORE_VECTOR})
2415 // @IR(counts = {IRNode.CMOVE_I, ">0", IRNode.CMP_UL, ">0"},
2416 // applyIf = {"UseVectorCmov", "false"},
2417 // applyIfPlatform = {"riscv64", "true"})
2418 private static void testCMoveULLEforI(long[] a, long[] b, int[] c, int[] d, int[] r, int[] r2) {
2419 for (int i = 0; i < a.length; i++) {
2420 int cc = c[i];
2421 int dd = d[i];
2422 r2[i] = cc + dd;
2423 r[i] = Long.compareUnsigned(a[i], b[i]) <= 0 ? cc : dd;
2424 }
2425 }
2426
2427 // L fo L
2428 @Test
2429 @IR(failOn = {IRNode.STORE_VECTOR})
2430 // @IR(counts = {IRNode.CMOVE_L, ">0", IRNode.CMP_UL, ">0"},
2431 // applyIf = {"UseVectorCmov", "false"},
2432 // applyIfPlatform = {"riscv64", "true"})
2433 private static void testCMoveULEQforL(long[] a, long[] b, long[] c, long[] d, long[] r, long[] r2) {
2434 for (int i = 0; i < a.length; i++) {
2435 long cc = c[i];
2436 long dd = d[i];
2437 r2[i] = cc + dd;
2438 r[i] = Long.compareUnsigned(a[i], b[i]) == 0 ? cc : dd;
2439 }
2440 }
2441
2442 @Test
2443 @IR(failOn = {IRNode.STORE_VECTOR})
2444 // @IR(counts = {IRNode.CMOVE_L, ">0", IRNode.CMP_UL, ">0"},
2445 // applyIf = {"UseVectorCmov", "false"},
2446 // applyIfPlatform = {"riscv64", "true"})
2447 private static void testCMoveULNEforL(long[] a, long[] b, long[] c, long[] d, long[] r, long[] r2) {
2448 for (int i = 0; i < a.length; i++) {
2449 long cc = c[i];
2450 long dd = d[i];
2451 r2[i] = cc + dd;
2452 r[i] = Long.compareUnsigned(a[i], b[i]) != 0 ? cc : dd;
2453 }
2454 }
2455
2456 @Test
2457 @IR(failOn = {IRNode.STORE_VECTOR})
2458 // @IR(counts = {IRNode.CMOVE_L, ">0", IRNode.CMP_UL, ">0"},
2459 // applyIf = {"UseVectorCmov", "false"},
2460 // applyIfPlatform = {"riscv64", "true"})
2461 private static void testCMoveULGTforL(long[] a, long[] b, long[] c, long[] d, long[] r, long[] r2) {
2462 for (int i = 0; i < a.length; i++) {
2463 long cc = c[i];
2464 long dd = d[i];
2465 r2[i] = cc + dd;
2466 r[i] = Long.compareUnsigned(a[i], b[i]) > 0 ? cc : dd;
2467 }
2468 }
2469
2470 @Test
2471 @IR(failOn = {IRNode.STORE_VECTOR})
2472 // @IR(counts = {IRNode.CMOVE_L, ">0", IRNode.CMP_UL, ">0"},
2473 // applyIf = {"UseVectorCmov", "false"},
2474 // applyIfPlatform = {"riscv64", "true"})
2475 private static void testCMoveULGEforL(long[] a, long[] b, long[] c, long[] d, long[] r, long[] r2) {
2476 for (int i = 0; i < a.length; i++) {
2477 long cc = c[i];
2478 long dd = d[i];
2479 r2[i] = cc + dd;
2480 r[i] = Long.compareUnsigned(a[i], b[i]) >= 0 ? cc : dd;
2481 }
2482 }
2483
2484 @Test
2485 @IR(failOn = {IRNode.STORE_VECTOR})
2486 // @IR(counts = {IRNode.CMOVE_L, ">0", IRNode.CMP_UL, ">0"},
2487 // applyIf = {"UseVectorCmov", "false"},
2488 // applyIfPlatform = {"riscv64", "true"})
2489 private static void testCMoveULLTforL(long[] a, long[] b, long[] c, long[] d, long[] r, long[] r2) {
2490 for (int i = 0; i < a.length; i++) {
2491 long cc = c[i];
2492 long dd = d[i];
2493 r2[i] = cc + dd;
2494 r[i] = Long.compareUnsigned(a[i], b[i]) < 0 ? cc : dd;
2495 }
2496 }
2497
2498 @Test
2499 @IR(failOn = {IRNode.STORE_VECTOR})
2500 // @IR(counts = {IRNode.CMOVE_L, ">0", IRNode.CMP_UL, ">0"},
2501 // applyIf = {"UseVectorCmov", "false"},
2502 // applyIfPlatform = {"riscv64", "true"})
2503 private static void testCMoveULLEforL(long[] a, long[] b, long[] c, long[] d, long[] r, long[] r2) {
2504 for (int i = 0; i < a.length; i++) {
2505 long cc = c[i];
2506 long dd = d[i];
2507 r2[i] = cc + dd;
2508 r[i] = Long.compareUnsigned(a[i], b[i]) <= 0 ? cc : dd;
2509 }
2510 }
2511
2512 // L fo F
2513 @Test
2514 @IR(failOn = {IRNode.STORE_VECTOR})
2515 @IR(counts = {IRNode.CMOVE_F, ">0", IRNode.CMP_UL, ">0"},
2516 applyIf = {"UseVectorCmov", "false"},
2517 applyIfPlatformOr = {"riscv64", "true", "x64", "true", "aarch64", "true"})
2518 private static void testCMoveULEQforF(long[] a, long[] b, float[] c, float[] d, float[] r, float[] r2) {
2519 for (int i = 0; i < a.length; i++) {
2520 float cc = c[i];
2521 float dd = d[i];
2522 r2[i] = cc + dd;
2523 r[i] = Long.compareUnsigned(a[i], b[i]) == 0 ? cc : dd;
2524 }
2525 }
2526
2527 @Test
2528 @IR(failOn = {IRNode.STORE_VECTOR})
2529 @IR(counts = {IRNode.CMOVE_F, ">0", IRNode.CMP_UL, ">0"},
2530 applyIf = {"UseVectorCmov", "false"},
2531 applyIfPlatformOr = {"riscv64", "true", "x64", "true", "aarch64", "true"})
2532 private static void testCMoveULNEforF(long[] a, long[] b, float[] c, float[] d, float[] r, float[] r2) {
2533 for (int i = 0; i < a.length; i++) {
2534 float cc = c[i];
2535 float dd = d[i];
2536 r2[i] = cc + dd;
2537 r[i] = Long.compareUnsigned(a[i], b[i]) != 0 ? cc : dd;
2538 }
2539 }
2540
2541 @Test
2542 @IR(failOn = {IRNode.STORE_VECTOR})
2543 @IR(counts = {IRNode.CMOVE_F, ">0", IRNode.CMP_UL, ">0"},
2544 applyIf = {"UseVectorCmov", "false"},
2545 applyIfPlatformOr = {"riscv64", "true", "x64", "true", "aarch64", "true"})
2546 private static void testCMoveULGTforF(long[] a, long[] b, float[] c, float[] d, float[] r, float[] r2) {
2547 for (int i = 0; i < a.length; i++) {
2548 float cc = c[i];
2549 float dd = d[i];
2550 r2[i] = cc + dd;
2551 r[i] = Long.compareUnsigned(a[i], b[i]) > 0 ? cc : dd;
2552 }
2553 }
2554
2555 @Test
2556 @IR(failOn = {IRNode.STORE_VECTOR})
2557 @IR(counts = {IRNode.CMOVE_F, ">0", IRNode.CMP_UL, ">0"},
2558 applyIf = {"UseVectorCmov", "false"},
2559 applyIfPlatformOr = {"riscv64", "true", "x64", "true", "aarch64", "true"})
2560 private static void testCMoveULGEforF(long[] a, long[] b, float[] c, float[] d, float[] r, float[] r2) {
2561 for (int i = 0; i < a.length; i++) {
2562 float cc = c[i];
2563 float dd = d[i];
2564 r2[i] = cc + dd;
2565 r[i] = Long.compareUnsigned(a[i], b[i]) >= 0 ? cc : dd;
2566 }
2567 }
2568
2569 @Test
2570 @IR(failOn = {IRNode.STORE_VECTOR})
2571 @IR(counts = {IRNode.CMOVE_F, ">0", IRNode.CMP_UL, ">0"},
2572 applyIf = {"UseVectorCmov", "false"},
2573 applyIfPlatformOr = {"riscv64", "true", "x64", "true", "aarch64", "true"})
2574 private static void testCMoveULLTforF(long[] a, long[] b, float[] c, float[] d, float[] r, float[] r2) {
2575 for (int i = 0; i < a.length; i++) {
2576 float cc = c[i];
2577 float dd = d[i];
2578 r2[i] = cc + dd;
2579 r[i] = Long.compareUnsigned(a[i], b[i]) < 0 ? cc : dd;
2580 }
2581 }
2582
2583 @Test
2584 @IR(failOn = {IRNode.STORE_VECTOR})
2585 @IR(counts = {IRNode.CMOVE_F, ">0", IRNode.CMP_UL, ">0"},
2586 applyIf = {"UseVectorCmov", "false"},
2587 applyIfPlatformOr = {"riscv64", "true", "x64", "true", "aarch64", "true"})
2588 private static void testCMoveULLEforF(long[] a, long[] b, float[] c, float[] d, float[] r, float[] r2) {
2589 for (int i = 0; i < a.length; i++) {
2590 float cc = c[i];
2591 float dd = d[i];
2592 r2[i] = cc + dd;
2593 r[i] = Long.compareUnsigned(a[i], b[i]) <= 0 ? cc : dd;
2594 }
2595 }
2596
2597 // L fo D
2598 @Test
2599 @IR(counts = {IRNode.LOAD_VECTOR_L, IRNode.VECTOR_SIZE + "min(max_long, max_double)", ">0",
2600 IRNode.LOAD_VECTOR_D, IRNode.VECTOR_SIZE + "min(max_long, max_double)", ">0",
2601 IRNode.VECTOR_MASK_CMP_L, IRNode.VECTOR_SIZE + "min(max_long, max_double)", ">0",
2602 IRNode.VECTOR_BLEND_D, IRNode.VECTOR_SIZE + "min(max_long, max_double)", ">0",
2603 IRNode.STORE_VECTOR, ">0"},
2604 applyIfCPUFeatureOr = {"avx2", "true", "asimd", "true", "rvv", "true"},
2605 applyIf = {"UseVectorCmov", "true"})
2606 @IR(failOn = {IRNode.STORE_VECTOR},
2607 applyIf = {"UseVectorCmov", "false"})
2608 @IR(counts = {IRNode.CMOVE_D, ">0", IRNode.CMP_UL, ">0"},
2609 applyIf = {"UseVectorCmov", "false"},
2610 applyIfPlatformOr = {"riscv64", "true", "x64", "true", "aarch64", "true"})
2611 // Requires avx2, else L is restricted to 16 byte, and D has 32. That leads to a vector elements mismatch of 2 to 4.
2612 private static void testCMoveULEQforD(long[] a, long[] b, double[] c, double[] d, double[] r, double[] r2) {
2613 for (int i = 0; i < a.length; i++) {
2614 double cc = c[i];
2615 double dd = d[i];
2616 r2[i] = cc + dd;
2617 r[i] = Long.compareUnsigned(a[i], b[i]) == 0 ? cc : dd;
2618 }
2619 }
2620
2621 @Test
2622 @IR(counts = {IRNode.LOAD_VECTOR_L, IRNode.VECTOR_SIZE + "min(max_long, max_double)", ">0",
2623 IRNode.LOAD_VECTOR_D, IRNode.VECTOR_SIZE + "min(max_long, max_double)", ">0",
2624 IRNode.VECTOR_MASK_CMP_L, IRNode.VECTOR_SIZE + "min(max_long, max_double)", ">0",
2625 IRNode.VECTOR_BLEND_D, IRNode.VECTOR_SIZE + "min(max_long, max_double)", ">0",
2626 IRNode.STORE_VECTOR, ">0"},
2627 applyIfCPUFeatureOr = {"avx2", "true", "asimd", "true", "rvv", "true"},
2628 applyIf = {"UseVectorCmov", "true"})
2629 @IR(failOn = {IRNode.STORE_VECTOR},
2630 applyIf = {"UseVectorCmov", "false"})
2631 @IR(counts = {IRNode.CMOVE_D, ">0", IRNode.CMP_UL, ">0"},
2632 applyIf = {"UseVectorCmov", "false"},
2633 applyIfPlatformOr = {"riscv64", "true", "x64", "true", "aarch64", "true"})
2634 // Requires avx2, else L is restricted to 16 byte, and D has 32. That leads to a vector elements mismatch of 2 to 4.
2635 private static void testCMoveULNEforD(long[] a, long[] b, double[] c, double[] d, double[] r, double[] r2) {
2636 for (int i = 0; i < a.length; i++) {
2637 double cc = c[i];
2638 double dd = d[i];
2639 r2[i] = cc + dd;
2640 r[i] = Long.compareUnsigned(a[i], b[i]) != 0 ? cc : dd;
2641 }
2642 }
2643
2644 @Test
2645 @IR(counts = {IRNode.LOAD_VECTOR_L, IRNode.VECTOR_SIZE + "min(max_long, max_double)", ">0",
2646 IRNode.LOAD_VECTOR_D, IRNode.VECTOR_SIZE + "min(max_long, max_double)", ">0",
2647 IRNode.VECTOR_MASK_CMP_L, IRNode.VECTOR_SIZE + "min(max_long, max_double)", ">0",
2648 IRNode.VECTOR_BLEND_D, IRNode.VECTOR_SIZE + "min(max_long, max_double)", ">0",
2649 IRNode.STORE_VECTOR, ">0"},
2650 applyIfCPUFeatureOr = {"avx2", "true", "asimd", "true", "rvv", "true"},
2651 applyIf = {"UseVectorCmov", "true"})
2652 @IR(failOn = {IRNode.STORE_VECTOR},
2653 applyIf = {"UseVectorCmov", "false"})
2654 @IR(counts = {IRNode.CMOVE_D, ">0", IRNode.CMP_UL, ">0"},
2655 applyIf = {"UseVectorCmov", "false"},
2656 applyIfPlatformOr = {"riscv64", "true", "x64", "true", "aarch64", "true"})
2657 // Requires avx2, else L is restricted to 16 byte, and D has 32. That leads to a vector elements mismatch of 2 to 4.
2658 private static void testCMoveULGTforD(long[] a, long[] b, double[] c, double[] d, double[] r, double[] r2) {
2659 for (int i = 0; i < a.length; i++) {
2660 double cc = c[i];
2661 double dd = d[i];
2662 r2[i] = cc + dd;
2663 r[i] = Long.compareUnsigned(a[i], b[i]) > 0 ? cc : dd;
2664 }
2665 }
2666
2667 @Test
2668 @IR(counts = {IRNode.LOAD_VECTOR_L, IRNode.VECTOR_SIZE + "min(max_long, max_double)", ">0",
2669 IRNode.LOAD_VECTOR_D, IRNode.VECTOR_SIZE + "min(max_long, max_double)", ">0",
2670 IRNode.VECTOR_MASK_CMP_L, IRNode.VECTOR_SIZE + "min(max_long, max_double)", ">0",
2671 IRNode.VECTOR_BLEND_D, IRNode.VECTOR_SIZE + "min(max_long, max_double)", ">0",
2672 IRNode.STORE_VECTOR, ">0"},
2673 applyIfCPUFeatureOr = {"avx2", "true", "asimd", "true", "rvv", "true"},
2674 applyIf = {"UseVectorCmov", "true"})
2675 @IR(failOn = {IRNode.STORE_VECTOR},
2676 applyIf = {"UseVectorCmov", "false"})
2677 @IR(counts = {IRNode.CMOVE_D, ">0", IRNode.CMP_UL, ">0"},
2678 applyIf = {"UseVectorCmov", "false"},
2679 applyIfPlatformOr = {"riscv64", "true", "x64", "true", "aarch64", "true"})
2680 // Requires avx2, else L is restricted to 16 byte, and D has 32. That leads to a vector elements mismatch of 2 to 4.
2681 private static void testCMoveULGEforD(long[] a, long[] b, double[] c, double[] d, double[] r, double[] r2) {
2682 for (int i = 0; i < a.length; i++) {
2683 double cc = c[i];
2684 double dd = d[i];
2685 r2[i] = cc + dd;
2686 r[i] = Long.compareUnsigned(a[i], b[i]) >= 0 ? cc : dd;
2687 }
2688 }
2689
2690 @Test
2691 @IR(counts = {IRNode.LOAD_VECTOR_L, IRNode.VECTOR_SIZE + "min(max_long, max_double)", ">0",
2692 IRNode.LOAD_VECTOR_D, IRNode.VECTOR_SIZE + "min(max_long, max_double)", ">0",
2693 IRNode.VECTOR_MASK_CMP_L, IRNode.VECTOR_SIZE + "min(max_long, max_double)", ">0",
2694 IRNode.VECTOR_BLEND_D, IRNode.VECTOR_SIZE + "min(max_long, max_double)", ">0",
2695 IRNode.STORE_VECTOR, ">0"},
2696 applyIfCPUFeatureOr = {"avx2", "true", "asimd", "true", "rvv", "true"},
2697 applyIf = {"UseVectorCmov", "true"})
2698 @IR(failOn = {IRNode.STORE_VECTOR},
2699 applyIf = {"UseVectorCmov", "false"})
2700 @IR(counts = {IRNode.CMOVE_D, ">0", IRNode.CMP_UL, ">0"},
2701 applyIf = {"UseVectorCmov", "false"},
2702 applyIfPlatformOr = {"riscv64", "true", "x64", "true", "aarch64", "true"})
2703 // Requires avx2, else L is restricted to 16 byte, and D has 32. That leads to a vector elements mismatch of 2 to 4.
2704 private static void testCMoveULLTforD(long[] a, long[] b, double[] c, double[] d, double[] r, double[] r2) {
2705 for (int i = 0; i < a.length; i++) {
2706 double cc = c[i];
2707 double dd = d[i];
2708 r2[i] = cc + dd;
2709 r[i] = Long.compareUnsigned(a[i], b[i]) < 0 ? cc : dd;
2710 }
2711 }
2712
2713 @Test
2714 @IR(counts = {IRNode.LOAD_VECTOR_L, IRNode.VECTOR_SIZE + "min(max_long, max_double)", ">0",
2715 IRNode.LOAD_VECTOR_D, IRNode.VECTOR_SIZE + "min(max_long, max_double)", ">0",
2716 IRNode.VECTOR_MASK_CMP_L, IRNode.VECTOR_SIZE + "min(max_long, max_double)", ">0",
2717 IRNode.VECTOR_BLEND_D, IRNode.VECTOR_SIZE + "min(max_long, max_double)", ">0",
2718 IRNode.STORE_VECTOR, ">0"},
2719 applyIfCPUFeatureOr = {"avx2", "true", "asimd", "true", "rvv", "true"},
2720 applyIf = {"UseVectorCmov", "true"})
2721 @IR(failOn = {IRNode.STORE_VECTOR},
2722 applyIf = {"UseVectorCmov", "false"})
2723 @IR(counts = {IRNode.CMOVE_D, ">0", IRNode.CMP_UL, ">0"},
2724 applyIf = {"UseVectorCmov", "false"},
2725 applyIfPlatformOr = {"riscv64", "true", "x64", "true", "aarch64", "true"})
2726 // Requires avx2, else L is restricted to 16 byte, and D has 32. That leads to a vector elements mismatch of 2 to 4.
2727 private static void testCMoveULLEforD(long[] a, long[] b, double[] c, double[] d, double[] r, double[] r2) {
2728 for (int i = 0; i < a.length; i++) {
2729 double cc = c[i];
2730 double dd = d[i];
2731 r2[i] = cc + dd;
2732 r[i] = Long.compareUnsigned(a[i], b[i]) <= 0 ? cc : dd;
2733 }
2734 }
2735
2736 @Test
2737 @IR(failOn = {IRNode.STORE_VECTOR})
2738 // @IR(counts = {IRNode.CMOVE_I, ">0", IRNode.CMP_F, ">0"},
2739 // applyIf = {"UseVectorCmov", "false"},
2740 // applyIfPlatform = {"riscv64", "true"})
2741 private static void testCMoveFGTforI(float[] a, float[] b, int[] c, int[] d, int[] r, int[] r2) {
2742 for (int i = 0; i < a.length; i++) {
2743 int cc = c[i];
2744 int dd = d[i];
2745 r2[i] = cc + dd;
2746 r[i] = (a[i] > b[i]) ? cc : dd;
2747 }
2748 }
2749
2750 @Test
2751 @IR(failOn = {IRNode.STORE_VECTOR})
2752 // @IR(counts = {IRNode.CMOVE_L, ">0", IRNode.CMP_F, ">0"},
2753 // applyIf = {"UseVectorCmov", "false"},
2754 // applyIfPlatform = {"riscv64", "true"})
2755 private static void testCMoveFGTforL(float[] a, float[] b, long[] c, long[] d, long[] r, long[] r2) {
2756 for (int i = 0; i < a.length; i++) {
2757 long cc = c[i];
2758 long dd = d[i];
2759 r2[i] = cc + dd;
2760 r[i] = (a[i] > b[i]) ? cc : dd;
2761 }
2762 }
2763
2764 @Test
2765 @IR(counts = {IRNode.LOAD_VECTOR_F, ">0",
2766 IRNode.VECTOR_MASK_CMP_F, ">0",
2767 IRNode.VECTOR_BLEND_F, ">0",
2768 IRNode.STORE_VECTOR, ">0"},
2769 applyIfCPUFeatureOr = {"avx", "true", "asimd", "true", "rvv", "true"},
2770 applyIf = {"UseVectorCmov", "true"})
2771 @IR(failOn = {IRNode.STORE_VECTOR},
2772 applyIf = {"UseVectorCmov", "false"})
2773 @IR(counts = {IRNode.CMOVE_F, ">0", IRNode.CMP_F, ">0"},
2774 applyIf = {"UseVectorCmov", "false"},
2775 applyIfPlatformOr = {"riscv64", "true", "x64", "true", "aarch64", "true"})
2776 private static void testCMoveFGTforF(float[] a, float[] b, float[] c, float[] d, float[] r, float[] r2) {
2777 for (int i = 0; i < a.length; i++) {
2778 float cc = c[i];
2779 float dd = d[i];
2780 r2[i] = cc + dd;
2781 r[i] = (a[i] > b[i]) ? cc : dd;
2782 }
2783 }
2784
2785 @Test
2786 @IR(failOn = {IRNode.STORE_VECTOR})
2787 @IR(counts = {IRNode.CMOVE_D, ">0", IRNode.CMP_F, ">0"},
2788 applyIf = {"UseVectorCmov", "false"},
2789 applyIfPlatformOr = {"riscv64", "true", "x64", "true", "aarch64", "true"})
2790 private static void testCMoveFGTforD(float[] a, float[] b, double[] c, double[] d, double[] r, double[] r2) {
2791 for (int i = 0; i < a.length; i++) {
2792 double cc = c[i];
2793 double dd = d[i];
2794 r2[i] = cc + dd;
2795 r[i] = (a[i] > b[i]) ? cc : dd;
2796 }
2797 }
2798
2799 @Test
2800 @IR(failOn = {IRNode.STORE_VECTOR})
2801 // @IR(counts = {IRNode.CMOVE_I, ">0", IRNode.CMP_D, ">0"},
2802 // applyIf = {"UseVectorCmov", "false"},
2803 // applyIfPlatform = {"riscv64", "true"})
2804 private static void testCMoveDGTforI(double[] a, double[] b, int[] c, int[] d, int[] r, int[] r2) {
2805 for (int i = 0; i < a.length; i++) {
2806 int cc = c[i];
2807 int dd = d[i];
2808 r2[i] = cc + dd;
2809 r[i] = (a[i] > b[i]) ? cc : dd;
2810 }
2811 }
2812
2813 @Test
2814 @IR(failOn = {IRNode.STORE_VECTOR})
2815 // @IR(counts = {IRNode.CMOVE_L, ">0", IRNode.CMP_D, ">0"},
2816 // applyIf = {"UseVectorCmov", "false"},
2817 // applyIfPlatform = {"riscv64", "true"})
2818 private static void testCMoveDGTforL(double[] a, double[] b, long[] c, long[] d, long[] r, long[] r2) {
2819 for (int i = 0; i < a.length; i++) {
2820 long cc = c[i];
2821 long dd = d[i];
2822 r2[i] = cc + dd;
2823 r[i] = (a[i] > b[i]) ? cc : dd;
2824 }
2825 }
2826
2827 @Test
2828 @IR(failOn = {IRNode.STORE_VECTOR})
2829 @IR(counts = {IRNode.CMOVE_F, ">0", IRNode.CMP_D, ">0"},
2830 applyIf = {"UseVectorCmov", "false"},
2831 applyIfPlatformOr = {"riscv64", "true", "x64", "true", "aarch64", "true"})
2832 private static void testCMoveDGTforF(double[] a, double[] b, float[] c, float[] d, float[] r, float[] r2) {
2833 for (int i = 0; i < a.length; i++) {
2834 float cc = c[i];
2835 float dd = d[i];
2836 r2[i] = cc + dd;
2837 r[i] = (a[i] > b[i]) ? cc : dd;
2838 }
2839 }
2840
2841 @Test
2842 @IR(counts = {IRNode.LOAD_VECTOR_D, ">0",
2843 IRNode.VECTOR_MASK_CMP_D, ">0",
2844 IRNode.VECTOR_BLEND_D, ">0",
2845 IRNode.STORE_VECTOR, ">0"},
2846 applyIfCPUFeatureOr = {"avx", "true", "asimd", "true", "rvv", "true"},
2847 applyIf = {"UseVectorCmov", "true"})
2848 @IR(failOn = {IRNode.STORE_VECTOR},
2849 applyIf = {"UseVectorCmov", "false"})
2850 @IR(counts = {IRNode.CMOVE_D, ">0", IRNode.CMP_D, ">0"},
2851 applyIf = {"UseVectorCmov", "false"},
2852 applyIfPlatformOr = {"riscv64", "true", "x64", "true", "aarch64", "true"})
2853 private static void testCMoveDGTforD(double[] a, double[] b, double[] c, double[] d, double[] r, double[] r2) {
2854 for (int i = 0; i < a.length; i++) {
2855 double cc = c[i];
2856 double dd = d[i];
2857 r2[i] = cc + dd;
2858 r[i] = (a[i] > b[i]) ? cc : dd;
2859 }
2860 }
2861
2862 // Use some constants in the comparison
2863 @Test
2864 @IR(counts = {IRNode.LOAD_VECTOR_F, ">0",
2865 IRNode.VECTOR_MASK_CMP_F, ">0",
2866 IRNode.VECTOR_BLEND_F, ">0",
2867 IRNode.STORE_VECTOR, ">0"},
2868 applyIfCPUFeatureOr = {"avx", "true", "asimd", "true", "rvv", "true"},
2869 applyIf = {"UseVectorCmov", "true"})
2870 @IR(failOn = {IRNode.STORE_VECTOR},
2871 applyIf = {"UseVectorCmov", "false"})
2872 @IR(counts = {IRNode.CMOVE_F, ">0", IRNode.CMP_F, ">0"},
2873 applyIf = {"UseVectorCmov", "false"},
2874 applyIfPlatformOr = {"riscv64", "true", "x64", "true", "aarch64", "true"})
2875 private static void testCMoveFGTforFCmpCon1(float a, float[] b, float[] c, float[] d, float[] r, float[] r2) {
2876 for (int i = 0; i < b.length; i++) {
2877 float cc = c[i];
2878 float dd = d[i];
2879 r2[i] = cc + dd;
2880 r[i] = (a > b[i]) ? cc : dd;
2881 }
2882 }
2883
2884 @Test
2885 @IR(counts = {IRNode.LOAD_VECTOR_F, ">0",
2886 IRNode.VECTOR_MASK_CMP_F, ">0",
2887 IRNode.VECTOR_BLEND_F, ">0",
2888 IRNode.STORE_VECTOR, ">0"},
2889 applyIfCPUFeatureOr = {"avx", "true", "asimd", "true", "rvv", "true"},
2890 applyIf = {"UseVectorCmov", "true"})
2891 @IR(failOn = {IRNode.STORE_VECTOR},
2892 applyIf = {"UseVectorCmov", "false"})
2893 @IR(counts = {IRNode.CMOVE_F, ">0", IRNode.CMP_F, ">0"},
2894 applyIf = {"UseVectorCmov", "false"},
2895 applyIfPlatformOr = {"riscv64", "true", "x64", "true", "aarch64", "true"})
2896 private static void testCMoveFGTforFCmpCon2(float[] a, float b, float[] c, float[] d, float[] r, float[] r2) {
2897 for (int i = 0; i < a.length; i++) {
2898 float cc = c[i];
2899 float dd = d[i];
2900 r2[i] = cc + dd;
2901 r[i] = (a[i] > b) ? cc : dd;
2902 }
2903 }
2904
2905 // A case that is currently not supported and is not expected to vectorize
2906 @Test
2907 @IR(failOn = {IRNode.STORE_VECTOR})
2908 private static void testCMoveVDUnsupported() {
2909 double[] doublec = new double[SIZE];
2910 int seed = 1001;
2911 for (int i = 0; i < doublec.length; i++) {
2912 doublec[i] = (i % 2 == 0) ? seed + i : seed - i;
2913 }
2914 }
2915
2916 @Warmup(0)
2917 @Run(test = {"testCMoveVFGT", "testCMoveVFLT","testCMoveVDLE", "testCMoveVDGE", "testCMoveVFEQ", "testCMoveVDNE",
2918 "testCMoveVFGTSwap", "testCMoveVFLTSwap","testCMoveVDLESwap", "testCMoveVDGESwap",
2919 "testCMoveFGTforFConst", "testCMoveFGEforFConst", "testCMoveFLTforFConst",
2920 "testCMoveFLEforFConst", "testCMoveFEQforFConst", "testCMoveFNEQforFConst",
2921 "testCMoveDGTforDConst", "testCMoveDGEforDConst", "testCMoveDLTforDConst",
2922 "testCMoveDLEforDConst", "testCMoveDEQforDConst", "testCMoveDNEQforDConst",
2923 "testCMoveFLTforFConstH2", "testCMoveFLEforFConstH2",
2924 "testCMoveFYYforFConstH2", "testCMoveFXXforFConstH2",
2925 "testCMoveDLTforDConstH2", "testCMoveDLEforDConstH2",
2926 "testCMoveDYYforDConstH2", "testCMoveDXXforDConstH2"})
2927 private void testCMove_runner() {
2928 float[] floata = new float[SIZE];
2929 float[] floatb = new float[SIZE];
2930 float[] floatc = new float[SIZE];
2931 double[] doublea = new double[SIZE];
2932 double[] doubleb = new double[SIZE];
2933 double[] doublec = new double[SIZE];
2934
2935 init(floata);
2936 init(floatb);
2937 init(doublea);
2938 init(doubleb);
2939
2940 testCMoveVFGT(floata, floatb, floatc);
2941 testCMoveVDLE(doublea, doubleb, doublec);
2942 for (int i = 0; i < SIZE; i++) {
2943 Asserts.assertEquals(floatc[i], cmoveFloatGT(floata[i], floatb[i]));
2944 Asserts.assertEquals(doublec[i], cmoveDoubleLE(doublea[i], doubleb[i]));
2945 }
2946
2947 testCMoveVFLT(floata, floatb, floatc);
2948 testCMoveVDGE(doublea, doubleb, doublec);
2949 for (int i = 0; i < SIZE; i++) {
2950 Asserts.assertEquals(floatc[i], cmoveFloatLT(floata[i], floatb[i]));
2951 Asserts.assertEquals(doublec[i], cmoveDoubleGE(doublea[i], doubleb[i]));
2952 }
2953
2954 // Ensure we frequently have equals
2955 for (int i = 0; i < SIZE; i++) {
2956 if (i % 3 == 0) {
2957 floatb[i] = floata[i];
2958 doubleb[i] = doublea[i];
2959 }
2960 }
2961
2962 testCMoveVFEQ(floata, floatb, floatc);
2963 testCMoveVDNE(doublea, doubleb, doublec);
2964 for (int i = 0; i < SIZE; i++) {
2965 Asserts.assertEquals(floatc[i], cmoveFloatEQ(floata[i], floatb[i]));
2966 Asserts.assertEquals(doublec[i], cmoveDoubleNE(doublea[i], doubleb[i]));
2967 }
2968
2969 testCMoveVFGTSwap(floata, floatb, floatc);
2970 testCMoveVDLESwap(doublea, doubleb, doublec);
2971 for (int i = 0; i < SIZE; i++) {
2972 Asserts.assertEquals(floatc[i], cmoveFloatGTSwap(floata[i], floatb[i]));
2973 Asserts.assertEquals(doublec[i], cmoveDoubleLESwap(doublea[i], doubleb[i]));
2974 }
2975
2976 testCMoveVFLTSwap(floata, floatb, floatc);
2977 testCMoveVDGESwap(doublea, doubleb, doublec);
2978 for (int i = 0; i < SIZE; i++) {
2979 Asserts.assertEquals(floatc[i], cmoveFloatLTSwap(floata[i], floatb[i]));
2980 Asserts.assertEquals(doublec[i], cmoveDoubleGESwap(doublea[i], doubleb[i]));
2981 }
2982
2983 // Extensions: compare 2 values, and pick from 2 consts
2984 testCMoveFGTforFConst(floata, floatb, floatc);
2985 testCMoveDGTforDConst(doublea, doubleb, doublec);
2986 for (int i = 0; i < SIZE; i++) {
2987 Asserts.assertEquals(floatc[i], cmoveFGTforFConst(floata[i], floatb[i]));
2988 Asserts.assertEquals(doublec[i], cmoveDGTforDConst(doublea[i], doubleb[i]));
2989 }
2990
2991 testCMoveFGEforFConst(floata, floatb, floatc);
2992 testCMoveDGEforDConst(doublea, doubleb, doublec);
2993 for (int i = 0; i < SIZE; i++) {
2994 Asserts.assertEquals(floatc[i], cmoveFGEforFConst(floata[i], floatb[i]));
2995 Asserts.assertEquals(doublec[i], cmoveDGEforDConst(doublea[i], doubleb[i]));
2996 }
2997
2998 testCMoveFLTforFConst(floata, floatb, floatc);
2999 testCMoveDLTforDConst(doublea, doubleb, doublec);
3000 for (int i = 0; i < SIZE; i++) {
3001 Asserts.assertEquals(floatc[i], cmoveFLTforFConst(floata[i], floatb[i]));
3002 Asserts.assertEquals(doublec[i], cmoveDLTforDConst(doublea[i], doubleb[i]));
3003 }
3004
3005 testCMoveFLEforFConst(floata, floatb, floatc);
3006 testCMoveDLEforDConst(doublea, doubleb, doublec);
3007 for (int i = 0; i < SIZE; i++) {
3008 Asserts.assertEquals(floatc[i], cmoveFLEforFConst(floata[i], floatb[i]));
3009 Asserts.assertEquals(doublec[i], cmoveDLEforDConst(doublea[i], doubleb[i]));
3010 }
3011
3012 testCMoveFEQforFConst(floata, floatb, floatc);
3013 testCMoveDEQforDConst(doublea, doubleb, doublec);
3014 for (int i = 0; i < SIZE; i++) {
3015 Asserts.assertEquals(floatc[i], cmoveFEQforFConst(floata[i], floatb[i]));
3016 Asserts.assertEquals(doublec[i], cmoveDEQforDConst(doublea[i], doubleb[i]));
3017 }
3018
3019 testCMoveFNEQforFConst(floata, floatb, floatc);
3020 testCMoveDNEQforDConst(doublea, doubleb, doublec);
3021 for (int i = 0; i < SIZE; i++) {
3022 Asserts.assertEquals(floatc[i], cmoveFNEQforFConst(floata[i], floatb[i]));
3023 Asserts.assertEquals(doublec[i], cmoveDNEQforDConst(doublea[i], doubleb[i]));
3024 }
3025
3026 // Hand-unrolled (H2) examples:
3027 testCMoveFLTforFConstH2(floata, floatb, floatc);
3028 testCMoveDLTforDConstH2(doublea, doubleb, doublec);
3029 for (int i = 0; i < SIZE; i++) {
3030 Asserts.assertEquals(floatc[i], cmoveFLTforFConst(floata[i], floatb[i]));
3031 Asserts.assertEquals(doublec[i], cmoveDLTforDConst(doublea[i], doubleb[i]));
3032 }
3033
3034 testCMoveFLEforFConstH2(floata, floatb, floatc);
3035 testCMoveDLEforDConstH2(doublea, doubleb, doublec);
3036 for (int i = 0; i < SIZE; i++) {
3037 Asserts.assertEquals(floatc[i], cmoveFLEforFConst(floata[i], floatb[i]));
3038 Asserts.assertEquals(doublec[i], cmoveDLEforDConst(doublea[i], doubleb[i]));
3039 }
3040
3041 testCMoveFYYforFConstH2(floata, floatb, floatc);
3042 testCMoveDYYforDConstH2(doublea, doubleb, doublec);
3043 for (int i = 0; i < SIZE; i+=2) {
3044 Asserts.assertEquals(floatc[i+0], cmoveFLEforFConst(floata[i+0], floatb[i+0]));
3045 Asserts.assertEquals(doublec[i+0], cmoveDLEforDConst(doublea[i+0], doubleb[i+0]));
3046 Asserts.assertEquals(floatc[i+1], cmoveFLTforFConst(floata[i+1], floatb[i+1]));
3047 Asserts.assertEquals(doublec[i+1], cmoveDLTforDConst(doublea[i+1], doubleb[i+1]));
3048 }
3049
3050 testCMoveFXXforFConstH2(floata, floatb, floatc);
3051 testCMoveDXXforDConstH2(doublea, doubleb, doublec);
3052 for (int i = 0; i < SIZE; i+=2) {
3053 Asserts.assertEquals(floatc[i+0], cmoveFLTforFConst(floata[i+0], floatb[i+0]));
3054 Asserts.assertEquals(doublec[i+0], cmoveDLTforDConst(doublea[i+0], doubleb[i+0]));
3055 Asserts.assertEquals(floatc[i+1], cmoveFLEforFConst(floata[i+1], floatb[i+1]));
3056 Asserts.assertEquals(doublec[i+1], cmoveDLEforDConst(doublea[i+1], doubleb[i+1]));
3057 }
3058 }
3059
3060 @Warmup(0)
3061 @Run(test = {// Signed
3062 // I for I
3063 "testCMoveIEQforI",
3064 "testCMoveINEforI",
3065 "testCMoveIGTforI",
3066 "testCMoveIGEforI",
3067 "testCMoveILTforI",
3068 "testCMoveILEforI",
3069 // I for L
3070 "testCMoveIEQforL",
3071 "testCMoveINEforL",
3072 "testCMoveIGTforL",
3073 "testCMoveIGEforL",
3074 "testCMoveILTforL",
3075 "testCMoveILEforL",
3076 // I for F
3077 "testCMoveIEQforF",
3078 "testCMoveINEforF",
3079 "testCMoveIGTforF",
3080 "testCMoveIGEforF",
3081 "testCMoveILTforF",
3082 "testCMoveILEforF",
3083 // I for D
3084 "testCMoveIEQforD",
3085 "testCMoveINEforD",
3086 "testCMoveIGTforD",
3087 "testCMoveIGEforD",
3088 "testCMoveILTforD",
3089 "testCMoveILEforD",
3090 // L for I
3091 "testCMoveLEQforI",
3092 "testCMoveLNEforI",
3093 "testCMoveLGTforI",
3094 "testCMoveLGEforI",
3095 "testCMoveLLTforI",
3096 "testCMoveLLEforI",
3097 // L for L
3098 "testCMoveLEQforL",
3099 "testCMoveLNEforL",
3100 "testCMoveLGTforL",
3101 "testCMoveLGEforL",
3102 "testCMoveLLTforL",
3103 "testCMoveLLEforL",
3104 // L for F
3105 "testCMoveLEQforF",
3106 "testCMoveLNEforF",
3107 "testCMoveLGTforF",
3108 "testCMoveLGEforF",
3109 "testCMoveLLTforF",
3110 "testCMoveLLEforF",
3111 // L for D
3112 "testCMoveLEQforD",
3113 "testCMoveLNEforD",
3114 "testCMoveLGTforD",
3115 "testCMoveLGEforD",
3116 "testCMoveLLTforD",
3117 "testCMoveLLEforD",
3118 // Unsigned
3119 // I for I
3120 "testCMoveUIEQforI",
3121 "testCMoveUINEforI",
3122 "testCMoveUIGTforI",
3123 "testCMoveUIGEforI",
3124 "testCMoveUILTforI",
3125 "testCMoveUILEforI",
3126 // I for L
3127 "testCMoveUIEQforL",
3128 "testCMoveUINEforL",
3129 "testCMoveUIGTforL",
3130 "testCMoveUIGEforL",
3131 "testCMoveUILTforL",
3132 "testCMoveUILEforL",
3133 // I for F
3134 "testCMoveUIEQforF",
3135 "testCMoveUINEforF",
3136 "testCMoveUIGTforF",
3137 "testCMoveUIGEforF",
3138 "testCMoveUILTforF",
3139 "testCMoveUILEforF",
3140 // I for D
3141 "testCMoveUIEQforD",
3142 "testCMoveUINEforD",
3143 "testCMoveUIGTforD",
3144 "testCMoveUIGEforD",
3145 "testCMoveUILTforD",
3146 "testCMoveUILEforD",
3147 // L for I
3148 "testCMoveULEQforI",
3149 "testCMoveULNEforI",
3150 "testCMoveULGTforI",
3151 "testCMoveULGEforI",
3152 "testCMoveULLTforI",
3153 "testCMoveULLEforI",
3154 // L for L
3155 "testCMoveULEQforL",
3156 "testCMoveULNEforL",
3157 "testCMoveULGTforL",
3158 "testCMoveULGEforL",
3159 "testCMoveULLTforL",
3160 "testCMoveULLEforL",
3161 // L for F
3162 "testCMoveULEQforF",
3163 "testCMoveULNEforF",
3164 "testCMoveULGTforF",
3165 "testCMoveULGEforF",
3166 "testCMoveULLTforF",
3167 "testCMoveULLEforF",
3168 // L for D
3169 "testCMoveULEQforD",
3170 "testCMoveULNEforD",
3171 "testCMoveULGTforD",
3172 "testCMoveULGEforD",
3173 "testCMoveULLTforD",
3174 "testCMoveULLEforD",
3175 // Float
3176 "testCMoveFGTforI",
3177 "testCMoveFGTforL",
3178 "testCMoveFGTforF",
3179 "testCMoveFGTforD",
3180 "testCMoveDGTforI",
3181 "testCMoveDGTforL",
3182 "testCMoveDGTforF",
3183 "testCMoveDGTforD",
3184 "testCMoveFGTforFCmpCon1",
3185 "testCMoveFGTforFCmpCon2"})
3186 private void testCMove_runner_two() {
3187 int[] aI = new int[SIZE];
3188 int[] bI = new int[SIZE];
3189 int[] cI = new int[SIZE];
3190 int[] dI = new int[SIZE];
3191 int[] rI = new int[SIZE];
3192 long[] aL = new long[SIZE];
3193 long[] bL = new long[SIZE];
3194 long[] cL = new long[SIZE];
3195 long[] dL = new long[SIZE];
3196 long[] rL = new long[SIZE];
3197 float[] aF = new float[SIZE];
3198 float[] bF = new float[SIZE];
3199 float[] cF = new float[SIZE];
3200 float[] dF = new float[SIZE];
3201 float[] rF = new float[SIZE];
3202 double[] aD = new double[SIZE];
3203 double[] bD = new double[SIZE];
3204 double[] cD = new double[SIZE];
3205 double[] dD = new double[SIZE];
3206 double[] rD = new double[SIZE];
3207
3208 init(aI);
3209 init(bI);
3210 init(cI);
3211 init(dI);
3212 init(aL);
3213 init(bL);
3214 init(cL);
3215 init(dL);
3216 init(aF);
3217 init(bF);
3218 init(cF);
3219 init(dF);
3220 init(aD);
3221 init(bD);
3222 init(cD);
3223 init(dD);
3224
3225 // Signed
3226 // I for I
3227 testCMoveIEQforI(aI, bI, cI, dI, rI, rI);
3228 for (int i = 0; i < SIZE; i++) {
3229 Asserts.assertEquals(rI[i], cmoveIEQforI(aI[i], bI[i], cI[i], dI[i]));
3230 }
3231
3232 testCMoveINEforI(aI, bI, cI, dI, rI, rI);
3233 for (int i = 0; i < SIZE; i++) {
3234 Asserts.assertEquals(rI[i], cmoveINEforI(aI[i], bI[i], cI[i], dI[i]));
3235 }
3236
3237 testCMoveIGTforI(aI, bI, cI, dI, rI, rI);
3238 for (int i = 0; i < SIZE; i++) {
3239 Asserts.assertEquals(rI[i], cmoveIGTforI(aI[i], bI[i], cI[i], dI[i]));
3240 }
3241
3242 testCMoveIGEforI(aI, bI, cI, dI, rI, rI);
3243 for (int i = 0; i < SIZE; i++) {
3244 Asserts.assertEquals(rI[i], cmoveIGEforI(aI[i], bI[i], cI[i], dI[i]));
3245 }
3246
3247 testCMoveILTforI(aI, bI, cI, dI, rI, rI);
3248 for (int i = 0; i < SIZE; i++) {
3249 Asserts.assertEquals(rI[i], cmoveILTforI(aI[i], bI[i], cI[i], dI[i]));
3250 }
3251
3252 testCMoveILEforI(aI, bI, cI, dI, rI, rI);
3253 for (int i = 0; i < SIZE; i++) {
3254 Asserts.assertEquals(rI[i], cmoveILEforI(aI[i], bI[i], cI[i], dI[i]));
3255 }
3256
3257 // I for L
3258 testCMoveIEQforL(aI, bI, cL, dL, rL, rL);
3259 for (int i = 0; i < SIZE; i++) {
3260 Asserts.assertEquals(rL[i], cmoveIEQforL(aI[i], bI[i], cL[i], dL[i]));
3261 }
3262
3263 testCMoveINEforL(aI, bI, cL, dL, rL, rL);
3264 for (int i = 0; i < SIZE; i++) {
3265 Asserts.assertEquals(rL[i], cmoveINEforL(aI[i], bI[i], cL[i], dL[i]));
3266 }
3267
3268 testCMoveIGTforL(aI, bI, cL, dL, rL, rL);
3269 for (int i = 0; i < SIZE; i++) {
3270 Asserts.assertEquals(rL[i], cmoveIGTforL(aI[i], bI[i], cL[i], dL[i]));
3271 }
3272
3273 testCMoveIGEforL(aI, bI, cL, dL, rL, rL);
3274 for (int i = 0; i < SIZE; i++) {
3275 Asserts.assertEquals(rL[i], cmoveIGEforL(aI[i], bI[i], cL[i], dL[i]));
3276 }
3277
3278 testCMoveILTforL(aI, bI, cL, dL, rL, rL);
3279 for (int i = 0; i < SIZE; i++) {
3280 Asserts.assertEquals(rL[i], cmoveILTforL(aI[i], bI[i], cL[i], dL[i]));
3281 }
3282
3283 testCMoveILEforL(aI, bI, cL, dL, rL, rL);
3284 for (int i = 0; i < SIZE; i++) {
3285 Asserts.assertEquals(rL[i], cmoveILEforL(aI[i], bI[i], cL[i], dL[i]));
3286 }
3287
3288 // I for F
3289 testCMoveIEQforF(aI, bI, cF, dF, rF, rF);
3290 for (int i = 0; i < SIZE; i++) {
3291 Asserts.assertEquals(rF[i], cmoveIEQforF(aI[i], bI[i], cF[i], dF[i]));
3292 }
3293
3294 testCMoveINEforF(aI, bI, cF, dF, rF, rF);
3295 for (int i = 0; i < SIZE; i++) {
3296 Asserts.assertEquals(rF[i], cmoveINEforF(aI[i], bI[i], cF[i], dF[i]));
3297 }
3298
3299 testCMoveIGTforF(aI, bI, cF, dF, rF, rF);
3300 for (int i = 0; i < SIZE; i++) {
3301 Asserts.assertEquals(rF[i], cmoveIGTforF(aI[i], bI[i], cF[i], dF[i]));
3302 }
3303
3304 testCMoveIGEforF(aI, bI, cF, dF, rF, rF);
3305 for (int i = 0; i < SIZE; i++) {
3306 Asserts.assertEquals(rF[i], cmoveIGEforF(aI[i], bI[i], cF[i], dF[i]));
3307 }
3308
3309 testCMoveILTforF(aI, bI, cF, dF, rF, rF);
3310 for (int i = 0; i < SIZE; i++) {
3311 Asserts.assertEquals(rF[i], cmoveILTforF(aI[i], bI[i], cF[i], dF[i]));
3312 }
3313
3314 testCMoveILEforF(aI, bI, cF, dF, rF, rF);
3315 for (int i = 0; i < SIZE; i++) {
3316 Asserts.assertEquals(rF[i], cmoveILEforF(aI[i], bI[i], cF[i], dF[i]));
3317 }
3318
3319 // I for D
3320 testCMoveIEQforD(aI, bI, cD, dD, rD, rD);
3321 for (int i = 0; i < SIZE; i++) {
3322 Asserts.assertEquals(rD[i], cmoveIEQforD(aI[i], bI[i], cD[i], dD[i]));
3323 }
3324
3325 testCMoveINEforD(aI, bI, cD, dD, rD, rD);
3326 for (int i = 0; i < SIZE; i++) {
3327 Asserts.assertEquals(rD[i], cmoveINEforD(aI[i], bI[i], cD[i], dD[i]));
3328 }
3329
3330 testCMoveIGTforD(aI, bI, cD, dD, rD, rD);
3331 for (int i = 0; i < SIZE; i++) {
3332 Asserts.assertEquals(rD[i], cmoveIGTforD(aI[i], bI[i], cD[i], dD[i]));
3333 }
3334
3335 testCMoveIGEforD(aI, bI, cD, dD, rD, rD);
3336 for (int i = 0; i < SIZE; i++) {
3337 Asserts.assertEquals(rD[i], cmoveIGEforD(aI[i], bI[i], cD[i], dD[i]));
3338 }
3339
3340 testCMoveILTforD(aI, bI, cD, dD, rD, rD);
3341 for (int i = 0; i < SIZE; i++) {
3342 Asserts.assertEquals(rD[i], cmoveILTforD(aI[i], bI[i], cD[i], dD[i]));
3343 }
3344
3345 testCMoveILEforD(aI, bI, cD, dD, rD, rD);
3346 for (int i = 0; i < SIZE; i++) {
3347 Asserts.assertEquals(rD[i], cmoveILEforD(aI[i], bI[i], cD[i], dD[i]));
3348 }
3349
3350 // L for I
3351 testCMoveLEQforI(aL, bL, cI, dI, rI, rI);
3352 for (int i = 0; i < SIZE; i++) {
3353 Asserts.assertEquals(rI[i], cmoveLEQforI(aL[i], bL[i], cI[i], dI[i]));
3354 }
3355
3356 testCMoveLNEforI(aL, bL, cI, dI, rI, rI);
3357 for (int i = 0; i < SIZE; i++) {
3358 Asserts.assertEquals(rI[i], cmoveLNEforI(aL[i], bL[i], cI[i], dI[i]));
3359 }
3360
3361 testCMoveLGTforI(aL, bL, cI, dI, rI, rI);
3362 for (int i = 0; i < SIZE; i++) {
3363 Asserts.assertEquals(rI[i], cmoveLGTforI(aL[i], bL[i], cI[i], dI[i]));
3364 }
3365
3366 testCMoveLGEforI(aL, bL, cI, dI, rI, rI);
3367 for (int i = 0; i < SIZE; i++) {
3368 Asserts.assertEquals(rI[i], cmoveLGEforI(aL[i], bL[i], cI[i], dI[i]));
3369 }
3370
3371 testCMoveLLTforI(aL, bL, cI, dI, rI, rI);
3372 for (int i = 0; i < SIZE; i++) {
3373 Asserts.assertEquals(rI[i], cmoveLLTforI(aL[i], bL[i], cI[i], dI[i]));
3374 }
3375
3376 testCMoveLLEforI(aL, bL, cI, dI, rI, rI);
3377 for (int i = 0; i < SIZE; i++) {
3378 Asserts.assertEquals(rI[i], cmoveLLEforI(aL[i], bL[i], cI[i], dI[i]));
3379 }
3380
3381 // L for L
3382 testCMoveLEQforL(aL, bL, cL, dL, rL, rL);
3383 for (int i = 0; i < SIZE; i++) {
3384 Asserts.assertEquals(rL[i], cmoveLEQforL(aL[i], bL[i], cL[i], dL[i]));
3385 }
3386
3387 testCMoveLNEforL(aL, bL, cL, dL, rL, rL);
3388 for (int i = 0; i < SIZE; i++) {
3389 Asserts.assertEquals(rL[i], cmoveLNEforL(aL[i], bL[i], cL[i], dL[i]));
3390 }
3391
3392 testCMoveLGTforL(aL, bL, cL, dL, rL, rL);
3393 for (int i = 0; i < SIZE; i++) {
3394 Asserts.assertEquals(rL[i], cmoveLGTforL(aL[i], bL[i], cL[i], dL[i]));
3395 }
3396
3397 testCMoveLGEforL(aL, bL, cL, dL, rL, rL);
3398 for (int i = 0; i < SIZE; i++) {
3399 Asserts.assertEquals(rL[i], cmoveLGEforL(aL[i], bL[i], cL[i], dL[i]));
3400 }
3401
3402 testCMoveLLTforL(aL, bL, cL, dL, rL, rL);
3403 for (int i = 0; i < SIZE; i++) {
3404 Asserts.assertEquals(rL[i], cmoveLLTforL(aL[i], bL[i], cL[i], dL[i]));
3405 }
3406
3407 testCMoveLLEforL(aL, bL, cL, dL, rL, rL);
3408 for (int i = 0; i < SIZE; i++) {
3409 Asserts.assertEquals(rL[i], cmoveLLEforL(aL[i], bL[i], cL[i], dL[i]));
3410 }
3411
3412 // L for F
3413 testCMoveLEQforF(aL, bL, cF, dF, rF, rF);
3414 for (int i = 0; i < SIZE; i++) {
3415 Asserts.assertEquals(rF[i], cmoveLEQforF(aL[i], bL[i], cF[i], dF[i]));
3416 }
3417
3418 testCMoveLNEforF(aL, bL, cF, dF, rF, rF);
3419 for (int i = 0; i < SIZE; i++) {
3420 Asserts.assertEquals(rF[i], cmoveLNEforF(aL[i], bL[i], cF[i], dF[i]));
3421 }
3422
3423 testCMoveLGTforF(aL, bL, cF, dF, rF, rF);
3424 for (int i = 0; i < SIZE; i++) {
3425 Asserts.assertEquals(rF[i], cmoveLGTforF(aL[i], bL[i], cF[i], dF[i]));
3426 }
3427
3428 testCMoveLGEforF(aL, bL, cF, dF, rF, rF);
3429 for (int i = 0; i < SIZE; i++) {
3430 Asserts.assertEquals(rF[i], cmoveLGEforF(aL[i], bL[i], cF[i], dF[i]));
3431 }
3432
3433 testCMoveLLTforF(aL, bL, cF, dF, rF, rF);
3434 for (int i = 0; i < SIZE; i++) {
3435 Asserts.assertEquals(rF[i], cmoveLLTforF(aL[i], bL[i], cF[i], dF[i]));
3436 }
3437
3438 testCMoveLLEforF(aL, bL, cF, dF, rF, rF);
3439 for (int i = 0; i < SIZE; i++) {
3440 Asserts.assertEquals(rF[i], cmoveLLEforF(aL[i], bL[i], cF[i], dF[i]));
3441 }
3442
3443 // L for D
3444 testCMoveLEQforD(aL, bL, cD, dD, rD, rD);
3445 for (int i = 0; i < SIZE; i++) {
3446 Asserts.assertEquals(rD[i], cmoveLEQforD(aL[i], bL[i], cD[i], dD[i]));
3447 }
3448
3449 testCMoveLNEforD(aL, bL, cD, dD, rD, rD);
3450 for (int i = 0; i < SIZE; i++) {
3451 Asserts.assertEquals(rD[i], cmoveLNEforD(aL[i], bL[i], cD[i], dD[i]));
3452 }
3453
3454 testCMoveLGTforD(aL, bL, cD, dD, rD, rD);
3455 for (int i = 0; i < SIZE; i++) {
3456 Asserts.assertEquals(rD[i], cmoveLGTforD(aL[i], bL[i], cD[i], dD[i]));
3457 }
3458
3459 testCMoveLGEforD(aL, bL, cD, dD, rD, rD);
3460 for (int i = 0; i < SIZE; i++) {
3461 Asserts.assertEquals(rD[i], cmoveLGEforD(aL[i], bL[i], cD[i], dD[i]));
3462 }
3463
3464 testCMoveLLTforD(aL, bL, cD, dD, rD, rD);
3465 for (int i = 0; i < SIZE; i++) {
3466 Asserts.assertEquals(rD[i], cmoveLLTforD(aL[i], bL[i], cD[i], dD[i]));
3467 }
3468
3469 testCMoveLLEforD(aL, bL, cD, dD, rD, rD);
3470 for (int i = 0; i < SIZE; i++) {
3471 Asserts.assertEquals(rD[i], cmoveLLEforD(aL[i], bL[i], cD[i], dD[i]));
3472 }
3473
3474 // Unsigned
3475 // I for I
3476 testCMoveUIEQforI(aI, bI, cI, dI, rI, rI);
3477 for (int i = 0; i < SIZE; i++) {
3478 Asserts.assertEquals(rI[i], cmoveUIEQforI(aI[i], bI[i], cI[i], dI[i]));
3479 }
3480
3481 testCMoveUINEforI(aI, bI, cI, dI, rI, rI);
3482 for (int i = 0; i < SIZE; i++) {
3483 Asserts.assertEquals(rI[i], cmoveUINEforI(aI[i], bI[i], cI[i], dI[i]));
3484 }
3485
3486 testCMoveUIGTforI(aI, bI, cI, dI, rI, rI);
3487 for (int i = 0; i < SIZE; i++) {
3488 Asserts.assertEquals(rI[i], cmoveUIGTforI(aI[i], bI[i], cI[i], dI[i]));
3489 }
3490
3491 testCMoveUIGEforI(aI, bI, cI, dI, rI, rI);
3492 for (int i = 0; i < SIZE; i++) {
3493 Asserts.assertEquals(rI[i], cmoveUIGEforI(aI[i], bI[i], cI[i], dI[i]));
3494 }
3495
3496 testCMoveUILTforI(aI, bI, cI, dI, rI, rI);
3497 for (int i = 0; i < SIZE; i++) {
3498 Asserts.assertEquals(rI[i], cmoveUILTforI(aI[i], bI[i], cI[i], dI[i]));
3499 }
3500
3501 testCMoveUILEforI(aI, bI, cI, dI, rI, rI);
3502 for (int i = 0; i < SIZE; i++) {
3503 Asserts.assertEquals(rI[i], cmoveUILEforI(aI[i], bI[i], cI[i], dI[i]));
3504 }
3505
3506 // I for L
3507 testCMoveUIEQforL(aI, bI, cL, dL, rL, rL);
3508 for (int i = 0; i < SIZE; i++) {
3509 Asserts.assertEquals(rL[i], cmoveUIEQforL(aI[i], bI[i], cL[i], dL[i]));
3510 }
3511
3512 testCMoveUINEforL(aI, bI, cL, dL, rL, rL);
3513 for (int i = 0; i < SIZE; i++) {
3514 Asserts.assertEquals(rL[i], cmoveUINEforL(aI[i], bI[i], cL[i], dL[i]));
3515 }
3516
3517 testCMoveUIGTforL(aI, bI, cL, dL, rL, rL);
3518 for (int i = 0; i < SIZE; i++) {
3519 Asserts.assertEquals(rL[i], cmoveUIGTforL(aI[i], bI[i], cL[i], dL[i]));
3520 }
3521
3522 testCMoveUIGEforL(aI, bI, cL, dL, rL, rL);
3523 for (int i = 0; i < SIZE; i++) {
3524 Asserts.assertEquals(rL[i], cmoveUIGEforL(aI[i], bI[i], cL[i], dL[i]));
3525 }
3526
3527 testCMoveUILTforL(aI, bI, cL, dL, rL, rL);
3528 for (int i = 0; i < SIZE; i++) {
3529 Asserts.assertEquals(rL[i], cmoveUILTforL(aI[i], bI[i], cL[i], dL[i]));
3530 }
3531
3532 testCMoveUILEforL(aI, bI, cL, dL, rL, rL);
3533 for (int i = 0; i < SIZE; i++) {
3534 Asserts.assertEquals(rL[i], cmoveUILEforL(aI[i], bI[i], cL[i], dL[i]));
3535 }
3536
3537 // I for F
3538 testCMoveUIEQforF(aI, bI, cF, dF, rF, rF);
3539 for (int i = 0; i < SIZE; i++) {
3540 Asserts.assertEquals(rF[i], cmoveUIEQforF(aI[i], bI[i], cF[i], dF[i]));
3541 }
3542
3543 testCMoveUINEforF(aI, bI, cF, dF, rF, rF);
3544 for (int i = 0; i < SIZE; i++) {
3545 Asserts.assertEquals(rF[i], cmoveUINEforF(aI[i], bI[i], cF[i], dF[i]));
3546 }
3547
3548 testCMoveUIGTforF(aI, bI, cF, dF, rF, rF);
3549 for (int i = 0; i < SIZE; i++) {
3550 Asserts.assertEquals(rF[i], cmoveUIGTforF(aI[i], bI[i], cF[i], dF[i]));
3551 }
3552
3553 testCMoveUIGEforF(aI, bI, cF, dF, rF, rF);
3554 for (int i = 0; i < SIZE; i++) {
3555 Asserts.assertEquals(rF[i], cmoveUIGEforF(aI[i], bI[i], cF[i], dF[i]));
3556 }
3557
3558 testCMoveUILTforF(aI, bI, cF, dF, rF, rF);
3559 for (int i = 0; i < SIZE; i++) {
3560 Asserts.assertEquals(rF[i], cmoveUILTforF(aI[i], bI[i], cF[i], dF[i]));
3561 }
3562
3563 testCMoveUILEforF(aI, bI, cF, dF, rF, rF);
3564 for (int i = 0; i < SIZE; i++) {
3565 Asserts.assertEquals(rF[i], cmoveUILEforF(aI[i], bI[i], cF[i], dF[i]));
3566 }
3567
3568 // I for D
3569 testCMoveUIEQforD(aI, bI, cD, dD, rD, rD);
3570 for (int i = 0; i < SIZE; i++) {
3571 Asserts.assertEquals(rD[i], cmoveUIEQforD(aI[i], bI[i], cD[i], dD[i]));
3572 }
3573
3574 testCMoveUINEforD(aI, bI, cD, dD, rD, rD);
3575 for (int i = 0; i < SIZE; i++) {
3576 Asserts.assertEquals(rD[i], cmoveUINEforD(aI[i], bI[i], cD[i], dD[i]));
3577 }
3578
3579 testCMoveUIGTforD(aI, bI, cD, dD, rD, rD);
3580 for (int i = 0; i < SIZE; i++) {
3581 Asserts.assertEquals(rD[i], cmoveUIGTforD(aI[i], bI[i], cD[i], dD[i]));
3582 }
3583
3584 testCMoveUIGEforD(aI, bI, cD, dD, rD, rD);
3585 for (int i = 0; i < SIZE; i++) {
3586 Asserts.assertEquals(rD[i], cmoveUIGEforD(aI[i], bI[i], cD[i], dD[i]));
3587 }
3588
3589 testCMoveUILTforD(aI, bI, cD, dD, rD, rD);
3590 for (int i = 0; i < SIZE; i++) {
3591 Asserts.assertEquals(rD[i], cmoveUILTforD(aI[i], bI[i], cD[i], dD[i]));
3592 }
3593
3594 testCMoveUILEforD(aI, bI, cD, dD, rD, rD);
3595 for (int i = 0; i < SIZE; i++) {
3596 Asserts.assertEquals(rD[i], cmoveUILEforD(aI[i], bI[i], cD[i], dD[i]));
3597 }
3598
3599 // L for I
3600 testCMoveULEQforI(aL, bL, cI, dI, rI, rI);
3601 for (int i = 0; i < SIZE; i++) {
3602 Asserts.assertEquals(rI[i], cmoveULEQforI(aL[i], bL[i], cI[i], dI[i]));
3603 }
3604
3605 testCMoveULNEforI(aL, bL, cI, dI, rI, rI);
3606 for (int i = 0; i < SIZE; i++) {
3607 Asserts.assertEquals(rI[i], cmoveULNEforI(aL[i], bL[i], cI[i], dI[i]));
3608 }
3609
3610 testCMoveULGTforI(aL, bL, cI, dI, rI, rI);
3611 for (int i = 0; i < SIZE; i++) {
3612 Asserts.assertEquals(rI[i], cmoveULGTforI(aL[i], bL[i], cI[i], dI[i]));
3613 }
3614
3615 testCMoveULGEforI(aL, bL, cI, dI, rI, rI);
3616 for (int i = 0; i < SIZE; i++) {
3617 Asserts.assertEquals(rI[i], cmoveULGEforI(aL[i], bL[i], cI[i], dI[i]));
3618 }
3619
3620 testCMoveULLTforI(aL, bL, cI, dI, rI, rI);
3621 for (int i = 0; i < SIZE; i++) {
3622 Asserts.assertEquals(rI[i], cmoveULLTforI(aL[i], bL[i], cI[i], dI[i]));
3623 }
3624
3625 testCMoveULLEforI(aL, bL, cI, dI, rI, rI);
3626 for (int i = 0; i < SIZE; i++) {
3627 Asserts.assertEquals(rI[i], cmoveULLEforI(aL[i], bL[i], cI[i], dI[i]));
3628 }
3629
3630 // L for L
3631 testCMoveULEQforL(aL, bL, cL, dL, rL, rL);
3632 for (int i = 0; i < SIZE; i++) {
3633 Asserts.assertEquals(rL[i], cmoveULEQforL(aL[i], bL[i], cL[i], dL[i]));
3634 }
3635
3636 testCMoveULNEforL(aL, bL, cL, dL, rL, rL);
3637 for (int i = 0; i < SIZE; i++) {
3638 Asserts.assertEquals(rL[i], cmoveULNEforL(aL[i], bL[i], cL[i], dL[i]));
3639 }
3640
3641 testCMoveULGTforL(aL, bL, cL, dL, rL, rL);
3642 for (int i = 0; i < SIZE; i++) {
3643 Asserts.assertEquals(rL[i], cmoveULGTforL(aL[i], bL[i], cL[i], dL[i]));
3644 }
3645
3646 testCMoveULGEforL(aL, bL, cL, dL, rL, rL);
3647 for (int i = 0; i < SIZE; i++) {
3648 Asserts.assertEquals(rL[i], cmoveULGEforL(aL[i], bL[i], cL[i], dL[i]));
3649 }
3650
3651 testCMoveULLTforL(aL, bL, cL, dL, rL, rL);
3652 for (int i = 0; i < SIZE; i++) {
3653 Asserts.assertEquals(rL[i], cmoveULLTforL(aL[i], bL[i], cL[i], dL[i]));
3654 }
3655
3656 testCMoveULLEforL(aL, bL, cL, dL, rL, rL);
3657 for (int i = 0; i < SIZE; i++) {
3658 Asserts.assertEquals(rL[i], cmoveULLEforL(aL[i], bL[i], cL[i], dL[i]));
3659 }
3660
3661 // L for F
3662 testCMoveULEQforF(aL, bL, cF, dF, rF, rF);
3663 for (int i = 0; i < SIZE; i++) {
3664 Asserts.assertEquals(rF[i], cmoveULEQforF(aL[i], bL[i], cF[i], dF[i]));
3665 }
3666
3667 testCMoveULNEforF(aL, bL, cF, dF, rF, rF);
3668 for (int i = 0; i < SIZE; i++) {
3669 Asserts.assertEquals(rF[i], cmoveULNEforF(aL[i], bL[i], cF[i], dF[i]));
3670 }
3671
3672 testCMoveULGTforF(aL, bL, cF, dF, rF, rF);
3673 for (int i = 0; i < SIZE; i++) {
3674 Asserts.assertEquals(rF[i], cmoveULGTforF(aL[i], bL[i], cF[i], dF[i]));
3675 }
3676
3677 testCMoveULGEforF(aL, bL, cF, dF, rF, rF);
3678 for (int i = 0; i < SIZE; i++) {
3679 Asserts.assertEquals(rF[i], cmoveULGEforF(aL[i], bL[i], cF[i], dF[i]));
3680 }
3681
3682 testCMoveULLTforF(aL, bL, cF, dF, rF, rF);
3683 for (int i = 0; i < SIZE; i++) {
3684 Asserts.assertEquals(rF[i], cmoveULLTforF(aL[i], bL[i], cF[i], dF[i]));
3685 }
3686
3687 testCMoveULLEforF(aL, bL, cF, dF, rF, rF);
3688 for (int i = 0; i < SIZE; i++) {
3689 Asserts.assertEquals(rF[i], cmoveULLEforF(aL[i], bL[i], cF[i], dF[i]));
3690 }
3691
3692 // L for D
3693 testCMoveULEQforD(aL, bL, cD, dD, rD, rD);
3694 for (int i = 0; i < SIZE; i++) {
3695 Asserts.assertEquals(rD[i], cmoveULEQforD(aL[i], bL[i], cD[i], dD[i]));
3696 }
3697
3698 testCMoveULNEforD(aL, bL, cD, dD, rD, rD);
3699 for (int i = 0; i < SIZE; i++) {
3700 Asserts.assertEquals(rD[i], cmoveULNEforD(aL[i], bL[i], cD[i], dD[i]));
3701 }
3702
3703 testCMoveULGTforD(aL, bL, cD, dD, rD, rD);
3704 for (int i = 0; i < SIZE; i++) {
3705 Asserts.assertEquals(rD[i], cmoveULGTforD(aL[i], bL[i], cD[i], dD[i]));
3706 }
3707
3708 testCMoveULGEforD(aL, bL, cD, dD, rD, rD);
3709 for (int i = 0; i < SIZE; i++) {
3710 Asserts.assertEquals(rD[i], cmoveULGEforD(aL[i], bL[i], cD[i], dD[i]));
3711 }
3712
3713 testCMoveULLTforD(aL, bL, cD, dD, rD, rD);
3714 for (int i = 0; i < SIZE; i++) {
3715 Asserts.assertEquals(rD[i], cmoveULLTforD(aL[i], bL[i], cD[i], dD[i]));
3716 }
3717
3718 testCMoveULLEforD(aL, bL, cD, dD, rD, rD);
3719 for (int i = 0; i < SIZE; i++) {
3720 Asserts.assertEquals(rD[i], cmoveULLEforD(aL[i], bL[i], cD[i], dD[i]));
3721 }
3722
3723 // Float
3724 testCMoveFGTforI(aF, bF, cI, dI, rI, rI);
3725 for (int i = 0; i < SIZE; i++) {
3726 Asserts.assertEquals(rI[i], cmoveFGTforI(aF[i], bF[i], cI[i], dI[i]));
3727 }
3728
3729 testCMoveFGTforL(aF, bF, cL, dL, rL, rL);
3730 for (int i = 0; i < SIZE; i++) {
3731 Asserts.assertEquals(rL[i], cmoveFGTforL(aF[i], bF[i], cL[i], dL[i]));
3732 }
3733
3734 testCMoveFGTforF(aF, bF, cF, dF, rF, rF);
3735 for (int i = 0; i < SIZE; i++) {
3736 Asserts.assertEquals(rF[i], cmoveFGTforF(aF[i], bF[i], cF[i], dF[i]));
3737 }
3738
3739 testCMoveFGTforD(aF, bF, cD, dD, rD, rD);
3740 for (int i = 0; i < SIZE; i++) {
3741 Asserts.assertEquals(rD[i], cmoveFGTforD(aF[i], bF[i], cD[i], dD[i]));
3742 }
3743
3744 testCMoveDGTforI(aD, bD, cI, dI, rI, rI);
3745 for (int i = 0; i < SIZE; i++) {
3746 Asserts.assertEquals(rI[i], cmoveDGTforI(aD[i], bD[i], cI[i], dI[i]));
3747 }
3748
3749 testCMoveDGTforL(aD, bD, cL, dL, rL, rL);
3750 for (int i = 0; i < SIZE; i++) {
3751 Asserts.assertEquals(rL[i], cmoveDGTforL(aD[i], bD[i], cL[i], dL[i]));
3752 }
3753
3754 testCMoveDGTforF(aD, bD, cF, dF, rF, rF);
3755 for (int i = 0; i < SIZE; i++) {
3756 Asserts.assertEquals(rF[i], cmoveDGTforF(aD[i], bD[i], cF[i], dF[i]));
3757 }
3758
3759 testCMoveDGTforD(aD, bD, cD, dD, rD, rD);
3760 for (int i = 0; i < SIZE; i++) {
3761 Asserts.assertEquals(rD[i], cmoveDGTforD(aD[i], bD[i], cD[i], dD[i]));
3762 }
3763
3764 // Use some constants/invariants in the comparison
3765 testCMoveFGTforFCmpCon1(aF[0], bF, cF, dF, rF, rF);
3766 for (int i = 0; i < SIZE; i++) {
3767 Asserts.assertEquals(rF[i], cmoveFGTforF(aF[0], bF[i], cF[i], dF[i]));
3768 }
3769
3770 testCMoveFGTforFCmpCon2(aF, bF[0], cF, dF, rF, rF);
3771 for (int i = 0; i < SIZE; i++) {
3772 Asserts.assertEquals(rF[i], cmoveFGTforF(aF[i], bF[0], cF[i], dF[i]));
3773 }
3774 }
3775
3776 private static void init(int[] a) {
3777 for (int i = 0; i < SIZE; i++) {
3778 a[i] = RANDOM.nextInt();
3779 }
3780 }
3781
3782 private static void init(long[] a) {
3783 for (int i = 0; i < SIZE; i++) {
3784 a[i] = RANDOM.nextLong();
3785 }
3786 }
3787
3788 private static void init(float[] a) {
3789 for (int i = 0; i < SIZE; i++) {
3790 a[i] = switch(RANDOM.nextInt() % 20) {
3791 case 0 -> Float.NaN;
3792 case 1 -> 0;
3793 case 2 -> 1;
3794 case 3 -> Float.POSITIVE_INFINITY;
3795 case 4 -> Float.NEGATIVE_INFINITY;
3796 case 5 -> Float.MAX_VALUE;
3797 case 6 -> Float.MIN_VALUE;
3798 case 7, 8, 9 -> RANDOM.nextFloat();
3799 default -> Float.intBitsToFloat(RANDOM.nextInt());
3800 };
3801 }
3802 }
3803
3804 private static void init(double[] a) {
3805 for (int i = 0; i < SIZE; i++) {
3806 a[i] = switch(RANDOM.nextInt() % 20) {
3807 case 0 -> Double.NaN;
3808 case 1 -> 0;
3809 case 2 -> 1;
3810 case 3 -> Double.POSITIVE_INFINITY;
3811 case 4 -> Double.NEGATIVE_INFINITY;
3812 case 5 -> Double.MAX_VALUE;
3813 case 6 -> Double.MIN_VALUE;
3814 case 7, 8, 9 -> RANDOM.nextDouble();
3815 default -> Double.longBitsToDouble(RANDOM.nextLong());
3816 };
3817 }
3818 }
3819 }