< prev index next >
src/jdk.incubator.vector/share/classes/jdk/incubator/vector/Int256Vector.java
Print this page
rev 55589 : 8221816: [vector] IndexOutOfBoundsException for fromArray/intoArray with unset mask lanes
Reviewed-by: duke
*** 878,901 ****
@Override
@ForceInline
public void intoArray(int[] a, int ix) {
Objects.requireNonNull(a);
ix = VectorIntrinsics.checkIndex(ix, a.length, LENGTH);
VectorIntrinsics.store(Int256Vector.class, int.class, LENGTH,
a, (((long) ix) << ARRAY_SHIFT) + Unsafe.ARRAY_INT_BASE_OFFSET,
this,
a, ix,
(arr, idx, v) -> v.forEach((i, e) -> arr[idx + i] = e));
}
@Override
@ForceInline
public final void intoArray(int[] a, int ax, Mask<Integer> m) {
! IntVector oldVal = IntVector.fromArray(SPECIES, a, ax);
IntVector newVal = oldVal.blend(this, m);
! newVal.intoArray(a, ax);
}
@Override
@ForceInline
public void intoArray(int[] a, int ix, int[] b, int iy) {
Objects.requireNonNull(a);
Objects.requireNonNull(b);
--- 878,912 ----
@Override
@ForceInline
public void intoArray(int[] a, int ix) {
Objects.requireNonNull(a);
ix = VectorIntrinsics.checkIndex(ix, a.length, LENGTH);
+ intoArrayWithoutCheck(a, ix);
+ }
+
+ @ForceInline
+ private void intoArrayWithoutCheck(int[] a, int ix) {
VectorIntrinsics.store(Int256Vector.class, int.class, LENGTH,
a, (((long) ix) << ARRAY_SHIFT) + Unsafe.ARRAY_INT_BASE_OFFSET,
this,
a, ix,
(arr, idx, v) -> v.forEach((i, e) -> arr[idx + i] = e));
}
@Override
@ForceInline
public final void intoArray(int[] a, int ax, Mask<Integer> m) {
! Objects.requireNonNull(a);
! if (ax + LENGTH <= a.length) {
! IntVector oldVal = IntVector.fromArrayWithoutCheck(SPECIES, a, ax);
IntVector newVal = oldVal.blend(this, m);
! ((Int256Vector)newVal).intoArrayWithoutCheck(a, ax);
! } else {
! forEach(m, (i, e) -> a[ax + i] = e);
}
+ }
+
@Override
@ForceInline
public void intoArray(int[] a, int ix, int[] b, int iy) {
Objects.requireNonNull(a);
Objects.requireNonNull(b);
*** 903,926 ****
// Index vector: vix[0:n] = i -> ix + indexMap[iy + i]
IntVector vix = IntVector.fromArray(INDEX_SPEC, b, iy).add(ix);
vix = VectorIntrinsics.checkIndex(vix, a.length);
VectorIntrinsics.storeWithMap(Int256Vector.class, int.class, LENGTH, Int256Vector.class,
a, Unsafe.ARRAY_INT_BASE_OFFSET, vix,
this,
a, ix, b, iy,
(arr, idx, v, indexMap, idy) -> v.forEach((i, e) -> arr[idx+indexMap[idy+i]] = e));
}
@Override
@ForceInline
public final void intoArray(int[] a, int ax, Mask<Integer> m, int[] b, int iy) {
! // @@@ This can result in out of bounds errors for unset mask lanes
! IntVector oldVal = IntVector.fromArray(SPECIES, a, ax, b, iy);
IntVector newVal = oldVal.blend(this, m);
! newVal.intoArray(a, ax, b, iy);
}
@Override
@ForceInline
public void intoByteArray(byte[] a, int ix) {
--- 914,951 ----
// Index vector: vix[0:n] = i -> ix + indexMap[iy + i]
IntVector vix = IntVector.fromArray(INDEX_SPEC, b, iy).add(ix);
vix = VectorIntrinsics.checkIndex(vix, a.length);
+ intoArrayWithoutCheck(a, ix, b, iy, vix);
+ }
+
+ @ForceInline
+ private void intoArrayWithoutCheck(int[] a, int ix, int[] b, int iy, IntVector vix) {
VectorIntrinsics.storeWithMap(Int256Vector.class, int.class, LENGTH, Int256Vector.class,
a, Unsafe.ARRAY_INT_BASE_OFFSET, vix,
this,
a, ix, b, iy,
(arr, idx, v, indexMap, idy) -> v.forEach((i, e) -> arr[idx+indexMap[idy+i]] = e));
}
@Override
@ForceInline
public final void intoArray(int[] a, int ax, Mask<Integer> m, int[] b, int iy) {
! Objects.requireNonNull(a);
! Objects.requireNonNull(b);
!
! // Index vector: vix[0:n] = i -> ax + b[iy + i]
! IntVector vix = IntVector.fromArray(INDEX_SPEC, b, iy).add(ax);
!
! if(vix.lessThan(0).anyTrue() || vix.greaterThanEq(a.length).anyTrue()) {
! forEach(m, (i, e) -> a[ax + b[iy+i]] = e);
! } else {
! IntVector oldVal = IntVector.fromArrayWithoutCheck(SPECIES, a, ax, b, iy, vix);
IntVector newVal = oldVal.blend(this, m);
! ((Int256Vector)newVal).intoArrayWithoutCheck(a, ax, b, iy, vix);
! }
}
@Override
@ForceInline
public void intoByteArray(byte[] a, int ix) {
< prev index next >