< prev index next >

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

Print this page
rev 58165 : Fix the issue that unslice modifies the argument vector
Summary: Change the name of getElements() to vec() and clone argument value to
avoid it being modified


  72     // coded with portable definitions.
  73     // These are all @ForceInline in case
  74     // they need to be used performantly.
  75     // The various shape-specific subclasses
  76     // also specialize them by wrapping
  77     // them in a call like this:
  78     //    return (Byte128Vector)
  79     //       super.bOp((Byte128Vector) o);
  80     // The purpose of that is to forcibly inline
  81     // the generic definition from this file
  82     // into a sharply type- and size-specific
  83     // wrapper in the subclass file, so that
  84     // the JIT can specialize the code.
  85     // The code is only inlined and expanded
  86     // if it gets hot.  Think of it as a cheap
  87     // and lazy version of C++ templates.
  88 
  89     // Virtualized getter
  90 
  91     /*package-private*/
  92     abstract int[] getElements();
  93 
  94     // Virtualized constructors
  95 
  96     /**
  97      * Build a vector directly using my own constructor.
  98      * It is an error if the array is aliased elsewhere.
  99      */
 100     /*package-private*/
 101     abstract IntVector vectorFactory(int[] vec);
 102 
 103     /**
 104      * Build a mask directly using my species.
 105      * It is an error if the array is aliased elsewhere.
 106      */
 107     /*package-private*/
 108     @ForceInline
 109     final
 110     AbstractMask<Integer> maskFactory(boolean[] bits) {
 111         return vspecies().maskFactory(bits);
 112     }


 136             if (mbits[i]) {
 137                 res[i] = f.apply(i);
 138             }
 139         }
 140         return vectorFactory(res);
 141     }
 142 
 143     // Unary operator
 144 
 145     /*package-private*/
 146     interface FUnOp {
 147         int apply(int i, int a);
 148     }
 149 
 150     /*package-private*/
 151     abstract
 152     IntVector uOp(FUnOp f);
 153     @ForceInline
 154     final
 155     IntVector uOpTemplate(FUnOp f) {
 156         int[] vec = getElements();
 157         int[] res = new int[length()];
 158         for (int i = 0; i < res.length; i++) {
 159             res[i] = f.apply(i, vec[i]);
 160         }
 161         return vectorFactory(res);
 162     }
 163 
 164     /*package-private*/
 165     abstract
 166     IntVector uOp(VectorMask<Integer> m,
 167                              FUnOp f);
 168     @ForceInline
 169     final
 170     IntVector uOpTemplate(VectorMask<Integer> m,
 171                                      FUnOp f) {
 172         int[] vec = getElements();
 173         int[] res = new int[length()];
 174         boolean[] mbits = ((AbstractMask<Integer>)m).getBits();
 175         for (int i = 0; i < res.length; i++) {
 176             res[i] = mbits[i] ? f.apply(i, vec[i]) : vec[i];
 177         }
 178         return vectorFactory(res);
 179     }
 180 
 181     // Binary operator
 182 
 183     /*package-private*/
 184     interface FBinOp {
 185         int apply(int i, int a, int b);
 186     }
 187 
 188     /*package-private*/
 189     abstract
 190     IntVector bOp(Vector<Integer> o,
 191                              FBinOp f);
 192     @ForceInline
 193     final
 194     IntVector bOpTemplate(Vector<Integer> o,
 195                                      FBinOp f) {
 196         int[] res = new int[length()];
 197         int[] vec1 = this.getElements();
 198         int[] vec2 = ((IntVector)o).getElements();
 199         for (int i = 0; i < res.length; i++) {
 200             res[i] = f.apply(i, vec1[i], vec2[i]);
 201         }
 202         return vectorFactory(res);
 203     }
 204 
 205     /*package-private*/
 206     abstract
 207     IntVector bOp(Vector<Integer> o,
 208                              VectorMask<Integer> m,
 209                              FBinOp f);
 210     @ForceInline
 211     final
 212     IntVector bOpTemplate(Vector<Integer> o,
 213                                      VectorMask<Integer> m,
 214                                      FBinOp f) {
 215         int[] res = new int[length()];
 216         int[] vec1 = this.getElements();
 217         int[] vec2 = ((IntVector)o).getElements();
 218         boolean[] mbits = ((AbstractMask<Integer>)m).getBits();
 219         for (int i = 0; i < res.length; i++) {
 220             res[i] = mbits[i] ? f.apply(i, vec1[i], vec2[i]) : vec1[i];
 221         }
 222         return vectorFactory(res);
 223     }
 224 
 225     // Ternary operator
 226 
 227     /*package-private*/
 228     interface FTriOp {
 229         int apply(int i, int a, int b, int c);
 230     }
 231 
 232     /*package-private*/
 233     abstract
 234     IntVector tOp(Vector<Integer> o1,
 235                              Vector<Integer> o2,
 236                              FTriOp f);
 237     @ForceInline
 238     final
 239     IntVector tOpTemplate(Vector<Integer> o1,
 240                                      Vector<Integer> o2,
 241                                      FTriOp f) {
 242         int[] res = new int[length()];
 243         int[] vec1 = this.getElements();
 244         int[] vec2 = ((IntVector)o1).getElements();
 245         int[] vec3 = ((IntVector)o2).getElements();
 246         for (int i = 0; i < res.length; i++) {
 247             res[i] = f.apply(i, vec1[i], vec2[i], vec3[i]);
 248         }
 249         return vectorFactory(res);
 250     }
 251 
 252     /*package-private*/
 253     abstract
 254     IntVector tOp(Vector<Integer> o1,
 255                              Vector<Integer> o2,
 256                              VectorMask<Integer> m,
 257                              FTriOp f);
 258     @ForceInline
 259     final
 260     IntVector tOpTemplate(Vector<Integer> o1,
 261                                      Vector<Integer> o2,
 262                                      VectorMask<Integer> m,
 263                                      FTriOp f) {
 264         int[] res = new int[length()];
 265         int[] vec1 = this.getElements();
 266         int[] vec2 = ((IntVector)o1).getElements();
 267         int[] vec3 = ((IntVector)o2).getElements();
 268         boolean[] mbits = ((AbstractMask<Integer>)m).getBits();
 269         for (int i = 0; i < res.length; i++) {
 270             res[i] = mbits[i] ? f.apply(i, vec1[i], vec2[i], vec3[i]) : vec1[i];
 271         }
 272         return vectorFactory(res);
 273     }
 274 
 275     // Reduction operator
 276 
 277     /*package-private*/
 278     abstract
 279     int rOp(int v, FBinOp f);
 280     @ForceInline
 281     final
 282     int rOpTemplate(int v, FBinOp f) {
 283         int[] vec = getElements();
 284         for (int i = 0; i < vec.length; i++) {
 285             v = f.apply(i, v, vec[i]);
 286         }
 287         return v;
 288     }
 289 
 290     // Memory reference
 291 
 292     /*package-private*/
 293     interface FLdOp<M> {
 294         int apply(M memory, int offset, int i);
 295     }
 296 
 297     /*package-private*/
 298     @ForceInline
 299     final
 300     <M> IntVector ldOp(M memory, int offset,
 301                                   FLdOp<M> f) {
 302         //dummy; no vec = getElements();
 303         int[] res = new int[length()];
 304         for (int i = 0; i < res.length; i++) {
 305             res[i] = f.apply(memory, offset, i);
 306         }
 307         return vectorFactory(res);
 308     }
 309 
 310     /*package-private*/
 311     @ForceInline
 312     final
 313     <M> IntVector ldOp(M memory, int offset,
 314                                   VectorMask<Integer> m,
 315                                   FLdOp<M> f) {
 316         //int[] vec = getElements();
 317         int[] res = new int[length()];
 318         boolean[] mbits = ((AbstractMask<Integer>)m).getBits();
 319         for (int i = 0; i < res.length; i++) {
 320             if (mbits[i]) {
 321                 res[i] = f.apply(memory, offset, i);
 322             }
 323         }
 324         return vectorFactory(res);
 325     }
 326 
 327     interface FStOp<M> {
 328         void apply(M memory, int offset, int i, int a);
 329     }
 330 
 331     /*package-private*/
 332     @ForceInline
 333     final
 334     <M> void stOp(M memory, int offset,
 335                   FStOp<M> f) {
 336         int[] vec = getElements();
 337         for (int i = 0; i < vec.length; i++) {
 338             f.apply(memory, offset, i, vec[i]);
 339         }
 340     }
 341 
 342     /*package-private*/
 343     @ForceInline
 344     final
 345     <M> void stOp(M memory, int offset,
 346                   VectorMask<Integer> m,
 347                   FStOp<M> f) {
 348         int[] vec = getElements();
 349         boolean[] mbits = ((AbstractMask<Integer>)m).getBits();
 350         for (int i = 0; i < vec.length; i++) {
 351             if (mbits[i]) {
 352                 f.apply(memory, offset, i, vec[i]);
 353             }
 354         }
 355     }
 356 
 357     // Binary test
 358 
 359     /*package-private*/
 360     interface FBinTest {
 361         boolean apply(int cond, int i, int a, int b);
 362     }
 363 
 364     /*package-private*/
 365     @ForceInline
 366     final
 367     AbstractMask<Integer> bTest(int cond,
 368                                   Vector<Integer> o,
 369                                   FBinTest f) {
 370         int[] vec1 = getElements();
 371         int[] vec2 = ((IntVector)o).getElements();
 372         boolean[] bits = new boolean[length()];
 373         for (int i = 0; i < length(); i++){
 374             bits[i] = f.apply(cond, i, vec1[i], vec2[i]);
 375         }
 376         return maskFactory(bits);
 377     }
 378 
 379     /*package-private*/
 380     @ForceInline
 381     static boolean doBinTest(int cond, int a, int b) {
 382         switch (cond) {
 383         case BT_eq:  return a == b;
 384         case BT_ne:  return a != b;
 385         case BT_lt:  return a < b;
 386         case BT_le:  return a <= b;
 387         case BT_gt:  return a > b;
 388         case BT_ge:  return a >= b;
 389         }
 390         throw new AssertionError(Integer.toHexString(cond));
 391     }


