8371446: VectorAPI: Add unit tests for masks from various long values

Reviewed-by: psandoz
This commit is contained in:
Xueming Shen 2025-12-10 00:50:48 +00:00
parent 7f9951a934
commit eef9813ad4
39 changed files with 6447 additions and 3933 deletions

View File

@ -110,19 +110,19 @@ public class AbstractVectorTest {
}
static final List<IntFunction<boolean[]>> BOOLEAN_MASK_GENERATORS = List.of(
withToString("mask[i % 2]", (int l) -> {
boolean[] a = new boolean[l];
for (int i = 0; i < l; i++) {
a[i] = (i % 2 == 0);
}
return a;
withToString("mask[i % 2]", (int s) -> {
return fill_boolean(s,
i -> ((i % 2) == 0));
}),
withToString("mask[true]", (int l) -> {
boolean[] a = new boolean[l];
withToString("mask[true]", (int s) -> {
boolean[] a = new boolean[s];
Arrays.fill(a, true);
return a;
}),
withToString("mask[false]", boolean[]::new)
withToString("mask[false]", boolean[]::new),
withToString("mask[random]", (int s) -> {
return fill_boolean(s,_i -> RAND.nextBoolean());
})
);
static final List<List<IntFunction<boolean[]>>>
@ -131,6 +131,26 @@ public class AbstractVectorTest {
flatMap(fa -> BOOLEAN_MASK_GENERATORS.stream().skip(1).map(
fb -> List.of(fa, fb))).collect(Collectors.toList());
static long[] pack_booleans_to_longs(boolean[] mask) {
int totalLongs = (mask.length + 63) / 64; // ceil division
long[] packed = new long[totalLongs];
for (int i = 0; i < mask.length; i++) {
int longIndex = i / 64;
int bitIndex = i % 64;
if (mask[i]) {
packed[longIndex] |= 1L << bitIndex;
}
}
return packed;
}
static final List<IntFunction<long[]>> LONG_MASK_GENERATORS = BOOLEAN_MASK_GENERATORS.stream()
.map(f -> withToString(
f.toString().replace("mask", "long_mask"),
(IntFunction<long[]>) (int l) -> pack_booleans_to_longs(f.apply(l))
))
.collect(Collectors.toList());
static final List<BiFunction<Integer,Integer,int[]>> INT_SHUFFLE_GENERATORS = List.of(
withToStringBi("shuffle[random]",
(Integer l, Integer m) -> RAND.ints(l, 0, m).toArray())
@ -210,21 +230,6 @@ public class AbstractVectorTest {
return a;
}
interface FBooleanBinOp {
boolean apply(boolean a, boolean b);
}
static void assertArraysEquals(boolean[] r, boolean[] a, boolean[] b, FBooleanBinOp 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);
}
}
// Non-optimized test partial wrap derived from the Spec:
// Validation function for lane indexes which may be out of the valid range of [0..VLENGTH-1].
// The index is forced into this range by adding or subtracting a suitable multiple of VLENGTH.

View File

@ -393,6 +393,36 @@ public class Byte128VectorTests extends AbstractVectorTest {
}
}
interface FBoolUnOp {
boolean apply(boolean a);
}
static void assertArraysEquals(boolean[] r, boolean[] a, FBoolUnOp 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]), "(" + a[i] + ") at index #" + i);
}
}
interface FBoolBinOp {
boolean apply(boolean a, boolean b);
}
static void assertArraysEquals(boolean[] r, boolean[] a, boolean[] b, FBoolBinOp 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);
}
}
interface FBinOp {
byte apply(byte a, byte b);
}
@ -1095,12 +1125,6 @@ public class Byte128VectorTests extends AbstractVectorTest {
.flatMap(pair -> BYTE_SATURATING_GENERATORS_ASSOC.stream().map(f -> List.of(pair.get(0), pair.get(1), f)))
.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().
@ -1232,8 +1256,23 @@ public class Byte128VectorTests extends AbstractVectorTest {
}
@DataProvider
public Object[][] maskCompareOpProvider() {
return BOOLEAN_MASK_COMPARE_GENERATOR_PAIRS.stream().map(List::toArray).
public Object[][] longMaskProvider() {
return LONG_MASK_GENERATORS.stream().
map(f -> new Object[]{f}).
toArray(Object[][]::new);
}
@DataProvider
public Object[][] boolMaskBinaryOpProvider() {
return BOOLEAN_MASK_COMPARE_GENERATOR_PAIRS.stream().
map(List::toArray).
toArray(Object[][]::new);
}
@DataProvider
public Object[][] boolMaskUnaryOpProvider() {
return BOOLEAN_MASK_GENERATORS.stream().
map(f -> new Object[]{f}).
toArray(Object[][]::new);
}
@ -4464,7 +4503,7 @@ public class Byte128VectorTests extends AbstractVectorTest {
return res;
}
@Test(dataProvider = "boolUnaryOpProvider")
@Test(dataProvider = "boolMaskUnaryOpProvider")
static void anyTrueByte128VectorTests(IntFunction<boolean[]> fm) {
boolean[] mask = fm.apply(SPECIES.length());
boolean[] r = fmr.apply(SPECIES.length());
@ -4488,7 +4527,7 @@ public class Byte128VectorTests extends AbstractVectorTest {
return res;
}
@Test(dataProvider = "boolUnaryOpProvider")
@Test(dataProvider = "boolMaskUnaryOpProvider")
static void allTrueByte128VectorTests(IntFunction<boolean[]> fm) {
boolean[] mask = fm.apply(SPECIES.length());
boolean[] r = fmr.apply(SPECIES.length());
@ -6390,6 +6429,157 @@ public class Byte128VectorTests extends AbstractVectorTest {
assertArraysEquals(r, a, mask, Byte128VectorTests::REVERSE_BYTES);
}
static boolean band(boolean a, boolean b) {
return a & b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskandByte128VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.and(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Byte128VectorTests::band);
}
static boolean bor(boolean a, boolean b) {
return a | b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskorByte128VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.or(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Byte128VectorTests::bor);
}
static boolean bxor(boolean a, boolean b) {
return a != b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskxorByte128VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.xor(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Byte128VectorTests::bxor);
}
static boolean bandNot(boolean a, boolean b) {
return a & !b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskandNotByte128VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.andNot(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Byte128VectorTests::bandNot);
}
static boolean beq(boolean a, boolean b) {
return a == b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskeqByte128VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.eq(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Byte128VectorTests::beq);
}
static boolean unot(boolean a) {
return !a;
}
@Test(dataProvider = "boolMaskUnaryOpProvider")
static void masknotByte128VectorTests(IntFunction<boolean[]> fa) {
boolean[] a = fa.apply(SPECIES.length());
boolean[] r = new boolean[a.length];
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
av.not().intoArray(r, i);
}
}
assertArraysEquals(r, a, Byte128VectorTests::unot);
}
private static final long LONG_MASK_BITS = 0xFFFFFFFFFFFFFFFFL >>> (64 - SPECIES.length());
static void assertArraysEquals(long[] r, long[] a, long bits) {
int i = 0;
try {
for (; i < a.length; i++) {
Assert.assertEquals(r[i], a[i] & bits);
}
} catch (AssertionError e) {
Assert.assertEquals(r[i], a[i] & bits, "(" + a[i] + ") at index #" + i);
}
}
@Test(dataProvider = "longMaskProvider")
static void maskFromToLongByte128VectorTests(IntFunction<long[]> fa) {
long[] a = fa.apply(SPECIES.length());
long[] r = new long[a.length];
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i++) {
VectorMask vmask = VectorMask.fromLong(SPECIES, a[i]);
r[i] = vmask.toLong();
}
}
assertArraysEquals(r, a, LONG_MASK_BITS);
}
@Test(dataProvider = "byteCompareOpProvider")
static void ltByte128VectorTestsBroadcastSmokeTest(IntFunction<byte[]> fa, IntFunction<byte[]> fb) {
byte[] a = fa.apply(SPECIES.length());
@ -6700,115 +6890,22 @@ public class Byte128VectorTests extends AbstractVectorTest {
}
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskEqualsByte128VectorTestsSmokeTest(IntFunction<boolean[]> fa, IntFunction<boolean[]> fb) {
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskEqualsByte128VectorTests(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));
for (int ic = 0; ic < INVOC_COUNT; ic++) {
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 maskAndByte128VectorTestsSmokeTest(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, Byte128VectorTests::band);
}
static boolean bor(boolean a, boolean b) {
return a | b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskOrByte128VectorTestsSmokeTest(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, Byte128VectorTests::bor);
}
static boolean bxor(boolean a, boolean b) {
return a != b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskXorByte128VectorTestsSmokeTest(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, Byte128VectorTests::bxor);
}
static boolean bandNot(boolean a, boolean b) {
return a & !b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskAndNotByte128VectorTestsSmokeTest(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, Byte128VectorTests::bandNot);
}
static boolean beq(boolean a, boolean b) {
return (a == b);
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskEqByte128VectorTestsSmokeTest(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, Byte128VectorTests::beq);
}
@Test(dataProvider = "maskProvider")
static void maskHashCodeByte128VectorTestsSmokeTest(IntFunction<boolean[]> fa) {
boolean[] a = fa.apply(SPECIES.length());
@ -6913,23 +7010,6 @@ public class Byte128VectorTests extends AbstractVectorTest {
}
}
@DataProvider
public static Object[][] longMaskProvider() {
return new Object[][]{
{0xFFFFFFFFFFFFFFFFL},
{0x0000000000000000L},
{0x5555555555555555L},
{0x0123456789abcdefL},
};
}
@Test(dataProvider = "longMaskProvider")
static void maskFromToLongByte128VectorTestsSmokeTest(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[][]{

View File

@ -393,6 +393,36 @@ public class Byte256VectorTests extends AbstractVectorTest {
}
}
interface FBoolUnOp {
boolean apply(boolean a);
}
static void assertArraysEquals(boolean[] r, boolean[] a, FBoolUnOp 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]), "(" + a[i] + ") at index #" + i);
}
}
interface FBoolBinOp {
boolean apply(boolean a, boolean b);
}
static void assertArraysEquals(boolean[] r, boolean[] a, boolean[] b, FBoolBinOp 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);
}
}
interface FBinOp {
byte apply(byte a, byte b);
}
@ -1095,12 +1125,6 @@ public class Byte256VectorTests extends AbstractVectorTest {
.flatMap(pair -> BYTE_SATURATING_GENERATORS_ASSOC.stream().map(f -> List.of(pair.get(0), pair.get(1), f)))
.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().
@ -1232,8 +1256,23 @@ public class Byte256VectorTests extends AbstractVectorTest {
}
@DataProvider
public Object[][] maskCompareOpProvider() {
return BOOLEAN_MASK_COMPARE_GENERATOR_PAIRS.stream().map(List::toArray).
public Object[][] longMaskProvider() {
return LONG_MASK_GENERATORS.stream().
map(f -> new Object[]{f}).
toArray(Object[][]::new);
}
@DataProvider
public Object[][] boolMaskBinaryOpProvider() {
return BOOLEAN_MASK_COMPARE_GENERATOR_PAIRS.stream().
map(List::toArray).
toArray(Object[][]::new);
}
@DataProvider
public Object[][] boolMaskUnaryOpProvider() {
return BOOLEAN_MASK_GENERATORS.stream().
map(f -> new Object[]{f}).
toArray(Object[][]::new);
}
@ -4464,7 +4503,7 @@ public class Byte256VectorTests extends AbstractVectorTest {
return res;
}
@Test(dataProvider = "boolUnaryOpProvider")
@Test(dataProvider = "boolMaskUnaryOpProvider")
static void anyTrueByte256VectorTests(IntFunction<boolean[]> fm) {
boolean[] mask = fm.apply(SPECIES.length());
boolean[] r = fmr.apply(SPECIES.length());
@ -4488,7 +4527,7 @@ public class Byte256VectorTests extends AbstractVectorTest {
return res;
}
@Test(dataProvider = "boolUnaryOpProvider")
@Test(dataProvider = "boolMaskUnaryOpProvider")
static void allTrueByte256VectorTests(IntFunction<boolean[]> fm) {
boolean[] mask = fm.apply(SPECIES.length());
boolean[] r = fmr.apply(SPECIES.length());
@ -6390,6 +6429,157 @@ public class Byte256VectorTests extends AbstractVectorTest {
assertArraysEquals(r, a, mask, Byte256VectorTests::REVERSE_BYTES);
}
static boolean band(boolean a, boolean b) {
return a & b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskandByte256VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.and(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Byte256VectorTests::band);
}
static boolean bor(boolean a, boolean b) {
return a | b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskorByte256VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.or(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Byte256VectorTests::bor);
}
static boolean bxor(boolean a, boolean b) {
return a != b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskxorByte256VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.xor(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Byte256VectorTests::bxor);
}
static boolean bandNot(boolean a, boolean b) {
return a & !b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskandNotByte256VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.andNot(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Byte256VectorTests::bandNot);
}
static boolean beq(boolean a, boolean b) {
return a == b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskeqByte256VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.eq(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Byte256VectorTests::beq);
}
static boolean unot(boolean a) {
return !a;
}
@Test(dataProvider = "boolMaskUnaryOpProvider")
static void masknotByte256VectorTests(IntFunction<boolean[]> fa) {
boolean[] a = fa.apply(SPECIES.length());
boolean[] r = new boolean[a.length];
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
av.not().intoArray(r, i);
}
}
assertArraysEquals(r, a, Byte256VectorTests::unot);
}
private static final long LONG_MASK_BITS = 0xFFFFFFFFFFFFFFFFL >>> (64 - SPECIES.length());
static void assertArraysEquals(long[] r, long[] a, long bits) {
int i = 0;
try {
for (; i < a.length; i++) {
Assert.assertEquals(r[i], a[i] & bits);
}
} catch (AssertionError e) {
Assert.assertEquals(r[i], a[i] & bits, "(" + a[i] + ") at index #" + i);
}
}
@Test(dataProvider = "longMaskProvider")
static void maskFromToLongByte256VectorTests(IntFunction<long[]> fa) {
long[] a = fa.apply(SPECIES.length());
long[] r = new long[a.length];
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i++) {
VectorMask vmask = VectorMask.fromLong(SPECIES, a[i]);
r[i] = vmask.toLong();
}
}
assertArraysEquals(r, a, LONG_MASK_BITS);
}
@Test(dataProvider = "byteCompareOpProvider")
static void ltByte256VectorTestsBroadcastSmokeTest(IntFunction<byte[]> fa, IntFunction<byte[]> fb) {
byte[] a = fa.apply(SPECIES.length());
@ -6700,115 +6890,22 @@ public class Byte256VectorTests extends AbstractVectorTest {
}
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskEqualsByte256VectorTestsSmokeTest(IntFunction<boolean[]> fa, IntFunction<boolean[]> fb) {
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskEqualsByte256VectorTests(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));
for (int ic = 0; ic < INVOC_COUNT; ic++) {
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 maskAndByte256VectorTestsSmokeTest(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, Byte256VectorTests::band);
}
static boolean bor(boolean a, boolean b) {
return a | b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskOrByte256VectorTestsSmokeTest(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, Byte256VectorTests::bor);
}
static boolean bxor(boolean a, boolean b) {
return a != b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskXorByte256VectorTestsSmokeTest(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, Byte256VectorTests::bxor);
}
static boolean bandNot(boolean a, boolean b) {
return a & !b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskAndNotByte256VectorTestsSmokeTest(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, Byte256VectorTests::bandNot);
}
static boolean beq(boolean a, boolean b) {
return (a == b);
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskEqByte256VectorTestsSmokeTest(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, Byte256VectorTests::beq);
}
@Test(dataProvider = "maskProvider")
static void maskHashCodeByte256VectorTestsSmokeTest(IntFunction<boolean[]> fa) {
boolean[] a = fa.apply(SPECIES.length());
@ -6913,23 +7010,6 @@ public class Byte256VectorTests extends AbstractVectorTest {
}
}
@DataProvider
public static Object[][] longMaskProvider() {
return new Object[][]{
{0xFFFFFFFFFFFFFFFFL},
{0x0000000000000000L},
{0x5555555555555555L},
{0x0123456789abcdefL},
};
}
@Test(dataProvider = "longMaskProvider")
static void maskFromToLongByte256VectorTestsSmokeTest(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[][]{

View File

@ -393,6 +393,36 @@ public class Byte512VectorTests extends AbstractVectorTest {
}
}
interface FBoolUnOp {
boolean apply(boolean a);
}
static void assertArraysEquals(boolean[] r, boolean[] a, FBoolUnOp 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]), "(" + a[i] + ") at index #" + i);
}
}
interface FBoolBinOp {
boolean apply(boolean a, boolean b);
}
static void assertArraysEquals(boolean[] r, boolean[] a, boolean[] b, FBoolBinOp 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);
}
}
interface FBinOp {
byte apply(byte a, byte b);
}
@ -1095,12 +1125,6 @@ public class Byte512VectorTests extends AbstractVectorTest {
.flatMap(pair -> BYTE_SATURATING_GENERATORS_ASSOC.stream().map(f -> List.of(pair.get(0), pair.get(1), f)))
.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().
@ -1232,8 +1256,23 @@ public class Byte512VectorTests extends AbstractVectorTest {
}
@DataProvider
public Object[][] maskCompareOpProvider() {
return BOOLEAN_MASK_COMPARE_GENERATOR_PAIRS.stream().map(List::toArray).
public Object[][] longMaskProvider() {
return LONG_MASK_GENERATORS.stream().
map(f -> new Object[]{f}).
toArray(Object[][]::new);
}
@DataProvider
public Object[][] boolMaskBinaryOpProvider() {
return BOOLEAN_MASK_COMPARE_GENERATOR_PAIRS.stream().
map(List::toArray).
toArray(Object[][]::new);
}
@DataProvider
public Object[][] boolMaskUnaryOpProvider() {
return BOOLEAN_MASK_GENERATORS.stream().
map(f -> new Object[]{f}).
toArray(Object[][]::new);
}
@ -4464,7 +4503,7 @@ public class Byte512VectorTests extends AbstractVectorTest {
return res;
}
@Test(dataProvider = "boolUnaryOpProvider")
@Test(dataProvider = "boolMaskUnaryOpProvider")
static void anyTrueByte512VectorTests(IntFunction<boolean[]> fm) {
boolean[] mask = fm.apply(SPECIES.length());
boolean[] r = fmr.apply(SPECIES.length());
@ -4488,7 +4527,7 @@ public class Byte512VectorTests extends AbstractVectorTest {
return res;
}
@Test(dataProvider = "boolUnaryOpProvider")
@Test(dataProvider = "boolMaskUnaryOpProvider")
static void allTrueByte512VectorTests(IntFunction<boolean[]> fm) {
boolean[] mask = fm.apply(SPECIES.length());
boolean[] r = fmr.apply(SPECIES.length());
@ -6390,6 +6429,157 @@ public class Byte512VectorTests extends AbstractVectorTest {
assertArraysEquals(r, a, mask, Byte512VectorTests::REVERSE_BYTES);
}
static boolean band(boolean a, boolean b) {
return a & b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskandByte512VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.and(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Byte512VectorTests::band);
}
static boolean bor(boolean a, boolean b) {
return a | b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskorByte512VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.or(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Byte512VectorTests::bor);
}
static boolean bxor(boolean a, boolean b) {
return a != b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskxorByte512VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.xor(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Byte512VectorTests::bxor);
}
static boolean bandNot(boolean a, boolean b) {
return a & !b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskandNotByte512VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.andNot(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Byte512VectorTests::bandNot);
}
static boolean beq(boolean a, boolean b) {
return a == b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskeqByte512VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.eq(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Byte512VectorTests::beq);
}
static boolean unot(boolean a) {
return !a;
}
@Test(dataProvider = "boolMaskUnaryOpProvider")
static void masknotByte512VectorTests(IntFunction<boolean[]> fa) {
boolean[] a = fa.apply(SPECIES.length());
boolean[] r = new boolean[a.length];
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
av.not().intoArray(r, i);
}
}
assertArraysEquals(r, a, Byte512VectorTests::unot);
}
private static final long LONG_MASK_BITS = 0xFFFFFFFFFFFFFFFFL >>> (64 - SPECIES.length());
static void assertArraysEquals(long[] r, long[] a, long bits) {
int i = 0;
try {
for (; i < a.length; i++) {
Assert.assertEquals(r[i], a[i] & bits);
}
} catch (AssertionError e) {
Assert.assertEquals(r[i], a[i] & bits, "(" + a[i] + ") at index #" + i);
}
}
@Test(dataProvider = "longMaskProvider")
static void maskFromToLongByte512VectorTests(IntFunction<long[]> fa) {
long[] a = fa.apply(SPECIES.length());
long[] r = new long[a.length];
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i++) {
VectorMask vmask = VectorMask.fromLong(SPECIES, a[i]);
r[i] = vmask.toLong();
}
}
assertArraysEquals(r, a, LONG_MASK_BITS);
}
@Test(dataProvider = "byteCompareOpProvider")
static void ltByte512VectorTestsBroadcastSmokeTest(IntFunction<byte[]> fa, IntFunction<byte[]> fb) {
byte[] a = fa.apply(SPECIES.length());
@ -6700,115 +6890,22 @@ public class Byte512VectorTests extends AbstractVectorTest {
}
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskEqualsByte512VectorTestsSmokeTest(IntFunction<boolean[]> fa, IntFunction<boolean[]> fb) {
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskEqualsByte512VectorTests(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));
for (int ic = 0; ic < INVOC_COUNT; ic++) {
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 maskAndByte512VectorTestsSmokeTest(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, Byte512VectorTests::band);
}
static boolean bor(boolean a, boolean b) {
return a | b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskOrByte512VectorTestsSmokeTest(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, Byte512VectorTests::bor);
}
static boolean bxor(boolean a, boolean b) {
return a != b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskXorByte512VectorTestsSmokeTest(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, Byte512VectorTests::bxor);
}
static boolean bandNot(boolean a, boolean b) {
return a & !b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskAndNotByte512VectorTestsSmokeTest(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, Byte512VectorTests::bandNot);
}
static boolean beq(boolean a, boolean b) {
return (a == b);
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskEqByte512VectorTestsSmokeTest(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, Byte512VectorTests::beq);
}
@Test(dataProvider = "maskProvider")
static void maskHashCodeByte512VectorTestsSmokeTest(IntFunction<boolean[]> fa) {
boolean[] a = fa.apply(SPECIES.length());
@ -6913,23 +7010,6 @@ public class Byte512VectorTests extends AbstractVectorTest {
}
}
@DataProvider
public static Object[][] longMaskProvider() {
return new Object[][]{
{0xFFFFFFFFFFFFFFFFL},
{0x0000000000000000L},
{0x5555555555555555L},
{0x0123456789abcdefL},
};
}
@Test(dataProvider = "longMaskProvider")
static void maskFromToLongByte512VectorTestsSmokeTest(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[][]{

View File

@ -393,6 +393,36 @@ public class Byte64VectorTests extends AbstractVectorTest {
}
}
interface FBoolUnOp {
boolean apply(boolean a);
}
static void assertArraysEquals(boolean[] r, boolean[] a, FBoolUnOp 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]), "(" + a[i] + ") at index #" + i);
}
}
interface FBoolBinOp {
boolean apply(boolean a, boolean b);
}
static void assertArraysEquals(boolean[] r, boolean[] a, boolean[] b, FBoolBinOp 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);
}
}
interface FBinOp {
byte apply(byte a, byte b);
}
@ -1095,12 +1125,6 @@ public class Byte64VectorTests extends AbstractVectorTest {
.flatMap(pair -> BYTE_SATURATING_GENERATORS_ASSOC.stream().map(f -> List.of(pair.get(0), pair.get(1), f)))
.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().
@ -1232,8 +1256,23 @@ public class Byte64VectorTests extends AbstractVectorTest {
}
@DataProvider
public Object[][] maskCompareOpProvider() {
return BOOLEAN_MASK_COMPARE_GENERATOR_PAIRS.stream().map(List::toArray).
public Object[][] longMaskProvider() {
return LONG_MASK_GENERATORS.stream().
map(f -> new Object[]{f}).
toArray(Object[][]::new);
}
@DataProvider
public Object[][] boolMaskBinaryOpProvider() {
return BOOLEAN_MASK_COMPARE_GENERATOR_PAIRS.stream().
map(List::toArray).
toArray(Object[][]::new);
}
@DataProvider
public Object[][] boolMaskUnaryOpProvider() {
return BOOLEAN_MASK_GENERATORS.stream().
map(f -> new Object[]{f}).
toArray(Object[][]::new);
}
@ -4464,7 +4503,7 @@ public class Byte64VectorTests extends AbstractVectorTest {
return res;
}
@Test(dataProvider = "boolUnaryOpProvider")
@Test(dataProvider = "boolMaskUnaryOpProvider")
static void anyTrueByte64VectorTests(IntFunction<boolean[]> fm) {
boolean[] mask = fm.apply(SPECIES.length());
boolean[] r = fmr.apply(SPECIES.length());
@ -4488,7 +4527,7 @@ public class Byte64VectorTests extends AbstractVectorTest {
return res;
}
@Test(dataProvider = "boolUnaryOpProvider")
@Test(dataProvider = "boolMaskUnaryOpProvider")
static void allTrueByte64VectorTests(IntFunction<boolean[]> fm) {
boolean[] mask = fm.apply(SPECIES.length());
boolean[] r = fmr.apply(SPECIES.length());
@ -6390,6 +6429,157 @@ public class Byte64VectorTests extends AbstractVectorTest {
assertArraysEquals(r, a, mask, Byte64VectorTests::REVERSE_BYTES);
}
static boolean band(boolean a, boolean b) {
return a & b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskandByte64VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.and(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Byte64VectorTests::band);
}
static boolean bor(boolean a, boolean b) {
return a | b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskorByte64VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.or(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Byte64VectorTests::bor);
}
static boolean bxor(boolean a, boolean b) {
return a != b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskxorByte64VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.xor(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Byte64VectorTests::bxor);
}
static boolean bandNot(boolean a, boolean b) {
return a & !b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskandNotByte64VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.andNot(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Byte64VectorTests::bandNot);
}
static boolean beq(boolean a, boolean b) {
return a == b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskeqByte64VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.eq(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Byte64VectorTests::beq);
}
static boolean unot(boolean a) {
return !a;
}
@Test(dataProvider = "boolMaskUnaryOpProvider")
static void masknotByte64VectorTests(IntFunction<boolean[]> fa) {
boolean[] a = fa.apply(SPECIES.length());
boolean[] r = new boolean[a.length];
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
av.not().intoArray(r, i);
}
}
assertArraysEquals(r, a, Byte64VectorTests::unot);
}
private static final long LONG_MASK_BITS = 0xFFFFFFFFFFFFFFFFL >>> (64 - SPECIES.length());
static void assertArraysEquals(long[] r, long[] a, long bits) {
int i = 0;
try {
for (; i < a.length; i++) {
Assert.assertEquals(r[i], a[i] & bits);
}
} catch (AssertionError e) {
Assert.assertEquals(r[i], a[i] & bits, "(" + a[i] + ") at index #" + i);
}
}
@Test(dataProvider = "longMaskProvider")
static void maskFromToLongByte64VectorTests(IntFunction<long[]> fa) {
long[] a = fa.apply(SPECIES.length());
long[] r = new long[a.length];
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i++) {
VectorMask vmask = VectorMask.fromLong(SPECIES, a[i]);
r[i] = vmask.toLong();
}
}
assertArraysEquals(r, a, LONG_MASK_BITS);
}
@Test(dataProvider = "byteCompareOpProvider")
static void ltByte64VectorTestsBroadcastSmokeTest(IntFunction<byte[]> fa, IntFunction<byte[]> fb) {
byte[] a = fa.apply(SPECIES.length());
@ -6700,115 +6890,22 @@ public class Byte64VectorTests extends AbstractVectorTest {
}
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskEqualsByte64VectorTestsSmokeTest(IntFunction<boolean[]> fa, IntFunction<boolean[]> fb) {
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskEqualsByte64VectorTests(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));
for (int ic = 0; ic < INVOC_COUNT; ic++) {
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());
@ -6913,23 +7010,6 @@ public class Byte64VectorTests extends AbstractVectorTest {
}
}
@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[][]{

View File

@ -398,6 +398,36 @@ public class ByteMaxVectorTests extends AbstractVectorTest {
}
}
interface FBoolUnOp {
boolean apply(boolean a);
}
static void assertArraysEquals(boolean[] r, boolean[] a, FBoolUnOp 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]), "(" + a[i] + ") at index #" + i);
}
}
interface FBoolBinOp {
boolean apply(boolean a, boolean b);
}
static void assertArraysEquals(boolean[] r, boolean[] a, boolean[] b, FBoolBinOp 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);
}
}
interface FBinOp {
byte apply(byte a, byte b);
}
@ -1100,12 +1130,6 @@ public class ByteMaxVectorTests extends AbstractVectorTest {
.flatMap(pair -> BYTE_SATURATING_GENERATORS_ASSOC.stream().map(f -> List.of(pair.get(0), pair.get(1), f)))
.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().
@ -1237,8 +1261,23 @@ public class ByteMaxVectorTests extends AbstractVectorTest {
}
@DataProvider
public Object[][] maskCompareOpProvider() {
return BOOLEAN_MASK_COMPARE_GENERATOR_PAIRS.stream().map(List::toArray).
public Object[][] longMaskProvider() {
return LONG_MASK_GENERATORS.stream().
map(f -> new Object[]{f}).
toArray(Object[][]::new);
}
@DataProvider
public Object[][] boolMaskBinaryOpProvider() {
return BOOLEAN_MASK_COMPARE_GENERATOR_PAIRS.stream().
map(List::toArray).
toArray(Object[][]::new);
}
@DataProvider
public Object[][] boolMaskUnaryOpProvider() {
return BOOLEAN_MASK_GENERATORS.stream().
map(f -> new Object[]{f}).
toArray(Object[][]::new);
}
@ -4469,7 +4508,7 @@ public class ByteMaxVectorTests extends AbstractVectorTest {
return res;
}
@Test(dataProvider = "boolUnaryOpProvider")
@Test(dataProvider = "boolMaskUnaryOpProvider")
static void anyTrueByteMaxVectorTests(IntFunction<boolean[]> fm) {
boolean[] mask = fm.apply(SPECIES.length());
boolean[] r = fmr.apply(SPECIES.length());
@ -4493,7 +4532,7 @@ public class ByteMaxVectorTests extends AbstractVectorTest {
return res;
}
@Test(dataProvider = "boolUnaryOpProvider")
@Test(dataProvider = "boolMaskUnaryOpProvider")
static void allTrueByteMaxVectorTests(IntFunction<boolean[]> fm) {
boolean[] mask = fm.apply(SPECIES.length());
boolean[] r = fmr.apply(SPECIES.length());
@ -6395,6 +6434,157 @@ public class ByteMaxVectorTests extends AbstractVectorTest {
assertArraysEquals(r, a, mask, ByteMaxVectorTests::REVERSE_BYTES);
}
static boolean band(boolean a, boolean b) {
return a & b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskandByteMaxVectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.and(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, ByteMaxVectorTests::band);
}
static boolean bor(boolean a, boolean b) {
return a | b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskorByteMaxVectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.or(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, ByteMaxVectorTests::bor);
}
static boolean bxor(boolean a, boolean b) {
return a != b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskxorByteMaxVectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.xor(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, ByteMaxVectorTests::bxor);
}
static boolean bandNot(boolean a, boolean b) {
return a & !b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskandNotByteMaxVectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.andNot(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, ByteMaxVectorTests::bandNot);
}
static boolean beq(boolean a, boolean b) {
return a == b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskeqByteMaxVectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.eq(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, ByteMaxVectorTests::beq);
}
static boolean unot(boolean a) {
return !a;
}
@Test(dataProvider = "boolMaskUnaryOpProvider")
static void masknotByteMaxVectorTests(IntFunction<boolean[]> fa) {
boolean[] a = fa.apply(SPECIES.length());
boolean[] r = new boolean[a.length];
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
av.not().intoArray(r, i);
}
}
assertArraysEquals(r, a, ByteMaxVectorTests::unot);
}
private static final long LONG_MASK_BITS = 0xFFFFFFFFFFFFFFFFL >>> (64 - SPECIES.length());
static void assertArraysEquals(long[] r, long[] a, long bits) {
int i = 0;
try {
for (; i < a.length; i++) {
Assert.assertEquals(r[i], a[i] & bits);
}
} catch (AssertionError e) {
Assert.assertEquals(r[i], a[i] & bits, "(" + a[i] + ") at index #" + i);
}
}
@Test(dataProvider = "longMaskProvider")
static void maskFromToLongByteMaxVectorTests(IntFunction<long[]> fa) {
long[] a = fa.apply(SPECIES.length());
long[] r = new long[a.length];
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i++) {
VectorMask vmask = VectorMask.fromLong(SPECIES, a[i]);
r[i] = vmask.toLong();
}
}
assertArraysEquals(r, a, LONG_MASK_BITS);
}
@Test(dataProvider = "byteCompareOpProvider")
static void ltByteMaxVectorTestsBroadcastSmokeTest(IntFunction<byte[]> fa, IntFunction<byte[]> fb) {
byte[] a = fa.apply(SPECIES.length());
@ -6705,115 +6895,22 @@ public class ByteMaxVectorTests extends AbstractVectorTest {
}
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskEqualsByteMaxVectorTestsSmokeTest(IntFunction<boolean[]> fa, IntFunction<boolean[]> fb) {
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskEqualsByteMaxVectorTests(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));
for (int ic = 0; ic < INVOC_COUNT; ic++) {
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 maskAndByteMaxVectorTestsSmokeTest(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, ByteMaxVectorTests::band);
}
static boolean bor(boolean a, boolean b) {
return a | b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskOrByteMaxVectorTestsSmokeTest(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, ByteMaxVectorTests::bor);
}
static boolean bxor(boolean a, boolean b) {
return a != b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskXorByteMaxVectorTestsSmokeTest(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, ByteMaxVectorTests::bxor);
}
static boolean bandNot(boolean a, boolean b) {
return a & !b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskAndNotByteMaxVectorTestsSmokeTest(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, ByteMaxVectorTests::bandNot);
}
static boolean beq(boolean a, boolean b) {
return (a == b);
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskEqByteMaxVectorTestsSmokeTest(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, ByteMaxVectorTests::beq);
}
@Test(dataProvider = "maskProvider")
static void maskHashCodeByteMaxVectorTestsSmokeTest(IntFunction<boolean[]> fa) {
boolean[] a = fa.apply(SPECIES.length());
@ -6918,7 +7015,6 @@ public class ByteMaxVectorTests extends AbstractVectorTest {
}
}
@DataProvider
public static Object[][] offsetProvider() {
return new Object[][]{

View File

@ -411,6 +411,36 @@ relativeError));
}
}
interface FBoolUnOp {
boolean apply(boolean a);
}
static void assertArraysEquals(boolean[] r, boolean[] a, FBoolUnOp 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]), "(" + a[i] + ") at index #" + i);
}
}
interface FBoolBinOp {
boolean apply(boolean a, boolean b);
}
static void assertArraysEquals(boolean[] r, boolean[] a, boolean[] b, FBoolBinOp 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);
}
}
interface FBinOp {
double apply(double a, double b);
}
@ -1187,12 +1217,6 @@ relativeError));
flatMap(fa -> DOUBLE_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<double[]>>> DOUBLE_GENERATOR_TRIPLES =
DOUBLE_GENERATOR_PAIRS.stream().
@ -1291,8 +1315,23 @@ relativeError));
}
@DataProvider
public Object[][] maskCompareOpProvider() {
return BOOLEAN_MASK_COMPARE_GENERATOR_PAIRS.stream().map(List::toArray).
public Object[][] longMaskProvider() {
return LONG_MASK_GENERATORS.stream().
map(f -> new Object[]{f}).
toArray(Object[][]::new);
}
@DataProvider
public Object[][] boolMaskBinaryOpProvider() {
return BOOLEAN_MASK_COMPARE_GENERATOR_PAIRS.stream().
map(List::toArray).
toArray(Object[][]::new);
}
@DataProvider
public Object[][] boolMaskUnaryOpProvider() {
return BOOLEAN_MASK_GENERATORS.stream().
map(f -> new Object[]{f}).
toArray(Object[][]::new);
}
@ -4806,6 +4845,157 @@ relativeError));
assertArraysEquals(r, a, mask, Double128VectorTests::SQRT);
}
static boolean band(boolean a, boolean b) {
return a & b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskandDouble128VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.and(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Double128VectorTests::band);
}
static boolean bor(boolean a, boolean b) {
return a | b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskorDouble128VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.or(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Double128VectorTests::bor);
}
static boolean bxor(boolean a, boolean b) {
return a != b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskxorDouble128VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.xor(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Double128VectorTests::bxor);
}
static boolean bandNot(boolean a, boolean b) {
return a & !b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskandNotDouble128VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.andNot(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Double128VectorTests::bandNot);
}
static boolean beq(boolean a, boolean b) {
return a == b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskeqDouble128VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.eq(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Double128VectorTests::beq);
}
static boolean unot(boolean a) {
return !a;
}
@Test(dataProvider = "boolMaskUnaryOpProvider")
static void masknotDouble128VectorTests(IntFunction<boolean[]> fa) {
boolean[] a = fa.apply(SPECIES.length());
boolean[] r = new boolean[a.length];
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
av.not().intoArray(r, i);
}
}
assertArraysEquals(r, a, Double128VectorTests::unot);
}
private static final long LONG_MASK_BITS = 0xFFFFFFFFFFFFFFFFL >>> (64 - SPECIES.length());
static void assertArraysEquals(long[] r, long[] a, long bits) {
int i = 0;
try {
for (; i < a.length; i++) {
Assert.assertEquals(r[i], a[i] & bits);
}
} catch (AssertionError e) {
Assert.assertEquals(r[i], a[i] & bits, "(" + a[i] + ") at index #" + i);
}
}
@Test(dataProvider = "longMaskProvider")
static void maskFromToLongDouble128VectorTests(IntFunction<long[]> fa) {
long[] a = fa.apply(SPECIES.length());
long[] r = new long[a.length];
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i++) {
VectorMask vmask = VectorMask.fromLong(SPECIES, a[i]);
r[i] = vmask.toLong();
}
}
assertArraysEquals(r, a, LONG_MASK_BITS);
}
@Test(dataProvider = "doubleCompareOpProvider")
static void ltDouble128VectorTestsBroadcastSmokeTest(IntFunction<double[]> fa, IntFunction<double[]> fb) {
double[] a = fa.apply(SPECIES.length());
@ -5095,115 +5285,22 @@ relativeError));
}
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskEqualsDouble128VectorTestsSmokeTest(IntFunction<boolean[]> fa, IntFunction<boolean[]> fb) {
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskEqualsDouble128VectorTests(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));
for (int ic = 0; ic < INVOC_COUNT; ic++) {
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 maskAndDouble128VectorTestsSmokeTest(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, Double128VectorTests::band);
}
static boolean bor(boolean a, boolean b) {
return a | b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskOrDouble128VectorTestsSmokeTest(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, Double128VectorTests::bor);
}
static boolean bxor(boolean a, boolean b) {
return a != b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskXorDouble128VectorTestsSmokeTest(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, Double128VectorTests::bxor);
}
static boolean bandNot(boolean a, boolean b) {
return a & !b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskAndNotDouble128VectorTestsSmokeTest(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, Double128VectorTests::bandNot);
}
static boolean beq(boolean a, boolean b) {
return (a == b);
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskEqDouble128VectorTestsSmokeTest(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, Double128VectorTests::beq);
}
@Test(dataProvider = "maskProvider")
static void maskHashCodeDouble128VectorTestsSmokeTest(IntFunction<boolean[]> fa) {
boolean[] a = fa.apply(SPECIES.length());
@ -5308,23 +5405,6 @@ relativeError));
}
}
@DataProvider
public static Object[][] longMaskProvider() {
return new Object[][]{
{0xFFFFFFFFFFFFFFFFL},
{0x0000000000000000L},
{0x5555555555555555L},
{0x0123456789abcdefL},
};
}
@Test(dataProvider = "longMaskProvider")
static void maskFromToLongDouble128VectorTestsSmokeTest(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[][]{

View File

@ -411,6 +411,36 @@ relativeError));
}
}
interface FBoolUnOp {
boolean apply(boolean a);
}
static void assertArraysEquals(boolean[] r, boolean[] a, FBoolUnOp 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]), "(" + a[i] + ") at index #" + i);
}
}
interface FBoolBinOp {
boolean apply(boolean a, boolean b);
}
static void assertArraysEquals(boolean[] r, boolean[] a, boolean[] b, FBoolBinOp 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);
}
}
interface FBinOp {
double apply(double a, double b);
}
@ -1187,12 +1217,6 @@ relativeError));
flatMap(fa -> DOUBLE_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<double[]>>> DOUBLE_GENERATOR_TRIPLES =
DOUBLE_GENERATOR_PAIRS.stream().
@ -1291,8 +1315,23 @@ relativeError));
}
@DataProvider
public Object[][] maskCompareOpProvider() {
return BOOLEAN_MASK_COMPARE_GENERATOR_PAIRS.stream().map(List::toArray).
public Object[][] longMaskProvider() {
return LONG_MASK_GENERATORS.stream().
map(f -> new Object[]{f}).
toArray(Object[][]::new);
}
@DataProvider
public Object[][] boolMaskBinaryOpProvider() {
return BOOLEAN_MASK_COMPARE_GENERATOR_PAIRS.stream().
map(List::toArray).
toArray(Object[][]::new);
}
@DataProvider
public Object[][] boolMaskUnaryOpProvider() {
return BOOLEAN_MASK_GENERATORS.stream().
map(f -> new Object[]{f}).
toArray(Object[][]::new);
}
@ -4806,6 +4845,157 @@ relativeError));
assertArraysEquals(r, a, mask, Double256VectorTests::SQRT);
}
static boolean band(boolean a, boolean b) {
return a & b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskandDouble256VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.and(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Double256VectorTests::band);
}
static boolean bor(boolean a, boolean b) {
return a | b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskorDouble256VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.or(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Double256VectorTests::bor);
}
static boolean bxor(boolean a, boolean b) {
return a != b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskxorDouble256VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.xor(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Double256VectorTests::bxor);
}
static boolean bandNot(boolean a, boolean b) {
return a & !b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskandNotDouble256VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.andNot(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Double256VectorTests::bandNot);
}
static boolean beq(boolean a, boolean b) {
return a == b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskeqDouble256VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.eq(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Double256VectorTests::beq);
}
static boolean unot(boolean a) {
return !a;
}
@Test(dataProvider = "boolMaskUnaryOpProvider")
static void masknotDouble256VectorTests(IntFunction<boolean[]> fa) {
boolean[] a = fa.apply(SPECIES.length());
boolean[] r = new boolean[a.length];
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
av.not().intoArray(r, i);
}
}
assertArraysEquals(r, a, Double256VectorTests::unot);
}
private static final long LONG_MASK_BITS = 0xFFFFFFFFFFFFFFFFL >>> (64 - SPECIES.length());
static void assertArraysEquals(long[] r, long[] a, long bits) {
int i = 0;
try {
for (; i < a.length; i++) {
Assert.assertEquals(r[i], a[i] & bits);
}
} catch (AssertionError e) {
Assert.assertEquals(r[i], a[i] & bits, "(" + a[i] + ") at index #" + i);
}
}
@Test(dataProvider = "longMaskProvider")
static void maskFromToLongDouble256VectorTests(IntFunction<long[]> fa) {
long[] a = fa.apply(SPECIES.length());
long[] r = new long[a.length];
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i++) {
VectorMask vmask = VectorMask.fromLong(SPECIES, a[i]);
r[i] = vmask.toLong();
}
}
assertArraysEquals(r, a, LONG_MASK_BITS);
}
@Test(dataProvider = "doubleCompareOpProvider")
static void ltDouble256VectorTestsBroadcastSmokeTest(IntFunction<double[]> fa, IntFunction<double[]> fb) {
double[] a = fa.apply(SPECIES.length());
@ -5095,115 +5285,22 @@ relativeError));
}
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskEqualsDouble256VectorTestsSmokeTest(IntFunction<boolean[]> fa, IntFunction<boolean[]> fb) {
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskEqualsDouble256VectorTests(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));
for (int ic = 0; ic < INVOC_COUNT; ic++) {
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 maskAndDouble256VectorTestsSmokeTest(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, Double256VectorTests::band);
}
static boolean bor(boolean a, boolean b) {
return a | b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskOrDouble256VectorTestsSmokeTest(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, Double256VectorTests::bor);
}
static boolean bxor(boolean a, boolean b) {
return a != b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskXorDouble256VectorTestsSmokeTest(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, Double256VectorTests::bxor);
}
static boolean bandNot(boolean a, boolean b) {
return a & !b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskAndNotDouble256VectorTestsSmokeTest(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, Double256VectorTests::bandNot);
}
static boolean beq(boolean a, boolean b) {
return (a == b);
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskEqDouble256VectorTestsSmokeTest(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, Double256VectorTests::beq);
}
@Test(dataProvider = "maskProvider")
static void maskHashCodeDouble256VectorTestsSmokeTest(IntFunction<boolean[]> fa) {
boolean[] a = fa.apply(SPECIES.length());
@ -5308,23 +5405,6 @@ relativeError));
}
}
@DataProvider
public static Object[][] longMaskProvider() {
return new Object[][]{
{0xFFFFFFFFFFFFFFFFL},
{0x0000000000000000L},
{0x5555555555555555L},
{0x0123456789abcdefL},
};
}
@Test(dataProvider = "longMaskProvider")
static void maskFromToLongDouble256VectorTestsSmokeTest(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[][]{

View File

@ -411,6 +411,36 @@ relativeError));
}
}
interface FBoolUnOp {
boolean apply(boolean a);
}
static void assertArraysEquals(boolean[] r, boolean[] a, FBoolUnOp 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]), "(" + a[i] + ") at index #" + i);
}
}
interface FBoolBinOp {
boolean apply(boolean a, boolean b);
}
static void assertArraysEquals(boolean[] r, boolean[] a, boolean[] b, FBoolBinOp 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);
}
}
interface FBinOp {
double apply(double a, double b);
}
@ -1187,12 +1217,6 @@ relativeError));
flatMap(fa -> DOUBLE_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<double[]>>> DOUBLE_GENERATOR_TRIPLES =
DOUBLE_GENERATOR_PAIRS.stream().
@ -1291,8 +1315,23 @@ relativeError));
}
@DataProvider
public Object[][] maskCompareOpProvider() {
return BOOLEAN_MASK_COMPARE_GENERATOR_PAIRS.stream().map(List::toArray).
public Object[][] longMaskProvider() {
return LONG_MASK_GENERATORS.stream().
map(f -> new Object[]{f}).
toArray(Object[][]::new);
}
@DataProvider
public Object[][] boolMaskBinaryOpProvider() {
return BOOLEAN_MASK_COMPARE_GENERATOR_PAIRS.stream().
map(List::toArray).
toArray(Object[][]::new);
}
@DataProvider
public Object[][] boolMaskUnaryOpProvider() {
return BOOLEAN_MASK_GENERATORS.stream().
map(f -> new Object[]{f}).
toArray(Object[][]::new);
}
@ -4806,6 +4845,157 @@ relativeError));
assertArraysEquals(r, a, mask, Double512VectorTests::SQRT);
}
static boolean band(boolean a, boolean b) {
return a & b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskandDouble512VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.and(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Double512VectorTests::band);
}
static boolean bor(boolean a, boolean b) {
return a | b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskorDouble512VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.or(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Double512VectorTests::bor);
}
static boolean bxor(boolean a, boolean b) {
return a != b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskxorDouble512VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.xor(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Double512VectorTests::bxor);
}
static boolean bandNot(boolean a, boolean b) {
return a & !b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskandNotDouble512VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.andNot(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Double512VectorTests::bandNot);
}
static boolean beq(boolean a, boolean b) {
return a == b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskeqDouble512VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.eq(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Double512VectorTests::beq);
}
static boolean unot(boolean a) {
return !a;
}
@Test(dataProvider = "boolMaskUnaryOpProvider")
static void masknotDouble512VectorTests(IntFunction<boolean[]> fa) {
boolean[] a = fa.apply(SPECIES.length());
boolean[] r = new boolean[a.length];
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
av.not().intoArray(r, i);
}
}
assertArraysEquals(r, a, Double512VectorTests::unot);
}
private static final long LONG_MASK_BITS = 0xFFFFFFFFFFFFFFFFL >>> (64 - SPECIES.length());
static void assertArraysEquals(long[] r, long[] a, long bits) {
int i = 0;
try {
for (; i < a.length; i++) {
Assert.assertEquals(r[i], a[i] & bits);
}
} catch (AssertionError e) {
Assert.assertEquals(r[i], a[i] & bits, "(" + a[i] + ") at index #" + i);
}
}
@Test(dataProvider = "longMaskProvider")
static void maskFromToLongDouble512VectorTests(IntFunction<long[]> fa) {
long[] a = fa.apply(SPECIES.length());
long[] r = new long[a.length];
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i++) {
VectorMask vmask = VectorMask.fromLong(SPECIES, a[i]);
r[i] = vmask.toLong();
}
}
assertArraysEquals(r, a, LONG_MASK_BITS);
}
@Test(dataProvider = "doubleCompareOpProvider")
static void ltDouble512VectorTestsBroadcastSmokeTest(IntFunction<double[]> fa, IntFunction<double[]> fb) {
double[] a = fa.apply(SPECIES.length());
@ -5095,115 +5285,22 @@ relativeError));
}
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskEqualsDouble512VectorTestsSmokeTest(IntFunction<boolean[]> fa, IntFunction<boolean[]> fb) {
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskEqualsDouble512VectorTests(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));
for (int ic = 0; ic < INVOC_COUNT; ic++) {
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 maskAndDouble512VectorTestsSmokeTest(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, Double512VectorTests::band);
}
static boolean bor(boolean a, boolean b) {
return a | b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskOrDouble512VectorTestsSmokeTest(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, Double512VectorTests::bor);
}
static boolean bxor(boolean a, boolean b) {
return a != b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskXorDouble512VectorTestsSmokeTest(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, Double512VectorTests::bxor);
}
static boolean bandNot(boolean a, boolean b) {
return a & !b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskAndNotDouble512VectorTestsSmokeTest(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, Double512VectorTests::bandNot);
}
static boolean beq(boolean a, boolean b) {
return (a == b);
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskEqDouble512VectorTestsSmokeTest(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, Double512VectorTests::beq);
}
@Test(dataProvider = "maskProvider")
static void maskHashCodeDouble512VectorTestsSmokeTest(IntFunction<boolean[]> fa) {
boolean[] a = fa.apply(SPECIES.length());
@ -5308,23 +5405,6 @@ relativeError));
}
}
@DataProvider
public static Object[][] longMaskProvider() {
return new Object[][]{
{0xFFFFFFFFFFFFFFFFL},
{0x0000000000000000L},
{0x5555555555555555L},
{0x0123456789abcdefL},
};
}
@Test(dataProvider = "longMaskProvider")
static void maskFromToLongDouble512VectorTestsSmokeTest(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[][]{

View File

@ -411,6 +411,36 @@ relativeError));
}
}
interface FBoolUnOp {
boolean apply(boolean a);
}
static void assertArraysEquals(boolean[] r, boolean[] a, FBoolUnOp 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]), "(" + a[i] + ") at index #" + i);
}
}
interface FBoolBinOp {
boolean apply(boolean a, boolean b);
}
static void assertArraysEquals(boolean[] r, boolean[] a, boolean[] b, FBoolBinOp 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);
}
}
interface FBinOp {
double apply(double a, double b);
}
@ -1187,12 +1217,6 @@ relativeError));
flatMap(fa -> DOUBLE_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<double[]>>> DOUBLE_GENERATOR_TRIPLES =
DOUBLE_GENERATOR_PAIRS.stream().
@ -1291,8 +1315,23 @@ relativeError));
}
@DataProvider
public Object[][] maskCompareOpProvider() {
return BOOLEAN_MASK_COMPARE_GENERATOR_PAIRS.stream().map(List::toArray).
public Object[][] longMaskProvider() {
return LONG_MASK_GENERATORS.stream().
map(f -> new Object[]{f}).
toArray(Object[][]::new);
}
@DataProvider
public Object[][] boolMaskBinaryOpProvider() {
return BOOLEAN_MASK_COMPARE_GENERATOR_PAIRS.stream().
map(List::toArray).
toArray(Object[][]::new);
}
@DataProvider
public Object[][] boolMaskUnaryOpProvider() {
return BOOLEAN_MASK_GENERATORS.stream().
map(f -> new Object[]{f}).
toArray(Object[][]::new);
}
@ -4806,6 +4845,157 @@ relativeError));
assertArraysEquals(r, a, mask, Double64VectorTests::SQRT);
}
static boolean band(boolean a, boolean b) {
return a & b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskandDouble64VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.and(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Double64VectorTests::band);
}
static boolean bor(boolean a, boolean b) {
return a | b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskorDouble64VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.or(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Double64VectorTests::bor);
}
static boolean bxor(boolean a, boolean b) {
return a != b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskxorDouble64VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.xor(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Double64VectorTests::bxor);
}
static boolean bandNot(boolean a, boolean b) {
return a & !b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskandNotDouble64VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.andNot(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Double64VectorTests::bandNot);
}
static boolean beq(boolean a, boolean b) {
return a == b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskeqDouble64VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.eq(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Double64VectorTests::beq);
}
static boolean unot(boolean a) {
return !a;
}
@Test(dataProvider = "boolMaskUnaryOpProvider")
static void masknotDouble64VectorTests(IntFunction<boolean[]> fa) {
boolean[] a = fa.apply(SPECIES.length());
boolean[] r = new boolean[a.length];
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
av.not().intoArray(r, i);
}
}
assertArraysEquals(r, a, Double64VectorTests::unot);
}
private static final long LONG_MASK_BITS = 0xFFFFFFFFFFFFFFFFL >>> (64 - SPECIES.length());
static void assertArraysEquals(long[] r, long[] a, long bits) {
int i = 0;
try {
for (; i < a.length; i++) {
Assert.assertEquals(r[i], a[i] & bits);
}
} catch (AssertionError e) {
Assert.assertEquals(r[i], a[i] & bits, "(" + a[i] + ") at index #" + i);
}
}
@Test(dataProvider = "longMaskProvider")
static void maskFromToLongDouble64VectorTests(IntFunction<long[]> fa) {
long[] a = fa.apply(SPECIES.length());
long[] r = new long[a.length];
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i++) {
VectorMask vmask = VectorMask.fromLong(SPECIES, a[i]);
r[i] = vmask.toLong();
}
}
assertArraysEquals(r, a, LONG_MASK_BITS);
}
@Test(dataProvider = "doubleCompareOpProvider")
static void ltDouble64VectorTestsBroadcastSmokeTest(IntFunction<double[]> fa, IntFunction<double[]> fb) {
double[] a = fa.apply(SPECIES.length());
@ -5095,115 +5285,22 @@ relativeError));
}
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskEqualsDouble64VectorTestsSmokeTest(IntFunction<boolean[]> fa, IntFunction<boolean[]> fb) {
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskEqualsDouble64VectorTests(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));
for (int ic = 0; ic < INVOC_COUNT; ic++) {
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 maskAndDouble64VectorTestsSmokeTest(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, Double64VectorTests::band);
}
static boolean bor(boolean a, boolean b) {
return a | b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskOrDouble64VectorTestsSmokeTest(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, Double64VectorTests::bor);
}
static boolean bxor(boolean a, boolean b) {
return a != b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskXorDouble64VectorTestsSmokeTest(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, Double64VectorTests::bxor);
}
static boolean bandNot(boolean a, boolean b) {
return a & !b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskAndNotDouble64VectorTestsSmokeTest(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, Double64VectorTests::bandNot);
}
static boolean beq(boolean a, boolean b) {
return (a == b);
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskEqDouble64VectorTestsSmokeTest(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, Double64VectorTests::beq);
}
@Test(dataProvider = "maskProvider")
static void maskHashCodeDouble64VectorTestsSmokeTest(IntFunction<boolean[]> fa) {
boolean[] a = fa.apply(SPECIES.length());
@ -5308,23 +5405,6 @@ relativeError));
}
}
@DataProvider
public static Object[][] longMaskProvider() {
return new Object[][]{
{0xFFFFFFFFFFFFFFFFL},
{0x0000000000000000L},
{0x5555555555555555L},
{0x0123456789abcdefL},
};
}
@Test(dataProvider = "longMaskProvider")
static void maskFromToLongDouble64VectorTestsSmokeTest(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[][]{

View File

@ -416,6 +416,36 @@ relativeError));
}
}
interface FBoolUnOp {
boolean apply(boolean a);
}
static void assertArraysEquals(boolean[] r, boolean[] a, FBoolUnOp 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]), "(" + a[i] + ") at index #" + i);
}
}
interface FBoolBinOp {
boolean apply(boolean a, boolean b);
}
static void assertArraysEquals(boolean[] r, boolean[] a, boolean[] b, FBoolBinOp 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);
}
}
interface FBinOp {
double apply(double a, double b);
}
@ -1192,12 +1222,6 @@ relativeError));
flatMap(fa -> DOUBLE_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<double[]>>> DOUBLE_GENERATOR_TRIPLES =
DOUBLE_GENERATOR_PAIRS.stream().
@ -1296,8 +1320,23 @@ relativeError));
}
@DataProvider
public Object[][] maskCompareOpProvider() {
return BOOLEAN_MASK_COMPARE_GENERATOR_PAIRS.stream().map(List::toArray).
public Object[][] longMaskProvider() {
return LONG_MASK_GENERATORS.stream().
map(f -> new Object[]{f}).
toArray(Object[][]::new);
}
@DataProvider
public Object[][] boolMaskBinaryOpProvider() {
return BOOLEAN_MASK_COMPARE_GENERATOR_PAIRS.stream().
map(List::toArray).
toArray(Object[][]::new);
}
@DataProvider
public Object[][] boolMaskUnaryOpProvider() {
return BOOLEAN_MASK_GENERATORS.stream().
map(f -> new Object[]{f}).
toArray(Object[][]::new);
}
@ -4811,6 +4850,157 @@ relativeError));
assertArraysEquals(r, a, mask, DoubleMaxVectorTests::SQRT);
}
static boolean band(boolean a, boolean b) {
return a & b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskandDoubleMaxVectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.and(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, DoubleMaxVectorTests::band);
}
static boolean bor(boolean a, boolean b) {
return a | b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskorDoubleMaxVectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.or(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, DoubleMaxVectorTests::bor);
}
static boolean bxor(boolean a, boolean b) {
return a != b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskxorDoubleMaxVectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.xor(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, DoubleMaxVectorTests::bxor);
}
static boolean bandNot(boolean a, boolean b) {
return a & !b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskandNotDoubleMaxVectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.andNot(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, DoubleMaxVectorTests::bandNot);
}
static boolean beq(boolean a, boolean b) {
return a == b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskeqDoubleMaxVectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.eq(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, DoubleMaxVectorTests::beq);
}
static boolean unot(boolean a) {
return !a;
}
@Test(dataProvider = "boolMaskUnaryOpProvider")
static void masknotDoubleMaxVectorTests(IntFunction<boolean[]> fa) {
boolean[] a = fa.apply(SPECIES.length());
boolean[] r = new boolean[a.length];
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
av.not().intoArray(r, i);
}
}
assertArraysEquals(r, a, DoubleMaxVectorTests::unot);
}
private static final long LONG_MASK_BITS = 0xFFFFFFFFFFFFFFFFL >>> (64 - SPECIES.length());
static void assertArraysEquals(long[] r, long[] a, long bits) {
int i = 0;
try {
for (; i < a.length; i++) {
Assert.assertEquals(r[i], a[i] & bits);
}
} catch (AssertionError e) {
Assert.assertEquals(r[i], a[i] & bits, "(" + a[i] + ") at index #" + i);
}
}
@Test(dataProvider = "longMaskProvider")
static void maskFromToLongDoubleMaxVectorTests(IntFunction<long[]> fa) {
long[] a = fa.apply(SPECIES.length());
long[] r = new long[a.length];
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i++) {
VectorMask vmask = VectorMask.fromLong(SPECIES, a[i]);
r[i] = vmask.toLong();
}
}
assertArraysEquals(r, a, LONG_MASK_BITS);
}
@Test(dataProvider = "doubleCompareOpProvider")
static void ltDoubleMaxVectorTestsBroadcastSmokeTest(IntFunction<double[]> fa, IntFunction<double[]> fb) {
double[] a = fa.apply(SPECIES.length());
@ -5100,115 +5290,22 @@ relativeError));
}
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskEqualsDoubleMaxVectorTestsSmokeTest(IntFunction<boolean[]> fa, IntFunction<boolean[]> fb) {
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskEqualsDoubleMaxVectorTests(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));
for (int ic = 0; ic < INVOC_COUNT; ic++) {
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 maskAndDoubleMaxVectorTestsSmokeTest(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, DoubleMaxVectorTests::band);
}
static boolean bor(boolean a, boolean b) {
return a | b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskOrDoubleMaxVectorTestsSmokeTest(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, DoubleMaxVectorTests::bor);
}
static boolean bxor(boolean a, boolean b) {
return a != b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskXorDoubleMaxVectorTestsSmokeTest(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, DoubleMaxVectorTests::bxor);
}
static boolean bandNot(boolean a, boolean b) {
return a & !b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskAndNotDoubleMaxVectorTestsSmokeTest(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, DoubleMaxVectorTests::bandNot);
}
static boolean beq(boolean a, boolean b) {
return (a == b);
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskEqDoubleMaxVectorTestsSmokeTest(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, DoubleMaxVectorTests::beq);
}
@Test(dataProvider = "maskProvider")
static void maskHashCodeDoubleMaxVectorTestsSmokeTest(IntFunction<boolean[]> fa) {
boolean[] a = fa.apply(SPECIES.length());
@ -5313,7 +5410,6 @@ relativeError));
}
}
@DataProvider
public static Object[][] offsetProvider() {
return new Object[][]{

View File

@ -411,6 +411,36 @@ relativeError));
}
}
interface FBoolUnOp {
boolean apply(boolean a);
}
static void assertArraysEquals(boolean[] r, boolean[] a, FBoolUnOp 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]), "(" + a[i] + ") at index #" + i);
}
}
interface FBoolBinOp {
boolean apply(boolean a, boolean b);
}
static void assertArraysEquals(boolean[] r, boolean[] a, boolean[] b, FBoolBinOp 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);
}
}
interface FBinOp {
float apply(float a, float b);
}
@ -1198,12 +1228,6 @@ relativeError));
flatMap(fa -> FLOAT_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<float[]>>> FLOAT_GENERATOR_TRIPLES =
FLOAT_GENERATOR_PAIRS.stream().
@ -1302,8 +1326,23 @@ relativeError));
}
@DataProvider
public Object[][] maskCompareOpProvider() {
return BOOLEAN_MASK_COMPARE_GENERATOR_PAIRS.stream().map(List::toArray).
public Object[][] longMaskProvider() {
return LONG_MASK_GENERATORS.stream().
map(f -> new Object[]{f}).
toArray(Object[][]::new);
}
@DataProvider
public Object[][] boolMaskBinaryOpProvider() {
return BOOLEAN_MASK_COMPARE_GENERATOR_PAIRS.stream().
map(List::toArray).
toArray(Object[][]::new);
}
@DataProvider
public Object[][] boolMaskUnaryOpProvider() {
return BOOLEAN_MASK_GENERATORS.stream().
map(f -> new Object[]{f}).
toArray(Object[][]::new);
}
@ -4775,6 +4814,157 @@ relativeError));
assertArraysEquals(r, a, mask, Float128VectorTests::SQRT);
}
static boolean band(boolean a, boolean b) {
return a & b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskandFloat128VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.and(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Float128VectorTests::band);
}
static boolean bor(boolean a, boolean b) {
return a | b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskorFloat128VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.or(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Float128VectorTests::bor);
}
static boolean bxor(boolean a, boolean b) {
return a != b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskxorFloat128VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.xor(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Float128VectorTests::bxor);
}
static boolean bandNot(boolean a, boolean b) {
return a & !b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskandNotFloat128VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.andNot(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Float128VectorTests::bandNot);
}
static boolean beq(boolean a, boolean b) {
return a == b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskeqFloat128VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.eq(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Float128VectorTests::beq);
}
static boolean unot(boolean a) {
return !a;
}
@Test(dataProvider = "boolMaskUnaryOpProvider")
static void masknotFloat128VectorTests(IntFunction<boolean[]> fa) {
boolean[] a = fa.apply(SPECIES.length());
boolean[] r = new boolean[a.length];
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
av.not().intoArray(r, i);
}
}
assertArraysEquals(r, a, Float128VectorTests::unot);
}
private static final long LONG_MASK_BITS = 0xFFFFFFFFFFFFFFFFL >>> (64 - SPECIES.length());
static void assertArraysEquals(long[] r, long[] a, long bits) {
int i = 0;
try {
for (; i < a.length; i++) {
Assert.assertEquals(r[i], a[i] & bits);
}
} catch (AssertionError e) {
Assert.assertEquals(r[i], a[i] & bits, "(" + a[i] + ") at index #" + i);
}
}
@Test(dataProvider = "longMaskProvider")
static void maskFromToLongFloat128VectorTests(IntFunction<long[]> fa) {
long[] a = fa.apply(SPECIES.length());
long[] r = new long[a.length];
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i++) {
VectorMask vmask = VectorMask.fromLong(SPECIES, a[i]);
r[i] = vmask.toLong();
}
}
assertArraysEquals(r, a, LONG_MASK_BITS);
}
@Test(dataProvider = "floatCompareOpProvider")
static void ltFloat128VectorTestsBroadcastSmokeTest(IntFunction<float[]> fa, IntFunction<float[]> fb) {
float[] a = fa.apply(SPECIES.length());
@ -5074,115 +5264,22 @@ relativeError));
}
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskEqualsFloat128VectorTestsSmokeTest(IntFunction<boolean[]> fa, IntFunction<boolean[]> fb) {
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskEqualsFloat128VectorTests(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));
for (int ic = 0; ic < INVOC_COUNT; ic++) {
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 maskAndFloat128VectorTestsSmokeTest(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, Float128VectorTests::band);
}
static boolean bor(boolean a, boolean b) {
return a | b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskOrFloat128VectorTestsSmokeTest(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, Float128VectorTests::bor);
}
static boolean bxor(boolean a, boolean b) {
return a != b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskXorFloat128VectorTestsSmokeTest(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, Float128VectorTests::bxor);
}
static boolean bandNot(boolean a, boolean b) {
return a & !b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskAndNotFloat128VectorTestsSmokeTest(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, Float128VectorTests::bandNot);
}
static boolean beq(boolean a, boolean b) {
return (a == b);
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskEqFloat128VectorTestsSmokeTest(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, Float128VectorTests::beq);
}
@Test(dataProvider = "maskProvider")
static void maskHashCodeFloat128VectorTestsSmokeTest(IntFunction<boolean[]> fa) {
boolean[] a = fa.apply(SPECIES.length());
@ -5287,23 +5384,6 @@ relativeError));
}
}
@DataProvider
public static Object[][] longMaskProvider() {
return new Object[][]{
{0xFFFFFFFFFFFFFFFFL},
{0x0000000000000000L},
{0x5555555555555555L},
{0x0123456789abcdefL},
};
}
@Test(dataProvider = "longMaskProvider")
static void maskFromToLongFloat128VectorTestsSmokeTest(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[][]{

View File

@ -411,6 +411,36 @@ relativeError));
}
}
interface FBoolUnOp {
boolean apply(boolean a);
}
static void assertArraysEquals(boolean[] r, boolean[] a, FBoolUnOp 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]), "(" + a[i] + ") at index #" + i);
}
}
interface FBoolBinOp {
boolean apply(boolean a, boolean b);
}
static void assertArraysEquals(boolean[] r, boolean[] a, boolean[] b, FBoolBinOp 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);
}
}
interface FBinOp {
float apply(float a, float b);
}
@ -1198,12 +1228,6 @@ relativeError));
flatMap(fa -> FLOAT_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<float[]>>> FLOAT_GENERATOR_TRIPLES =
FLOAT_GENERATOR_PAIRS.stream().
@ -1302,8 +1326,23 @@ relativeError));
}
@DataProvider
public Object[][] maskCompareOpProvider() {
return BOOLEAN_MASK_COMPARE_GENERATOR_PAIRS.stream().map(List::toArray).
public Object[][] longMaskProvider() {
return LONG_MASK_GENERATORS.stream().
map(f -> new Object[]{f}).
toArray(Object[][]::new);
}
@DataProvider
public Object[][] boolMaskBinaryOpProvider() {
return BOOLEAN_MASK_COMPARE_GENERATOR_PAIRS.stream().
map(List::toArray).
toArray(Object[][]::new);
}
@DataProvider
public Object[][] boolMaskUnaryOpProvider() {
return BOOLEAN_MASK_GENERATORS.stream().
map(f -> new Object[]{f}).
toArray(Object[][]::new);
}
@ -4775,6 +4814,157 @@ relativeError));
assertArraysEquals(r, a, mask, Float256VectorTests::SQRT);
}
static boolean band(boolean a, boolean b) {
return a & b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskandFloat256VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.and(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Float256VectorTests::band);
}
static boolean bor(boolean a, boolean b) {
return a | b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskorFloat256VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.or(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Float256VectorTests::bor);
}
static boolean bxor(boolean a, boolean b) {
return a != b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskxorFloat256VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.xor(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Float256VectorTests::bxor);
}
static boolean bandNot(boolean a, boolean b) {
return a & !b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskandNotFloat256VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.andNot(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Float256VectorTests::bandNot);
}
static boolean beq(boolean a, boolean b) {
return a == b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskeqFloat256VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.eq(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Float256VectorTests::beq);
}
static boolean unot(boolean a) {
return !a;
}
@Test(dataProvider = "boolMaskUnaryOpProvider")
static void masknotFloat256VectorTests(IntFunction<boolean[]> fa) {
boolean[] a = fa.apply(SPECIES.length());
boolean[] r = new boolean[a.length];
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
av.not().intoArray(r, i);
}
}
assertArraysEquals(r, a, Float256VectorTests::unot);
}
private static final long LONG_MASK_BITS = 0xFFFFFFFFFFFFFFFFL >>> (64 - SPECIES.length());
static void assertArraysEquals(long[] r, long[] a, long bits) {
int i = 0;
try {
for (; i < a.length; i++) {
Assert.assertEquals(r[i], a[i] & bits);
}
} catch (AssertionError e) {
Assert.assertEquals(r[i], a[i] & bits, "(" + a[i] + ") at index #" + i);
}
}
@Test(dataProvider = "longMaskProvider")
static void maskFromToLongFloat256VectorTests(IntFunction<long[]> fa) {
long[] a = fa.apply(SPECIES.length());
long[] r = new long[a.length];
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i++) {
VectorMask vmask = VectorMask.fromLong(SPECIES, a[i]);
r[i] = vmask.toLong();
}
}
assertArraysEquals(r, a, LONG_MASK_BITS);
}
@Test(dataProvider = "floatCompareOpProvider")
static void ltFloat256VectorTestsBroadcastSmokeTest(IntFunction<float[]> fa, IntFunction<float[]> fb) {
float[] a = fa.apply(SPECIES.length());
@ -5074,115 +5264,22 @@ relativeError));
}
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskEqualsFloat256VectorTestsSmokeTest(IntFunction<boolean[]> fa, IntFunction<boolean[]> fb) {
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskEqualsFloat256VectorTests(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));
for (int ic = 0; ic < INVOC_COUNT; ic++) {
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 maskAndFloat256VectorTestsSmokeTest(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, Float256VectorTests::band);
}
static boolean bor(boolean a, boolean b) {
return a | b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskOrFloat256VectorTestsSmokeTest(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, Float256VectorTests::bor);
}
static boolean bxor(boolean a, boolean b) {
return a != b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskXorFloat256VectorTestsSmokeTest(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, Float256VectorTests::bxor);
}
static boolean bandNot(boolean a, boolean b) {
return a & !b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskAndNotFloat256VectorTestsSmokeTest(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, Float256VectorTests::bandNot);
}
static boolean beq(boolean a, boolean b) {
return (a == b);
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskEqFloat256VectorTestsSmokeTest(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, Float256VectorTests::beq);
}
@Test(dataProvider = "maskProvider")
static void maskHashCodeFloat256VectorTestsSmokeTest(IntFunction<boolean[]> fa) {
boolean[] a = fa.apply(SPECIES.length());
@ -5287,23 +5384,6 @@ relativeError));
}
}
@DataProvider
public static Object[][] longMaskProvider() {
return new Object[][]{
{0xFFFFFFFFFFFFFFFFL},
{0x0000000000000000L},
{0x5555555555555555L},
{0x0123456789abcdefL},
};
}
@Test(dataProvider = "longMaskProvider")
static void maskFromToLongFloat256VectorTestsSmokeTest(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[][]{

View File

@ -411,6 +411,36 @@ relativeError));
}
}
interface FBoolUnOp {
boolean apply(boolean a);
}
static void assertArraysEquals(boolean[] r, boolean[] a, FBoolUnOp 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]), "(" + a[i] + ") at index #" + i);
}
}
interface FBoolBinOp {
boolean apply(boolean a, boolean b);
}
static void assertArraysEquals(boolean[] r, boolean[] a, boolean[] b, FBoolBinOp 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);
}
}
interface FBinOp {
float apply(float a, float b);
}
@ -1198,12 +1228,6 @@ relativeError));
flatMap(fa -> FLOAT_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<float[]>>> FLOAT_GENERATOR_TRIPLES =
FLOAT_GENERATOR_PAIRS.stream().
@ -1302,8 +1326,23 @@ relativeError));
}
@DataProvider
public Object[][] maskCompareOpProvider() {
return BOOLEAN_MASK_COMPARE_GENERATOR_PAIRS.stream().map(List::toArray).
public Object[][] longMaskProvider() {
return LONG_MASK_GENERATORS.stream().
map(f -> new Object[]{f}).
toArray(Object[][]::new);
}
@DataProvider
public Object[][] boolMaskBinaryOpProvider() {
return BOOLEAN_MASK_COMPARE_GENERATOR_PAIRS.stream().
map(List::toArray).
toArray(Object[][]::new);
}
@DataProvider
public Object[][] boolMaskUnaryOpProvider() {
return BOOLEAN_MASK_GENERATORS.stream().
map(f -> new Object[]{f}).
toArray(Object[][]::new);
}
@ -4775,6 +4814,157 @@ relativeError));
assertArraysEquals(r, a, mask, Float512VectorTests::SQRT);
}
static boolean band(boolean a, boolean b) {
return a & b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskandFloat512VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.and(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Float512VectorTests::band);
}
static boolean bor(boolean a, boolean b) {
return a | b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskorFloat512VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.or(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Float512VectorTests::bor);
}
static boolean bxor(boolean a, boolean b) {
return a != b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskxorFloat512VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.xor(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Float512VectorTests::bxor);
}
static boolean bandNot(boolean a, boolean b) {
return a & !b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskandNotFloat512VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.andNot(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Float512VectorTests::bandNot);
}
static boolean beq(boolean a, boolean b) {
return a == b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskeqFloat512VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.eq(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Float512VectorTests::beq);
}
static boolean unot(boolean a) {
return !a;
}
@Test(dataProvider = "boolMaskUnaryOpProvider")
static void masknotFloat512VectorTests(IntFunction<boolean[]> fa) {
boolean[] a = fa.apply(SPECIES.length());
boolean[] r = new boolean[a.length];
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
av.not().intoArray(r, i);
}
}
assertArraysEquals(r, a, Float512VectorTests::unot);
}
private static final long LONG_MASK_BITS = 0xFFFFFFFFFFFFFFFFL >>> (64 - SPECIES.length());
static void assertArraysEquals(long[] r, long[] a, long bits) {
int i = 0;
try {
for (; i < a.length; i++) {
Assert.assertEquals(r[i], a[i] & bits);
}
} catch (AssertionError e) {
Assert.assertEquals(r[i], a[i] & bits, "(" + a[i] + ") at index #" + i);
}
}
@Test(dataProvider = "longMaskProvider")
static void maskFromToLongFloat512VectorTests(IntFunction<long[]> fa) {
long[] a = fa.apply(SPECIES.length());
long[] r = new long[a.length];
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i++) {
VectorMask vmask = VectorMask.fromLong(SPECIES, a[i]);
r[i] = vmask.toLong();
}
}
assertArraysEquals(r, a, LONG_MASK_BITS);
}
@Test(dataProvider = "floatCompareOpProvider")
static void ltFloat512VectorTestsBroadcastSmokeTest(IntFunction<float[]> fa, IntFunction<float[]> fb) {
float[] a = fa.apply(SPECIES.length());
@ -5074,115 +5264,22 @@ relativeError));
}
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskEqualsFloat512VectorTestsSmokeTest(IntFunction<boolean[]> fa, IntFunction<boolean[]> fb) {
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskEqualsFloat512VectorTests(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));
for (int ic = 0; ic < INVOC_COUNT; ic++) {
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 maskAndFloat512VectorTestsSmokeTest(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, Float512VectorTests::band);
}
static boolean bor(boolean a, boolean b) {
return a | b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskOrFloat512VectorTestsSmokeTest(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, Float512VectorTests::bor);
}
static boolean bxor(boolean a, boolean b) {
return a != b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskXorFloat512VectorTestsSmokeTest(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, Float512VectorTests::bxor);
}
static boolean bandNot(boolean a, boolean b) {
return a & !b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskAndNotFloat512VectorTestsSmokeTest(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, Float512VectorTests::bandNot);
}
static boolean beq(boolean a, boolean b) {
return (a == b);
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskEqFloat512VectorTestsSmokeTest(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, Float512VectorTests::beq);
}
@Test(dataProvider = "maskProvider")
static void maskHashCodeFloat512VectorTestsSmokeTest(IntFunction<boolean[]> fa) {
boolean[] a = fa.apply(SPECIES.length());
@ -5287,23 +5384,6 @@ relativeError));
}
}
@DataProvider
public static Object[][] longMaskProvider() {
return new Object[][]{
{0xFFFFFFFFFFFFFFFFL},
{0x0000000000000000L},
{0x5555555555555555L},
{0x0123456789abcdefL},
};
}
@Test(dataProvider = "longMaskProvider")
static void maskFromToLongFloat512VectorTestsSmokeTest(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[][]{

View File

@ -411,6 +411,36 @@ relativeError));
}
}
interface FBoolUnOp {
boolean apply(boolean a);
}
static void assertArraysEquals(boolean[] r, boolean[] a, FBoolUnOp 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]), "(" + a[i] + ") at index #" + i);
}
}
interface FBoolBinOp {
boolean apply(boolean a, boolean b);
}
static void assertArraysEquals(boolean[] r, boolean[] a, boolean[] b, FBoolBinOp 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);
}
}
interface FBinOp {
float apply(float a, float b);
}
@ -1198,12 +1228,6 @@ relativeError));
flatMap(fa -> FLOAT_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<float[]>>> FLOAT_GENERATOR_TRIPLES =
FLOAT_GENERATOR_PAIRS.stream().
@ -1302,8 +1326,23 @@ relativeError));
}
@DataProvider
public Object[][] maskCompareOpProvider() {
return BOOLEAN_MASK_COMPARE_GENERATOR_PAIRS.stream().map(List::toArray).
public Object[][] longMaskProvider() {
return LONG_MASK_GENERATORS.stream().
map(f -> new Object[]{f}).
toArray(Object[][]::new);
}
@DataProvider
public Object[][] boolMaskBinaryOpProvider() {
return BOOLEAN_MASK_COMPARE_GENERATOR_PAIRS.stream().
map(List::toArray).
toArray(Object[][]::new);
}
@DataProvider
public Object[][] boolMaskUnaryOpProvider() {
return BOOLEAN_MASK_GENERATORS.stream().
map(f -> new Object[]{f}).
toArray(Object[][]::new);
}
@ -4775,6 +4814,157 @@ relativeError));
assertArraysEquals(r, a, mask, Float64VectorTests::SQRT);
}
static boolean band(boolean a, boolean b) {
return a & b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskandFloat64VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.and(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Float64VectorTests::band);
}
static boolean bor(boolean a, boolean b) {
return a | b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskorFloat64VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.or(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Float64VectorTests::bor);
}
static boolean bxor(boolean a, boolean b) {
return a != b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskxorFloat64VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.xor(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Float64VectorTests::bxor);
}
static boolean bandNot(boolean a, boolean b) {
return a & !b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskandNotFloat64VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.andNot(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Float64VectorTests::bandNot);
}
static boolean beq(boolean a, boolean b) {
return a == b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskeqFloat64VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.eq(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Float64VectorTests::beq);
}
static boolean unot(boolean a) {
return !a;
}
@Test(dataProvider = "boolMaskUnaryOpProvider")
static void masknotFloat64VectorTests(IntFunction<boolean[]> fa) {
boolean[] a = fa.apply(SPECIES.length());
boolean[] r = new boolean[a.length];
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
av.not().intoArray(r, i);
}
}
assertArraysEquals(r, a, Float64VectorTests::unot);
}
private static final long LONG_MASK_BITS = 0xFFFFFFFFFFFFFFFFL >>> (64 - SPECIES.length());
static void assertArraysEquals(long[] r, long[] a, long bits) {
int i = 0;
try {
for (; i < a.length; i++) {
Assert.assertEquals(r[i], a[i] & bits);
}
} catch (AssertionError e) {
Assert.assertEquals(r[i], a[i] & bits, "(" + a[i] + ") at index #" + i);
}
}
@Test(dataProvider = "longMaskProvider")
static void maskFromToLongFloat64VectorTests(IntFunction<long[]> fa) {
long[] a = fa.apply(SPECIES.length());
long[] r = new long[a.length];
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i++) {
VectorMask vmask = VectorMask.fromLong(SPECIES, a[i]);
r[i] = vmask.toLong();
}
}
assertArraysEquals(r, a, LONG_MASK_BITS);
}
@Test(dataProvider = "floatCompareOpProvider")
static void ltFloat64VectorTestsBroadcastSmokeTest(IntFunction<float[]> fa, IntFunction<float[]> fb) {
float[] a = fa.apply(SPECIES.length());
@ -5074,115 +5264,22 @@ relativeError));
}
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskEqualsFloat64VectorTestsSmokeTest(IntFunction<boolean[]> fa, IntFunction<boolean[]> fb) {
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskEqualsFloat64VectorTests(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));
for (int ic = 0; ic < INVOC_COUNT; ic++) {
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 maskAndFloat64VectorTestsSmokeTest(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, Float64VectorTests::band);
}
static boolean bor(boolean a, boolean b) {
return a | b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskOrFloat64VectorTestsSmokeTest(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, Float64VectorTests::bor);
}
static boolean bxor(boolean a, boolean b) {
return a != b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskXorFloat64VectorTestsSmokeTest(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, Float64VectorTests::bxor);
}
static boolean bandNot(boolean a, boolean b) {
return a & !b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskAndNotFloat64VectorTestsSmokeTest(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, Float64VectorTests::bandNot);
}
static boolean beq(boolean a, boolean b) {
return (a == b);
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskEqFloat64VectorTestsSmokeTest(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, Float64VectorTests::beq);
}
@Test(dataProvider = "maskProvider")
static void maskHashCodeFloat64VectorTestsSmokeTest(IntFunction<boolean[]> fa) {
boolean[] a = fa.apply(SPECIES.length());
@ -5287,23 +5384,6 @@ relativeError));
}
}
@DataProvider
public static Object[][] longMaskProvider() {
return new Object[][]{
{0xFFFFFFFFFFFFFFFFL},
{0x0000000000000000L},
{0x5555555555555555L},
{0x0123456789abcdefL},
};
}
@Test(dataProvider = "longMaskProvider")
static void maskFromToLongFloat64VectorTestsSmokeTest(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[][]{

View File

@ -416,6 +416,36 @@ relativeError));
}
}
interface FBoolUnOp {
boolean apply(boolean a);
}
static void assertArraysEquals(boolean[] r, boolean[] a, FBoolUnOp 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]), "(" + a[i] + ") at index #" + i);
}
}
interface FBoolBinOp {
boolean apply(boolean a, boolean b);
}
static void assertArraysEquals(boolean[] r, boolean[] a, boolean[] b, FBoolBinOp 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);
}
}
interface FBinOp {
float apply(float a, float b);
}
@ -1203,12 +1233,6 @@ relativeError));
flatMap(fa -> FLOAT_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<float[]>>> FLOAT_GENERATOR_TRIPLES =
FLOAT_GENERATOR_PAIRS.stream().
@ -1307,8 +1331,23 @@ relativeError));
}
@DataProvider
public Object[][] maskCompareOpProvider() {
return BOOLEAN_MASK_COMPARE_GENERATOR_PAIRS.stream().map(List::toArray).
public Object[][] longMaskProvider() {
return LONG_MASK_GENERATORS.stream().
map(f -> new Object[]{f}).
toArray(Object[][]::new);
}
@DataProvider
public Object[][] boolMaskBinaryOpProvider() {
return BOOLEAN_MASK_COMPARE_GENERATOR_PAIRS.stream().
map(List::toArray).
toArray(Object[][]::new);
}
@DataProvider
public Object[][] boolMaskUnaryOpProvider() {
return BOOLEAN_MASK_GENERATORS.stream().
map(f -> new Object[]{f}).
toArray(Object[][]::new);
}
@ -4780,6 +4819,157 @@ relativeError));
assertArraysEquals(r, a, mask, FloatMaxVectorTests::SQRT);
}
static boolean band(boolean a, boolean b) {
return a & b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskandFloatMaxVectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.and(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, FloatMaxVectorTests::band);
}
static boolean bor(boolean a, boolean b) {
return a | b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskorFloatMaxVectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.or(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, FloatMaxVectorTests::bor);
}
static boolean bxor(boolean a, boolean b) {
return a != b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskxorFloatMaxVectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.xor(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, FloatMaxVectorTests::bxor);
}
static boolean bandNot(boolean a, boolean b) {
return a & !b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskandNotFloatMaxVectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.andNot(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, FloatMaxVectorTests::bandNot);
}
static boolean beq(boolean a, boolean b) {
return a == b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskeqFloatMaxVectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.eq(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, FloatMaxVectorTests::beq);
}
static boolean unot(boolean a) {
return !a;
}
@Test(dataProvider = "boolMaskUnaryOpProvider")
static void masknotFloatMaxVectorTests(IntFunction<boolean[]> fa) {
boolean[] a = fa.apply(SPECIES.length());
boolean[] r = new boolean[a.length];
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
av.not().intoArray(r, i);
}
}
assertArraysEquals(r, a, FloatMaxVectorTests::unot);
}
private static final long LONG_MASK_BITS = 0xFFFFFFFFFFFFFFFFL >>> (64 - SPECIES.length());
static void assertArraysEquals(long[] r, long[] a, long bits) {
int i = 0;
try {
for (; i < a.length; i++) {
Assert.assertEquals(r[i], a[i] & bits);
}
} catch (AssertionError e) {
Assert.assertEquals(r[i], a[i] & bits, "(" + a[i] + ") at index #" + i);
}
}
@Test(dataProvider = "longMaskProvider")
static void maskFromToLongFloatMaxVectorTests(IntFunction<long[]> fa) {
long[] a = fa.apply(SPECIES.length());
long[] r = new long[a.length];
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i++) {
VectorMask vmask = VectorMask.fromLong(SPECIES, a[i]);
r[i] = vmask.toLong();
}
}
assertArraysEquals(r, a, LONG_MASK_BITS);
}
@Test(dataProvider = "floatCompareOpProvider")
static void ltFloatMaxVectorTestsBroadcastSmokeTest(IntFunction<float[]> fa, IntFunction<float[]> fb) {
float[] a = fa.apply(SPECIES.length());
@ -5079,115 +5269,22 @@ relativeError));
}
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskEqualsFloatMaxVectorTestsSmokeTest(IntFunction<boolean[]> fa, IntFunction<boolean[]> fb) {
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskEqualsFloatMaxVectorTests(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));
for (int ic = 0; ic < INVOC_COUNT; ic++) {
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 maskAndFloatMaxVectorTestsSmokeTest(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, FloatMaxVectorTests::band);
}
static boolean bor(boolean a, boolean b) {
return a | b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskOrFloatMaxVectorTestsSmokeTest(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, FloatMaxVectorTests::bor);
}
static boolean bxor(boolean a, boolean b) {
return a != b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskXorFloatMaxVectorTestsSmokeTest(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, FloatMaxVectorTests::bxor);
}
static boolean bandNot(boolean a, boolean b) {
return a & !b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskAndNotFloatMaxVectorTestsSmokeTest(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, FloatMaxVectorTests::bandNot);
}
static boolean beq(boolean a, boolean b) {
return (a == b);
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskEqFloatMaxVectorTestsSmokeTest(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, FloatMaxVectorTests::beq);
}
@Test(dataProvider = "maskProvider")
static void maskHashCodeFloatMaxVectorTestsSmokeTest(IntFunction<boolean[]> fa) {
boolean[] a = fa.apply(SPECIES.length());
@ -5292,7 +5389,6 @@ relativeError));
}
}
@DataProvider
public static Object[][] offsetProvider() {
return new Object[][]{

View File

@ -393,6 +393,36 @@ public class Int128VectorTests extends AbstractVectorTest {
}
}
interface FBoolUnOp {
boolean apply(boolean a);
}
static void assertArraysEquals(boolean[] r, boolean[] a, FBoolUnOp 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]), "(" + a[i] + ") at index #" + i);
}
}
interface FBoolBinOp {
boolean apply(boolean a, boolean b);
}
static void assertArraysEquals(boolean[] r, boolean[] a, boolean[] b, FBoolBinOp 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);
}
}
interface FBinOp {
int apply(int a, int b);
}
@ -1085,12 +1115,6 @@ public class Int128VectorTests extends AbstractVectorTest {
.flatMap(pair -> INT_SATURATING_GENERATORS_ASSOC.stream().map(f -> List.of(pair.get(0), pair.get(1), f)))
.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<int[]>>> INT_GENERATOR_TRIPLES =
INT_GENERATOR_PAIRS.stream().
@ -1222,8 +1246,23 @@ public class Int128VectorTests extends AbstractVectorTest {
}
@DataProvider
public Object[][] maskCompareOpProvider() {
return BOOLEAN_MASK_COMPARE_GENERATOR_PAIRS.stream().map(List::toArray).
public Object[][] longMaskProvider() {
return LONG_MASK_GENERATORS.stream().
map(f -> new Object[]{f}).
toArray(Object[][]::new);
}
@DataProvider
public Object[][] boolMaskBinaryOpProvider() {
return BOOLEAN_MASK_COMPARE_GENERATOR_PAIRS.stream().
map(List::toArray).
toArray(Object[][]::new);
}
@DataProvider
public Object[][] boolMaskUnaryOpProvider() {
return BOOLEAN_MASK_GENERATORS.stream().
map(f -> new Object[]{f}).
toArray(Object[][]::new);
}
@ -4508,7 +4547,7 @@ public class Int128VectorTests extends AbstractVectorTest {
return res;
}
@Test(dataProvider = "boolUnaryOpProvider")
@Test(dataProvider = "boolMaskUnaryOpProvider")
static void anyTrueInt128VectorTests(IntFunction<boolean[]> fm) {
boolean[] mask = fm.apply(SPECIES.length());
boolean[] r = fmr.apply(SPECIES.length());
@ -4532,7 +4571,7 @@ public class Int128VectorTests extends AbstractVectorTest {
return res;
}
@Test(dataProvider = "boolUnaryOpProvider")
@Test(dataProvider = "boolMaskUnaryOpProvider")
static void allTrueInt128VectorTests(IntFunction<boolean[]> fm) {
boolean[] mask = fm.apply(SPECIES.length());
boolean[] r = fmr.apply(SPECIES.length());
@ -6434,6 +6473,157 @@ public class Int128VectorTests extends AbstractVectorTest {
assertArraysEquals(r, a, mask, Int128VectorTests::REVERSE_BYTES);
}
static boolean band(boolean a, boolean b) {
return a & b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskandInt128VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.and(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Int128VectorTests::band);
}
static boolean bor(boolean a, boolean b) {
return a | b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskorInt128VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.or(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Int128VectorTests::bor);
}
static boolean bxor(boolean a, boolean b) {
return a != b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskxorInt128VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.xor(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Int128VectorTests::bxor);
}
static boolean bandNot(boolean a, boolean b) {
return a & !b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskandNotInt128VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.andNot(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Int128VectorTests::bandNot);
}
static boolean beq(boolean a, boolean b) {
return a == b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskeqInt128VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.eq(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Int128VectorTests::beq);
}
static boolean unot(boolean a) {
return !a;
}
@Test(dataProvider = "boolMaskUnaryOpProvider")
static void masknotInt128VectorTests(IntFunction<boolean[]> fa) {
boolean[] a = fa.apply(SPECIES.length());
boolean[] r = new boolean[a.length];
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
av.not().intoArray(r, i);
}
}
assertArraysEquals(r, a, Int128VectorTests::unot);
}
private static final long LONG_MASK_BITS = 0xFFFFFFFFFFFFFFFFL >>> (64 - SPECIES.length());
static void assertArraysEquals(long[] r, long[] a, long bits) {
int i = 0;
try {
for (; i < a.length; i++) {
Assert.assertEquals(r[i], a[i] & bits);
}
} catch (AssertionError e) {
Assert.assertEquals(r[i], a[i] & bits, "(" + a[i] + ") at index #" + i);
}
}
@Test(dataProvider = "longMaskProvider")
static void maskFromToLongInt128VectorTests(IntFunction<long[]> fa) {
long[] a = fa.apply(SPECIES.length());
long[] r = new long[a.length];
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i++) {
VectorMask vmask = VectorMask.fromLong(SPECIES, a[i]);
r[i] = vmask.toLong();
}
}
assertArraysEquals(r, a, LONG_MASK_BITS);
}
@Test(dataProvider = "intCompareOpProvider")
static void ltInt128VectorTestsBroadcastSmokeTest(IntFunction<int[]> fa, IntFunction<int[]> fb) {
int[] a = fa.apply(SPECIES.length());
@ -6733,115 +6923,22 @@ public class Int128VectorTests extends AbstractVectorTest {
}
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskEqualsInt128VectorTestsSmokeTest(IntFunction<boolean[]> fa, IntFunction<boolean[]> fb) {
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskEqualsInt128VectorTests(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));
for (int ic = 0; ic < INVOC_COUNT; ic++) {
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 maskAndInt128VectorTestsSmokeTest(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, Int128VectorTests::band);
}
static boolean bor(boolean a, boolean b) {
return a | b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskOrInt128VectorTestsSmokeTest(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, Int128VectorTests::bor);
}
static boolean bxor(boolean a, boolean b) {
return a != b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskXorInt128VectorTestsSmokeTest(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, Int128VectorTests::bxor);
}
static boolean bandNot(boolean a, boolean b) {
return a & !b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskAndNotInt128VectorTestsSmokeTest(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, Int128VectorTests::bandNot);
}
static boolean beq(boolean a, boolean b) {
return (a == b);
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskEqInt128VectorTestsSmokeTest(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, Int128VectorTests::beq);
}
@Test(dataProvider = "maskProvider")
static void maskHashCodeInt128VectorTestsSmokeTest(IntFunction<boolean[]> fa) {
boolean[] a = fa.apply(SPECIES.length());
@ -6946,23 +7043,6 @@ public class Int128VectorTests extends AbstractVectorTest {
}
}
@DataProvider
public static Object[][] longMaskProvider() {
return new Object[][]{
{0xFFFFFFFFFFFFFFFFL},
{0x0000000000000000L},
{0x5555555555555555L},
{0x0123456789abcdefL},
};
}
@Test(dataProvider = "longMaskProvider")
static void maskFromToLongInt128VectorTestsSmokeTest(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[][]{

View File

@ -393,6 +393,36 @@ public class Int256VectorTests extends AbstractVectorTest {
}
}
interface FBoolUnOp {
boolean apply(boolean a);
}
static void assertArraysEquals(boolean[] r, boolean[] a, FBoolUnOp 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]), "(" + a[i] + ") at index #" + i);
}
}
interface FBoolBinOp {
boolean apply(boolean a, boolean b);
}
static void assertArraysEquals(boolean[] r, boolean[] a, boolean[] b, FBoolBinOp 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);
}
}
interface FBinOp {
int apply(int a, int b);
}
@ -1085,12 +1115,6 @@ public class Int256VectorTests extends AbstractVectorTest {
.flatMap(pair -> INT_SATURATING_GENERATORS_ASSOC.stream().map(f -> List.of(pair.get(0), pair.get(1), f)))
.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<int[]>>> INT_GENERATOR_TRIPLES =
INT_GENERATOR_PAIRS.stream().
@ -1222,8 +1246,23 @@ public class Int256VectorTests extends AbstractVectorTest {
}
@DataProvider
public Object[][] maskCompareOpProvider() {
return BOOLEAN_MASK_COMPARE_GENERATOR_PAIRS.stream().map(List::toArray).
public Object[][] longMaskProvider() {
return LONG_MASK_GENERATORS.stream().
map(f -> new Object[]{f}).
toArray(Object[][]::new);
}
@DataProvider
public Object[][] boolMaskBinaryOpProvider() {
return BOOLEAN_MASK_COMPARE_GENERATOR_PAIRS.stream().
map(List::toArray).
toArray(Object[][]::new);
}
@DataProvider
public Object[][] boolMaskUnaryOpProvider() {
return BOOLEAN_MASK_GENERATORS.stream().
map(f -> new Object[]{f}).
toArray(Object[][]::new);
}
@ -4508,7 +4547,7 @@ public class Int256VectorTests extends AbstractVectorTest {
return res;
}
@Test(dataProvider = "boolUnaryOpProvider")
@Test(dataProvider = "boolMaskUnaryOpProvider")
static void anyTrueInt256VectorTests(IntFunction<boolean[]> fm) {
boolean[] mask = fm.apply(SPECIES.length());
boolean[] r = fmr.apply(SPECIES.length());
@ -4532,7 +4571,7 @@ public class Int256VectorTests extends AbstractVectorTest {
return res;
}
@Test(dataProvider = "boolUnaryOpProvider")
@Test(dataProvider = "boolMaskUnaryOpProvider")
static void allTrueInt256VectorTests(IntFunction<boolean[]> fm) {
boolean[] mask = fm.apply(SPECIES.length());
boolean[] r = fmr.apply(SPECIES.length());
@ -6434,6 +6473,157 @@ public class Int256VectorTests extends AbstractVectorTest {
assertArraysEquals(r, a, mask, Int256VectorTests::REVERSE_BYTES);
}
static boolean band(boolean a, boolean b) {
return a & b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskandInt256VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.and(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Int256VectorTests::band);
}
static boolean bor(boolean a, boolean b) {
return a | b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskorInt256VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.or(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Int256VectorTests::bor);
}
static boolean bxor(boolean a, boolean b) {
return a != b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskxorInt256VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.xor(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Int256VectorTests::bxor);
}
static boolean bandNot(boolean a, boolean b) {
return a & !b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskandNotInt256VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.andNot(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Int256VectorTests::bandNot);
}
static boolean beq(boolean a, boolean b) {
return a == b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskeqInt256VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.eq(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Int256VectorTests::beq);
}
static boolean unot(boolean a) {
return !a;
}
@Test(dataProvider = "boolMaskUnaryOpProvider")
static void masknotInt256VectorTests(IntFunction<boolean[]> fa) {
boolean[] a = fa.apply(SPECIES.length());
boolean[] r = new boolean[a.length];
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
av.not().intoArray(r, i);
}
}
assertArraysEquals(r, a, Int256VectorTests::unot);
}
private static final long LONG_MASK_BITS = 0xFFFFFFFFFFFFFFFFL >>> (64 - SPECIES.length());
static void assertArraysEquals(long[] r, long[] a, long bits) {
int i = 0;
try {
for (; i < a.length; i++) {
Assert.assertEquals(r[i], a[i] & bits);
}
} catch (AssertionError e) {
Assert.assertEquals(r[i], a[i] & bits, "(" + a[i] + ") at index #" + i);
}
}
@Test(dataProvider = "longMaskProvider")
static void maskFromToLongInt256VectorTests(IntFunction<long[]> fa) {
long[] a = fa.apply(SPECIES.length());
long[] r = new long[a.length];
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i++) {
VectorMask vmask = VectorMask.fromLong(SPECIES, a[i]);
r[i] = vmask.toLong();
}
}
assertArraysEquals(r, a, LONG_MASK_BITS);
}
@Test(dataProvider = "intCompareOpProvider")
static void ltInt256VectorTestsBroadcastSmokeTest(IntFunction<int[]> fa, IntFunction<int[]> fb) {
int[] a = fa.apply(SPECIES.length());
@ -6733,115 +6923,22 @@ public class Int256VectorTests extends AbstractVectorTest {
}
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskEqualsInt256VectorTestsSmokeTest(IntFunction<boolean[]> fa, IntFunction<boolean[]> fb) {
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskEqualsInt256VectorTests(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));
for (int ic = 0; ic < INVOC_COUNT; ic++) {
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 maskAndInt256VectorTestsSmokeTest(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, Int256VectorTests::band);
}
static boolean bor(boolean a, boolean b) {
return a | b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskOrInt256VectorTestsSmokeTest(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, Int256VectorTests::bor);
}
static boolean bxor(boolean a, boolean b) {
return a != b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskXorInt256VectorTestsSmokeTest(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, Int256VectorTests::bxor);
}
static boolean bandNot(boolean a, boolean b) {
return a & !b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskAndNotInt256VectorTestsSmokeTest(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, Int256VectorTests::bandNot);
}
static boolean beq(boolean a, boolean b) {
return (a == b);
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskEqInt256VectorTestsSmokeTest(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, Int256VectorTests::beq);
}
@Test(dataProvider = "maskProvider")
static void maskHashCodeInt256VectorTestsSmokeTest(IntFunction<boolean[]> fa) {
boolean[] a = fa.apply(SPECIES.length());
@ -6946,23 +7043,6 @@ public class Int256VectorTests extends AbstractVectorTest {
}
}
@DataProvider
public static Object[][] longMaskProvider() {
return new Object[][]{
{0xFFFFFFFFFFFFFFFFL},
{0x0000000000000000L},
{0x5555555555555555L},
{0x0123456789abcdefL},
};
}
@Test(dataProvider = "longMaskProvider")
static void maskFromToLongInt256VectorTestsSmokeTest(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[][]{

View File

@ -393,6 +393,36 @@ public class Int512VectorTests extends AbstractVectorTest {
}
}
interface FBoolUnOp {
boolean apply(boolean a);
}
static void assertArraysEquals(boolean[] r, boolean[] a, FBoolUnOp 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]), "(" + a[i] + ") at index #" + i);
}
}
interface FBoolBinOp {
boolean apply(boolean a, boolean b);
}
static void assertArraysEquals(boolean[] r, boolean[] a, boolean[] b, FBoolBinOp 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);
}
}
interface FBinOp {
int apply(int a, int b);
}
@ -1085,12 +1115,6 @@ public class Int512VectorTests extends AbstractVectorTest {
.flatMap(pair -> INT_SATURATING_GENERATORS_ASSOC.stream().map(f -> List.of(pair.get(0), pair.get(1), f)))
.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<int[]>>> INT_GENERATOR_TRIPLES =
INT_GENERATOR_PAIRS.stream().
@ -1222,8 +1246,23 @@ public class Int512VectorTests extends AbstractVectorTest {
}
@DataProvider
public Object[][] maskCompareOpProvider() {
return BOOLEAN_MASK_COMPARE_GENERATOR_PAIRS.stream().map(List::toArray).
public Object[][] longMaskProvider() {
return LONG_MASK_GENERATORS.stream().
map(f -> new Object[]{f}).
toArray(Object[][]::new);
}
@DataProvider
public Object[][] boolMaskBinaryOpProvider() {
return BOOLEAN_MASK_COMPARE_GENERATOR_PAIRS.stream().
map(List::toArray).
toArray(Object[][]::new);
}
@DataProvider
public Object[][] boolMaskUnaryOpProvider() {
return BOOLEAN_MASK_GENERATORS.stream().
map(f -> new Object[]{f}).
toArray(Object[][]::new);
}
@ -4508,7 +4547,7 @@ public class Int512VectorTests extends AbstractVectorTest {
return res;
}
@Test(dataProvider = "boolUnaryOpProvider")
@Test(dataProvider = "boolMaskUnaryOpProvider")
static void anyTrueInt512VectorTests(IntFunction<boolean[]> fm) {
boolean[] mask = fm.apply(SPECIES.length());
boolean[] r = fmr.apply(SPECIES.length());
@ -4532,7 +4571,7 @@ public class Int512VectorTests extends AbstractVectorTest {
return res;
}
@Test(dataProvider = "boolUnaryOpProvider")
@Test(dataProvider = "boolMaskUnaryOpProvider")
static void allTrueInt512VectorTests(IntFunction<boolean[]> fm) {
boolean[] mask = fm.apply(SPECIES.length());
boolean[] r = fmr.apply(SPECIES.length());
@ -6434,6 +6473,157 @@ public class Int512VectorTests extends AbstractVectorTest {
assertArraysEquals(r, a, mask, Int512VectorTests::REVERSE_BYTES);
}
static boolean band(boolean a, boolean b) {
return a & b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskandInt512VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.and(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Int512VectorTests::band);
}
static boolean bor(boolean a, boolean b) {
return a | b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskorInt512VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.or(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Int512VectorTests::bor);
}
static boolean bxor(boolean a, boolean b) {
return a != b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskxorInt512VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.xor(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Int512VectorTests::bxor);
}
static boolean bandNot(boolean a, boolean b) {
return a & !b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskandNotInt512VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.andNot(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Int512VectorTests::bandNot);
}
static boolean beq(boolean a, boolean b) {
return a == b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskeqInt512VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.eq(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Int512VectorTests::beq);
}
static boolean unot(boolean a) {
return !a;
}
@Test(dataProvider = "boolMaskUnaryOpProvider")
static void masknotInt512VectorTests(IntFunction<boolean[]> fa) {
boolean[] a = fa.apply(SPECIES.length());
boolean[] r = new boolean[a.length];
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
av.not().intoArray(r, i);
}
}
assertArraysEquals(r, a, Int512VectorTests::unot);
}
private static final long LONG_MASK_BITS = 0xFFFFFFFFFFFFFFFFL >>> (64 - SPECIES.length());
static void assertArraysEquals(long[] r, long[] a, long bits) {
int i = 0;
try {
for (; i < a.length; i++) {
Assert.assertEquals(r[i], a[i] & bits);
}
} catch (AssertionError e) {
Assert.assertEquals(r[i], a[i] & bits, "(" + a[i] + ") at index #" + i);
}
}
@Test(dataProvider = "longMaskProvider")
static void maskFromToLongInt512VectorTests(IntFunction<long[]> fa) {
long[] a = fa.apply(SPECIES.length());
long[] r = new long[a.length];
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i++) {
VectorMask vmask = VectorMask.fromLong(SPECIES, a[i]);
r[i] = vmask.toLong();
}
}
assertArraysEquals(r, a, LONG_MASK_BITS);
}
@Test(dataProvider = "intCompareOpProvider")
static void ltInt512VectorTestsBroadcastSmokeTest(IntFunction<int[]> fa, IntFunction<int[]> fb) {
int[] a = fa.apply(SPECIES.length());
@ -6733,115 +6923,22 @@ public class Int512VectorTests extends AbstractVectorTest {
}
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskEqualsInt512VectorTestsSmokeTest(IntFunction<boolean[]> fa, IntFunction<boolean[]> fb) {
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskEqualsInt512VectorTests(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));
for (int ic = 0; ic < INVOC_COUNT; ic++) {
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 maskAndInt512VectorTestsSmokeTest(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, Int512VectorTests::band);
}
static boolean bor(boolean a, boolean b) {
return a | b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskOrInt512VectorTestsSmokeTest(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, Int512VectorTests::bor);
}
static boolean bxor(boolean a, boolean b) {
return a != b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskXorInt512VectorTestsSmokeTest(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, Int512VectorTests::bxor);
}
static boolean bandNot(boolean a, boolean b) {
return a & !b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskAndNotInt512VectorTestsSmokeTest(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, Int512VectorTests::bandNot);
}
static boolean beq(boolean a, boolean b) {
return (a == b);
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskEqInt512VectorTestsSmokeTest(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, Int512VectorTests::beq);
}
@Test(dataProvider = "maskProvider")
static void maskHashCodeInt512VectorTestsSmokeTest(IntFunction<boolean[]> fa) {
boolean[] a = fa.apply(SPECIES.length());
@ -6946,23 +7043,6 @@ public class Int512VectorTests extends AbstractVectorTest {
}
}
@DataProvider
public static Object[][] longMaskProvider() {
return new Object[][]{
{0xFFFFFFFFFFFFFFFFL},
{0x0000000000000000L},
{0x5555555555555555L},
{0x0123456789abcdefL},
};
}
@Test(dataProvider = "longMaskProvider")
static void maskFromToLongInt512VectorTestsSmokeTest(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[][]{

View File

@ -393,6 +393,36 @@ public class Int64VectorTests extends AbstractVectorTest {
}
}
interface FBoolUnOp {
boolean apply(boolean a);
}
static void assertArraysEquals(boolean[] r, boolean[] a, FBoolUnOp 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]), "(" + a[i] + ") at index #" + i);
}
}
interface FBoolBinOp {
boolean apply(boolean a, boolean b);
}
static void assertArraysEquals(boolean[] r, boolean[] a, boolean[] b, FBoolBinOp 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);
}
}
interface FBinOp {
int apply(int a, int b);
}
@ -1085,12 +1115,6 @@ public class Int64VectorTests extends AbstractVectorTest {
.flatMap(pair -> INT_SATURATING_GENERATORS_ASSOC.stream().map(f -> List.of(pair.get(0), pair.get(1), f)))
.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<int[]>>> INT_GENERATOR_TRIPLES =
INT_GENERATOR_PAIRS.stream().
@ -1222,8 +1246,23 @@ public class Int64VectorTests extends AbstractVectorTest {
}
@DataProvider
public Object[][] maskCompareOpProvider() {
return BOOLEAN_MASK_COMPARE_GENERATOR_PAIRS.stream().map(List::toArray).
public Object[][] longMaskProvider() {
return LONG_MASK_GENERATORS.stream().
map(f -> new Object[]{f}).
toArray(Object[][]::new);
}
@DataProvider
public Object[][] boolMaskBinaryOpProvider() {
return BOOLEAN_MASK_COMPARE_GENERATOR_PAIRS.stream().
map(List::toArray).
toArray(Object[][]::new);
}
@DataProvider
public Object[][] boolMaskUnaryOpProvider() {
return BOOLEAN_MASK_GENERATORS.stream().
map(f -> new Object[]{f}).
toArray(Object[][]::new);
}
@ -4508,7 +4547,7 @@ public class Int64VectorTests extends AbstractVectorTest {
return res;
}
@Test(dataProvider = "boolUnaryOpProvider")
@Test(dataProvider = "boolMaskUnaryOpProvider")
static void anyTrueInt64VectorTests(IntFunction<boolean[]> fm) {
boolean[] mask = fm.apply(SPECIES.length());
boolean[] r = fmr.apply(SPECIES.length());
@ -4532,7 +4571,7 @@ public class Int64VectorTests extends AbstractVectorTest {
return res;
}
@Test(dataProvider = "boolUnaryOpProvider")
@Test(dataProvider = "boolMaskUnaryOpProvider")
static void allTrueInt64VectorTests(IntFunction<boolean[]> fm) {
boolean[] mask = fm.apply(SPECIES.length());
boolean[] r = fmr.apply(SPECIES.length());
@ -6434,6 +6473,157 @@ public class Int64VectorTests extends AbstractVectorTest {
assertArraysEquals(r, a, mask, Int64VectorTests::REVERSE_BYTES);
}
static boolean band(boolean a, boolean b) {
return a & b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskandInt64VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.and(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Int64VectorTests::band);
}
static boolean bor(boolean a, boolean b) {
return a | b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskorInt64VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.or(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Int64VectorTests::bor);
}
static boolean bxor(boolean a, boolean b) {
return a != b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskxorInt64VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.xor(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Int64VectorTests::bxor);
}
static boolean bandNot(boolean a, boolean b) {
return a & !b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskandNotInt64VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.andNot(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Int64VectorTests::bandNot);
}
static boolean beq(boolean a, boolean b) {
return a == b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskeqInt64VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.eq(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Int64VectorTests::beq);
}
static boolean unot(boolean a) {
return !a;
}
@Test(dataProvider = "boolMaskUnaryOpProvider")
static void masknotInt64VectorTests(IntFunction<boolean[]> fa) {
boolean[] a = fa.apply(SPECIES.length());
boolean[] r = new boolean[a.length];
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
av.not().intoArray(r, i);
}
}
assertArraysEquals(r, a, Int64VectorTests::unot);
}
private static final long LONG_MASK_BITS = 0xFFFFFFFFFFFFFFFFL >>> (64 - SPECIES.length());
static void assertArraysEquals(long[] r, long[] a, long bits) {
int i = 0;
try {
for (; i < a.length; i++) {
Assert.assertEquals(r[i], a[i] & bits);
}
} catch (AssertionError e) {
Assert.assertEquals(r[i], a[i] & bits, "(" + a[i] + ") at index #" + i);
}
}
@Test(dataProvider = "longMaskProvider")
static void maskFromToLongInt64VectorTests(IntFunction<long[]> fa) {
long[] a = fa.apply(SPECIES.length());
long[] r = new long[a.length];
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i++) {
VectorMask vmask = VectorMask.fromLong(SPECIES, a[i]);
r[i] = vmask.toLong();
}
}
assertArraysEquals(r, a, LONG_MASK_BITS);
}
@Test(dataProvider = "intCompareOpProvider")
static void ltInt64VectorTestsBroadcastSmokeTest(IntFunction<int[]> fa, IntFunction<int[]> fb) {
int[] a = fa.apply(SPECIES.length());
@ -6733,115 +6923,22 @@ public class Int64VectorTests extends AbstractVectorTest {
}
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskEqualsInt64VectorTestsSmokeTest(IntFunction<boolean[]> fa, IntFunction<boolean[]> fb) {
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskEqualsInt64VectorTests(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));
for (int ic = 0; ic < INVOC_COUNT; ic++) {
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 maskAndInt64VectorTestsSmokeTest(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, Int64VectorTests::band);
}
static boolean bor(boolean a, boolean b) {
return a | b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskOrInt64VectorTestsSmokeTest(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, Int64VectorTests::bor);
}
static boolean bxor(boolean a, boolean b) {
return a != b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskXorInt64VectorTestsSmokeTest(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, Int64VectorTests::bxor);
}
static boolean bandNot(boolean a, boolean b) {
return a & !b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskAndNotInt64VectorTestsSmokeTest(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, Int64VectorTests::bandNot);
}
static boolean beq(boolean a, boolean b) {
return (a == b);
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskEqInt64VectorTestsSmokeTest(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, Int64VectorTests::beq);
}
@Test(dataProvider = "maskProvider")
static void maskHashCodeInt64VectorTestsSmokeTest(IntFunction<boolean[]> fa) {
boolean[] a = fa.apply(SPECIES.length());
@ -6946,23 +7043,6 @@ public class Int64VectorTests extends AbstractVectorTest {
}
}
@DataProvider
public static Object[][] longMaskProvider() {
return new Object[][]{
{0xFFFFFFFFFFFFFFFFL},
{0x0000000000000000L},
{0x5555555555555555L},
{0x0123456789abcdefL},
};
}
@Test(dataProvider = "longMaskProvider")
static void maskFromToLongInt64VectorTestsSmokeTest(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[][]{

View File

@ -398,6 +398,36 @@ public class IntMaxVectorTests extends AbstractVectorTest {
}
}
interface FBoolUnOp {
boolean apply(boolean a);
}
static void assertArraysEquals(boolean[] r, boolean[] a, FBoolUnOp 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]), "(" + a[i] + ") at index #" + i);
}
}
interface FBoolBinOp {
boolean apply(boolean a, boolean b);
}
static void assertArraysEquals(boolean[] r, boolean[] a, boolean[] b, FBoolBinOp 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);
}
}
interface FBinOp {
int apply(int a, int b);
}
@ -1090,12 +1120,6 @@ public class IntMaxVectorTests extends AbstractVectorTest {
.flatMap(pair -> INT_SATURATING_GENERATORS_ASSOC.stream().map(f -> List.of(pair.get(0), pair.get(1), f)))
.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<int[]>>> INT_GENERATOR_TRIPLES =
INT_GENERATOR_PAIRS.stream().
@ -1227,8 +1251,23 @@ public class IntMaxVectorTests extends AbstractVectorTest {
}
@DataProvider
public Object[][] maskCompareOpProvider() {
return BOOLEAN_MASK_COMPARE_GENERATOR_PAIRS.stream().map(List::toArray).
public Object[][] longMaskProvider() {
return LONG_MASK_GENERATORS.stream().
map(f -> new Object[]{f}).
toArray(Object[][]::new);
}
@DataProvider
public Object[][] boolMaskBinaryOpProvider() {
return BOOLEAN_MASK_COMPARE_GENERATOR_PAIRS.stream().
map(List::toArray).
toArray(Object[][]::new);
}
@DataProvider
public Object[][] boolMaskUnaryOpProvider() {
return BOOLEAN_MASK_GENERATORS.stream().
map(f -> new Object[]{f}).
toArray(Object[][]::new);
}
@ -4513,7 +4552,7 @@ public class IntMaxVectorTests extends AbstractVectorTest {
return res;
}
@Test(dataProvider = "boolUnaryOpProvider")
@Test(dataProvider = "boolMaskUnaryOpProvider")
static void anyTrueIntMaxVectorTests(IntFunction<boolean[]> fm) {
boolean[] mask = fm.apply(SPECIES.length());
boolean[] r = fmr.apply(SPECIES.length());
@ -4537,7 +4576,7 @@ public class IntMaxVectorTests extends AbstractVectorTest {
return res;
}
@Test(dataProvider = "boolUnaryOpProvider")
@Test(dataProvider = "boolMaskUnaryOpProvider")
static void allTrueIntMaxVectorTests(IntFunction<boolean[]> fm) {
boolean[] mask = fm.apply(SPECIES.length());
boolean[] r = fmr.apply(SPECIES.length());
@ -6439,6 +6478,157 @@ public class IntMaxVectorTests extends AbstractVectorTest {
assertArraysEquals(r, a, mask, IntMaxVectorTests::REVERSE_BYTES);
}
static boolean band(boolean a, boolean b) {
return a & b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskandIntMaxVectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.and(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, IntMaxVectorTests::band);
}
static boolean bor(boolean a, boolean b) {
return a | b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskorIntMaxVectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.or(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, IntMaxVectorTests::bor);
}
static boolean bxor(boolean a, boolean b) {
return a != b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskxorIntMaxVectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.xor(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, IntMaxVectorTests::bxor);
}
static boolean bandNot(boolean a, boolean b) {
return a & !b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskandNotIntMaxVectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.andNot(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, IntMaxVectorTests::bandNot);
}
static boolean beq(boolean a, boolean b) {
return a == b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskeqIntMaxVectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.eq(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, IntMaxVectorTests::beq);
}
static boolean unot(boolean a) {
return !a;
}
@Test(dataProvider = "boolMaskUnaryOpProvider")
static void masknotIntMaxVectorTests(IntFunction<boolean[]> fa) {
boolean[] a = fa.apply(SPECIES.length());
boolean[] r = new boolean[a.length];
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
av.not().intoArray(r, i);
}
}
assertArraysEquals(r, a, IntMaxVectorTests::unot);
}
private static final long LONG_MASK_BITS = 0xFFFFFFFFFFFFFFFFL >>> (64 - SPECIES.length());
static void assertArraysEquals(long[] r, long[] a, long bits) {
int i = 0;
try {
for (; i < a.length; i++) {
Assert.assertEquals(r[i], a[i] & bits);
}
} catch (AssertionError e) {
Assert.assertEquals(r[i], a[i] & bits, "(" + a[i] + ") at index #" + i);
}
}
@Test(dataProvider = "longMaskProvider")
static void maskFromToLongIntMaxVectorTests(IntFunction<long[]> fa) {
long[] a = fa.apply(SPECIES.length());
long[] r = new long[a.length];
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i++) {
VectorMask vmask = VectorMask.fromLong(SPECIES, a[i]);
r[i] = vmask.toLong();
}
}
assertArraysEquals(r, a, LONG_MASK_BITS);
}
@Test(dataProvider = "intCompareOpProvider")
static void ltIntMaxVectorTestsBroadcastSmokeTest(IntFunction<int[]> fa, IntFunction<int[]> fb) {
int[] a = fa.apply(SPECIES.length());
@ -6738,115 +6928,22 @@ public class IntMaxVectorTests extends AbstractVectorTest {
}
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskEqualsIntMaxVectorTestsSmokeTest(IntFunction<boolean[]> fa, IntFunction<boolean[]> fb) {
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskEqualsIntMaxVectorTests(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));
for (int ic = 0; ic < INVOC_COUNT; ic++) {
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 maskAndIntMaxVectorTestsSmokeTest(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, IntMaxVectorTests::band);
}
static boolean bor(boolean a, boolean b) {
return a | b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskOrIntMaxVectorTestsSmokeTest(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, IntMaxVectorTests::bor);
}
static boolean bxor(boolean a, boolean b) {
return a != b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskXorIntMaxVectorTestsSmokeTest(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, IntMaxVectorTests::bxor);
}
static boolean bandNot(boolean a, boolean b) {
return a & !b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskAndNotIntMaxVectorTestsSmokeTest(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, IntMaxVectorTests::bandNot);
}
static boolean beq(boolean a, boolean b) {
return (a == b);
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskEqIntMaxVectorTestsSmokeTest(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, IntMaxVectorTests::beq);
}
@Test(dataProvider = "maskProvider")
static void maskHashCodeIntMaxVectorTestsSmokeTest(IntFunction<boolean[]> fa) {
boolean[] a = fa.apply(SPECIES.length());
@ -6951,7 +7048,6 @@ public class IntMaxVectorTests extends AbstractVectorTest {
}
}
@DataProvider
public static Object[][] offsetProvider() {
return new Object[][]{

View File

@ -350,6 +350,36 @@ public class Long128VectorTests extends AbstractVectorTest {
}
}
interface FBoolUnOp {
boolean apply(boolean a);
}
static void assertArraysEquals(boolean[] r, boolean[] a, FBoolUnOp 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]), "(" + a[i] + ") at index #" + i);
}
}
interface FBoolBinOp {
boolean apply(boolean a, boolean b);
}
static void assertArraysEquals(boolean[] r, boolean[] a, boolean[] b, FBoolBinOp 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);
}
}
interface FBinOp {
long apply(long a, long b);
}
@ -1075,12 +1105,6 @@ public class Long128VectorTests extends AbstractVectorTest {
.flatMap(pair -> LONG_SATURATING_GENERATORS_ASSOC.stream().map(f -> List.of(pair.get(0), pair.get(1), f)))
.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<long[]>>> LONG_GENERATOR_TRIPLES =
LONG_GENERATOR_PAIRS.stream().
@ -1219,8 +1243,23 @@ public class Long128VectorTests extends AbstractVectorTest {
}
@DataProvider
public Object[][] maskCompareOpProvider() {
return BOOLEAN_MASK_COMPARE_GENERATOR_PAIRS.stream().map(List::toArray).
public Object[][] longMaskProvider() {
return LONG_MASK_GENERATORS.stream().
map(f -> new Object[]{f}).
toArray(Object[][]::new);
}
@DataProvider
public Object[][] boolMaskBinaryOpProvider() {
return BOOLEAN_MASK_COMPARE_GENERATOR_PAIRS.stream().
map(List::toArray).
toArray(Object[][]::new);
}
@DataProvider
public Object[][] boolMaskUnaryOpProvider() {
return BOOLEAN_MASK_GENERATORS.stream().
map(f -> new Object[]{f}).
toArray(Object[][]::new);
}
@ -4530,7 +4569,7 @@ public class Long128VectorTests extends AbstractVectorTest {
return res;
}
@Test(dataProvider = "boolUnaryOpProvider")
@Test(dataProvider = "boolMaskUnaryOpProvider")
static void anyTrueLong128VectorTests(IntFunction<boolean[]> fm) {
boolean[] mask = fm.apply(SPECIES.length());
boolean[] r = fmr.apply(SPECIES.length());
@ -4554,7 +4593,7 @@ public class Long128VectorTests extends AbstractVectorTest {
return res;
}
@Test(dataProvider = "boolUnaryOpProvider")
@Test(dataProvider = "boolMaskUnaryOpProvider")
static void allTrueLong128VectorTests(IntFunction<boolean[]> fm) {
boolean[] mask = fm.apply(SPECIES.length());
boolean[] r = fmr.apply(SPECIES.length());
@ -6386,6 +6425,157 @@ public class Long128VectorTests extends AbstractVectorTest {
assertArraysEquals(r, a, mask, Long128VectorTests::REVERSE_BYTES);
}
static boolean band(boolean a, boolean b) {
return a & b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskandLong128VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.and(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Long128VectorTests::band);
}
static boolean bor(boolean a, boolean b) {
return a | b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskorLong128VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.or(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Long128VectorTests::bor);
}
static boolean bxor(boolean a, boolean b) {
return a != b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskxorLong128VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.xor(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Long128VectorTests::bxor);
}
static boolean bandNot(boolean a, boolean b) {
return a & !b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskandNotLong128VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.andNot(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Long128VectorTests::bandNot);
}
static boolean beq(boolean a, boolean b) {
return a == b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskeqLong128VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.eq(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Long128VectorTests::beq);
}
static boolean unot(boolean a) {
return !a;
}
@Test(dataProvider = "boolMaskUnaryOpProvider")
static void masknotLong128VectorTests(IntFunction<boolean[]> fa) {
boolean[] a = fa.apply(SPECIES.length());
boolean[] r = new boolean[a.length];
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
av.not().intoArray(r, i);
}
}
assertArraysEquals(r, a, Long128VectorTests::unot);
}
private static final long LONG_MASK_BITS = 0xFFFFFFFFFFFFFFFFL >>> (64 - SPECIES.length());
static void assertArraysEquals(long[] r, long[] a, long bits) {
int i = 0;
try {
for (; i < a.length; i++) {
Assert.assertEquals(r[i], a[i] & bits);
}
} catch (AssertionError e) {
Assert.assertEquals(r[i], a[i] & bits, "(" + a[i] + ") at index #" + i);
}
}
@Test(dataProvider = "longMaskProvider")
static void maskFromToLongLong128VectorTests(IntFunction<long[]> fa) {
long[] a = fa.apply(SPECIES.length());
long[] r = new long[a.length];
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i++) {
VectorMask vmask = VectorMask.fromLong(SPECIES, a[i]);
r[i] = vmask.toLong();
}
}
assertArraysEquals(r, a, LONG_MASK_BITS);
}
@Test(dataProvider = "longCompareOpProvider")
static void ltLong128VectorTestsBroadcastSmokeTest(IntFunction<long[]> fa, IntFunction<long[]> fb) {
long[] a = fa.apply(SPECIES.length());
@ -6619,115 +6809,22 @@ public class Long128VectorTests extends AbstractVectorTest {
}
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskEqualsLong128VectorTestsSmokeTest(IntFunction<boolean[]> fa, IntFunction<boolean[]> fb) {
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskEqualsLong128VectorTests(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));
for (int ic = 0; ic < INVOC_COUNT; ic++) {
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 maskAndLong128VectorTestsSmokeTest(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, Long128VectorTests::band);
}
static boolean bor(boolean a, boolean b) {
return a | b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskOrLong128VectorTestsSmokeTest(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, Long128VectorTests::bor);
}
static boolean bxor(boolean a, boolean b) {
return a != b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskXorLong128VectorTestsSmokeTest(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, Long128VectorTests::bxor);
}
static boolean bandNot(boolean a, boolean b) {
return a & !b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskAndNotLong128VectorTestsSmokeTest(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, Long128VectorTests::bandNot);
}
static boolean beq(boolean a, boolean b) {
return (a == b);
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskEqLong128VectorTestsSmokeTest(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, Long128VectorTests::beq);
}
@Test(dataProvider = "maskProvider")
static void maskHashCodeLong128VectorTestsSmokeTest(IntFunction<boolean[]> fa) {
boolean[] a = fa.apply(SPECIES.length());
@ -6832,23 +6929,6 @@ public class Long128VectorTests extends AbstractVectorTest {
}
}
@DataProvider
public static Object[][] longMaskProvider() {
return new Object[][]{
{0xFFFFFFFFFFFFFFFFL},
{0x0000000000000000L},
{0x5555555555555555L},
{0x0123456789abcdefL},
};
}
@Test(dataProvider = "longMaskProvider")
static void maskFromToLongLong128VectorTestsSmokeTest(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[][]{

View File

@ -350,6 +350,36 @@ public class Long256VectorTests extends AbstractVectorTest {
}
}
interface FBoolUnOp {
boolean apply(boolean a);
}
static void assertArraysEquals(boolean[] r, boolean[] a, FBoolUnOp 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]), "(" + a[i] + ") at index #" + i);
}
}
interface FBoolBinOp {
boolean apply(boolean a, boolean b);
}
static void assertArraysEquals(boolean[] r, boolean[] a, boolean[] b, FBoolBinOp 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);
}
}
interface FBinOp {
long apply(long a, long b);
}
@ -1075,12 +1105,6 @@ public class Long256VectorTests extends AbstractVectorTest {
.flatMap(pair -> LONG_SATURATING_GENERATORS_ASSOC.stream().map(f -> List.of(pair.get(0), pair.get(1), f)))
.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<long[]>>> LONG_GENERATOR_TRIPLES =
LONG_GENERATOR_PAIRS.stream().
@ -1219,8 +1243,23 @@ public class Long256VectorTests extends AbstractVectorTest {
}
@DataProvider
public Object[][] maskCompareOpProvider() {
return BOOLEAN_MASK_COMPARE_GENERATOR_PAIRS.stream().map(List::toArray).
public Object[][] longMaskProvider() {
return LONG_MASK_GENERATORS.stream().
map(f -> new Object[]{f}).
toArray(Object[][]::new);
}
@DataProvider
public Object[][] boolMaskBinaryOpProvider() {
return BOOLEAN_MASK_COMPARE_GENERATOR_PAIRS.stream().
map(List::toArray).
toArray(Object[][]::new);
}
@DataProvider
public Object[][] boolMaskUnaryOpProvider() {
return BOOLEAN_MASK_GENERATORS.stream().
map(f -> new Object[]{f}).
toArray(Object[][]::new);
}
@ -4530,7 +4569,7 @@ public class Long256VectorTests extends AbstractVectorTest {
return res;
}
@Test(dataProvider = "boolUnaryOpProvider")
@Test(dataProvider = "boolMaskUnaryOpProvider")
static void anyTrueLong256VectorTests(IntFunction<boolean[]> fm) {
boolean[] mask = fm.apply(SPECIES.length());
boolean[] r = fmr.apply(SPECIES.length());
@ -4554,7 +4593,7 @@ public class Long256VectorTests extends AbstractVectorTest {
return res;
}
@Test(dataProvider = "boolUnaryOpProvider")
@Test(dataProvider = "boolMaskUnaryOpProvider")
static void allTrueLong256VectorTests(IntFunction<boolean[]> fm) {
boolean[] mask = fm.apply(SPECIES.length());
boolean[] r = fmr.apply(SPECIES.length());
@ -6386,6 +6425,157 @@ public class Long256VectorTests extends AbstractVectorTest {
assertArraysEquals(r, a, mask, Long256VectorTests::REVERSE_BYTES);
}
static boolean band(boolean a, boolean b) {
return a & b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskandLong256VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.and(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Long256VectorTests::band);
}
static boolean bor(boolean a, boolean b) {
return a | b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskorLong256VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.or(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Long256VectorTests::bor);
}
static boolean bxor(boolean a, boolean b) {
return a != b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskxorLong256VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.xor(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Long256VectorTests::bxor);
}
static boolean bandNot(boolean a, boolean b) {
return a & !b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskandNotLong256VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.andNot(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Long256VectorTests::bandNot);
}
static boolean beq(boolean a, boolean b) {
return a == b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskeqLong256VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.eq(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Long256VectorTests::beq);
}
static boolean unot(boolean a) {
return !a;
}
@Test(dataProvider = "boolMaskUnaryOpProvider")
static void masknotLong256VectorTests(IntFunction<boolean[]> fa) {
boolean[] a = fa.apply(SPECIES.length());
boolean[] r = new boolean[a.length];
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
av.not().intoArray(r, i);
}
}
assertArraysEquals(r, a, Long256VectorTests::unot);
}
private static final long LONG_MASK_BITS = 0xFFFFFFFFFFFFFFFFL >>> (64 - SPECIES.length());
static void assertArraysEquals(long[] r, long[] a, long bits) {
int i = 0;
try {
for (; i < a.length; i++) {
Assert.assertEquals(r[i], a[i] & bits);
}
} catch (AssertionError e) {
Assert.assertEquals(r[i], a[i] & bits, "(" + a[i] + ") at index #" + i);
}
}
@Test(dataProvider = "longMaskProvider")
static void maskFromToLongLong256VectorTests(IntFunction<long[]> fa) {
long[] a = fa.apply(SPECIES.length());
long[] r = new long[a.length];
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i++) {
VectorMask vmask = VectorMask.fromLong(SPECIES, a[i]);
r[i] = vmask.toLong();
}
}
assertArraysEquals(r, a, LONG_MASK_BITS);
}
@Test(dataProvider = "longCompareOpProvider")
static void ltLong256VectorTestsBroadcastSmokeTest(IntFunction<long[]> fa, IntFunction<long[]> fb) {
long[] a = fa.apply(SPECIES.length());
@ -6619,115 +6809,22 @@ public class Long256VectorTests extends AbstractVectorTest {
}
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskEqualsLong256VectorTestsSmokeTest(IntFunction<boolean[]> fa, IntFunction<boolean[]> fb) {
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskEqualsLong256VectorTests(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));
for (int ic = 0; ic < INVOC_COUNT; ic++) {
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 maskAndLong256VectorTestsSmokeTest(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, Long256VectorTests::band);
}
static boolean bor(boolean a, boolean b) {
return a | b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskOrLong256VectorTestsSmokeTest(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, Long256VectorTests::bor);
}
static boolean bxor(boolean a, boolean b) {
return a != b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskXorLong256VectorTestsSmokeTest(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, Long256VectorTests::bxor);
}
static boolean bandNot(boolean a, boolean b) {
return a & !b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskAndNotLong256VectorTestsSmokeTest(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, Long256VectorTests::bandNot);
}
static boolean beq(boolean a, boolean b) {
return (a == b);
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskEqLong256VectorTestsSmokeTest(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, Long256VectorTests::beq);
}
@Test(dataProvider = "maskProvider")
static void maskHashCodeLong256VectorTestsSmokeTest(IntFunction<boolean[]> fa) {
boolean[] a = fa.apply(SPECIES.length());
@ -6832,23 +6929,6 @@ public class Long256VectorTests extends AbstractVectorTest {
}
}
@DataProvider
public static Object[][] longMaskProvider() {
return new Object[][]{
{0xFFFFFFFFFFFFFFFFL},
{0x0000000000000000L},
{0x5555555555555555L},
{0x0123456789abcdefL},
};
}
@Test(dataProvider = "longMaskProvider")
static void maskFromToLongLong256VectorTestsSmokeTest(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[][]{

View File

@ -350,6 +350,36 @@ public class Long512VectorTests extends AbstractVectorTest {
}
}
interface FBoolUnOp {
boolean apply(boolean a);
}
static void assertArraysEquals(boolean[] r, boolean[] a, FBoolUnOp 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]), "(" + a[i] + ") at index #" + i);
}
}
interface FBoolBinOp {
boolean apply(boolean a, boolean b);
}
static void assertArraysEquals(boolean[] r, boolean[] a, boolean[] b, FBoolBinOp 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);
}
}
interface FBinOp {
long apply(long a, long b);
}
@ -1075,12 +1105,6 @@ public class Long512VectorTests extends AbstractVectorTest {
.flatMap(pair -> LONG_SATURATING_GENERATORS_ASSOC.stream().map(f -> List.of(pair.get(0), pair.get(1), f)))
.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<long[]>>> LONG_GENERATOR_TRIPLES =
LONG_GENERATOR_PAIRS.stream().
@ -1219,8 +1243,23 @@ public class Long512VectorTests extends AbstractVectorTest {
}
@DataProvider
public Object[][] maskCompareOpProvider() {
return BOOLEAN_MASK_COMPARE_GENERATOR_PAIRS.stream().map(List::toArray).
public Object[][] longMaskProvider() {
return LONG_MASK_GENERATORS.stream().
map(f -> new Object[]{f}).
toArray(Object[][]::new);
}
@DataProvider
public Object[][] boolMaskBinaryOpProvider() {
return BOOLEAN_MASK_COMPARE_GENERATOR_PAIRS.stream().
map(List::toArray).
toArray(Object[][]::new);
}
@DataProvider
public Object[][] boolMaskUnaryOpProvider() {
return BOOLEAN_MASK_GENERATORS.stream().
map(f -> new Object[]{f}).
toArray(Object[][]::new);
}
@ -4530,7 +4569,7 @@ public class Long512VectorTests extends AbstractVectorTest {
return res;
}
@Test(dataProvider = "boolUnaryOpProvider")
@Test(dataProvider = "boolMaskUnaryOpProvider")
static void anyTrueLong512VectorTests(IntFunction<boolean[]> fm) {
boolean[] mask = fm.apply(SPECIES.length());
boolean[] r = fmr.apply(SPECIES.length());
@ -4554,7 +4593,7 @@ public class Long512VectorTests extends AbstractVectorTest {
return res;
}
@Test(dataProvider = "boolUnaryOpProvider")
@Test(dataProvider = "boolMaskUnaryOpProvider")
static void allTrueLong512VectorTests(IntFunction<boolean[]> fm) {
boolean[] mask = fm.apply(SPECIES.length());
boolean[] r = fmr.apply(SPECIES.length());
@ -6386,6 +6425,157 @@ public class Long512VectorTests extends AbstractVectorTest {
assertArraysEquals(r, a, mask, Long512VectorTests::REVERSE_BYTES);
}
static boolean band(boolean a, boolean b) {
return a & b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskandLong512VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.and(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Long512VectorTests::band);
}
static boolean bor(boolean a, boolean b) {
return a | b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskorLong512VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.or(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Long512VectorTests::bor);
}
static boolean bxor(boolean a, boolean b) {
return a != b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskxorLong512VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.xor(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Long512VectorTests::bxor);
}
static boolean bandNot(boolean a, boolean b) {
return a & !b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskandNotLong512VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.andNot(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Long512VectorTests::bandNot);
}
static boolean beq(boolean a, boolean b) {
return a == b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskeqLong512VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.eq(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Long512VectorTests::beq);
}
static boolean unot(boolean a) {
return !a;
}
@Test(dataProvider = "boolMaskUnaryOpProvider")
static void masknotLong512VectorTests(IntFunction<boolean[]> fa) {
boolean[] a = fa.apply(SPECIES.length());
boolean[] r = new boolean[a.length];
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
av.not().intoArray(r, i);
}
}
assertArraysEquals(r, a, Long512VectorTests::unot);
}
private static final long LONG_MASK_BITS = 0xFFFFFFFFFFFFFFFFL >>> (64 - SPECIES.length());
static void assertArraysEquals(long[] r, long[] a, long bits) {
int i = 0;
try {
for (; i < a.length; i++) {
Assert.assertEquals(r[i], a[i] & bits);
}
} catch (AssertionError e) {
Assert.assertEquals(r[i], a[i] & bits, "(" + a[i] + ") at index #" + i);
}
}
@Test(dataProvider = "longMaskProvider")
static void maskFromToLongLong512VectorTests(IntFunction<long[]> fa) {
long[] a = fa.apply(SPECIES.length());
long[] r = new long[a.length];
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i++) {
VectorMask vmask = VectorMask.fromLong(SPECIES, a[i]);
r[i] = vmask.toLong();
}
}
assertArraysEquals(r, a, LONG_MASK_BITS);
}
@Test(dataProvider = "longCompareOpProvider")
static void ltLong512VectorTestsBroadcastSmokeTest(IntFunction<long[]> fa, IntFunction<long[]> fb) {
long[] a = fa.apply(SPECIES.length());
@ -6619,115 +6809,22 @@ public class Long512VectorTests extends AbstractVectorTest {
}
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskEqualsLong512VectorTestsSmokeTest(IntFunction<boolean[]> fa, IntFunction<boolean[]> fb) {
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskEqualsLong512VectorTests(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));
for (int ic = 0; ic < INVOC_COUNT; ic++) {
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 maskAndLong512VectorTestsSmokeTest(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, Long512VectorTests::band);
}
static boolean bor(boolean a, boolean b) {
return a | b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskOrLong512VectorTestsSmokeTest(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, Long512VectorTests::bor);
}
static boolean bxor(boolean a, boolean b) {
return a != b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskXorLong512VectorTestsSmokeTest(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, Long512VectorTests::bxor);
}
static boolean bandNot(boolean a, boolean b) {
return a & !b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskAndNotLong512VectorTestsSmokeTest(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, Long512VectorTests::bandNot);
}
static boolean beq(boolean a, boolean b) {
return (a == b);
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskEqLong512VectorTestsSmokeTest(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, Long512VectorTests::beq);
}
@Test(dataProvider = "maskProvider")
static void maskHashCodeLong512VectorTestsSmokeTest(IntFunction<boolean[]> fa) {
boolean[] a = fa.apply(SPECIES.length());
@ -6832,23 +6929,6 @@ public class Long512VectorTests extends AbstractVectorTest {
}
}
@DataProvider
public static Object[][] longMaskProvider() {
return new Object[][]{
{0xFFFFFFFFFFFFFFFFL},
{0x0000000000000000L},
{0x5555555555555555L},
{0x0123456789abcdefL},
};
}
@Test(dataProvider = "longMaskProvider")
static void maskFromToLongLong512VectorTestsSmokeTest(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[][]{

View File

@ -350,6 +350,36 @@ public class Long64VectorTests extends AbstractVectorTest {
}
}
interface FBoolUnOp {
boolean apply(boolean a);
}
static void assertArraysEquals(boolean[] r, boolean[] a, FBoolUnOp 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]), "(" + a[i] + ") at index #" + i);
}
}
interface FBoolBinOp {
boolean apply(boolean a, boolean b);
}
static void assertArraysEquals(boolean[] r, boolean[] a, boolean[] b, FBoolBinOp 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);
}
}
interface FBinOp {
long apply(long a, long b);
}
@ -1075,12 +1105,6 @@ public class Long64VectorTests extends AbstractVectorTest {
.flatMap(pair -> LONG_SATURATING_GENERATORS_ASSOC.stream().map(f -> List.of(pair.get(0), pair.get(1), f)))
.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<long[]>>> LONG_GENERATOR_TRIPLES =
LONG_GENERATOR_PAIRS.stream().
@ -1219,8 +1243,23 @@ public class Long64VectorTests extends AbstractVectorTest {
}
@DataProvider
public Object[][] maskCompareOpProvider() {
return BOOLEAN_MASK_COMPARE_GENERATOR_PAIRS.stream().map(List::toArray).
public Object[][] longMaskProvider() {
return LONG_MASK_GENERATORS.stream().
map(f -> new Object[]{f}).
toArray(Object[][]::new);
}
@DataProvider
public Object[][] boolMaskBinaryOpProvider() {
return BOOLEAN_MASK_COMPARE_GENERATOR_PAIRS.stream().
map(List::toArray).
toArray(Object[][]::new);
}
@DataProvider
public Object[][] boolMaskUnaryOpProvider() {
return BOOLEAN_MASK_GENERATORS.stream().
map(f -> new Object[]{f}).
toArray(Object[][]::new);
}
@ -4530,7 +4569,7 @@ public class Long64VectorTests extends AbstractVectorTest {
return res;
}
@Test(dataProvider = "boolUnaryOpProvider")
@Test(dataProvider = "boolMaskUnaryOpProvider")
static void anyTrueLong64VectorTests(IntFunction<boolean[]> fm) {
boolean[] mask = fm.apply(SPECIES.length());
boolean[] r = fmr.apply(SPECIES.length());
@ -4554,7 +4593,7 @@ public class Long64VectorTests extends AbstractVectorTest {
return res;
}
@Test(dataProvider = "boolUnaryOpProvider")
@Test(dataProvider = "boolMaskUnaryOpProvider")
static void allTrueLong64VectorTests(IntFunction<boolean[]> fm) {
boolean[] mask = fm.apply(SPECIES.length());
boolean[] r = fmr.apply(SPECIES.length());
@ -6386,6 +6425,157 @@ public class Long64VectorTests extends AbstractVectorTest {
assertArraysEquals(r, a, mask, Long64VectorTests::REVERSE_BYTES);
}
static boolean band(boolean a, boolean b) {
return a & b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskandLong64VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.and(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Long64VectorTests::band);
}
static boolean bor(boolean a, boolean b) {
return a | b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskorLong64VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.or(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Long64VectorTests::bor);
}
static boolean bxor(boolean a, boolean b) {
return a != b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskxorLong64VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.xor(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Long64VectorTests::bxor);
}
static boolean bandNot(boolean a, boolean b) {
return a & !b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskandNotLong64VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.andNot(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Long64VectorTests::bandNot);
}
static boolean beq(boolean a, boolean b) {
return a == b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskeqLong64VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.eq(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Long64VectorTests::beq);
}
static boolean unot(boolean a) {
return !a;
}
@Test(dataProvider = "boolMaskUnaryOpProvider")
static void masknotLong64VectorTests(IntFunction<boolean[]> fa) {
boolean[] a = fa.apply(SPECIES.length());
boolean[] r = new boolean[a.length];
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
av.not().intoArray(r, i);
}
}
assertArraysEquals(r, a, Long64VectorTests::unot);
}
private static final long LONG_MASK_BITS = 0xFFFFFFFFFFFFFFFFL >>> (64 - SPECIES.length());
static void assertArraysEquals(long[] r, long[] a, long bits) {
int i = 0;
try {
for (; i < a.length; i++) {
Assert.assertEquals(r[i], a[i] & bits);
}
} catch (AssertionError e) {
Assert.assertEquals(r[i], a[i] & bits, "(" + a[i] + ") at index #" + i);
}
}
@Test(dataProvider = "longMaskProvider")
static void maskFromToLongLong64VectorTests(IntFunction<long[]> fa) {
long[] a = fa.apply(SPECIES.length());
long[] r = new long[a.length];
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i++) {
VectorMask vmask = VectorMask.fromLong(SPECIES, a[i]);
r[i] = vmask.toLong();
}
}
assertArraysEquals(r, a, LONG_MASK_BITS);
}
@Test(dataProvider = "longCompareOpProvider")
static void ltLong64VectorTestsBroadcastSmokeTest(IntFunction<long[]> fa, IntFunction<long[]> fb) {
long[] a = fa.apply(SPECIES.length());
@ -6619,115 +6809,22 @@ public class Long64VectorTests extends AbstractVectorTest {
}
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskEqualsLong64VectorTestsSmokeTest(IntFunction<boolean[]> fa, IntFunction<boolean[]> fb) {
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskEqualsLong64VectorTests(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));
for (int ic = 0; ic < INVOC_COUNT; ic++) {
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 maskAndLong64VectorTestsSmokeTest(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, Long64VectorTests::band);
}
static boolean bor(boolean a, boolean b) {
return a | b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskOrLong64VectorTestsSmokeTest(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, Long64VectorTests::bor);
}
static boolean bxor(boolean a, boolean b) {
return a != b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskXorLong64VectorTestsSmokeTest(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, Long64VectorTests::bxor);
}
static boolean bandNot(boolean a, boolean b) {
return a & !b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskAndNotLong64VectorTestsSmokeTest(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, Long64VectorTests::bandNot);
}
static boolean beq(boolean a, boolean b) {
return (a == b);
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskEqLong64VectorTestsSmokeTest(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, Long64VectorTests::beq);
}
@Test(dataProvider = "maskProvider")
static void maskHashCodeLong64VectorTestsSmokeTest(IntFunction<boolean[]> fa) {
boolean[] a = fa.apply(SPECIES.length());
@ -6832,23 +6929,6 @@ public class Long64VectorTests extends AbstractVectorTest {
}
}
@DataProvider
public static Object[][] longMaskProvider() {
return new Object[][]{
{0xFFFFFFFFFFFFFFFFL},
{0x0000000000000000L},
{0x5555555555555555L},
{0x0123456789abcdefL},
};
}
@Test(dataProvider = "longMaskProvider")
static void maskFromToLongLong64VectorTestsSmokeTest(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[][]{

View File

@ -355,6 +355,36 @@ public class LongMaxVectorTests extends AbstractVectorTest {
}
}
interface FBoolUnOp {
boolean apply(boolean a);
}
static void assertArraysEquals(boolean[] r, boolean[] a, FBoolUnOp 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]), "(" + a[i] + ") at index #" + i);
}
}
interface FBoolBinOp {
boolean apply(boolean a, boolean b);
}
static void assertArraysEquals(boolean[] r, boolean[] a, boolean[] b, FBoolBinOp 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);
}
}
interface FBinOp {
long apply(long a, long b);
}
@ -1080,12 +1110,6 @@ public class LongMaxVectorTests extends AbstractVectorTest {
.flatMap(pair -> LONG_SATURATING_GENERATORS_ASSOC.stream().map(f -> List.of(pair.get(0), pair.get(1), f)))
.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<long[]>>> LONG_GENERATOR_TRIPLES =
LONG_GENERATOR_PAIRS.stream().
@ -1224,8 +1248,23 @@ public class LongMaxVectorTests extends AbstractVectorTest {
}
@DataProvider
public Object[][] maskCompareOpProvider() {
return BOOLEAN_MASK_COMPARE_GENERATOR_PAIRS.stream().map(List::toArray).
public Object[][] longMaskProvider() {
return LONG_MASK_GENERATORS.stream().
map(f -> new Object[]{f}).
toArray(Object[][]::new);
}
@DataProvider
public Object[][] boolMaskBinaryOpProvider() {
return BOOLEAN_MASK_COMPARE_GENERATOR_PAIRS.stream().
map(List::toArray).
toArray(Object[][]::new);
}
@DataProvider
public Object[][] boolMaskUnaryOpProvider() {
return BOOLEAN_MASK_GENERATORS.stream().
map(f -> new Object[]{f}).
toArray(Object[][]::new);
}
@ -4535,7 +4574,7 @@ public class LongMaxVectorTests extends AbstractVectorTest {
return res;
}
@Test(dataProvider = "boolUnaryOpProvider")
@Test(dataProvider = "boolMaskUnaryOpProvider")
static void anyTrueLongMaxVectorTests(IntFunction<boolean[]> fm) {
boolean[] mask = fm.apply(SPECIES.length());
boolean[] r = fmr.apply(SPECIES.length());
@ -4559,7 +4598,7 @@ public class LongMaxVectorTests extends AbstractVectorTest {
return res;
}
@Test(dataProvider = "boolUnaryOpProvider")
@Test(dataProvider = "boolMaskUnaryOpProvider")
static void allTrueLongMaxVectorTests(IntFunction<boolean[]> fm) {
boolean[] mask = fm.apply(SPECIES.length());
boolean[] r = fmr.apply(SPECIES.length());
@ -6391,6 +6430,157 @@ public class LongMaxVectorTests extends AbstractVectorTest {
assertArraysEquals(r, a, mask, LongMaxVectorTests::REVERSE_BYTES);
}
static boolean band(boolean a, boolean b) {
return a & b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskandLongMaxVectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.and(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, LongMaxVectorTests::band);
}
static boolean bor(boolean a, boolean b) {
return a | b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskorLongMaxVectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.or(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, LongMaxVectorTests::bor);
}
static boolean bxor(boolean a, boolean b) {
return a != b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskxorLongMaxVectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.xor(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, LongMaxVectorTests::bxor);
}
static boolean bandNot(boolean a, boolean b) {
return a & !b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskandNotLongMaxVectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.andNot(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, LongMaxVectorTests::bandNot);
}
static boolean beq(boolean a, boolean b) {
return a == b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskeqLongMaxVectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.eq(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, LongMaxVectorTests::beq);
}
static boolean unot(boolean a) {
return !a;
}
@Test(dataProvider = "boolMaskUnaryOpProvider")
static void masknotLongMaxVectorTests(IntFunction<boolean[]> fa) {
boolean[] a = fa.apply(SPECIES.length());
boolean[] r = new boolean[a.length];
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
av.not().intoArray(r, i);
}
}
assertArraysEquals(r, a, LongMaxVectorTests::unot);
}
private static final long LONG_MASK_BITS = 0xFFFFFFFFFFFFFFFFL >>> (64 - SPECIES.length());
static void assertArraysEquals(long[] r, long[] a, long bits) {
int i = 0;
try {
for (; i < a.length; i++) {
Assert.assertEquals(r[i], a[i] & bits);
}
} catch (AssertionError e) {
Assert.assertEquals(r[i], a[i] & bits, "(" + a[i] + ") at index #" + i);
}
}
@Test(dataProvider = "longMaskProvider")
static void maskFromToLongLongMaxVectorTests(IntFunction<long[]> fa) {
long[] a = fa.apply(SPECIES.length());
long[] r = new long[a.length];
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i++) {
VectorMask vmask = VectorMask.fromLong(SPECIES, a[i]);
r[i] = vmask.toLong();
}
}
assertArraysEquals(r, a, LONG_MASK_BITS);
}
@Test(dataProvider = "longCompareOpProvider")
static void ltLongMaxVectorTestsBroadcastSmokeTest(IntFunction<long[]> fa, IntFunction<long[]> fb) {
long[] a = fa.apply(SPECIES.length());
@ -6624,115 +6814,22 @@ public class LongMaxVectorTests extends AbstractVectorTest {
}
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskEqualsLongMaxVectorTestsSmokeTest(IntFunction<boolean[]> fa, IntFunction<boolean[]> fb) {
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskEqualsLongMaxVectorTests(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));
for (int ic = 0; ic < INVOC_COUNT; ic++) {
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 maskAndLongMaxVectorTestsSmokeTest(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, LongMaxVectorTests::band);
}
static boolean bor(boolean a, boolean b) {
return a | b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskOrLongMaxVectorTestsSmokeTest(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, LongMaxVectorTests::bor);
}
static boolean bxor(boolean a, boolean b) {
return a != b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskXorLongMaxVectorTestsSmokeTest(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, LongMaxVectorTests::bxor);
}
static boolean bandNot(boolean a, boolean b) {
return a & !b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskAndNotLongMaxVectorTestsSmokeTest(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, LongMaxVectorTests::bandNot);
}
static boolean beq(boolean a, boolean b) {
return (a == b);
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskEqLongMaxVectorTestsSmokeTest(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, LongMaxVectorTests::beq);
}
@Test(dataProvider = "maskProvider")
static void maskHashCodeLongMaxVectorTestsSmokeTest(IntFunction<boolean[]> fa) {
boolean[] a = fa.apply(SPECIES.length());
@ -6837,7 +6934,6 @@ public class LongMaxVectorTests extends AbstractVectorTest {
}
}
@DataProvider
public static Object[][] offsetProvider() {
return new Object[][]{

View File

@ -393,6 +393,36 @@ public class Short128VectorTests extends AbstractVectorTest {
}
}
interface FBoolUnOp {
boolean apply(boolean a);
}
static void assertArraysEquals(boolean[] r, boolean[] a, FBoolUnOp 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]), "(" + a[i] + ") at index #" + i);
}
}
interface FBoolBinOp {
boolean apply(boolean a, boolean b);
}
static void assertArraysEquals(boolean[] r, boolean[] a, boolean[] b, FBoolBinOp 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);
}
}
interface FBinOp {
short apply(short a, short b);
}
@ -1085,12 +1115,6 @@ public class Short128VectorTests extends AbstractVectorTest {
.flatMap(pair -> SHORT_SATURATING_GENERATORS_ASSOC.stream().map(f -> List.of(pair.get(0), pair.get(1), f)))
.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<short[]>>> SHORT_GENERATOR_TRIPLES =
SHORT_GENERATOR_PAIRS.stream().
@ -1222,8 +1246,23 @@ public class Short128VectorTests extends AbstractVectorTest {
}
@DataProvider
public Object[][] maskCompareOpProvider() {
return BOOLEAN_MASK_COMPARE_GENERATOR_PAIRS.stream().map(List::toArray).
public Object[][] longMaskProvider() {
return LONG_MASK_GENERATORS.stream().
map(f -> new Object[]{f}).
toArray(Object[][]::new);
}
@DataProvider
public Object[][] boolMaskBinaryOpProvider() {
return BOOLEAN_MASK_COMPARE_GENERATOR_PAIRS.stream().
map(List::toArray).
toArray(Object[][]::new);
}
@DataProvider
public Object[][] boolMaskUnaryOpProvider() {
return BOOLEAN_MASK_GENERATORS.stream().
map(f -> new Object[]{f}).
toArray(Object[][]::new);
}
@ -4455,7 +4494,7 @@ public class Short128VectorTests extends AbstractVectorTest {
return res;
}
@Test(dataProvider = "boolUnaryOpProvider")
@Test(dataProvider = "boolMaskUnaryOpProvider")
static void anyTrueShort128VectorTests(IntFunction<boolean[]> fm) {
boolean[] mask = fm.apply(SPECIES.length());
boolean[] r = fmr.apply(SPECIES.length());
@ -4479,7 +4518,7 @@ public class Short128VectorTests extends AbstractVectorTest {
return res;
}
@Test(dataProvider = "boolUnaryOpProvider")
@Test(dataProvider = "boolMaskUnaryOpProvider")
static void allTrueShort128VectorTests(IntFunction<boolean[]> fm) {
boolean[] mask = fm.apply(SPECIES.length());
boolean[] r = fmr.apply(SPECIES.length());
@ -6381,6 +6420,157 @@ public class Short128VectorTests extends AbstractVectorTest {
assertArraysEquals(r, a, mask, Short128VectorTests::REVERSE_BYTES);
}
static boolean band(boolean a, boolean b) {
return a & b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskandShort128VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.and(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Short128VectorTests::band);
}
static boolean bor(boolean a, boolean b) {
return a | b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskorShort128VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.or(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Short128VectorTests::bor);
}
static boolean bxor(boolean a, boolean b) {
return a != b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskxorShort128VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.xor(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Short128VectorTests::bxor);
}
static boolean bandNot(boolean a, boolean b) {
return a & !b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskandNotShort128VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.andNot(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Short128VectorTests::bandNot);
}
static boolean beq(boolean a, boolean b) {
return a == b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskeqShort128VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.eq(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Short128VectorTests::beq);
}
static boolean unot(boolean a) {
return !a;
}
@Test(dataProvider = "boolMaskUnaryOpProvider")
static void masknotShort128VectorTests(IntFunction<boolean[]> fa) {
boolean[] a = fa.apply(SPECIES.length());
boolean[] r = new boolean[a.length];
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
av.not().intoArray(r, i);
}
}
assertArraysEquals(r, a, Short128VectorTests::unot);
}
private static final long LONG_MASK_BITS = 0xFFFFFFFFFFFFFFFFL >>> (64 - SPECIES.length());
static void assertArraysEquals(long[] r, long[] a, long bits) {
int i = 0;
try {
for (; i < a.length; i++) {
Assert.assertEquals(r[i], a[i] & bits);
}
} catch (AssertionError e) {
Assert.assertEquals(r[i], a[i] & bits, "(" + a[i] + ") at index #" + i);
}
}
@Test(dataProvider = "longMaskProvider")
static void maskFromToLongShort128VectorTests(IntFunction<long[]> fa) {
long[] a = fa.apply(SPECIES.length());
long[] r = new long[a.length];
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i++) {
VectorMask vmask = VectorMask.fromLong(SPECIES, a[i]);
r[i] = vmask.toLong();
}
}
assertArraysEquals(r, a, LONG_MASK_BITS);
}
@Test(dataProvider = "shortCompareOpProvider")
static void ltShort128VectorTestsBroadcastSmokeTest(IntFunction<short[]> fa, IntFunction<short[]> fb) {
short[] a = fa.apply(SPECIES.length());
@ -6680,115 +6870,22 @@ public class Short128VectorTests extends AbstractVectorTest {
}
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskEqualsShort128VectorTestsSmokeTest(IntFunction<boolean[]> fa, IntFunction<boolean[]> fb) {
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskEqualsShort128VectorTests(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));
for (int ic = 0; ic < INVOC_COUNT; ic++) {
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 maskAndShort128VectorTestsSmokeTest(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, Short128VectorTests::band);
}
static boolean bor(boolean a, boolean b) {
return a | b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskOrShort128VectorTestsSmokeTest(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, Short128VectorTests::bor);
}
static boolean bxor(boolean a, boolean b) {
return a != b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskXorShort128VectorTestsSmokeTest(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, Short128VectorTests::bxor);
}
static boolean bandNot(boolean a, boolean b) {
return a & !b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskAndNotShort128VectorTestsSmokeTest(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, Short128VectorTests::bandNot);
}
static boolean beq(boolean a, boolean b) {
return (a == b);
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskEqShort128VectorTestsSmokeTest(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, Short128VectorTests::beq);
}
@Test(dataProvider = "maskProvider")
static void maskHashCodeShort128VectorTestsSmokeTest(IntFunction<boolean[]> fa) {
boolean[] a = fa.apply(SPECIES.length());
@ -6893,23 +6990,6 @@ public class Short128VectorTests extends AbstractVectorTest {
}
}
@DataProvider
public static Object[][] longMaskProvider() {
return new Object[][]{
{0xFFFFFFFFFFFFFFFFL},
{0x0000000000000000L},
{0x5555555555555555L},
{0x0123456789abcdefL},
};
}
@Test(dataProvider = "longMaskProvider")
static void maskFromToLongShort128VectorTestsSmokeTest(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[][]{

View File

@ -393,6 +393,36 @@ public class Short256VectorTests extends AbstractVectorTest {
}
}
interface FBoolUnOp {
boolean apply(boolean a);
}
static void assertArraysEquals(boolean[] r, boolean[] a, FBoolUnOp 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]), "(" + a[i] + ") at index #" + i);
}
}
interface FBoolBinOp {
boolean apply(boolean a, boolean b);
}
static void assertArraysEquals(boolean[] r, boolean[] a, boolean[] b, FBoolBinOp 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);
}
}
interface FBinOp {
short apply(short a, short b);
}
@ -1085,12 +1115,6 @@ public class Short256VectorTests extends AbstractVectorTest {
.flatMap(pair -> SHORT_SATURATING_GENERATORS_ASSOC.stream().map(f -> List.of(pair.get(0), pair.get(1), f)))
.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<short[]>>> SHORT_GENERATOR_TRIPLES =
SHORT_GENERATOR_PAIRS.stream().
@ -1222,8 +1246,23 @@ public class Short256VectorTests extends AbstractVectorTest {
}
@DataProvider
public Object[][] maskCompareOpProvider() {
return BOOLEAN_MASK_COMPARE_GENERATOR_PAIRS.stream().map(List::toArray).
public Object[][] longMaskProvider() {
return LONG_MASK_GENERATORS.stream().
map(f -> new Object[]{f}).
toArray(Object[][]::new);
}
@DataProvider
public Object[][] boolMaskBinaryOpProvider() {
return BOOLEAN_MASK_COMPARE_GENERATOR_PAIRS.stream().
map(List::toArray).
toArray(Object[][]::new);
}
@DataProvider
public Object[][] boolMaskUnaryOpProvider() {
return BOOLEAN_MASK_GENERATORS.stream().
map(f -> new Object[]{f}).
toArray(Object[][]::new);
}
@ -4455,7 +4494,7 @@ public class Short256VectorTests extends AbstractVectorTest {
return res;
}
@Test(dataProvider = "boolUnaryOpProvider")
@Test(dataProvider = "boolMaskUnaryOpProvider")
static void anyTrueShort256VectorTests(IntFunction<boolean[]> fm) {
boolean[] mask = fm.apply(SPECIES.length());
boolean[] r = fmr.apply(SPECIES.length());
@ -4479,7 +4518,7 @@ public class Short256VectorTests extends AbstractVectorTest {
return res;
}
@Test(dataProvider = "boolUnaryOpProvider")
@Test(dataProvider = "boolMaskUnaryOpProvider")
static void allTrueShort256VectorTests(IntFunction<boolean[]> fm) {
boolean[] mask = fm.apply(SPECIES.length());
boolean[] r = fmr.apply(SPECIES.length());
@ -6381,6 +6420,157 @@ public class Short256VectorTests extends AbstractVectorTest {
assertArraysEquals(r, a, mask, Short256VectorTests::REVERSE_BYTES);
}
static boolean band(boolean a, boolean b) {
return a & b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskandShort256VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.and(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Short256VectorTests::band);
}
static boolean bor(boolean a, boolean b) {
return a | b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskorShort256VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.or(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Short256VectorTests::bor);
}
static boolean bxor(boolean a, boolean b) {
return a != b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskxorShort256VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.xor(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Short256VectorTests::bxor);
}
static boolean bandNot(boolean a, boolean b) {
return a & !b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskandNotShort256VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.andNot(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Short256VectorTests::bandNot);
}
static boolean beq(boolean a, boolean b) {
return a == b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskeqShort256VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.eq(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Short256VectorTests::beq);
}
static boolean unot(boolean a) {
return !a;
}
@Test(dataProvider = "boolMaskUnaryOpProvider")
static void masknotShort256VectorTests(IntFunction<boolean[]> fa) {
boolean[] a = fa.apply(SPECIES.length());
boolean[] r = new boolean[a.length];
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
av.not().intoArray(r, i);
}
}
assertArraysEquals(r, a, Short256VectorTests::unot);
}
private static final long LONG_MASK_BITS = 0xFFFFFFFFFFFFFFFFL >>> (64 - SPECIES.length());
static void assertArraysEquals(long[] r, long[] a, long bits) {
int i = 0;
try {
for (; i < a.length; i++) {
Assert.assertEquals(r[i], a[i] & bits);
}
} catch (AssertionError e) {
Assert.assertEquals(r[i], a[i] & bits, "(" + a[i] + ") at index #" + i);
}
}
@Test(dataProvider = "longMaskProvider")
static void maskFromToLongShort256VectorTests(IntFunction<long[]> fa) {
long[] a = fa.apply(SPECIES.length());
long[] r = new long[a.length];
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i++) {
VectorMask vmask = VectorMask.fromLong(SPECIES, a[i]);
r[i] = vmask.toLong();
}
}
assertArraysEquals(r, a, LONG_MASK_BITS);
}
@Test(dataProvider = "shortCompareOpProvider")
static void ltShort256VectorTestsBroadcastSmokeTest(IntFunction<short[]> fa, IntFunction<short[]> fb) {
short[] a = fa.apply(SPECIES.length());
@ -6680,115 +6870,22 @@ public class Short256VectorTests extends AbstractVectorTest {
}
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskEqualsShort256VectorTestsSmokeTest(IntFunction<boolean[]> fa, IntFunction<boolean[]> fb) {
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskEqualsShort256VectorTests(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));
for (int ic = 0; ic < INVOC_COUNT; ic++) {
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 maskAndShort256VectorTestsSmokeTest(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, Short256VectorTests::band);
}
static boolean bor(boolean a, boolean b) {
return a | b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskOrShort256VectorTestsSmokeTest(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, Short256VectorTests::bor);
}
static boolean bxor(boolean a, boolean b) {
return a != b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskXorShort256VectorTestsSmokeTest(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, Short256VectorTests::bxor);
}
static boolean bandNot(boolean a, boolean b) {
return a & !b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskAndNotShort256VectorTestsSmokeTest(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, Short256VectorTests::bandNot);
}
static boolean beq(boolean a, boolean b) {
return (a == b);
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskEqShort256VectorTestsSmokeTest(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, Short256VectorTests::beq);
}
@Test(dataProvider = "maskProvider")
static void maskHashCodeShort256VectorTestsSmokeTest(IntFunction<boolean[]> fa) {
boolean[] a = fa.apply(SPECIES.length());
@ -6893,23 +6990,6 @@ public class Short256VectorTests extends AbstractVectorTest {
}
}
@DataProvider
public static Object[][] longMaskProvider() {
return new Object[][]{
{0xFFFFFFFFFFFFFFFFL},
{0x0000000000000000L},
{0x5555555555555555L},
{0x0123456789abcdefL},
};
}
@Test(dataProvider = "longMaskProvider")
static void maskFromToLongShort256VectorTestsSmokeTest(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[][]{

View File

@ -393,6 +393,36 @@ public class Short512VectorTests extends AbstractVectorTest {
}
}
interface FBoolUnOp {
boolean apply(boolean a);
}
static void assertArraysEquals(boolean[] r, boolean[] a, FBoolUnOp 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]), "(" + a[i] + ") at index #" + i);
}
}
interface FBoolBinOp {
boolean apply(boolean a, boolean b);
}
static void assertArraysEquals(boolean[] r, boolean[] a, boolean[] b, FBoolBinOp 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);
}
}
interface FBinOp {
short apply(short a, short b);
}
@ -1085,12 +1115,6 @@ public class Short512VectorTests extends AbstractVectorTest {
.flatMap(pair -> SHORT_SATURATING_GENERATORS_ASSOC.stream().map(f -> List.of(pair.get(0), pair.get(1), f)))
.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<short[]>>> SHORT_GENERATOR_TRIPLES =
SHORT_GENERATOR_PAIRS.stream().
@ -1222,8 +1246,23 @@ public class Short512VectorTests extends AbstractVectorTest {
}
@DataProvider
public Object[][] maskCompareOpProvider() {
return BOOLEAN_MASK_COMPARE_GENERATOR_PAIRS.stream().map(List::toArray).
public Object[][] longMaskProvider() {
return LONG_MASK_GENERATORS.stream().
map(f -> new Object[]{f}).
toArray(Object[][]::new);
}
@DataProvider
public Object[][] boolMaskBinaryOpProvider() {
return BOOLEAN_MASK_COMPARE_GENERATOR_PAIRS.stream().
map(List::toArray).
toArray(Object[][]::new);
}
@DataProvider
public Object[][] boolMaskUnaryOpProvider() {
return BOOLEAN_MASK_GENERATORS.stream().
map(f -> new Object[]{f}).
toArray(Object[][]::new);
}
@ -4455,7 +4494,7 @@ public class Short512VectorTests extends AbstractVectorTest {
return res;
}
@Test(dataProvider = "boolUnaryOpProvider")
@Test(dataProvider = "boolMaskUnaryOpProvider")
static void anyTrueShort512VectorTests(IntFunction<boolean[]> fm) {
boolean[] mask = fm.apply(SPECIES.length());
boolean[] r = fmr.apply(SPECIES.length());
@ -4479,7 +4518,7 @@ public class Short512VectorTests extends AbstractVectorTest {
return res;
}
@Test(dataProvider = "boolUnaryOpProvider")
@Test(dataProvider = "boolMaskUnaryOpProvider")
static void allTrueShort512VectorTests(IntFunction<boolean[]> fm) {
boolean[] mask = fm.apply(SPECIES.length());
boolean[] r = fmr.apply(SPECIES.length());
@ -6381,6 +6420,157 @@ public class Short512VectorTests extends AbstractVectorTest {
assertArraysEquals(r, a, mask, Short512VectorTests::REVERSE_BYTES);
}
static boolean band(boolean a, boolean b) {
return a & b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskandShort512VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.and(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Short512VectorTests::band);
}
static boolean bor(boolean a, boolean b) {
return a | b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskorShort512VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.or(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Short512VectorTests::bor);
}
static boolean bxor(boolean a, boolean b) {
return a != b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskxorShort512VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.xor(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Short512VectorTests::bxor);
}
static boolean bandNot(boolean a, boolean b) {
return a & !b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskandNotShort512VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.andNot(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Short512VectorTests::bandNot);
}
static boolean beq(boolean a, boolean b) {
return a == b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskeqShort512VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.eq(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Short512VectorTests::beq);
}
static boolean unot(boolean a) {
return !a;
}
@Test(dataProvider = "boolMaskUnaryOpProvider")
static void masknotShort512VectorTests(IntFunction<boolean[]> fa) {
boolean[] a = fa.apply(SPECIES.length());
boolean[] r = new boolean[a.length];
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
av.not().intoArray(r, i);
}
}
assertArraysEquals(r, a, Short512VectorTests::unot);
}
private static final long LONG_MASK_BITS = 0xFFFFFFFFFFFFFFFFL >>> (64 - SPECIES.length());
static void assertArraysEquals(long[] r, long[] a, long bits) {
int i = 0;
try {
for (; i < a.length; i++) {
Assert.assertEquals(r[i], a[i] & bits);
}
} catch (AssertionError e) {
Assert.assertEquals(r[i], a[i] & bits, "(" + a[i] + ") at index #" + i);
}
}
@Test(dataProvider = "longMaskProvider")
static void maskFromToLongShort512VectorTests(IntFunction<long[]> fa) {
long[] a = fa.apply(SPECIES.length());
long[] r = new long[a.length];
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i++) {
VectorMask vmask = VectorMask.fromLong(SPECIES, a[i]);
r[i] = vmask.toLong();
}
}
assertArraysEquals(r, a, LONG_MASK_BITS);
}
@Test(dataProvider = "shortCompareOpProvider")
static void ltShort512VectorTestsBroadcastSmokeTest(IntFunction<short[]> fa, IntFunction<short[]> fb) {
short[] a = fa.apply(SPECIES.length());
@ -6680,115 +6870,22 @@ public class Short512VectorTests extends AbstractVectorTest {
}
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskEqualsShort512VectorTestsSmokeTest(IntFunction<boolean[]> fa, IntFunction<boolean[]> fb) {
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskEqualsShort512VectorTests(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));
for (int ic = 0; ic < INVOC_COUNT; ic++) {
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 maskAndShort512VectorTestsSmokeTest(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, Short512VectorTests::band);
}
static boolean bor(boolean a, boolean b) {
return a | b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskOrShort512VectorTestsSmokeTest(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, Short512VectorTests::bor);
}
static boolean bxor(boolean a, boolean b) {
return a != b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskXorShort512VectorTestsSmokeTest(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, Short512VectorTests::bxor);
}
static boolean bandNot(boolean a, boolean b) {
return a & !b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskAndNotShort512VectorTestsSmokeTest(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, Short512VectorTests::bandNot);
}
static boolean beq(boolean a, boolean b) {
return (a == b);
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskEqShort512VectorTestsSmokeTest(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, Short512VectorTests::beq);
}
@Test(dataProvider = "maskProvider")
static void maskHashCodeShort512VectorTestsSmokeTest(IntFunction<boolean[]> fa) {
boolean[] a = fa.apply(SPECIES.length());
@ -6893,23 +6990,6 @@ public class Short512VectorTests extends AbstractVectorTest {
}
}
@DataProvider
public static Object[][] longMaskProvider() {
return new Object[][]{
{0xFFFFFFFFFFFFFFFFL},
{0x0000000000000000L},
{0x5555555555555555L},
{0x0123456789abcdefL},
};
}
@Test(dataProvider = "longMaskProvider")
static void maskFromToLongShort512VectorTestsSmokeTest(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[][]{

View File

@ -393,6 +393,36 @@ public class Short64VectorTests extends AbstractVectorTest {
}
}
interface FBoolUnOp {
boolean apply(boolean a);
}
static void assertArraysEquals(boolean[] r, boolean[] a, FBoolUnOp 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]), "(" + a[i] + ") at index #" + i);
}
}
interface FBoolBinOp {
boolean apply(boolean a, boolean b);
}
static void assertArraysEquals(boolean[] r, boolean[] a, boolean[] b, FBoolBinOp 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);
}
}
interface FBinOp {
short apply(short a, short b);
}
@ -1085,12 +1115,6 @@ public class Short64VectorTests extends AbstractVectorTest {
.flatMap(pair -> SHORT_SATURATING_GENERATORS_ASSOC.stream().map(f -> List.of(pair.get(0), pair.get(1), f)))
.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<short[]>>> SHORT_GENERATOR_TRIPLES =
SHORT_GENERATOR_PAIRS.stream().
@ -1222,8 +1246,23 @@ public class Short64VectorTests extends AbstractVectorTest {
}
@DataProvider
public Object[][] maskCompareOpProvider() {
return BOOLEAN_MASK_COMPARE_GENERATOR_PAIRS.stream().map(List::toArray).
public Object[][] longMaskProvider() {
return LONG_MASK_GENERATORS.stream().
map(f -> new Object[]{f}).
toArray(Object[][]::new);
}
@DataProvider
public Object[][] boolMaskBinaryOpProvider() {
return BOOLEAN_MASK_COMPARE_GENERATOR_PAIRS.stream().
map(List::toArray).
toArray(Object[][]::new);
}
@DataProvider
public Object[][] boolMaskUnaryOpProvider() {
return BOOLEAN_MASK_GENERATORS.stream().
map(f -> new Object[]{f}).
toArray(Object[][]::new);
}
@ -4455,7 +4494,7 @@ public class Short64VectorTests extends AbstractVectorTest {
return res;
}
@Test(dataProvider = "boolUnaryOpProvider")
@Test(dataProvider = "boolMaskUnaryOpProvider")
static void anyTrueShort64VectorTests(IntFunction<boolean[]> fm) {
boolean[] mask = fm.apply(SPECIES.length());
boolean[] r = fmr.apply(SPECIES.length());
@ -4479,7 +4518,7 @@ public class Short64VectorTests extends AbstractVectorTest {
return res;
}
@Test(dataProvider = "boolUnaryOpProvider")
@Test(dataProvider = "boolMaskUnaryOpProvider")
static void allTrueShort64VectorTests(IntFunction<boolean[]> fm) {
boolean[] mask = fm.apply(SPECIES.length());
boolean[] r = fmr.apply(SPECIES.length());
@ -6381,6 +6420,157 @@ public class Short64VectorTests extends AbstractVectorTest {
assertArraysEquals(r, a, mask, Short64VectorTests::REVERSE_BYTES);
}
static boolean band(boolean a, boolean b) {
return a & b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskandShort64VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.and(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Short64VectorTests::band);
}
static boolean bor(boolean a, boolean b) {
return a | b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskorShort64VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.or(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Short64VectorTests::bor);
}
static boolean bxor(boolean a, boolean b) {
return a != b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskxorShort64VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.xor(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Short64VectorTests::bxor);
}
static boolean bandNot(boolean a, boolean b) {
return a & !b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskandNotShort64VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.andNot(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Short64VectorTests::bandNot);
}
static boolean beq(boolean a, boolean b) {
return a == b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskeqShort64VectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.eq(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, Short64VectorTests::beq);
}
static boolean unot(boolean a) {
return !a;
}
@Test(dataProvider = "boolMaskUnaryOpProvider")
static void masknotShort64VectorTests(IntFunction<boolean[]> fa) {
boolean[] a = fa.apply(SPECIES.length());
boolean[] r = new boolean[a.length];
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
av.not().intoArray(r, i);
}
}
assertArraysEquals(r, a, Short64VectorTests::unot);
}
private static final long LONG_MASK_BITS = 0xFFFFFFFFFFFFFFFFL >>> (64 - SPECIES.length());
static void assertArraysEquals(long[] r, long[] a, long bits) {
int i = 0;
try {
for (; i < a.length; i++) {
Assert.assertEquals(r[i], a[i] & bits);
}
} catch (AssertionError e) {
Assert.assertEquals(r[i], a[i] & bits, "(" + a[i] + ") at index #" + i);
}
}
@Test(dataProvider = "longMaskProvider")
static void maskFromToLongShort64VectorTests(IntFunction<long[]> fa) {
long[] a = fa.apply(SPECIES.length());
long[] r = new long[a.length];
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i++) {
VectorMask vmask = VectorMask.fromLong(SPECIES, a[i]);
r[i] = vmask.toLong();
}
}
assertArraysEquals(r, a, LONG_MASK_BITS);
}
@Test(dataProvider = "shortCompareOpProvider")
static void ltShort64VectorTestsBroadcastSmokeTest(IntFunction<short[]> fa, IntFunction<short[]> fb) {
short[] a = fa.apply(SPECIES.length());
@ -6680,115 +6870,22 @@ public class Short64VectorTests extends AbstractVectorTest {
}
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskEqualsShort64VectorTestsSmokeTest(IntFunction<boolean[]> fa, IntFunction<boolean[]> fb) {
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskEqualsShort64VectorTests(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));
for (int ic = 0; ic < INVOC_COUNT; ic++) {
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 maskAndShort64VectorTestsSmokeTest(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, Short64VectorTests::band);
}
static boolean bor(boolean a, boolean b) {
return a | b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskOrShort64VectorTestsSmokeTest(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, Short64VectorTests::bor);
}
static boolean bxor(boolean a, boolean b) {
return a != b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskXorShort64VectorTestsSmokeTest(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, Short64VectorTests::bxor);
}
static boolean bandNot(boolean a, boolean b) {
return a & !b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskAndNotShort64VectorTestsSmokeTest(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, Short64VectorTests::bandNot);
}
static boolean beq(boolean a, boolean b) {
return (a == b);
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskEqShort64VectorTestsSmokeTest(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, Short64VectorTests::beq);
}
@Test(dataProvider = "maskProvider")
static void maskHashCodeShort64VectorTestsSmokeTest(IntFunction<boolean[]> fa) {
boolean[] a = fa.apply(SPECIES.length());
@ -6893,23 +6990,6 @@ public class Short64VectorTests extends AbstractVectorTest {
}
}
@DataProvider
public static Object[][] longMaskProvider() {
return new Object[][]{
{0xFFFFFFFFFFFFFFFFL},
{0x0000000000000000L},
{0x5555555555555555L},
{0x0123456789abcdefL},
};
}
@Test(dataProvider = "longMaskProvider")
static void maskFromToLongShort64VectorTestsSmokeTest(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[][]{

View File

@ -398,6 +398,36 @@ public class ShortMaxVectorTests extends AbstractVectorTest {
}
}
interface FBoolUnOp {
boolean apply(boolean a);
}
static void assertArraysEquals(boolean[] r, boolean[] a, FBoolUnOp 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]), "(" + a[i] + ") at index #" + i);
}
}
interface FBoolBinOp {
boolean apply(boolean a, boolean b);
}
static void assertArraysEquals(boolean[] r, boolean[] a, boolean[] b, FBoolBinOp 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);
}
}
interface FBinOp {
short apply(short a, short b);
}
@ -1090,12 +1120,6 @@ public class ShortMaxVectorTests extends AbstractVectorTest {
.flatMap(pair -> SHORT_SATURATING_GENERATORS_ASSOC.stream().map(f -> List.of(pair.get(0), pair.get(1), f)))
.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<short[]>>> SHORT_GENERATOR_TRIPLES =
SHORT_GENERATOR_PAIRS.stream().
@ -1227,8 +1251,23 @@ public class ShortMaxVectorTests extends AbstractVectorTest {
}
@DataProvider
public Object[][] maskCompareOpProvider() {
return BOOLEAN_MASK_COMPARE_GENERATOR_PAIRS.stream().map(List::toArray).
public Object[][] longMaskProvider() {
return LONG_MASK_GENERATORS.stream().
map(f -> new Object[]{f}).
toArray(Object[][]::new);
}
@DataProvider
public Object[][] boolMaskBinaryOpProvider() {
return BOOLEAN_MASK_COMPARE_GENERATOR_PAIRS.stream().
map(List::toArray).
toArray(Object[][]::new);
}
@DataProvider
public Object[][] boolMaskUnaryOpProvider() {
return BOOLEAN_MASK_GENERATORS.stream().
map(f -> new Object[]{f}).
toArray(Object[][]::new);
}
@ -4460,7 +4499,7 @@ public class ShortMaxVectorTests extends AbstractVectorTest {
return res;
}
@Test(dataProvider = "boolUnaryOpProvider")
@Test(dataProvider = "boolMaskUnaryOpProvider")
static void anyTrueShortMaxVectorTests(IntFunction<boolean[]> fm) {
boolean[] mask = fm.apply(SPECIES.length());
boolean[] r = fmr.apply(SPECIES.length());
@ -4484,7 +4523,7 @@ public class ShortMaxVectorTests extends AbstractVectorTest {
return res;
}
@Test(dataProvider = "boolUnaryOpProvider")
@Test(dataProvider = "boolMaskUnaryOpProvider")
static void allTrueShortMaxVectorTests(IntFunction<boolean[]> fm) {
boolean[] mask = fm.apply(SPECIES.length());
boolean[] r = fmr.apply(SPECIES.length());
@ -6386,6 +6425,157 @@ public class ShortMaxVectorTests extends AbstractVectorTest {
assertArraysEquals(r, a, mask, ShortMaxVectorTests::REVERSE_BYTES);
}
static boolean band(boolean a, boolean b) {
return a & b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskandShortMaxVectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.and(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, ShortMaxVectorTests::band);
}
static boolean bor(boolean a, boolean b) {
return a | b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskorShortMaxVectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.or(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, ShortMaxVectorTests::bor);
}
static boolean bxor(boolean a, boolean b) {
return a != b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskxorShortMaxVectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.xor(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, ShortMaxVectorTests::bxor);
}
static boolean bandNot(boolean a, boolean b) {
return a & !b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskandNotShortMaxVectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.andNot(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, ShortMaxVectorTests::bandNot);
}
static boolean beq(boolean a, boolean b) {
return a == b;
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskeqShortMaxVectorTests(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 ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.eq(bv).intoArray(r, i);
}
}
assertArraysEquals(r, a, b, ShortMaxVectorTests::beq);
}
static boolean unot(boolean a) {
return !a;
}
@Test(dataProvider = "boolMaskUnaryOpProvider")
static void masknotShortMaxVectorTests(IntFunction<boolean[]> fa) {
boolean[] a = fa.apply(SPECIES.length());
boolean[] r = new boolean[a.length];
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
av.not().intoArray(r, i);
}
}
assertArraysEquals(r, a, ShortMaxVectorTests::unot);
}
private static final long LONG_MASK_BITS = 0xFFFFFFFFFFFFFFFFL >>> (64 - SPECIES.length());
static void assertArraysEquals(long[] r, long[] a, long bits) {
int i = 0;
try {
for (; i < a.length; i++) {
Assert.assertEquals(r[i], a[i] & bits);
}
} catch (AssertionError e) {
Assert.assertEquals(r[i], a[i] & bits, "(" + a[i] + ") at index #" + i);
}
}
@Test(dataProvider = "longMaskProvider")
static void maskFromToLongShortMaxVectorTests(IntFunction<long[]> fa) {
long[] a = fa.apply(SPECIES.length());
long[] r = new long[a.length];
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i++) {
VectorMask vmask = VectorMask.fromLong(SPECIES, a[i]);
r[i] = vmask.toLong();
}
}
assertArraysEquals(r, a, LONG_MASK_BITS);
}
@Test(dataProvider = "shortCompareOpProvider")
static void ltShortMaxVectorTestsBroadcastSmokeTest(IntFunction<short[]> fa, IntFunction<short[]> fb) {
short[] a = fa.apply(SPECIES.length());
@ -6685,115 +6875,22 @@ public class ShortMaxVectorTests extends AbstractVectorTest {
}
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskEqualsShortMaxVectorTestsSmokeTest(IntFunction<boolean[]> fa, IntFunction<boolean[]> fb) {
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskEqualsShortMaxVectorTests(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));
for (int ic = 0; ic < INVOC_COUNT; ic++) {
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 maskAndShortMaxVectorTestsSmokeTest(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, ShortMaxVectorTests::band);
}
static boolean bor(boolean a, boolean b) {
return a | b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskOrShortMaxVectorTestsSmokeTest(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, ShortMaxVectorTests::bor);
}
static boolean bxor(boolean a, boolean b) {
return a != b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskXorShortMaxVectorTestsSmokeTest(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, ShortMaxVectorTests::bxor);
}
static boolean bandNot(boolean a, boolean b) {
return a & !b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskAndNotShortMaxVectorTestsSmokeTest(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, ShortMaxVectorTests::bandNot);
}
static boolean beq(boolean a, boolean b) {
return (a == b);
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskEqShortMaxVectorTestsSmokeTest(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, ShortMaxVectorTests::beq);
}
@Test(dataProvider = "maskProvider")
static void maskHashCodeShortMaxVectorTestsSmokeTest(IntFunction<boolean[]> fa) {
boolean[] a = fa.apply(SPECIES.length());
@ -6898,7 +6995,6 @@ public class ShortMaxVectorTests extends AbstractVectorTest {
}
}
@DataProvider
public static Object[][] offsetProvider() {
return new Object[][]{

View File

@ -73,6 +73,9 @@ binary_math_template="Binary-op-math"
binary_math_broadcast_template="Binary-Broadcast-op-math"
bool_reduction_scalar="BoolReduction-Scalar-op"
bool_reduction_template="BoolReduction-op"
bool_binary_template="BoolBinary-op"
bool_unary_template="BoolUnary-op"
mask_fromtolong_template="Mask-FromToLong"
with_op_template="With-Op"
shift_template="Shift-op"
shift_masked_template="Shift-Masked-op"
@ -230,7 +233,8 @@ function gen_op_tmpl {
local gen_perf_tests=$generate_perf_tests
if [[ $template == *"-Broadcast-"* ]] || [[ $template == "Miscellaneous" ]] ||
[[ $template == *"Compare-Masked"* ]] || [[ $template == *"Compare-Broadcast"* ]]; then
[[ $template == *"Compare-Masked"* ]] || [[ $template == *"Compare-Broadcast"* ]] ||
[[ $template == *"Mask-Binary"* ]]; then
gen_perf_tests=false
fi
if [ $gen_perf_tests == true ]; then
@ -625,6 +629,15 @@ gen_unary_alu_op "REVERSE_BYTES" "\$Boxtype\$.reverseBytes(a)" "intOrLong"
gen_unary_alu_op "REVERSE_BYTES" "\$Boxtype\$.reverseBytes(a)" "short"
gen_unary_alu_op "REVERSE_BYTES" "a" "byte"
# Mask operations
gen_op_tmpl $bool_binary_template "and" "a \& b"
gen_op_tmpl $bool_binary_template "or" "a | b"
gen_op_tmpl $bool_binary_template "xor" "a != b"
gen_op_tmpl $bool_binary_template "andNot" "a \& !b"
gen_op_tmpl $bool_binary_template "eq" "a == b"
gen_op_tmpl $bool_unary_template "not" "!a"
gen_op_tmpl $mask_fromtolong_template "FromToLong" ""
# Miscellaneous Smoke Tests
gen_op_tmpl $miscellaneous_template "MISC" "" ""

View File

@ -0,0 +1,11 @@
boolean[] a = fa.apply(SPECIES.length());
boolean[] b = fb.apply(SPECIES.length());
boolean[] r = new boolean[a.length];
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
VectorMask bv = SPECIES.loadMask(b, i);
av.[[TEST]](bv).intoArray(r, i);
}
}

View File

@ -0,0 +1,9 @@
boolean[] a = fa.apply(SPECIES.length());
boolean[] r = new boolean[a.length];
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i += SPECIES.length()) {
VectorMask av = SPECIES.loadMask(a, i);
av.[[TEST]]().intoArray(r, i);
}
}

