< prev index next >

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

Print this page
rev 55891 : 8222897: [vector] Renaming of shift, rotate operations. Few other api changes.
Summary: Renaming of shift, rotate operations. Few other api changes.
Reviewed-by: jrose, briangoetz
rev 55894 : 8222897: [vector] Renaming of shift, rotate operations. Few other api changes.
Summary: Renaming of shift, rotate operations. Few other api changes.
Reviewed-by: jrose, briangoetz


 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;


< prev index next >