< prev index next >

src/jdk.incubator.vector/share/classes/jdk/incubator/vector/Long128Vector.java

Print this page
rev 55589 : 8221816: [vector] IndexOutOfBoundsException for fromArray/intoArray with unset mask lanes
Reviewed-by: duke

@@ -878,24 +878,35 @@
     @Override
     @ForceInline
     public void intoArray(long[] a, int ix) {
         Objects.requireNonNull(a);
         ix = VectorIntrinsics.checkIndex(ix, a.length, LENGTH);
+        intoArrayWithoutCheck(a, ix);
+    }
+
+    @ForceInline
+    private void intoArrayWithoutCheck(long[] a, int ix) {
         VectorIntrinsics.store(Long128Vector.class, long.class, LENGTH,
                                a, (((long) ix) << ARRAY_SHIFT) + Unsafe.ARRAY_LONG_BASE_OFFSET,
                                this,
                                a, ix,
                                (arr, idx, v) -> v.forEach((i, e) -> arr[idx + i] = e));
     }
 
     @Override
     @ForceInline
     public final void intoArray(long[] a, int ax, Mask<Long> m) {
-        LongVector oldVal = LongVector.fromArray(SPECIES, a, ax);
+        Objects.requireNonNull(a);
+        if (ax + LENGTH <= a.length) {
+            LongVector oldVal = LongVector.fromArrayWithoutCheck(SPECIES, a, ax);
         LongVector newVal = oldVal.blend(this, m);
-        newVal.intoArray(a, ax);
+            ((Long128Vector)newVal).intoArrayWithoutCheck(a, ax);
+        } else {
+            forEach(m, (i, e) -> a[ax + i] = e);
     }
+    }
+
     @Override
     @ForceInline
     public void intoArray(long[] a, int ix, int[] b, int iy) {
         Objects.requireNonNull(a);
         Objects.requireNonNull(b);

@@ -903,24 +914,38 @@
         // 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(long[] a, int ix, int[] b, int iy, IntVector vix) {
         VectorIntrinsics.storeWithMap(Long128Vector.class, long.class, LENGTH, Int64Vector.class,
                                a, Unsafe.ARRAY_LONG_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(long[] a, int ax, Mask<Long> m, int[] b, int iy) {
-         // @@@ This can result in out of bounds errors for unset mask lanes
-         LongVector oldVal = LongVector.fromArray(SPECIES, a, ax, b, 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 {
+            LongVector oldVal = LongVector.fromArrayWithoutCheck(SPECIES, a, ax, b, iy, vix);
          LongVector newVal = oldVal.blend(this, m);
-         newVal.intoArray(a, ax, b, iy);
+            ((Long128Vector)newVal).intoArrayWithoutCheck(a, ax, b, iy, vix);
+        }
      }
 
     @Override
     @ForceInline
     public void intoByteArray(byte[] a, int ix) {
< prev index next >