View File

@ -0,0 +1,10 @@
static boolean b[[TEST]](boolean a, boolean b) {
return [[TEST_OP]];
}
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void mask[[TEST]]$vectorteststype$(IntFunction<boolean[]> fa, IntFunction<boolean[]> fb) {
[[KERNEL]]
assertArraysEquals(r, a, b, $vectorteststype$::b[[TEST]]);
}

View File

@ -0,0 +1,10 @@
static boolean u[[TEST]](boolean a) {
return [[TEST_OP]];
}
@Test(dataProvider = "boolMaskUnaryOpProvider")
static void mask[[TEST]]$vectorteststype$(IntFunction<boolean[]> fa) {
[[KERNEL]]
assertArraysEquals(r, a, $vectorteststype$::u[[TEST]]);
}

View File

@ -0,0 +1,27 @@
private static final long LONG_MASK_BITS = 0xFFFFFFFFFFFFFFFFL >>> (64 - SPECIES.length());
static void assertArraysEquals(long[] r, long[] a, long bits) {
int i = 0;
try {
for (; i < a.length; i++) {
Assert.assertEquals(r[i], a[i] & bits);
}
} catch (AssertionError e) {
Assert.assertEquals(r[i], a[i] & bits, "(" + a[i] + ") at index #" + i);
}
}
@Test(dataProvider = "longMaskProvider")
static void mask[[TEST]]$vectorteststype$(IntFunction<long[]> fa) {
long[] a = fa.apply(SPECIES.length());
long[] r = new long[a.length];
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < a.length; i++) {
VectorMask vmask = VectorMask.fromLong(SPECIES, a[i]);
r[i] = vmask.toLong();
}
}
assertArraysEquals(r, a, LONG_MASK_BITS);
}

