Jatin Bhateja 52382e285f 8338021: Support new unsigned and saturating vector operators in VectorAPI
Reviewed-by: psandoz, epeter, sviswanathan
2024-10-28 16:30:29 +00:00

6520 lines
251 KiB
Java

/*
* Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* @test
* @key randomness
*
* @library /test/lib
* @modules jdk.incubator.vector
* @run testng/othervm/timeout=300 -ea -esa -Xbatch -XX:-TieredCompilation Byte64VectorTests
*/
// -- This file was mechanically generated: Do not edit! -- //
import jdk.incubator.vector.VectorShape;
import jdk.incubator.vector.VectorSpecies;
import jdk.incubator.vector.VectorShuffle;
import jdk.incubator.vector.VectorMask;
import jdk.incubator.vector.VectorOperators;
import jdk.incubator.vector.Vector;
import jdk.incubator.vector.VectorMath;
import jdk.incubator.vector.ByteVector;
import org.testng.Assert;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import java.lang.Integer;
import java.util.List;
import java.util.Arrays;
import java.util.function.BiFunction;
import java.util.function.IntFunction;
import java.util.Objects;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@Test
public class Byte64VectorTests extends AbstractVectorTest {
static final VectorSpecies<Byte> SPECIES =
ByteVector.SPECIES_64;
static final int INVOC_COUNT = Integer.getInteger("jdk.incubator.vector.test.loop-iterations", 100);
private static final byte CONST_SHIFT = Byte.SIZE / 2;
static final int BUFFER_REPS = Integer.getInteger("jdk.incubator.vector.test.buffer-vectors", 25000 / 64);
static void assertArraysStrictlyEquals(byte[] r, byte[] a) {
for (int i = 0; i < a.length; i++) {
if (r[i] != a[i]) {
Assert.fail("at index #" + i + ", expected = " + a[i] + ", actual = " + r[i]);
}
}
}
interface FUnOp {
byte apply(byte a);
}
static void assertArraysEquals(byte[] r, byte[] a, FUnOp f) {
int i = 0;
try {
for (; i < a.length; i++) {
Assert.assertEquals(r[i], f.apply(a[i]));
}
} catch (AssertionError e) {
Assert.assertEquals(r[i], f.apply(a[i]), "at index #" + i + ", input = " + a[i]);
}
}
interface FUnArrayOp {
byte[] apply(byte a);
}
static void assertArraysEquals(byte[] r, byte[] a, FUnArrayOp f) {
int i = 0;
try {
for (; i < a.length; i += SPECIES.length()) {
Assert.assertEquals(Arrays.copyOfRange(r, i, i+SPECIES.length()),
f.apply(a[i]));
}
} catch (AssertionError e) {
byte[] ref = f.apply(a[i]);
byte[] res = Arrays.copyOfRange(r, i, i+SPECIES.length());
Assert.assertEquals(res, ref, "(ref: " + Arrays.toString(ref)
+ ", res: " + Arrays.toString(res)
+ "), at index #" + i);
}
}
static void assertArraysEquals(byte[] r, byte[] a, boolean[] mask, FUnOp f) {
int i = 0;
try {
for (; i < a.length; i++) {
Assert.assertEquals(r[i], mask[i % SPECIES.length()] ? f.apply(a[i]) : a[i]);
}
} catch (AssertionError e) {
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()]);
}
}
interface FReductionOp {
byte apply(byte[] a, int idx);
}
interface FReductionAllOp {
byte apply(byte[] a);
}
static void assertReductionArraysEquals(byte[] r, byte rc, byte[] a,
FReductionOp f, FReductionAllOp fa) {
int i = 0;
try {
Assert.assertEquals(rc, fa.apply(a));
for (; i < a.length; i += SPECIES.length()) {
Assert.assertEquals(r[i], f.apply(a, i));
}
} catch (AssertionError e) {
Assert.assertEquals(rc, fa.apply(a), "Final result is incorrect!");
Assert.assertEquals(r[i], f.apply(a, i), "at index #" + i);
}
}
interface FReductionMaskedOp {
byte apply(byte[] a, int idx, boolean[] mask);
}
interface FReductionAllMaskedOp {
byte apply(byte[] a, boolean[] mask);
}
static void assertReductionArraysEqualsMasked(byte[] r, byte rc, byte[] a, boolean[] mask,
FReductionMaskedOp f, FReductionAllMaskedOp fa) {
int i = 0;
try {
Assert.assertEquals(rc, fa.apply(a, mask));
for (; i < a.length; i += SPECIES.length()) {
Assert.assertEquals(r[i], f.apply(a, i, mask));
}
} catch (AssertionError e) {
Assert.assertEquals(rc, fa.apply(a, mask), "Final result is incorrect!");
Assert.assertEquals(r[i], f.apply(a, i, mask), "at index #" + i);
}
}
interface FReductionOpLong {
long apply(byte[] a, int idx);
}
interface FReductionAllOpLong {
long apply(byte[] a);
}
static void assertReductionLongArraysEquals(long[] r, long rc, byte[] a,
FReductionOpLong f, FReductionAllOpLong fa) {
int i = 0;
try {
Assert.assertEquals(rc, fa.apply(a));
for (; i < a.length; i += SPECIES.length()) {
Assert.assertEquals(r[i], f.apply(a, i));
}
} catch (AssertionError e) {
Assert.assertEquals(rc, fa.apply(a), "Final result is incorrect!");
Assert.assertEquals(r[i], f.apply(a, i), "at index #" + i);
}
}
interface FReductionMaskedOpLong {
long apply(byte[] a, int idx, boolean[] mask);
}
interface FReductionAllMaskedOpLong {
long apply(byte[] a, boolean[] mask);
}
static void assertReductionLongArraysEqualsMasked(long[] r, long rc, byte[] a, boolean[] mask,
FReductionMaskedOpLong f, FReductionAllMaskedOpLong fa) {
int i = 0;
try {
Assert.assertEquals(rc, fa.apply(a, mask));
for (; i < a.length; i += SPECIES.length()) {
Assert.assertEquals(r[i], f.apply(a, i, mask));
}
} catch (AssertionError e) {
Assert.assertEquals(rc, fa.apply(a, mask), "Final result is incorrect!");
Assert.assertEquals(r[i], f.apply(a, i, mask), "at index #" + i);
}
}
interface FBoolReductionOp {
boolean apply(boolean[] a, int idx);
}
static void assertReductionBoolArraysEquals(boolean[] r, boolean[] a, FBoolReductionOp f) {
int i = 0;
try {
for (; i < a.length; i += SPECIES.length()) {
Assert.assertEquals(r[i], f.apply(a, i));
}
} catch (AssertionError e) {
Assert.assertEquals(r[i], f.apply(a, i), "at index #" + i);
}
}
interface FMaskReductionOp {
int apply(boolean[] a, int idx);
}
static void assertMaskReductionArraysEquals(int[] r, boolean[] a, FMaskReductionOp f) {
int i = 0;
try {
for (; i < a.length; i += SPECIES.length()) {
Assert.assertEquals(r[i], f.apply(a, i));
}
} catch (AssertionError e) {
Assert.assertEquals(r[i], f.apply(a, i), "at index #" + i);
}
}
static void assertRearrangeArraysEquals(byte[] r, byte[] a, int[] order, int vector_len) {
int i = 0, j = 0;
try {
for (; i < a.length; i += vector_len) {
for (j = 0; j < vector_len; j++) {
Assert.assertEquals(r[i+j], a[i+order[i+j]]);
}
}
} catch (AssertionError e) {
int idx = i + j;
Assert.assertEquals(r[i+j], a[i+order[i+j]], "at index #" + idx + ", input = " + a[i+order[i+j]]);
}
}
static void assertcompressArraysEquals(byte[] r, byte[] a, boolean[] m, int vector_len) {
int i = 0, j = 0, k = 0;
try {
for (; i < a.length; i += vector_len) {
k = 0;
for (j = 0; j < vector_len; j++) {
if (m[(i + j) % SPECIES.length()]) {
Assert.assertEquals(r[i + k], a[i + j]);
k++;
}
}
for (; k < vector_len; k++) {
Assert.assertEquals(r[i + k], (byte)0);
}
}
} catch (AssertionError e) {
int idx = i + k;
if (m[(i + j) % SPECIES.length()]) {
Assert.assertEquals(r[idx], a[i + j], "at index #" + idx);
} else {
Assert.assertEquals(r[idx], (byte)0, "at index #" + idx);
}
}
}
static void assertexpandArraysEquals(byte[] r, byte[] a, boolean[] m, int vector_len) {
int i = 0, j = 0, k = 0;
try {
for (; i < a.length; i += vector_len) {
k = 0;
for (j = 0; j < vector_len; j++) {
if (m[(i + j) % SPECIES.length()]) {
Assert.assertEquals(r[i + j], a[i + k]);
k++;
} else {
Assert.assertEquals(r[i + j], (byte)0);
}
}
}
} catch (AssertionError e) {
int idx = i + j;
if (m[idx % SPECIES.length()]) {
Assert.assertEquals(r[idx], a[i + k], "at index #" + idx);
} else {
Assert.assertEquals(r[idx], (byte)0, "at index #" + idx);
}
}
}
static void assertSelectFromTwoVectorEquals(byte[] r, byte[] order, byte[] a, byte[] b, int vector_len) {
int i = 0, j = 0;
boolean is_exceptional_idx = false;
int idx = 0, wrapped_index = 0, oidx = 0;
try {
for (; i < a.length; i += vector_len) {
for (j = 0; j < vector_len; j++) {
idx = i + j;
wrapped_index = Math.floorMod((int)order[idx], 2 * vector_len);
is_exceptional_idx = wrapped_index >= vector_len;
oidx = is_exceptional_idx ? (wrapped_index - vector_len) : wrapped_index;
Assert.assertEquals(r[idx], (is_exceptional_idx ? b[i + oidx] : a[i + oidx]));
}
}
} catch (AssertionError e) {
Assert.assertEquals(r[idx], (is_exceptional_idx ? b[i + oidx] : a[i + oidx]), "at index #" + idx + ", order = " + order[idx] + ", a = " + a[i + oidx] + ", b = " + b[i + oidx]);
}
}
static void assertSelectFromArraysEquals(byte[] r, byte[] a, byte[] order, int vector_len) {
int i = 0, j = 0;
try {
for (; i < a.length; i += vector_len) {
for (j = 0; j < vector_len; j++) {
Assert.assertEquals(r[i+j], a[i+(int)order[i+j]]);
}
}
} catch (AssertionError e) {
int idx = i + j;
Assert.assertEquals(r[i+j], a[i+(int)order[i+j]], "at index #" + idx + ", input = " + a[i+(int)order[i+j]]);
}
}
static void assertRearrangeArraysEquals(byte[] r, byte[] a, int[] order, boolean[] mask, int vector_len) {
int i = 0, j = 0;
try {
for (; i < a.length; i += vector_len) {
for (j = 0; j < vector_len; j++) {
if (mask[j % SPECIES.length()])
Assert.assertEquals(r[i+j], a[i+order[i+j]]);
else
Assert.assertEquals(r[i+j], (byte)0);
}
}
} catch (AssertionError e) {
int idx = i + j;
if (mask[j % SPECIES.length()])
Assert.assertEquals(r[i+j], a[i+order[i+j]], "at index #" + idx + ", input = " + a[i+order[i+j]] + ", mask = " + mask[j % SPECIES.length()]);
else
Assert.assertEquals(r[i+j], (byte)0, "at index #" + idx + ", input = " + a[i+order[i+j]] + ", mask = " + mask[j % SPECIES.length()]);
}
}
static void assertSelectFromArraysEquals(byte[] r, byte[] a, byte[] order, boolean[] mask, int vector_len) {
int i = 0, j = 0;
try {
for (; i < a.length; i += vector_len) {
for (j = 0; j < vector_len; j++) {
if (mask[j % SPECIES.length()])
Assert.assertEquals(r[i+j], a[i+(int)order[i+j]]);
else
Assert.assertEquals(r[i+j], (byte)0);
}
}
} catch (AssertionError e) {
int idx = i + j;
if (mask[j % SPECIES.length()])
Assert.assertEquals(r[i+j], a[i+(int)order[i+j]], "at index #" + idx + ", input = " + a[i+(int)order[i+j]] + ", mask = " + mask[j % SPECIES.length()]);
else
Assert.assertEquals(r[i+j], (byte)0, "at index #" + idx + ", input = " + a[i+(int)order[i+j]] + ", mask = " + mask[j % SPECIES.length()]);
}
}
static void assertBroadcastArraysEquals(byte[] r, byte[] a) {
int i = 0;
for (; i < a.length; i += SPECIES.length()) {
int idx = i;
for (int j = idx; j < (idx + SPECIES.length()); j++)
a[j]=a[idx];
}
try {
for (i = 0; i < a.length; i++) {
Assert.assertEquals(r[i], a[i]);
}
} catch (AssertionError e) {
Assert.assertEquals(r[i], a[i], "at index #" + i + ", input = " + a[i]);
}
}
interface FBinOp {
byte apply(byte a, byte b);
}
interface FBinMaskOp {
byte apply(byte a, byte b, boolean m);
static FBinMaskOp lift(FBinOp f) {
return (a, b, m) -> m ? f.apply(a, b) : a;
}
}
static void assertArraysEquals(byte[] r, byte[] a, byte[] b, FBinOp f) {
int i = 0;
try {
for (; i < a.length; i++) {
Assert.assertEquals(r[i], f.apply(a[i], b[i]));
}
} catch (AssertionError e) {
Assert.assertEquals(r[i], f.apply(a[i], b[i]), "(" + a[i] + ", " + b[i] + ") at index #" + i);
}
}
static void assertBroadcastArraysEquals(byte[] r, byte[] a, byte[] b, FBinOp f) {
int i = 0;
try {
for (; i < a.length; i++) {
Assert.assertEquals(r[i], f.apply(a[i], b[(i / SPECIES.length()) * SPECIES.length()]));
}
} catch (AssertionError e) {
Assert.assertEquals(r[i], f.apply(a[i], b[(i / SPECIES.length()) * SPECIES.length()]),
"(" + a[i] + ", " + b[(i / SPECIES.length()) * SPECIES.length()] + ") at index #" + i);
}
}
static void assertBroadcastLongArraysEquals(byte[] r, byte[] a, byte[] b, FBinOp f) {
int i = 0;
try {
for (; i < a.length; i++) {
Assert.assertEquals(r[i], f.apply(a[i], (byte)((long)b[(i / SPECIES.length()) * SPECIES.length()])));
}
} catch (AssertionError e) {
Assert.assertEquals(r[i], f.apply(a[i], (byte)((long)b[(i / SPECIES.length()) * SPECIES.length()])),
"(" + a[i] + ", " + b[(i / SPECIES.length()) * SPECIES.length()] + ") at index #" + i);
}
}
static void assertArraysEquals(byte[] r, byte[] a, byte[] b, boolean[] mask, FBinOp f) {
assertArraysEquals(r, a, b, mask, FBinMaskOp.lift(f));
}
static void assertArraysEquals(byte[] r, byte[] a, byte[] b, boolean[] mask, FBinMaskOp f) {
int i = 0;
try {
for (; i < a.length; i++) {
Assert.assertEquals(r[i], f.apply(a[i], b[i], mask[i % SPECIES.length()]));
}
} catch (AssertionError err) {
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()]);
}
}
static void assertBroadcastArraysEquals(byte[] r, byte[] a, byte[] b, boolean[] mask, FBinOp f) {
assertBroadcastArraysEquals(r, a, b, mask, FBinMaskOp.lift(f));
}
static void assertBroadcastArraysEquals(byte[] r, byte[] a, byte[] b, boolean[] mask, FBinMaskOp f) {
int i = 0;
try {
for (; i < a.length; i++) {
Assert.assertEquals(r[i], f.apply(a[i], b[(i / SPECIES.length()) * SPECIES.length()], mask[i % SPECIES.length()]));
}
} catch (AssertionError err) {
Assert.assertEquals(r[i], f.apply(a[i], b[(i / SPECIES.length()) * SPECIES.length()],
mask[i % SPECIES.length()]), "at index #" + i + ", input1 = " + a[i] +
", input2 = " + b[(i / SPECIES.length()) * SPECIES.length()] + ", mask = " +
mask[i % SPECIES.length()]);
}
}
static void assertBroadcastLongArraysEquals(byte[] r, byte[] a, byte[] b, boolean[] mask, FBinOp f) {
assertBroadcastLongArraysEquals(r, a, b, mask, FBinMaskOp.lift(f));
}
static void assertBroadcastLongArraysEquals(byte[] r, byte[] a, byte[] b, boolean[] mask, FBinMaskOp f) {
int i = 0;
try {
for (; i < a.length; i++) {
Assert.assertEquals(r[i], f.apply(a[i], (byte)((long)b[(i / SPECIES.length()) * SPECIES.length()]), mask[i % SPECIES.length()]));
}
} catch (AssertionError err) {
Assert.assertEquals(r[i], f.apply(a[i], (byte)((long)b[(i / SPECIES.length()) * SPECIES.length()]),
mask[i % SPECIES.length()]), "at index #" + i + ", input1 = " + a[i] +
", input2 = " + b[(i / SPECIES.length()) * SPECIES.length()] + ", mask = " +
mask[i % SPECIES.length()]);
}
}
static void assertShiftArraysEquals(byte[] r, byte[] a, byte[] b, FBinOp f) {
int i = 0;
int j = 0;
try {
for (; j < a.length; j += SPECIES.length()) {
for (i = 0; i < SPECIES.length(); i++) {
Assert.assertEquals(r[i+j], f.apply(a[i+j], b[j]));
}
}
} catch (AssertionError e) {
Assert.assertEquals(r[i+j], f.apply(a[i+j], b[j]), "at index #" + i + ", " + j);
}
}
static void assertShiftArraysEquals(byte[] r, byte[] a, byte[] b, boolean[] mask, FBinOp f) {
assertShiftArraysEquals(r, a, b, mask, FBinMaskOp.lift(f));
}
static void assertShiftArraysEquals(byte[] r, byte[] a, byte[] b, boolean[] mask, FBinMaskOp f) {
int i = 0;
int j = 0;
try {
for (; j < a.length; j += SPECIES.length()) {
for (i = 0; i < SPECIES.length(); i++) {
Assert.assertEquals(r[i+j], f.apply(a[i+j], b[j], mask[i]));
}
}
} catch (AssertionError err) {
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]);
}
}
interface FBinConstOp {
byte apply(byte a);
}
interface FBinConstMaskOp {
byte apply(byte a, boolean m);
static FBinConstMaskOp lift(FBinConstOp f) {
return (a, m) -> m ? f.apply(a) : a;
}
}
static void assertShiftConstEquals(byte[] r, byte[] a, FBinConstOp f) {
int i = 0;
int j = 0;
try {
for (; j < a.length; j += SPECIES.length()) {
for (i = 0; i < SPECIES.length(); i++) {
Assert.assertEquals(r[i+j], f.apply(a[i+j]));
}
}
} catch (AssertionError e) {
Assert.assertEquals(r[i+j], f.apply(a[i+j]), "at index #" + i + ", " + j);
}
}
static void assertShiftConstEquals(byte[] r, byte[] a, boolean[] mask, FBinConstOp f) {
assertShiftConstEquals(r, a, mask, FBinConstMaskOp.lift(f));
}
static void assertShiftConstEquals(byte[] r, byte[] a, boolean[] mask, FBinConstMaskOp f) {
int i = 0;
int j = 0;
try {
for (; j < a.length; j += SPECIES.length()) {
for (i = 0; i < SPECIES.length(); i++) {
Assert.assertEquals(r[i+j], f.apply(a[i+j], mask[i]));
}
}
} catch (AssertionError err) {
Assert.assertEquals(r[i+j], f.apply(a[i+j], mask[i]), "at index #" + i + ", input1 = " + a[i+j] + ", mask = " + mask[i]);
}
}
interface FTernOp {
byte apply(byte a, byte b, byte c);
}
interface FTernMaskOp {
byte apply(byte a, byte b, byte c, boolean m);
static FTernMaskOp lift(FTernOp f) {
return (a, b, c, m) -> m ? f.apply(a, b, c) : a;
}
}
static void assertArraysEquals(byte[] r, byte[] a, byte[] b, byte[] c, FTernOp f) {
int i = 0;
try {
for (; i < a.length; i++) {
Assert.assertEquals(r[i], f.apply(a[i], b[i], c[i]));
}
} catch (AssertionError e) {
Assert.assertEquals(r[i], f.apply(a[i], b[i], c[i]), "at index #" + i + ", input1 = " + a[i] + ", input2 = " + b[i] + ", input3 = " + c[i]);
}
}
static void assertArraysEquals(byte[] r, byte[] a, byte[] b, byte[] c, boolean[] mask, FTernOp f) {
assertArraysEquals(r, a, b, c, mask, FTernMaskOp.lift(f));
}
static void assertArraysEquals(byte[] r, byte[] a, byte[] b, byte[] c, boolean[] mask, FTernMaskOp f) {
int i = 0;
try {
for (; i < a.length; i++) {
Assert.assertEquals(r[i], f.apply(a[i], b[i], c[i], mask[i % SPECIES.length()]));
}
} catch (AssertionError err) {
Assert.assertEquals(r[i], f.apply(a[i], b[i], c[i], mask[i % SPECIES.length()]), "at index #" + i + ", input1 = " + a[i] + ", input2 = "
+ b[i] + ", input3 = " + c[i] + ", mask = " + mask[i % SPECIES.length()]);
}
}
static void assertBroadcastArraysEquals(byte[] r, byte[] a, byte[] b, byte[] c, FTernOp f) {
int i = 0;
try {
for (; i < a.length; i++) {
Assert.assertEquals(r[i], f.apply(a[i], b[i], c[(i / SPECIES.length()) * SPECIES.length()]));
}
} catch (AssertionError e) {
Assert.assertEquals(r[i], f.apply(a[i], b[i], c[(i / SPECIES.length()) * SPECIES.length()]), "at index #" +
i + ", input1 = " + a[i] + ", input2 = " + b[i] + ", input3 = " +
c[(i / SPECIES.length()) * SPECIES.length()]);
}
}
static void assertAltBroadcastArraysEquals(byte[] r, byte[] a, byte[] b, byte[] c, FTernOp f) {
int i = 0;
try {
for (; i < a.length; i++) {
Assert.assertEquals(r[i], f.apply(a[i], b[(i / SPECIES.length()) * SPECIES.length()], c[i]));
}
} catch (AssertionError e) {
Assert.assertEquals(r[i], f.apply(a[i], b[(i / SPECIES.length()) * SPECIES.length()], c[i]), "at index #" +
i + ", input1 = " + a[i] + ", input2 = " +
b[(i / SPECIES.length()) * SPECIES.length()] + ", input3 = " + c[i]);
}
}
static void assertBroadcastArraysEquals(byte[] r, byte[] a, byte[] b, byte[] c, boolean[] mask,
FTernOp f) {
assertBroadcastArraysEquals(r, a, b, c, mask, FTernMaskOp.lift(f));
}
static void assertBroadcastArraysEquals(byte[] r, byte[] a, byte[] b, byte[] c, boolean[] mask,
FTernMaskOp f) {
int i = 0;
try {
for (; i < a.length; i++) {
Assert.assertEquals(r[i], f.apply(a[i], b[i], c[(i / SPECIES.length()) * SPECIES.length()],
mask[i % SPECIES.length()]));
}
} catch (AssertionError err) {
Assert.assertEquals(r[i], f.apply(a[i], b[i], c[(i / SPECIES.length()) * SPECIES.length()],
mask[i % SPECIES.length()]), "at index #" + i + ", input1 = " + a[i] + ", input2 = " +
b[i] + ", input3 = " + c[(i / SPECIES.length()) * SPECIES.length()] + ", mask = " +
mask[i % SPECIES.length()]);
}
}
static void assertAltBroadcastArraysEquals(byte[] r, byte[] a, byte[] b, byte[] c, boolean[] mask,
FTernOp f) {
assertAltBroadcastArraysEquals(r, a, b, c, mask, FTernMaskOp.lift(f));
}
static void assertAltBroadcastArraysEquals(byte[] r, byte[] a, byte[] b, byte[] c, boolean[] mask,
FTernMaskOp f) {
int i = 0;
try {
for (; i < a.length; i++) {
Assert.assertEquals(r[i], f.apply(a[i], b[(i / SPECIES.length()) * SPECIES.length()], c[i],
mask[i % SPECIES.length()]));
}
} catch (AssertionError err) {
Assert.assertEquals(r[i], f.apply(a[i], b[(i / SPECIES.length()) * SPECIES.length()], c[i],
mask[i % SPECIES.length()]), "at index #" + i + ", input1 = " + a[i] +
", input2 = " + b[(i / SPECIES.length()) * SPECIES.length()] +
", input3 = " + c[i] + ", mask = " + mask[i % SPECIES.length()]);
}
}
static void assertDoubleBroadcastArraysEquals(byte[] r, byte[] a, byte[] b, byte[] c, FTernOp f) {
int i = 0;
try {
for (; i < a.length; i++) {
Assert.assertEquals(r[i], f.apply(a[i], b[(i / SPECIES.length()) * SPECIES.length()],
c[(i / SPECIES.length()) * SPECIES.length()]));
}
} catch (AssertionError e) {
Assert.assertEquals(r[i], f.apply(a[i], b[(i / SPECIES.length()) * SPECIES.length()],
c[(i / SPECIES.length()) * SPECIES.length()]), "at index #" + i + ", input1 = " + a[i]
+ ", input2 = " + b[(i / SPECIES.length()) * SPECIES.length()] + ", input3 = " +
c[(i / SPECIES.length()) * SPECIES.length()]);
}
}
static void assertDoubleBroadcastArraysEquals(byte[] r, byte[] a, byte[] b, byte[] c, boolean[] mask,
FTernOp f) {
assertDoubleBroadcastArraysEquals(r, a, b, c, mask, FTernMaskOp.lift(f));
}
static void assertDoubleBroadcastArraysEquals(byte[] r, byte[] a, byte[] b, byte[] c, boolean[] mask,
FTernMaskOp f) {
int i = 0;
try {
for (; i < a.length; i++) {
Assert.assertEquals(r[i], f.apply(a[i], b[(i / SPECIES.length()) * SPECIES.length()],
c[(i / SPECIES.length()) * SPECIES.length()], mask[i % SPECIES.length()]));
}
} catch (AssertionError err) {
Assert.assertEquals(r[i], f.apply(a[i], b[(i / SPECIES.length()) * SPECIES.length()],
c[(i / SPECIES.length()) * SPECIES.length()], mask[i % SPECIES.length()]), "at index #"
+ i + ", input1 = " + a[i] + ", input2 = " + b[(i / SPECIES.length()) * SPECIES.length()] +
", input3 = " + c[(i / SPECIES.length()) * SPECIES.length()] + ", mask = " +
mask[i % SPECIES.length()]);
}
}
interface FGatherScatterOp {
byte[] apply(byte[] a, int ix, int[] b, int iy);
}
static void assertArraysEquals(byte[] r, byte[] a, int[] b, FGatherScatterOp f) {
int i = 0;
try {
for (; i < a.length; i += SPECIES.length()) {
Assert.assertEquals(Arrays.copyOfRange(r, i, i+SPECIES.length()),
f.apply(a, i, b, i));
}
} catch (AssertionError e) {
byte[] ref = f.apply(a, i, b, i);
byte[] res = Arrays.copyOfRange(r, i, i+SPECIES.length());
Assert.assertEquals(res, ref,
"(ref: " + Arrays.toString(ref) + ", res: " + Arrays.toString(res) + ", a: "
+ Arrays.toString(Arrays.copyOfRange(a, i, i+SPECIES.length()))
+ ", b: "
+ Arrays.toString(Arrays.copyOfRange(b, i, i+SPECIES.length()))
+ " at index #" + i);
}
}
interface FGatherMaskedOp {
byte[] apply(byte[] a, int ix, boolean[] mask, int[] b, int iy);
}
interface FScatterMaskedOp {
byte[] apply(byte[] r, byte[] a, int ix, boolean[] mask, int[] b, int iy);
}
static void assertArraysEquals(byte[] r, byte[] a, int[] b, boolean[] mask, FGatherMaskedOp f) {
int i = 0;
try {
for (; i < a.length; i += SPECIES.length()) {
Assert.assertEquals(Arrays.copyOfRange(r, i, i+SPECIES.length()),
f.apply(a, i, mask, b, i));
}
} catch (AssertionError e) {
byte[] ref = f.apply(a, i, mask, b, i);
byte[] res = Arrays.copyOfRange(r, i, i+SPECIES.length());
Assert.assertEquals(res, ref,
"(ref: " + Arrays.toString(ref) + ", res: " + Arrays.toString(res) + ", a: "
+ Arrays.toString(Arrays.copyOfRange(a, i, i+SPECIES.length()))
+ ", b: "
+ Arrays.toString(Arrays.copyOfRange(b, i, i+SPECIES.length()))
+ ", mask: "
+ Arrays.toString(mask)
+ " at index #" + i);
}
}
static void assertArraysEquals(byte[] r, byte[] a, int[] b, boolean[] mask, FScatterMaskedOp f) {
int i = 0;
try {
for (; i < a.length; i += SPECIES.length()) {
Assert.assertEquals(Arrays.copyOfRange(r, i, i+SPECIES.length()),
f.apply(r, a, i, mask, b, i));
}
} catch (AssertionError e) {
byte[] ref = f.apply(r, a, i, mask, b, i);
byte[] res = Arrays.copyOfRange(r, i, i+SPECIES.length());
Assert.assertEquals(res, ref,
"(ref: " + Arrays.toString(ref) + ", res: " + Arrays.toString(res) + ", a: "
+ Arrays.toString(Arrays.copyOfRange(a, i, i+SPECIES.length()))
+ ", b: "
+ Arrays.toString(Arrays.copyOfRange(b, i, i+SPECIES.length()))
+ ", r: "
+ Arrays.toString(Arrays.copyOfRange(r, i, i+SPECIES.length()))
+ ", mask: "
+ Arrays.toString(mask)
+ " at index #" + i);
}
}
interface FLaneOp {
byte[] apply(byte[] a, int origin, int idx);
}
static void assertArraysEquals(byte[] r, byte[] a, int origin, FLaneOp f) {
int i = 0;
try {
for (; i < a.length; i += SPECIES.length()) {
Assert.assertEquals(Arrays.copyOfRange(r, i, i+SPECIES.length()),
f.apply(a, origin, i));
}
} catch (AssertionError e) {
byte[] ref = f.apply(a, origin, i);
byte[] res = Arrays.copyOfRange(r, i, i+SPECIES.length());
Assert.assertEquals(res, ref, "(ref: " + Arrays.toString(ref)
+ ", res: " + Arrays.toString(res)
+ "), at index #" + i);
}
}
interface FLaneBop {
byte[] apply(byte[] a, byte[] b, int origin, int idx);
}
static void assertArraysEquals(byte[] r, byte[] a, byte[] b, int origin, FLaneBop f) {
int i = 0;
try {
for (; i < a.length; i += SPECIES.length()) {
Assert.assertEquals(Arrays.copyOfRange(r, i, i+SPECIES.length()),
f.apply(a, b, origin, i));
}
} catch (AssertionError e) {
byte[] ref = f.apply(a, b, origin, i);
byte[] res = Arrays.copyOfRange(r, i, i+SPECIES.length());
Assert.assertEquals(res, ref, "(ref: " + Arrays.toString(ref)
+ ", res: " + Arrays.toString(res)
+ "), at index #" + i
+ ", at origin #" + origin);
}
}
interface FLaneMaskedBop {
byte[] apply(byte[] a, byte[] b, int origin, boolean[] mask, int idx);
}
static void assertArraysEquals(byte[] r, byte[] a, byte[] b, int origin, boolean[] mask, FLaneMaskedBop f) {
int i = 0;
try {
for (; i < a.length; i += SPECIES.length()) {
Assert.assertEquals(Arrays.copyOfRange(r, i, i+SPECIES.length()),
f.apply(a, b, origin, mask, i));
}
} catch (AssertionError e) {
byte[] ref = f.apply(a, b, origin, mask, i);
byte[] res = Arrays.copyOfRange(r, i, i+SPECIES.length());
Assert.assertEquals(res, ref, "(ref: " + Arrays.toString(ref)
+ ", res: " + Arrays.toString(res)
+ "), at index #" + i
+ ", at origin #" + origin);
}
}
interface FLanePartBop {
byte[] apply(byte[] a, byte[] b, int origin, int part, int idx);
}
static void assertArraysEquals(byte[] r, byte[] a, byte[] b, int origin, int part, FLanePartBop f) {
int i = 0;
try {
for (; i < a.length; i += SPECIES.length()) {
Assert.assertEquals(Arrays.copyOfRange(r, i, i+SPECIES.length()),
f.apply(a, b, origin, part, i));
}
} catch (AssertionError e) {
byte[] ref = f.apply(a, b, origin, part, i);
byte[] res = Arrays.copyOfRange(r, i, i+SPECIES.length());
Assert.assertEquals(res, ref, "(ref: " + Arrays.toString(ref)
+ ", res: " + Arrays.toString(res)
+ "), at index #" + i
+ ", at origin #" + origin
+ ", with part #" + part);
}
}
interface FLanePartMaskedBop {
byte[] apply(byte[] a, byte[] b, int origin, int part, boolean[] mask, int idx);
}
static void assertArraysEquals(byte[] r, byte[] a, byte[] b, int origin, int part, boolean[] mask, FLanePartMaskedBop f) {
int i = 0;
try {
for (; i < a.length; i += SPECIES.length()) {
Assert.assertEquals(Arrays.copyOfRange(r, i, i+SPECIES.length()),
f.apply(a, b, origin, part, mask, i));
}
} catch (AssertionError e) {
byte[] ref = f.apply(a, b, origin, part, mask, i);
byte[] res = Arrays.copyOfRange(r, i, i+SPECIES.length());
Assert.assertEquals(res, ref, "(ref: " + Arrays.toString(ref)
+ ", res: " + Arrays.toString(res)
+ "), at index #" + i
+ ", at origin #" + origin
+ ", with part #" + part);
}
}
static void assertArraysEquals(int[] r, byte[] a, int offs) {
int i = 0;
try {
for (; i < r.length; i++) {
Assert.assertEquals(r[i], (int)(a[i+offs]));
}
} catch (AssertionError e) {
Assert.assertEquals(r[i], (int)(a[i+offs]), "at index #" + i + ", input = " + a[i+offs]);
}
}
static void assertArraysEquals(byte[] r, byte[] a, int offs) {
int i = 0;
try {
for (; i < r.length; i++) {
Assert.assertEquals(r[i], (long)(a[i+offs]));
}
} catch (AssertionError e) {
Assert.assertEquals(r[i], (long)(a[i+offs]), "at index #" + i + ", input = " + a[i+offs]);
}
}
static void assertArraysEquals(long[] r, byte[] a, int offs) {
int i = 0;
try {
for (; i < r.length; i++) {
Assert.assertEquals(r[i], (long)(a[i+offs]));
}
} catch (AssertionError e) {
Assert.assertEquals(r[i], (long)(a[i+offs]), "at index #" + i + ", input = " + a[i+offs]);
}
}
static void assertArraysEquals(double[] r, byte[] a, int offs) {
int i = 0;
try {
for (; i < r.length; i++) {
Assert.assertEquals(r[i], (double)(a[i+offs]));
}
} catch (AssertionError e) {
Assert.assertEquals(r[i], (double)(a[i+offs]), "at index #" + i + ", input = " + a[i+offs]);
}
}
static byte bits(byte e) {
return e;
}
static final List<IntFunction<byte[]>> BYTE_GENERATORS = List.of(
withToString("byte[-i * 5]", (int s) -> {
return fill(s * BUFFER_REPS,
i -> (byte)(-i * 5));
}),
withToString("byte[i * 5]", (int s) -> {
return fill(s * BUFFER_REPS,
i -> (byte)(i * 5));
}),
withToString("byte[i + 1]", (int s) -> {
return fill(s * BUFFER_REPS,
i -> (((byte)(i + 1) == 0) ? 1 : (byte)(i + 1)));
}),
withToString("byte[cornerCaseValue(i)]", (int s) -> {
return fill(s * BUFFER_REPS,
i -> cornerCaseValue(i));
})
);
static final List<IntFunction<byte[]>> BYTE_SATURATING_GENERATORS = List.of(
withToString("byte[Byte.MIN_VALUE]", (int s) -> {
return fill(s * BUFFER_REPS,
i -> (byte)(Byte.MIN_VALUE));
}),
withToString("byte[Byte.MAX_VALUE]", (int s) -> {
return fill(s * BUFFER_REPS,
i -> (byte)(Byte.MAX_VALUE));
}),
withToString("byte[Byte.MAX_VALUE - 100]", (int s) -> {
return fill(s * BUFFER_REPS,
i -> (byte)(Byte.MAX_VALUE - 100));
}),
withToString("byte[Byte.MIN_VALUE + 100]", (int s) -> {
return fill(s * BUFFER_REPS,
i -> (byte)(Byte.MIN_VALUE + 100));
}),
withToString("byte[-i * 5]", (int s) -> {
return fill(s * BUFFER_REPS,
i -> (byte)(-i * 5));
}),
withToString("byte[i * 5]", (int s) -> {
return fill(s * BUFFER_REPS,
i -> (byte)(i * 5));
})
);
// Create combinations of pairs
// @@@ Might be sensitive to order e.g. div by 0
static final List<List<IntFunction<byte[]>>> BYTE_GENERATOR_PAIRS =
Stream.of(BYTE_GENERATORS.get(0)).
flatMap(fa -> BYTE_GENERATORS.stream().skip(1).map(fb -> List.of(fa, fb))).
collect(Collectors.toList());
static final List<List<IntFunction<byte[]>>> BYTE_SATURATING_GENERATOR_PAIRS =
Stream.of(BYTE_GENERATORS.get(0)).
flatMap(fa -> BYTE_SATURATING_GENERATORS.stream().skip(1).map(fb -> List.of(fa, fb))).
collect(Collectors.toList());
@DataProvider
public Object[][] boolUnaryOpProvider() {
return BOOL_ARRAY_GENERATORS.stream().
map(f -> new Object[]{f}).
toArray(Object[][]::new);
}
static final List<List<IntFunction<byte[]>>> BYTE_GENERATOR_TRIPLES =
BYTE_GENERATOR_PAIRS.stream().
flatMap(pair -> BYTE_GENERATORS.stream().map(f -> List.of(pair.get(0), pair.get(1), f))).
collect(Collectors.toList());
static final List<IntFunction<byte[]>> SELECT_FROM_INDEX_GENERATORS = List.of(
withToString("byte[0..VECLEN*2)", (int s) -> {
return fill(s * BUFFER_REPS,
i -> (byte)(RAND.nextInt()));
})
);
static final List<List<IntFunction<byte[]>>> BYTE_GENERATOR_SELECT_FROM_TRIPLES =
BYTE_GENERATOR_PAIRS.stream().
flatMap(pair -> SELECT_FROM_INDEX_GENERATORS.stream().map(f -> List.of(pair.get(0), pair.get(1), f))).
collect(Collectors.toList());
@DataProvider
public Object[][] byteBinaryOpProvider() {
return BYTE_GENERATOR_PAIRS.stream().map(List::toArray).
toArray(Object[][]::new);
}
@DataProvider
public Object[][] byteSaturatingBinaryOpProvider() {
return BYTE_SATURATING_GENERATOR_PAIRS.stream().map(List::toArray).
toArray(Object[][]::new);
}
@DataProvider
public Object[][] byteIndexedOpProvider() {
return BYTE_GENERATOR_PAIRS.stream().map(List::toArray).
toArray(Object[][]::new);
}
@DataProvider
public Object[][] byteSaturatingBinaryOpMaskProvider() {
return BOOLEAN_MASK_GENERATORS.stream().
flatMap(fm -> BYTE_SATURATING_GENERATOR_PAIRS.stream().map(lfa -> {
return Stream.concat(lfa.stream(), Stream.of(fm)).toArray();
})).
toArray(Object[][]::new);
}
@DataProvider
public Object[][] byteBinaryOpMaskProvider() {
return BOOLEAN_MASK_GENERATORS.stream().
flatMap(fm -> BYTE_GENERATOR_PAIRS.stream().map(lfa -> {
return Stream.concat(lfa.stream(), Stream.of(fm)).toArray();
})).
toArray(Object[][]::new);
}
@DataProvider
public Object[][] byteTernaryOpProvider() {
return BYTE_GENERATOR_TRIPLES.stream().map(List::toArray).
toArray(Object[][]::new);
}
@DataProvider
public Object[][] byteSelectFromTwoVectorOpProvider() {
return BYTE_GENERATOR_SELECT_FROM_TRIPLES.stream().map(List::toArray).
toArray(Object[][]::new);
}
@DataProvider
public Object[][] byteTernaryOpMaskProvider() {
return BOOLEAN_MASK_GENERATORS.stream().
flatMap(fm -> BYTE_GENERATOR_TRIPLES.stream().map(lfa -> {
return Stream.concat(lfa.stream(), Stream.of(fm)).toArray();
})).
toArray(Object[][]::new);
}
@DataProvider
public Object[][] byteUnaryOpProvider() {
return BYTE_GENERATORS.stream().
map(f -> new Object[]{f}).
toArray(Object[][]::new);
}
@DataProvider
public Object[][] byteUnaryOpMaskProvider() {
return BOOLEAN_MASK_GENERATORS.stream().
flatMap(fm -> BYTE_GENERATORS.stream().map(fa -> {
return new Object[] {fa, fm};
})).
toArray(Object[][]::new);
}
@DataProvider
public Object[][] maskProvider() {
return BOOLEAN_MASK_GENERATORS.stream().
map(f -> new Object[]{f}).
toArray(Object[][]::new);
}
@DataProvider
public Object[][] maskCompareOpProvider() {
return BOOLEAN_MASK_COMPARE_GENERATOR_PAIRS.stream().map(List::toArray).
toArray(Object[][]::new);
}
@DataProvider
public Object[][] shuffleProvider() {
return INT_SHUFFLE_GENERATORS.stream().
map(f -> new Object[]{f}).
toArray(Object[][]::new);
}
@DataProvider
public Object[][] shuffleCompareOpProvider() {
return INT_SHUFFLE_COMPARE_GENERATOR_PAIRS.stream().map(List::toArray).
toArray(Object[][]::new);
}
@DataProvider
public Object[][] byteUnaryOpShuffleProvider() {
return INT_SHUFFLE_GENERATORS.stream().
flatMap(fs -> BYTE_GENERATORS.stream().map(fa -> {
return new Object[] {fa, fs};
})).
toArray(Object[][]::new);
}
@DataProvider
public Object[][] byteUnaryOpShuffleMaskProvider() {
return BOOLEAN_MASK_GENERATORS.stream().
flatMap(fm -> INT_SHUFFLE_GENERATORS.stream().
flatMap(fs -> BYTE_GENERATORS.stream().map(fa -> {
return new Object[] {fa, fs, fm};
}))).
toArray(Object[][]::new);
}
static final List<BiFunction<Integer,Integer,byte[]>> BYTE_SHUFFLE_GENERATORS = List.of(
withToStringBi("shuffle[random]", (Integer l, Integer m) -> {
byte[] a = new byte[l];
int upper = m;
for (int i = 0; i < 1; i++) {
a[i] = (byte)RAND.nextInt(upper);
}
return a;
})
);
@DataProvider
public Object[][] byteUnaryOpSelectFromProvider() {
return BYTE_SHUFFLE_GENERATORS.stream().
flatMap(fs -> BYTE_GENERATORS.stream().map(fa -> {
return new Object[] {fa, fs};
})).
toArray(Object[][]::new);
}
@DataProvider
public Object[][] byteUnaryOpSelectFromMaskProvider() {
return BOOLEAN_MASK_GENERATORS.stream().
flatMap(fm -> BYTE_SHUFFLE_GENERATORS.stream().
flatMap(fs -> BYTE_GENERATORS.stream().map(fa -> {
return new Object[] {fa, fs, fm};
}))).
toArray(Object[][]::new);
}
static final List<IntFunction<byte[]>> BYTE_COMPARE_GENERATORS = List.of(
withToString("byte[i]", (int s) -> {
return fill(s * BUFFER_REPS,
i -> (byte)i);
}),
withToString("byte[i - length / 2]", (int s) -> {
return fill(s * BUFFER_REPS,
i -> (byte)(i - (s * BUFFER_REPS / 2)));
}),
withToString("byte[i + 1]", (int s) -> {
return fill(s * BUFFER_REPS,
i -> (byte)(i + 1));
}),
withToString("byte[i - 2]", (int s) -> {
return fill(s * BUFFER_REPS,
i -> (byte)(i - 2));
}),
withToString("byte[zigZag(i)]", (int s) -> {
return fill(s * BUFFER_REPS,
i -> i%3 == 0 ? (byte)i : (i%3 == 1 ? (byte)(i + 1) : (byte)(i - 2)));
}),
withToString("byte[cornerCaseValue(i)]", (int s) -> {
return fill(s * BUFFER_REPS,
i -> cornerCaseValue(i));
})
);
static final List<List<IntFunction<byte[]>>> BYTE_TEST_GENERATOR_ARGS =
BYTE_COMPARE_GENERATORS.stream().
map(fa -> List.of(fa)).
collect(Collectors.toList());
@DataProvider
public Object[][] byteTestOpProvider() {
return BYTE_TEST_GENERATOR_ARGS.stream().map(List::toArray).
toArray(Object[][]::new);
}
@DataProvider
public Object[][] byteTestOpMaskProvider() {
return BOOLEAN_MASK_GENERATORS.stream().
flatMap(fm -> BYTE_TEST_GENERATOR_ARGS.stream().map(lfa -> {
return Stream.concat(lfa.stream(), Stream.of(fm)).toArray();
})).
toArray(Object[][]::new);
}
static final List<List<IntFunction<byte[]>>> BYTE_COMPARE_GENERATOR_PAIRS =
BYTE_COMPARE_GENERATORS.stream().
flatMap(fa -> BYTE_COMPARE_GENERATORS.stream().map(fb -> List.of(fa, fb))).
collect(Collectors.toList());
@DataProvider
public Object[][] byteCompareOpProvider() {
return BYTE_COMPARE_GENERATOR_PAIRS.stream().map(List::toArray).
toArray(Object[][]::new);
}
@DataProvider
public Object[][] byteCompareOpMaskProvider() {
return BOOLEAN_MASK_GENERATORS.stream().
flatMap(fm -> BYTE_COMPARE_GENERATOR_PAIRS.stream().map(lfa -> {
return Stream.concat(lfa.stream(), Stream.of(fm)).toArray();
})).
toArray(Object[][]::new);
}
interface ToByteF {
byte apply(int i);
}
static byte[] fill(int s , ToByteF f) {
return fill(new byte[s], f);
}
static byte[] fill(byte[] a, ToByteF f) {
for (int i = 0; i < a.length; i++) {
a[i] = f.apply(i);
}
return a;
}
static byte cornerCaseValue(int i) {
switch(i % 5) {
case 0:
return Byte.MAX_VALUE;
case 1:
return Byte.MIN_VALUE;
case 2:
return Byte.MIN_VALUE;
case 3:
return Byte.MAX_VALUE;
default:
return (byte)0;
}
}
static final IntFunction<byte[]> fr = (vl) -> {
int length = BUFFER_REPS * vl;
return new byte[length];
};
static final IntFunction<boolean[]> fmr = (vl) -> {
int length = BUFFER_REPS * vl;
return new boolean[length];
};
static final IntFunction<long[]> lfr = (vl) -> {
int length = BUFFER_REPS * vl;
return new long[length];
};
static void replaceZero(byte[] a, byte v) {
for (int i = 0; i < a.length; i++) {
if (a[i] == 0) {
a[i] = v;
}
}
}
static void replaceZero(byte[] a, boolean[] mask, byte v) {
for (int i = 0; i < a.length; i++) {
if (mask[i % mask.length] && a[i] == 0) {
a[i] = v;
}
}
}
static byte ROL_scalar(byte a, byte b) {
return (byte)(((((byte)a) & 0xFF) << (b & 7)) | ((((byte)a) & 0xFF) >>> (8 - (b & 7))));
}
static byte ROR_scalar(byte a, byte b) {
return (byte)(((((byte)a) & 0xFF) >>> (b & 7)) | ((((byte)a) & 0xFF) << (8 - (b & 7))));
}
static byte TRAILING_ZEROS_COUNT_scalar(byte a) {
return (byte) (a != 0 ? Integer.numberOfTrailingZeros(a) : 8);
}
static byte LEADING_ZEROS_COUNT_scalar(byte a) {
return (byte) (a >= 0 ? Integer.numberOfLeadingZeros(a) - 24 : 0);
}
static byte REVERSE_scalar(byte a) {
byte b = (byte) ROL_scalar(a, (byte) 4);
b = (byte) (((b & 0x55) << 1) | ((b & 0xAA) >>> 1));
b = (byte) (((b & 0x33) << 2) | ((b & 0xCC) >>> 2));
return b;
}
static boolean eq(byte a, byte b) {
return a == b;
}
static boolean neq(byte a, byte b) {
return a != b;
}
static boolean lt(byte a, byte b) {
return a < b;
}
static boolean le(byte a, byte b) {
return a <= b;
}
static boolean gt(byte a, byte b) {
return a > b;
}
static boolean ge(byte a, byte b) {
return a >= b;
}
static boolean ult(byte a, byte b) {
return Byte.compareUnsigned(a, b) < 0;
}
static boolean ule(byte a, byte b) {
return Byte.compareUnsigned(a, b) <= 0;
}
static boolean ugt(byte a, byte b) {
return Byte.compareUnsigned(a, b) > 0;
}
static boolean uge(byte a, byte b) {
return Byte.compareUnsigned(a, b) >= 0;
}
static byte firstNonZero(byte a, byte b) {
return Byte.compare(a, (byte) 0) != 0 ? a : b;
}
@Test
static void smokeTest1() {
ByteVector three = ByteVector.broadcast(SPECIES, (byte)-3);
ByteVector three2 = (ByteVector) SPECIES.broadcast(-3);
assert(three.eq(three2).allTrue());
ByteVector three3 = three2.broadcast(1).broadcast(-3);
assert(three.eq(three3).allTrue());
int scale = 2;
Class<?> ETYPE = byte.class;
if (ETYPE == double.class || ETYPE == long.class)
scale = 1000000;
else if (ETYPE == byte.class && SPECIES.length() >= 64)
scale = 1;
ByteVector higher = three.addIndex(scale);
VectorMask<Byte> m = three.compare(VectorOperators.LE, higher);
assert(m.allTrue());
m = higher.min((byte)-1).test(VectorOperators.IS_NEGATIVE);
assert(m.allTrue());
byte max = higher.reduceLanes(VectorOperators.MAX);
assert(max == -3 + scale * (SPECIES.length()-1));
}
private static byte[]
bothToArray(ByteVector a, ByteVector b) {
byte[] r = new byte[a.length() + b.length()];
a.intoArray(r, 0);
b.intoArray(r, a.length());
return r;
}
@Test
static void smokeTest2() {
// Do some zipping and shuffling.
ByteVector io = (ByteVector) SPECIES.broadcast(0).addIndex(1);
ByteVector io2 = (ByteVector) VectorShuffle.iota(SPECIES,0,1,false).toVector();
Assert.assertEquals(io, io2);
ByteVector a = io.add((byte)1); //[1,2]
ByteVector b = a.neg(); //[-1,-2]
byte[] abValues = bothToArray(a,b); //[1,2,-1,-2]
VectorShuffle<Byte> zip0 = VectorShuffle.makeZip(SPECIES, 0);
VectorShuffle<Byte> zip1 = VectorShuffle.makeZip(SPECIES, 1);
ByteVector zab0 = a.rearrange(zip0,b); //[1,-1]
ByteVector zab1 = a.rearrange(zip1,b); //[2,-2]
byte[] zabValues = bothToArray(zab0, zab1); //[1,-1,2,-2]
// manually zip
byte[] manual = new byte[zabValues.length];
for (int i = 0; i < manual.length; i += 2) {
manual[i+0] = abValues[i/2];
manual[i+1] = abValues[a.length() + i/2];
}
Assert.assertEquals(Arrays.toString(zabValues), Arrays.toString(manual));
VectorShuffle<Byte> unz0 = VectorShuffle.makeUnzip(SPECIES, 0);
VectorShuffle<Byte> unz1 = VectorShuffle.makeUnzip(SPECIES, 1);
ByteVector uab0 = zab0.rearrange(unz0,zab1);
ByteVector uab1 = zab0.rearrange(unz1,zab1);
byte[] abValues1 = bothToArray(uab0, uab1);
Assert.assertEquals(Arrays.toString(abValues), Arrays.toString(abValues1));
}
static void iotaShuffle() {
ByteVector io = (ByteVector) SPECIES.broadcast(0).addIndex(1);
ByteVector io2 = (ByteVector) VectorShuffle.iota(SPECIES, 0 , 1, false).toVector();
Assert.assertEquals(io, io2);
}
@Test
// Test all shuffle related operations.
static void shuffleTest() {
// To test backend instructions, make sure that C2 is used.
for (int loop = 0; loop < INVOC_COUNT * INVOC_COUNT; loop++) {
iotaShuffle();
}
}
@Test
void viewAsIntegeralLanesTest() {
Vector<?> asIntegral = SPECIES.zero().viewAsIntegralLanes();
Assert.assertEquals(asIntegral.species(), SPECIES);
}
@Test(expectedExceptions = UnsupportedOperationException.class)
void viewAsFloatingLanesTest() {
SPECIES.zero().viewAsFloatingLanes();
}
@Test
// Test div by 0.
static void bitwiseDivByZeroSmokeTest() {
try {
ByteVector a = (ByteVector) SPECIES.broadcast(0).addIndex(1);
ByteVector b = (ByteVector) SPECIES.broadcast(0);
a.div(b);
Assert.fail();
} catch (ArithmeticException e) {
}
try {
ByteVector a = (ByteVector) SPECIES.broadcast(0).addIndex(1);
ByteVector b = (ByteVector) SPECIES.broadcast(0);
VectorMask<Byte> m = a.lt((byte) 1);
a.div(b, m);
Assert.fail();
} catch (ArithmeticException e) {
}
}
static byte ADD(byte a, byte b) {
return (byte)(a + b);
}
@Test(dataProvider = "byteBinaryOpProvider")
static void ADDByte64VectorTests(IntFunction<byte[]> fa, IntFunction<byte[]> fb) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector bv = ByteVector.fromArray(SPECIES, b, i);
av.lanewise(VectorOperators.ADD, bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Byte64VectorTests::ADD);
}
static byte add(byte a, byte b) {
return (byte)(a + b);
}
@Test(dataProvider = "byteBinaryOpProvider")
static void addByte64VectorTests(IntFunction<byte[]> fa, IntFunction<byte[]> fb) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector bv = ByteVector.fromArray(SPECIES, b, i);
av.add(bv).intoArray(r, i);
}
assertArraysEquals(r, a, b, Byte64VectorTests::add);
}
@Test(dataProvider = "byteBinaryOpMaskProvider")
static void ADDByte64VectorTestsMasked(IntFunction<byte[]> fa, IntFunction<byte[]> fb,
IntFunction<boolean[]> fm) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, 0);
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector bv = ByteVector.fromArray(SPECIES, b, i);
av.lanewise(VectorOperators.ADD, bv, vmask).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, mask, Byte64VectorTests::ADD);
}
@Test(dataProvider = "byteBinaryOpMaskProvider")
static void addByte64VectorTestsMasked(IntFunction<byte[]> fa, IntFunction<byte[]> fb,
IntFunction<boolean[]> fm) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, 0);
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector bv = ByteVector.fromArray(SPECIES, b, i);
av.add(bv, vmask).intoArray(r, i);
}
assertArraysEquals(r, a, b, mask, Byte64VectorTests::add);
}
static byte SUB(byte a, byte b) {
return (byte)(a - b);
}
@Test(dataProvider = "byteBinaryOpProvider")
static void SUBByte64VectorTests(IntFunction<byte[]> fa, IntFunction<byte[]> fb) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector bv = ByteVector.fromArray(SPECIES, b, i);
av.lanewise(VectorOperators.SUB, bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Byte64VectorTests::SUB);
}
static byte sub(byte a, byte b) {
return (byte)(a - b);
}
@Test(dataProvider = "byteBinaryOpProvider")
static void subByte64VectorTests(IntFunction<byte[]> fa, IntFunction<byte[]> fb) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector bv = ByteVector.fromArray(SPECIES, b, i);
av.sub(bv).intoArray(r, i);
}
assertArraysEquals(r, a, b, Byte64VectorTests::sub);
}
@Test(dataProvider = "byteBinaryOpMaskProvider")
static void SUBByte64VectorTestsMasked(IntFunction<byte[]> fa, IntFunction<byte[]> fb,
IntFunction<boolean[]> fm) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, 0);
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector bv = ByteVector.fromArray(SPECIES, b, i);
av.lanewise(VectorOperators.SUB, bv, vmask).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, mask, Byte64VectorTests::SUB);
}
@Test(dataProvider = "byteBinaryOpMaskProvider")
static void subByte64VectorTestsMasked(IntFunction<byte[]> fa, IntFunction<byte[]> fb,
IntFunction<boolean[]> fm) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, 0);
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector bv = ByteVector.fromArray(SPECIES, b, i);
av.sub(bv, vmask).intoArray(r, i);
}
assertArraysEquals(r, a, b, mask, Byte64VectorTests::sub);
}
static byte MUL(byte a, byte b) {
return (byte)(a * b);
}
@Test(dataProvider = "byteBinaryOpProvider")
static void MULByte64VectorTests(IntFunction<byte[]> fa, IntFunction<byte[]> fb) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector bv = ByteVector.fromArray(SPECIES, b, i);
av.lanewise(VectorOperators.MUL, bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Byte64VectorTests::MUL);
}
static byte mul(byte a, byte b) {
return (byte)(a * b);
}
@Test(dataProvider = "byteBinaryOpProvider")
static void mulByte64VectorTests(IntFunction<byte[]> fa, IntFunction<byte[]> fb) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector bv = ByteVector.fromArray(SPECIES, b, i);
av.mul(bv).intoArray(r, i);
}
assertArraysEquals(r, a, b, Byte64VectorTests::mul);
}
@Test(dataProvider = "byteBinaryOpMaskProvider")
static void MULByte64VectorTestsMasked(IntFunction<byte[]> fa, IntFunction<byte[]> fb,
IntFunction<boolean[]> fm) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, 0);
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector bv = ByteVector.fromArray(SPECIES, b, i);
av.lanewise(VectorOperators.MUL, bv, vmask).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, mask, Byte64VectorTests::MUL);
}
@Test(dataProvider = "byteBinaryOpMaskProvider")
static void mulByte64VectorTestsMasked(IntFunction<byte[]> fa, IntFunction<byte[]> fb,
IntFunction<boolean[]> fm) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, 0);
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector bv = ByteVector.fromArray(SPECIES, b, i);
av.mul(bv, vmask).intoArray(r, i);
}
assertArraysEquals(r, a, b, mask, Byte64VectorTests::mul);
}
static byte DIV(byte a, byte b) {
return (byte)(a / b);
}
@Test(dataProvider = "byteBinaryOpProvider")
static void DIVByte64VectorTests(IntFunction<byte[]> fa, IntFunction<byte[]> fb) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
replaceZero(b, (byte) 1);
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector bv = ByteVector.fromArray(SPECIES, b, i);
av.lanewise(VectorOperators.DIV, bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Byte64VectorTests::DIV);
}
static byte div(byte a, byte b) {
return (byte)(a / b);
}
@Test(dataProvider = "byteBinaryOpProvider")
static void divByte64VectorTests(IntFunction<byte[]> fa, IntFunction<byte[]> fb) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
replaceZero(b, (byte) 1);
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector bv = ByteVector.fromArray(SPECIES, b, i);
av.div(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Byte64VectorTests::div);
}
@Test(dataProvider = "byteBinaryOpMaskProvider")
static void DIVByte64VectorTestsMasked(IntFunction<byte[]> fa, IntFunction<byte[]> fb,
IntFunction<boolean[]> fm) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, 0);
replaceZero(b, mask, (byte) 1);
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector bv = ByteVector.fromArray(SPECIES, b, i);
av.lanewise(VectorOperators.DIV, bv, vmask).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, mask, Byte64VectorTests::DIV);
}
@Test(dataProvider = "byteBinaryOpMaskProvider")
static void divByte64VectorTestsMasked(IntFunction<byte[]> fa, IntFunction<byte[]> fb,
IntFunction<boolean[]> fm) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, 0);
replaceZero(b, mask, (byte) 1);
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector bv = ByteVector.fromArray(SPECIES, b, i);
av.div(bv, vmask).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, mask, Byte64VectorTests::div);
}
static byte FIRST_NONZERO(byte a, byte b) {
return (byte)((a)!=0?a:b);
}
@Test(dataProvider = "byteBinaryOpProvider")
static void FIRST_NONZEROByte64VectorTests(IntFunction<byte[]> fa, IntFunction<byte[]> fb) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector bv = ByteVector.fromArray(SPECIES, b, i);
av.lanewise(VectorOperators.FIRST_NONZERO, bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Byte64VectorTests::FIRST_NONZERO);
}
@Test(dataProvider = "byteBinaryOpMaskProvider")
static void FIRST_NONZEROByte64VectorTestsMasked(IntFunction<byte[]> fa, IntFunction<byte[]> fb,
IntFunction<boolean[]> fm) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, 0);
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector bv = ByteVector.fromArray(SPECIES, b, i);
av.lanewise(VectorOperators.FIRST_NONZERO, bv, vmask).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, mask, Byte64VectorTests::FIRST_NONZERO);
}
static byte AND(byte a, byte b) {
return (byte)(a & b);
}
@Test(dataProvider = "byteBinaryOpProvider")
static void ANDByte64VectorTests(IntFunction<byte[]> fa, IntFunction<byte[]> fb) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector bv = ByteVector.fromArray(SPECIES, b, i);
av.lanewise(VectorOperators.AND, bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Byte64VectorTests::AND);
}
static byte and(byte a, byte b) {
return (byte)(a & b);
}
@Test(dataProvider = "byteBinaryOpProvider")
static void andByte64VectorTests(IntFunction<byte[]> fa, IntFunction<byte[]> fb) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector bv = ByteVector.fromArray(SPECIES, b, i);
av.and(bv).intoArray(r, i);
}
assertArraysEquals(r, a, b, Byte64VectorTests::and);
}
@Test(dataProvider = "byteBinaryOpMaskProvider")
static void ANDByte64VectorTestsMasked(IntFunction<byte[]> fa, IntFunction<byte[]> fb,
IntFunction<boolean[]> fm) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, 0);
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector bv = ByteVector.fromArray(SPECIES, b, i);
av.lanewise(VectorOperators.AND, bv, vmask).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, mask, Byte64VectorTests::AND);
}
static byte AND_NOT(byte a, byte b) {
return (byte)(a & ~b);
}
@Test(dataProvider = "byteBinaryOpProvider")
static void AND_NOTByte64VectorTests(IntFunction<byte[]> fa, IntFunction<byte[]> fb) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector bv = ByteVector.fromArray(SPECIES, b, i);
av.lanewise(VectorOperators.AND_NOT, bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Byte64VectorTests::AND_NOT);
}
@Test(dataProvider = "byteBinaryOpMaskProvider")
static void AND_NOTByte64VectorTestsMasked(IntFunction<byte[]> fa, IntFunction<byte[]> fb,
IntFunction<boolean[]> fm) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, 0);
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector bv = ByteVector.fromArray(SPECIES, b, i);
av.lanewise(VectorOperators.AND_NOT, bv, vmask).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, mask, Byte64VectorTests::AND_NOT);
}
static byte OR(byte a, byte b) {
return (byte)(a | b);
}
@Test(dataProvider = "byteBinaryOpProvider")
static void ORByte64VectorTests(IntFunction<byte[]> fa, IntFunction<byte[]> fb) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector bv = ByteVector.fromArray(SPECIES, b, i);
av.lanewise(VectorOperators.OR, bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Byte64VectorTests::OR);
}
static byte or(byte a, byte b) {
return (byte)(a | b);
}
@Test(dataProvider = "byteBinaryOpProvider")
static void orByte64VectorTests(IntFunction<byte[]> fa, IntFunction<byte[]> fb) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector bv = ByteVector.fromArray(SPECIES, b, i);
av.or(bv).intoArray(r, i);
}
assertArraysEquals(r, a, b, Byte64VectorTests::or);
}
@Test(dataProvider = "byteBinaryOpMaskProvider")
static void ORByte64VectorTestsMasked(IntFunction<byte[]> fa, IntFunction<byte[]> fb,
IntFunction<boolean[]> fm) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, 0);
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector bv = ByteVector.fromArray(SPECIES, b, i);
av.lanewise(VectorOperators.OR, bv, vmask).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, mask, Byte64VectorTests::OR);
}
static byte XOR(byte a, byte b) {
return (byte)(a ^ b);
}
@Test(dataProvider = "byteBinaryOpProvider")
static void XORByte64VectorTests(IntFunction<byte[]> fa, IntFunction<byte[]> fb) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector bv = ByteVector.fromArray(SPECIES, b, i);
av.lanewise(VectorOperators.XOR, bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Byte64VectorTests::XOR);
}
@Test(dataProvider = "byteBinaryOpMaskProvider")
static void XORByte64VectorTestsMasked(IntFunction<byte[]> fa, IntFunction<byte[]> fb,
IntFunction<boolean[]> fm) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, 0);
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector bv = ByteVector.fromArray(SPECIES, b, i);
av.lanewise(VectorOperators.XOR, bv, vmask).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, mask, Byte64VectorTests::XOR);
}
@Test(dataProvider = "byteBinaryOpProvider")
static void addByte64VectorTestsBroadcastSmokeTest(IntFunction<byte[]> fa, IntFunction<byte[]> fb) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
av.add(b[i]).intoArray(r, i);
}
assertBroadcastArraysEquals(r, a, b, Byte64VectorTests::add);
}
@Test(dataProvider = "byteBinaryOpMaskProvider")
static void addByte64VectorTestsBroadcastMaskedSmokeTest(IntFunction<byte[]> fa, IntFunction<byte[]> fb,
IntFunction<boolean[]> fm) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, 0);
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
av.add(b[i], vmask).intoArray(r, i);
}
assertBroadcastArraysEquals(r, a, b, mask, Byte64VectorTests::add);
}
@Test(dataProvider = "byteBinaryOpProvider")
static void subByte64VectorTestsBroadcastSmokeTest(IntFunction<byte[]> fa, IntFunction<byte[]> fb) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
av.sub(b[i]).intoArray(r, i);
}
assertBroadcastArraysEquals(r, a, b, Byte64VectorTests::sub);
}
@Test(dataProvider = "byteBinaryOpMaskProvider")
static void subByte64VectorTestsBroadcastMaskedSmokeTest(IntFunction<byte[]> fa, IntFunction<byte[]> fb,
IntFunction<boolean[]> fm) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, 0);
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
av.sub(b[i], vmask).intoArray(r, i);
}
assertBroadcastArraysEquals(r, a, b, mask, Byte64VectorTests::sub);
}
@Test(dataProvider = "byteBinaryOpProvider")
static void mulByte64VectorTestsBroadcastSmokeTest(IntFunction<byte[]> fa, IntFunction<byte[]> fb) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
av.mul(b[i]).intoArray(r, i);
}
assertBroadcastArraysEquals(r, a, b, Byte64VectorTests::mul);
}
@Test(dataProvider = "byteBinaryOpMaskProvider")
static void mulByte64VectorTestsBroadcastMaskedSmokeTest(IntFunction<byte[]> fa, IntFunction<byte[]> fb,
IntFunction<boolean[]> fm) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, 0);
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
av.mul(b[i], vmask).intoArray(r, i);
}
assertBroadcastArraysEquals(r, a, b, mask, Byte64VectorTests::mul);
}
@Test(dataProvider = "byteBinaryOpProvider")
static void divByte64VectorTestsBroadcastSmokeTest(IntFunction<byte[]> fa, IntFunction<byte[]> fb) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
replaceZero(b, (byte) 1);
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
av.div(b[i]).intoArray(r, i);
}
assertBroadcastArraysEquals(r, a, b, Byte64VectorTests::div);
}
@Test(dataProvider = "byteBinaryOpMaskProvider")
static void divByte64VectorTestsBroadcastMaskedSmokeTest(IntFunction<byte[]> fa, IntFunction<byte[]> fb,
IntFunction<boolean[]> fm) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, 0);
replaceZero(b, (byte) 1);
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
av.div(b[i], vmask).intoArray(r, i);
}
assertBroadcastArraysEquals(r, a, b, mask, Byte64VectorTests::div);
}
@Test(dataProvider = "byteBinaryOpProvider")
static void ORByte64VectorTestsBroadcastSmokeTest(IntFunction<byte[]> fa, IntFunction<byte[]> fb) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
av.lanewise(VectorOperators.OR, b[i]).intoArray(r, i);
}
assertBroadcastArraysEquals(r, a, b, Byte64VectorTests::OR);
}
@Test(dataProvider = "byteBinaryOpProvider")
static void orByte64VectorTestsBroadcastSmokeTest(IntFunction<byte[]> fa, IntFunction<byte[]> fb) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
av.or(b[i]).intoArray(r, i);
}
assertBroadcastArraysEquals(r, a, b, Byte64VectorTests::or);
}
@Test(dataProvider = "byteBinaryOpMaskProvider")
static void ORByte64VectorTestsBroadcastMaskedSmokeTest(IntFunction<byte[]> fa, IntFunction<byte[]> fb,
IntFunction<boolean[]> fm) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, 0);
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
av.lanewise(VectorOperators.OR, b[i], vmask).intoArray(r, i);
}
assertBroadcastArraysEquals(r, a, b, mask, Byte64VectorTests::OR);
}
@Test(dataProvider = "byteBinaryOpProvider")
static void ANDByte64VectorTestsBroadcastSmokeTest(IntFunction<byte[]> fa, IntFunction<byte[]> fb) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
av.lanewise(VectorOperators.AND, b[i]).intoArray(r, i);
}
assertBroadcastArraysEquals(r, a, b, Byte64VectorTests::AND);
}
@Test(dataProvider = "byteBinaryOpProvider")
static void andByte64VectorTestsBroadcastSmokeTest(IntFunction<byte[]> fa, IntFunction<byte[]> fb) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
av.and(b[i]).intoArray(r, i);
}
assertBroadcastArraysEquals(r, a, b, Byte64VectorTests::and);
}
@Test(dataProvider = "byteBinaryOpMaskProvider")
static void ANDByte64VectorTestsBroadcastMaskedSmokeTest(IntFunction<byte[]> fa, IntFunction<byte[]> fb,
IntFunction<boolean[]> fm) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, 0);
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
av.lanewise(VectorOperators.AND, b[i], vmask).intoArray(r, i);
}
assertBroadcastArraysEquals(r, a, b, mask, Byte64VectorTests::AND);
}
@Test(dataProvider = "byteBinaryOpProvider")
static void ORByte64VectorTestsBroadcastLongSmokeTest(IntFunction<byte[]> fa, IntFunction<byte[]> fb) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
av.lanewise(VectorOperators.OR, (long)b[i]).intoArray(r, i);
}
assertBroadcastLongArraysEquals(r, a, b, Byte64VectorTests::OR);
}
@Test(dataProvider = "byteBinaryOpMaskProvider")
static void ORByte64VectorTestsBroadcastMaskedLongSmokeTest(IntFunction<byte[]> fa, IntFunction<byte[]> fb,
IntFunction<boolean[]> fm) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, 0);
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
av.lanewise(VectorOperators.OR, (long)b[i], vmask).intoArray(r, i);
}
assertBroadcastLongArraysEquals(r, a, b, mask, Byte64VectorTests::OR);
}
@Test(dataProvider = "byteBinaryOpProvider")
static void ADDByte64VectorTestsBroadcastLongSmokeTest(IntFunction<byte[]> fa, IntFunction<byte[]> fb) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
av.lanewise(VectorOperators.ADD, (long)b[i]).intoArray(r, i);
}
assertBroadcastLongArraysEquals(r, a, b, Byte64VectorTests::ADD);
}
@Test(dataProvider = "byteBinaryOpMaskProvider")
static void ADDByte64VectorTestsBroadcastMaskedLongSmokeTest(IntFunction<byte[]> fa, IntFunction<byte[]> fb,
IntFunction<boolean[]> fm) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, 0);
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
av.lanewise(VectorOperators.ADD, (long)b[i], vmask).intoArray(r, i);
}
assertBroadcastLongArraysEquals(r, a, b, mask, Byte64VectorTests::ADD);
}
static byte LSHL(byte a, byte b) {
return (byte)((a << (b & 0x7)));
}
@Test(dataProvider = "byteBinaryOpProvider")
static void LSHLByte64VectorTests(IntFunction<byte[]> fa, IntFunction<byte[]> fb) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector bv = ByteVector.fromArray(SPECIES, b, i);
av.lanewise(VectorOperators.LSHL, bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Byte64VectorTests::LSHL);
}
@Test(dataProvider = "byteBinaryOpMaskProvider")
static void LSHLByte64VectorTestsMasked(IntFunction<byte[]> fa, IntFunction<byte[]> fb,
IntFunction<boolean[]> fm) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, 0);
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector bv = ByteVector.fromArray(SPECIES, b, i);
av.lanewise(VectorOperators.LSHL, bv, vmask).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, mask, Byte64VectorTests::LSHL);
}
static byte ASHR(byte a, byte b) {
return (byte)((a >> (b & 0x7)));
}
@Test(dataProvider = "byteBinaryOpProvider")
static void ASHRByte64VectorTests(IntFunction<byte[]> fa, IntFunction<byte[]> fb) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector bv = ByteVector.fromArray(SPECIES, b, i);
av.lanewise(VectorOperators.ASHR, bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Byte64VectorTests::ASHR);
}
@Test(dataProvider = "byteBinaryOpMaskProvider")
static void ASHRByte64VectorTestsMasked(IntFunction<byte[]> fa, IntFunction<byte[]> fb,
IntFunction<boolean[]> fm) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, 0);
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector bv = ByteVector.fromArray(SPECIES, b, i);
av.lanewise(VectorOperators.ASHR, bv, vmask).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, mask, Byte64VectorTests::ASHR);
}
static byte LSHR(byte a, byte b) {
return (byte)(((a & 0xFF) >>> (b & 0x7)));
}
@Test(dataProvider = "byteBinaryOpProvider")
static void LSHRByte64VectorTests(IntFunction<byte[]> fa, IntFunction<byte[]> fb) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector bv = ByteVector.fromArray(SPECIES, b, i);
av.lanewise(VectorOperators.LSHR, bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Byte64VectorTests::LSHR);
}
@Test(dataProvider = "byteBinaryOpMaskProvider")
static void LSHRByte64VectorTestsMasked(IntFunction<byte[]> fa, IntFunction<byte[]> fb,
IntFunction<boolean[]> fm) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, 0);
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector bv = ByteVector.fromArray(SPECIES, b, i);
av.lanewise(VectorOperators.LSHR, bv, vmask).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, mask, Byte64VectorTests::LSHR);
}
static byte LSHL_unary(byte a, byte b) {
return (byte)((a << (b & 7)));
}
@Test(dataProvider = "byteBinaryOpProvider")
static void LSHLByte64VectorTestsScalarShift(IntFunction<byte[]> fa, IntFunction<byte[]> fb) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
av.lanewise(VectorOperators.LSHL, (int)b[i]).intoArray(r, i);
}
}
assertShiftArraysEquals(r, a, b, Byte64VectorTests::LSHL_unary);
}
@Test(dataProvider = "byteBinaryOpMaskProvider")
static void LSHLByte64VectorTestsScalarShiftMasked(IntFunction<byte[]> fa, IntFunction<byte[]> fb,
IntFunction<boolean[]> fm) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, 0);
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
av.lanewise(VectorOperators.LSHL, (int)b[i], vmask).intoArray(r, i);
}
}
assertShiftArraysEquals(r, a, b, mask, Byte64VectorTests::LSHL_unary);
}
static byte LSHR_unary(byte a, byte b) {
return (byte)(((a & 0xFF) >>> (b & 7)));
}
@Test(dataProvider = "byteBinaryOpProvider")
static void LSHRByte64VectorTestsScalarShift(IntFunction<byte[]> fa, IntFunction<byte[]> fb) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
av.lanewise(VectorOperators.LSHR, (int)b[i]).intoArray(r, i);
}
}
assertShiftArraysEquals(r, a, b, Byte64VectorTests::LSHR_unary);
}
@Test(dataProvider = "byteBinaryOpMaskProvider")
static void LSHRByte64VectorTestsScalarShiftMasked(IntFunction<byte[]> fa, IntFunction<byte[]> fb,
IntFunction<boolean[]> fm) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, 0);
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
av.lanewise(VectorOperators.LSHR, (int)b[i], vmask).intoArray(r, i);
}
}
assertShiftArraysEquals(r, a, b, mask, Byte64VectorTests::LSHR_unary);
}
static byte ASHR_unary(byte a, byte b) {
return (byte)((a >> (b & 7)));
}
@Test(dataProvider = "byteBinaryOpProvider")
static void ASHRByte64VectorTestsScalarShift(IntFunction<byte[]> fa, IntFunction<byte[]> fb) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
av.lanewise(VectorOperators.ASHR, (int)b[i]).intoArray(r, i);
}
}
assertShiftArraysEquals(r, a, b, Byte64VectorTests::ASHR_unary);
}
@Test(dataProvider = "byteBinaryOpMaskProvider")
static void ASHRByte64VectorTestsScalarShiftMasked(IntFunction<byte[]> fa, IntFunction<byte[]> fb,
IntFunction<boolean[]> fm) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, 0);
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
av.lanewise(VectorOperators.ASHR, (int)b[i], vmask).intoArray(r, i);
}
}
assertShiftArraysEquals(r, a, b, mask, Byte64VectorTests::ASHR_unary);
}
static byte ROR(byte a, byte b) {
return (byte)(ROR_scalar(a,b));
}
@Test(dataProvider = "byteBinaryOpProvider")
static void RORByte64VectorTests(IntFunction<byte[]> fa, IntFunction<byte[]> fb) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector bv = ByteVector.fromArray(SPECIES, b, i);
av.lanewise(VectorOperators.ROR, bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Byte64VectorTests::ROR);
}
@Test(dataProvider = "byteBinaryOpMaskProvider")
static void RORByte64VectorTestsMasked(IntFunction<byte[]> fa, IntFunction<byte[]> fb,
IntFunction<boolean[]> fm) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, 0);
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector bv = ByteVector.fromArray(SPECIES, b, i);
av.lanewise(VectorOperators.ROR, bv, vmask).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, mask, Byte64VectorTests::ROR);
}
static byte ROL(byte a, byte b) {
return (byte)(ROL_scalar(a,b));
}
@Test(dataProvider = "byteBinaryOpProvider")
static void ROLByte64VectorTests(IntFunction<byte[]> fa, IntFunction<byte[]> fb) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector bv = ByteVector.fromArray(SPECIES, b, i);
av.lanewise(VectorOperators.ROL, bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Byte64VectorTests::ROL);
}
@Test(dataProvider = "byteBinaryOpMaskProvider")
static void ROLByte64VectorTestsMasked(IntFunction<byte[]> fa, IntFunction<byte[]> fb,
IntFunction<boolean[]> fm) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, 0);
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector bv = ByteVector.fromArray(SPECIES, b, i);
av.lanewise(VectorOperators.ROL, bv, vmask).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, mask, Byte64VectorTests::ROL);
}
static byte ROR_unary(byte a, byte b) {
return (byte)(ROR_scalar(a, b));
}
@Test(dataProvider = "byteBinaryOpProvider")
static void RORByte64VectorTestsScalarShift(IntFunction<byte[]> fa, IntFunction<byte[]> fb) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
av.lanewise(VectorOperators.ROR, (int)b[i]).intoArray(r, i);
}
}
assertShiftArraysEquals(r, a, b, Byte64VectorTests::ROR_unary);
}
@Test(dataProvider = "byteBinaryOpMaskProvider")
static void RORByte64VectorTestsScalarShiftMasked(IntFunction<byte[]> fa, IntFunction<byte[]> fb,
IntFunction<boolean[]> fm) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, 0);
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
av.lanewise(VectorOperators.ROR, (int)b[i], vmask).intoArray(r, i);
}
}
assertShiftArraysEquals(r, a, b, mask, Byte64VectorTests::ROR_unary);
}
static byte ROL_unary(byte a, byte b) {
return (byte)(ROL_scalar(a, b));
}
@Test(dataProvider = "byteBinaryOpProvider")
static void ROLByte64VectorTestsScalarShift(IntFunction<byte[]> fa, IntFunction<byte[]> fb) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
av.lanewise(VectorOperators.ROL, (int)b[i]).intoArray(r, i);
}
}
assertShiftArraysEquals(r, a, b, Byte64VectorTests::ROL_unary);
}
@Test(dataProvider = "byteBinaryOpMaskProvider")
static void ROLByte64VectorTestsScalarShiftMasked(IntFunction<byte[]> fa, IntFunction<byte[]> fb,
IntFunction<boolean[]> fm) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, 0);
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
av.lanewise(VectorOperators.ROL, (int)b[i], vmask).intoArray(r, i);
}
}
assertShiftArraysEquals(r, a, b, mask, Byte64VectorTests::ROL_unary);
}
static byte LSHR_binary_const(byte a) {
return (byte)(((a & 0xFF) >>> CONST_SHIFT));
}
@Test(dataProvider = "byteUnaryOpProvider")
static void LSHRByte64VectorTestsScalarShiftConst(IntFunction<byte[]> fa) {
byte[] a = fa.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
av.lanewise(VectorOperators.LSHR, CONST_SHIFT).intoArray(r, i);
}
}
assertShiftConstEquals(r, a, Byte64VectorTests::LSHR_binary_const);
}
@Test(dataProvider = "byteUnaryOpMaskProvider")
static void LSHRByte64VectorTestsScalarShiftMaskedConst(IntFunction<byte[]> fa,
IntFunction<boolean[]> fm) {
byte[] a = fa.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, 0);
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
av.lanewise(VectorOperators.LSHR, CONST_SHIFT, vmask).intoArray(r, i);
}
}
assertShiftConstEquals(r, a, mask, Byte64VectorTests::LSHR_binary_const);
}
static byte LSHL_binary_const(byte a) {
return (byte)((a << CONST_SHIFT));
}
@Test(dataProvider = "byteUnaryOpProvider")
static void LSHLByte64VectorTestsScalarShiftConst(IntFunction<byte[]> fa) {
byte[] a = fa.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
av.lanewise(VectorOperators.LSHL, CONST_SHIFT).intoArray(r, i);
}
}
assertShiftConstEquals(r, a, Byte64VectorTests::LSHL_binary_const);
}
@Test(dataProvider = "byteUnaryOpMaskProvider")
static void LSHLByte64VectorTestsScalarShiftMaskedConst(IntFunction<byte[]> fa,
IntFunction<boolean[]> fm) {
byte[] a = fa.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, 0);
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
av.lanewise(VectorOperators.LSHL, CONST_SHIFT, vmask).intoArray(r, i);
}
}
assertShiftConstEquals(r, a, mask, Byte64VectorTests::LSHL_binary_const);
}
static byte ASHR_binary_const(byte a) {
return (byte)((a >> CONST_SHIFT));
}
@Test(dataProvider = "byteUnaryOpProvider")
static void ASHRByte64VectorTestsScalarShiftConst(IntFunction<byte[]> fa) {
byte[] a = fa.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
av.lanewise(VectorOperators.ASHR, CONST_SHIFT).intoArray(r, i);
}
}
assertShiftConstEquals(r, a, Byte64VectorTests::ASHR_binary_const);
}
@Test(dataProvider = "byteUnaryOpMaskProvider")
static void ASHRByte64VectorTestsScalarShiftMaskedConst(IntFunction<byte[]> fa,
IntFunction<boolean[]> fm) {
byte[] a = fa.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, 0);
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
av.lanewise(VectorOperators.ASHR, CONST_SHIFT, vmask).intoArray(r, i);
}
}
assertShiftConstEquals(r, a, mask, Byte64VectorTests::ASHR_binary_const);
}
static byte ROR_binary_const(byte a) {
return (byte)(ROR_scalar(a, CONST_SHIFT));
}
@Test(dataProvider = "byteUnaryOpProvider")
static void RORByte64VectorTestsScalarShiftConst(IntFunction<byte[]> fa) {
byte[] a = fa.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
av.lanewise(VectorOperators.ROR, CONST_SHIFT).intoArray(r, i);
}
}
assertShiftConstEquals(r, a, Byte64VectorTests::ROR_binary_const);
}
@Test(dataProvider = "byteUnaryOpMaskProvider")
static void RORByte64VectorTestsScalarShiftMaskedConst(IntFunction<byte[]> fa,
IntFunction<boolean[]> fm) {
byte[] a = fa.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, 0);
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
av.lanewise(VectorOperators.ROR, CONST_SHIFT, vmask).intoArray(r, i);
}
}
assertShiftConstEquals(r, a, mask, Byte64VectorTests::ROR_binary_const);
}
static byte ROL_binary_const(byte a) {
return (byte)(ROL_scalar(a, CONST_SHIFT));
}
@Test(dataProvider = "byteUnaryOpProvider")
static void ROLByte64VectorTestsScalarShiftConst(IntFunction<byte[]> fa) {
byte[] a = fa.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
av.lanewise(VectorOperators.ROL, CONST_SHIFT).intoArray(r, i);
}
}
assertShiftConstEquals(r, a, Byte64VectorTests::ROL_binary_const);
}
@Test(dataProvider = "byteUnaryOpMaskProvider")
static void ROLByte64VectorTestsScalarShiftMaskedConst(IntFunction<byte[]> fa,
IntFunction<boolean[]> fm) {
byte[] a = fa.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, 0);
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
av.lanewise(VectorOperators.ROL, CONST_SHIFT, vmask).intoArray(r, i);
}
}
assertShiftConstEquals(r, a, mask, Byte64VectorTests::ROL_binary_const);
}
static byte MIN(byte a, byte b) {
return (byte)(Math.min(a, b));
}
@Test(dataProvider = "byteBinaryOpProvider")
static void MINByte64VectorTests(IntFunction<byte[]> fa, IntFunction<byte[]> fb) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector bv = ByteVector.fromArray(SPECIES, b, i);
av.lanewise(VectorOperators.MIN, bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Byte64VectorTests::MIN);
}
static byte min(byte a, byte b) {
return (byte)(Math.min(a, b));
}
@Test(dataProvider = "byteBinaryOpProvider")
static void minByte64VectorTests(IntFunction<byte[]> fa, IntFunction<byte[]> fb) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector bv = ByteVector.fromArray(SPECIES, b, i);
av.min(bv).intoArray(r, i);
}
assertArraysEquals(r, a, b, Byte64VectorTests::min);
}
static byte MAX(byte a, byte b) {
return (byte)(Math.max(a, b));
}
@Test(dataProvider = "byteBinaryOpProvider")
static void MAXByte64VectorTests(IntFunction<byte[]> fa, IntFunction<byte[]> fb) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector bv = ByteVector.fromArray(SPECIES, b, i);
av.lanewise(VectorOperators.MAX, bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Byte64VectorTests::MAX);
}
static byte max(byte a, byte b) {
return (byte)(Math.max(a, b));
}
@Test(dataProvider = "byteBinaryOpProvider")
static void maxByte64VectorTests(IntFunction<byte[]> fa, IntFunction<byte[]> fb) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector bv = ByteVector.fromArray(SPECIES, b, i);
av.max(bv).intoArray(r, i);
}
assertArraysEquals(r, a, b, Byte64VectorTests::max);
}
static byte UMIN(byte a, byte b) {
return (byte)(VectorMath.minUnsigned(a, b));
}
@Test(dataProvider = "byteBinaryOpProvider")
static void UMINByte64VectorTests(IntFunction<byte[]> fa, IntFunction<byte[]> fb) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector bv = ByteVector.fromArray(SPECIES, b, i);
av.lanewise(VectorOperators.UMIN, bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Byte64VectorTests::UMIN);
}
@Test(dataProvider = "byteBinaryOpMaskProvider")
static void UMINByte64VectorTestsMasked(IntFunction<byte[]> fa, IntFunction<byte[]> fb,
IntFunction<boolean[]> fm) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, 0);
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector bv = ByteVector.fromArray(SPECIES, b, i);
av.lanewise(VectorOperators.UMIN, bv, vmask).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, mask, Byte64VectorTests::UMIN);
}
static byte UMAX(byte a, byte b) {
return (byte)(VectorMath.maxUnsigned(a, b));
}
@Test(dataProvider = "byteBinaryOpProvider")
static void UMAXByte64VectorTests(IntFunction<byte[]> fa, IntFunction<byte[]> fb) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector bv = ByteVector.fromArray(SPECIES, b, i);
av.lanewise(VectorOperators.UMAX, bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Byte64VectorTests::UMAX);
}
@Test(dataProvider = "byteBinaryOpMaskProvider")
static void UMAXByte64VectorTestsMasked(IntFunction<byte[]> fa, IntFunction<byte[]> fb,
IntFunction<boolean[]> fm) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, 0);
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector bv = ByteVector.fromArray(SPECIES, b, i);
av.lanewise(VectorOperators.UMAX, bv, vmask).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, mask, Byte64VectorTests::UMAX);
}
static byte SADD(byte a, byte b) {
return (byte)(VectorMath.addSaturating(a, b));
}
@Test(dataProvider = "byteSaturatingBinaryOpProvider")
static void SADDByte64VectorTests(IntFunction<byte[]> fa, IntFunction<byte[]> fb) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector bv = ByteVector.fromArray(SPECIES, b, i);
av.lanewise(VectorOperators.SADD, bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Byte64VectorTests::SADD);
}
@Test(dataProvider = "byteSaturatingBinaryOpMaskProvider")
static void SADDByte64VectorTestsMasked(IntFunction<byte[]> fa, IntFunction<byte[]> fb,
IntFunction<boolean[]> fm) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, 0);
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector bv = ByteVector.fromArray(SPECIES, b, i);
av.lanewise(VectorOperators.SADD, bv, vmask).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, mask, Byte64VectorTests::SADD);
}
static byte SSUB(byte a, byte b) {
return (byte)(VectorMath.subSaturating(a, b));
}
@Test(dataProvider = "byteSaturatingBinaryOpProvider")
static void SSUBByte64VectorTests(IntFunction<byte[]> fa, IntFunction<byte[]> fb) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector bv = ByteVector.fromArray(SPECIES, b, i);
av.lanewise(VectorOperators.SSUB, bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Byte64VectorTests::SSUB);
}
@Test(dataProvider = "byteSaturatingBinaryOpMaskProvider")
static void SSUBByte64VectorTestsMasked(IntFunction<byte[]> fa, IntFunction<byte[]> fb,
IntFunction<boolean[]> fm) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, 0);
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector bv = ByteVector.fromArray(SPECIES, b, i);
av.lanewise(VectorOperators.SSUB, bv, vmask).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, mask, Byte64VectorTests::SSUB);
}
static byte SUADD(byte a, byte b) {
return (byte)(VectorMath.addSaturatingUnsigned(a, b));
}
@Test(dataProvider = "byteSaturatingBinaryOpProvider")
static void SUADDByte64VectorTests(IntFunction<byte[]> fa, IntFunction<byte[]> fb) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector bv = ByteVector.fromArray(SPECIES, b, i);
av.lanewise(VectorOperators.SUADD, bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Byte64VectorTests::SUADD);
}
@Test(dataProvider = "byteSaturatingBinaryOpMaskProvider")
static void SUADDByte64VectorTestsMasked(IntFunction<byte[]> fa, IntFunction<byte[]> fb,
IntFunction<boolean[]> fm) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, 0);
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector bv = ByteVector.fromArray(SPECIES, b, i);
av.lanewise(VectorOperators.SUADD, bv, vmask).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, mask, Byte64VectorTests::SUADD);
}
static byte SUSUB(byte a, byte b) {
return (byte)(VectorMath.subSaturatingUnsigned(a, b));
}
@Test(dataProvider = "byteSaturatingBinaryOpProvider")
static void SUSUBByte64VectorTests(IntFunction<byte[]> fa, IntFunction<byte[]> fb) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector bv = ByteVector.fromArray(SPECIES, b, i);
av.lanewise(VectorOperators.SUSUB, bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Byte64VectorTests::SUSUB);
}
@Test(dataProvider = "byteSaturatingBinaryOpMaskProvider")
static void SUSUBByte64VectorTestsMasked(IntFunction<byte[]> fa, IntFunction<byte[]> fb,
IntFunction<boolean[]> fm) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, 0);
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector bv = ByteVector.fromArray(SPECIES, b, i);
av.lanewise(VectorOperators.SUSUB, bv, vmask).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, mask, Byte64VectorTests::SUSUB);
}
@Test(dataProvider = "byteBinaryOpProvider")
static void MINByte64VectorTestsBroadcastSmokeTest(IntFunction<byte[]> fa, IntFunction<byte[]> fb) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
av.lanewise(VectorOperators.MIN, b[i]).intoArray(r, i);
}
assertBroadcastArraysEquals(r, a, b, Byte64VectorTests::MIN);
}
@Test(dataProvider = "byteBinaryOpProvider")
static void minByte64VectorTestsBroadcastSmokeTest(IntFunction<byte[]> fa, IntFunction<byte[]> fb) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
av.min(b[i]).intoArray(r, i);
}
assertBroadcastArraysEquals(r, a, b, Byte64VectorTests::min);
}
@Test(dataProvider = "byteBinaryOpProvider")
static void MAXByte64VectorTestsBroadcastSmokeTest(IntFunction<byte[]> fa, IntFunction<byte[]> fb) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
av.lanewise(VectorOperators.MAX, b[i]).intoArray(r, i);
}
assertBroadcastArraysEquals(r, a, b, Byte64VectorTests::MAX);
}
@Test(dataProvider = "byteBinaryOpProvider")
static void maxByte64VectorTestsBroadcastSmokeTest(IntFunction<byte[]> fa, IntFunction<byte[]> fb) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
av.max(b[i]).intoArray(r, i);
}
assertBroadcastArraysEquals(r, a, b, Byte64VectorTests::max);
}
static byte ANDReduce(byte[] a, int idx) {
byte res = -1;
for (int i = idx; i < (idx + SPECIES.length()); i++) {
res &= a[i];
}
return res;
}
static byte ANDReduceAll(byte[] a) {
byte res = -1;
for (int i = 0; i < a.length; i += SPECIES.length()) {
res &= ANDReduce(a, i);
}
return res;
}
@Test(dataProvider = "byteUnaryOpProvider")
static void ANDReduceByte64VectorTests(IntFunction<byte[]> fa) {
byte[] a = fa.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
byte ra = -1;
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
r[i] = av.reduceLanes(VectorOperators.AND);
}
}
for (int ic = 0; ic < INVOC_COUNT; ic++) {
ra = -1;
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ra &= av.reduceLanes(VectorOperators.AND);
}
}
assertReductionArraysEquals(r, ra, a,
Byte64VectorTests::ANDReduce, Byte64VectorTests::ANDReduceAll);
}
static byte ANDReduceMasked(byte[] a, int idx, boolean[] mask) {
byte res = -1;
for (int i = idx; i < (idx + SPECIES.length()); i++) {
if (mask[i % SPECIES.length()])
res &= a[i];
}
return res;
}
static byte ANDReduceAllMasked(byte[] a, boolean[] mask) {
byte res = -1;
for (int i = 0; i < a.length; i += SPECIES.length()) {
res &= ANDReduceMasked(a, i, mask);
}
return res;
}
@Test(dataProvider = "byteUnaryOpMaskProvider")
static void ANDReduceByte64VectorTestsMasked(IntFunction<byte[]> fa, IntFunction<boolean[]> fm) {
byte[] a = fa.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, 0);
byte ra = -1;
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
r[i] = av.reduceLanes(VectorOperators.AND, vmask);
}
}
for (int ic = 0; ic < INVOC_COUNT; ic++) {
ra = -1;
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ra &= av.reduceLanes(VectorOperators.AND, vmask);
}
}
assertReductionArraysEqualsMasked(r, ra, a, mask,
Byte64VectorTests::ANDReduceMasked, Byte64VectorTests::ANDReduceAllMasked);
}
static byte ORReduce(byte[] a, int idx) {
byte res = 0;
for (int i = idx; i < (idx + SPECIES.length()); i++) {
res |= a[i];
}
return res;
}
static byte ORReduceAll(byte[] a) {
byte res = 0;
for (int i = 0; i < a.length; i += SPECIES.length()) {
res |= ORReduce(a, i);
}
return res;
}
@Test(dataProvider = "byteUnaryOpProvider")
static void ORReduceByte64VectorTests(IntFunction<byte[]> fa) {
byte[] a = fa.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
byte ra = 0;
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
r[i] = av.reduceLanes(VectorOperators.OR);
}
}
for (int ic = 0; ic < INVOC_COUNT; ic++) {
ra = 0;
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ra |= av.reduceLanes(VectorOperators.OR);
}
}
assertReductionArraysEquals(r, ra, a,
Byte64VectorTests::ORReduce, Byte64VectorTests::ORReduceAll);
}
static byte ORReduceMasked(byte[] a, int idx, boolean[] mask) {
byte res = 0;
for (int i = idx; i < (idx + SPECIES.length()); i++) {
if (mask[i % SPECIES.length()])
res |= a[i];
}
return res;
}
static byte ORReduceAllMasked(byte[] a, boolean[] mask) {
byte res = 0;
for (int i = 0; i < a.length; i += SPECIES.length()) {
res |= ORReduceMasked(a, i, mask);
}
return res;
}
@Test(dataProvider = "byteUnaryOpMaskProvider")
static void ORReduceByte64VectorTestsMasked(IntFunction<byte[]> fa, IntFunction<boolean[]> fm) {
byte[] a = fa.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, 0);
byte ra = 0;
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
r[i] = av.reduceLanes(VectorOperators.OR, vmask);
}
}
for (int ic = 0; ic < INVOC_COUNT; ic++) {
ra = 0;
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ra |= av.reduceLanes(VectorOperators.OR, vmask);
}
}
assertReductionArraysEqualsMasked(r, ra, a, mask,
Byte64VectorTests::ORReduceMasked, Byte64VectorTests::ORReduceAllMasked);
}
static byte XORReduce(byte[] a, int idx) {
byte res = 0;
for (int i = idx; i < (idx + SPECIES.length()); i++) {
res ^= a[i];
}
return res;
}
static byte XORReduceAll(byte[] a) {
byte res = 0;
for (int i = 0; i < a.length; i += SPECIES.length()) {
res ^= XORReduce(a, i);
}
return res;
}
@Test(dataProvider = "byteUnaryOpProvider")
static void XORReduceByte64VectorTests(IntFunction<byte[]> fa) {
byte[] a = fa.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
byte ra = 0;
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
r[i] = av.reduceLanes(VectorOperators.XOR);
}
}
for (int ic = 0; ic < INVOC_COUNT; ic++) {
ra = 0;
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ra ^= av.reduceLanes(VectorOperators.XOR);
}
}
assertReductionArraysEquals(r, ra, a,
Byte64VectorTests::XORReduce, Byte64VectorTests::XORReduceAll);
}
static byte XORReduceMasked(byte[] a, int idx, boolean[] mask) {
byte res = 0;
for (int i = idx; i < (idx + SPECIES.length()); i++) {
if (mask[i % SPECIES.length()])
res ^= a[i];
}
return res;
}
static byte XORReduceAllMasked(byte[] a, boolean[] mask) {
byte res = 0;
for (int i = 0; i < a.length; i += SPECIES.length()) {
res ^= XORReduceMasked(a, i, mask);
}
return res;
}
@Test(dataProvider = "byteUnaryOpMaskProvider")
static void XORReduceByte64VectorTestsMasked(IntFunction<byte[]> fa, IntFunction<boolean[]> fm) {
byte[] a = fa.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, 0);
byte ra = 0;
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
r[i] = av.reduceLanes(VectorOperators.XOR, vmask);
}
}
for (int ic = 0; ic < INVOC_COUNT; ic++) {
ra = 0;
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ra ^= av.reduceLanes(VectorOperators.XOR, vmask);
}
}
assertReductionArraysEqualsMasked(r, ra, a, mask,
Byte64VectorTests::XORReduceMasked, Byte64VectorTests::XORReduceAllMasked);
}
static byte ADDReduce(byte[] a, int idx) {
byte res = 0;
for (int i = idx; i < (idx + SPECIES.length()); i++) {
res += a[i];
}
return res;
}
static byte ADDReduceAll(byte[] a) {
byte res = 0;
for (int i = 0; i < a.length; i += SPECIES.length()) {
res += ADDReduce(a, i);
}
return res;
}
@Test(dataProvider = "byteUnaryOpProvider")
static void ADDReduceByte64VectorTests(IntFunction<byte[]> fa) {
byte[] a = fa.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
byte ra = 0;
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
r[i] = av.reduceLanes(VectorOperators.ADD);
}
}
for (int ic = 0; ic < INVOC_COUNT; ic++) {
ra = 0;
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ra += av.reduceLanes(VectorOperators.ADD);
}
}
assertReductionArraysEquals(r, ra, a,
Byte64VectorTests::ADDReduce, Byte64VectorTests::ADDReduceAll);
}
static byte ADDReduceMasked(byte[] a, int idx, boolean[] mask) {
byte res = 0;
for (int i = idx; i < (idx + SPECIES.length()); i++) {
if (mask[i % SPECIES.length()])
res += a[i];
}
return res;
}
static byte ADDReduceAllMasked(byte[] a, boolean[] mask) {
byte res = 0;
for (int i = 0; i < a.length; i += SPECIES.length()) {
res += ADDReduceMasked(a, i, mask);
}
return res;
}
@Test(dataProvider = "byteUnaryOpMaskProvider")
static void ADDReduceByte64VectorTestsMasked(IntFunction<byte[]> fa, IntFunction<boolean[]> fm) {
byte[] a = fa.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, 0);
byte ra = 0;
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
r[i] = av.reduceLanes(VectorOperators.ADD, vmask);
}
}
for (int ic = 0; ic < INVOC_COUNT; ic++) {
ra = 0;
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ra += av.reduceLanes(VectorOperators.ADD, vmask);
}
}
assertReductionArraysEqualsMasked(r, ra, a, mask,
Byte64VectorTests::ADDReduceMasked, Byte64VectorTests::ADDReduceAllMasked);
}
static byte MULReduce(byte[] a, int idx) {
byte res = 1;
for (int i = idx; i < (idx + SPECIES.length()); i++) {
res *= a[i];
}
return res;
}
static byte MULReduceAll(byte[] a) {
byte res = 1;
for (int i = 0; i < a.length; i += SPECIES.length()) {
res *= MULReduce(a, i);
}
return res;
}
@Test(dataProvider = "byteUnaryOpProvider")
static void MULReduceByte64VectorTests(IntFunction<byte[]> fa) {
byte[] a = fa.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
byte ra = 1;
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
r[i] = av.reduceLanes(VectorOperators.MUL);
}
}
for (int ic = 0; ic < INVOC_COUNT; ic++) {
ra = 1;
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ra *= av.reduceLanes(VectorOperators.MUL);
}
}
assertReductionArraysEquals(r, ra, a,
Byte64VectorTests::MULReduce, Byte64VectorTests::MULReduceAll);
}
static byte MULReduceMasked(byte[] a, int idx, boolean[] mask) {
byte res = 1;
for (int i = idx; i < (idx + SPECIES.length()); i++) {
if (mask[i % SPECIES.length()])
res *= a[i];
}
return res;
}
static byte MULReduceAllMasked(byte[] a, boolean[] mask) {
byte res = 1;
for (int i = 0; i < a.length; i += SPECIES.length()) {
res *= MULReduceMasked(a, i, mask);
}
return res;
}
@Test(dataProvider = "byteUnaryOpMaskProvider")
static void MULReduceByte64VectorTestsMasked(IntFunction<byte[]> fa, IntFunction<boolean[]> fm) {
byte[] a = fa.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, 0);
byte ra = 1;
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
r[i] = av.reduceLanes(VectorOperators.MUL, vmask);
}
}
for (int ic = 0; ic < INVOC_COUNT; ic++) {
ra = 1;
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ra *= av.reduceLanes(VectorOperators.MUL, vmask);
}
}
assertReductionArraysEqualsMasked(r, ra, a, mask,
Byte64VectorTests::MULReduceMasked, Byte64VectorTests::MULReduceAllMasked);
}
static byte MINReduce(byte[] a, int idx) {
byte res = Byte.MAX_VALUE;
for (int i = idx; i < (idx + SPECIES.length()); i++) {
res = (byte) Math.min(res, a[i]);
}
return res;
}
static byte MINReduceAll(byte[] a) {
byte res = Byte.MAX_VALUE;
for (int i = 0; i < a.length; i += SPECIES.length()) {
res = (byte) Math.min(res, MINReduce(a, i));
}
return res;
}
@Test(dataProvider = "byteUnaryOpProvider")
static void MINReduceByte64VectorTests(IntFunction<byte[]> fa) {
byte[] a = fa.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
byte ra = Byte.MAX_VALUE;
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
r[i] = av.reduceLanes(VectorOperators.MIN);
}
}
for (int ic = 0; ic < INVOC_COUNT; ic++) {
ra = Byte.MAX_VALUE;
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ra = (byte) Math.min(ra, av.reduceLanes(VectorOperators.MIN));
}
}
assertReductionArraysEquals(r, ra, a,
Byte64VectorTests::MINReduce, Byte64VectorTests::MINReduceAll);
}
static byte MINReduceMasked(byte[] a, int idx, boolean[] mask) {
byte res = Byte.MAX_VALUE;
for (int i = idx; i < (idx + SPECIES.length()); i++) {
if (mask[i % SPECIES.length()])
res = (byte) Math.min(res, a[i]);
}
return res;
}
static byte MINReduceAllMasked(byte[] a, boolean[] mask) {
byte res = Byte.MAX_VALUE;
for (int i = 0; i < a.length; i += SPECIES.length()) {
res = (byte) Math.min(res, MINReduceMasked(a, i, mask));
}
return res;
}
@Test(dataProvider = "byteUnaryOpMaskProvider")
static void MINReduceByte64VectorTestsMasked(IntFunction<byte[]> fa, IntFunction<boolean[]> fm) {
byte[] a = fa.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, 0);
byte ra = Byte.MAX_VALUE;
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
r[i] = av.reduceLanes(VectorOperators.MIN, vmask);
}
}
for (int ic = 0; ic < INVOC_COUNT; ic++) {
ra = Byte.MAX_VALUE;
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ra = (byte) Math.min(ra, av.reduceLanes(VectorOperators.MIN, vmask));
}
}
assertReductionArraysEqualsMasked(r, ra, a, mask,
Byte64VectorTests::MINReduceMasked, Byte64VectorTests::MINReduceAllMasked);
}
static byte MAXReduce(byte[] a, int idx) {
byte res = Byte.MIN_VALUE;
for (int i = idx; i < (idx + SPECIES.length()); i++) {
res = (byte) Math.max(res, a[i]);
}
return res;
}
static byte MAXReduceAll(byte[] a) {
byte res = Byte.MIN_VALUE;
for (int i = 0; i < a.length; i += SPECIES.length()) {
res = (byte) Math.max(res, MAXReduce(a, i));
}
return res;
}
@Test(dataProvider = "byteUnaryOpProvider")
static void MAXReduceByte64VectorTests(IntFunction<byte[]> fa) {
byte[] a = fa.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
byte ra = Byte.MIN_VALUE;
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
r[i] = av.reduceLanes(VectorOperators.MAX);
}
}
for (int ic = 0; ic < INVOC_COUNT; ic++) {
ra = Byte.MIN_VALUE;
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ra = (byte) Math.max(ra, av.reduceLanes(VectorOperators.MAX));
}
}
assertReductionArraysEquals(r, ra, a,
Byte64VectorTests::MAXReduce, Byte64VectorTests::MAXReduceAll);
}
static byte MAXReduceMasked(byte[] a, int idx, boolean[] mask) {
byte res = Byte.MIN_VALUE;
for (int i = idx; i < (idx + SPECIES.length()); i++) {
if (mask[i % SPECIES.length()])
res = (byte) Math.max(res, a[i]);
}
return res;
}
static byte MAXReduceAllMasked(byte[] a, boolean[] mask) {
byte res = Byte.MIN_VALUE;
for (int i = 0; i < a.length; i += SPECIES.length()) {
res = (byte) Math.max(res, MAXReduceMasked(a, i, mask));
}
return res;
}
@Test(dataProvider = "byteUnaryOpMaskProvider")
static void MAXReduceByte64VectorTestsMasked(IntFunction<byte[]> fa, IntFunction<boolean[]> fm) {
byte[] a = fa.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, 0);
byte ra = Byte.MIN_VALUE;
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
r[i] = av.reduceLanes(VectorOperators.MAX, vmask);
}
}
for (int ic = 0; ic < INVOC_COUNT; ic++) {
ra = Byte.MIN_VALUE;
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ra = (byte) Math.max(ra, av.reduceLanes(VectorOperators.MAX, vmask));
}
}
assertReductionArraysEqualsMasked(r, ra, a, mask,
Byte64VectorTests::MAXReduceMasked, Byte64VectorTests::MAXReduceAllMasked);
}
static byte FIRST_NONZEROReduce(byte[] a, int idx) {
byte res = (byte) 0;
for (int i = idx; i < (idx + SPECIES.length()); i++) {
res = firstNonZero(res, a[i]);
}
return res;
}
static byte FIRST_NONZEROReduceAll(byte[] a) {
byte res = (byte) 0;
for (int i = 0; i < a.length; i += SPECIES.length()) {
res = firstNonZero(res, FIRST_NONZEROReduce(a, i));
}
return res;
}
@Test(dataProvider = "byteUnaryOpProvider")
static void FIRST_NONZEROReduceByte64VectorTests(IntFunction<byte[]> fa) {
byte[] a = fa.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
byte ra = (byte) 0;
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
r[i] = av.reduceLanes(VectorOperators.FIRST_NONZERO);
}
}
for (int ic = 0; ic < INVOC_COUNT; ic++) {
ra = (byte) 0;
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ra = firstNonZero(ra, av.reduceLanes(VectorOperators.FIRST_NONZERO));
}
}
assertReductionArraysEquals(r, ra, a,
Byte64VectorTests::FIRST_NONZEROReduce, Byte64VectorTests::FIRST_NONZEROReduceAll);
}
static byte FIRST_NONZEROReduceMasked(byte[] a, int idx, boolean[] mask) {
byte res = (byte) 0;
for (int i = idx; i < (idx + SPECIES.length()); i++) {
if (mask[i % SPECIES.length()])
res = firstNonZero(res, a[i]);
}
return res;
}
static byte FIRST_NONZEROReduceAllMasked(byte[] a, boolean[] mask) {
byte res = (byte) 0;
for (int i = 0; i < a.length; i += SPECIES.length()) {
res = firstNonZero(res, FIRST_NONZEROReduceMasked(a, i, mask));
}
return res;
}
@Test(dataProvider = "byteUnaryOpMaskProvider")
static void FIRST_NONZEROReduceByte64VectorTestsMasked(IntFunction<byte[]> fa, IntFunction<boolean[]> fm) {
byte[] a = fa.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, 0);
byte ra = (byte) 0;
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
r[i] = av.reduceLanes(VectorOperators.FIRST_NONZERO, vmask);
}
}
for (int ic = 0; ic < INVOC_COUNT; ic++) {
ra = (byte) 0;
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ra = firstNonZero(ra, av.reduceLanes(VectorOperators.FIRST_NONZERO, vmask));
}
}
assertReductionArraysEqualsMasked(r, ra, a, mask,
Byte64VectorTests::FIRST_NONZEROReduceMasked, Byte64VectorTests::FIRST_NONZEROReduceAllMasked);
}
static boolean anyTrue(boolean[] a, int idx) {
boolean res = false;
for (int i = idx; i < (idx + SPECIES.length()); i++) {
res |= a[i];
}
return res;
}
@Test(dataProvider = "boolUnaryOpProvider")
static void anyTrueByte64VectorTests(IntFunction<boolean[]> fm) {
boolean[] mask = fm.apply(SPECIES.length());
boolean[] r = fmr.apply(SPECIES.length());
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < mask.length; i += SPECIES.length()) {
VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, i);
r[i] = vmask.anyTrue();
}
}
assertReductionBoolArraysEquals(r, mask, Byte64VectorTests::anyTrue);
}
static boolean allTrue(boolean[] a, int idx) {
boolean res = true;
for (int i = idx; i < (idx + SPECIES.length()); i++) {
res &= a[i];
}
return res;
}
@Test(dataProvider = "boolUnaryOpProvider")
static void allTrueByte64VectorTests(IntFunction<boolean[]> fm) {
boolean[] mask = fm.apply(SPECIES.length());
boolean[] r = fmr.apply(SPECIES.length());
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < mask.length; i += SPECIES.length()) {
VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, i);
r[i] = vmask.allTrue();
}
}
assertReductionBoolArraysEquals(r, mask, Byte64VectorTests::allTrue);
}
@Test(dataProvider = "byteBinaryOpProvider")
static void withByte64VectorTests(IntFunction<byte []> fa, IntFunction<byte []> fb) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0, j = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
av.withLane(j, b[i + j]).intoArray(r, i);
a[i + j] = b[i + j];
j = (j + 1) & (SPECIES.length() - 1);
}
}
assertArraysStrictlyEquals(r, a);
}
static boolean testIS_DEFAULT(byte a) {
return bits(a)==0;
}
@Test(dataProvider = "byteTestOpProvider")
static void IS_DEFAULTByte64VectorTests(IntFunction<byte[]> fa) {
byte[] a = fa.apply(SPECIES.length());
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
VectorMask<Byte> mv = av.test(VectorOperators.IS_DEFAULT);
// Check results as part of computation.
for (int j = 0; j < SPECIES.length(); j++) {
Assert.assertEquals(mv.laneIsSet(j), testIS_DEFAULT(a[i + j]));
}
}
}
}
@Test(dataProvider = "byteTestOpMaskProvider")
static void IS_DEFAULTMaskedByte64VectorTests(IntFunction<byte[]> fa,
IntFunction<boolean[]> fm) {
byte[] a = fa.apply(SPECIES.length());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, 0);
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
VectorMask<Byte> mv = av.test(VectorOperators.IS_DEFAULT, vmask);
// Check results as part of computation.
for (int j = 0; j < SPECIES.length(); j++) {
Assert.assertEquals(mv.laneIsSet(j), vmask.laneIsSet(j) && testIS_DEFAULT(a[i + j]));
}
}
}
}
static boolean testIS_NEGATIVE(byte a) {
return bits(a)<0;
}
@Test(dataProvider = "byteTestOpProvider")
static void IS_NEGATIVEByte64VectorTests(IntFunction<byte[]> fa) {
byte[] a = fa.apply(SPECIES.length());
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
VectorMask<Byte> mv = av.test(VectorOperators.IS_NEGATIVE);
// Check results as part of computation.
for (int j = 0; j < SPECIES.length(); j++) {
Assert.assertEquals(mv.laneIsSet(j), testIS_NEGATIVE(a[i + j]));
}
}
}
}
@Test(dataProvider = "byteTestOpMaskProvider")
static void IS_NEGATIVEMaskedByte64VectorTests(IntFunction<byte[]> fa,
IntFunction<boolean[]> fm) {
byte[] a = fa.apply(SPECIES.length());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, 0);
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
VectorMask<Byte> mv = av.test(VectorOperators.IS_NEGATIVE, vmask);
// Check results as part of computation.
for (int j = 0; j < SPECIES.length(); j++) {
Assert.assertEquals(mv.laneIsSet(j), vmask.laneIsSet(j) && testIS_NEGATIVE(a[i + j]));
}
}
}
}
@Test(dataProvider = "byteCompareOpProvider")
static void LTByte64VectorTests(IntFunction<byte[]> fa, IntFunction<byte[]> fb) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector bv = ByteVector.fromArray(SPECIES, b, i);
VectorMask<Byte> mv = av.compare(VectorOperators.LT, bv);
// Check results as part of computation.
for (int j = 0; j < SPECIES.length(); j++) {
Assert.assertEquals(mv.laneIsSet(j), lt(a[i + j], b[i + j]));
}
}
}
}
@Test(dataProvider = "byteCompareOpProvider")
static void ltByte64VectorTests(IntFunction<byte[]> fa, IntFunction<byte[]> fb) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector bv = ByteVector.fromArray(SPECIES, b, i);
VectorMask<Byte> mv = av.lt(bv);
// Check results as part of computation.
for (int j = 0; j < SPECIES.length(); j++) {
Assert.assertEquals(mv.laneIsSet(j), lt(a[i + j], b[i + j]));
}
}
}
}
@Test(dataProvider = "byteCompareOpMaskProvider")
static void LTByte64VectorTestsMasked(IntFunction<byte[]> fa, IntFunction<byte[]> fb,
IntFunction<boolean[]> fm) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, 0);
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector bv = ByteVector.fromArray(SPECIES, b, i);
VectorMask<Byte> mv = av.compare(VectorOperators.LT, bv, vmask);
// Check results as part of computation.
for (int j = 0; j < SPECIES.length(); j++) {
Assert.assertEquals(mv.laneIsSet(j), mask[j] && lt(a[i + j], b[i + j]));
}
}
}
}
@Test(dataProvider = "byteCompareOpProvider")
static void GTByte64VectorTests(IntFunction<byte[]> fa, IntFunction<byte[]> fb) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector bv = ByteVector.fromArray(SPECIES, b, i);
VectorMask<Byte> mv = av.compare(VectorOperators.GT, bv);
// Check results as part of computation.
for (int j = 0; j < SPECIES.length(); j++) {
Assert.assertEquals(mv.laneIsSet(j), gt(a[i + j], b[i + j]));
}
}
}
}
@Test(dataProvider = "byteCompareOpMaskProvider")
static void GTByte64VectorTestsMasked(IntFunction<byte[]> fa, IntFunction<byte[]> fb,
IntFunction<boolean[]> fm) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, 0);
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector bv = ByteVector.fromArray(SPECIES, b, i);
VectorMask<Byte> mv = av.compare(VectorOperators.GT, bv, vmask);
// Check results as part of computation.
for (int j = 0; j < SPECIES.length(); j++) {
Assert.assertEquals(mv.laneIsSet(j), mask[j] && gt(a[i + j], b[i + j]));
}
}
}
}
@Test(dataProvider = "byteCompareOpProvider")
static void EQByte64VectorTests(IntFunction<byte[]> fa, IntFunction<byte[]> fb) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector bv = ByteVector.fromArray(SPECIES, b, i);
VectorMask<Byte> mv = av.compare(VectorOperators.EQ, bv);
// Check results as part of computation.
for (int j = 0; j < SPECIES.length(); j++) {
Assert.assertEquals(mv.laneIsSet(j), eq(a[i + j], b[i + j]));
}
}
}
}
@Test(dataProvider = "byteCompareOpProvider")
static void eqByte64VectorTests(IntFunction<byte[]> fa, IntFunction<byte[]> fb) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector bv = ByteVector.fromArray(SPECIES, b, i);
VectorMask<Byte> mv = av.eq(bv);
// Check results as part of computation.
for (int j = 0; j < SPECIES.length(); j++) {
Assert.assertEquals(mv.laneIsSet(j), eq(a[i + j], b[i + j]));
}
}
}
}
@Test(dataProvider = "byteCompareOpMaskProvider")
static void EQByte64VectorTestsMasked(IntFunction<byte[]> fa, IntFunction<byte[]> fb,
IntFunction<boolean[]> fm) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, 0);
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector bv = ByteVector.fromArray(SPECIES, b, i);
VectorMask<Byte> mv = av.compare(VectorOperators.EQ, bv, vmask);
// Check results as part of computation.
for (int j = 0; j < SPECIES.length(); j++) {
Assert.assertEquals(mv.laneIsSet(j), mask[j] && eq(a[i + j], b[i + j]));
}
}
}
}
@Test(dataProvider = "byteCompareOpProvider")
static void NEByte64VectorTests(IntFunction<byte[]> fa, IntFunction<byte[]> fb) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector bv = ByteVector.fromArray(SPECIES, b, i);
VectorMask<Byte> mv = av.compare(VectorOperators.NE, bv);
// Check results as part of computation.
for (int j = 0; j < SPECIES.length(); j++) {
Assert.assertEquals(mv.laneIsSet(j), neq(a[i + j], b[i + j]));
}
}
}
}
@Test(dataProvider = "byteCompareOpMaskProvider")
static void NEByte64VectorTestsMasked(IntFunction<byte[]> fa, IntFunction<byte[]> fb,
IntFunction<boolean[]> fm) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, 0);
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector bv = ByteVector.fromArray(SPECIES, b, i);
VectorMask<Byte> mv = av.compare(VectorOperators.NE, bv, vmask);
// Check results as part of computation.
for (int j = 0; j < SPECIES.length(); j++) {
Assert.assertEquals(mv.laneIsSet(j), mask[j] && neq(a[i + j], b[i + j]));
}
}
}
}
@Test(dataProvider = "byteCompareOpProvider")
static void LEByte64VectorTests(IntFunction<byte[]> fa, IntFunction<byte[]> fb) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector bv = ByteVector.fromArray(SPECIES, b, i);
VectorMask<Byte> mv = av.compare(VectorOperators.LE, bv);
// Check results as part of computation.
for (int j = 0; j < SPECIES.length(); j++) {
Assert.assertEquals(mv.laneIsSet(j), le(a[i + j], b[i + j]));
}
}
}
}
@Test(dataProvider = "byteCompareOpMaskProvider")
static void LEByte64VectorTestsMasked(IntFunction<byte[]> fa, IntFunction<byte[]> fb,
IntFunction<boolean[]> fm) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, 0);
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector bv = ByteVector.fromArray(SPECIES, b, i);
VectorMask<Byte> mv = av.compare(VectorOperators.LE, bv, vmask);
// Check results as part of computation.
for (int j = 0; j < SPECIES.length(); j++) {
Assert.assertEquals(mv.laneIsSet(j), mask[j] && le(a[i + j], b[i + j]));
}
}
}
}
@Test(dataProvider = "byteCompareOpProvider")
static void GEByte64VectorTests(IntFunction<byte[]> fa, IntFunction<byte[]> fb) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector bv = ByteVector.fromArray(SPECIES, b, i);
VectorMask<Byte> mv = av.compare(VectorOperators.GE, bv);
// Check results as part of computation.
for (int j = 0; j < SPECIES.length(); j++) {
Assert.assertEquals(mv.laneIsSet(j), ge(a[i + j], b[i + j]));
}
}
}
}
@Test(dataProvider = "byteCompareOpMaskProvider")
static void GEByte64VectorTestsMasked(IntFunction<byte[]> fa, IntFunction<byte[]> fb,
IntFunction<boolean[]> fm) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, 0);
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector bv = ByteVector.fromArray(SPECIES, b, i);
VectorMask<Byte> mv = av.compare(VectorOperators.GE, bv, vmask);
// Check results as part of computation.
for (int j = 0; j < SPECIES.length(); j++) {
Assert.assertEquals(mv.laneIsSet(j), mask[j] && ge(a[i + j], b[i + j]));
}
}
}
}
@Test(dataProvider = "byteCompareOpProvider")
static void ULTByte64VectorTests(IntFunction<byte[]> fa, IntFunction<byte[]> fb) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector bv = ByteVector.fromArray(SPECIES, b, i);
VectorMask<Byte> mv = av.compare(VectorOperators.ULT, bv);
// Check results as part of computation.
for (int j = 0; j < SPECIES.length(); j++) {
Assert.assertEquals(mv.laneIsSet(j), ult(a[i + j], b[i + j]));
}
}
}
}
@Test(dataProvider = "byteCompareOpMaskProvider")
static void ULTByte64VectorTestsMasked(IntFunction<byte[]> fa, IntFunction<byte[]> fb,
IntFunction<boolean[]> fm) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, 0);
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector bv = ByteVector.fromArray(SPECIES, b, i);
VectorMask<Byte> mv = av.compare(VectorOperators.ULT, bv, vmask);
// Check results as part of computation.
for (int j = 0; j < SPECIES.length(); j++) {
Assert.assertEquals(mv.laneIsSet(j), mask[j] && ult(a[i + j], b[i + j]));
}
}
}
}
@Test(dataProvider = "byteCompareOpProvider")
static void UGTByte64VectorTests(IntFunction<byte[]> fa, IntFunction<byte[]> fb) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector bv = ByteVector.fromArray(SPECIES, b, i);
VectorMask<Byte> mv = av.compare(VectorOperators.UGT, bv);
// Check results as part of computation.
for (int j = 0; j < SPECIES.length(); j++) {
Assert.assertEquals(mv.laneIsSet(j), ugt(a[i + j], b[i + j]));
}
}
}
}
@Test(dataProvider = "byteCompareOpMaskProvider")
static void UGTByte64VectorTestsMasked(IntFunction<byte[]> fa, IntFunction<byte[]> fb,
IntFunction<boolean[]> fm) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, 0);
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector bv = ByteVector.fromArray(SPECIES, b, i);
VectorMask<Byte> mv = av.compare(VectorOperators.UGT, bv, vmask);
// Check results as part of computation.
for (int j = 0; j < SPECIES.length(); j++) {
Assert.assertEquals(mv.laneIsSet(j), mask[j] && ugt(a[i + j], b[i + j]));
}
}
}
}
@Test(dataProvider = "byteCompareOpProvider")
static void ULEByte64VectorTests(IntFunction<byte[]> fa, IntFunction<byte[]> fb) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector bv = ByteVector.fromArray(SPECIES, b, i);
VectorMask<Byte> mv = av.compare(VectorOperators.ULE, bv);
// Check results as part of computation.
for (int j = 0; j < SPECIES.length(); j++) {
Assert.assertEquals(mv.laneIsSet(j), ule(a[i + j], b[i + j]));
}
}
}
}
@Test(dataProvider = "byteCompareOpMaskProvider")
static void ULEByte64VectorTestsMasked(IntFunction<byte[]> fa, IntFunction<byte[]> fb,
IntFunction<boolean[]> fm) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, 0);
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector bv = ByteVector.fromArray(SPECIES, b, i);
VectorMask<Byte> mv = av.compare(VectorOperators.ULE, bv, vmask);
// Check results as part of computation.
for (int j = 0; j < SPECIES.length(); j++) {
Assert.assertEquals(mv.laneIsSet(j), mask[j] && ule(a[i + j], b[i + j]));
}
}
}
}
@Test(dataProvider = "byteCompareOpProvider")
static void UGEByte64VectorTests(IntFunction<byte[]> fa, IntFunction<byte[]> fb) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector bv = ByteVector.fromArray(SPECIES, b, i);
VectorMask<Byte> mv = av.compare(VectorOperators.UGE, bv);
// Check results as part of computation.
for (int j = 0; j < SPECIES.length(); j++) {
Assert.assertEquals(mv.laneIsSet(j), uge(a[i + j], b[i + j]));
}
}
}
}
@Test(dataProvider = "byteCompareOpMaskProvider")
static void UGEByte64VectorTestsMasked(IntFunction<byte[]> fa, IntFunction<byte[]> fb,
IntFunction<boolean[]> fm) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, 0);
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector bv = ByteVector.fromArray(SPECIES, b, i);
VectorMask<Byte> mv = av.compare(VectorOperators.UGE, bv, vmask);
// Check results as part of computation.
for (int j = 0; j < SPECIES.length(); j++) {
Assert.assertEquals(mv.laneIsSet(j), mask[j] && uge(a[i + j], b[i + j]));
}
}
}
}
@Test(dataProvider = "byteCompareOpProvider")
static void LTByte64VectorTestsBroadcastSmokeTest(IntFunction<byte[]> fa, IntFunction<byte[]> fb) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
VectorMask<Byte> mv = av.compare(VectorOperators.LT, b[i]);
// Check results as part of computation.
for (int j = 0; j < SPECIES.length(); j++) {
Assert.assertEquals(mv.laneIsSet(j), a[i + j] < b[i]);
}
}
}
@Test(dataProvider = "byteCompareOpMaskProvider")
static void LTByte64VectorTestsBroadcastMaskedSmokeTest(IntFunction<byte[]> fa,
IntFunction<byte[]> fb, IntFunction<boolean[]> fm) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, 0);
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
VectorMask<Byte> mv = av.compare(VectorOperators.LT, b[i], vmask);
// Check results as part of computation.
for (int j = 0; j < SPECIES.length(); j++) {
Assert.assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] < b[i]));
}
}
}
@Test(dataProvider = "byteCompareOpProvider")
static void LTByte64VectorTestsBroadcastLongSmokeTest(IntFunction<byte[]> fa, IntFunction<byte[]> fb) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
VectorMask<Byte> mv = av.compare(VectorOperators.LT, (long)b[i]);
// Check results as part of computation.
for (int j = 0; j < SPECIES.length(); j++) {
Assert.assertEquals(mv.laneIsSet(j), a[i + j] < (byte)((long)b[i]));
}
}
}
@Test(dataProvider = "byteCompareOpMaskProvider")
static void LTByte64VectorTestsBroadcastLongMaskedSmokeTest(IntFunction<byte[]> fa,
IntFunction<byte[]> fb, IntFunction<boolean[]> fm) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, 0);
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
VectorMask<Byte> mv = av.compare(VectorOperators.LT, (long)b[i], vmask);
// Check results as part of computation.
for (int j = 0; j < SPECIES.length(); j++) {
Assert.assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] < (byte)((long)b[i])));
}
}
}
@Test(dataProvider = "byteCompareOpProvider")
static void EQByte64VectorTestsBroadcastSmokeTest(IntFunction<byte[]> fa, IntFunction<byte[]> fb) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
VectorMask<Byte> mv = av.compare(VectorOperators.EQ, b[i]);
// Check results as part of computation.
for (int j = 0; j < SPECIES.length(); j++) {
Assert.assertEquals(mv.laneIsSet(j), a[i + j] == b[i]);
}
}
}
@Test(dataProvider = "byteCompareOpMaskProvider")
static void EQByte64VectorTestsBroadcastMaskedSmokeTest(IntFunction<byte[]> fa,
IntFunction<byte[]> fb, IntFunction<boolean[]> fm) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, 0);
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
VectorMask<Byte> mv = av.compare(VectorOperators.EQ, b[i], vmask);
// Check results as part of computation.
for (int j = 0; j < SPECIES.length(); j++) {
Assert.assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] == b[i]));
}
}
}
@Test(dataProvider = "byteCompareOpProvider")
static void EQByte64VectorTestsBroadcastLongSmokeTest(IntFunction<byte[]> fa, IntFunction<byte[]> fb) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
VectorMask<Byte> mv = av.compare(VectorOperators.EQ, (long)b[i]);
// Check results as part of computation.
for (int j = 0; j < SPECIES.length(); j++) {
Assert.assertEquals(mv.laneIsSet(j), a[i + j] == (byte)((long)b[i]));
}
}
}
@Test(dataProvider = "byteCompareOpMaskProvider")
static void EQByte64VectorTestsBroadcastLongMaskedSmokeTest(IntFunction<byte[]> fa,
IntFunction<byte[]> fb, IntFunction<boolean[]> fm) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, 0);
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
VectorMask<Byte> mv = av.compare(VectorOperators.EQ, (long)b[i], vmask);
// Check results as part of computation.
for (int j = 0; j < SPECIES.length(); j++) {
Assert.assertEquals(mv.laneIsSet(j), mask[j] && (a[i + j] == (byte)((long)b[i])));
}
}
}
static byte blend(byte a, byte b, boolean mask) {
return mask ? b : a;
}
@Test(dataProvider = "byteBinaryOpMaskProvider")
static void blendByte64VectorTests(IntFunction<byte[]> fa, IntFunction<byte[]> fb,
IntFunction<boolean[]> fm) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, 0);
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector bv = ByteVector.fromArray(SPECIES, b, i);
av.blend(bv, vmask).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, mask, Byte64VectorTests::blend);
}
@Test(dataProvider = "byteUnaryOpShuffleProvider")
static void RearrangeByte64VectorTests(IntFunction<byte[]> fa,
BiFunction<Integer,Integer,int[]> fs) {
byte[] a = fa.apply(SPECIES.length());
int[] order = fs.apply(a.length, SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
av.rearrange(VectorShuffle.fromArray(SPECIES, order, i)).intoArray(r, i);
}
}
assertRearrangeArraysEquals(r, a, order, SPECIES.length());
}
@Test(dataProvider = "byteUnaryOpShuffleMaskProvider")
static void RearrangeByte64VectorTestsMaskedSmokeTest(IntFunction<byte[]> fa,
BiFunction<Integer,Integer,int[]> fs,
IntFunction<boolean[]> fm) {
byte[] a = fa.apply(SPECIES.length());
int[] order = fs.apply(a.length, SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, 0);
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
av.rearrange(VectorShuffle.fromArray(SPECIES, order, i), vmask).intoArray(r, i);
}
assertRearrangeArraysEquals(r, a, order, mask, SPECIES.length());
}
@Test(dataProvider = "byteUnaryOpMaskProvider")
static void compressByte64VectorTests(IntFunction<byte[]> fa,
IntFunction<boolean[]> fm) {
byte[] a = fa.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, 0);
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
av.compress(vmask).intoArray(r, i);
}
}
assertcompressArraysEquals(r, a, mask, SPECIES.length());
}
@Test(dataProvider = "byteUnaryOpMaskProvider")
static void expandByte64VectorTests(IntFunction<byte[]> fa,
IntFunction<boolean[]> fm) {
byte[] a = fa.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, 0);
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
av.expand(vmask).intoArray(r, i);
}
}
assertexpandArraysEquals(r, a, mask, SPECIES.length());
}
@Test(dataProvider = "byteUnaryOpProvider")
static void getByte64VectorTests(IntFunction<byte[]> fa) {
byte[] a = fa.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
int num_lanes = SPECIES.length();
// Manually unroll because full unroll happens after intrinsification.
// Unroll is needed because get intrinsic requires for index to be a known constant.
if (num_lanes == 1) {
r[i]=av.lane(0);
} else if (num_lanes == 2) {
r[i]=av.lane(0);
r[i+1]=av.lane(1);
} else if (num_lanes == 4) {
r[i]=av.lane(0);
r[i+1]=av.lane(1);
r[i+2]=av.lane(2);
r[i+3]=av.lane(3);
} else if (num_lanes == 8) {
r[i]=av.lane(0);
r[i+1]=av.lane(1);
r[i+2]=av.lane(2);
r[i+3]=av.lane(3);
r[i+4]=av.lane(4);
r[i+5]=av.lane(5);
r[i+6]=av.lane(6);
r[i+7]=av.lane(7);
} else if (num_lanes == 16) {
r[i]=av.lane(0);
r[i+1]=av.lane(1);
r[i+2]=av.lane(2);
r[i+3]=av.lane(3);
r[i+4]=av.lane(4);
r[i+5]=av.lane(5);
r[i+6]=av.lane(6);
r[i+7]=av.lane(7);
r[i+8]=av.lane(8);
r[i+9]=av.lane(9);
r[i+10]=av.lane(10);
r[i+11]=av.lane(11);
r[i+12]=av.lane(12);
r[i+13]=av.lane(13);
r[i+14]=av.lane(14);
r[i+15]=av.lane(15);
} else if (num_lanes == 32) {
r[i]=av.lane(0);
r[i+1]=av.lane(1);
r[i+2]=av.lane(2);
r[i+3]=av.lane(3);
r[i+4]=av.lane(4);
r[i+5]=av.lane(5);
r[i+6]=av.lane(6);
r[i+7]=av.lane(7);
r[i+8]=av.lane(8);
r[i+9]=av.lane(9);
r[i+10]=av.lane(10);
r[i+11]=av.lane(11);
r[i+12]=av.lane(12);
r[i+13]=av.lane(13);
r[i+14]=av.lane(14);
r[i+15]=av.lane(15);
r[i+16]=av.lane(16);
r[i+17]=av.lane(17);
r[i+18]=av.lane(18);
r[i+19]=av.lane(19);
r[i+20]=av.lane(20);
r[i+21]=av.lane(21);
r[i+22]=av.lane(22);
r[i+23]=av.lane(23);
r[i+24]=av.lane(24);
r[i+25]=av.lane(25);
r[i+26]=av.lane(26);
r[i+27]=av.lane(27);
r[i+28]=av.lane(28);
r[i+29]=av.lane(29);
r[i+30]=av.lane(30);
r[i+31]=av.lane(31);
} else if (num_lanes == 64) {
r[i]=av.lane(0);
r[i+1]=av.lane(1);
r[i+2]=av.lane(2);
r[i+3]=av.lane(3);
r[i+4]=av.lane(4);
r[i+5]=av.lane(5);
r[i+6]=av.lane(6);
r[i+7]=av.lane(7);
r[i+8]=av.lane(8);
r[i+9]=av.lane(9);
r[i+10]=av.lane(10);
r[i+11]=av.lane(11);
r[i+12]=av.lane(12);
r[i+13]=av.lane(13);
r[i+14]=av.lane(14);
r[i+15]=av.lane(15);
r[i+16]=av.lane(16);
r[i+17]=av.lane(17);
r[i+18]=av.lane(18);
r[i+19]=av.lane(19);
r[i+20]=av.lane(20);
r[i+21]=av.lane(21);
r[i+22]=av.lane(22);
r[i+23]=av.lane(23);
r[i+24]=av.lane(24);
r[i+25]=av.lane(25);
r[i+26]=av.lane(26);
r[i+27]=av.lane(27);
r[i+28]=av.lane(28);
r[i+29]=av.lane(29);
r[i+30]=av.lane(30);
r[i+31]=av.lane(31);
r[i+32]=av.lane(32);
r[i+33]=av.lane(33);
r[i+34]=av.lane(34);
r[i+35]=av.lane(35);
r[i+36]=av.lane(36);
r[i+37]=av.lane(37);
r[i+38]=av.lane(38);
r[i+39]=av.lane(39);
r[i+40]=av.lane(40);
r[i+41]=av.lane(41);
r[i+42]=av.lane(42);
r[i+43]=av.lane(43);
r[i+44]=av.lane(44);
r[i+45]=av.lane(45);
r[i+46]=av.lane(46);
r[i+47]=av.lane(47);
r[i+48]=av.lane(48);
r[i+49]=av.lane(49);
r[i+50]=av.lane(50);
r[i+51]=av.lane(51);
r[i+52]=av.lane(52);
r[i+53]=av.lane(53);
r[i+54]=av.lane(54);
r[i+55]=av.lane(55);
r[i+56]=av.lane(56);
r[i+57]=av.lane(57);
r[i+58]=av.lane(58);
r[i+59]=av.lane(59);
r[i+60]=av.lane(60);
r[i+61]=av.lane(61);
r[i+62]=av.lane(62);
r[i+63]=av.lane(63);
} else {
for (int j = 0; j < SPECIES.length(); j++) {
r[i+j]=av.lane(j);
}
}
}
}
assertArraysStrictlyEquals(r, a);
}
@Test(dataProvider = "byteUnaryOpProvider")
static void BroadcastByte64VectorTests(IntFunction<byte[]> fa) {
byte[] a = fa.apply(SPECIES.length());
byte[] r = new byte[a.length];
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector.broadcast(SPECIES, a[i]).intoArray(r, i);
}
}
assertBroadcastArraysEquals(r, a);
}
@Test(dataProvider = "byteUnaryOpProvider")
static void ZeroByte64VectorTests(IntFunction<byte[]> fa) {
byte[] a = fa.apply(SPECIES.length());
byte[] r = new byte[a.length];
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector.zero(SPECIES).intoArray(a, i);
}
}
Assert.assertEquals(a, r);
}
static byte[] sliceUnary(byte[] a, int origin, int idx) {
byte[] res = new byte[SPECIES.length()];
for (int i = 0; i < SPECIES.length(); i++){
if(i+origin < SPECIES.length())
res[i] = a[idx+i+origin];
else
res[i] = (byte)0;
}
return res;
}
@Test(dataProvider = "byteUnaryOpProvider")
static void sliceUnaryByte64VectorTests(IntFunction<byte[]> fa) {
byte[] a = fa.apply(SPECIES.length());
byte[] r = new byte[a.length];
int origin = RAND.nextInt(SPECIES.length());
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
av.slice(origin).intoArray(r, i);
}
}
assertArraysEquals(r, a, origin, Byte64VectorTests::sliceUnary);
}
static byte[] sliceBinary(byte[] a, byte[] b, int origin, int idx) {
byte[] res = new byte[SPECIES.length()];
for (int i = 0, j = 0; i < SPECIES.length(); i++){
if(i+origin < SPECIES.length())
res[i] = a[idx+i+origin];
else {
res[i] = b[idx+j];
j++;
}
}
return res;
}
@Test(dataProvider = "byteBinaryOpProvider")
static void sliceBinaryByte64VectorTestsBinary(IntFunction<byte[]> fa, IntFunction<byte[]> fb) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] r = new byte[a.length];
int origin = RAND.nextInt(SPECIES.length());
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector bv = ByteVector.fromArray(SPECIES, b, i);
av.slice(origin, bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, origin, Byte64VectorTests::sliceBinary);
}
static byte[] slice(byte[] a, byte[] b, int origin, boolean[] mask, int idx) {
byte[] res = new byte[SPECIES.length()];
for (int i = 0, j = 0; i < SPECIES.length(); i++){
if(i+origin < SPECIES.length())
res[i] = mask[i] ? a[idx+i+origin] : (byte)0;
else {
res[i] = mask[i] ? b[idx+j] : (byte)0;
j++;
}
}
return res;
}
@Test(dataProvider = "byteBinaryOpMaskProvider")
static void sliceByte64VectorTestsMasked(IntFunction<byte[]> fa, IntFunction<byte[]> fb,
IntFunction<boolean[]> fm) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, 0);
byte[] r = new byte[a.length];
int origin = RAND.nextInt(SPECIES.length());
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector bv = ByteVector.fromArray(SPECIES, b, i);
av.slice(origin, bv, vmask).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, origin, mask, Byte64VectorTests::slice);
}
static byte[] unsliceUnary(byte[] a, int origin, int idx) {
byte[] res = new byte[SPECIES.length()];
for (int i = 0, j = 0; i < SPECIES.length(); i++){
if(i < origin)
res[i] = (byte)0;
else {
res[i] = a[idx+j];
j++;
}
}
return res;
}
@Test(dataProvider = "byteUnaryOpProvider")
static void unsliceUnaryByte64VectorTests(IntFunction<byte[]> fa) {
byte[] a = fa.apply(SPECIES.length());
byte[] r = new byte[a.length];
int origin = RAND.nextInt(SPECIES.length());
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
av.unslice(origin).intoArray(r, i);
}
}
assertArraysEquals(r, a, origin, Byte64VectorTests::unsliceUnary);
}
static byte[] unsliceBinary(byte[] a, byte[] b, int origin, int part, int idx) {
byte[] res = new byte[SPECIES.length()];
for (int i = 0, j = 0; i < SPECIES.length(); i++){
if (part == 0) {
if (i < origin)
res[i] = b[idx+i];
else {
res[i] = a[idx+j];
j++;
}
} else if (part == 1) {
if (i < origin)
res[i] = a[idx+SPECIES.length()-origin+i];
else {
res[i] = b[idx+origin+j];
j++;
}
}
}
return res;
}
@Test(dataProvider = "byteBinaryOpProvider")
static void unsliceBinaryByte64VectorTestsBinary(IntFunction<byte[]> fa, IntFunction<byte[]> fb) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] r = new byte[a.length];
int origin = RAND.nextInt(SPECIES.length());
int part = RAND.nextInt(2);
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector bv = ByteVector.fromArray(SPECIES, b, i);
av.unslice(origin, bv, part).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, origin, part, Byte64VectorTests::unsliceBinary);
}
static byte[] unslice(byte[] a, byte[] b, int origin, int part, boolean[] mask, int idx) {
byte[] res = new byte[SPECIES.length()];
for (int i = 0, j = 0; i < SPECIES.length(); i++){
if(i+origin < SPECIES.length())
res[i] = b[idx+i+origin];
else {
res[i] = b[idx+j];
j++;
}
}
for (int i = 0; i < SPECIES.length(); i++){
res[i] = mask[i] ? a[idx+i] : res[i];
}
byte[] res1 = new byte[SPECIES.length()];
if (part == 0) {
for (int i = 0, j = 0; i < SPECIES.length(); i++){
if (i < origin)
res1[i] = b[idx+i];
else {
res1[i] = res[j];
j++;
}
}
} else if (part == 1) {
for (int i = 0, j = 0; i < SPECIES.length(); i++){
if (i < origin)
res1[i] = res[SPECIES.length()-origin+i];
else {
res1[i] = b[idx+origin+j];
j++;
}
}
}
return res1;
}
@Test(dataProvider = "byteBinaryOpMaskProvider")
static void unsliceByte64VectorTestsMasked(IntFunction<byte[]> fa, IntFunction<byte[]> fb,
IntFunction<boolean[]> fm) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, 0);
byte[] r = new byte[a.length];
int origin = RAND.nextInt(SPECIES.length());
int part = RAND.nextInt(2);
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector bv = ByteVector.fromArray(SPECIES, b, i);
av.unslice(origin, bv, part, vmask).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, origin, part, mask, Byte64VectorTests::unslice);
}
static byte BITWISE_BLEND(byte a, byte b, byte c) {
return (byte)((a&~(c))|(b&c));
}
static byte bitwiseBlend(byte a, byte b, byte c) {
return (byte)((a&~(c))|(b&c));
}
@Test(dataProvider = "byteTernaryOpProvider")
static void BITWISE_BLENDByte64VectorTests(IntFunction<byte[]> fa, IntFunction<byte[]> fb, IntFunction<byte[]> fc) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] c = fc.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector bv = ByteVector.fromArray(SPECIES, b, i);
ByteVector cv = ByteVector.fromArray(SPECIES, c, i);
av.lanewise(VectorOperators.BITWISE_BLEND, bv, cv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, c, Byte64VectorTests::BITWISE_BLEND);
}
@Test(dataProvider = "byteTernaryOpProvider")
static void bitwiseBlendByte64VectorTests(IntFunction<byte[]> fa, IntFunction<byte[]> fb, IntFunction<byte[]> fc) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] c = fc.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector bv = ByteVector.fromArray(SPECIES, b, i);
ByteVector cv = ByteVector.fromArray(SPECIES, c, i);
av.bitwiseBlend(bv, cv).intoArray(r, i);
}
assertArraysEquals(r, a, b, c, Byte64VectorTests::bitwiseBlend);
}
@Test(dataProvider = "byteTernaryOpMaskProvider")
static void BITWISE_BLENDByte64VectorTestsMasked(IntFunction<byte[]> fa, IntFunction<byte[]> fb,
IntFunction<byte[]> fc, IntFunction<boolean[]> fm) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] c = fc.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, 0);
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector bv = ByteVector.fromArray(SPECIES, b, i);
ByteVector cv = ByteVector.fromArray(SPECIES, c, i);
av.lanewise(VectorOperators.BITWISE_BLEND, bv, cv, vmask).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, c, mask, Byte64VectorTests::BITWISE_BLEND);
}
@Test(dataProvider = "byteTernaryOpProvider")
static void BITWISE_BLENDByte64VectorTestsBroadcastSmokeTest(IntFunction<byte[]> fa, IntFunction<byte[]> fb, IntFunction<byte[]> fc) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] c = fc.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector bv = ByteVector.fromArray(SPECIES, b, i);
av.lanewise(VectorOperators.BITWISE_BLEND, bv, c[i]).intoArray(r, i);
}
assertBroadcastArraysEquals(r, a, b, c, Byte64VectorTests::BITWISE_BLEND);
}
@Test(dataProvider = "byteTernaryOpProvider")
static void BITWISE_BLENDByte64VectorTestsAltBroadcastSmokeTest(IntFunction<byte[]> fa, IntFunction<byte[]> fb, IntFunction<byte[]> fc) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] c = fc.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector cv = ByteVector.fromArray(SPECIES, c, i);
av.lanewise(VectorOperators.BITWISE_BLEND, b[i], cv).intoArray(r, i);
}
assertAltBroadcastArraysEquals(r, a, b, c, Byte64VectorTests::BITWISE_BLEND);
}
@Test(dataProvider = "byteTernaryOpProvider")
static void bitwiseBlendByte64VectorTestsBroadcastSmokeTest(IntFunction<byte[]> fa, IntFunction<byte[]> fb, IntFunction<byte[]> fc) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] c = fc.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector bv = ByteVector.fromArray(SPECIES, b, i);
av.bitwiseBlend(bv, c[i]).intoArray(r, i);
}
assertBroadcastArraysEquals(r, a, b, c, Byte64VectorTests::bitwiseBlend);
}
@Test(dataProvider = "byteTernaryOpProvider")
static void bitwiseBlendByte64VectorTestsAltBroadcastSmokeTest(IntFunction<byte[]> fa, IntFunction<byte[]> fb, IntFunction<byte[]> fc) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] c = fc.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector cv = ByteVector.fromArray(SPECIES, c, i);
av.bitwiseBlend(b[i], cv).intoArray(r, i);
}
assertAltBroadcastArraysEquals(r, a, b, c, Byte64VectorTests::bitwiseBlend);
}
@Test(dataProvider = "byteTernaryOpMaskProvider")
static void BITWISE_BLENDByte64VectorTestsBroadcastMaskedSmokeTest(IntFunction<byte[]> fa, IntFunction<byte[]> fb,
IntFunction<byte[]> fc, IntFunction<boolean[]> fm) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] c = fc.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, 0);
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector bv = ByteVector.fromArray(SPECIES, b, i);
av.lanewise(VectorOperators.BITWISE_BLEND, bv, c[i], vmask).intoArray(r, i);
}
assertBroadcastArraysEquals(r, a, b, c, mask, Byte64VectorTests::BITWISE_BLEND);
}
@Test(dataProvider = "byteTernaryOpMaskProvider")
static void BITWISE_BLENDByte64VectorTestsAltBroadcastMaskedSmokeTest(IntFunction<byte[]> fa, IntFunction<byte[]> fb,
IntFunction<byte[]> fc, IntFunction<boolean[]> fm) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] c = fc.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, 0);
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector cv = ByteVector.fromArray(SPECIES, c, i);
av.lanewise(VectorOperators.BITWISE_BLEND, b[i], cv, vmask).intoArray(r, i);
}
assertAltBroadcastArraysEquals(r, a, b, c, mask, Byte64VectorTests::BITWISE_BLEND);
}
@Test(dataProvider = "byteTernaryOpProvider")
static void BITWISE_BLENDByte64VectorTestsDoubleBroadcastSmokeTest(IntFunction<byte[]> fa, IntFunction<byte[]> fb, IntFunction<byte[]> fc) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] c = fc.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
av.lanewise(VectorOperators.BITWISE_BLEND, b[i], c[i]).intoArray(r, i);
}
assertDoubleBroadcastArraysEquals(r, a, b, c, Byte64VectorTests::BITWISE_BLEND);
}
@Test(dataProvider = "byteTernaryOpProvider")
static void bitwiseBlendByte64VectorTestsDoubleBroadcastSmokeTest(IntFunction<byte[]> fa, IntFunction<byte[]> fb, IntFunction<byte[]> fc) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] c = fc.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
av.bitwiseBlend(b[i], c[i]).intoArray(r, i);
}
assertDoubleBroadcastArraysEquals(r, a, b, c, Byte64VectorTests::bitwiseBlend);
}
@Test(dataProvider = "byteTernaryOpMaskProvider")
static void BITWISE_BLENDByte64VectorTestsDoubleBroadcastMaskedSmokeTest(IntFunction<byte[]> fa, IntFunction<byte[]> fb,
IntFunction<byte[]> fc, IntFunction<boolean[]> fm) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] c = fc.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, 0);
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
av.lanewise(VectorOperators.BITWISE_BLEND, b[i], c[i], vmask).intoArray(r, i);
}
assertDoubleBroadcastArraysEquals(r, a, b, c, mask, Byte64VectorTests::BITWISE_BLEND);
}
static byte NEG(byte a) {
return (byte)(-((byte)a));
}
static byte neg(byte a) {
return (byte)(-((byte)a));
}
@Test(dataProvider = "byteUnaryOpProvider")
static void NEGByte64VectorTests(IntFunction<byte[]> fa) {
byte[] a = fa.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
av.lanewise(VectorOperators.NEG).intoArray(r, i);
}
}
assertArraysEquals(r, a, Byte64VectorTests::NEG);
}
@Test(dataProvider = "byteUnaryOpProvider")
static void negByte64VectorTests(IntFunction<byte[]> fa) {
byte[] a = fa.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
av.neg().intoArray(r, i);
}
}
assertArraysEquals(r, a, Byte64VectorTests::neg);
}
@Test(dataProvider = "byteUnaryOpMaskProvider")
static void NEGMaskedByte64VectorTests(IntFunction<byte[]> fa,
IntFunction<boolean[]> fm) {
byte[] a = fa.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, 0);
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
av.lanewise(VectorOperators.NEG, vmask).intoArray(r, i);
}
}
assertArraysEquals(r, a, mask, Byte64VectorTests::NEG);
}
static byte ABS(byte a) {
return (byte)(Math.abs((byte)a));
}
static byte abs(byte a) {
return (byte)(Math.abs((byte)a));
}
@Test(dataProvider = "byteUnaryOpProvider")
static void ABSByte64VectorTests(IntFunction<byte[]> fa) {
byte[] a = fa.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
av.lanewise(VectorOperators.ABS).intoArray(r, i);
}
}
assertArraysEquals(r, a, Byte64VectorTests::ABS);
}
@Test(dataProvider = "byteUnaryOpProvider")
static void absByte64VectorTests(IntFunction<byte[]> fa) {
byte[] a = fa.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
av.abs().intoArray(r, i);
}
}
assertArraysEquals(r, a, Byte64VectorTests::abs);
}
@Test(dataProvider = "byteUnaryOpMaskProvider")
static void ABSMaskedByte64VectorTests(IntFunction<byte[]> fa,
IntFunction<boolean[]> fm) {
byte[] a = fa.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, 0);
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
av.lanewise(VectorOperators.ABS, vmask).intoArray(r, i);
}
}
assertArraysEquals(r, a, mask, Byte64VectorTests::ABS);
}
static byte NOT(byte a) {
return (byte)(~((byte)a));
}
static byte not(byte a) {
return (byte)(~((byte)a));
}
@Test(dataProvider = "byteUnaryOpProvider")
static void NOTByte64VectorTests(IntFunction<byte[]> fa) {
byte[] a = fa.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
av.lanewise(VectorOperators.NOT).intoArray(r, i);
}
}
assertArraysEquals(r, a, Byte64VectorTests::NOT);
}
@Test(dataProvider = "byteUnaryOpProvider")
static void notByte64VectorTests(IntFunction<byte[]> fa) {
byte[] a = fa.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
av.not().intoArray(r, i);
}
}
assertArraysEquals(r, a, Byte64VectorTests::not);
}
@Test(dataProvider = "byteUnaryOpMaskProvider")
static void NOTMaskedByte64VectorTests(IntFunction<byte[]> fa,
IntFunction<boolean[]> fm) {
byte[] a = fa.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, 0);
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
av.lanewise(VectorOperators.NOT, vmask).intoArray(r, i);
}
}
assertArraysEquals(r, a, mask, Byte64VectorTests::NOT);
}
static byte ZOMO(byte a) {
return (byte)((a==0?0:-1));
}
@Test(dataProvider = "byteUnaryOpProvider")
static void ZOMOByte64VectorTests(IntFunction<byte[]> fa) {
byte[] a = fa.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
av.lanewise(VectorOperators.ZOMO).intoArray(r, i);
}
}
assertArraysEquals(r, a, Byte64VectorTests::ZOMO);
}
@Test(dataProvider = "byteUnaryOpMaskProvider")
static void ZOMOMaskedByte64VectorTests(IntFunction<byte[]> fa,
IntFunction<boolean[]> fm) {
byte[] a = fa.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, 0);
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
av.lanewise(VectorOperators.ZOMO, vmask).intoArray(r, i);
}
}
assertArraysEquals(r, a, mask, Byte64VectorTests::ZOMO);
}
static byte BIT_COUNT(byte a) {
return (byte)(Integer.bitCount((int)a & 0xFF));
}
@Test(dataProvider = "byteUnaryOpProvider")
static void BIT_COUNTByte64VectorTests(IntFunction<byte[]> fa) {
byte[] a = fa.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
av.lanewise(VectorOperators.BIT_COUNT).intoArray(r, i);
}
}
assertArraysEquals(r, a, Byte64VectorTests::BIT_COUNT);
}
@Test(dataProvider = "byteUnaryOpMaskProvider")
static void BIT_COUNTMaskedByte64VectorTests(IntFunction<byte[]> fa,
IntFunction<boolean[]> fm) {
byte[] a = fa.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, 0);
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
av.lanewise(VectorOperators.BIT_COUNT, vmask).intoArray(r, i);
}
}
assertArraysEquals(r, a, mask, Byte64VectorTests::BIT_COUNT);
}
static byte TRAILING_ZEROS_COUNT(byte a) {
return (byte)(TRAILING_ZEROS_COUNT_scalar(a));
}
@Test(dataProvider = "byteUnaryOpProvider")
static void TRAILING_ZEROS_COUNTByte64VectorTests(IntFunction<byte[]> fa) {
byte[] a = fa.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
av.lanewise(VectorOperators.TRAILING_ZEROS_COUNT).intoArray(r, i);
}
}
assertArraysEquals(r, a, Byte64VectorTests::TRAILING_ZEROS_COUNT);
}
@Test(dataProvider = "byteUnaryOpMaskProvider")
static void TRAILING_ZEROS_COUNTMaskedByte64VectorTests(IntFunction<byte[]> fa,
IntFunction<boolean[]> fm) {
byte[] a = fa.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, 0);
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
av.lanewise(VectorOperators.TRAILING_ZEROS_COUNT, vmask).intoArray(r, i);
}
}
assertArraysEquals(r, a, mask, Byte64VectorTests::TRAILING_ZEROS_COUNT);
}
static byte LEADING_ZEROS_COUNT(byte a) {
return (byte)(LEADING_ZEROS_COUNT_scalar(a));
}
@Test(dataProvider = "byteUnaryOpProvider")
static void LEADING_ZEROS_COUNTByte64VectorTests(IntFunction<byte[]> fa) {
byte[] a = fa.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
av.lanewise(VectorOperators.LEADING_ZEROS_COUNT).intoArray(r, i);
}
}
assertArraysEquals(r, a, Byte64VectorTests::LEADING_ZEROS_COUNT);
}
@Test(dataProvider = "byteUnaryOpMaskProvider")
static void LEADING_ZEROS_COUNTMaskedByte64VectorTests(IntFunction<byte[]> fa,
IntFunction<boolean[]> fm) {
byte[] a = fa.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, 0);
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
av.lanewise(VectorOperators.LEADING_ZEROS_COUNT, vmask).intoArray(r, i);
}
}
assertArraysEquals(r, a, mask, Byte64VectorTests::LEADING_ZEROS_COUNT);
}
static byte REVERSE(byte a) {
return (byte)(REVERSE_scalar(a));
}
@Test(dataProvider = "byteUnaryOpProvider")
static void REVERSEByte64VectorTests(IntFunction<byte[]> fa) {
byte[] a = fa.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
av.lanewise(VectorOperators.REVERSE).intoArray(r, i);
}
}
assertArraysEquals(r, a, Byte64VectorTests::REVERSE);
}
@Test(dataProvider = "byteUnaryOpMaskProvider")
static void REVERSEMaskedByte64VectorTests(IntFunction<byte[]> fa,
IntFunction<boolean[]> fm) {
byte[] a = fa.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, 0);
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
av.lanewise(VectorOperators.REVERSE, vmask).intoArray(r, i);
}
}
assertArraysEquals(r, a, mask, Byte64VectorTests::REVERSE);
}
static byte REVERSE_BYTES(byte a) {
return (byte)(a);
}
@Test(dataProvider = "byteUnaryOpProvider")
static void REVERSE_BYTESByte64VectorTests(IntFunction<byte[]> fa) {
byte[] a = fa.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
av.lanewise(VectorOperators.REVERSE_BYTES).intoArray(r, i);
}
}
assertArraysEquals(r, a, Byte64VectorTests::REVERSE_BYTES);
}
@Test(dataProvider = "byteUnaryOpMaskProvider")
static void REVERSE_BYTESMaskedByte64VectorTests(IntFunction<byte[]> fa,
IntFunction<boolean[]> fm) {
byte[] a = fa.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, 0);
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
av.lanewise(VectorOperators.REVERSE_BYTES, vmask).intoArray(r, i);
}
}
assertArraysEquals(r, a, mask, Byte64VectorTests::REVERSE_BYTES);
}
@Test(dataProvider = "byteCompareOpProvider")
static void ltByte64VectorTestsBroadcastSmokeTest(IntFunction<byte[]> fa, IntFunction<byte[]> fb) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
VectorMask<Byte> mv = av.lt(b[i]);
// Check results as part of computation.
for (int j = 0; j < SPECIES.length(); j++) {
Assert.assertEquals(mv.laneIsSet(j), a[i + j] < b[i]);
}
}
}
@Test(dataProvider = "byteCompareOpProvider")
static void eqByte64VectorTestsBroadcastMaskedSmokeTest(IntFunction<byte[]> fa, IntFunction<byte[]> fb) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
VectorMask<Byte> mv = av.eq(b[i]);
// Check results as part of computation.
for (int j = 0; j < SPECIES.length(); j++) {
Assert.assertEquals(mv.laneIsSet(j), a[i + j] == b[i]);
}
}
}
@Test(dataProvider = "byteUnaryOpProvider")
static void toIntArrayByte64VectorTestsSmokeTest(IntFunction<byte[]> fa) {
byte[] a = fa.apply(SPECIES.length());
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
int[] r = av.toIntArray();
assertArraysEquals(r, a, i);
}
}
@Test(dataProvider = "byteUnaryOpProvider")
static void toLongArrayByte64VectorTestsSmokeTest(IntFunction<byte[]> fa) {
byte[] a = fa.apply(SPECIES.length());
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
long[] r = av.toLongArray();
assertArraysEquals(r, a, i);
}
}
@Test(dataProvider = "byteUnaryOpProvider")
static void toDoubleArrayByte64VectorTestsSmokeTest(IntFunction<byte[]> fa) {
byte[] a = fa.apply(SPECIES.length());
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
double[] r = av.toDoubleArray();
assertArraysEquals(r, a, i);
}
}
@Test(dataProvider = "byteUnaryOpProvider")
static void toStringByte64VectorTestsSmokeTest(IntFunction<byte[]> fa) {
byte[] a = fa.apply(SPECIES.length());
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
String str = av.toString();
byte subarr[] = Arrays.copyOfRange(a, i, i + SPECIES.length());
Assert.assertTrue(str.equals(Arrays.toString(subarr)), "at index " + i + ", string should be = " + Arrays.toString(subarr) + ", but is = " + str);
}
}
@Test(dataProvider = "byteUnaryOpProvider")
static void hashCodeByte64VectorTestsSmokeTest(IntFunction<byte[]> fa) {
byte[] a = fa.apply(SPECIES.length());
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
int hash = av.hashCode();
byte subarr[] = Arrays.copyOfRange(a, i, i + SPECIES.length());
int expectedHash = Objects.hash(SPECIES, Arrays.hashCode(subarr));
Assert.assertTrue(hash == expectedHash, "at index " + i + ", hash should be = " + expectedHash + ", but is = " + hash);
}
}
@Test(dataProvider = "byteUnaryOpProvider")
static void reinterpretAsBytesByte64VectorTestsSmokeTest(IntFunction<byte[]> fa) {
byte[] a = fa.apply(SPECIES.length());
byte[] r = new byte[a.length];
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
av.reinterpretAsBytes().intoArray(r, i);
}
assertArraysEquals(r, a, 0);
}
static long ADDReduceLong(byte[] a, int idx) {
byte res = 0;
for (int i = idx; i < (idx + SPECIES.length()); i++) {
res += a[i];
}
return (long)res;
}
static long ADDReduceAllLong(byte[] a) {
long res = 0;
for (int i = 0; i < a.length; i += SPECIES.length()) {
res += ADDReduceLong(a, i);
}
return res;
}
@Test(dataProvider = "byteUnaryOpProvider")
static void ADDReduceLongByte64VectorTests(IntFunction<byte[]> fa) {
byte[] a = fa.apply(SPECIES.length());
long[] r = lfr.apply(SPECIES.length());
long ra = 0;
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
r[i] = av.reduceLanesToLong(VectorOperators.ADD);
}
ra = 0;
for (int i = 0; i < a.length; i ++) {
ra += r[i];
}
assertReductionLongArraysEquals(r, ra, a,
Byte64VectorTests::ADDReduceLong, Byte64VectorTests::ADDReduceAllLong);
}
static long ADDReduceLongMasked(byte[] a, int idx, boolean[] mask) {
byte res = 0;
for (int i = idx; i < (idx + SPECIES.length()); i++) {
if(mask[i % SPECIES.length()])
res += a[i];
}
return (long)res;
}
static long ADDReduceAllLongMasked(byte[] a, boolean[] mask) {
long res = 0;
for (int i = 0; i < a.length; i += SPECIES.length()) {
res += ADDReduceLongMasked(a, i, mask);
}
return res;
}
@Test(dataProvider = "byteUnaryOpMaskProvider")
static void ADDReduceLongByte64VectorTestsMasked(IntFunction<byte[]> fa, IntFunction<boolean[]> fm) {
byte[] a = fa.apply(SPECIES.length());
long[] r = lfr.apply(SPECIES.length());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, 0);
long ra = 0;
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
r[i] = av.reduceLanesToLong(VectorOperators.ADD, vmask);
}
ra = 0;
for (int i = 0; i < a.length; i ++) {
ra += r[i];
}
assertReductionLongArraysEqualsMasked(r, ra, a, mask,
Byte64VectorTests::ADDReduceLongMasked, Byte64VectorTests::ADDReduceAllLongMasked);
}
@Test(dataProvider = "byteUnaryOpProvider")
static void BroadcastLongByte64VectorTestsSmokeTest(IntFunction<byte[]> fa) {
byte[] a = fa.apply(SPECIES.length());
byte[] r = new byte[a.length];
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector.broadcast(SPECIES, (long)a[i]).intoArray(r, i);
}
assertBroadcastArraysEquals(r, a);
}
@Test(dataProvider = "byteBinaryOpMaskProvider")
static void blendByte64VectorTestsBroadcastLongSmokeTest(IntFunction<byte[]> fa, IntFunction<byte[]> fb,
IntFunction<boolean[]> fm) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, 0);
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
av.blend((long)b[i], vmask).intoArray(r, i);
}
}
assertBroadcastLongArraysEquals(r, a, b, mask, Byte64VectorTests::blend);
}
@Test(dataProvider = "byteUnaryOpSelectFromProvider")
static void SelectFromByte64VectorTests(IntFunction<byte[]> fa,
BiFunction<Integer,Integer,byte[]> fs) {
byte[] a = fa.apply(SPECIES.length());
byte[] order = fs.apply(a.length, SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector bv = ByteVector.fromArray(SPECIES, order, i);
bv.selectFrom(av).intoArray(r, i);
}
assertSelectFromArraysEquals(r, a, order, SPECIES.length());
}
@Test(dataProvider = "byteSelectFromTwoVectorOpProvider")
static void SelectFromTwoVectorByte64VectorTests(IntFunction<byte[]> fa, IntFunction<byte[]> fb, IntFunction<byte[]> fc) {
byte[] a = fa.apply(SPECIES.length());
byte[] b = fb.apply(SPECIES.length());
byte[] idx = fc.apply(SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < idx.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector bv = ByteVector.fromArray(SPECIES, b, i);
ByteVector idxv = ByteVector.fromArray(SPECIES, idx, i);
idxv.selectFrom(av, bv).intoArray(r, i);
}
}
assertSelectFromTwoVectorEquals(r, idx, a, b, SPECIES.length());
}
@Test(dataProvider = "byteUnaryOpSelectFromMaskProvider")
static void SelectFromByte64VectorTestsMaskedSmokeTest(IntFunction<byte[]> fa,
BiFunction<Integer,Integer,byte[]> fs,
IntFunction<boolean[]> fm) {
byte[] a = fa.apply(SPECIES.length());
byte[] order = fs.apply(a.length, SPECIES.length());
byte[] r = fr.apply(SPECIES.length());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<Byte> vmask = VectorMask.fromArray(SPECIES, mask, 0);
for (int i = 0; i < a.length; i += SPECIES.length()) {
ByteVector av = ByteVector.fromArray(SPECIES, a, i);
ByteVector bv = ByteVector.fromArray(SPECIES, order, i);
bv.selectFrom(av, vmask).intoArray(r, i);
}
assertSelectFromArraysEquals(r, a, order, mask, SPECIES.length());
}
@Test(dataProvider = "shuffleProvider")
static void shuffleMiscellaneousByte64VectorTestsSmokeTest(BiFunction<Integer,Integer,int[]> fs) {
int[] a = fs.apply(SPECIES.length() * BUFFER_REPS, SPECIES.length());
for (int i = 0; i < a.length; i += SPECIES.length()) {
var shuffle = VectorShuffle.fromArray(SPECIES, a, i);
int hash = shuffle.hashCode();
int length = shuffle.length();
int subarr[] = Arrays.copyOfRange(a, i, i + SPECIES.length());
int expectedHash = Objects.hash(SPECIES, Arrays.hashCode(subarr));
Assert.assertTrue(hash == expectedHash, "at index " + i + ", hash should be = " + expectedHash + ", but is = " + hash);
Assert.assertEquals(length, SPECIES.length());
}
}
@Test(dataProvider = "shuffleProvider")
static void shuffleToStringByte64VectorTestsSmokeTest(BiFunction<Integer,Integer,int[]> fs) {
int[] a = fs.apply(SPECIES.length() * BUFFER_REPS, SPECIES.length());
for (int i = 0; i < a.length; i += SPECIES.length()) {
var shuffle = VectorShuffle.fromArray(SPECIES, a, i);
String str = shuffle.toString();
int subarr[] = Arrays.copyOfRange(a, i, i + SPECIES.length());
Assert.assertTrue(str.equals("Shuffle" + Arrays.toString(subarr)), "at index " +
i + ", string should be = " + Arrays.toString(subarr) + ", but is = " + str);
}
}
@Test(dataProvider = "shuffleCompareOpProvider")
static void shuffleEqualsByte64VectorTestsSmokeTest(BiFunction<Integer,Integer,int[]> fa, BiFunction<Integer,Integer,int[]> fb) {
int[] a = fa.apply(SPECIES.length() * BUFFER_REPS, SPECIES.length());
int[] b = fb.apply(SPECIES.length() * BUFFER_REPS, SPECIES.length());
for (int i = 0; i < a.length; i += SPECIES.length()) {
var av = VectorShuffle.fromArray(SPECIES, a, i);
var bv = VectorShuffle.fromArray(SPECIES, b, i);
boolean eq = av.equals(bv);
int to = i + SPECIES.length();
Assert.assertEquals(eq, Arrays.equals(a, i, to, b, i, to));
}
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskEqualsByte64VectorTestsSmokeTest(IntFunction<boolean[]> fa, IntFunction<boolean[]> fb) {
boolean[] a = fa.apply(SPECIES.length());
boolean[] b = fb.apply(SPECIES.length());
for (int i = 0; i < a.length; i += SPECIES.length()) {
var av = SPECIES.loadMask(a, i);
var bv = SPECIES.loadMask(b, i);
boolean equals = av.equals(bv);
int to = i + SPECIES.length();
Assert.assertEquals(equals, Arrays.equals(a, i, to, b, i, to));
}
}
static boolean band(boolean a, boolean b) {
return a & b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskAndByte64VectorTestsSmokeTest(IntFunction<boolean[]> fa, IntFunction<boolean[]> fb) {
boolean[] a = fa.apply(SPECIES.length());
boolean[] b = fb.apply(SPECIES.length());
boolean[] r = new boolean[a.length];
for (int i = 0; i < a.length; i += SPECIES.length()) {
var av = SPECIES.loadMask(a, i);
var bv = SPECIES.loadMask(b, i);
var cv = av.and(bv);
cv.intoArray(r, i);
}
assertArraysEquals(r, a, b, Byte64VectorTests::band);
}
static boolean bor(boolean a, boolean b) {
return a | b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskOrByte64VectorTestsSmokeTest(IntFunction<boolean[]> fa, IntFunction<boolean[]> fb) {
boolean[] a = fa.apply(SPECIES.length());
boolean[] b = fb.apply(SPECIES.length());
boolean[] r = new boolean[a.length];
for (int i = 0; i < a.length; i += SPECIES.length()) {
var av = SPECIES.loadMask(a, i);
var bv = SPECIES.loadMask(b, i);
var cv = av.or(bv);
cv.intoArray(r, i);
}
assertArraysEquals(r, a, b, Byte64VectorTests::bor);
}
static boolean bxor(boolean a, boolean b) {
return a != b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskXorByte64VectorTestsSmokeTest(IntFunction<boolean[]> fa, IntFunction<boolean[]> fb) {
boolean[] a = fa.apply(SPECIES.length());
boolean[] b = fb.apply(SPECIES.length());
boolean[] r = new boolean[a.length];
for (int i = 0; i < a.length; i += SPECIES.length()) {
var av = SPECIES.loadMask(a, i);
var bv = SPECIES.loadMask(b, i);
var cv = av.xor(bv);
cv.intoArray(r, i);
}
assertArraysEquals(r, a, b, Byte64VectorTests::bxor);
}
static boolean bandNot(boolean a, boolean b) {
return a & !b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskAndNotByte64VectorTestsSmokeTest(IntFunction<boolean[]> fa, IntFunction<boolean[]> fb) {
boolean[] a = fa.apply(SPECIES.length());
boolean[] b = fb.apply(SPECIES.length());
boolean[] r = new boolean[a.length];
for (int i = 0; i < a.length; i += SPECIES.length()) {
var av = SPECIES.loadMask(a, i);
var bv = SPECIES.loadMask(b, i);
var cv = av.andNot(bv);
cv.intoArray(r, i);
}
assertArraysEquals(r, a, b, Byte64VectorTests::bandNot);
}
static boolean beq(boolean a, boolean b) {
return (a == b);
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskEqByte64VectorTestsSmokeTest(IntFunction<boolean[]> fa, IntFunction<boolean[]> fb) {
boolean[] a = fa.apply(SPECIES.length());
boolean[] b = fb.apply(SPECIES.length());
boolean[] r = new boolean[a.length];
for (int i = 0; i < a.length; i += SPECIES.length()) {
var av = SPECIES.loadMask(a, i);
var bv = SPECIES.loadMask(b, i);
var cv = av.eq(bv);
cv.intoArray(r, i);
}
assertArraysEquals(r, a, b, Byte64VectorTests::beq);
}
@Test(dataProvider = "maskProvider")
static void maskHashCodeByte64VectorTestsSmokeTest(IntFunction<boolean[]> fa) {
boolean[] a = fa.apply(SPECIES.length());
for (int i = 0; i < a.length; i += SPECIES.length()) {
var vmask = SPECIES.loadMask(a, i);
int hash = vmask.hashCode();
boolean subarr[] = Arrays.copyOfRange(a, i, i + SPECIES.length());
int expectedHash = Objects.hash(SPECIES, Arrays.hashCode(subarr));
Assert.assertTrue(hash == expectedHash, "at index " + i + ", hash should be = " + expectedHash + ", but is = " + hash);
}
}
static int maskTrueCount(boolean[] a, int idx) {
int trueCount = 0;
for (int i = idx; i < idx + SPECIES.length(); i++) {
trueCount += a[i] ? 1 : 0;
}
return trueCount;
}
@Test(dataProvider = "maskProvider")
static void maskTrueCountByte64VectorTestsSmokeTest(IntFunction<boolean[]> fa) {
boolean[] a = fa.apply(SPECIES.length());
int[] r = new int[a.length];
for (int ic = 0; ic < INVOC_COUNT * INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
var vmask = SPECIES.loadMask(a, i);
r[i] = vmask.trueCount();
}
}
assertMaskReductionArraysEquals(r, a, Byte64VectorTests::maskTrueCount);
}
static int maskLastTrue(boolean[] a, int idx) {
int i = idx + SPECIES.length() - 1;
for (; i >= idx; i--) {
if (a[i]) {
break;
}
}
return i - idx;
}
@Test(dataProvider = "maskProvider")
static void maskLastTrueByte64VectorTestsSmokeTest(IntFunction<boolean[]> fa) {
boolean[] a = fa.apply(SPECIES.length());
int[] r = new int[a.length];
for (int ic = 0; ic < INVOC_COUNT * INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
var vmask = SPECIES.loadMask(a, i);
r[i] = vmask.lastTrue();
}
}
assertMaskReductionArraysEquals(r, a, Byte64VectorTests::maskLastTrue);
}
static int maskFirstTrue(boolean[] a, int idx) {
int i = idx;
for (; i < idx + SPECIES.length(); i++) {
if (a[i]) {
break;
}
}
return i - idx;
}
@Test(dataProvider = "maskProvider")
static void maskFirstTrueByte64VectorTestsSmokeTest(IntFunction<boolean[]> fa) {
boolean[] a = fa.apply(SPECIES.length());
int[] r = new int[a.length];
for (int ic = 0; ic < INVOC_COUNT * INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
var vmask = SPECIES.loadMask(a, i);
r[i] = vmask.firstTrue();
}
}
assertMaskReductionArraysEquals(r, a, Byte64VectorTests::maskFirstTrue);
}
@Test(dataProvider = "maskProvider")
static void maskCompressByte64VectorTestsSmokeTest(IntFunction<boolean[]> fa) {
int trueCount = 0;
boolean[] a = fa.apply(SPECIES.length());
for (int ic = 0; ic < INVOC_COUNT * INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
var vmask = SPECIES.loadMask(a, i);
trueCount = vmask.trueCount();
var rmask = vmask.compress();
for (int j = 0; j < SPECIES.length(); j++) {
Assert.assertEquals(rmask.laneIsSet(j), j < trueCount);
}
}
}
}
@DataProvider
public static Object[][] longMaskProvider() {
return new Object[][]{
{0xFFFFFFFFFFFFFFFFL},
{0x0000000000000000L},
{0x5555555555555555L},
{0x0123456789abcdefL},
};
}
@Test(dataProvider = "longMaskProvider")
static void maskFromToLongByte64VectorTestsSmokeTest(long inputLong) {
var vmask = VectorMask.fromLong(SPECIES, inputLong);
long outputLong = vmask.toLong();
Assert.assertEquals(outputLong, (inputLong & (((0xFFFFFFFFFFFFFFFFL >>> (64 - SPECIES.length()))))));
}
@DataProvider
public static Object[][] offsetProvider() {
return new Object[][]{
{0},
{-1},
{+1},
{+2},
{-2},
};
}
@Test(dataProvider = "offsetProvider")
static void indexInRangeByte64VectorTestsSmokeTest(int offset) {
int limit = SPECIES.length() * BUFFER_REPS;
for (int i = 0; i < limit; i += SPECIES.length()) {
var actualMask = SPECIES.indexInRange(i + offset, limit);
var expectedMask = SPECIES.maskAll(true).indexInRange(i + offset, limit);
assert(actualMask.equals(expectedMask));
for (int j = 0; j < SPECIES.length(); j++) {
int index = i + j + offset;
Assert.assertEquals(actualMask.laneIsSet(j), index >= 0 && index < limit);
}
}
}
@Test(dataProvider = "offsetProvider")
static void indexInRangeLongByte64VectorTestsSmokeTest(int offset) {
long limit = SPECIES.length() * BUFFER_REPS;
for (long i = 0; i < limit; i += SPECIES.length()) {
var actualMask = SPECIES.indexInRange(i + offset, limit);
var expectedMask = SPECIES.maskAll(true).indexInRange(i + offset, limit);
assert(actualMask.equals(expectedMask));
for (int j = 0; j < SPECIES.length(); j++) {
long index = i + j + offset;
Assert.assertEquals(actualMask.laneIsSet(j), index >= 0 && index < limit);
}
}
}
@DataProvider
public static Object[][] lengthProvider() {
return new Object[][]{
{0},
{1},
{32},
{37},
{1024},
{1024+1},
{1024+5},
};
}
@Test(dataProvider = "lengthProvider")
static void loopBoundByte64VectorTestsSmokeTest(int length) {
int actualLoopBound = SPECIES.loopBound(length);
int expectedLoopBound = length - Math.floorMod(length, SPECIES.length());
Assert.assertEquals(actualLoopBound, expectedLoopBound);
}
@Test(dataProvider = "lengthProvider")
static void loopBoundLongByte64VectorTestsSmokeTest(int _length) {
long length = _length;
long actualLoopBound = SPECIES.loopBound(length);
long expectedLoopBound = length - Math.floorMod(length, SPECIES.length());
Assert.assertEquals(actualLoopBound, expectedLoopBound);
}
@Test
static void ElementSizeByte64VectorTestsSmokeTest() {
ByteVector av = ByteVector.zero(SPECIES);
int elsize = av.elementSize();
Assert.assertEquals(elsize, Byte.SIZE);
}
@Test
static void VectorShapeByte64VectorTestsSmokeTest() {
ByteVector av = ByteVector.zero(SPECIES);
VectorShape vsh = av.shape();
assert(vsh.equals(VectorShape.S_64_BIT));
}
@Test
static void ShapeWithLanesByte64VectorTestsSmokeTest() {
ByteVector av = ByteVector.zero(SPECIES);
VectorShape vsh = av.shape();
VectorSpecies species = vsh.withLanes(byte.class);
assert(species.equals(SPECIES));
}
@Test
static void ElementTypeByte64VectorTestsSmokeTest() {
ByteVector av = ByteVector.zero(SPECIES);
assert(av.species().elementType() == byte.class);
}
@Test
static void SpeciesElementSizeByte64VectorTestsSmokeTest() {
ByteVector av = ByteVector.zero(SPECIES);
assert(av.species().elementSize() == Byte.SIZE);
}
@Test
static void VectorTypeByte64VectorTestsSmokeTest() {
ByteVector av = ByteVector.zero(SPECIES);
assert(av.species().vectorType() == av.getClass());
}
@Test
static void WithLanesByte64VectorTestsSmokeTest() {
ByteVector av = ByteVector.zero(SPECIES);
VectorSpecies species = av.species().withLanes(byte.class);
assert(species.equals(SPECIES));
}
@Test
static void WithShapeByte64VectorTestsSmokeTest() {
ByteVector av = ByteVector.zero(SPECIES);
VectorShape vsh = av.shape();
VectorSpecies species = av.species().withShape(vsh);
assert(species.equals(SPECIES));
}
@Test
static void MaskAllTrueByte64VectorTestsSmokeTest() {
for (int ic = 0; ic < INVOC_COUNT; ic++) {
Assert.assertEquals(SPECIES.maskAll(true).toLong(), -1L >>> (64 - SPECIES.length()));
}
}
}