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