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
|