< prev index next > test/jdk/jdk/incubator/vector/templates/X-LoadStoreTest.java.template
Print this page
/*
! * Copyright (c) 2018, 2021, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
/*
! * Copyright (c) 2018, 2022, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
*/
#warn This file is preprocessed before being compiled
+ import jdk.incubator.foreign.MemorySegment;
+ import jdk.incubator.foreign.ResourceScope;
+ import jdk.incubator.foreign.ValueLayout;
import jdk.incubator.vector.$Type$Vector;
import jdk.incubator.vector.VectorMask;
#if[MaxBit]
import jdk.incubator.vector.VectorShape;
#end[MaxBit]
import jdk.internal.vm.annotation.DontInline;
import org.testng.Assert;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
- #if[MaxBit]
- import java.lang.invoke.MethodHandles;
- import java.lang.invoke.VarHandle;
- #end[MaxBit]
- import java.nio.ByteBuffer;
- #if[!byte]
- import java.nio.$Type$Buffer;
- #end[!byte]
import java.nio.ByteOrder;
- import java.nio.ReadOnlyBufferException;
import java.util.List;
import java.util.function.*;
@Test
public class $vectorteststype$ extends AbstractVectorLoadStoreTest {
} catch (AssertionError e) {
Assert.assertEquals(r[i], mask[i % SPECIES.length()] ? a[i] : ($type$) 0, "at index #" + i);
}
}
- #if[!byte]
- static void assertArraysEquals(byte[] r, byte[] a, boolean[] mask) {
- int i = 0;
- try {
- for (; i < a.length; i++) {
- Assert.assertEquals(r[i], mask[(i*8/SPECIES.elementSize()) % SPECIES.length()] ? a[i] : (byte) 0);
- }
- } catch (AssertionError e) {
- Assert.assertEquals(r[i], mask[(i*8/SPECIES.elementSize()) % SPECIES.length()] ? a[i] : (byte) 0, "at index #" + i);
- }
- }
- #end[!byte]
-
static final List<IntFunction<$type$[]>> $TYPE$_GENERATORS = List.of(
withToString("$type$[i * 5]", (int s) -> {
return fill(s * BUFFER_REPS,
i -> ($type$)(i * 5));
}),
withToString("l + speciesl + 1", (int l) -> {
return l + SPECIES.length() + 1;
})
);
! // Relative to byte[] array.length or ByteBuffer.limit()
static final List<IntFunction<Integer>> BYTE_INDEX_GENERATORS = List.of(
withToString("-1", (int l) -> {
return -1;
}),
withToString("l", (int l) -> {
withToString("l + speciesl + 1", (int l) -> {
return l + SPECIES.length() + 1;
})
);
! // Relative to byte[] array.length or MemorySegment.byteSize()
static final List<IntFunction<Integer>> BYTE_INDEX_GENERATORS = List.of(
withToString("-1", (int l) -> {
return -1;
}),
withToString("l", (int l) -> {
})).
toArray(Object[][]::new);
}
@DataProvider
! public Object[][] $type$ByteBufferProvider() {
return $TYPE$_GENERATORS.stream().
! flatMap(fa -> BYTE_BUFFER_GENERATORS.stream().
flatMap(fb -> BYTE_ORDER_VALUES.stream().map(bo -> {
return new Object[]{fa, fb, bo};
}))).
toArray(Object[][]::new);
}
@DataProvider
! public Object[][] $type$ByteBufferMaskProvider() {
return BOOLEAN_MASK_GENERATORS.stream().
flatMap(fm -> $TYPE$_GENERATORS.stream().
! flatMap(fa -> BYTE_BUFFER_GENERATORS.stream().
flatMap(fb -> BYTE_ORDER_VALUES.stream().map(bo -> {
return new Object[]{fa, fb, fm, bo};
})))).
toArray(Object[][]::new);
}
- @DataProvider
- public Object[][] $type$ByteArrayProvider() {
- return $TYPE$_GENERATORS.stream().
- flatMap(fa -> BYTE_ORDER_VALUES.stream().map(bo -> {
- return new Object[]{fa, bo};
- })).
- toArray(Object[][]::new);
- }
-
- @DataProvider
- public Object[][] $type$ByteArrayMaskProvider() {
- return BOOLEAN_MASK_GENERATORS.stream().
- flatMap(fm -> $TYPE$_GENERATORS.stream().
- flatMap(fa -> BYTE_ORDER_VALUES.stream().map(bo -> {
- return new Object[]{fa, fm, bo};
- }))).
- toArray(Object[][]::new);
- }
-
@DataProvider
public Object[][] $type$ByteProviderForIOOBE() {
var f = $TYPE$_GENERATORS.get(0);
return BYTE_INDEX_GENERATORS.stream().map(fi -> {
return new Object[] {f, fi};
})).
toArray(Object[][]::new);
}
@DataProvider
! public Object[][] $type$MemorySegmentProvider() {
return $TYPE$_GENERATORS.stream().
! flatMap(fa -> MEMORY_SEGMENT_GENERATORS.stream().
flatMap(fb -> BYTE_ORDER_VALUES.stream().map(bo -> {
return new Object[]{fa, fb, bo};
}))).
toArray(Object[][]::new);
}
@DataProvider
! public Object[][] $type$MemorySegmentMaskProvider() {
return BOOLEAN_MASK_GENERATORS.stream().
flatMap(fm -> $TYPE$_GENERATORS.stream().
! flatMap(fa -> MEMORY_SEGMENT_GENERATORS.stream().
flatMap(fb -> BYTE_ORDER_VALUES.stream().map(bo -> {
return new Object[]{fa, fb, fm, bo};
})))).
toArray(Object[][]::new);
}
@DataProvider
public Object[][] $type$ByteProviderForIOOBE() {
var f = $TYPE$_GENERATORS.get(0);
return BYTE_INDEX_GENERATORS.stream().map(fi -> {
return new Object[] {f, fi};
return new Object[] {f, fi, fm};
})).
toArray(Object[][]::new);
}
! static ByteBuffer toBuffer($type$[] a, IntFunction<ByteBuffer> fb) {
! ByteBuffer bb = fb.apply(a.length * SPECIES.elementSize() / 8);
! for ($type$ v : a) {
! bb.{#if[byte]?put(v):put$Type$(v)};
}
! return bb.clear();
- }
-
- static $type$[] bufferToArray(ByteBuffer bb) {
- $Type$Buffer db = bb{#if[byte]?;:.as$Type$Buffer();}
- $type$[] d = new $type$[db.capacity()];
- db.get(0, d);
- return d;
}
! static byte[] toByteArray($type$[] a, IntFunction<byte[]> fb, ByteOrder bo) {
! byte[] b = fb.apply(a.length * SPECIES.elementSize() / 8);
- #if[byte]
- $Type$Buffer bb = ByteBuffer.wrap(b, 0, b.length).order(bo);
- #else[byte]
- $Type$Buffer bb = ByteBuffer.wrap(b, 0, b.length).order(bo).as$Type$Buffer();
- #end[byte]
- for ($type$ v : a) {
- bb.put(v);
- }
- return b;
}
interface To$Type$F {
$type$ apply(int i);
return new Object[] {f, fi, fm};
})).
toArray(Object[][]::new);
}
! static MemorySegment toSegment($type$[] a, IntFunction<MemorySegment> fb) {
! MemorySegment ms = fb.apply(a.length * SPECIES.elementSize() / 8);
! for (int i = 0; i < a.length; i++) {
! ms.set(ValueLayout.JAVA_$TYPE$, i * SPECIES.elementSize() / 8 , a[i]);
}
! return ms;
}
! static $type$[] segmentToArray(MemorySegment ms) {
! return ms.toArray(ValueLayout.JAVA_$TYPE$);
}
interface To$Type$F {
$type$ apply(int i);
static void intoArray($abstractvectortype$ v, $type$[] a, int i, VectorMask<$Boxtype$> m) {
v.intoArray(a, i, m);
}
@DontInline
! static $abstractvectortype$ fromByteArray(byte[] a, int i, ByteOrder bo) {
! return $abstractvectortype$.fromByteArray(SPECIES, a, i, bo);
- }
-
- @DontInline
- static $abstractvectortype$ fromByteArray(byte[] a, int i, ByteOrder bo, VectorMask<$Boxtype$> m) {
- return $abstractvectortype$.fromByteArray(SPECIES, a, i, bo, m);
- }
-
- @DontInline
- static void intoByteArray($abstractvectortype$ v, byte[] a, int i, ByteOrder bo) {
- v.intoByteArray(a, i, bo);
}
@DontInline
! static void intoByteArray($abstractvectortype$ v, byte[] a, int i, ByteOrder bo, VectorMask<$Boxtype$> m) {
! v.intoByteArray(a, i, bo, m);
}
@DontInline
! static $abstractvectortype$ fromByteBuffer(ByteBuffer a, int i, ByteOrder bo) {
! return $abstractvectortype$.fromByteBuffer(SPECIES, a, i, bo);
}
@DontInline
! static $abstractvectortype$ fromByteBuffer(ByteBuffer a, int i, ByteOrder bo, VectorMask<$Boxtype$> m) {
! return $abstractvectortype$.fromByteBuffer(SPECIES, a, i, bo, m);
}
- @DontInline
- static void intoByteBuffer($abstractvectortype$ v, ByteBuffer a, int i, ByteOrder bo) {
- v.intoByteBuffer(a, i, bo);
- }
-
- @DontInline
- static void intoByteBuffer($abstractvectortype$ v, ByteBuffer a, int i, ByteOrder bo, VectorMask<$Boxtype$> m) {
- v.intoByteBuffer(a, i, bo, m);
- }
-
-
@Test(dataProvider = "$type$Provider")
static void loadStoreArray(IntFunction<$type$[]> fa) {
$type$[] a = fa.apply(SPECIES.length());
$type$[] r = new $type$[a.length];
static void intoArray($abstractvectortype$ v, $type$[] a, int i, VectorMask<$Boxtype$> m) {
v.intoArray(a, i, m);
}
@DontInline
! static $abstractvectortype$ fromMemorySegment(MemorySegment a, int i, ByteOrder bo) {
! return $abstractvectortype$.fromMemorySegment(SPECIES, a, i, bo);
}
@DontInline
! static $abstractvectortype$ fromMemorySegment(MemorySegment a, int i, ByteOrder bo, VectorMask<$Boxtype$> m) {
! return $abstractvectortype$.fromMemorySegment(SPECIES, a, i, bo, m);
}
@DontInline
! static void intoMemorySegment($abstractvectortype$ v, MemorySegment a, int i, ByteOrder bo) {
! v.intoMemorySegment(a, i, bo);
}
@DontInline
! static void intoMemorySegment($abstractvectortype$ v, MemorySegment a, int i, ByteOrder bo, VectorMask<$Boxtype$> m) {
! v.intoMemorySegment(a, i, bo, m);
}
@Test(dataProvider = "$type$Provider")
static void loadStoreArray(IntFunction<$type$[]> fa) {
$type$[] a = fa.apply(SPECIES.length());
$type$[] r = new $type$[a.length];
}
Assert.assertEquals(r, mask);
}
! @Test(dataProvider = "$type$ByteBufferProvider")
! static void loadStoreByteBuffer(IntFunction<$type$[]> fa,
! IntFunction<ByteBuffer> fb,
! ByteOrder bo) {
! ByteBuffer a = toBuffer(fa.apply(SPECIES.length()), fb);
! ByteBuffer r = fb.apply(a.limit());
! int l = a.limit();
int s = SPECIES.vectorByteSize();
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < l; i += s) {
! $abstractvectortype$ av = $abstractvectortype$.fromByteBuffer(SPECIES, a, i, bo);
! av.intoByteBuffer(r, i, bo);
}
}
! Assert.assertEquals(a.position(), 0, "Input buffer position changed");
! Assert.assertEquals(a.limit(), l, "Input buffer limit changed");
- Assert.assertEquals(r.position(), 0, "Result buffer position changed");
- Assert.assertEquals(r.limit(), l, "Result buffer limit changed");
- Assert.assertEquals(r, a, "Buffers not equal");
}
@Test(dataProvider = "$type$ByteProviderForIOOBE")
! static void loadByteBufferIOOBE(IntFunction<$type$[]> fa, IntFunction<Integer> fi) {
! ByteBuffer a = toBuffer(fa.apply(SPECIES.length()), ByteBuffer::allocateDirect);
! ByteBuffer r = ByteBuffer.allocateDirect(a.limit());
! int l = a.limit();
int s = SPECIES.vectorByteSize();
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < l; i += s) {
! $abstractvectortype$ av = fromByteBuffer(a, i, ByteOrder.nativeOrder());
! av.intoByteBuffer(r, i, ByteOrder.nativeOrder());
}
}
! int index = fi.apply(a.limit());
! boolean shouldFail = isIndexOutOfBounds(SPECIES.vectorByteSize(), index, a.limit());
try {
! fromByteBuffer(a, index, ByteOrder.nativeOrder());
if (shouldFail) {
Assert.fail("Failed to throw IndexOutOfBoundsException");
}
} catch (IndexOutOfBoundsException e) {
if (!shouldFail) {
}
Assert.assertEquals(r, mask);
}
! @Test(dataProvider = "$type$MemorySegmentProvider")
! static void loadStoreMemorySegment(IntFunction<$type$[]> fa,
! IntFunction<MemorySegment> fb,
! ByteOrder bo) {
! MemorySegment a = toSegment(fa.apply(SPECIES.length()), fb);
! MemorySegment r = fb.apply((int) a.byteSize());
! int l = (int) a.byteSize();
int s = SPECIES.vectorByteSize();
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < l; i += s) {
! $abstractvectortype$ av = $abstractvectortype$.fromMemorySegment(SPECIES, a, i, bo);
! av.intoMemorySegment(r, i, bo);
}
}
! long m = r.mismatch(a);
! Assert.assertEquals(m, -1, "Segments not equal");
}
@Test(dataProvider = "$type$ByteProviderForIOOBE")
! static void loadMemorySegmentIOOBE(IntFunction<$type$[]> fa, IntFunction<Integer> fi) {
! MemorySegment a = toSegment(fa.apply(SPECIES.length()), i -> MemorySegment.allocateNative(i, ResourceScope.newImplicitScope()));
! MemorySegment r = MemorySegment.allocateNative(a.byteSize(), ResourceScope.newImplicitScope());
! int l = (int) a.byteSize();
int s = SPECIES.vectorByteSize();
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < l; i += s) {
! $abstractvectortype$ av = fromMemorySegment(a, i, ByteOrder.nativeOrder());
! av.intoMemorySegment(r, i, ByteOrder.nativeOrder());
}
}
! int index = fi.apply((int) a.byteSize());
! boolean shouldFail = isIndexOutOfBounds(SPECIES.vectorByteSize(), index, (int) a.byteSize());
try {
! fromMemorySegment(a, index, ByteOrder.nativeOrder());
if (shouldFail) {
Assert.fail("Failed to throw IndexOutOfBoundsException");
}
} catch (IndexOutOfBoundsException e) {
if (!shouldFail) {
}
}
}
@Test(dataProvider = "$type$ByteProviderForIOOBE")
! static void storeByteBufferIOOBE(IntFunction<$type$[]> fa, IntFunction<Integer> fi) {
! ByteBuffer a = toBuffer(fa.apply(SPECIES.length()), ByteBuffer::allocateDirect);
! ByteBuffer r = ByteBuffer.allocateDirect(a.limit());
! int l = a.limit();
int s = SPECIES.vectorByteSize();
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < l; i += s) {
! $abstractvectortype$ av = $abstractvectortype$.fromByteBuffer(SPECIES, a, i, ByteOrder.nativeOrder());
! intoByteBuffer(av, r, i, ByteOrder.nativeOrder());
}
}
! int index = fi.apply(a.limit());
! boolean shouldFail = isIndexOutOfBounds(SPECIES.vectorByteSize(), index, a.limit());
try {
! $abstractvectortype$ av = $abstractvectortype$.fromByteBuffer(SPECIES, a, 0, ByteOrder.nativeOrder());
! intoByteBuffer(av, r, index, ByteOrder.nativeOrder());
if (shouldFail) {
Assert.fail("Failed to throw IndexOutOfBoundsException");
}
} catch (IndexOutOfBoundsException e) {
if (!shouldFail) {
Assert.fail("Unexpected IndexOutOfBoundsException");
}
}
}
!
! @Test(dataProvider = "$type$ByteBufferMaskProvider")
! static void loadStoreByteBufferMask(IntFunction<$type$[]> fa,
! IntFunction<ByteBuffer> fb,
! IntFunction<boolean[]> fm,
- ByteOrder bo) {
$type$[] _a = fa.apply(SPECIES.length());
! ByteBuffer a = toBuffer(_a, fb);
! ByteBuffer r = fb.apply(a.limit());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<$Boxtype$> vmask = VectorMask.fromValues(SPECIES, mask);
! int l = a.limit();
int s = SPECIES.vectorByteSize();
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < l; i += s) {
! $abstractvectortype$ av = $abstractvectortype$.fromByteBuffer(SPECIES, a, i, bo, vmask);
! av.intoByteBuffer(r, i, bo);
}
}
! Assert.assertEquals(a.position(), 0, "Input buffer position changed");
- Assert.assertEquals(a.limit(), l, "Input buffer limit changed");
- Assert.assertEquals(r.position(), 0, "Result buffer position changed");
- Assert.assertEquals(r.limit(), l, "Result buffer limit changed");
- assertArraysEquals(bufferToArray(r), _a, mask);
! r = fb.apply(a.limit());
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < l; i += s) {
! $abstractvectortype$ av = $abstractvectortype$.fromByteBuffer(SPECIES, a, i, bo);
! av.intoByteBuffer(r, i, bo, vmask);
}
}
! Assert.assertEquals(a.position(), 0, "Input buffer position changed");
- Assert.assertEquals(a.limit(), l, "Input buffer limit changed");
- Assert.assertEquals(r.position(), 0, "Result buffer position changed");
- Assert.assertEquals(r.limit(), l, "Result buffer limit changed");
- assertArraysEquals(bufferToArray(r), _a, mask);
}
@Test(dataProvider = "$type$ByteMaskProviderForIOOBE")
! static void loadByteBufferMaskIOOBE(IntFunction<$type$[]> fa, IntFunction<Integer> fi, IntFunction<boolean[]> fm) {
! ByteBuffer a = toBuffer(fa.apply(SPECIES.length()), ByteBuffer::allocateDirect);
! ByteBuffer r = ByteBuffer.allocateDirect(a.limit());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<$Boxtype$> vmask = VectorMask.fromValues(SPECIES, mask);
! int l = a.limit();
int s = SPECIES.vectorByteSize();
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < l; i += s) {
! $abstractvectortype$ av = fromByteBuffer(a, i, ByteOrder.nativeOrder(), vmask);
! av.intoByteBuffer(r, i, ByteOrder.nativeOrder());
}
}
! int index = fi.apply(a.limit());
! boolean shouldFail = isIndexOutOfBoundsForMask(mask, index, a.limit(), SPECIES.elementSize() / 8);
try {
! fromByteBuffer(a, index, ByteOrder.nativeOrder(), vmask);
if (shouldFail) {
Assert.fail("Failed to throw IndexOutOfBoundsException");
}
} catch (IndexOutOfBoundsException e) {
if (!shouldFail) {
}
}
}
@Test(dataProvider = "$type$ByteProviderForIOOBE")
! static void storeMemorySegmentIOOBE(IntFunction<$type$[]> fa, IntFunction<Integer> fi) {
! MemorySegment a = toSegment(fa.apply(SPECIES.length()), i -> MemorySegment.allocateNative(i, ResourceScope.newImplicitScope()));
! MemorySegment r = MemorySegment.allocateNative(a.byteSize(), ResourceScope.newImplicitScope());
! int l = (int) a.byteSize();
int s = SPECIES.vectorByteSize();
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < l; i += s) {
! $abstractvectortype$ av = $abstractvectortype$.fromMemorySegment(SPECIES, a, i, ByteOrder.nativeOrder());
! intoMemorySegment(av, r, i, ByteOrder.nativeOrder());
}
}
! int index = fi.apply((int) a.byteSize());
! boolean shouldFail = isIndexOutOfBounds(SPECIES.vectorByteSize(), index, (int) a.byteSize());
try {
! $abstractvectortype$ av = $abstractvectortype$.fromMemorySegment(SPECIES, a, 0, ByteOrder.nativeOrder());
! intoMemorySegment(av, r, index, ByteOrder.nativeOrder());
if (shouldFail) {
Assert.fail("Failed to throw IndexOutOfBoundsException");
}
} catch (IndexOutOfBoundsException e) {
if (!shouldFail) {
Assert.fail("Unexpected IndexOutOfBoundsException");
}
}
}
! @Test(dataProvider = "$type$MemorySegmentMaskProvider")
! static void loadStoreMemorySegmentMask(IntFunction<$type$[]> fa,
! IntFunction<MemorySegment> fb,
! IntFunction<boolean[]> fm,
! ByteOrder bo) {
$type$[] _a = fa.apply(SPECIES.length());
! MemorySegment a = toSegment(_a, fb);
! MemorySegment r = fb.apply((int) a.byteSize());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<$Boxtype$> vmask = VectorMask.fromValues(SPECIES, mask);
! int l = (int) a.byteSize();
int s = SPECIES.vectorByteSize();
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < l; i += s) {
! $abstractvectortype$ av = $abstractvectortype$.fromMemorySegment(SPECIES, a, i, bo, vmask);
! av.intoMemorySegment(r, i, bo);
}
}
! assertArraysEquals(segmentToArray(r), _a, mask);
! r = fb.apply((int) a.byteSize());
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < l; i += s) {
! $abstractvectortype$ av = $abstractvectortype$.fromMemorySegment(SPECIES, a, i, bo);
! av.intoMemorySegment(r, i, bo, vmask);
}
}
! assertArraysEquals(segmentToArray(r), _a, mask);
}
@Test(dataProvider = "$type$ByteMaskProviderForIOOBE")
! static void loadMemorySegmentMaskIOOBE(IntFunction<$type$[]> fa, IntFunction<Integer> fi, IntFunction<boolean[]> fm) {
! MemorySegment a = toSegment(fa.apply(SPECIES.length()), i -> MemorySegment.allocateNative(i, ResourceScope.newImplicitScope()));
! MemorySegment r = MemorySegment.allocateNative(a.byteSize(), ResourceScope.newImplicitScope());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<$Boxtype$> vmask = VectorMask.fromValues(SPECIES, mask);
! int l = (int) a.byteSize();
int s = SPECIES.vectorByteSize();
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < l; i += s) {
! $abstractvectortype$ av = fromMemorySegment(a, i, ByteOrder.nativeOrder(), vmask);
! av.intoMemorySegment(r, i, ByteOrder.nativeOrder());
}
}
! int index = fi.apply((int) a.byteSize());
! boolean shouldFail = isIndexOutOfBoundsForMask(mask, index, (int) a.byteSize(), SPECIES.elementSize() / 8);
try {
! fromMemorySegment(a, index, ByteOrder.nativeOrder(), vmask);
if (shouldFail) {
Assert.fail("Failed to throw IndexOutOfBoundsException");
}
} catch (IndexOutOfBoundsException e) {
if (!shouldFail) {
}
}
}
@Test(dataProvider = "$type$ByteMaskProviderForIOOBE")
! static void storeByteBufferMaskIOOBE(IntFunction<$type$[]> fa, IntFunction<Integer> fi, IntFunction<boolean[]> fm) {
! ByteBuffer a = toBuffer(fa.apply(SPECIES.length()), ByteBuffer::allocateDirect);
! ByteBuffer r = ByteBuffer.allocateDirect(a.limit());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<$Boxtype$> vmask = VectorMask.fromValues(SPECIES, mask);
! int l = a.limit();
- int s = SPECIES.vectorByteSize();
-
- for (int ic = 0; ic < INVOC_COUNT; ic++) {
- for (int i = 0; i < l; i += s) {
- $abstractvectortype$ av = $abstractvectortype$.fromByteBuffer(SPECIES, a, i, ByteOrder.nativeOrder());
- intoByteBuffer(av, r, i, ByteOrder.nativeOrder(), vmask);
- }
- }
-
- int index = fi.apply(a.limit());
- boolean shouldFail = isIndexOutOfBoundsForMask(mask, index, a.limit(), SPECIES.elementSize() / 8);
- try {
- $abstractvectortype$ av = $abstractvectortype$.fromByteBuffer(SPECIES, a, 0, ByteOrder.nativeOrder());
- intoByteBuffer(av, a, index, ByteOrder.nativeOrder(), vmask);
- if (shouldFail) {
- Assert.fail("Failed to throw IndexOutOfBoundsException");
- }
- } catch (IndexOutOfBoundsException e) {
- if (!shouldFail) {
- Assert.fail("Unexpected IndexOutOfBoundsException");
- }
- }
- }
-
-
- @Test(dataProvider = "$type$ByteBufferProvider")
- static void loadStoreReadonlyByteBuffer(IntFunction<$type$[]> fa,
- IntFunction<ByteBuffer> fb,
- ByteOrder bo) {
- ByteBuffer a = toBuffer(fa.apply(SPECIES.length()), fb).asReadOnlyBuffer();
-
- try {
- SPECIES.zero().intoByteBuffer(a, 0, bo);
- Assert.fail("ReadOnlyBufferException expected");
- } catch (ReadOnlyBufferException e) {
- }
-
- try {
- SPECIES.zero().intoByteBuffer(a, 0, bo, SPECIES.maskAll(true));
- Assert.fail("ReadOnlyBufferException expected");
- } catch (ReadOnlyBufferException e) {
- }
-
- try {
- SPECIES.zero().intoByteBuffer(a, 0, bo, SPECIES.maskAll(false));
- Assert.fail("ReadOnlyBufferException expected");
- } catch (ReadOnlyBufferException e) {
- }
-
- try {
- VectorMask<$Boxtype$> m = SPECIES.shuffleFromOp(i -> i % 2 == 0 ? 1 : -1)
- .laneIsValid();
- SPECIES.zero().intoByteBuffer(a, 0, bo, m);
- Assert.fail("ReadOnlyBufferException expected");
- } catch (ReadOnlyBufferException e) {
- }
- }
-
-
- @Test(dataProvider = "$type$ByteArrayProvider")
- static void loadStoreByteArray(IntFunction<$type$[]> fa,
- ByteOrder bo) {
- byte[] a = toByteArray(fa.apply(SPECIES.length()), byte[]::new, bo);
- byte[] r = new byte[a.length];
-
- int s = SPECIES.vectorByteSize();
- int l = a.length;
-
- for (int ic = 0; ic < INVOC_COUNT; ic++) {
- for (int i = 0; i < l; i += s) {
- $abstractvectortype$ av = $abstractvectortype$.fromByteArray(SPECIES, a, i, bo);
- av.intoByteArray(r, i, bo);
- }
- }
- Assert.assertEquals(r, a, "Byte arrays not equal");
- }
-
- @Test(dataProvider = "$type$ByteProviderForIOOBE")
- static void loadByteArrayIOOBE(IntFunction<$type$[]> fa, IntFunction<Integer> fi) {
- byte[] a = toByteArray(fa.apply(SPECIES.length()), byte[]::new, ByteOrder.nativeOrder());
- byte[] r = new byte[a.length];
-
- int s = SPECIES.vectorByteSize();
- int l = a.length;
-
- for (int ic = 0; ic < INVOC_COUNT; ic++) {
- for (int i = 0; i < l; i += s) {
- $abstractvectortype$ av = fromByteArray(a, i, ByteOrder.nativeOrder());
- av.intoByteArray(r, i, ByteOrder.nativeOrder());
- }
- }
-
- int index = fi.apply(a.length);
- boolean shouldFail = isIndexOutOfBounds(SPECIES.vectorByteSize(), index, a.length);
- try {
- fromByteArray(a, index, ByteOrder.nativeOrder());
- if (shouldFail) {
- Assert.fail("Failed to throw IndexOutOfBoundsException");
- }
- } catch (IndexOutOfBoundsException e) {
- if (!shouldFail) {
- Assert.fail("Unexpected IndexOutOfBoundsException");
- }
- }
- }
-
- @Test(dataProvider = "$type$ByteProviderForIOOBE")
- static void storeByteArrayIOOBE(IntFunction<$type$[]> fa, IntFunction<Integer> fi) {
- byte[] a = toByteArray(fa.apply(SPECIES.length()), byte[]::new, ByteOrder.nativeOrder());
- byte[] r = new byte[a.length];
-
int s = SPECIES.vectorByteSize();
- int l = a.length;
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < l; i += s) {
! $abstractvectortype$ av = $abstractvectortype$.fromByteArray(SPECIES, a, i, ByteOrder.nativeOrder());
! intoByteArray(av, r, i, ByteOrder.nativeOrder());
}
}
! int index = fi.apply(a.length);
! boolean shouldFail = isIndexOutOfBounds(SPECIES.vectorByteSize(), index, a.length);
try {
! $abstractvectortype$ av = $abstractvectortype$.fromByteArray(SPECIES, a, 0, ByteOrder.nativeOrder());
! intoByteArray(av, r, index, ByteOrder.nativeOrder());
if (shouldFail) {
Assert.fail("Failed to throw IndexOutOfBoundsException");
}
} catch (IndexOutOfBoundsException e) {
if (!shouldFail) {
Assert.fail("Unexpected IndexOutOfBoundsException");
}
}
}
! @Test(dataProvider = "$type$ByteArrayMaskProvider")
! static void loadStoreByteArrayMask(IntFunction<$type$[]> fa,
! IntFunction<boolean[]> fm,
! ByteOrder bo) {
- byte[] a = toByteArray(fa.apply(SPECIES.length()), byte[]::new, bo);
- byte[] r = new byte[a.length];
- boolean[] mask = fm.apply(SPECIES.length());
- VectorMask<$Boxtype$> vmask = VectorMask.fromValues(SPECIES, mask);
-
- int s = SPECIES.vectorByteSize();
- int l = a.length;
-
- for (int ic = 0; ic < INVOC_COUNT; ic++) {
- for (int i = 0; i < l; i += s) {
- $abstractvectortype$ av = $abstractvectortype$.fromByteArray(SPECIES, a, i, bo, vmask);
- av.intoByteArray(r, i, bo);
- }
- }
- assertArraysEquals(r, a, mask);
! r = new byte[a.length];
! for (int ic = 0; ic < INVOC_COUNT; ic++) {
! for (int i = 0; i < l; i += s) {
! $abstractvectortype$ av = $abstractvectortype$.fromByteArray(SPECIES, a, i, bo);
! av.intoByteArray(r, i, bo, vmask);
! }
! }
- assertArraysEquals(r, a, mask);
}
- @Test(dataProvider = "$type$ByteMaskProviderForIOOBE")
- static void loadByteArrayMaskIOOBE(IntFunction<$type$[]> fa, IntFunction<Integer> fi, IntFunction<boolean[]> fm) {
- byte[] a = toByteArray(fa.apply(SPECIES.length()), byte[]::new, ByteOrder.nativeOrder());
- byte[] r = new byte[a.length];
- boolean[] mask = fm.apply(SPECIES.length());
- VectorMask<$Boxtype$> vmask = VectorMask.fromValues(SPECIES, mask);
-
- int s = SPECIES.vectorByteSize();
- int l = a.length;
-
- for (int ic = 0; ic < INVOC_COUNT; ic++) {
- for (int i = 0; i < l; i += s) {
- $abstractvectortype$ av = fromByteArray(a, i, ByteOrder.nativeOrder(), vmask);
- av.intoByteArray(r, i, ByteOrder.nativeOrder());
- }
- }
-
- int index = fi.apply(a.length);
- boolean shouldFail = isIndexOutOfBoundsForMask(mask, index, a.length, SPECIES.elementSize() / 8);
- try {
- fromByteArray(a, index, ByteOrder.nativeOrder(), vmask);
- if (shouldFail) {
- Assert.fail("Failed to throw IndexOutOfBoundsException");
- }
- } catch (IndexOutOfBoundsException e) {
- if (!shouldFail) {
- Assert.fail("Unexpected IndexOutOfBoundsException");
- }
- }
- }
-
- @Test(dataProvider = "$type$ByteMaskProviderForIOOBE")
- static void storeByteArrayMaskIOOBE(IntFunction<$type$[]> fa, IntFunction<Integer> fi, IntFunction<boolean[]> fm) {
- byte[] a = toByteArray(fa.apply(SPECIES.length()), byte[]::new, ByteOrder.nativeOrder());
- byte[] r = new byte[a.length];
- boolean[] mask = fm.apply(SPECIES.length());
- VectorMask<$Boxtype$> vmask = VectorMask.fromValues(SPECIES, mask);
-
- int s = SPECIES.vectorByteSize();
- int l = a.length;
-
- for (int ic = 0; ic < INVOC_COUNT; ic++) {
- for (int i = 0; i < l; i += s) {
- $abstractvectortype$ av = $abstractvectortype$.fromByteArray(SPECIES, a, i, ByteOrder.nativeOrder());
- intoByteArray(av, r, i, ByteOrder.nativeOrder(), vmask);
- }
- }
-
- int index = fi.apply(a.length);
- boolean shouldFail = isIndexOutOfBoundsForMask(mask, index, a.length, SPECIES.elementSize() / 8);
- try {
- $abstractvectortype$ av = $abstractvectortype$.fromByteArray(SPECIES, a, 0, ByteOrder.nativeOrder());
- intoByteArray(av, a, index, ByteOrder.nativeOrder(), vmask);
- if (shouldFail) {
- Assert.fail("Failed to throw IndexOutOfBoundsException");
- }
- } catch (IndexOutOfBoundsException e) {
- if (!shouldFail) {
- Assert.fail("Unexpected IndexOutOfBoundsException");
- }
- }
- }
@Test(dataProvider = "maskProvider")
static void loadStoreMask(IntFunction<boolean[]> fm) {
boolean[] a = fm.apply(SPECIES.length());
boolean[] r = new boolean[a.length];
}
}
}
@Test(dataProvider = "$type$ByteMaskProviderForIOOBE")
! static void storeMemorySegmentMaskIOOBE(IntFunction<$type$[]> fa, IntFunction<Integer> fi, IntFunction<boolean[]> fm) {
! MemorySegment a = toSegment(fa.apply(SPECIES.length()), i -> MemorySegment.allocateNative(i, ResourceScope.newImplicitScope()));
! MemorySegment r = MemorySegment.allocateNative(a.byteSize(), ResourceScope.newImplicitScope());
boolean[] mask = fm.apply(SPECIES.length());
VectorMask<$Boxtype$> vmask = VectorMask.fromValues(SPECIES, mask);
! int l = (int) a.byteSize();
int s = SPECIES.vectorByteSize();
for (int ic = 0; ic < INVOC_COUNT; ic++) {
for (int i = 0; i < l; i += s) {
! $abstractvectortype$ av = $abstractvectortype$.fromMemorySegment(SPECIES, a, i, ByteOrder.nativeOrder());
! intoMemorySegment(av, r, i, ByteOrder.nativeOrder(), vmask);
}
}
! int index = fi.apply((int) a.byteSize());
! boolean shouldFail = isIndexOutOfBoundsForMask(mask, index, (int) a.byteSize(), SPECIES.elementSize() / 8);
try {
! $abstractvectortype$ av = $abstractvectortype$.fromMemorySegment(SPECIES, a, 0, ByteOrder.nativeOrder());
! intoMemorySegment(av, a, index, ByteOrder.nativeOrder(), vmask);
if (shouldFail) {
Assert.fail("Failed to throw IndexOutOfBoundsException");
}
} catch (IndexOutOfBoundsException e) {
if (!shouldFail) {
Assert.fail("Unexpected IndexOutOfBoundsException");
}
}
}
+ @Test(dataProvider = "$type$MemorySegmentProvider")
+ static void loadStoreReadonlyMemorySegment(IntFunction<$type$[]> fa,
+ IntFunction<MemorySegment> fb,
+ ByteOrder bo) {
+ MemorySegment a = toSegment(fa.apply(SPECIES.length()), fb).asReadOnly();
! Assert.assertThrows(
! UnsupportedOperationException.class,
! () -> SPECIES.zero().intoMemorySegment(a, 0, bo)
! );
+ Assert.assertThrows(
+ UnsupportedOperationException.class,
+ () -> SPECIES.zero().intoMemorySegment(a, 0, bo, SPECIES.maskAll(true))
+ );
! Assert.assertThrows(
+ UnsupportedOperationException.class,
+ () -> SPECIES.zero().intoMemorySegment(a, 0, bo, SPECIES.maskAll(false))
+ );
! VectorMask<$Boxtype$> m = SPECIES.shuffleFromOp(i -> i % 2 == 0 ? 1 : -1)
! .laneIsValid();
! Assert.assertThrows(
! UnsupportedOperationException.class,
! () -> SPECIES.zero().intoMemorySegment(a, 0, bo, m)
! );
}
@Test(dataProvider = "maskProvider")
static void loadStoreMask(IntFunction<boolean[]> fm) {
boolean[] a = fm.apply(SPECIES.length());
boolean[] r = new boolean[a.length];
}
}
Assert.assertEquals(r, a);
}
+
@Test
static void loadStoreShuffle() {
IntUnaryOperator fn = a -> a + 5;
for (int ic = 0; ic < INVOC_COUNT; ic++) {
var shuffle = VectorShuffle.fromOp(SPECIES, fn);
< prev index next >