146
147 @Override
148 double rOp(double v, FBinOp f) {
149 double[] vec = getElements();
150 for (int i = 0; i < length(); i++) {
151 v = f.apply(i, v, vec[i]);
152 }
153 return v;
154 }
155
156 @Override
157 @ForceInline
158 public <F> Vector<F> cast(VectorSpecies<F> s) {
159 Objects.requireNonNull(s);
160 if (s.length() != LENGTH)
161 throw new IllegalArgumentException("Vector length this species length differ");
162
163 return VectorIntrinsics.cast(
164 Double128Vector.class,
165 double.class, LENGTH,
166 s.boxType(),
167 s.elementType(), LENGTH,
168 this, s,
169 (species, vector) -> vector.castDefault(species)
170 );
171 }
172
173 @SuppressWarnings("unchecked")
174 @ForceInline
175 private <F> Vector<F> castDefault(VectorSpecies<F> s) {
176 int limit = s.length();
177
178 Class<?> stype = s.elementType();
179 if (stype == byte.class) {
180 byte[] a = new byte[limit];
181 for (int i = 0; i < limit; i++) {
182 a[i] = (byte) this.lane(i);
183 }
184 return (Vector) ByteVector.fromArray((VectorSpecies<Byte>) s, a, 0);
185 } else if (stype == short.class) {
186 short[] a = new short[limit];
284 (species, vector) -> vector.defaultReinterpret(species)
285 );
286 } else if (stype == double.class) {
287 return VectorIntrinsics.reinterpret(
288 Double128Vector.class,
289 double.class, LENGTH,
290 Double128Vector.class,
291 double.class, Double128Vector.LENGTH,
292 this, s,
293 (species, vector) -> vector.defaultReinterpret(species)
294 );
295 } else {
296 throw new UnsupportedOperationException("Bad lane type for casting.");
297 }
298 }
299
300 @Override
301 @ForceInline
302 public DoubleVector reshape(VectorSpecies<Double> s) {
303 Objects.requireNonNull(s);
304 if (s.bitSize() == 64 && (s.boxType() == Double64Vector.class)) {
305 return VectorIntrinsics.reinterpret(
306 Double128Vector.class,
307 double.class, LENGTH,
308 Double64Vector.class,
309 double.class, Double64Vector.LENGTH,
310 this, s,
311 (species, vector) -> (DoubleVector) vector.defaultReinterpret(species)
312 );
313 } else if (s.bitSize() == 128 && (s.boxType() == Double128Vector.class)) {
314 return VectorIntrinsics.reinterpret(
315 Double128Vector.class,
316 double.class, LENGTH,
317 Double128Vector.class,
318 double.class, Double128Vector.LENGTH,
319 this, s,
320 (species, vector) -> (DoubleVector) vector.defaultReinterpret(species)
321 );
322 } else if (s.bitSize() == 256 && (s.boxType() == Double256Vector.class)) {
323 return VectorIntrinsics.reinterpret(
324 Double128Vector.class,
325 double.class, LENGTH,
326 Double256Vector.class,
327 double.class, Double256Vector.LENGTH,
328 this, s,
329 (species, vector) -> (DoubleVector) vector.defaultReinterpret(species)
330 );
331 } else if (s.bitSize() == 512 && (s.boxType() == Double512Vector.class)) {
332 return VectorIntrinsics.reinterpret(
333 Double128Vector.class,
334 double.class, LENGTH,
335 Double512Vector.class,
336 double.class, Double512Vector.LENGTH,
337 this, s,
338 (species, vector) -> (DoubleVector) vector.defaultReinterpret(species)
339 );
340 } else if ((s.bitSize() > 0) && (s.bitSize() <= 2048)
341 && (s.bitSize() % 128 == 0) && (s.boxType() == DoubleMaxVector.class)) {
342 return VectorIntrinsics.reinterpret(
343 Double128Vector.class,
344 double.class, LENGTH,
345 DoubleMaxVector.class,
346 double.class, DoubleMaxVector.LENGTH,
347 this, s,
348 (species, vector) -> (DoubleVector) vector.defaultReinterpret(species)
349 );
350 } else {
351 throw new InternalError("Unimplemented size");
352 }
353 }
354
355 // Binary operations with scalars
356
357 @Override
358 @ForceInline
359 public DoubleVector add(double o) {
360 return add((Double128Vector)DoubleVector.broadcast(SPECIES, o));
361 }
822
823 // Ternary operations
824
825 @Override
826 @ForceInline
827 public Double128Vector fma(Vector<Double> o1, Vector<Double> o2) {
828 Objects.requireNonNull(o1);
829 Objects.requireNonNull(o2);
830 Double128Vector v1 = (Double128Vector)o1;
831 Double128Vector v2 = (Double128Vector)o2;
832 return VectorIntrinsics.ternaryOp(
833 VECTOR_OP_FMA, Double128Vector.class, double.class, LENGTH,
834 this, v1, v2,
835 (w1, w2, w3) -> w1.tOp(w2, w3, (i, a, b, c) -> Math.fma(a, b, c)));
836 }
837
838 // Type specific horizontal reductions
839
840 @Override
841 @ForceInline
842 public double addAll() {
843 long bits = (long) VectorIntrinsics.reductionCoerced(
844 VECTOR_OP_ADD, Double128Vector.class, double.class, LENGTH,
845 this,
846 v -> {
847 double r = v.rOp((double) 0, (i, a, b) -> (double) (a + b));
848 return (long)Double.doubleToLongBits(r);
849 });
850 return Double.longBitsToDouble(bits);
851 }
852
853 @Override
854 @ForceInline
855 public double mulAll() {
856 long bits = (long) VectorIntrinsics.reductionCoerced(
857 VECTOR_OP_MUL, Double128Vector.class, double.class, LENGTH,
858 this,
859 v -> {
860 double r = v.rOp((double) 1, (i, a, b) -> (double) (a * b));
861 return (long)Double.doubleToLongBits(r);
862 });
863 return Double.longBitsToDouble(bits);
864 }
865
866 @Override
867 @ForceInline
868 public double minAll() {
869 long bits = (long) VectorIntrinsics.reductionCoerced(
870 VECTOR_OP_MIN, Double128Vector.class, double.class, LENGTH,
871 this,
872 v -> {
873 double r = v.rOp(Double.POSITIVE_INFINITY , (i, a, b) -> (double) Math.min(a, b));
874 return (long)Double.doubleToLongBits(r);
875 });
876 return Double.longBitsToDouble(bits);
877 }
878
879 @Override
880 @ForceInline
881 public double maxAll() {
882 long bits = (long) VectorIntrinsics.reductionCoerced(
883 VECTOR_OP_MAX, Double128Vector.class, double.class, LENGTH,
884 this,
885 v -> {
886 double r = v.rOp(Double.NEGATIVE_INFINITY, (i, a, b) -> (double) Math.max(a, b));
887 return (long)Double.doubleToLongBits(r);
888 });
889 return Double.longBitsToDouble(bits);
890 }
891
892
893 @Override
894 @ForceInline
895 public double addAll(VectorMask<Double> m) {
896 return DoubleVector.broadcast(SPECIES, (double) 0).blend(this, m).addAll();
897 }
898
899
900 @Override
901 @ForceInline
902 public double mulAll(VectorMask<Double> m) {
903 return DoubleVector.broadcast(SPECIES, (double) 1).blend(this, m).mulAll();
904 }
905
906 @Override
907 @ForceInline
908 public double minAll(VectorMask<Double> m) {
909 return DoubleVector.broadcast(SPECIES, Double.MAX_VALUE).blend(this, m).minAll();
910 }
911
912 @Override
913 @ForceInline
914 public double maxAll(VectorMask<Double> m) {
915 return DoubleVector.broadcast(SPECIES, Double.MIN_VALUE).blend(this, m).maxAll();
916 }
917
918 @Override
919 @ForceInline
920 public VectorShuffle<Double> toShuffle() {
921 double[] a = toArray();
922 int[] sa = new int[a.length];
923 for (int i = 0; i < a.length; i++) {
924 sa[i] = (int) a[i];
925 }
926 return VectorShuffle.fromArray(SPECIES, sa, 0);
927 }
928
929 // Memory operations
930
931 private static final int ARRAY_SHIFT = 31 - Integer.numberOfLeadingZeros(Unsafe.ARRAY_DOUBLE_INDEX_SCALE);
932 private static final int BOOLEAN_ARRAY_SHIFT = 31 - Integer.numberOfLeadingZeros(Unsafe.ARRAY_BOOLEAN_INDEX_SCALE);
933
934 @Override
935 @ForceInline
1150
1151 @Override
1152 void forEach(VectorMask<Double> o, FUnCon f) {
1153 boolean[] mbits = ((Double128Mask)o).getBits();
1154 forEach((i, a) -> {
1155 if (mbits[i]) { f.apply(i, a); }
1156 });
1157 }
1158
1159 Long128Vector toBits() {
1160 double[] vec = getElements();
1161 long[] res = new long[this.species().length()];
1162 for(int i = 0; i < this.species().length(); i++){
1163 res[i] = Double.doubleToLongBits(vec[i]);
1164 }
1165 return new Long128Vector(res);
1166 }
1167
1168
1169 @Override
1170 public Double128Vector rotateEL(int j) {
1171 double[] vec = getElements();
1172 double[] res = new double[length()];
1173 for (int i = 0; i < length(); i++){
1174 res[(j + i) % length()] = vec[i];
1175 }
1176 return new Double128Vector(res);
1177 }
1178
1179 @Override
1180 public Double128Vector rotateER(int j) {
1181 double[] vec = getElements();
1182 double[] res = new double[length()];
1183 for (int i = 0; i < length(); i++){
1184 int z = i - j;
1185 if(j < 0) {
1186 res[length() + z] = vec[i];
1187 } else {
1188 res[z] = vec[i];
1189 }
1190 }
1191 return new Double128Vector(res);
1192 }
1193
1194 @Override
1195 public Double128Vector shiftEL(int j) {
1196 double[] vec = getElements();
1197 double[] res = new double[length()];
1198 for (int i = 0; i < length() - j; i++) {
1199 res[i] = vec[i + j];
1200 }
1201 return new Double128Vector(res);
1202 }
1203
1204 @Override
1205 public Double128Vector shiftER(int j) {
1206 double[] vec = getElements();
1207 double[] res = new double[length()];
1208 for (int i = 0; i < length() - j; i++){
1209 res[i + j] = vec[i];
1210 }
1211 return new Double128Vector(res);
1212 }
1213
1214 @Override
1215 @ForceInline
1216 public Double128Vector rearrange(Vector<Double> v,
1217 VectorShuffle<Double> s, VectorMask<Double> m) {
1218 return this.rearrange(s).blend(v.rearrange(s), m);
1219 }
1220
1221 @Override
1222 @ForceInline
1223 public Double128Vector rearrange(VectorShuffle<Double> o1) {
1224 Objects.requireNonNull(o1);
1225 Double128Shuffle s = (Double128Shuffle)o1;
|
146
147 @Override
148 double rOp(double v, FBinOp f) {
149 double[] vec = getElements();
150 for (int i = 0; i < length(); i++) {
151 v = f.apply(i, v, vec[i]);
152 }
153 return v;
154 }
155
156 @Override
157 @ForceInline
158 public <F> Vector<F> cast(VectorSpecies<F> s) {
159 Objects.requireNonNull(s);
160 if (s.length() != LENGTH)
161 throw new IllegalArgumentException("Vector length this species length differ");
162
163 return VectorIntrinsics.cast(
164 Double128Vector.class,
165 double.class, LENGTH,
166 s.vectorType(),
167 s.elementType(), LENGTH,
168 this, s,
169 (species, vector) -> vector.castDefault(species)
170 );
171 }
172
173 @SuppressWarnings("unchecked")
174 @ForceInline
175 private <F> Vector<F> castDefault(VectorSpecies<F> s) {
176 int limit = s.length();
177
178 Class<?> stype = s.elementType();
179 if (stype == byte.class) {
180 byte[] a = new byte[limit];
181 for (int i = 0; i < limit; i++) {
182 a[i] = (byte) this.lane(i);
183 }
184 return (Vector) ByteVector.fromArray((VectorSpecies<Byte>) s, a, 0);
185 } else if (stype == short.class) {
186 short[] a = new short[limit];
284 (species, vector) -> vector.defaultReinterpret(species)
285 );
286 } else if (stype == double.class) {
287 return VectorIntrinsics.reinterpret(
288 Double128Vector.class,
289 double.class, LENGTH,
290 Double128Vector.class,
291 double.class, Double128Vector.LENGTH,
292 this, s,
293 (species, vector) -> vector.defaultReinterpret(species)
294 );
295 } else {
296 throw new UnsupportedOperationException("Bad lane type for casting.");
297 }
298 }
299
300 @Override
301 @ForceInline
302 public DoubleVector reshape(VectorSpecies<Double> s) {
303 Objects.requireNonNull(s);
304 if (s.bitSize() == 64 && (s.vectorType() == Double64Vector.class)) {
305 return VectorIntrinsics.reinterpret(
306 Double128Vector.class,
307 double.class, LENGTH,
308 Double64Vector.class,
309 double.class, Double64Vector.LENGTH,
310 this, s,
311 (species, vector) -> (DoubleVector) vector.defaultReinterpret(species)
312 );
313 } else if (s.bitSize() == 128 && (s.vectorType() == Double128Vector.class)) {
314 return VectorIntrinsics.reinterpret(
315 Double128Vector.class,
316 double.class, LENGTH,
317 Double128Vector.class,
318 double.class, Double128Vector.LENGTH,
319 this, s,
320 (species, vector) -> (DoubleVector) vector.defaultReinterpret(species)
321 );
322 } else if (s.bitSize() == 256 && (s.vectorType() == Double256Vector.class)) {
323 return VectorIntrinsics.reinterpret(
324 Double128Vector.class,
325 double.class, LENGTH,
326 Double256Vector.class,
327 double.class, Double256Vector.LENGTH,
328 this, s,
329 (species, vector) -> (DoubleVector) vector.defaultReinterpret(species)
330 );
331 } else if (s.bitSize() == 512 && (s.vectorType() == Double512Vector.class)) {
332 return VectorIntrinsics.reinterpret(
333 Double128Vector.class,
334 double.class, LENGTH,
335 Double512Vector.class,
336 double.class, Double512Vector.LENGTH,
337 this, s,
338 (species, vector) -> (DoubleVector) vector.defaultReinterpret(species)
339 );
340 } else if ((s.bitSize() > 0) && (s.bitSize() <= 2048)
341 && (s.bitSize() % 128 == 0) && (s.vectorType() == DoubleMaxVector.class)) {
342 return VectorIntrinsics.reinterpret(
343 Double128Vector.class,
344 double.class, LENGTH,
345 DoubleMaxVector.class,
346 double.class, DoubleMaxVector.LENGTH,
347 this, s,
348 (species, vector) -> (DoubleVector) vector.defaultReinterpret(species)
349 );
350 } else {
351 throw new InternalError("Unimplemented size");
352 }
353 }
354
355 // Binary operations with scalars
356
357 @Override
358 @ForceInline
359 public DoubleVector add(double o) {
360 return add((Double128Vector)DoubleVector.broadcast(SPECIES, o));
361 }
822
823 // Ternary operations
824
825 @Override
826 @ForceInline
827 public Double128Vector fma(Vector<Double> o1, Vector<Double> o2) {
828 Objects.requireNonNull(o1);
829 Objects.requireNonNull(o2);
830 Double128Vector v1 = (Double128Vector)o1;
831 Double128Vector v2 = (Double128Vector)o2;
832 return VectorIntrinsics.ternaryOp(
833 VECTOR_OP_FMA, Double128Vector.class, double.class, LENGTH,
834 this, v1, v2,
835 (w1, w2, w3) -> w1.tOp(w2, w3, (i, a, b, c) -> Math.fma(a, b, c)));
836 }
837
838 // Type specific horizontal reductions
839
840 @Override
841 @ForceInline
842 public double addLanes() {
843 long bits = (long) VectorIntrinsics.reductionCoerced(
844 VECTOR_OP_ADD, Double128Vector.class, double.class, LENGTH,
845 this,
846 v -> {
847 double r = v.rOp((double) 0, (i, a, b) -> (double) (a + b));
848 return (long)Double.doubleToLongBits(r);
849 });
850 return Double.longBitsToDouble(bits);
851 }
852
853 @Override
854 @ForceInline
855 public double mulLanes() {
856 long bits = (long) VectorIntrinsics.reductionCoerced(
857 VECTOR_OP_MUL, Double128Vector.class, double.class, LENGTH,
858 this,
859 v -> {
860 double r = v.rOp((double) 1, (i, a, b) -> (double) (a * b));
861 return (long)Double.doubleToLongBits(r);
862 });
863 return Double.longBitsToDouble(bits);
864 }
865
866 @Override
867 @ForceInline
868 public double minLanes() {
869 long bits = (long) VectorIntrinsics.reductionCoerced(
870 VECTOR_OP_MIN, Double128Vector.class, double.class, LENGTH,
871 this,
872 v -> {
873 double r = v.rOp(Double.POSITIVE_INFINITY , (i, a, b) -> (double) Math.min(a, b));
874 return (long)Double.doubleToLongBits(r);
875 });
876 return Double.longBitsToDouble(bits);
877 }
878
879 @Override
880 @ForceInline
881 public double maxLanes() {
882 long bits = (long) VectorIntrinsics.reductionCoerced(
883 VECTOR_OP_MAX, Double128Vector.class, double.class, LENGTH,
884 this,
885 v -> {
886 double r = v.rOp(Double.NEGATIVE_INFINITY, (i, a, b) -> (double) Math.max(a, b));
887 return (long)Double.doubleToLongBits(r);
888 });
889 return Double.longBitsToDouble(bits);
890 }
891
892
893 @Override
894 @ForceInline
895 public double addLanes(VectorMask<Double> m) {
896 return DoubleVector.broadcast(SPECIES, (double) 0).blend(this, m).addLanes();
897 }
898
899
900 @Override
901 @ForceInline
902 public double mulLanes(VectorMask<Double> m) {
903 return DoubleVector.broadcast(SPECIES, (double) 1).blend(this, m).mulLanes();
904 }
905
906 @Override
907 @ForceInline
908 public double minLanes(VectorMask<Double> m) {
909 return DoubleVector.broadcast(SPECIES, Double.MAX_VALUE).blend(this, m).minLanes();
910 }
911
912 @Override
913 @ForceInline
914 public double maxLanes(VectorMask<Double> m) {
915 return DoubleVector.broadcast(SPECIES, Double.MIN_VALUE).blend(this, m).maxLanes();
916 }
917
918 @Override
919 @ForceInline
920 public VectorShuffle<Double> toShuffle() {
921 double[] a = toArray();
922 int[] sa = new int[a.length];
923 for (int i = 0; i < a.length; i++) {
924 sa[i] = (int) a[i];
925 }
926 return VectorShuffle.fromArray(SPECIES, sa, 0);
927 }
928
929 // Memory operations
930
931 private static final int ARRAY_SHIFT = 31 - Integer.numberOfLeadingZeros(Unsafe.ARRAY_DOUBLE_INDEX_SCALE);
932 private static final int BOOLEAN_ARRAY_SHIFT = 31 - Integer.numberOfLeadingZeros(Unsafe.ARRAY_BOOLEAN_INDEX_SCALE);
933
934 @Override
935 @ForceInline
1150
1151 @Override
1152 void forEach(VectorMask<Double> o, FUnCon f) {
1153 boolean[] mbits = ((Double128Mask)o).getBits();
1154 forEach((i, a) -> {
1155 if (mbits[i]) { f.apply(i, a); }
1156 });
1157 }
1158
1159 Long128Vector toBits() {
1160 double[] vec = getElements();
1161 long[] res = new long[this.species().length()];
1162 for(int i = 0; i < this.species().length(); i++){
1163 res[i] = Double.doubleToLongBits(vec[i]);
1164 }
1165 return new Long128Vector(res);
1166 }
1167
1168
1169 @Override
1170 public Double128Vector rotateLanesLeft(int j) {
1171 double[] vec = getElements();
1172 double[] res = new double[length()];
1173 for (int i = 0; i < length(); i++){
1174 res[(j + i) % length()] = vec[i];
1175 }
1176 return new Double128Vector(res);
1177 }
1178
1179 @Override
1180 public Double128Vector rotateLanesRight(int j) {
1181 double[] vec = getElements();
1182 double[] res = new double[length()];
1183 for (int i = 0; i < length(); i++){
1184 int z = i - j;
1185 if(j < 0) {
1186 res[length() + z] = vec[i];
1187 } else {
1188 res[z] = vec[i];
1189 }
1190 }
1191 return new Double128Vector(res);
1192 }
1193
1194 @Override
1195 public Double128Vector shiftLanesLeft(int j) {
1196 double[] vec = getElements();
1197 double[] res = new double[length()];
1198 for (int i = 0; i < length() - j; i++) {
1199 res[i] = vec[i + j];
1200 }
1201 return new Double128Vector(res);
1202 }
1203
1204 @Override
1205 public Double128Vector shiftLanesRight(int j) {
1206 double[] vec = getElements();
1207 double[] res = new double[length()];
1208 for (int i = 0; i < length() - j; i++){
1209 res[i + j] = vec[i];
1210 }
1211 return new Double128Vector(res);
1212 }
1213
1214 @Override
1215 @ForceInline
1216 public Double128Vector rearrange(Vector<Double> v,
1217 VectorShuffle<Double> s, VectorMask<Double> m) {
1218 return this.rearrange(s).blend(v.rearrange(s), m);
1219 }
1220
1221 @Override
1222 @ForceInline
1223 public Double128Vector rearrange(VectorShuffle<Double> o1) {
1224 Objects.requireNonNull(o1);
1225 Double128Shuffle s = (Double128Shuffle)o1;
|