2029      */
2030     @ForceInline
2031     public final IntVector blend(long e,
2032                                             VectorMask<Integer> m) {
2033         return blend(broadcast(e), m);
2034     }
2035 
2036     /**
2037      * {@inheritDoc} <!--workaround-->
2038      */
2039     @Override
2040     public abstract
2041     IntVector slice(int origin, Vector<Integer> v1);
2042 
2043     /*package-private*/
2044     final
2045     @ForceInline
2046     IntVector sliceTemplate(int origin, Vector<Integer> v1) {
2047         IntVector that = (IntVector) v1;
2048         that.check(this);
2049         int[] a0 = this.getElements();
2050         int[] a1 = that.getElements();
2051         int[] res = new int[a0.length];
2052         int vlen = res.length;
2053         int firstPart = vlen - origin;
2054         System.arraycopy(a0, origin, res, 0, firstPart);
2055         System.arraycopy(a1, 0, res, firstPart, origin);
2056         return vectorFactory(res);
2057     }
2058 
2059     /**
2060      * {@inheritDoc} <!--workaround-->
2061      */
2062     @Override
2063     @ForceInline
2064     public final
2065     IntVector slice(int origin,
2066                                Vector<Integer> w,
2067                                VectorMask<Integer> m) {
2068         return broadcast(0).blend(slice(origin, w), m);
2069     }
2070 


