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