< prev index next >

src/jdk.incubator.vector/share/classes/jdk/incubator/vector/Float64Vector.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


 146 
 147     @Override
 148     float rOp(float v, FBinOp f) {
 149         float[] 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             Float64Vector.class,
 165             float.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                 Float64Vector.class,
 289                 float.class, LENGTH,
 290                 Double64Vector.class,
 291                 double.class, Double64Vector.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 FloatVector reshape(VectorSpecies<Float> s) {
 303         Objects.requireNonNull(s);
 304         if (s.bitSize() == 64 && (s.boxType() == Float64Vector.class)) {
 305             return VectorIntrinsics.reinterpret(
 306                 Float64Vector.class,
 307                 float.class, LENGTH,
 308                 Float64Vector.class,
 309                 float.class, Float64Vector.LENGTH,
 310                 this, s,
 311                 (species, vector) -> (FloatVector) vector.defaultReinterpret(species)
 312             );
 313         } else if (s.bitSize() == 128 && (s.boxType() == Float128Vector.class)) {
 314             return VectorIntrinsics.reinterpret(
 315                 Float64Vector.class,
 316                 float.class, LENGTH,
 317                 Float128Vector.class,
 318                 float.class, Float128Vector.LENGTH,
 319                 this, s,
 320                 (species, vector) -> (FloatVector) vector.defaultReinterpret(species)
 321             );
 322         } else if (s.bitSize() == 256 && (s.boxType() == Float256Vector.class)) {
 323             return VectorIntrinsics.reinterpret(
 324                 Float64Vector.class,
 325                 float.class, LENGTH,
 326                 Float256Vector.class,
 327                 float.class, Float256Vector.LENGTH,
 328                 this, s,
 329                 (species, vector) -> (FloatVector) vector.defaultReinterpret(species)
 330             );
 331         } else if (s.bitSize() == 512 && (s.boxType() == Float512Vector.class)) {
 332             return VectorIntrinsics.reinterpret(
 333                 Float64Vector.class,
 334                 float.class, LENGTH,
 335                 Float512Vector.class,
 336                 float.class, Float512Vector.LENGTH,
 337                 this, s,
 338                 (species, vector) -> (FloatVector) vector.defaultReinterpret(species)
 339             );
 340         } else if ((s.bitSize() > 0) && (s.bitSize() <= 2048)
 341                 && (s.bitSize() % 128 == 0) && (s.boxType() == FloatMaxVector.class)) {
 342             return VectorIntrinsics.reinterpret(
 343                 Float64Vector.class,
 344                 float.class, LENGTH,
 345                 FloatMaxVector.class,
 346                 float.class, FloatMaxVector.LENGTH,
 347                 this, s,
 348                 (species, vector) -> (FloatVector) 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 FloatVector add(float o) {
 360         return add((Float64Vector)FloatVector.broadcast(SPECIES, o));
 361     }


 822 
 823     // Ternary operations
 824 
 825     @Override
 826     @ForceInline
 827     public Float64Vector fma(Vector<Float> o1, Vector<Float> o2) {
 828         Objects.requireNonNull(o1);
 829         Objects.requireNonNull(o2);
 830         Float64Vector v1 = (Float64Vector)o1;
 831         Float64Vector v2 = (Float64Vector)o2;
 832         return VectorIntrinsics.ternaryOp(
 833             VECTOR_OP_FMA, Float64Vector.class, float.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 float addAll() {
 843         int bits = (int) VectorIntrinsics.reductionCoerced(
 844                                 VECTOR_OP_ADD, Float64Vector.class, float.class, LENGTH,
 845                                 this,
 846                                 v -> {
 847                                     float r = v.rOp((float) 0, (i, a, b) -> (float) (a + b));
 848                                     return (long)Float.floatToIntBits(r);
 849                                 });
 850         return Float.intBitsToFloat(bits);
 851     }
 852 
 853     @Override
 854     @ForceInline
 855     public float mulAll() {
 856         int bits = (int) VectorIntrinsics.reductionCoerced(
 857                                 VECTOR_OP_MUL, Float64Vector.class, float.class, LENGTH,
 858                                 this,
 859                                 v -> {
 860                                     float r = v.rOp((float) 1, (i, a, b) -> (float) (a * b));
 861                                     return (long)Float.floatToIntBits(r);
 862                                 });
 863         return Float.intBitsToFloat(bits);
 864     }
 865 
 866     @Override
 867     @ForceInline
 868     public float minAll() {
 869         int bits = (int) VectorIntrinsics.reductionCoerced(
 870                                 VECTOR_OP_MIN, Float64Vector.class, float.class, LENGTH,
 871                                 this,
 872                                 v -> {
 873                                     float r = v.rOp(Float.POSITIVE_INFINITY , (i, a, b) -> (float) Math.min(a, b));
 874                                     return (long)Float.floatToIntBits(r);
 875                                 });
 876         return Float.intBitsToFloat(bits);
 877     }
 878 
 879     @Override
 880     @ForceInline
 881     public float maxAll() {
 882         int bits = (int) VectorIntrinsics.reductionCoerced(
 883                                 VECTOR_OP_MAX, Float64Vector.class, float.class, LENGTH,
 884                                 this,
 885                                 v -> {
 886                                     float r = v.rOp(Float.NEGATIVE_INFINITY, (i, a, b) -> (float) Math.max(a, b));
 887                                     return (long)Float.floatToIntBits(r);
 888                                 });
 889         return Float.intBitsToFloat(bits);
 890     }
 891 
 892 
 893     @Override
 894     @ForceInline
 895     public float addAll(VectorMask<Float> m) {
 896         return FloatVector.broadcast(SPECIES, (float) 0).blend(this, m).addAll();
 897     }
 898 
 899 
 900     @Override
 901     @ForceInline
 902     public float mulAll(VectorMask<Float> m) {
 903         return FloatVector.broadcast(SPECIES, (float) 1).blend(this, m).mulAll();
 904     }
 905 
 906     @Override
 907     @ForceInline
 908     public float minAll(VectorMask<Float> m) {
 909         return FloatVector.broadcast(SPECIES, Float.MAX_VALUE).blend(this, m).minAll();
 910     }
 911 
 912     @Override
 913     @ForceInline
 914     public float maxAll(VectorMask<Float> m) {
 915         return FloatVector.broadcast(SPECIES, Float.MIN_VALUE).blend(this, m).maxAll();
 916     }
 917 
 918     @Override
 919     @ForceInline
 920     public VectorShuffle<Float> toShuffle() {
 921         float[] 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_FLOAT_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<Float> o, FUnCon f) {
1153         boolean[] mbits = ((Float64Mask)o).getBits();
1154         forEach((i, a) -> {
1155             if (mbits[i]) { f.apply(i, a); }
1156         });
1157     }
1158 
1159     Int64Vector toBits() {
1160         float[] vec = getElements();
1161         int[] res = new int[this.species().length()];
1162         for(int i = 0; i < this.species().length(); i++){
1163             res[i] = Float.floatToIntBits(vec[i]);
1164         }
1165         return new Int64Vector(res);
1166     }
1167 
1168 
1169     @Override
1170     public Float64Vector rotateEL(int j) {
1171         float[] vec = getElements();
1172         float[] res = new float[length()];
1173         for (int i = 0; i < length(); i++){
1174             res[(j + i) % length()] = vec[i];
1175         }
1176         return new Float64Vector(res);
1177     }
1178 
1179     @Override
1180     public Float64Vector rotateER(int j) {
1181         float[] vec = getElements();
1182         float[] res = new float[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 Float64Vector(res);
1192     }
1193 
1194     @Override
1195     public Float64Vector shiftEL(int j) {
1196         float[] vec = getElements();
1197         float[] res = new float[length()];
1198         for (int i = 0; i < length() - j; i++) {
1199             res[i] = vec[i + j];
1200         }
1201         return new Float64Vector(res);
1202     }
1203 
1204     @Override
1205     public Float64Vector shiftER(int j) {
1206         float[] vec = getElements();
1207         float[] res = new float[length()];
1208         for (int i = 0; i < length() - j; i++){
1209             res[i + j] = vec[i];
1210         }
1211         return new Float64Vector(res);
1212     }
1213 
1214     @Override
1215     @ForceInline
1216     public Float64Vector rearrange(Vector<Float> v,
1217                                   VectorShuffle<Float> s, VectorMask<Float> m) {
1218         return this.rearrange(s).blend(v.rearrange(s), m);
1219     }
1220 
1221     @Override
1222     @ForceInline
1223     public Float64Vector rearrange(VectorShuffle<Float> o1) {
1224         Objects.requireNonNull(o1);
1225         Float64Shuffle s =  (Float64Shuffle)o1;




 146 
 147     @Override
 148     float rOp(float v, FBinOp f) {
 149         float[] 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             Float64Vector.class,
 165             float.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                 Float64Vector.class,
 289                 float.class, LENGTH,
 290                 Double64Vector.class,
 291                 double.class, Double64Vector.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 FloatVector reshape(VectorSpecies<Float> s) {
 303         Objects.requireNonNull(s);
 304         if (s.bitSize() == 64 && (s.vectorType() == Float64Vector.class)) {
 305             return VectorIntrinsics.reinterpret(
 306                 Float64Vector.class,
 307                 float.class, LENGTH,
 308                 Float64Vector.class,
 309                 float.class, Float64Vector.LENGTH,
 310                 this, s,
 311                 (species, vector) -> (FloatVector) vector.defaultReinterpret(species)
 312             );
 313         } else if (s.bitSize() == 128 && (s.vectorType() == Float128Vector.class)) {
 314             return VectorIntrinsics.reinterpret(
 315                 Float64Vector.class,
 316                 float.class, LENGTH,
 317                 Float128Vector.class,
 318                 float.class, Float128Vector.LENGTH,
 319                 this, s,
 320                 (species, vector) -> (FloatVector) vector.defaultReinterpret(species)
 321             );
 322         } else if (s.bitSize() == 256 && (s.vectorType() == Float256Vector.class)) {
 323             return VectorIntrinsics.reinterpret(
 324                 Float64Vector.class,
 325                 float.class, LENGTH,
 326                 Float256Vector.class,
 327                 float.class, Float256Vector.LENGTH,
 328                 this, s,
 329                 (species, vector) -> (FloatVector) vector.defaultReinterpret(species)
 330             );
 331         } else if (s.bitSize() == 512 && (s.vectorType() == Float512Vector.class)) {
 332             return VectorIntrinsics.reinterpret(
 333                 Float64Vector.class,
 334                 float.class, LENGTH,
 335                 Float512Vector.class,
 336                 float.class, Float512Vector.LENGTH,
 337                 this, s,
 338                 (species, vector) -> (FloatVector) vector.defaultReinterpret(species)
 339             );
 340         } else if ((s.bitSize() > 0) && (s.bitSize() <= 2048)
 341                 && (s.bitSize() % 128 == 0) && (s.vectorType() == FloatMaxVector.class)) {
 342             return VectorIntrinsics.reinterpret(
 343                 Float64Vector.class,
 344                 float.class, LENGTH,
 345                 FloatMaxVector.class,
 346                 float.class, FloatMaxVector.LENGTH,
 347                 this, s,
 348                 (species, vector) -> (FloatVector) 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 FloatVector add(float o) {
 360         return add((Float64Vector)FloatVector.broadcast(SPECIES, o));
 361     }


 822 
 823     // Ternary operations
 824 
 825     @Override
 826     @ForceInline
 827     public Float64Vector fma(Vector<Float> o1, Vector<Float> o2) {
 828         Objects.requireNonNull(o1);
 829         Objects.requireNonNull(o2);
 830         Float64Vector v1 = (Float64Vector)o1;
 831         Float64Vector v2 = (Float64Vector)o2;
 832         return VectorIntrinsics.ternaryOp(
 833             VECTOR_OP_FMA, Float64Vector.class, float.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 float addLanes() {
 843         int bits = (int) VectorIntrinsics.reductionCoerced(
 844                                 VECTOR_OP_ADD, Float64Vector.class, float.class, LENGTH,
 845                                 this,
 846                                 v -> {
 847                                     float r = v.rOp((float) 0, (i, a, b) -> (float) (a + b));
 848                                     return (long)Float.floatToIntBits(r);
 849                                 });
 850         return Float.intBitsToFloat(bits);
 851     }
 852 
 853     @Override
 854     @ForceInline
 855     public float mulLanes() {
 856         int bits = (int) VectorIntrinsics.reductionCoerced(
 857                                 VECTOR_OP_MUL, Float64Vector.class, float.class, LENGTH,
 858                                 this,
 859                                 v -> {
 860                                     float r = v.rOp((float) 1, (i, a, b) -> (float) (a * b));
 861                                     return (long)Float.floatToIntBits(r);
 862                                 });
 863         return Float.intBitsToFloat(bits);
 864     }
 865 
 866     @Override
 867     @ForceInline
 868     public float minLanes() {
 869         int bits = (int) VectorIntrinsics.reductionCoerced(
 870                                 VECTOR_OP_MIN, Float64Vector.class, float.class, LENGTH,
 871                                 this,
 872                                 v -> {
 873                                     float r = v.rOp(Float.POSITIVE_INFINITY , (i, a, b) -> (float) Math.min(a, b));
 874                                     return (long)Float.floatToIntBits(r);
 875                                 });
 876         return Float.intBitsToFloat(bits);
 877     }
 878 
 879     @Override
 880     @ForceInline
 881     public float maxLanes() {
 882         int bits = (int) VectorIntrinsics.reductionCoerced(
 883                                 VECTOR_OP_MAX, Float64Vector.class, float.class, LENGTH,
 884                                 this,
 885                                 v -> {
 886                                     float r = v.rOp(Float.NEGATIVE_INFINITY, (i, a, b) -> (float) Math.max(a, b));
 887                                     return (long)Float.floatToIntBits(r);
 888                                 });
 889         return Float.intBitsToFloat(bits);
 890     }
 891 
 892 
 893     @Override
 894     @ForceInline
 895     public float addLanes(VectorMask<Float> m) {
 896         return FloatVector.broadcast(SPECIES, (float) 0).blend(this, m).addLanes();
 897     }
 898 
 899 
 900     @Override
 901     @ForceInline
 902     public float mulLanes(VectorMask<Float> m) {
 903         return FloatVector.broadcast(SPECIES, (float) 1).blend(this, m).mulLanes();
 904     }
 905 
 906     @Override
 907     @ForceInline
 908     public float minLanes(VectorMask<Float> m) {
 909         return FloatVector.broadcast(SPECIES, Float.MAX_VALUE).blend(this, m).minLanes();
 910     }
 911 
 912     @Override
 913     @ForceInline
 914     public float maxLanes(VectorMask<Float> m) {
 915         return FloatVector.broadcast(SPECIES, Float.MIN_VALUE).blend(this, m).maxLanes();
 916     }
 917 
 918     @Override
 919     @ForceInline
 920     public VectorShuffle<Float> toShuffle() {
 921         float[] 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_FLOAT_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<Float> o, FUnCon f) {
1153         boolean[] mbits = ((Float64Mask)o).getBits();
1154         forEach((i, a) -> {
1155             if (mbits[i]) { f.apply(i, a); }
1156         });
1157     }
1158 
1159     Int64Vector toBits() {
1160         float[] vec = getElements();
1161         int[] res = new int[this.species().length()];
1162         for(int i = 0; i < this.species().length(); i++){
1163             res[i] = Float.floatToIntBits(vec[i]);
1164         }
1165         return new Int64Vector(res);
1166     }
1167 
1168 
1169     @Override
1170     public Float64Vector rotateLanesLeft(int j) {
1171         float[] vec = getElements();
1172         float[] res = new float[length()];
1173         for (int i = 0; i < length(); i++){
1174             res[(j + i) % length()] = vec[i];
1175         }
1176         return new Float64Vector(res);
1177     }
1178 
1179     @Override
1180     public Float64Vector rotateLanesRight(int j) {
1181         float[] vec = getElements();
1182         float[] res = new float[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 Float64Vector(res);
1192     }
1193 
1194     @Override
1195     public Float64Vector shiftLanesLeft(int j) {
1196         float[] vec = getElements();
1197         float[] res = new float[length()];
1198         for (int i = 0; i < length() - j; i++) {
1199             res[i] = vec[i + j];
1200         }
1201         return new Float64Vector(res);
1202     }
1203 
1204     @Override
1205     public Float64Vector shiftLanesRight(int j) {
1206         float[] vec = getElements();
1207         float[] res = new float[length()];
1208         for (int i = 0; i < length() - j; i++){
1209             res[i + j] = vec[i];
1210         }
1211         return new Float64Vector(res);
1212     }
1213 
1214     @Override
1215     @ForceInline
1216     public Float64Vector rearrange(Vector<Float> v,
1217                                   VectorShuffle<Float> s, VectorMask<Float> m) {
1218         return this.rearrange(s).blend(v.rearrange(s), m);
1219     }
1220 
1221     @Override
1222     @ForceInline
1223     public Float64Vector rearrange(VectorShuffle<Float> o1) {
1224         Objects.requireNonNull(o1);
1225         Float64Shuffle s =  (Float64Shuffle)o1;


< prev index next >