2072      * {@inheritDoc} <!--workaround-->
2073      */
2074     @Override
2075     public abstract
2076     IntVector slice(int origin);
2077 
2078     /**
2079      * {@inheritDoc} <!--workaround-->
2080      */
2081     @Override
2082     public abstract
2083     IntVector unslice(int origin, Vector<Integer> w, int part);
2084 
2085     /*package-private*/
2086     final
2087     @ForceInline
2088     IntVector
2089     unsliceTemplate(int origin, Vector<Integer> w, int part) {
2090         IntVector that = (IntVector) w;
2091         that.check(this);
2092         int[] slice = this.getElements();
2093         int[] res = that.getElements();
2094         int vlen = res.length;
2095         int firstPart = vlen - origin;
2096         switch (part) {
2097         case 0:
2098             System.arraycopy(slice, 0, res, origin, firstPart);
2099             break;
2100         case 1:
2101             System.arraycopy(slice, firstPart, res, 0, origin);
2102             break;
2103         default:
2104             throw wrongPartForSlice(part);
2105         }
2106         return vectorFactory(res);
2107     }
2108 
2109     /*package-private*/
2110     final
2111     @ForceInline
2112     <M extends VectorMask<Integer>>
2113     IntVector




  72     // coded with portable definitions.
  73     // These are all @ForceInline in case
  74     // they need to be used performantly.
  75     // The various shape-specific subclasses
  76     // also specialize them by wrapping
  77     // them in a call like this:
  78     //    return (Byte128Vector)
  79     //       super.bOp((Byte128Vector) o);
  80     // The purpose of that is to forcibly inline
  81     // the generic definition from this file
  82     // into a sharply type- and size-specific
  83     // wrapper in the subclass file, so that
  84     // the JIT can specialize the code.
  85     // The code is only inlined and expanded
  86     // if it gets hot.  Think of it as a cheap
  87     // and lazy version of C++ templates.
  88 
  89     // Virtualized getter
  90 
  91     /*package-private*/
  92     abstract int[] vec();
  93 
  94     // Virtualized constructors
  95 
  96     /**
  97      * Build a vector directly using my own constructor.
  98      * It is an error if the array is aliased elsewhere.
  99      */
 100     /*package-private*/
 101     abstract IntVector vectorFactory(int[] vec);
 102 
 103     /**
 104      * Build a mask directly using my species.
 105      * It is an error if the array is aliased elsewhere.
 106      */
 107     /*package-private*/
 108     @ForceInline
 109     final
 110     AbstractMask<Integer> maskFactory(boolean[] bits) {
 111         return vspecies().maskFactory(bits);
 112     }


 136             if (mbits[i]) {
 137                 res[i] = f.apply(i);
 138             }
 139         }
 140         return vectorFactory(res);
 141     }
 142 
 143     // Unary operator
 144 
 145     /*package-private*/
 146     interface FUnOp {
 147         int apply(int i, int a);
 148     }
 149 
 150     /*package-private*/
 151     abstract
 152     IntVector uOp(FUnOp f);
 153     @ForceInline
 154     final
 155     IntVector uOpTemplate(FUnOp f) {
 156         int[] vec = vec();
 157         int[] res = new int[length()];
 158         for (int i = 0; i < res.length; i++) {
 159             res[i] = f.apply(i, vec[i]);
 160         }
 161         return vectorFactory(res);
 162     }
 163 
 164     /*package-private*/
 165     abstract
 166     IntVector uOp(VectorMask<Integer> m,
 167                              FUnOp f);
 168     @ForceInline
 169     final
 170     IntVector uOpTemplate(VectorMask<Integer> m,
 171                                      FUnOp f) {
 172         int[] vec = vec();
 173         int[] res = new int[length()];
 174         boolean[] mbits = ((AbstractMask<Integer>)m).getBits();
 175         for (int i = 0; i < res.length; i++) {
 176             res[i] = mbits[i] ? f.apply(i, vec[i]) : vec[i];
 177         }
 178         return vectorFactory(res);
 179     }
 180 
 181     // Binary operator
 182 
 183     /*package-private*/
 184     interface FBinOp {
 185         int apply(int i, int a, int b);
 186     }
 187 
 188     /*package-private*/
 189     abstract
 190     IntVector bOp(Vector<Integer> o,
 191                              FBinOp f);
 192     @ForceInline
 193     final
 194     IntVector bOpTemplate(Vector<Integer> o,
 195                                      FBinOp f) {
 196         int[] res = new int[length()];
 197         int[] vec1 = this.vec();
 198         int[] vec2 = ((IntVector)o).vec();
 199         for (int i = 0; i < res.length; i++) {
 200             res[i] = f.apply(i, vec1[i], vec2[i]);
 201         }
 202         return vectorFactory(res);
 203     }
 204 
 205     /*package-private*/
 206     abstract
 207     IntVector bOp(Vector<Integer> o,
 208                              VectorMask<Integer> m,
 209                              FBinOp f);
 210     @ForceInline
 211     final
 212     IntVector bOpTemplate(Vector<Integer> o,
 213                                      VectorMask<Integer> m,
 214                                      FBinOp f) {
 215         int[] res = new int[length()];
 216         int[] vec1 = this.vec();
 217         int[] vec2 = ((IntVector)o).vec();
 218         boolean[] mbits = ((AbstractMask<Integer>)m).getBits();
 219         for (int i = 0; i < res.length; i++) {
 220             res[i] = mbits[i] ? f.apply(i, vec1[i], vec2[i]) : vec1[i];
 221         }
 222         return vectorFactory(res);
 223     }
 224 
 225     // Ternary operator
 226 
 227     /*package-private*/
 228     interface FTriOp {
 229         int apply(int i, int a, int b, int c);
 230     }
 231 
 232     /*package-private*/
 233     abstract
 234     IntVector tOp(Vector<Integer> o1,
 235                              Vector<Integer> o2,
 236                              FTriOp f);
 237     @ForceInline
 238     final
 239     IntVector tOpTemplate(Vector<Integer> o1,
 240                                      Vector<Integer> o2,
 241                                      FTriOp f) {
 242         int[] res = new int[length()];
 243         int[] vec1 = this.vec();
 244         int[] vec2 = ((IntVector)o1).vec();
 245         int[] vec3 = ((IntVector)o2).vec();
 246         for (int i = 0; i < res.length; i++) {
 247             res[i] = f.apply(i, vec1[i], vec2[i], vec3[i]);
 248         }
 249         return vectorFactory(res);
 250     }
 251 
 252     /*package-private*/
 253     abstract
 254     IntVector tOp(Vector<Integer> o1,
 255                              Vector<Integer> o2,
 256                              VectorMask<Integer> m,
 257                              FTriOp f);
 258     @ForceInline
 259     final
 260     IntVector tOpTemplate(Vector<Integer> o1,
 261                                      Vector<Integer> o2,
 262                                      VectorMask<Integer> m,
 263                                      FTriOp f) {
 264         int[] res = new int[length()];
 265         int[] vec1 = this.vec();
 266         int[] vec2 = ((IntVector)o1).vec();
 267         int[] vec3 = ((IntVector)o2).vec();
 268         boolean[] mbits = ((AbstractMask<Integer>)m).getBits();
 269         for (int i = 0; i < res.length; i++) {
 270             res[i] = mbits[i] ? f.apply(i, vec1[i], vec2[i], vec3[i]) : vec1[i];
 271         }
 272         return vectorFactory(res);
 273     }
 274 
 275     // Reduction operator
 276 
 277     /*package-private*/
 278     abstract
 279     int rOp(int v, FBinOp f);
 280     @ForceInline
 281     final
 282     int rOpTemplate(int v, FBinOp f) {
 283         int[] vec = vec();
 284         for (int i = 0; i < vec.length; i++) {
 285             v = f.apply(i, v, vec[i]);
 286         }
 287         return v;
 288     }
 289 
 290     // Memory reference
 291 
 292     /*package-private*/
 293     interface FLdOp<M> {
 294         int apply(M memory, int offset, int i);
 295     }
 296 
 297     /*package-private*/
 298     @ForceInline
 299     final
 300     <M> IntVector ldOp(M memory, int offset,
 301                                   FLdOp<M> f) {
 302         //dummy; no vec = vec();
 303         int[] res = new int[length()];
 304         for (int i = 0; i < res.length; i++) {
 305             res[i] = f.apply(memory, offset, i);
 306         }
 307         return vectorFactory(res);
 308     }
 309 
 310     /*package-private*/
 311     @ForceInline
 312     final
 313     <M> IntVector ldOp(M memory, int offset,
 314                                   VectorMask<Integer> m,
 315                                   FLdOp<M> f) {
 316         //int[] vec = vec();
 317         int[] res = new int[length()];
 318         boolean[] mbits = ((AbstractMask<Integer>)m).getBits();
 319         for (int i = 0; i < res.length; i++) {
 320             if (mbits[i]) {
 321                 res[i] = f.apply(memory, offset, i);
 322             }
 323         }
 324         return vectorFactory(res);
 325     }
 326 
 327     interface FStOp<M> {
 328         void apply(M memory, int offset, int i, int a);
 329     }
 330 
 331     /*package-private*/
 332     @ForceInline
 333     final
 334     <M> void stOp(M memory, int offset,
 335                   FStOp<M> f) {
 336         int[] vec = vec();
 337         for (int i = 0; i < vec.length; i++) {
 338             f.apply(memory, offset, i, vec[i]);
 339         }
 340     }
 341 
 342     /*package-private*/
 343     @ForceInline
 344     final
 345     <M> void stOp(M memory, int offset,
 346                   VectorMask<Integer> m,
 347                   FStOp<M> f) {
 348         int[] vec = vec();
 349         boolean[] mbits = ((AbstractMask<Integer>)m).getBits();
 350         for (int i = 0; i < vec.length; i++) {
 351             if (mbits[i]) {
 352                 f.apply(memory, offset, i, vec[i]);
 353             }
 354         }
 355     }
 356 
 357     // Binary test
 358 
 359     /*package-private*/
 360     interface FBinTest {
 361         boolean apply(int cond, int i, int a, int b);
 362     }
 363 
 364     /*package-private*/
 365     @ForceInline
 366     final
 367     AbstractMask<Integer> bTest(int cond,
 368                                   Vector<Integer> o,
 369                                   FBinTest f) {
 370         int[] vec1 = vec();
 371         int[] vec2 = ((IntVector)o).vec();
 372         boolean[] bits = new boolean[length()];
 373         for (int i = 0; i < length(); i++){
 374             bits[i] = f.apply(cond, i, vec1[i], vec2[i]);
 375         }
 376         return maskFactory(bits);
 377     }
 378 
 379     /*package-private*/
 380     @ForceInline
 381     static boolean doBinTest(int cond, int a, int b) {
 382         switch (cond) {
 383         case BT_eq:  return a == b;
 384         case BT_ne:  return a != b;
 385         case BT_lt:  return a < b;
 386         case BT_le:  return a <= b;
 387         case BT_gt:  return a > b;
 388         case BT_ge:  return a >= b;
 389         }
 390         throw new AssertionError(Integer.toHexString(cond));
 391     }


