< prev index next >

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

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


 863     @ForceInline
 864     public Shuffle<Integer> toShuffle() {
 865         int[] a = toArray();
 866         int[] sa = new int[a.length];
 867         for (int i = 0; i < a.length; i++) {
 868             sa[i] = (int) a[i];
 869         }
 870         return IntVector.shuffleFromArray(SPECIES, sa, 0);
 871     }
 872 
 873     // Memory operations
 874 
 875     private static final int ARRAY_SHIFT         = 31 - Integer.numberOfLeadingZeros(Unsafe.ARRAY_INT_INDEX_SCALE);
 876     private static final int BOOLEAN_ARRAY_SHIFT = 31 - Integer.numberOfLeadingZeros(Unsafe.ARRAY_BOOLEAN_INDEX_SCALE);
 877 
 878     @Override
 879     @ForceInline
 880     public void intoArray(int[] a, int ix) {
 881         Objects.requireNonNull(a);
 882         ix = VectorIntrinsics.checkIndex(ix, a.length, LENGTH);





 883         VectorIntrinsics.store(IntMaxVector.class, int.class, LENGTH,
 884                                a, (((long) ix) << ARRAY_SHIFT) + Unsafe.ARRAY_INT_BASE_OFFSET,
 885                                this,
 886                                a, ix,
 887                                (arr, idx, v) -> v.forEach((i, e) -> arr[idx + i] = e));
 888     }
 889 
 890     @Override
 891     @ForceInline
 892     public final void intoArray(int[] a, int ax, Mask<Integer> m) {
 893         IntVector oldVal = IntVector.fromArray(SPECIES, a, ax);


 894         IntVector newVal = oldVal.blend(this, m);
 895         newVal.intoArray(a, ax);


 896     }


 897     @Override
 898     @ForceInline
 899     public void intoArray(int[] a, int ix, int[] b, int iy) {
 900         Objects.requireNonNull(a);
 901         Objects.requireNonNull(b);
 902 
 903         // Index vector: vix[0:n] = i -> ix + indexMap[iy + i]
 904         IntVector vix = IntVector.fromArray(INDEX_SPEC, b, iy).add(ix);
 905 
 906         vix = VectorIntrinsics.checkIndex(vix, a.length);
 907 





 908         VectorIntrinsics.storeWithMap(IntMaxVector.class, int.class, LENGTH, vix.getClass(),
 909                                a, Unsafe.ARRAY_INT_BASE_OFFSET, vix,
 910                                this,
 911                                a, ix, b, iy,
 912                                (arr, idx, v, indexMap, idy) -> v.forEach((i, e) -> arr[idx+indexMap[idy+i]] = e));
 913     }
 914 
 915      @Override
 916      @ForceInline
 917      public final void intoArray(int[] a, int ax, Mask<Integer> m, int[] b, int iy) {
 918          // @@@ This can result in out of bounds errors for unset mask lanes
 919          IntVector oldVal = IntVector.fromArray(SPECIES, a, ax, b, iy);








 920          IntVector newVal = oldVal.blend(this, m);
 921          newVal.intoArray(a, ax, b, iy);

 922      }
 923 
 924     @Override
 925     @ForceInline
 926     public void intoByteArray(byte[] a, int ix) {
 927         Objects.requireNonNull(a);
 928         ix = VectorIntrinsics.checkIndex(ix, a.length, bitSize() / Byte.SIZE);
 929         VectorIntrinsics.store(IntMaxVector.class, int.class, LENGTH,
 930                                a, ((long) ix) + Unsafe.ARRAY_BYTE_BASE_OFFSET,
 931                                this,
 932                                a, ix,
 933                                (c, idx, v) -> {
 934                                    ByteBuffer bbc = ByteBuffer.wrap(c, idx, c.length - idx).order(ByteOrder.nativeOrder());
 935                                    IntBuffer tb = bbc.asIntBuffer();
 936                                    v.forEach((i, e) -> tb.put(e));
 937                                });
 938     }
 939 
 940     @Override
 941     @ForceInline




 863     @ForceInline
 864     public Shuffle<Integer> toShuffle() {
 865         int[] a = toArray();
 866         int[] sa = new int[a.length];
 867         for (int i = 0; i < a.length; i++) {
 868             sa[i] = (int) a[i];
 869         }
 870         return IntVector.shuffleFromArray(SPECIES, sa, 0);
 871     }
 872 
 873     // Memory operations
 874 
 875     private static final int ARRAY_SHIFT         = 31 - Integer.numberOfLeadingZeros(Unsafe.ARRAY_INT_INDEX_SCALE);
 876     private static final int BOOLEAN_ARRAY_SHIFT = 31 - Integer.numberOfLeadingZeros(Unsafe.ARRAY_BOOLEAN_INDEX_SCALE);
 877 
 878     @Override
 879     @ForceInline
 880     public void intoArray(int[] a, int ix) {
 881         Objects.requireNonNull(a);
 882         ix = VectorIntrinsics.checkIndex(ix, a.length, LENGTH);
 883         intoArrayWithoutCheck(a, ix);
 884     }
 885 
 886     @ForceInline
 887     private void intoArrayWithoutCheck(int[] a, int ix) {
 888         VectorIntrinsics.store(IntMaxVector.class, int.class, LENGTH,
 889                                a, (((long) ix) << ARRAY_SHIFT) + Unsafe.ARRAY_INT_BASE_OFFSET,
 890                                this,
 891                                a, ix,
 892                                (arr, idx, v) -> v.forEach((i, e) -> arr[idx + i] = e));
 893     }
 894 
 895     @Override
 896     @ForceInline
 897     public final void intoArray(int[] a, int ax, Mask<Integer> m) {
 898         Objects.requireNonNull(a);
 899         if (ax + LENGTH <= a.length) {
 900             IntVector oldVal = IntVector.fromArrayWithoutCheck(SPECIES, a, ax);
 901             IntVector newVal = oldVal.blend(this, m);
 902             ((IntMaxVector)newVal).intoArrayWithoutCheck(a, ax);
 903         } else {
 904             forEach(m, (i, e) -> a[ax + i] = e);
 905         }
 906     }
 907 
 908     @Override
 909     @ForceInline
 910     public void intoArray(int[] a, int ix, int[] b, int iy) {
 911         Objects.requireNonNull(a);
 912         Objects.requireNonNull(b);
 913 
 914         // Index vector: vix[0:n] = i -> ix + indexMap[iy + i]
 915         IntVector vix = IntVector.fromArray(INDEX_SPEC, b, iy).add(ix);
 916 
 917         vix = VectorIntrinsics.checkIndex(vix, a.length);
 918 
 919         intoArrayWithoutCheck(a, ix, b, iy, vix);
 920     }
 921 
 922     @ForceInline
 923     private void intoArrayWithoutCheck(int[] a, int ix, int[] b, int iy, IntVector vix) {
 924         VectorIntrinsics.storeWithMap(IntMaxVector.class, int.class, LENGTH, vix.getClass(),
 925                                a, Unsafe.ARRAY_INT_BASE_OFFSET, vix,
 926                                this,
 927                                a, ix, b, iy,
 928                                (arr, idx, v, indexMap, idy) -> v.forEach((i, e) -> arr[idx+indexMap[idy+i]] = e));
 929     }
 930 
 931     @Override
 932     @ForceInline
 933     public final void intoArray(int[] a, int ax, Mask<Integer> m, int[] b, int iy) {
 934         Objects.requireNonNull(a);
 935         Objects.requireNonNull(b);
 936 
 937         // Index vector: vix[0:n] = i -> ax + b[iy + i]
 938         IntVector vix = IntVector.fromArray(INDEX_SPEC, b, iy).add(ax);
 939 
 940         if(vix.lessThan(0).anyTrue() || vix.greaterThanEq(a.length).anyTrue()) {
 941             forEach(m, (i, e) -> a[ax + b[iy+i]] = e);
 942         } else {
 943             IntVector oldVal = IntVector.fromArrayWithoutCheck(SPECIES, a, ax, b, iy, vix);
 944             IntVector newVal = oldVal.blend(this, m);
 945             ((IntMaxVector)newVal).intoArrayWithoutCheck(a, ax, b, iy, vix);
 946         }
 947     }
 948 
 949     @Override
 950     @ForceInline
 951     public void intoByteArray(byte[] a, int ix) {
 952         Objects.requireNonNull(a);
 953         ix = VectorIntrinsics.checkIndex(ix, a.length, bitSize() / Byte.SIZE);
 954         VectorIntrinsics.store(IntMaxVector.class, int.class, LENGTH,
 955                                a, ((long) ix) + Unsafe.ARRAY_BYTE_BASE_OFFSET,
 956                                this,
 957                                a, ix,
 958                                (c, idx, v) -> {
 959                                    ByteBuffer bbc = ByteBuffer.wrap(c, idx, c.length - idx).order(ByteOrder.nativeOrder());
 960                                    IntBuffer tb = bbc.asIntBuffer();
 961                                    v.forEach((i, e) -> tb.put(e));
 962                                });
 963     }
 964 
 965     @Override
 966     @ForceInline


< prev index next >