View File

@ -382,115 +382,22 @@
}
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskEquals$vectorteststype$SmokeTest(IntFunction<boolean[]> fa, IntFunction<boolean[]> fb) {
@Test(dataProvider = "boolMaskBinaryOpProvider")
static void maskEquals$vectorteststype$(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));
for (int ic = 0; ic < INVOC_COUNT; ic++) {
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 maskAnd$vectorteststype$SmokeTest(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, $vectorteststype$::band);
}
static boolean bor(boolean a, boolean b) {
return a | b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskOr$vectorteststype$SmokeTest(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, $vectorteststype$::bor);
}
static boolean bxor(boolean a, boolean b) {
return a != b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskXor$vectorteststype$SmokeTest(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, $vectorteststype$::bxor);
}
static boolean bandNot(boolean a, boolean b) {
return a & !b;
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskAndNot$vectorteststype$SmokeTest(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, $vectorteststype$::bandNot);
}
static boolean beq(boolean a, boolean b) {
return (a == b);
}
@Test(dataProvider = "maskCompareOpProvider")
static void maskEq$vectorteststype$SmokeTest(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, $vectorteststype$::beq);
}
@Test(dataProvider = "maskProvider")
static void maskHashCode$vectorteststype$SmokeTest(IntFunction<boolean[]> fa) {
boolean[] a = fa.apply(SPECIES.length());
@ -595,25 +502,6 @@
}
}
#if[!MaxBit]
@DataProvider
public static Object[][] longMaskProvider() {
return new Object[][]{
{0xFFFFFFFFFFFFFFFFL},
{0x0000000000000000L},
{0x5555555555555555L},
{0x0123456789abcdefL},
};
}
@Test(dataProvider = "longMaskProvider")
static void maskFromToLong$vectorteststype$SmokeTest(long inputLong) {
var vmask = VectorMask.fromLong(SPECIES, inputLong);
long outputLong = vmask.toLong();
Assert.assertEquals(outputLong, (inputLong & (((0xFFFFFFFFFFFFFFFFL >>> (64 - SPECIES.length()))))));
}
#end[!MaxBit]
@DataProvider
public static Object[][] offsetProvider() {
return new Object[][]{

View File

@ -490,6 +490,36 @@ relativeError));
}
}
interface FBoolUnOp {
boolean apply(boolean a);
}
static void assertArraysEquals(boolean[] r, boolean[] a, FBoolUnOp 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]), "(" + a[i] + ") at index #" + i);
}
}
interface FBoolBinOp {
boolean apply(boolean a, boolean b);
}
static void assertArraysEquals(boolean[] r, boolean[] a, boolean[] b, FBoolBinOp 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);
}
}
interface FBinOp {
$type$ apply($type$ a, $type$ b);
}
@ -1521,8 +1551,23 @@ relativeError));
}
@DataProvider
public Object[][] maskCompareOpProvider() {
return BOOLEAN_MASK_COMPARE_GENERATOR_PAIRS.stream().map(List::toArray).
public Object[][] longMaskProvider() {
return LONG_MASK_GENERATORS.stream().
map(f -> new Object[]{f}).
toArray(Object[][]::new);
}
@DataProvider
public Object[][] boolMaskBinaryOpProvider() {
return BOOLEAN_MASK_COMPARE_GENERATOR_PAIRS.stream().
map(List::toArray).
toArray(Object[][]::new);
}
@DataProvider
public Object[][] boolMaskUnaryOpProvider() {
return BOOLEAN_MASK_GENERATORS.stream().
map(f -> new Object[]{f}).
toArray(Object[][]::new);
}