< prev index next >

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

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

@@ -935,38 +935,32 @@
 
     @Override
     @ForceInline
     public void intoArray(double[] a, int ix) {
         Objects.requireNonNull(a);
-        ix = VectorIntrinsics.checkIndex(ix, a.length, LENGTH);
-        VectorIntrinsics.store(Double64Vector.class, double.class, LENGTH,
-                               a, (((long) ix) << ARRAY_SHIFT) + Unsafe.ARRAY_DOUBLE_BASE_OFFSET,
-                               this,
-                               a, ix,
-                               (arr, idx, v) -> v.forEach((i, e) -> arr[idx + i] = e));
+        forEach((i, e) -> a[ix + i] = e);
     }
 
     @Override
     @ForceInline
     public final void intoArray(double[] a, int ax, Mask<Double> m) {
-        DoubleVector oldVal = DoubleVector.fromArray(SPECIES, a, ax);
-        DoubleVector newVal = oldVal.blend(this, m);
-        newVal.intoArray(a, ax);
+        Objects.requireNonNull(a);
+        forEach(m, (i, e) -> a[ax + i] = e);
     }
+
     @Override
     @ForceInline
     public void intoArray(double[] a, int ix, int[] b, int iy) {
         this.intoArray(a, ix + b[iy]);
     }
 
      @Override
      @ForceInline
      public final void intoArray(double[] a, int ax, Mask<Double> m, int[] b, int iy) {
-         // @@@ This can result in out of bounds errors for unset mask lanes
-         DoubleVector oldVal = DoubleVector.fromArray(SPECIES, a, ax, b, iy);
-         DoubleVector newVal = oldVal.blend(this, m);
-         newVal.intoArray(a, ax, b, iy);
+        Objects.requireNonNull(a);
+        Objects.requireNonNull(b);
+        forEach(m, (i, e) -> a[ax + b[iy+i]] = e);
      }
 
     @Override
     @ForceInline
     public void intoByteArray(byte[] a, int ix) {
< prev index next >