< prev index next >

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

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

@@ -835,23 +835,33 @@
     @Override
     @ForceInline
     public void intoArray(short[] a, int ix) {
         Objects.requireNonNull(a);
         ix = VectorIntrinsics.checkIndex(ix, a.length, LENGTH);
+        intoArrayWithoutCheck(a, ix);
+    }
+
+    @ForceInline
+    private void intoArrayWithoutCheck(short[] a, int ix) {
         VectorIntrinsics.store(Short256Vector.class, short.class, LENGTH,
                                a, (((long) ix) << ARRAY_SHIFT) + Unsafe.ARRAY_SHORT_BASE_OFFSET,
                                this,
                                a, ix,
                                (arr, idx, v) -> v.forEach((i, e) -> arr[idx + i] = e));
     }
 
     @Override
     @ForceInline
     public final void intoArray(short[] a, int ax, Mask<Short> m) {
-        ShortVector oldVal = ShortVector.fromArray(SPECIES, a, ax);
+        Objects.requireNonNull(a);
+        if (ax + LENGTH <= a.length) {
+            ShortVector oldVal = ShortVector.fromArrayWithoutCheck(SPECIES, a, ax);
         ShortVector newVal = oldVal.blend(this, m);
-        newVal.intoArray(a, ax);
+            ((Short256Vector)newVal).intoArrayWithoutCheck(a, ax);
+        } else {
+            forEach(m, (i, e) -> a[ax + i] = e);
+        }
     }
 
     @Override
     @ForceInline
     public void intoByteArray(byte[] a, int ix) {
< prev index next >