863 @ForceInline
864 public Shuffle<Long> toShuffle() {
865 long[] 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 LongVector.shuffleFromArray(SPECIES, sa, 0);
871 }
872
873 // Memory operations
874
875 private static final int ARRAY_SHIFT = 31 - Integer.numberOfLeadingZeros(Unsafe.ARRAY_LONG_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(long[] a, int ix) {
881 Objects.requireNonNull(a);
882 ix = VectorIntrinsics.checkIndex(ix, a.length, LENGTH);
883 VectorIntrinsics.store(Long512Vector.class, long.class, LENGTH,
884 a, (((long) ix) << ARRAY_SHIFT) + Unsafe.ARRAY_LONG_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(long[] a, int ax, Mask<Long> m) {
893 LongVector oldVal = LongVector.fromArray(SPECIES, a, ax);
894 LongVector newVal = oldVal.blend(this, m);
895 newVal.intoArray(a, ax);
896 }
897 @Override
898 @ForceInline
899 public void intoArray(long[] 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(Long512Vector.class, long.class, LENGTH, Int256Vector.class,
909 a, Unsafe.ARRAY_LONG_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(long[] a, int ax, Mask<Long> m, int[] b, int iy) {
918 // @@@ This can result in out of bounds errors for unset mask lanes
919 LongVector oldVal = LongVector.fromArray(SPECIES, a, ax, b, iy);
920 LongVector 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(Long512Vector.class, long.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 LongBuffer tb = bbc.asLongBuffer();
936 v.forEach((i, e) -> tb.put(e));
937 });
938 }
939
940 @Override
941 @ForceInline
|
863 @ForceInline
864 public Shuffle<Long> toShuffle() {
865 long[] 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 LongVector.shuffleFromArray(SPECIES, sa, 0);
871 }
872
873 // Memory operations
874
875 private static final int ARRAY_SHIFT = 31 - Integer.numberOfLeadingZeros(Unsafe.ARRAY_LONG_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(long[] 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(long[] a, int ix) {
888 VectorIntrinsics.store(Long512Vector.class, long.class, LENGTH,
889 a, (((long) ix) << ARRAY_SHIFT) + Unsafe.ARRAY_LONG_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(long[] a, int ax, Mask<Long> m) {
898 Objects.requireNonNull(a);
899 if (ax + LENGTH <= a.length) {
900 LongVector oldVal = LongVector.fromArrayWithoutCheck(SPECIES, a, ax);
901 LongVector newVal = oldVal.blend(this, m);
902 ((Long512Vector)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(long[] 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(long[] a, int ix, int[] b, int iy, IntVector vix) {
924 VectorIntrinsics.storeWithMap(Long512Vector.class, long.class, LENGTH, Int256Vector.class,
925 a, Unsafe.ARRAY_LONG_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(long[] a, int ax, Mask<Long> 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 LongVector oldVal = LongVector.fromArrayWithoutCheck(SPECIES, a, ax, b, iy, vix);
944 LongVector newVal = oldVal.blend(this, m);
945 ((Long512Vector)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(Long512Vector.class, long.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 LongBuffer tb = bbc.asLongBuffer();
961 v.forEach((i, e) -> tb.put(e));
962 });
963 }
964
965 @Override
966 @ForceInline
|