2029      */
2030     @ForceInline
2031     public final IntVector blend(long e,
2032                                             VectorMask<Integer> m) {
2033         return blend(broadcast(e), m);
2034     }
2035 
2036     /**
2037      * {@inheritDoc} <!--workaround-->
2038      */
2039     @Override
2040     public abstract
2041     IntVector slice(int origin, Vector<Integer> v1);
2042 
2043     /*package-private*/
2044     final
2045     @ForceInline
2046     IntVector sliceTemplate(int origin, Vector<Integer> v1) {
2047         IntVector that = (IntVector) v1;
2048         that.check(this);
2049         int[] a0 = this.vec();
2050         int[] a1 = that.vec();
2051         int[] res = new int[a0.length];
2052         int vlen = res.length;
2053         int firstPart = vlen - origin;
2054         System.arraycopy(a0, origin, res, 0, firstPart);
2055         System.arraycopy(a1, 0, res, firstPart, origin);
2056         return vectorFactory(res);
2057     }
2058 
2059     /**
2060      * {@inheritDoc} <!--workaround-->
2061      */
2062     @Override
2063     @ForceInline
2064     public final
2065     IntVector slice(int origin,
2066                                Vector<Integer> w,
2067                                VectorMask<Integer> m) {
2068         return broadcast(0).blend(slice(origin, w), m);
2069     }
2070 


2072      * {@inheritDoc} <!--workaround-->
2073      */
2074     @Override
2075     public abstract
2076     IntVector slice(int origin);
2077 
2078     /**
2079      * {@inheritDoc} <!--workaround-->
2080      */
2081     @Override
2082     public abstract
2083     IntVector unslice(int origin, Vector<Integer> w, int part);
2084 
2085     /*package-private*/
2086     final
2087     @ForceInline
2088     IntVector
2089     unsliceTemplate(int origin, Vector<Integer> w, int part) {
2090         IntVector that = (IntVector) w;
2091         that.check(this);
2092         int[] slice = this.vec();
2093         int[] res = that.vec().clone();
2094         int vlen = res.length;
2095         int firstPart = vlen - origin;
2096         switch (part) {
2097         case 0:
2098             System.arraycopy(slice, 0, res, origin, firstPart);
2099             break;
2100         case 1:
2101             System.arraycopy(slice, firstPart, res, 0, origin);
2102             break;
2103         default:
2104             throw wrongPartForSlice(part);
2105         }
2106         return vectorFactory(res);
2107     }
2108 
2109     /*package-private*/
2110     final
2111     @ForceInline
2112     <M extends VectorMask<Integer>>
2113     IntVector


< prev index next >