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