< prev index next >
src/jdk.incubator.vector/share/classes/jdk/incubator/vector/Float256Vector.java
Print this page
rev 55589 : 8221816: [vector] IndexOutOfBoundsException for fromArray/intoArray with unset mask lanes
Reviewed-by: duke
*** 938,961 ****
@Override
@ForceInline
public void intoArray(float[] a, int ix) {
Objects.requireNonNull(a);
ix = VectorIntrinsics.checkIndex(ix, a.length, LENGTH);
VectorIntrinsics.store(Float256Vector.class, float.class, LENGTH,
a, (((long) ix) << ARRAY_SHIFT) + Unsafe.ARRAY_FLOAT_BASE_OFFSET,
this,
a, ix,
(arr, idx, v) -> v.forEach((i, e) -> arr[idx + i] = e));
}
@Override
@ForceInline
public final void intoArray(float[] a, int ax, Mask<Float> m) {
! FloatVector oldVal = FloatVector.fromArray(SPECIES, a, ax);
FloatVector newVal = oldVal.blend(this, m);
! newVal.intoArray(a, ax);
}
@Override
@ForceInline
public void intoArray(float[] a, int ix, int[] b, int iy) {
Objects.requireNonNull(a);
Objects.requireNonNull(b);
--- 938,972 ----
@Override
@ForceInline
public void intoArray(float[] a, int ix) {
Objects.requireNonNull(a);
ix = VectorIntrinsics.checkIndex(ix, a.length, LENGTH);
+ intoArrayWithoutCheck(a, ix);
+ }
+
+ @ForceInline
+ private void intoArrayWithoutCheck(float[] a, int ix) {
VectorIntrinsics.store(Float256Vector.class, float.class, LENGTH,
a, (((long) ix) << ARRAY_SHIFT) + Unsafe.ARRAY_FLOAT_BASE_OFFSET,
this,
a, ix,
(arr, idx, v) -> v.forEach((i, e) -> arr[idx + i] = e));
}
@Override
@ForceInline
public final void intoArray(float[] a, int ax, Mask<Float> m) {
! Objects.requireNonNull(a);
! if (ax + LENGTH <= a.length) {
! FloatVector oldVal = FloatVector.fromArrayWithoutCheck(SPECIES, a, ax);
FloatVector newVal = oldVal.blend(this, m);
! ((Float256Vector)newVal).intoArrayWithoutCheck(a, ax);
! } else {
! forEach(m, (i, e) -> a[ax + i] = e);
}
+ }
+
@Override
@ForceInline
public void intoArray(float[] a, int ix, int[] b, int iy) {
Objects.requireNonNull(a);
Objects.requireNonNull(b);
*** 963,986 ****
// 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(Float256Vector.class, float.class, LENGTH, Int256Vector.class,
a, Unsafe.ARRAY_FLOAT_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(float[] a, int ax, Mask<Float> m, int[] b, int iy) {
! // @@@ This can result in out of bounds errors for unset mask lanes
! FloatVector oldVal = FloatVector.fromArray(SPECIES, a, ax, b, iy);
FloatVector newVal = oldVal.blend(this, m);
! newVal.intoArray(a, ax, b, iy);
}
@Override
@ForceInline
public void intoByteArray(byte[] a, int ix) {
--- 974,1011 ----
// 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(float[] a, int ix, int[] b, int iy, IntVector vix) {
VectorIntrinsics.storeWithMap(Float256Vector.class, float.class, LENGTH, Int256Vector.class,
a, Unsafe.ARRAY_FLOAT_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(float[] a, int ax, Mask<Float> 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 {
! FloatVector oldVal = FloatVector.fromArrayWithoutCheck(SPECIES, a, ax, b, iy, vix);
FloatVector newVal = oldVal.blend(this, m);
! ((Float256Vector)newVal).intoArrayWithoutCheck(a, ax, b, iy, vix);
! }
}
@Override
@ForceInline
public void intoByteArray(byte[] a, int ix) {
< prev index next >