108 *
109 * @param species species of desired vector
110 * @return a zero vector of given species
111 */
112 @ForceInline
113 @SuppressWarnings("unchecked")
114 public static FloatVector zero(VectorSpecies<Float> species) {
115 return VectorIntrinsics.broadcastCoerced((Class<FloatVector>) species.boxType(), float.class, species.length(),
116 Float.floatToIntBits(0.0f), species,
117 ((bits, s) -> ((FloatSpecies)s).op(i -> Float.intBitsToFloat((int)bits))));
118 }
119
120 /**
121 * Loads a vector from a byte array starting at an offset.
122 * <p>
123 * Bytes are composed into primitive lane elements according to the
124 * native byte order of the underlying platform
125 * <p>
126 * This method behaves as if it returns the result of calling the
127 * byte buffer, offset, and mask accepting
128 * {@link #fromByteBuffer(VectorSpecies<Float>, ByteBuffer, int, VectorMask) method} as follows:
129 * <pre>{@code
130 * return this.fromByteBuffer(ByteBuffer.wrap(a), i, this.maskAllTrue());
131 * }</pre>
132 *
133 * @param species species of desired vector
134 * @param a the byte array
135 * @param ix the offset into the array
136 * @return a vector loaded from a byte array
137 * @throws IndexOutOfBoundsException if {@code i < 0} or
138 * {@code i > a.length - (this.length() * this.elementSize() / Byte.SIZE)}
139 */
140 @ForceInline
141 @SuppressWarnings("unchecked")
142 public static FloatVector fromByteArray(VectorSpecies<Float> species, byte[] a, int ix) {
143 Objects.requireNonNull(a);
144 ix = VectorIntrinsics.checkIndex(ix, a.length, species.bitSize() / Byte.SIZE);
145 return VectorIntrinsics.load((Class<FloatVector>) species.boxType(), float.class, species.length(),
146 a, ((long) ix) + Unsafe.ARRAY_BYTE_BASE_OFFSET,
147 a, ix, species,
148 (c, idx, s) -> {
149 ByteBuffer bbc = ByteBuffer.wrap(c, idx, a.length - idx).order(ByteOrder.nativeOrder());
150 FloatBuffer tb = bbc.asFloatBuffer();
151 return ((FloatSpecies)s).op(i -> tb.get());
152 });
153 }
154
155 /**
156 * Loads a vector from a byte array starting at an offset and using a
157 * mask.
158 * <p>
159 * Bytes are composed into primitive lane elements according to the
160 * native byte order of the underlying platform.
161 * <p>
162 * This method behaves as if it returns the result of calling the
163 * byte buffer, offset, and mask accepting
164 * {@link #fromByteBuffer(VectorSpecies<Float>, ByteBuffer, int, VectorMask) method} as follows:
165 * <pre>{@code
166 * return this.fromByteBuffer(ByteBuffer.wrap(a), i, m);
167 * }</pre>
168 *
169 * @param species species of desired vector
170 * @param a the byte array
171 * @param ix the offset into the array
172 * @param m the mask
173 * @return a vector loaded from a byte array
174 * @throws IndexOutOfBoundsException if {@code i < 0} or
175 * {@code i > a.length - (this.length() * this.elementSize() / Byte.SIZE)}
176 * @throws IndexOutOfBoundsException if the offset is {@code < 0},
177 * or {@code > a.length},
178 * for any vector lane index {@code N} where the mask at lane {@code N}
179 * is set
180 * {@code i >= a.length - (N * this.elementSize() / Byte.SIZE)}
181 */
182 @ForceInline
183 public static FloatVector fromByteArray(VectorSpecies<Float> species, byte[] a, int ix, VectorMask<Float> m) {
184 return zero(species).blend(fromByteArray(species, a, ix), m);
185 }
186
187 /**
188 * Loads a vector from an array starting at offset.
189 * <p>
190 * For each vector lane, where {@code N} is the vector lane index, the
191 * array element at index {@code i + N} is placed into the
192 * resulting vector at lane index {@code N}.
193 *
194 * @param species species of desired vector
195 * @param a the array
196 * @param i the offset into the array
197 * @return the vector loaded from an array
198 * @throws IndexOutOfBoundsException if {@code i < 0}, or
199 * {@code i > a.length - this.length()}
200 */
201 @ForceInline
202 @SuppressWarnings("unchecked")
203 public static FloatVector fromArray(VectorSpecies<Float> species, float[] a, int i){
204 Objects.requireNonNull(a);
205 i = VectorIntrinsics.checkIndex(i, a.length, species.length());
206 return VectorIntrinsics.load((Class<FloatVector>) species.boxType(), float.class, species.length(),
207 a, (((long) i) << ARRAY_SHIFT) + Unsafe.ARRAY_FLOAT_BASE_OFFSET,
208 a, i, species,
209 (c, idx, s) -> ((FloatSpecies)s).op(n -> c[idx + n]));
210 }
211
212
213 /**
214 * Loads a vector from an array starting at offset and using a mask.
215 * <p>
216 * For each vector lane, where {@code N} is the vector lane index,
217 * if the mask lane at index {@code N} is set then the array element at
218 * index {@code i + N} is placed into the resulting vector at lane index
219 * {@code N}, otherwise the default element value is placed into the
220 * resulting vector at lane index {@code N}.
221 *
222 * @param species species of desired vector
223 * @param a the array
224 * @param i the offset into the array
225 * @param m the mask
226 * @return the vector loaded from an array
227 * @throws IndexOutOfBoundsException if {@code i < 0}, or
228 * for any vector lane index {@code N} where the mask at lane {@code N}
229 * is set {@code i > a.length - N}
230 */
231 @ForceInline
232 public static FloatVector fromArray(VectorSpecies<Float> species, float[] a, int i, VectorMask<Float> m) {
233 return zero(species).blend(fromArray(species, a, i), m);
234 }
235
236 /**
237 * Loads a vector from an array using indexes obtained from an index
238 * map.
239 * <p>
240 * For each vector lane, where {@code N} is the vector lane index, the
241 * array element at index {@code i + indexMap[j + N]} is placed into the
242 * resulting vector at lane index {@code N}.
243 *
244 * @param species species of desired vector
245 * @param a the array
246 * @param i the offset into the array, may be negative if relative
247 * indexes in the index map compensate to produce a value within the
248 * array bounds
249 * @param indexMap the index map
250 * @param j the offset into the index map
251 * @return the vector loaded from an array
252 * @throws IndexOutOfBoundsException if {@code j < 0}, or
253 * {@code j > indexMap.length - this.length()},
254 * or for any vector lane index {@code N} the result of
255 * {@code i + indexMap[j + N]} is {@code < 0} or {@code >= a.length}
256 */
257 @ForceInline
258 @SuppressWarnings("unchecked")
259 public static FloatVector fromArray(VectorSpecies<Float> species, float[] a, int i, int[] indexMap, int j) {
260 Objects.requireNonNull(a);
261 Objects.requireNonNull(indexMap);
262
263
264 // Index vector: vix[0:n] = k -> i + indexMap[j + k]
265 IntVector vix = IntVector.fromArray(IntVector.species(species.indexShape()), indexMap, j).add(i);
266
267 vix = VectorIntrinsics.checkIndex(vix, a.length);
268
269 return VectorIntrinsics.loadWithMap((Class<FloatVector>) species.boxType(), float.class, species.length(),
270 IntVector.species(species.indexShape()).boxType(), a, Unsafe.ARRAY_FLOAT_BASE_OFFSET, vix,
271 a, i, indexMap, j, species,
272 (float[] c, int idx, int[] iMap, int idy, VectorSpecies<Float> s) ->
273 ((FloatSpecies)s).op(n -> c[idx + iMap[idy+n]]));
274 }
275
276 /**
277 * Loads a vector from an array using indexes obtained from an index
278 * map and using a mask.
279 * <p>
280 * For each vector lane, where {@code N} is the vector lane index,
281 * if the mask lane at index {@code N} is set then the array element at
282 * index {@code i + indexMap[j + N]} is placed into the resulting vector
283 * at lane index {@code N}.
284 *
285 * @param species species of desired vector
286 * @param a the array
287 * @param i the offset into the array, may be negative if relative
288 * indexes in the index map compensate to produce a value within the
289 * array bounds
290 * @param m the mask
291 * @param indexMap the index map
292 * @param j the offset into the index map
293 * @return the vector loaded from an array
294 * @throws IndexOutOfBoundsException if {@code j < 0}, or
295 * {@code j > indexMap.length - this.length()},
296 * or for any vector lane index {@code N} where the mask at lane
297 * {@code N} is set the result of {@code i + indexMap[j + N]} is
298 * {@code < 0} or {@code >= a.length}
299 */
300 @ForceInline
301 @SuppressWarnings("unchecked")
302 public static FloatVector fromArray(VectorSpecies<Float> species, float[] a, int i, VectorMask<Float> m, int[] indexMap, int j) {
303 // @@@ This can result in out of bounds errors for unset mask lanes
304 return zero(species).blend(fromArray(species, a, i, indexMap, j), m);
305 }
306
307
308 /**
309 * Loads a vector from a {@link ByteBuffer byte buffer} starting at an
310 * offset into the byte buffer.
311 * <p>
312 * Bytes are composed into primitive lane elements according to the
313 * native byte order of the underlying platform.
314 * <p>
315 * This method behaves as if it returns the result of calling the
316 * byte buffer, offset, and mask accepting
317 * {@link #fromByteBuffer(VectorSpecies<Float>, ByteBuffer, int, VectorMask)} method} as follows:
318 * <pre>{@code
319 * return this.fromByteBuffer(b, i, this.maskAllTrue())
320 * }</pre>
321 *
322 * @param species species of desired vector
323 * @param bb the byte buffer
324 * @param ix the offset into the byte buffer
325 * @return a vector loaded from a byte buffer
326 * @throws IndexOutOfBoundsException if the offset is {@code < 0},
327 * or {@code > b.limit()},
328 * or if there are fewer than
329 * {@code this.length() * this.elementSize() / Byte.SIZE} bytes
330 * remaining in the byte buffer from the given offset
331 */
332 @ForceInline
333 @SuppressWarnings("unchecked")
334 public static FloatVector fromByteBuffer(VectorSpecies<Float> species, ByteBuffer bb, int ix) {
335 if (bb.order() != ByteOrder.nativeOrder()) {
336 throw new IllegalArgumentException();
337 }
338 ix = VectorIntrinsics.checkIndex(ix, bb.limit(), species.bitSize() / Byte.SIZE);
339 return VectorIntrinsics.load((Class<FloatVector>) species.boxType(), float.class, species.length(),
340 U.getReference(bb, BYTE_BUFFER_HB), U.getLong(bb, BUFFER_ADDRESS) + ix,
341 bb, ix, species,
342 (c, idx, s) -> {
343 ByteBuffer bbc = c.duplicate().position(idx).order(ByteOrder.nativeOrder());
344 FloatBuffer tb = bbc.asFloatBuffer();
345 return ((FloatSpecies)s).op(i -> tb.get());
346 });
347 }
348
349 /**
350 * Loads a vector from a {@link ByteBuffer byte buffer} starting at an
351 * offset into the byte buffer and using a mask.
352 * <p>
353 * This method behaves as if the byte buffer is viewed as a primitive
354 * {@link java.nio.Buffer buffer} for the primitive element type,
355 * according to the native byte order of the underlying platform, and
356 * the returned vector is loaded with a mask from a primitive array
357 * obtained from the primitive buffer.
358 * The following pseudocode expresses the behaviour, where
359 * {@coce EBuffer} is the primitive buffer type, {@code e} is the
360 * primitive element type, and {@code ESpecies<S>} is the primitive
361 * species for {@code e}:
362 * <pre>{@code
363 * EBuffer eb = b.duplicate().
364 * order(ByteOrder.nativeOrder()).position(i).
365 * asEBuffer();
366 * e[] es = new e[this.length()];
367 * for (int n = 0; n < t.length; n++) {
368 * if (m.isSet(n))
369 * es[n] = eb.get(n);
370 * }
371 * Vector<E> r = ((ESpecies<S>)this).fromArray(es, 0, m);
372 * }</pre>
373 *
374 * @param species species of desired vector
375 * @param bb the byte buffer
376 * @param ix the offset into the byte buffer
377 * @param m the mask
378 * @return a vector loaded from a byte buffer
379 * @throws IndexOutOfBoundsException if the offset is {@code < 0},
380 * or {@code > b.limit()},
381 * for any vector lane index {@code N} where the mask at lane {@code N}
382 * is set
383 * {@code i >= b.limit() - (N * this.elementSize() / Byte.SIZE)}
384 */
385 @ForceInline
386 public static FloatVector fromByteBuffer(VectorSpecies<Float> species, ByteBuffer bb, int ix, VectorMask<Float> m) {
387 return zero(species).blend(fromByteBuffer(species, bb, ix), m);
388 }
389
390 /**
391 * Returns a vector where all lane elements are set to the primitive
392 * value {@code e}.
393 *
394 * @param s species of the desired vector
395 * @param e the value
396 * @return a vector of vector where all lane elements are set to
397 * the primitive value {@code e}
398 */
399 @ForceInline
400 @SuppressWarnings("unchecked")
401 public static FloatVector broadcast(VectorSpecies<Float> s, float e) {
402 return VectorIntrinsics.broadcastCoerced(
403 (Class<FloatVector>) s.boxType(), float.class, s.length(),
404 Float.floatToIntBits(e), s,
405 ((bits, sp) -> ((FloatSpecies)sp).op(i -> Float.intBitsToFloat((int)bits))));
406 }
407
408 /**
409 * Returns a vector where each lane element is set to a given
410 * primitive value.
411 * <p>
412 * For each vector lane, where {@code N} is the vector lane index, the
413 * the primitive value at index {@code N} is placed into the resulting
414 * vector at lane index {@code N}.
415 *
416 * @param s species of the desired vector
417 * @param es the given primitive values
418 * @return a vector where each lane element is set to a given primitive
419 * value
420 * @throws IndexOutOfBoundsException if {@code es.length < this.length()}
421 */
422 @ForceInline
423 @SuppressWarnings("unchecked")
424 public static FloatVector scalars(VectorSpecies<Float> s, float... es) {
425 Objects.requireNonNull(es);
426 int ix = VectorIntrinsics.checkIndex(0, es.length, s.length());
427 return VectorIntrinsics.load((Class<FloatVector>) s.boxType(), float.class, s.length(),
428 es, Unsafe.ARRAY_FLOAT_BASE_OFFSET,
429 es, ix, s,
430 (c, idx, sp) -> ((FloatSpecies)sp).op(n -> c[idx + n]));
431 }
432
433 /**
434 * Returns a vector where the first lane element is set to the primtive
435 * value {@code e}, all other lane elements are set to the default
436 * value.
437 *
438 * @param s species of the desired vector
439 * @param e the value
440 * @return a vector where the first lane element is set to the primitive
441 * value {@code e}
442 */
443 @ForceInline
444 public static final FloatVector single(VectorSpecies<Float> s, float e) {
445 return zero(s).with(0, e);
446 }
447
448 /**
449 * Returns a vector where each lane element is set to a randomly
450 * generated primitive value.
451 *
452 * The semantics are equivalent to calling
453 * {@link ThreadLocalRandom#nextFloat()}
454 *
455 * @param s species of the desired vector
456 * @return a vector where each lane elements is set to a randomly
457 * generated primitive value
458 */
459 public static FloatVector random(VectorSpecies<Float> s) {
460 ThreadLocalRandom r = ThreadLocalRandom.current();
461 return ((FloatSpecies)s).op(i -> r.nextFloat());
462 }
463
464 // Ops
465
466 @Override
467 public abstract FloatVector add(Vector<Float> v);
468
469 /**
470 * Adds this vector to the broadcast of an input scalar.
471 * <p>
472 * This is a vector binary operation where the primitive addition operation
473 * ({@code +}) is applied to lane elements.
474 *
475 * @param s the input scalar
476 * @return the result of adding this vector to the broadcast of an input
477 * scalar
478 */
479 public abstract FloatVector add(float s);
480
481 @Override
482 public abstract FloatVector add(Vector<Float> v, VectorMask<Float> m);
483
484 /**
485 * Adds this vector to broadcast of an input scalar,
486 * selecting lane elements controlled by a mask.
487 * <p>
488 * This is a vector binary operation where the primitive addition operation
489 * ({@code +}) is applied to lane elements.
490 *
491 * @param s the input scalar
492 * @param m the mask controlling lane selection
493 * @return the result of adding this vector to the broadcast of an input
494 * scalar
495 */
496 public abstract FloatVector add(float s, VectorMask<Float> m);
497
498 @Override
499 public abstract FloatVector sub(Vector<Float> v);
500
501 /**
502 * Subtracts the broadcast of an input scalar from this vector.
503 * <p>
504 * This is a vector binary operation where the primitive subtraction
505 * operation ({@code -}) is applied to lane elements.
506 *
507 * @param s the input scalar
508 * @return the result of subtracting the broadcast of an input
509 * scalar from this vector
510 */
511 public abstract FloatVector sub(float s);
512
513 @Override
514 public abstract FloatVector sub(Vector<Float> v, VectorMask<Float> m);
515
516 /**
517 * Subtracts the broadcast of an input scalar from this vector, selecting
518 * lane elements controlled by a mask.
519 * <p>
520 * This is a vector binary operation where the primitive subtraction
521 * operation ({@code -}) is applied to lane elements.
522 *
523 * @param s the input scalar
524 * @param m the mask controlling lane selection
525 * @return the result of subtracting the broadcast of an input
526 * scalar from this vector
527 */
528 public abstract FloatVector sub(float s, VectorMask<Float> m);
529
530 @Override
531 public abstract FloatVector mul(Vector<Float> v);
532
533 /**
534 * Multiplies this vector with the broadcast of an input scalar.
535 * <p>
536 * This is a vector binary operation where the primitive multiplication
537 * operation ({@code *}) is applied to lane elements.
538 *
539 * @param s the input scalar
540 * @return the result of multiplying this vector with the broadcast of an
541 * input scalar
542 */
543 public abstract FloatVector mul(float s);
544
545 @Override
546 public abstract FloatVector mul(Vector<Float> v, VectorMask<Float> m);
547
548 /**
549 * Multiplies this vector with the broadcast of an input scalar, selecting
550 * lane elements controlled by a mask.
551 * <p>
552 * This is a vector binary operation where the primitive multiplication
553 * operation ({@code *}) is applied to lane elements.
554 *
555 * @param s the input scalar
556 * @param m the mask controlling lane selection
557 * @return the result of multiplying this vector with the broadcast of an
558 * input scalar
559 */
560 public abstract FloatVector mul(float s, VectorMask<Float> m);
561
562 @Override
563 public abstract FloatVector neg();
564
565 @Override
566 public abstract FloatVector neg(VectorMask<Float> m);
567
568 @Override
569 public abstract FloatVector abs();
570
571 @Override
572 public abstract FloatVector abs(VectorMask<Float> m);
573
574 @Override
575 public abstract FloatVector min(Vector<Float> v);
576
577 @Override
578 public abstract FloatVector min(Vector<Float> v, VectorMask<Float> m);
579
580 /**
581 * Returns the minimum of this vector and the broadcast of an input scalar.
582 * <p>
583 * This is a vector binary operation where the operation
584 * {@code (a, b) -> Math.min(a, b)} is applied to lane elements.
585 *
586 * @param s the input scalar
587 * @return the minimum of this vector and the broadcast of an input scalar
588 */
589 public abstract FloatVector min(float s);
590
591 @Override
592 public abstract FloatVector max(Vector<Float> v);
593
594 @Override
595 public abstract FloatVector max(Vector<Float> v, VectorMask<Float> m);
596
597 /**
598 * Returns the maximum of this vector and the broadcast of an input scalar.
599 * <p>
600 * This is a vector binary operation where the operation
601 * {@code (a, b) -> Math.max(a, b)} is applied to lane elements.
602 *
603 * @param s the input scalar
604 * @return the maximum of this vector and the broadcast of an input scalar
605 */
606 public abstract FloatVector max(float s);
607
608 @Override
609 public abstract VectorMask<Float> equal(Vector<Float> v);
610
611 /**
612 * Tests if this vector is equal to the broadcast of an input scalar.
613 * <p>
614 * This is a vector binary test operation where the primitive equals
615 * operation ({@code ==}) is applied to lane elements.
616 *
617 * @param s the input scalar
618 * @return the result mask of testing if this vector is equal to the
619 * broadcast of an input scalar
620 */
621 public abstract VectorMask<Float> equal(float s);
622
623 @Override
624 public abstract VectorMask<Float> notEqual(Vector<Float> v);
625
626 /**
627 * Tests if this vector is not equal to the broadcast of an input scalar.
628 * <p>
629 * This is a vector binary test operation where the primitive not equals
630 * operation ({@code !=}) is applied to lane elements.
631 *
632 * @param s the input scalar
633 * @return the result mask of testing if this vector is not equal to the
634 * broadcast of an input scalar
635 */
636 public abstract VectorMask<Float> notEqual(float s);
637
638 @Override
639 public abstract VectorMask<Float> lessThan(Vector<Float> v);
640
641 /**
642 * Tests if this vector is less than the broadcast of an input scalar.
643 * <p>
644 * This is a vector binary test operation where the primitive less than
645 * operation ({@code <}) is applied to lane elements.
646 *
647 * @param s the input scalar
648 * @return the mask result of testing if this vector is less than the
649 * broadcast of an input scalar
650 */
651 public abstract VectorMask<Float> lessThan(float s);
652
653 @Override
654 public abstract VectorMask<Float> lessThanEq(Vector<Float> v);
655
656 /**
657 * Tests if this vector is less or equal to the broadcast of an input scalar.
658 * <p>
659 * This is a vector binary test operation where the primitive less than
660 * or equal to operation ({@code <=}) is applied to lane elements.
661 *
662 * @param s the input scalar
663 * @return the mask result of testing if this vector is less than or equal
664 * to the broadcast of an input scalar
665 */
666 public abstract VectorMask<Float> lessThanEq(float s);
667
668 @Override
669 public abstract VectorMask<Float> greaterThan(Vector<Float> v);
670
671 /**
672 * Tests if this vector is greater than the broadcast of an input scalar.
673 * <p>
674 * This is a vector binary test operation where the primitive greater than
675 * operation ({@code >}) is applied to lane elements.
676 *
677 * @param s the input scalar
678 * @return the mask result of testing if this vector is greater than the
679 * broadcast of an input scalar
680 */
681 public abstract VectorMask<Float> greaterThan(float s);
682
683 @Override
684 public abstract VectorMask<Float> greaterThanEq(Vector<Float> v);
685
686 /**
687 * Tests if this vector is greater than or equal to the broadcast of an
688 * input scalar.
689 * <p>
690 * This is a vector binary test operation where the primitive greater than
691 * or equal to operation ({@code >=}) is applied to lane elements.
692 *
693 * @param s the input scalar
694 * @return the mask result of testing if this vector is greater than or
695 * equal to the broadcast of an input scalar
696 */
697 public abstract VectorMask<Float> greaterThanEq(float s);
698
699 @Override
700 public abstract FloatVector blend(Vector<Float> v, VectorMask<Float> m);
701
702 /**
703 * Blends the lane elements of this vector with those of the broadcast of an
704 * input scalar, selecting lanes controlled by a mask.
705 * <p>
706 * For each lane of the mask, at lane index {@code N}, if the mask lane
707 * is set then the lane element at {@code N} from the input vector is
708 * selected and placed into the resulting vector at {@code N},
709 * otherwise the the lane element at {@code N} from this input vector is
710 * selected and placed into the resulting vector at {@code N}.
711 *
712 * @param s the input scalar
713 * @param m the mask controlling lane selection
714 * @return the result of blending the lane elements of this vector with
715 * those of the broadcast of an input scalar
716 */
717 public abstract FloatVector blend(float s, VectorMask<Float> m);
718
719 @Override
720 public abstract FloatVector rearrange(Vector<Float> v,
721 VectorShuffle<Float> s, VectorMask<Float> m);
722
723 @Override
724 public abstract FloatVector rearrange(VectorShuffle<Float> m);
725
726 @Override
727 public abstract FloatVector reshape(VectorSpecies<Float> s);
728
729 @Override
730 public abstract FloatVector rotateEL(int i);
731
732 @Override
733 public abstract FloatVector rotateER(int i);
734
735 @Override
736 public abstract FloatVector shiftEL(int i);
737
738 @Override
739 public abstract FloatVector shiftER(int i);
740
741 /**
742 * Divides this vector by an input vector.
743 * <p>
744 * This is a vector binary operation where the primitive division
745 * operation ({@code /}) is applied to lane elements.
746 *
747 * @param v the input vector
748 * @return the result of dividing this vector by the input vector
749 */
750 public abstract FloatVector div(Vector<Float> v);
751
752 /**
753 * Divides this vector by the broadcast of an input scalar.
754 * <p>
755 * This is a vector binary operation where the primitive division
756 * operation ({@code /}) is applied to lane elements.
757 *
758 * @param s the input scalar
759 * @return the result of dividing this vector by the broadcast of an input
760 * scalar
761 */
762 public abstract FloatVector div(float s);
763
764 /**
765 * Divides this vector by an input vector, selecting lane elements
766 * controlled by a mask.
767 * <p>
768 * This is a vector binary operation where the primitive division
769 * operation ({@code /}) is applied to lane elements.
770 *
771 * @param v the input vector
772 * @param m the mask controlling lane selection
773 * @return the result of dividing this vector by the input vector
774 */
775 public abstract FloatVector div(Vector<Float> v, VectorMask<Float> m);
776
777 /**
778 * Divides this vector by the broadcast of an input scalar, selecting lane
779 * elements controlled by a mask.
780 * <p>
781 * This is a vector binary operation where the primitive division
782 * operation ({@code /}) is applied to lane elements.
783 *
784 * @param s the input scalar
785 * @param m the mask controlling lane selection
786 * @return the result of dividing this vector by the broadcast of an input
787 * scalar
788 */
789 public abstract FloatVector div(float s, VectorMask<Float> m);
790
791 /**
792 * Calculates the square root of this vector.
793 * <p>
794 * This is a vector unary operation where the {@link Math#sqrt} operation
795 * is applied to lane elements.
796 *
797 * @return the square root of this vector
798 */
799 public abstract FloatVector sqrt();
800
801 /**
802 * Calculates the square root of this vector, selecting lane elements
803 * controlled by a mask.
804 * <p>
805 * This is a vector unary operation where the {@link Math#sqrt} operation
806 * is applied to lane elements.
807 *
808 * @param m the mask controlling lane selection
809 * @return the square root of this vector
810 */
811 public FloatVector sqrt(VectorMask<Float> m) {
812 return uOp(m, (i, a) -> (float) Math.sqrt((double) a));
813 }
814
815 /**
816 * Calculates the trigonometric tangent of this vector.
817 * <p>
818 * This is a vector unary operation with same semantic definition as
819 * {@link Math#tan} operation applied to lane elements.
820 * The implementation is not required to return same
821 * results as {@link Math#tan}, but adheres to rounding, monotonicity,
822 * and special case semantics as defined in the {@link Math#tan}
823 * specifications. The computed result will be within 1 ulp of the
824 * exact result.
825 *
826 * @return the tangent of this vector
827 */
828 public FloatVector tan() {
829 return uOp((i, a) -> (float) Math.tan((double) a));
830 }
831
832 /**
833 * Calculates the trigonometric tangent of this vector, selecting lane
834 * elements controlled by a mask.
835 * <p>
836 * Semantics for rounding, monotonicity, and special cases are
837 * described in {@link FloatVector#tan}
838 *
839 * @param m the mask controlling lane selection
840 * @return the tangent of this vector
841 */
842 public FloatVector tan(VectorMask<Float> m) {
843 return uOp(m, (i, a) -> (float) Math.tan((double) a));
844 }
845
846 /**
847 * Calculates the hyperbolic tangent of this vector.
848 * <p>
849 * This is a vector unary operation with same semantic definition as
850 * {@link Math#tanh} operation applied to lane elements.
851 * The implementation is not required to return same
852 * results as {@link Math#tanh}, but adheres to rounding, monotonicity,
853 * and special case semantics as defined in the {@link Math#tanh}
854 * specifications. The computed result will be within 2.5 ulps of the
855 * exact result.
856 *
857 * @return the hyperbolic tangent of this vector
858 */
859 public FloatVector tanh() {
860 return uOp((i, a) -> (float) Math.tanh((double) a));
861 }
862
863 /**
864 * Calculates the hyperbolic tangent of this vector, selecting lane elements
865 * controlled by a mask.
866 * <p>
867 * Semantics for rounding, monotonicity, and special cases are
868 * described in {@link FloatVector#tanh}
869 *
870 * @param m the mask controlling lane selection
871 * @return the hyperbolic tangent of this vector
872 */
873 public FloatVector tanh(VectorMask<Float> m) {
874 return uOp(m, (i, a) -> (float) Math.tanh((double) a));
875 }
876
877 /**
878 * Calculates the trigonometric sine of this vector.
879 * <p>
880 * This is a vector unary operation with same semantic definition as
881 * {@link Math#sin} operation applied to lane elements.
882 * The implementation is not required to return same
883 * results as {@link Math#sin}, but adheres to rounding, monotonicity,
884 * and special case semantics as defined in the {@link Math#sin}
885 * specifications. The computed result will be within 1 ulp of the
886 * exact result.
887 *
888 * @return the sine of this vector
889 */
890 public FloatVector sin() {
891 return uOp((i, a) -> (float) Math.sin((double) a));
892 }
893
894 /**
895 * Calculates the trigonometric sine of this vector, selecting lane elements
896 * controlled by a mask.
897 * <p>
898 * Semantics for rounding, monotonicity, and special cases are
899 * described in {@link FloatVector#sin}
900 *
901 * @param m the mask controlling lane selection
902 * @return the sine of this vector
903 */
904 public FloatVector sin(VectorMask<Float> m) {
905 return uOp(m, (i, a) -> (float) Math.sin((double) a));
906 }
907
908 /**
909 * Calculates the hyperbolic sine of this vector.
910 * <p>
911 * This is a vector unary operation with same semantic definition as
912 * {@link Math#sinh} operation applied to lane elements.
913 * The implementation is not required to return same
914 * results as {@link Math#sinh}, but adheres to rounding, monotonicity,
915 * and special case semantics as defined in the {@link Math#sinh}
916 * specifications. The computed result will be within 2.5 ulps of the
917 * exact result.
918 *
919 * @return the hyperbolic sine of this vector
920 */
921 public FloatVector sinh() {
922 return uOp((i, a) -> (float) Math.sinh((double) a));
923 }
924
925 /**
926 * Calculates the hyperbolic sine of this vector, selecting lane elements
927 * controlled by a mask.
928 * <p>
929 * Semantics for rounding, monotonicity, and special cases are
930 * described in {@link FloatVector#sinh}
931 *
932 * @param m the mask controlling lane selection
933 * @return the hyperbolic sine of this vector
934 */
935 public FloatVector sinh(VectorMask<Float> m) {
936 return uOp(m, (i, a) -> (float) Math.sinh((double) a));
937 }
938
939 /**
940 * Calculates the trigonometric cosine of this vector.
941 * <p>
942 * This is a vector unary operation with same semantic definition as
943 * {@link Math#cos} operation applied to lane elements.
944 * The implementation is not required to return same
945 * results as {@link Math#cos}, but adheres to rounding, monotonicity,
946 * and special case semantics as defined in the {@link Math#cos}
947 * specifications. The computed result will be within 1 ulp of the
948 * exact result.
949 *
950 * @return the cosine of this vector
951 */
952 public FloatVector cos() {
953 return uOp((i, a) -> (float) Math.cos((double) a));
954 }
955
956 /**
957 * Calculates the trigonometric cosine of this vector, selecting lane
958 * elements controlled by a mask.
959 * <p>
960 * Semantics for rounding, monotonicity, and special cases are
961 * described in {@link FloatVector#cos}
962 *
963 * @param m the mask controlling lane selection
964 * @return the cosine of this vector
965 */
966 public FloatVector cos(VectorMask<Float> m) {
967 return uOp(m, (i, a) -> (float) Math.cos((double) a));
968 }
969
970 /**
971 * Calculates the hyperbolic cosine of this vector.
972 * <p>
973 * This is a vector unary operation with same semantic definition as
974 * {@link Math#cosh} operation applied to lane elements.
975 * The implementation is not required to return same
976 * results as {@link Math#cosh}, but adheres to rounding, monotonicity,
977 * and special case semantics as defined in the {@link Math#cosh}
978 * specifications. The computed result will be within 2.5 ulps of the
979 * exact result.
980 *
981 * @return the hyperbolic cosine of this vector
982 */
983 public FloatVector cosh() {
984 return uOp((i, a) -> (float) Math.cosh((double) a));
985 }
986
987 /**
988 * Calculates the hyperbolic cosine of this vector, selecting lane elements
989 * controlled by a mask.
990 * <p>
991 * Semantics for rounding, monotonicity, and special cases are
992 * described in {@link FloatVector#cosh}
993 *
994 * @param m the mask controlling lane selection
995 * @return the hyperbolic cosine of this vector
996 */
997 public FloatVector cosh(VectorMask<Float> m) {
998 return uOp(m, (i, a) -> (float) Math.cosh((double) a));
999 }
1000
1001 /**
1002 * Calculates the arc sine of this vector.
1003 * <p>
1004 * This is a vector unary operation with same semantic definition as
1005 * {@link Math#asin} operation applied to lane elements.
1006 * The implementation is not required to return same
1007 * results as {@link Math#asin}, but adheres to rounding, monotonicity,
1008 * and special case semantics as defined in the {@link Math#asin}
1009 * specifications. The computed result will be within 1 ulp of the
1010 * exact result.
1011 *
1012 * @return the arc sine of this vector
1013 */
1014 public FloatVector asin() {
1015 return uOp((i, a) -> (float) Math.asin((double) a));
1016 }
1017
1018 /**
1019 * Calculates the arc sine of this vector, selecting lane elements
1020 * controlled by a mask.
1021 * <p>
1022 * Semantics for rounding, monotonicity, and special cases are
1023 * described in {@link FloatVector#asin}
1024 *
1025 * @param m the mask controlling lane selection
1026 * @return the arc sine of this vector
1027 */
1028 public FloatVector asin(VectorMask<Float> m) {
1029 return uOp(m, (i, a) -> (float) Math.asin((double) a));
1030 }
1031
1032 /**
1033 * Calculates the arc cosine of this vector.
1034 * <p>
1035 * This is a vector unary operation with same semantic definition as
1036 * {@link Math#acos} operation applied to lane elements.
1037 * The implementation is not required to return same
1038 * results as {@link Math#acos}, but adheres to rounding, monotonicity,
1039 * and special case semantics as defined in the {@link Math#acos}
1040 * specifications. The computed result will be within 1 ulp of the
1041 * exact result.
1042 *
1043 * @return the arc cosine of this vector
1044 */
1045 public FloatVector acos() {
1046 return uOp((i, a) -> (float) Math.acos((double) a));
1047 }
1048
1049 /**
1050 * Calculates the arc cosine of this vector, selecting lane elements
1051 * controlled by a mask.
1052 * <p>
1053 * Semantics for rounding, monotonicity, and special cases are
1054 * described in {@link FloatVector#acos}
1055 *
1056 * @param m the mask controlling lane selection
1057 * @return the arc cosine of this vector
1058 */
1059 public FloatVector acos(VectorMask<Float> m) {
1060 return uOp(m, (i, a) -> (float) Math.acos((double) a));
1061 }
1062
1063 /**
1064 * Calculates the arc tangent of this vector.
1065 * <p>
1066 * This is a vector unary operation with same semantic definition as
1067 * {@link Math#atan} operation applied to lane elements.
1068 * The implementation is not required to return same
1069 * results as {@link Math#atan}, but adheres to rounding, monotonicity,
1070 * and special case semantics as defined in the {@link Math#atan}
1071 * specifications. The computed result will be within 1 ulp of the
1072 * exact result.
1073 *
1074 * @return the arc tangent of this vector
1075 */
1076 public FloatVector atan() {
1077 return uOp((i, a) -> (float) Math.atan((double) a));
1078 }
1079
1080 /**
1081 * Calculates the arc tangent of this vector, selecting lane elements
1082 * controlled by a mask.
1083 * <p>
1084 * Semantics for rounding, monotonicity, and special cases are
1085 * described in {@link FloatVector#atan}
1086 *
1087 * @param m the mask controlling lane selection
1088 * @return the arc tangent of this vector
1089 */
1090 public FloatVector atan(VectorMask<Float> m) {
1091 return uOp(m, (i, a) -> (float) Math.atan((double) a));
1092 }
1093
1094 /**
1095 * Calculates the arc tangent of this vector divided by an input vector.
1096 * <p>
1097 * This is a vector binary operation with same semantic definition as
1098 * {@link Math#atan2} operation applied to lane elements.
1099 * The implementation is not required to return same
1100 * results as {@link Math#atan2}, but adheres to rounding, monotonicity,
1101 * and special case semantics as defined in the {@link Math#atan2}
1102 * specifications. The computed result will be within 2 ulps of the
1103 * exact result.
1104 *
1105 * @param v the input vector
1106 * @return the arc tangent of this vector divided by the input vector
1107 */
1108 public FloatVector atan2(Vector<Float> v) {
1109 return bOp(v, (i, a, b) -> (float) Math.atan2((double) a, (double) b));
1110 }
1111
1112 /**
1113 * Calculates the arc tangent of this vector divided by the broadcast of an
1114 * an input scalar.
1115 * <p>
1116 * This is a vector binary operation with same semantic definition as
1117 * {@link Math#atan2} operation applied to lane elements.
1118 * The implementation is not required to return same
1119 * results as {@link Math#atan2}, but adheres to rounding, monotonicity,
1120 * and special case semantics as defined in the {@link Math#atan2}
1121 * specifications. The computed result will be within 1 ulp of the
1122 * exact result.
1123 *
1124 * @param s the input scalar
1125 * @return the arc tangent of this vector over the input vector
1126 */
1127 public abstract FloatVector atan2(float s);
1128
1129 /**
1130 * Calculates the arc tangent of this vector divided by an input vector,
1131 * selecting lane elements controlled by a mask.
1132 * <p>
1133 * Semantics for rounding, monotonicity, and special cases are
1134 * described in {@link FloatVector#atan2}
1135 *
1136 * @param v the input vector
1137 * @param m the mask controlling lane selection
1140 public FloatVector atan2(Vector<Float> v, VectorMask<Float> m) {
1141 return bOp(v, m, (i, a, b) -> (float) Math.atan2((double) a, (double) b));
1142 }
1143
1144 /**
1145 * Calculates the arc tangent of this vector divided by the broadcast of an
1146 * an input scalar, selecting lane elements controlled by a mask.
1147 * <p>
1148 * Semantics for rounding, monotonicity, and special cases are
1149 * described in {@link FloatVector#atan2}
1150 *
1151 * @param s the input scalar
1152 * @param m the mask controlling lane selection
1153 * @return the arc tangent of this vector over the input vector
1154 */
1155 public abstract FloatVector atan2(float s, VectorMask<Float> m);
1156
1157 /**
1158 * Calculates the cube root of this vector.
1159 * <p>
1160 * This is a vector unary operation with same semantic definition as
1161 * {@link Math#cbrt} operation applied to lane elements.
1162 * The implementation is not required to return same
1163 * results as {@link Math#cbrt}, but adheres to rounding, monotonicity,
1164 * and special case semantics as defined in the {@link Math#cbrt}
1165 * specifications. The computed result will be within 1 ulp of the
1166 * exact result.
1167 *
1168 * @return the cube root of this vector
1169 */
1170 public FloatVector cbrt() {
1171 return uOp((i, a) -> (float) Math.cbrt((double) a));
1172 }
1173
1174 /**
1175 * Calculates the cube root of this vector, selecting lane elements
1176 * controlled by a mask.
1177 * <p>
1178 * Semantics for rounding, monotonicity, and special cases are
1179 * described in {@link FloatVector#cbrt}
1180 *
1181 * @param m the mask controlling lane selection
1182 * @return the cube root of this vector
1183 */
1184 public FloatVector cbrt(VectorMask<Float> m) {
1185 return uOp(m, (i, a) -> (float) Math.cbrt((double) a));
1186 }
1187
1188 /**
1189 * Calculates the natural logarithm of this vector.
1190 * <p>
1191 * This is a vector unary operation with same semantic definition as
1192 * {@link Math#log} operation applied to lane elements.
1193 * The implementation is not required to return same
1194 * results as {@link Math#log}, but adheres to rounding, monotonicity,
1195 * and special case semantics as defined in the {@link Math#log}
1196 * specifications. The computed result will be within 1 ulp of the
1197 * exact result.
1198 *
1199 * @return the natural logarithm of this vector
1200 */
1201 public FloatVector log() {
1202 return uOp((i, a) -> (float) Math.log((double) a));
1203 }
1204
1205 /**
1206 * Calculates the natural logarithm of this vector, selecting lane elements
1207 * controlled by a mask.
1208 * <p>
1209 * Semantics for rounding, monotonicity, and special cases are
1210 * described in {@link FloatVector#log}
1211 *
1212 * @param m the mask controlling lane selection
1213 * @return the natural logarithm of this vector
1214 */
1215 public FloatVector log(VectorMask<Float> m) {
1216 return uOp(m, (i, a) -> (float) Math.log((double) a));
1217 }
1218
1219 /**
1220 * Calculates the base 10 logarithm of this vector.
1221 * <p>
1222 * This is a vector unary operation with same semantic definition as
1223 * {@link Math#log10} operation applied to lane elements.
1224 * The implementation is not required to return same
1225 * results as {@link Math#log10}, but adheres to rounding, monotonicity,
1226 * and special case semantics as defined in the {@link Math#log10}
1227 * specifications. The computed result will be within 1 ulp of the
1228 * exact result.
1229 *
1230 * @return the base 10 logarithm of this vector
1231 */
1232 public FloatVector log10() {
1233 return uOp((i, a) -> (float) Math.log10((double) a));
1234 }
1235
1236 /**
1237 * Calculates the base 10 logarithm of this vector, selecting lane elements
1238 * controlled by a mask.
1239 * <p>
1240 * Semantics for rounding, monotonicity, and special cases are
1241 * described in {@link FloatVector#log10}
1242 *
1243 * @param m the mask controlling lane selection
1244 * @return the base 10 logarithm of this vector
1245 */
1246 public FloatVector log10(VectorMask<Float> m) {
1247 return uOp(m, (i, a) -> (float) Math.log10((double) a));
1248 }
1249
1250 /**
1251 * Calculates the natural logarithm of the sum of this vector and the
1252 * broadcast of {@code 1}.
1253 * <p>
1254 * This is a vector unary operation with same semantic definition as
1255 * {@link Math#log1p} operation applied to lane elements.
1256 * The implementation is not required to return same
1257 * results as {@link Math#log1p}, but adheres to rounding, monotonicity,
1258 * and special case semantics as defined in the {@link Math#log1p}
1259 * specifications. The computed result will be within 1 ulp of the
1260 * exact result.
1261 *
1262 * @return the natural logarithm of the sum of this vector and the broadcast
1263 * of {@code 1}
1264 */
1265 public FloatVector log1p() {
1266 return uOp((i, a) -> (float) Math.log1p((double) a));
1267 }
1268
1269 /**
1270 * Calculates the natural logarithm of the sum of this vector and the
1271 * broadcast of {@code 1}, selecting lane elements controlled by a mask.
1272 * <p>
1273 * Semantics for rounding, monotonicity, and special cases are
1274 * described in {@link FloatVector#log1p}
1275 *
1276 * @param m the mask controlling lane selection
1277 * @return the natural logarithm of the sum of this vector and the broadcast
1278 * of {@code 1}
1279 */
1280 public FloatVector log1p(VectorMask<Float> m) {
1281 return uOp(m, (i, a) -> (float) Math.log1p((double) a));
1282 }
1283
1284 /**
1285 * Calculates this vector raised to the power of an input vector.
1286 * <p>
1287 * This is a vector binary operation with same semantic definition as
1288 * {@link Math#pow} operation applied to lane elements.
1289 * The implementation is not required to return same
1290 * results as {@link Math#pow}, but adheres to rounding, monotonicity,
1291 * and special case semantics as defined in the {@link Math#pow}
1292 * specifications. The computed result will be within 1 ulp of the
1293 * exact result.
1294 *
1295 * @param v the input vector
1296 * @return this vector raised to the power of an input vector
1297 */
1298 public FloatVector pow(Vector<Float> v) {
1299 return bOp(v, (i, a, b) -> (float) Math.pow((double) a, (double) b));
1300 }
1301
1302 /**
1303 * Calculates this vector raised to the power of the broadcast of an input
1304 * scalar.
1305 * <p>
1306 * This is a vector binary operation with same semantic definition as
1307 * {@link Math#pow} operation applied to lane elements.
1308 * The implementation is not required to return same
1309 * results as {@link Math#pow}, but adheres to rounding, monotonicity,
1310 * and special case semantics as defined in the {@link Math#pow}
1311 * specifications. The computed result will be within 1 ulp of the
1312 * exact result.
1313 *
1314 * @param s the input scalar
1315 * @return this vector raised to the power of the broadcast of an input
1316 * scalar.
1317 */
1318 public abstract FloatVector pow(float s);
1319
1320 /**
1321 * Calculates this vector raised to the power of an input vector, selecting
1322 * lane elements controlled by a mask.
1323 * <p>
1324 * Semantics for rounding, monotonicity, and special cases are
1325 * described in {@link FloatVector#pow}
1326 *
1327 * @param v the input vector
1333 }
1334
1335 /**
1336 * Calculates this vector raised to the power of the broadcast of an input
1337 * scalar, selecting lane elements controlled by a mask.
1338 * <p>
1339 * Semantics for rounding, monotonicity, and special cases are
1340 * described in {@link FloatVector#pow}
1341 *
1342 * @param s the input scalar
1343 * @param m the mask controlling lane selection
1344 * @return this vector raised to the power of the broadcast of an input
1345 * scalar.
1346 */
1347 public abstract FloatVector pow(float s, VectorMask<Float> m);
1348
1349 /**
1350 * Calculates the broadcast of Euler's number {@code e} raised to the power
1351 * of this vector.
1352 * <p>
1353 * This is a vector unary operation with same semantic definition as
1354 * {@link Math#exp} operation applied to lane elements.
1355 * The implementation is not required to return same
1356 * results as {@link Math#exp}, but adheres to rounding, monotonicity,
1357 * and special case semantics as defined in the {@link Math#exp}
1358 * specifications. The computed result will be within 1 ulp of the
1359 * exact result.
1360 *
1361 * @return the broadcast of Euler's number {@code e} raised to the power of
1362 * this vector
1363 */
1364 public FloatVector exp() {
1365 return uOp((i, a) -> (float) Math.exp((double) a));
1366 }
1367
1368 /**
1369 * Calculates the broadcast of Euler's number {@code e} raised to the power
1370 * of this vector, selecting lane elements controlled by a mask.
1371 * <p>
1372 * Semantics for rounding, monotonicity, and special cases are
1373 * described in {@link FloatVector#exp}
1374 *
1375 * @param m the mask controlling lane selection
1376 * @return the broadcast of Euler's number {@code e} raised to the power of
1377 * this vector
1378 */
1379 public FloatVector exp(VectorMask<Float> m) {
1380 return uOp(m, (i, a) -> (float) Math.exp((double) a));
1381 }
1382
1383 /**
1384 * Calculates the broadcast of Euler's number {@code e} raised to the power
1385 * of this vector minus the broadcast of {@code -1}.
1386 * More specifically as if the following (ignoring any differences in
1387 * numerical accuracy):
1388 * <pre>{@code
1389 * this.exp().sub(this.species().broadcast(1))
1390 * }</pre>
1391 * <p>
1392 * This is a vector unary operation with same semantic definition as
1393 * {@link Math#expm1} operation applied to lane elements.
1394 * The implementation is not required to return same
1395 * results as {@link Math#expm1}, but adheres to rounding, monotonicity,
1396 * and special case semantics as defined in the {@link Math#expm1}
1397 * specifications. The computed result will be within 1 ulp of the
1398 * exact result.
1399 *
1400 * @return the broadcast of Euler's number {@code e} raised to the power of
1401 * this vector minus the broadcast of {@code -1}
1402 */
1403 public FloatVector expm1() {
1404 return uOp((i, a) -> (float) Math.expm1((double) a));
1405 }
1406
1407 /**
1408 * Calculates the broadcast of Euler's number {@code e} raised to the power
1409 * of this vector minus the broadcast of {@code -1}, selecting lane elements
1410 * controlled by a mask
1411 * More specifically as if the following (ignoring any differences in
1412 * numerical accuracy):
1413 * <pre>{@code
1414 * this.exp(m).sub(this.species().broadcast(1), m)
1415 * }</pre>
1416 * <p>
1417 * Semantics for rounding, monotonicity, and special cases are
1418 * described in {@link FloatVector#expm1}
1419 *
1420 * @param m the mask controlling lane selection
1421 * @return the broadcast of Euler's number {@code e} raised to the power of
1422 * this vector minus the broadcast of {@code -1}
1423 */
1424 public FloatVector expm1(VectorMask<Float> m) {
1425 return uOp(m, (i, a) -> (float) Math.expm1((double) a));
1426 }
1427
1428 /**
1429 * Calculates the product of this vector and a first input vector summed
1430 * with a second input vector.
1431 * More specifically as if the following (ignoring any differences in
1432 * numerical accuracy):
1433 * <pre>{@code
1434 * this.mul(v1).add(v2)
1435 * }</pre>
1436 * <p>
1437 * This is a vector ternary operation where the {@link Math#fma} operation
1438 * is applied to lane elements.
1439 *
1440 * @param v1 the first input vector
1441 * @param v2 the second input vector
1442 * @return the product of this vector and the first input vector summed with
1443 * the second input vector
1444 */
1445 public abstract FloatVector fma(Vector<Float> v1, Vector<Float> v2);
1446
1447 /**
1448 * Calculates the product of this vector and the broadcast of a first input
1449 * scalar summed with the broadcast of a second input scalar.
1450 * More specifically as if the following:
1451 * <pre>{@code
1452 * this.fma(this.species().broadcast(s1), this.species().broadcast(s2))
1453 * }</pre>
1454 * <p>
1455 * This is a vector ternary operation where the {@link Math#fma} operation
1456 * is applied to lane elements.
1457 *
1458 * @param s1 the first input scalar
1459 * @param s2 the second input scalar
1460 * @return the product of this vector and the broadcast of a first input
1461 * scalar summed with the broadcast of a second input scalar
1462 */
1463 public abstract FloatVector fma(float s1, float s2);
1464
1465 /**
1466 * Calculates the product of this vector and a first input vector summed
1467 * with a second input vector, selecting lane elements controlled by a mask.
1468 * More specifically as if the following (ignoring any differences in
1469 * numerical accuracy):
1470 * <pre>{@code
1471 * this.mul(v1, m).add(v2, m)
1472 * }</pre>
1473 * <p>
1474 * This is a vector ternary operation where the {@link Math#fma} operation
1475 * is applied to lane elements.
1476 *
1477 * @param v1 the first input vector
1478 * @param v2 the second input vector
1479 * @param m the mask controlling lane selection
1480 * @return the product of this vector and the first input vector summed with
1481 * the second input vector
1482 */
1483 public FloatVector fma(Vector<Float> v1, Vector<Float> v2, VectorMask<Float> m) {
1484 return tOp(v1, v2, m, (i, a, b, c) -> Math.fma(a, b, c));
1485 }
1486
1487 /**
1488 * Calculates the product of this vector and the broadcast of a first input
1489 * scalar summed with the broadcast of a second input scalar, selecting lane
1490 * elements controlled by a mask
1491 * More specifically as if the following:
1492 * <pre>{@code
1493 * this.fma(this.species().broadcast(s1), this.species().broadcast(s2), m)
1494 * }</pre>
1495 * <p>
1496 * This is a vector ternary operation where the {@link Math#fma} operation
1497 * is applied to lane elements.
1498 *
1499 * @param s1 the first input scalar
1500 * @param s2 the second input scalar
1501 * @param m the mask controlling lane selection
1502 * @return the product of this vector and the broadcast of a first input
1503 * scalar summed with the broadcast of a second input scalar
1504 */
1505 public abstract FloatVector fma(float s1, float s2, VectorMask<Float> m);
1506
1507 /**
1508 * Calculates square root of the sum of the squares of this vector and an
1509 * input vector.
1510 * More specifically as if the following (ignoring any differences in
1511 * numerical accuracy):
1512 * <pre>{@code
1513 * this.mul(this).add(v.mul(v)).sqrt()
1514 * }</pre>
1515 * <p>
1516 * This is a vector binary operation with same semantic definition as
1517 * {@link Math#hypot} operation applied to lane elements.
1518 * The implementation is not required to return same
1519 * results as {@link Math#hypot}, but adheres to rounding, monotonicity,
1520 * and special case semantics as defined in the {@link Math#hypot}
1521 * specifications. The computed result will be within 1 ulp of the
1522 * exact result.
1523 *
1524 * @param v the input vector
1525 * @return square root of the sum of the squares of this vector and an input
1526 * vector
1527 */
1528 public FloatVector hypot(Vector<Float> v) {
1529 return bOp(v, (i, a, b) -> (float) Math.hypot((double) a, (double) b));
1530 }
1531
1532 /**
1533 * Calculates square root of the sum of the squares of this vector and the
1534 * broadcast of an input scalar.
1535 * More specifically as if the following (ignoring any differences in
1536 * numerical accuracy):
1537 * <pre>{@code
1538 * this.mul(this).add(this.species().broadcast(v * v)).sqrt()
1539 * }</pre>
1540 * <p>
1541 * This is a vector binary operation with same semantic definition as
1542 * {@link Math#hypot} operation applied to lane elements.
1543 * The implementation is not required to return same
1544 * results as {@link Math#hypot}, but adheres to rounding, monotonicity,
1545 * and special case semantics as defined in the {@link Math#hypot}
1546 * specifications. The computed result will be within 1 ulp of the
1547 * exact result.
1548 *
1549 * @param s the input scalar
1550 * @return square root of the sum of the squares of this vector and the
1551 * broadcast of an input scalar
1552 */
1553 public abstract FloatVector hypot(float s);
1554
1555 /**
1556 * Calculates square root of the sum of the squares of this vector and an
1557 * input vector, selecting lane elements controlled by a mask.
1558 * More specifically as if the following (ignoring any differences in
1559 * numerical accuracy):
1560 * <pre>{@code
1561 * this.mul(this, m).add(v.mul(v), m).sqrt(m)
1562 * }</pre>
1563 * <p>
1564 * Semantics for rounding, monotonicity, and special cases are
1565 * described in {@link FloatVector#hypot}
1566 *
1567 * @param v the input vector
1568 * @param m the mask controlling lane selection
1569 * @return square root of the sum of the squares of this vector and an input
1570 * vector
1571 */
1572 public FloatVector hypot(Vector<Float> v, VectorMask<Float> m) {
1573 return bOp(v, m, (i, a, b) -> (float) Math.hypot((double) a, (double) b));
1574 }
1575
1576 /**
1577 * Calculates square root of the sum of the squares of this vector and the
1578 * broadcast of an input scalar, selecting lane elements controlled by a
1579 * mask.
1580 * More specifically as if the following (ignoring any differences in
1581 * numerical accuracy):
1582 * <pre>{@code
1583 * this.mul(this, m).add(this.species().broadcast(v * v), m).sqrt(m)
1584 * }</pre>
1585 * <p>
1586 * Semantics for rounding, monotonicity, and special cases are
1587 * described in {@link FloatVector#hypot}
1588 *
1589 * @param s the input scalar
1590 * @param m the mask controlling lane selection
1591 * @return square root of the sum of the squares of this vector and the
1592 * broadcast of an input scalar
1593 */
1594 public abstract FloatVector hypot(float s, VectorMask<Float> m);
1595
1596
1597 @Override
1598 public abstract void intoByteArray(byte[] a, int ix);
1599
1600 @Override
1601 public abstract void intoByteArray(byte[] a, int ix, VectorMask<Float> m);
1602
1603 @Override
1604 public abstract void intoByteBuffer(ByteBuffer bb, int ix);
1605
1606 @Override
1607 public abstract void intoByteBuffer(ByteBuffer bb, int ix, VectorMask<Float> m);
1608
1609
1610 // Type specific horizontal reductions
1611 /**
1612 * Adds all lane elements of this vector.
1613 * <p>
1614 * This is a vector reduction operation where the addition
1615 * operation ({@code +}) is applied to lane elements,
1616 * and the identity value is {@code 0.0}.
1617 *
1618 * <p>The value of a floating-point sum is a function both of the input values as well
1619 * as the order of addition operations. The order of addition operations of this method
1620 * is intentionally not defined to allow for JVM to generate optimal machine
1621 * code for the underlying platform at runtime. If the platform supports a vector
1622 * instruction to add all values in the vector, or if there is some other efficient machine
1623 * code sequence, then the JVM has the option of generating this machine code. Otherwise,
1624 * the default implementation of adding vectors sequentially from left to right is used.
1625 * For this reason, the output of this method may vary for the same input values.
1626 *
1627 * @return the addition of all the lane elements of this vector
1628 */
1629 public abstract float addAll();
1630
1631 /**
1632 * Adds all lane elements of this vector, selecting lane elements
1633 * controlled by a mask.
1634 * <p>
1635 * This is a vector reduction operation where the addition
1636 * operation ({@code +}) is applied to lane elements,
1637 * and the identity value is {@code 0.0}.
1638 *
1639 * <p>The value of a floating-point sum is a function both of the input values as well
1640 * as the order of addition operations. The order of addition operations of this method
1641 * is intentionally not defined to allow for JVM to generate optimal machine
1642 * code for the underlying platform at runtime. If the platform supports a vector
1643 * instruction to add all values in the vector, or if there is some other efficient machine
1644 * code sequence, then the JVM has the option of generating this machine code. Otherwise,
1645 * the default implementation of adding vectors sequentially from left to right is used.
1646 * For this reason, the output of this method may vary on the same input values.
1647 *
1648 * @param m the mask controlling lane selection
1649 * @return the addition of the selected lane elements of this vector
1650 */
1651 public abstract float addAll(VectorMask<Float> m);
1652
1653 /**
1654 * Multiplies all lane elements of this vector.
1655 * <p>
1656 * This is a vector reduction operation where the
1657 * multiplication operation ({@code *}) is applied to lane elements,
1658 * and the identity value is {@code 1.0}.
1659 *
1660 * <p>The order of multiplication operations of this method
1661 * is intentionally not defined to allow for JVM to generate optimal machine
1662 * code for the underlying platform at runtime. If the platform supports a vector
1663 * instruction to multiply all values in the vector, or if there is some other efficient machine
1664 * code sequence, then the JVM has the option of generating this machine code. Otherwise,
1665 * the default implementation of multiplying vectors sequentially from left to right is used.
1666 * For this reason, the output of this method may vary on the same input values.
1667 *
1668 * @return the multiplication of all the lane elements of this vector
1669 */
1670 public abstract float mulAll();
1671
1672 /**
1673 * Multiplies all lane elements of this vector, selecting lane elements
1674 * controlled by a mask.
1675 * <p>
1676 * This is a vector reduction operation where the
1677 * multiplication operation ({@code *}) is applied to lane elements,
1678 * and the identity value is {@code 1.0}.
1679 *
1680 * <p>The order of multiplication operations of this method
1681 * is intentionally not defined to allow for JVM to generate optimal machine
1682 * code for the underlying platform at runtime. If the platform supports a vector
1683 * instruction to multiply all values in the vector, or if there is some other efficient machine
1684 * code sequence, then the JVM has the option of generating this machine code. Otherwise,
1685 * the default implementation of multiplying vectors sequentially from left to right is used.
1686 * For this reason, the output of this method may vary on the same input values.
1687 *
1688 * @param m the mask controlling lane selection
1689 * @return the multiplication of all the lane elements of this vector
1690 */
1691 public abstract float mulAll(VectorMask<Float> m);
1692
1693 /**
1694 * Returns the minimum lane element of this vector.
1695 * <p>
1696 * This is an associative vector reduction operation where the operation
1697 * {@code (a, b) -> Math.min(a, b)} is applied to lane elements,
1698 * and the identity value is
1699 * {@link Float#POSITIVE_INFINITY}.
1700 *
1701 * @return the minimum lane element of this vector
1702 */
1703 public abstract float minAll();
1704
1705 /**
1706 * Returns the minimum lane element of this vector, selecting lane elements
1707 * controlled by a mask.
1708 * <p>
1709 * This is an associative vector reduction operation where the operation
1710 * {@code (a, b) -> Math.min(a, b)} is applied to lane elements,
1711 * and the identity value is
1712 * {@link Float#POSITIVE_INFINITY}.
1713 *
1714 * @param m the mask controlling lane selection
1715 * @return the minimum lane element of this vector
1716 */
1717 public abstract float minAll(VectorMask<Float> m);
1718
1719 /**
1720 * Returns the maximum lane element of this vector.
1721 * <p>
1722 * This is an associative vector reduction operation where the operation
1723 * {@code (a, b) -> Math.max(a, b)} is applied to lane elements,
1724 * and the identity value is
1725 * {@link Float#NEGATIVE_INFINITY}.
1726 *
1727 * @return the maximum lane element of this vector
1728 */
1729 public abstract float maxAll();
1730
1731 /**
1732 * Returns the maximum lane element of this vector, selecting lane elements
1733 * controlled by a mask.
1734 * <p>
1735 * This is an associative vector reduction operation where the operation
1736 * {@code (a, b) -> Math.max(a, b)} is applied to lane elements,
1737 * and the identity value is
1738 * {@link Float#NEGATIVE_INFINITY}.
1739 *
1740 * @param m the mask controlling lane selection
1741 * @return the maximum lane element of this vector
1742 */
1743 public abstract float maxAll(VectorMask<Float> m);
1744
1745
1746 // Type specific accessors
1747
1748 /**
1749 * Gets the lane element at lane index {@code i}
1750 *
1751 * @param i the lane index
1752 * @return the lane element at lane index {@code i}
1753 * @throws IllegalArgumentException if the index is is out of range
1754 * ({@code < 0 || >= length()})
1755 */
1756 public abstract float get(int i);
1757
1758 /**
1759 * Replaces the lane element of this vector at lane index {@code i} with
1760 * value {@code e}.
1761 * <p>
1762 * This is a cross-lane operation and behaves as if it returns the result
1763 * of blending this vector with an input vector that is the result of
1764 * broadcasting {@code e} and a mask that has only one lane set at lane
1765 * index {@code i}.
1766 *
1767 * @param i the lane index of the lane element to be replaced
1768 * @param e the value to be placed
1769 * @return the result of replacing the lane element of this vector at lane
1770 * index {@code i} with value {@code e}.
1771 * @throws IllegalArgumentException if the index is is out of range
1772 * ({@code < 0 || >= length()})
1773 */
1774 public abstract FloatVector with(int i, float e);
1775
1776 // Type specific extractors
1783 * <pre>{@code
1784 * float[] a = new float[this.length()];
1785 * this.intoArray(a, 0);
1786 * return a;
1787 * }</pre>
1788 *
1789 * @return an array containing the the lane elements of this vector
1790 */
1791 @ForceInline
1792 public final float[] toArray() {
1793 float[] a = new float[species().length()];
1794 intoArray(a, 0);
1795 return a;
1796 }
1797
1798 /**
1799 * Stores this vector into an array starting at offset.
1800 * <p>
1801 * For each vector lane, where {@code N} is the vector lane index,
1802 * the lane element at index {@code N} is stored into the array at index
1803 * {@code i + N}.
1804 *
1805 * @param a the array
1806 * @param i the offset into the array
1807 * @throws IndexOutOfBoundsException if {@code i < 0}, or
1808 * {@code i > a.length - this.length()}
1809 */
1810 public abstract void intoArray(float[] a, int i);
1811
1812 /**
1813 * Stores this vector into an array starting at offset and using a mask.
1814 * <p>
1815 * For each vector lane, where {@code N} is the vector lane index,
1816 * if the mask lane at index {@code N} is set then the lane element at
1817 * index {@code N} is stored into the array index {@code i + N}.
1818 *
1819 * @param a the array
1820 * @param i the offset into the array
1821 * @param m the mask
1822 * @throws IndexOutOfBoundsException if {@code i < 0}, or
1823 * for any vector lane index {@code N} where the mask at lane {@code N}
1824 * is set {@code i >= a.length - N}
1825 */
1826 public abstract void intoArray(float[] a, int i, VectorMask<Float> m);
1827
1828 /**
1829 * Stores this vector into an array using indexes obtained from an index
1830 * map.
1831 * <p>
1832 * For each vector lane, where {@code N} is the vector lane index, the
1833 * lane element at index {@code N} is stored into the array at index
1834 * {@code i + indexMap[j + N]}.
1835 *
1836 * @param a the array
1837 * @param i the offset into the array, may be negative if relative
1838 * indexes in the index map compensate to produce a value within the
1839 * array bounds
1840 * @param indexMap the index map
1841 * @param j the offset into the index map
1842 * @throws IndexOutOfBoundsException if {@code j < 0}, or
1843 * {@code j > indexMap.length - this.length()},
1844 * or for any vector lane index {@code N} the result of
1845 * {@code i + indexMap[j + N]} is {@code < 0} or {@code >= a.length}
1846 */
1847 public abstract void intoArray(float[] a, int i, int[] indexMap, int j);
1848
1849 /**
1850 * Stores this vector into an array using indexes obtained from an index
1851 * map and using a mask.
1852 * <p>
1853 * For each vector lane, where {@code N} is the vector lane index,
1854 * if the mask lane at index {@code N} is set then the lane element at
1855 * index {@code N} is stored into the array at index
1856 * {@code i + indexMap[j + N]}.
1857 *
1858 * @param a the array
1859 * @param i the offset into the array, may be negative if relative
1860 * indexes in the index map compensate to produce a value within the
1861 * array bounds
1862 * @param m the mask
1863 * @param indexMap the index map
1864 * @param j the offset into the index map
1865 * @throws IndexOutOfBoundsException if {@code j < 0}, or
1866 * {@code j > indexMap.length - this.length()},
1867 * or for any vector lane index {@code N} where the mask at lane
1868 * {@code N} is set the result of {@code i + indexMap[j + N]} is
1869 * {@code < 0} or {@code >= a.length}
1870 */
1871 public abstract void intoArray(float[] a, int i, VectorMask<Float> m, int[] indexMap, int j);
1872 // Species
1873
1874 @Override
1875 public abstract VectorSpecies<Float> species();
1876
1877 /**
1878 * Class representing {@link FloatVector}'s of the same {@link VectorShape VectorShape}.
1879 */
1880 static final class FloatSpecies extends AbstractSpecies<Float> {
1881 final Function<float[], FloatVector> vectorFactory;
1882
1883 private FloatSpecies(VectorShape shape,
1884 Class<?> boxType,
1885 Class<?> maskType,
1886 Function<float[], FloatVector> vectorFactory,
1887 Function<boolean[], VectorMask<Float>> maskFactory,
1888 Function<IntUnaryOperator, VectorShuffle<Float>> shuffleFromArrayFactory,
1889 fShuffleFromArray<Float> shuffleFromOpFactory) {
1890 super(shape, float.class, Float.SIZE, boxType, maskType, maskFactory,
1891 shuffleFromArrayFactory, shuffleFromOpFactory);
1892 this.vectorFactory = vectorFactory;
1893 }
|
108 *
109 * @param species species of desired vector
110 * @return a zero vector of given species
111 */
112 @ForceInline
113 @SuppressWarnings("unchecked")
114 public static FloatVector zero(VectorSpecies<Float> species) {
115 return VectorIntrinsics.broadcastCoerced((Class<FloatVector>) species.boxType(), float.class, species.length(),
116 Float.floatToIntBits(0.0f), species,
117 ((bits, s) -> ((FloatSpecies)s).op(i -> Float.intBitsToFloat((int)bits))));
118 }
119
120 /**
121 * Loads a vector from a byte array starting at an offset.
122 * <p>
123 * Bytes are composed into primitive lane elements according to the
124 * native byte order of the underlying platform
125 * <p>
126 * This method behaves as if it returns the result of calling the
127 * byte buffer, offset, and mask accepting
128 * {@link #fromByteBuffer(VectorSpecies, ByteBuffer, int, VectorMask) method} as follows:
129 * <pre>{@code
130 * return fromByteBuffer(species, ByteBuffer.wrap(a), offset, VectorMask.allTrue());
131 * }</pre>
132 *
133 * @param species species of desired vector
134 * @param a the byte array
135 * @param offset the offset into the array
136 * @return a vector loaded from a byte array
137 * @throws IndexOutOfBoundsException if {@code i < 0} or
138 * {@code offset > a.length - (species.length() * species.elementSize() / Byte.SIZE)}
139 */
140 @ForceInline
141 @SuppressWarnings("unchecked")
142 public static FloatVector fromByteArray(VectorSpecies<Float> species, byte[] a, int offset) {
143 Objects.requireNonNull(a);
144 offset = VectorIntrinsics.checkIndex(offset, a.length, species.bitSize() / Byte.SIZE);
145 return VectorIntrinsics.load((Class<FloatVector>) species.boxType(), float.class, species.length(),
146 a, ((long) offset) + Unsafe.ARRAY_BYTE_BASE_OFFSET,
147 a, offset, species,
148 (c, idx, s) -> {
149 ByteBuffer bbc = ByteBuffer.wrap(c, idx, a.length - idx).order(ByteOrder.nativeOrder());
150 FloatBuffer tb = bbc.asFloatBuffer();
151 return ((FloatSpecies)s).op(i -> tb.get());
152 });
153 }
154
155 /**
156 * Loads a vector from a byte array starting at an offset and using a
157 * mask.
158 * <p>
159 * Bytes are composed into primitive lane elements according to the
160 * native byte order of the underlying platform.
161 * <p>
162 * This method behaves as if it returns the result of calling the
163 * byte buffer, offset, and mask accepting
164 * {@link #fromByteBuffer(VectorSpecies, ByteBuffer, int, VectorMask) method} as follows:
165 * <pre>{@code
166 * return fromByteBuffer(species, ByteBuffer.wrap(a), offset, m);
167 * }</pre>
168 *
169 * @param species species of desired vector
170 * @param a the byte array
171 * @param offset the offset into the array
172 * @param m the mask
173 * @return a vector loaded from a byte array
174 * @throws IndexOutOfBoundsException if {@code offset < 0} or
175 * for any vector lane index {@code N} where the mask at lane {@code N}
176 * is set
177 * {@code offset >= a.length - (N * species.elementSize() / Byte.SIZE)}
178 */
179 @ForceInline
180 public static FloatVector fromByteArray(VectorSpecies<Float> species, byte[] a, int offset, VectorMask<Float> m) {
181 return zero(species).blend(fromByteArray(species, a, offset), m);
182 }
183
184 /**
185 * Loads a vector from an array starting at offset.
186 * <p>
187 * For each vector lane, where {@code N} is the vector lane index, the
188 * array element at index {@code offset + N} is placed into the
189 * resulting vector at lane index {@code N}.
190 *
191 * @param species species of desired vector
192 * @param a the array
193 * @param offset the offset into the array
194 * @return the vector loaded from an array
195 * @throws IndexOutOfBoundsException if {@code offset < 0}, or
196 * {@code offset > a.length - species.length()}
197 */
198 @ForceInline
199 @SuppressWarnings("unchecked")
200 public static FloatVector fromArray(VectorSpecies<Float> species, float[] a, int offset){
201 Objects.requireNonNull(a);
202 offset = VectorIntrinsics.checkIndex(offset, a.length, species.length());
203 return VectorIntrinsics.load((Class<FloatVector>) species.boxType(), float.class, species.length(),
204 a, (((long) offset) << ARRAY_SHIFT) + Unsafe.ARRAY_FLOAT_BASE_OFFSET,
205 a, offset, species,
206 (c, idx, s) -> ((FloatSpecies)s).op(n -> c[idx + n]));
207 }
208
209
210 /**
211 * Loads a vector from an array starting at offset and using a mask.
212 * <p>
213 * For each vector lane, where {@code N} is the vector lane index,
214 * if the mask lane at index {@code N} is set then the array element at
215 * index {@code offset + N} is placed into the resulting vector at lane index
216 * {@code N}, otherwise the default element value is placed into the
217 * resulting vector at lane index {@code N}.
218 *
219 * @param species species of desired vector
220 * @param a the array
221 * @param offset the offset into the array
222 * @param m the mask
223 * @return the vector loaded from an array
224 * @throws IndexOutOfBoundsException if {@code offset < 0}, or
225 * for any vector lane index {@code N} where the mask at lane {@code N}
226 * is set {@code offset > a.length - N}
227 */
228 @ForceInline
229 public static FloatVector fromArray(VectorSpecies<Float> species, float[] a, int offset, VectorMask<Float> m) {
230 return zero(species).blend(fromArray(species, a, offset), m);
231 }
232
233 /**
234 * Loads a vector from an array using indexes obtained from an index
235 * map.
236 * <p>
237 * For each vector lane, where {@code N} is the vector lane index, the
238 * array element at index {@code a_offset + indexMap[i_offset + N]} is placed into the
239 * resulting vector at lane index {@code N}.
240 *
241 * @param species species of desired vector
242 * @param a the array
243 * @param a_offset the offset into the array, may be negative if relative
244 * indexes in the index map compensate to produce a value within the
245 * array bounds
246 * @param indexMap the index map
247 * @param i_offset the offset into the index map
248 * @return the vector loaded from an array
249 * @throws IndexOutOfBoundsException if {@code i_offset < 0}, or
250 * {@code i_offset > indexMap.length - species.length()},
251 * or for any vector lane index {@code N} the result of
252 * {@code a_offset + indexMap[i_offset + N]} is {@code < 0} or {@code >= a.length}
253 */
254 @ForceInline
255 @SuppressWarnings("unchecked")
256 public static FloatVector fromArray(VectorSpecies<Float> species, float[] a, int a_offset, int[] indexMap, int i_offset) {
257 Objects.requireNonNull(a);
258 Objects.requireNonNull(indexMap);
259
260
261 // Index vector: vix[0:n] = k -> a_offset + indexMap[i_offset + k]
262 IntVector vix = IntVector.fromArray(IntVector.species(species.indexShape()), indexMap, i_offset).add(a_offset);
263
264 vix = VectorIntrinsics.checkIndex(vix, a.length);
265
266 return VectorIntrinsics.loadWithMap((Class<FloatVector>) species.boxType(), float.class, species.length(),
267 IntVector.species(species.indexShape()).boxType(), a, Unsafe.ARRAY_FLOAT_BASE_OFFSET, vix,
268 a, a_offset, indexMap, i_offset, species,
269 (float[] c, int idx, int[] iMap, int idy, VectorSpecies<Float> s) ->
270 ((FloatSpecies)s).op(n -> c[idx + iMap[idy+n]]));
271 }
272
273 /**
274 * Loads a vector from an array using indexes obtained from an index
275 * map and using a mask.
276 * <p>
277 * For each vector lane, where {@code N} is the vector lane index,
278 * if the mask lane at index {@code N} is set then the array element at
279 * index {@code a_offset + indexMap[i_offset + N]} is placed into the resulting vector
280 * at lane index {@code N}.
281 *
282 * @param species species of desired vector
283 * @param a the array
284 * @param a_offset the offset into the array, may be negative if relative
285 * indexes in the index map compensate to produce a value within the
286 * array bounds
287 * @param m the mask
288 * @param indexMap the index map
289 * @param i_offset the offset into the index map
290 * @return the vector loaded from an array
291 * @throws IndexOutOfBoundsException if {@code i_offset < 0}, or
292 * {@code i_offset > indexMap.length - species.length()},
293 * or for any vector lane index {@code N} where the mask at lane
294 * {@code N} is set the result of {@code a_offset + indexMap[i_offset + N]} is
295 * {@code < 0} or {@code >= a.length}
296 */
297 @ForceInline
298 @SuppressWarnings("unchecked")
299 public static FloatVector fromArray(VectorSpecies<Float> species, float[] a, int a_offset, VectorMask<Float> m, int[] indexMap, int i_offset) {
300 // @@@ This can result in out of bounds errors for unset mask lanes
301 return zero(species).blend(fromArray(species, a, a_offset, indexMap, i_offset), m);
302 }
303
304
305 /**
306 * Loads a vector from a {@link ByteBuffer byte buffer} starting at an
307 * offset into the byte buffer.
308 * <p>
309 * Bytes are composed into primitive lane elements according to the
310 * native byte order of the underlying platform.
311 * <p>
312 * This method behaves as if it returns the result of calling the
313 * byte buffer, offset, and mask accepting
314 * {@link #fromByteBuffer(VectorSpecies, ByteBuffer, int, VectorMask)} method} as follows:
315 * <pre>{@code
316 * return fromByteBuffer(b, offset, VectorMask.allTrue())
317 * }</pre>
318 *
319 * @param species species of desired vector
320 * @param bb the byte buffer
321 * @param offset the offset into the byte buffer
322 * @return a vector loaded from a byte buffer
323 * @throws IndexOutOfBoundsException if the offset is {@code < 0},
324 * or {@code > b.limit()},
325 * or if there are fewer than
326 * {@code species.length() * species.elementSize() / Byte.SIZE} bytes
327 * remaining in the byte buffer from the given offset
328 */
329 @ForceInline
330 @SuppressWarnings("unchecked")
331 public static FloatVector fromByteBuffer(VectorSpecies<Float> species, ByteBuffer bb, int offset) {
332 if (bb.order() != ByteOrder.nativeOrder()) {
333 throw new IllegalArgumentException();
334 }
335 offset = VectorIntrinsics.checkIndex(offset, bb.limit(), species.bitSize() / Byte.SIZE);
336 return VectorIntrinsics.load((Class<FloatVector>) species.boxType(), float.class, species.length(),
337 U.getReference(bb, BYTE_BUFFER_HB), U.getLong(bb, BUFFER_ADDRESS) + offset,
338 bb, offset, species,
339 (c, idx, s) -> {
340 ByteBuffer bbc = c.duplicate().position(idx).order(ByteOrder.nativeOrder());
341 FloatBuffer tb = bbc.asFloatBuffer();
342 return ((FloatSpecies)s).op(i -> tb.get());
343 });
344 }
345
346 /**
347 * Loads a vector from a {@link ByteBuffer byte buffer} starting at an
348 * offset into the byte buffer and using a mask.
349 * <p>
350 * This method behaves as if the byte buffer is viewed as a primitive
351 * {@link java.nio.Buffer buffer} for the primitive element type,
352 * according to the native byte order of the underlying platform, and
353 * the returned vector is loaded with a mask from a primitive array
354 * obtained from the primitive buffer.
355 * The following pseudocode expresses the behaviour, where
356 * {@code EBuffer} is the primitive buffer type, {@code e} is the
357 * primitive element type, and {@code ESpecies} is the primitive
358 * species for {@code e}:
359 * <pre>{@code
360 * EBuffer eb = b.duplicate().
361 * order(ByteOrder.nativeOrder()).position(offset).
362 * asEBuffer();
363 * e[] es = new e[species.length()];
364 * for (int n = 0; n < t.length; n++) {
365 * if (m.isSet(n))
366 * es[n] = eb.get(n);
367 * }
368 * EVector r = EVector.fromArray(es, 0, m);
369 * }</pre>
370 *
371 * @param species species of desired vector
372 * @param bb the byte buffer
373 * @param offset the offset into the byte buffer
374 * @param m the mask
375 * @return a vector loaded from a byte buffer
376 * @throws IndexOutOfBoundsException if the offset is {@code < 0},
377 * or {@code > b.limit()},
378 * for any vector lane index {@code N} where the mask at lane {@code N}
379 * is set
380 * {@code offset >= b.limit() - (N * species.elementSize() / Byte.SIZE)}
381 */
382 @ForceInline
383 public static FloatVector fromByteBuffer(VectorSpecies<Float> species, ByteBuffer bb, int offset, VectorMask<Float> m) {
384 return zero(species).blend(fromByteBuffer(species, bb, offset), m);
385 }
386
387 /**
388 * Returns a vector where all lane elements are set to the primitive
389 * value {@code e}.
390 *
391 * @param species species of the desired vector
392 * @param e the value
393 * @return a vector of vector where all lane elements are set to
394 * the primitive value {@code e}
395 */
396 @ForceInline
397 @SuppressWarnings("unchecked")
398 public static FloatVector broadcast(VectorSpecies<Float> species, float e) {
399 return VectorIntrinsics.broadcastCoerced(
400 (Class<FloatVector>) species.boxType(), float.class, species.length(),
401 Float.floatToIntBits(e), species,
402 ((bits, sp) -> ((FloatSpecies)sp).op(i -> Float.intBitsToFloat((int)bits))));
403 }
404
405 /**
406 * Returns a vector where each lane element is set to given
407 * primitive values.
408 * <p>
409 * For each vector lane, where {@code N} is the vector lane index, the
410 * the primitive value at index {@code N} is placed into the resulting
411 * vector at lane index {@code N}.
412 *
413 * @param species species of the desired vector
414 * @param es the given primitive values
415 * @return a vector where each lane element is set to given primitive
416 * values
417 * @throws IndexOutOfBoundsException if {@code es.length < species.length()}
418 */
419 @ForceInline
420 @SuppressWarnings("unchecked")
421 public static FloatVector scalars(VectorSpecies<Float> species, float... es) {
422 Objects.requireNonNull(es);
423 int ix = VectorIntrinsics.checkIndex(0, es.length, species.length());
424 return VectorIntrinsics.load((Class<FloatVector>) species.boxType(), float.class, species.length(),
425 es, Unsafe.ARRAY_FLOAT_BASE_OFFSET,
426 es, ix, species,
427 (c, idx, sp) -> ((FloatSpecies)sp).op(n -> c[idx + n]));
428 }
429
430 /**
431 * Returns a vector where the first lane element is set to the primtive
432 * value {@code e}, all other lane elements are set to the default
433 * value.
434 *
435 * @param species species of the desired vector
436 * @param e the value
437 * @return a vector where the first lane element is set to the primitive
438 * value {@code e}
439 */
440 @ForceInline
441 public static final FloatVector single(VectorSpecies<Float> species, float e) {
442 return zero(species).with(0, e);
443 }
444
445 /**
446 * Returns a vector where each lane element is set to a randomly
447 * generated primitive value.
448 *
449 * The semantics are equivalent to calling
450 * {@link ThreadLocalRandom#nextFloat()}
451 *
452 * @param species species of the desired vector
453 * @return a vector where each lane elements is set to a randomly
454 * generated primitive value
455 */
456 public static FloatVector random(VectorSpecies<Float> species) {
457 ThreadLocalRandom r = ThreadLocalRandom.current();
458 return ((FloatSpecies)species).op(i -> r.nextFloat());
459 }
460
461 // Ops
462
463 /**
464 * {@inheritDoc}
465 */
466 @Override
467 public abstract FloatVector add(Vector<Float> v);
468
469 /**
470 * Adds this vector to the broadcast of an input scalar.
471 * <p>
472 * This is a lane-wise binary operation which applies the primitive addition operation
473 * ({@code +}) to each lane.
474 *
475 * @param s the input scalar
476 * @return the result of adding this vector to the broadcast of an input
477 * scalar
478 */
479 public abstract FloatVector add(float s);
480
481 /**
482 * {@inheritDoc}
483 */
484 @Override
485 public abstract FloatVector add(Vector<Float> v, VectorMask<Float> m);
486
487 /**
488 * Adds this vector to broadcast of an input scalar,
489 * selecting lane elements controlled by a mask.
490 * <p>
491 * This is a lane-wise binary operation which applies the primitive addition operation
492 * ({@code +}) to each lane.
493 *
494 * @param s the input scalar
495 * @param m the mask controlling lane selection
496 * @return the result of adding this vector to the broadcast of an input
497 * scalar
498 */
499 public abstract FloatVector add(float s, VectorMask<Float> m);
500
501 /**
502 * {@inheritDoc}
503 */
504 @Override
505 public abstract FloatVector sub(Vector<Float> v);
506
507 /**
508 * Subtracts the broadcast of an input scalar from this vector.
509 * <p>
510 * This is a lane-wise binary operation which applies the primitive subtraction
511 * operation ({@code -}) to each lane.
512 *
513 * @param s the input scalar
514 * @return the result of subtracting the broadcast of an input
515 * scalar from this vector
516 */
517 public abstract FloatVector sub(float s);
518
519 /**
520 * {@inheritDoc}
521 */
522 @Override
523 public abstract FloatVector sub(Vector<Float> v, VectorMask<Float> m);
524
525 /**
526 * Subtracts the broadcast of an input scalar from this vector, selecting
527 * lane elements controlled by a mask.
528 * <p>
529 * This is a lane-wise binary operation which applies the primitive subtraction
530 * operation ({@code -}) to each lane.
531 *
532 * @param s the input scalar
533 * @param m the mask controlling lane selection
534 * @return the result of subtracting the broadcast of an input
535 * scalar from this vector
536 */
537 public abstract FloatVector sub(float s, VectorMask<Float> m);
538
539 /**
540 * {@inheritDoc}
541 */
542 @Override
543 public abstract FloatVector mul(Vector<Float> v);
544
545 /**
546 * Multiplies this vector with the broadcast of an input scalar.
547 * <p>
548 * This is a lane-wise binary operation which applies the primitive multiplication
549 * operation ({@code *}) to each lane.
550 *
551 * @param s the input scalar
552 * @return the result of multiplying this vector with the broadcast of an
553 * input scalar
554 */
555 public abstract FloatVector mul(float s);
556
557 /**
558 * {@inheritDoc}
559 */
560 @Override
561 public abstract FloatVector mul(Vector<Float> v, VectorMask<Float> m);
562
563 /**
564 * Multiplies this vector with the broadcast of an input scalar, selecting
565 * lane elements controlled by a mask.
566 * <p>
567 * This is a lane-wise binary operation which applies the primitive multiplication
568 * operation ({@code *}) to each lane.
569 *
570 * @param s the input scalar
571 * @param m the mask controlling lane selection
572 * @return the result of multiplying this vector with the broadcast of an
573 * input scalar
574 */
575 public abstract FloatVector mul(float s, VectorMask<Float> m);
576
577 /**
578 * {@inheritDoc}
579 */
580 @Override
581 public abstract FloatVector neg();
582
583 /**
584 * {@inheritDoc}
585 */
586 @Override
587 public abstract FloatVector neg(VectorMask<Float> m);
588
589 /**
590 * {@inheritDoc}
591 */
592 @Override
593 public abstract FloatVector abs();
594
595 /**
596 * {@inheritDoc}
597 */
598 @Override
599 public abstract FloatVector abs(VectorMask<Float> m);
600
601 /**
602 * {@inheritDoc}
603 */
604 @Override
605 public abstract FloatVector min(Vector<Float> v);
606
607 /**
608 * {@inheritDoc}
609 */
610 @Override
611 public abstract FloatVector min(Vector<Float> v, VectorMask<Float> m);
612
613 /**
614 * Returns the minimum of this vector and the broadcast of an input scalar.
615 * <p>
616 * This is a lane-wise binary operation which applies the operation
617 * {@code (a, b) -> Math.min(a, b)} to each lane.
618 *
619 * @param s the input scalar
620 * @return the minimum of this vector and the broadcast of an input scalar
621 */
622 public abstract FloatVector min(float s);
623
624 /**
625 * {@inheritDoc}
626 */
627 @Override
628 public abstract FloatVector max(Vector<Float> v);
629
630 /**
631 * {@inheritDoc}
632 */
633 @Override
634 public abstract FloatVector max(Vector<Float> v, VectorMask<Float> m);
635
636 /**
637 * Returns the maximum of this vector and the broadcast of an input scalar.
638 * <p>
639 * This is a lane-wise binary operation which applies the operation
640 * {@code (a, b) -> Math.max(a, b)} to each lane.
641 *
642 * @param s the input scalar
643 * @return the maximum of this vector and the broadcast of an input scalar
644 */
645 public abstract FloatVector max(float s);
646
647 /**
648 * {@inheritDoc}
649 */
650 @Override
651 public abstract VectorMask<Float> equal(Vector<Float> v);
652
653 /**
654 * Tests if this vector is equal to the broadcast of an input scalar.
655 * <p>
656 * This is a lane-wise binary test operation which applies the primitive equals
657 * operation ({@code ==}) each lane.
658 *
659 * @param s the input scalar
660 * @return the result mask of testing if this vector is equal to the
661 * broadcast of an input scalar
662 */
663 public abstract VectorMask<Float> equal(float s);
664
665 /**
666 * {@inheritDoc}
667 */
668 @Override
669 public abstract VectorMask<Float> notEqual(Vector<Float> v);
670
671 /**
672 * Tests if this vector is not equal to the broadcast of an input scalar.
673 * <p>
674 * This is a lane-wise binary test operation which applies the primitive not equals
675 * operation ({@code !=}) to each lane.
676 *
677 * @param s the input scalar
678 * @return the result mask of testing if this vector is not equal to the
679 * broadcast of an input scalar
680 */
681 public abstract VectorMask<Float> notEqual(float s);
682
683 /**
684 * {@inheritDoc}
685 */
686 @Override
687 public abstract VectorMask<Float> lessThan(Vector<Float> v);
688
689 /**
690 * Tests if this vector is less than the broadcast of an input scalar.
691 * <p>
692 * This is a lane-wise binary test operation which applies the primitive less than
693 * operation ({@code <}) to each lane.
694 *
695 * @param s the input scalar
696 * @return the mask result of testing if this vector is less than the
697 * broadcast of an input scalar
698 */
699 public abstract VectorMask<Float> lessThan(float s);
700
701 /**
702 * {@inheritDoc}
703 */
704 @Override
705 public abstract VectorMask<Float> lessThanEq(Vector<Float> v);
706
707 /**
708 * Tests if this vector is less or equal to the broadcast of an input scalar.
709 * <p>
710 * This is a lane-wise binary test operation which applies the primitive less than
711 * or equal to operation ({@code <=}) to each lane.
712 *
713 * @param s the input scalar
714 * @return the mask result of testing if this vector is less than or equal
715 * to the broadcast of an input scalar
716 */
717 public abstract VectorMask<Float> lessThanEq(float s);
718
719 /**
720 * {@inheritDoc}
721 */
722 @Override
723 public abstract VectorMask<Float> greaterThan(Vector<Float> v);
724
725 /**
726 * Tests if this vector is greater than the broadcast of an input scalar.
727 * <p>
728 * This is a lane-wise binary test operation which applies the primitive greater than
729 * operation ({@code >}) to each lane.
730 *
731 * @param s the input scalar
732 * @return the mask result of testing if this vector is greater than the
733 * broadcast of an input scalar
734 */
735 public abstract VectorMask<Float> greaterThan(float s);
736
737 /**
738 * {@inheritDoc}
739 */
740 @Override
741 public abstract VectorMask<Float> greaterThanEq(Vector<Float> v);
742
743 /**
744 * Tests if this vector is greater than or equal to the broadcast of an
745 * input scalar.
746 * <p>
747 * This is a lane-wise binary test operation which applies the primitive greater than
748 * or equal to operation ({@code >=}) to each lane.
749 *
750 * @param s the input scalar
751 * @return the mask result of testing if this vector is greater than or
752 * equal to the broadcast of an input scalar
753 */
754 public abstract VectorMask<Float> greaterThanEq(float s);
755
756 /**
757 * {@inheritDoc}
758 */
759 @Override
760 public abstract FloatVector blend(Vector<Float> v, VectorMask<Float> m);
761
762 /**
763 * Blends the lane elements of this vector with those of the broadcast of an
764 * input scalar, selecting lanes controlled by a mask.
765 * <p>
766 * For each lane of the mask, at lane index {@code N}, if the mask lane
767 * is set then the lane element at {@code N} from the input vector is
768 * selected and placed into the resulting vector at {@code N},
769 * otherwise the the lane element at {@code N} from this input vector is
770 * selected and placed into the resulting vector at {@code N}.
771 *
772 * @param s the input scalar
773 * @param m the mask controlling lane selection
774 * @return the result of blending the lane elements of this vector with
775 * those of the broadcast of an input scalar
776 */
777 public abstract FloatVector blend(float s, VectorMask<Float> m);
778
779 /**
780 * {@inheritDoc}
781 */
782 @Override
783 public abstract FloatVector rearrange(Vector<Float> v,
784 VectorShuffle<Float> s, VectorMask<Float> m);
785
786 /**
787 * {@inheritDoc}
788 */
789 @Override
790 public abstract FloatVector rearrange(VectorShuffle<Float> m);
791
792 /**
793 * {@inheritDoc}
794 */
795 @Override
796 public abstract FloatVector reshape(VectorSpecies<Float> s);
797
798 /**
799 * {@inheritDoc}
800 */
801 @Override
802 public abstract FloatVector rotateEL(int i);
803
804 /**
805 * {@inheritDoc}
806 */
807 @Override
808 public abstract FloatVector rotateER(int i);
809
810 /**
811 * {@inheritDoc}
812 */
813 @Override
814 public abstract FloatVector shiftEL(int i);
815
816 /**
817 * {@inheritDoc}
818 */
819 @Override
820 public abstract FloatVector shiftER(int i);
821
822 /**
823 * Divides this vector by an input vector.
824 * <p>
825 * This is a lane-wise binary operation which applies the primitive division
826 * operation ({@code /}) to each lane.
827 *
828 * @param v the input vector
829 * @return the result of dividing this vector by the input vector
830 */
831 public abstract FloatVector div(Vector<Float> v);
832
833 /**
834 * Divides this vector by the broadcast of an input scalar.
835 * <p>
836 * This is a lane-wise binary operation which applies the primitive division
837 * operation ({@code /}) to each lane.
838 *
839 * @param s the input scalar
840 * @return the result of dividing this vector by the broadcast of an input
841 * scalar
842 */
843 public abstract FloatVector div(float s);
844
845 /**
846 * Divides this vector by an input vector, selecting lane elements
847 * controlled by a mask.
848 * <p>
849 * This is a lane-wise binary operation which applies the primitive division
850 * operation ({@code /}) to each lane.
851 *
852 * @param v the input vector
853 * @param m the mask controlling lane selection
854 * @return the result of dividing this vector by the input vector
855 */
856 public abstract FloatVector div(Vector<Float> v, VectorMask<Float> m);
857
858 /**
859 * Divides this vector by the broadcast of an input scalar, selecting lane
860 * elements controlled by a mask.
861 * <p>
862 * This is a lane-wise binary operation which applies the primitive division
863 * operation ({@code /}) to each lane.
864 *
865 * @param s the input scalar
866 * @param m the mask controlling lane selection
867 * @return the result of dividing this vector by the broadcast of an input
868 * scalar
869 */
870 public abstract FloatVector div(float s, VectorMask<Float> m);
871
872 /**
873 * Calculates the square root of this vector.
874 * <p>
875 * This is a lane-wise unary operation which applies the {@link Math#sqrt} operation
876 * to each lane.
877 *
878 * @return the square root of this vector
879 */
880 public abstract FloatVector sqrt();
881
882 /**
883 * Calculates the square root of this vector, selecting lane elements
884 * controlled by a mask.
885 * <p>
886 * This is a lane-wise unary operation which applies the {@link Math#sqrt} operation
887 * to each lane.
888 *
889 * @param m the mask controlling lane selection
890 * @return the square root of this vector
891 */
892 public FloatVector sqrt(VectorMask<Float> m) {
893 return uOp(m, (i, a) -> (float) Math.sqrt((double) a));
894 }
895
896 /**
897 * Calculates the trigonometric tangent of this vector.
898 * <p>
899 * This is a lane-wise unary operation with same semantic definition as
900 * {@link Math#tan} operation applied to each lane.
901 * The implementation is not required to return same
902 * results as {@link Math#tan}, but adheres to rounding, monotonicity,
903 * and special case semantics as defined in the {@link Math#tan}
904 * specifications. The computed result will be within 1 ulp of the
905 * exact result.
906 *
907 * @return the tangent of this vector
908 */
909 public FloatVector tan() {
910 return uOp((i, a) -> (float) Math.tan((double) a));
911 }
912
913 /**
914 * Calculates the trigonometric tangent of this vector, selecting lane
915 * elements controlled by a mask.
916 * <p>
917 * Semantics for rounding, monotonicity, and special cases are
918 * described in {@link FloatVector#tan}
919 *
920 * @param m the mask controlling lane selection
921 * @return the tangent of this vector
922 */
923 public FloatVector tan(VectorMask<Float> m) {
924 return uOp(m, (i, a) -> (float) Math.tan((double) a));
925 }
926
927 /**
928 * Calculates the hyperbolic tangent of this vector.
929 * <p>
930 * This is a lane-wise unary operation with same semantic definition as
931 * {@link Math#tanh} operation applied to each lane.
932 * The implementation is not required to return same
933 * results as {@link Math#tanh}, but adheres to rounding, monotonicity,
934 * and special case semantics as defined in the {@link Math#tanh}
935 * specifications. The computed result will be within 2.5 ulps of the
936 * exact result.
937 *
938 * @return the hyperbolic tangent of this vector
939 */
940 public FloatVector tanh() {
941 return uOp((i, a) -> (float) Math.tanh((double) a));
942 }
943
944 /**
945 * Calculates the hyperbolic tangent of this vector, selecting lane elements
946 * controlled by a mask.
947 * <p>
948 * Semantics for rounding, monotonicity, and special cases are
949 * described in {@link FloatVector#tanh}
950 *
951 * @param m the mask controlling lane selection
952 * @return the hyperbolic tangent of this vector
953 */
954 public FloatVector tanh(VectorMask<Float> m) {
955 return uOp(m, (i, a) -> (float) Math.tanh((double) a));
956 }
957
958 /**
959 * Calculates the trigonometric sine of this vector.
960 * <p>
961 * This is a lane-wise unary operation with same semantic definition as
962 * {@link Math#sin} operation applied to each lane.
963 * The implementation is not required to return same
964 * results as {@link Math#sin}, but adheres to rounding, monotonicity,
965 * and special case semantics as defined in the {@link Math#sin}
966 * specifications. The computed result will be within 1 ulp of the
967 * exact result.
968 *
969 * @return the sine of this vector
970 */
971 public FloatVector sin() {
972 return uOp((i, a) -> (float) Math.sin((double) a));
973 }
974
975 /**
976 * Calculates the trigonometric sine of this vector, selecting lane elements
977 * controlled by a mask.
978 * <p>
979 * Semantics for rounding, monotonicity, and special cases are
980 * described in {@link FloatVector#sin}
981 *
982 * @param m the mask controlling lane selection
983 * @return the sine of this vector
984 */
985 public FloatVector sin(VectorMask<Float> m) {
986 return uOp(m, (i, a) -> (float) Math.sin((double) a));
987 }
988
989 /**
990 * Calculates the hyperbolic sine of this vector.
991 * <p>
992 * This is a lane-wise unary operation with same semantic definition as
993 * {@link Math#sinh} operation applied to each lane.
994 * The implementation is not required to return same
995 * results as {@link Math#sinh}, but adheres to rounding, monotonicity,
996 * and special case semantics as defined in the {@link Math#sinh}
997 * specifications. The computed result will be within 2.5 ulps of the
998 * exact result.
999 *
1000 * @return the hyperbolic sine of this vector
1001 */
1002 public FloatVector sinh() {
1003 return uOp((i, a) -> (float) Math.sinh((double) a));
1004 }
1005
1006 /**
1007 * Calculates the hyperbolic sine of this vector, selecting lane elements
1008 * controlled by a mask.
1009 * <p>
1010 * Semantics for rounding, monotonicity, and special cases are
1011 * described in {@link FloatVector#sinh}
1012 *
1013 * @param m the mask controlling lane selection
1014 * @return the hyperbolic sine of this vector
1015 */
1016 public FloatVector sinh(VectorMask<Float> m) {
1017 return uOp(m, (i, a) -> (float) Math.sinh((double) a));
1018 }
1019
1020 /**
1021 * Calculates the trigonometric cosine of this vector.
1022 * <p>
1023 * This is a lane-wise unary operation with same semantic definition as
1024 * {@link Math#cos} operation applied to each lane.
1025 * The implementation is not required to return same
1026 * results as {@link Math#cos}, but adheres to rounding, monotonicity,
1027 * and special case semantics as defined in the {@link Math#cos}
1028 * specifications. The computed result will be within 1 ulp of the
1029 * exact result.
1030 *
1031 * @return the cosine of this vector
1032 */
1033 public FloatVector cos() {
1034 return uOp((i, a) -> (float) Math.cos((double) a));
1035 }
1036
1037 /**
1038 * Calculates the trigonometric cosine of this vector, selecting lane
1039 * elements controlled by a mask.
1040 * <p>
1041 * Semantics for rounding, monotonicity, and special cases are
1042 * described in {@link FloatVector#cos}
1043 *
1044 * @param m the mask controlling lane selection
1045 * @return the cosine of this vector
1046 */
1047 public FloatVector cos(VectorMask<Float> m) {
1048 return uOp(m, (i, a) -> (float) Math.cos((double) a));
1049 }
1050
1051 /**
1052 * Calculates the hyperbolic cosine of this vector.
1053 * <p>
1054 * This is a lane-wise unary operation with same semantic definition as
1055 * {@link Math#cosh} operation applied to each lane.
1056 * The implementation is not required to return same
1057 * results as {@link Math#cosh}, but adheres to rounding, monotonicity,
1058 * and special case semantics as defined in the {@link Math#cosh}
1059 * specifications. The computed result will be within 2.5 ulps of the
1060 * exact result.
1061 *
1062 * @return the hyperbolic cosine of this vector
1063 */
1064 public FloatVector cosh() {
1065 return uOp((i, a) -> (float) Math.cosh((double) a));
1066 }
1067
1068 /**
1069 * Calculates the hyperbolic cosine of this vector, selecting lane elements
1070 * controlled by a mask.
1071 * <p>
1072 * Semantics for rounding, monotonicity, and special cases are
1073 * described in {@link FloatVector#cosh}
1074 *
1075 * @param m the mask controlling lane selection
1076 * @return the hyperbolic cosine of this vector
1077 */
1078 public FloatVector cosh(VectorMask<Float> m) {
1079 return uOp(m, (i, a) -> (float) Math.cosh((double) a));
1080 }
1081
1082 /**
1083 * Calculates the arc sine of this vector.
1084 * <p>
1085 * This is a lane-wise unary operation with same semantic definition as
1086 * {@link Math#asin} operation applied to each lane.
1087 * The implementation is not required to return same
1088 * results as {@link Math#asin}, but adheres to rounding, monotonicity,
1089 * and special case semantics as defined in the {@link Math#asin}
1090 * specifications. The computed result will be within 1 ulp of the
1091 * exact result.
1092 *
1093 * @return the arc sine of this vector
1094 */
1095 public FloatVector asin() {
1096 return uOp((i, a) -> (float) Math.asin((double) a));
1097 }
1098
1099 /**
1100 * Calculates the arc sine of this vector, selecting lane elements
1101 * controlled by a mask.
1102 * <p>
1103 * Semantics for rounding, monotonicity, and special cases are
1104 * described in {@link FloatVector#asin}
1105 *
1106 * @param m the mask controlling lane selection
1107 * @return the arc sine of this vector
1108 */
1109 public FloatVector asin(VectorMask<Float> m) {
1110 return uOp(m, (i, a) -> (float) Math.asin((double) a));
1111 }
1112
1113 /**
1114 * Calculates the arc cosine of this vector.
1115 * <p>
1116 * This is a lane-wise unary operation with same semantic definition as
1117 * {@link Math#acos} operation applied to each lane.
1118 * The implementation is not required to return same
1119 * results as {@link Math#acos}, but adheres to rounding, monotonicity,
1120 * and special case semantics as defined in the {@link Math#acos}
1121 * specifications. The computed result will be within 1 ulp of the
1122 * exact result.
1123 *
1124 * @return the arc cosine of this vector
1125 */
1126 public FloatVector acos() {
1127 return uOp((i, a) -> (float) Math.acos((double) a));
1128 }
1129
1130 /**
1131 * Calculates the arc cosine of this vector, selecting lane elements
1132 * controlled by a mask.
1133 * <p>
1134 * Semantics for rounding, monotonicity, and special cases are
1135 * described in {@link FloatVector#acos}
1136 *
1137 * @param m the mask controlling lane selection
1138 * @return the arc cosine of this vector
1139 */
1140 public FloatVector acos(VectorMask<Float> m) {
1141 return uOp(m, (i, a) -> (float) Math.acos((double) a));
1142 }
1143
1144 /**
1145 * Calculates the arc tangent of this vector.
1146 * <p>
1147 * This is a lane-wise unary operation with same semantic definition as
1148 * {@link Math#atan} operation applied to each lane.
1149 * The implementation is not required to return same
1150 * results as {@link Math#atan}, but adheres to rounding, monotonicity,
1151 * and special case semantics as defined in the {@link Math#atan}
1152 * specifications. The computed result will be within 1 ulp of the
1153 * exact result.
1154 *
1155 * @return the arc tangent of this vector
1156 */
1157 public FloatVector atan() {
1158 return uOp((i, a) -> (float) Math.atan((double) a));
1159 }
1160
1161 /**
1162 * Calculates the arc tangent of this vector, selecting lane elements
1163 * controlled by a mask.
1164 * <p>
1165 * Semantics for rounding, monotonicity, and special cases are
1166 * described in {@link FloatVector#atan}
1167 *
1168 * @param m the mask controlling lane selection
1169 * @return the arc tangent of this vector
1170 */
1171 public FloatVector atan(VectorMask<Float> m) {
1172 return uOp(m, (i, a) -> (float) Math.atan((double) a));
1173 }
1174
1175 /**
1176 * Calculates the arc tangent of this vector divided by an input vector.
1177 * <p>
1178 * This is a lane-wise binary operation with same semantic definition as
1179 * {@link Math#atan2} operation applied to each lane.
1180 * The implementation is not required to return same
1181 * results as {@link Math#atan2}, but adheres to rounding, monotonicity,
1182 * and special case semantics as defined in the {@link Math#atan2}
1183 * specifications. The computed result will be within 2 ulps of the
1184 * exact result.
1185 *
1186 * @param v the input vector
1187 * @return the arc tangent of this vector divided by the input vector
1188 */
1189 public FloatVector atan2(Vector<Float> v) {
1190 return bOp(v, (i, a, b) -> (float) Math.atan2((double) a, (double) b));
1191 }
1192
1193 /**
1194 * Calculates the arc tangent of this vector divided by the broadcast of an
1195 * an input scalar.
1196 * <p>
1197 * This is a lane-wise binary operation with same semantic definition as
1198 * {@link Math#atan2} operation applied to each lane.
1199 * The implementation is not required to return same
1200 * results as {@link Math#atan2}, but adheres to rounding, monotonicity,
1201 * and special case semantics as defined in the {@link Math#atan2}
1202 * specifications. The computed result will be within 1 ulp of the
1203 * exact result.
1204 *
1205 * @param s the input scalar
1206 * @return the arc tangent of this vector over the input vector
1207 */
1208 public abstract FloatVector atan2(float s);
1209
1210 /**
1211 * Calculates the arc tangent of this vector divided by an input vector,
1212 * selecting lane elements controlled by a mask.
1213 * <p>
1214 * Semantics for rounding, monotonicity, and special cases are
1215 * described in {@link FloatVector#atan2}
1216 *
1217 * @param v the input vector
1218 * @param m the mask controlling lane selection
1221 public FloatVector atan2(Vector<Float> v, VectorMask<Float> m) {
1222 return bOp(v, m, (i, a, b) -> (float) Math.atan2((double) a, (double) b));
1223 }
1224
1225 /**
1226 * Calculates the arc tangent of this vector divided by the broadcast of an
1227 * an input scalar, selecting lane elements controlled by a mask.
1228 * <p>
1229 * Semantics for rounding, monotonicity, and special cases are
1230 * described in {@link FloatVector#atan2}
1231 *
1232 * @param s the input scalar
1233 * @param m the mask controlling lane selection
1234 * @return the arc tangent of this vector over the input vector
1235 */
1236 public abstract FloatVector atan2(float s, VectorMask<Float> m);
1237
1238 /**
1239 * Calculates the cube root of this vector.
1240 * <p>
1241 * This is a lane-wise unary operation with same semantic definition as
1242 * {@link Math#cbrt} operation applied to each lane.
1243 * The implementation is not required to return same
1244 * results as {@link Math#cbrt}, but adheres to rounding, monotonicity,
1245 * and special case semantics as defined in the {@link Math#cbrt}
1246 * specifications. The computed result will be within 1 ulp of the
1247 * exact result.
1248 *
1249 * @return the cube root of this vector
1250 */
1251 public FloatVector cbrt() {
1252 return uOp((i, a) -> (float) Math.cbrt((double) a));
1253 }
1254
1255 /**
1256 * Calculates the cube root of this vector, selecting lane elements
1257 * controlled by a mask.
1258 * <p>
1259 * Semantics for rounding, monotonicity, and special cases are
1260 * described in {@link FloatVector#cbrt}
1261 *
1262 * @param m the mask controlling lane selection
1263 * @return the cube root of this vector
1264 */
1265 public FloatVector cbrt(VectorMask<Float> m) {
1266 return uOp(m, (i, a) -> (float) Math.cbrt((double) a));
1267 }
1268
1269 /**
1270 * Calculates the natural logarithm of this vector.
1271 * <p>
1272 * This is a lane-wise unary operation with same semantic definition as
1273 * {@link Math#log} operation applied to each lane.
1274 * The implementation is not required to return same
1275 * results as {@link Math#log}, but adheres to rounding, monotonicity,
1276 * and special case semantics as defined in the {@link Math#log}
1277 * specifications. The computed result will be within 1 ulp of the
1278 * exact result.
1279 *
1280 * @return the natural logarithm of this vector
1281 */
1282 public FloatVector log() {
1283 return uOp((i, a) -> (float) Math.log((double) a));
1284 }
1285
1286 /**
1287 * Calculates the natural logarithm of this vector, selecting lane elements
1288 * controlled by a mask.
1289 * <p>
1290 * Semantics for rounding, monotonicity, and special cases are
1291 * described in {@link FloatVector#log}
1292 *
1293 * @param m the mask controlling lane selection
1294 * @return the natural logarithm of this vector
1295 */
1296 public FloatVector log(VectorMask<Float> m) {
1297 return uOp(m, (i, a) -> (float) Math.log((double) a));
1298 }
1299
1300 /**
1301 * Calculates the base 10 logarithm of this vector.
1302 * <p>
1303 * This is a lane-wise unary operation with same semantic definition as
1304 * {@link Math#log10} operation applied to each lane.
1305 * The implementation is not required to return same
1306 * results as {@link Math#log10}, but adheres to rounding, monotonicity,
1307 * and special case semantics as defined in the {@link Math#log10}
1308 * specifications. The computed result will be within 1 ulp of the
1309 * exact result.
1310 *
1311 * @return the base 10 logarithm of this vector
1312 */
1313 public FloatVector log10() {
1314 return uOp((i, a) -> (float) Math.log10((double) a));
1315 }
1316
1317 /**
1318 * Calculates the base 10 logarithm of this vector, selecting lane elements
1319 * controlled by a mask.
1320 * <p>
1321 * Semantics for rounding, monotonicity, and special cases are
1322 * described in {@link FloatVector#log10}
1323 *
1324 * @param m the mask controlling lane selection
1325 * @return the base 10 logarithm of this vector
1326 */
1327 public FloatVector log10(VectorMask<Float> m) {
1328 return uOp(m, (i, a) -> (float) Math.log10((double) a));
1329 }
1330
1331 /**
1332 * Calculates the natural logarithm of the sum of this vector and the
1333 * broadcast of {@code 1}.
1334 * <p>
1335 * This is a lane-wise unary operation with same semantic definition as
1336 * {@link Math#log1p} operation applied to each lane.
1337 * The implementation is not required to return same
1338 * results as {@link Math#log1p}, but adheres to rounding, monotonicity,
1339 * and special case semantics as defined in the {@link Math#log1p}
1340 * specifications. The computed result will be within 1 ulp of the
1341 * exact result.
1342 *
1343 * @return the natural logarithm of the sum of this vector and the broadcast
1344 * of {@code 1}
1345 */
1346 public FloatVector log1p() {
1347 return uOp((i, a) -> (float) Math.log1p((double) a));
1348 }
1349
1350 /**
1351 * Calculates the natural logarithm of the sum of this vector and the
1352 * broadcast of {@code 1}, selecting lane elements controlled by a mask.
1353 * <p>
1354 * Semantics for rounding, monotonicity, and special cases are
1355 * described in {@link FloatVector#log1p}
1356 *
1357 * @param m the mask controlling lane selection
1358 * @return the natural logarithm of the sum of this vector and the broadcast
1359 * of {@code 1}
1360 */
1361 public FloatVector log1p(VectorMask<Float> m) {
1362 return uOp(m, (i, a) -> (float) Math.log1p((double) a));
1363 }
1364
1365 /**
1366 * Calculates this vector raised to the power of an input vector.
1367 * <p>
1368 * This is a lane-wise binary operation with same semantic definition as
1369 * {@link Math#pow} operation applied to each lane.
1370 * The implementation is not required to return same
1371 * results as {@link Math#pow}, but adheres to rounding, monotonicity,
1372 * and special case semantics as defined in the {@link Math#pow}
1373 * specifications. The computed result will be within 1 ulp of the
1374 * exact result.
1375 *
1376 * @param v the input vector
1377 * @return this vector raised to the power of an input vector
1378 */
1379 public FloatVector pow(Vector<Float> v) {
1380 return bOp(v, (i, a, b) -> (float) Math.pow((double) a, (double) b));
1381 }
1382
1383 /**
1384 * Calculates this vector raised to the power of the broadcast of an input
1385 * scalar.
1386 * <p>
1387 * This is a lane-wise binary operation with same semantic definition as
1388 * {@link Math#pow} operation applied to each lane.
1389 * The implementation is not required to return same
1390 * results as {@link Math#pow}, but adheres to rounding, monotonicity,
1391 * and special case semantics as defined in the {@link Math#pow}
1392 * specifications. The computed result will be within 1 ulp of the
1393 * exact result.
1394 *
1395 * @param s the input scalar
1396 * @return this vector raised to the power of the broadcast of an input
1397 * scalar.
1398 */
1399 public abstract FloatVector pow(float s);
1400
1401 /**
1402 * Calculates this vector raised to the power of an input vector, selecting
1403 * lane elements controlled by a mask.
1404 * <p>
1405 * Semantics for rounding, monotonicity, and special cases are
1406 * described in {@link FloatVector#pow}
1407 *
1408 * @param v the input vector
1414 }
1415
1416 /**
1417 * Calculates this vector raised to the power of the broadcast of an input
1418 * scalar, selecting lane elements controlled by a mask.
1419 * <p>
1420 * Semantics for rounding, monotonicity, and special cases are
1421 * described in {@link FloatVector#pow}
1422 *
1423 * @param s the input scalar
1424 * @param m the mask controlling lane selection
1425 * @return this vector raised to the power of the broadcast of an input
1426 * scalar.
1427 */
1428 public abstract FloatVector pow(float s, VectorMask<Float> m);
1429
1430 /**
1431 * Calculates the broadcast of Euler's number {@code e} raised to the power
1432 * of this vector.
1433 * <p>
1434 * This is a lane-wise unary operation with same semantic definition as
1435 * {@link Math#exp} operation applied to each lane.
1436 * The implementation is not required to return same
1437 * results as {@link Math#exp}, but adheres to rounding, monotonicity,
1438 * and special case semantics as defined in the {@link Math#exp}
1439 * specifications. The computed result will be within 1 ulp of the
1440 * exact result.
1441 *
1442 * @return the broadcast of Euler's number {@code e} raised to the power of
1443 * this vector
1444 */
1445 public FloatVector exp() {
1446 return uOp((i, a) -> (float) Math.exp((double) a));
1447 }
1448
1449 /**
1450 * Calculates the broadcast of Euler's number {@code e} raised to the power
1451 * of this vector, selecting lane elements controlled by a mask.
1452 * <p>
1453 * Semantics for rounding, monotonicity, and special cases are
1454 * described in {@link FloatVector#exp}
1455 *
1456 * @param m the mask controlling lane selection
1457 * @return the broadcast of Euler's number {@code e} raised to the power of
1458 * this vector
1459 */
1460 public FloatVector exp(VectorMask<Float> m) {
1461 return uOp(m, (i, a) -> (float) Math.exp((double) a));
1462 }
1463
1464 /**
1465 * Calculates the broadcast of Euler's number {@code e} raised to the power
1466 * of this vector minus the broadcast of {@code -1}.
1467 * More specifically as if the following (ignoring any differences in
1468 * numerical accuracy):
1469 * <pre>{@code
1470 * this.exp().sub(EVector.broadcast(this.species(), 1))
1471 * }</pre>
1472 * <p>
1473 * This is a lane-wise unary operation with same semantic definition as
1474 * {@link Math#expm1} operation applied to each lane.
1475 * The implementation is not required to return same
1476 * results as {@link Math#expm1}, but adheres to rounding, monotonicity,
1477 * and special case semantics as defined in the {@link Math#expm1}
1478 * specifications. The computed result will be within 1 ulp of the
1479 * exact result.
1480 *
1481 * @return the broadcast of Euler's number {@code e} raised to the power of
1482 * this vector minus the broadcast of {@code -1}
1483 */
1484 public FloatVector expm1() {
1485 return uOp((i, a) -> (float) Math.expm1((double) a));
1486 }
1487
1488 /**
1489 * Calculates the broadcast of Euler's number {@code e} raised to the power
1490 * of this vector minus the broadcast of {@code -1}, selecting lane elements
1491 * controlled by a mask
1492 * More specifically as if the following (ignoring any differences in
1493 * numerical accuracy):
1494 * <pre>{@code
1495 * this.exp(m).sub(EVector.broadcast(this.species(), 1), m)
1496 * }</pre>
1497 * <p>
1498 * Semantics for rounding, monotonicity, and special cases are
1499 * described in {@link FloatVector#expm1}
1500 *
1501 * @param m the mask controlling lane selection
1502 * @return the broadcast of Euler's number {@code e} raised to the power of
1503 * this vector minus the broadcast of {@code -1}
1504 */
1505 public FloatVector expm1(VectorMask<Float> m) {
1506 return uOp(m, (i, a) -> (float) Math.expm1((double) a));
1507 }
1508
1509 /**
1510 * Calculates the product of this vector and a first input vector summed
1511 * with a second input vector.
1512 * More specifically as if the following (ignoring any differences in
1513 * numerical accuracy):
1514 * <pre>{@code
1515 * this.mul(v1).add(v2)
1516 * }</pre>
1517 * <p>
1518 * This is a lane-wise ternary operation which applies the {@link Math#fma} operation
1519 * to each lane.
1520 *
1521 * @param v1 the first input vector
1522 * @param v2 the second input vector
1523 * @return the product of this vector and the first input vector summed with
1524 * the second input vector
1525 */
1526 public abstract FloatVector fma(Vector<Float> v1, Vector<Float> v2);
1527
1528 /**
1529 * Calculates the product of this vector and the broadcast of a first input
1530 * scalar summed with the broadcast of a second input scalar.
1531 * More specifically as if the following:
1532 * <pre>{@code
1533 * this.fma(EVector.broadcast(this.species(), s1), EVector.broadcast(this.species(), s2))
1534 * }</pre>
1535 * <p>
1536 * This is a lane-wise ternary operation which applies the {@link Math#fma} operation
1537 * to each lane.
1538 *
1539 * @param s1 the first input scalar
1540 * @param s2 the second input scalar
1541 * @return the product of this vector and the broadcast of a first input
1542 * scalar summed with the broadcast of a second input scalar
1543 */
1544 public abstract FloatVector fma(float s1, float s2);
1545
1546 /**
1547 * Calculates the product of this vector and a first input vector summed
1548 * with a second input vector, selecting lane elements controlled by a mask.
1549 * More specifically as if the following (ignoring any differences in
1550 * numerical accuracy):
1551 * <pre>{@code
1552 * this.mul(v1, m).add(v2, m)
1553 * }</pre>
1554 * <p>
1555 * This is a lane-wise ternary operation which applies the {@link Math#fma} operation
1556 * to each lane.
1557 *
1558 * @param v1 the first input vector
1559 * @param v2 the second input vector
1560 * @param m the mask controlling lane selection
1561 * @return the product of this vector and the first input vector summed with
1562 * the second input vector
1563 */
1564 public FloatVector fma(Vector<Float> v1, Vector<Float> v2, VectorMask<Float> m) {
1565 return tOp(v1, v2, m, (i, a, b, c) -> Math.fma(a, b, c));
1566 }
1567
1568 /**
1569 * Calculates the product of this vector and the broadcast of a first input
1570 * scalar summed with the broadcast of a second input scalar, selecting lane
1571 * elements controlled by a mask
1572 * More specifically as if the following:
1573 * <pre>{@code
1574 * this.fma(EVector.broadcast(this.species(), s1), EVector.broadcast(this.species(), s2), m)
1575 * }</pre>
1576 * <p>
1577 * This is a lane-wise ternary operation which applies the {@link Math#fma} operation
1578 * to each lane.
1579 *
1580 * @param s1 the first input scalar
1581 * @param s2 the second input scalar
1582 * @param m the mask controlling lane selection
1583 * @return the product of this vector and the broadcast of a first input
1584 * scalar summed with the broadcast of a second input scalar
1585 */
1586 public abstract FloatVector fma(float s1, float s2, VectorMask<Float> m);
1587
1588 /**
1589 * Calculates square root of the sum of the squares of this vector and an
1590 * input vector.
1591 * More specifically as if the following (ignoring any differences in
1592 * numerical accuracy):
1593 * <pre>{@code
1594 * this.mul(this).add(v.mul(v)).sqrt()
1595 * }</pre>
1596 * <p>
1597 * This is a lane-wise binary operation with same semantic definition as
1598 * {@link Math#hypot} operation applied to each lane.
1599 * The implementation is not required to return same
1600 * results as {@link Math#hypot}, but adheres to rounding, monotonicity,
1601 * and special case semantics as defined in the {@link Math#hypot}
1602 * specifications. The computed result will be within 1 ulp of the
1603 * exact result.
1604 *
1605 * @param v the input vector
1606 * @return square root of the sum of the squares of this vector and an input
1607 * vector
1608 */
1609 public FloatVector hypot(Vector<Float> v) {
1610 return bOp(v, (i, a, b) -> (float) Math.hypot((double) a, (double) b));
1611 }
1612
1613 /**
1614 * Calculates square root of the sum of the squares of this vector and the
1615 * broadcast of an input scalar.
1616 * More specifically as if the following (ignoring any differences in
1617 * numerical accuracy):
1618 * <pre>{@code
1619 * this.mul(this).add(EVector.broadcast(this.species(), s * s)).sqrt()
1620 * }</pre>
1621 * <p>
1622 * This is a lane-wise binary operation with same semantic definition as
1623 * {@link Math#hypot} operation applied to each.
1624 * The implementation is not required to return same
1625 * results as {@link Math#hypot}, but adheres to rounding, monotonicity,
1626 * and special case semantics as defined in the {@link Math#hypot}
1627 * specifications. The computed result will be within 1 ulp of the
1628 * exact result.
1629 *
1630 * @param s the input scalar
1631 * @return square root of the sum of the squares of this vector and the
1632 * broadcast of an input scalar
1633 */
1634 public abstract FloatVector hypot(float s);
1635
1636 /**
1637 * Calculates square root of the sum of the squares of this vector and an
1638 * input vector, selecting lane elements controlled by a mask.
1639 * More specifically as if the following (ignoring any differences in
1640 * numerical accuracy):
1641 * <pre>{@code
1642 * this.mul(this, m).add(v.mul(v), m).sqrt(m)
1643 * }</pre>
1644 * <p>
1645 * Semantics for rounding, monotonicity, and special cases are
1646 * described in {@link FloatVector#hypot}
1647 *
1648 * @param v the input vector
1649 * @param m the mask controlling lane selection
1650 * @return square root of the sum of the squares of this vector and an input
1651 * vector
1652 */
1653 public FloatVector hypot(Vector<Float> v, VectorMask<Float> m) {
1654 return bOp(v, m, (i, a, b) -> (float) Math.hypot((double) a, (double) b));
1655 }
1656
1657 /**
1658 * Calculates square root of the sum of the squares of this vector and the
1659 * broadcast of an input scalar, selecting lane elements controlled by a
1660 * mask.
1661 * More specifically as if the following (ignoring any differences in
1662 * numerical accuracy):
1663 * <pre>{@code
1664 * this.mul(this, m).add(EVector.broadcast(this.species(), s * s), m).sqrt(m)
1665 * }</pre>
1666 * <p>
1667 * Semantics for rounding, monotonicity, and special cases are
1668 * described in {@link FloatVector#hypot}
1669 *
1670 * @param s the input scalar
1671 * @param m the mask controlling lane selection
1672 * @return square root of the sum of the squares of this vector and the
1673 * broadcast of an input scalar
1674 */
1675 public abstract FloatVector hypot(float s, VectorMask<Float> m);
1676
1677
1678 /**
1679 * {@inheritDoc}
1680 */
1681 @Override
1682 public abstract void intoByteArray(byte[] a, int ix);
1683
1684 /**
1685 * {@inheritDoc}
1686 */
1687 @Override
1688 public abstract void intoByteArray(byte[] a, int ix, VectorMask<Float> m);
1689
1690 /**
1691 * {@inheritDoc}
1692 */
1693 @Override
1694 public abstract void intoByteBuffer(ByteBuffer bb, int ix);
1695
1696 /**
1697 * {@inheritDoc}
1698 */
1699 @Override
1700 public abstract void intoByteBuffer(ByteBuffer bb, int ix, VectorMask<Float> m);
1701
1702
1703 // Type specific horizontal reductions
1704 /**
1705 * Adds all lane elements of this vector.
1706 * <p>
1707 * This is a cross-lane reduction operation which applies the addition
1708 * operation ({@code +}) to lane elements,
1709 * and the identity value is {@code 0.0}.
1710 *
1711 * <p>The value of a floating-point sum is a function both of the input values as well
1712 * as the order of addition operations. The order of addition operations of this method
1713 * is intentionally not defined to allow for JVM to generate optimal machine
1714 * code for the underlying platform at runtime. If the platform supports a vector
1715 * instruction to add all values in the vector, or if there is some other efficient machine
1716 * code sequence, then the JVM has the option of generating this machine code. Otherwise,
1717 * the default implementation of adding vectors sequentially from left to right is used.
1718 * For this reason, the output of this method may vary for the same input values.
1719 *
1720 * @return the addition of all the lane elements of this vector
1721 */
1722 public abstract float addAll();
1723
1724 /**
1725 * Adds all lane elements of this vector, selecting lane elements
1726 * controlled by a mask.
1727 * <p>
1728 * This is a cross-lane reduction operation which applies the addition
1729 * operation ({@code +}) to lane elements,
1730 * and the identity value is {@code 0.0}.
1731 *
1732 * <p>The value of a floating-point sum is a function both of the input values as well
1733 * as the order of addition operations. The order of addition operations of this method
1734 * is intentionally not defined to allow for JVM to generate optimal machine
1735 * code for the underlying platform at runtime. If the platform supports a vector
1736 * instruction to add all values in the vector, or if there is some other efficient machine
1737 * code sequence, then the JVM has the option of generating this machine code. Otherwise,
1738 * the default implementation of adding vectors sequentially from left to right is used.
1739 * For this reason, the output of this method may vary on the same input values.
1740 *
1741 * @param m the mask controlling lane selection
1742 * @return the addition of the selected lane elements of this vector
1743 */
1744 public abstract float addAll(VectorMask<Float> m);
1745
1746 /**
1747 * Multiplies all lane elements of this vector.
1748 * <p>
1749 * This is a cross-lane reduction operation which applies the
1750 * multiplication operation ({@code *}) to lane elements,
1751 * and the identity value is {@code 1.0}.
1752 *
1753 * <p>The order of multiplication operations of this method
1754 * is intentionally not defined to allow for JVM to generate optimal machine
1755 * code for the underlying platform at runtime. If the platform supports a vector
1756 * instruction to multiply all values in the vector, or if there is some other efficient machine
1757 * code sequence, then the JVM has the option of generating this machine code. Otherwise,
1758 * the default implementation of multiplying vectors sequentially from left to right is used.
1759 * For this reason, the output of this method may vary on the same input values.
1760 *
1761 * @return the multiplication of all the lane elements of this vector
1762 */
1763 public abstract float mulAll();
1764
1765 /**
1766 * Multiplies all lane elements of this vector, selecting lane elements
1767 * controlled by a mask.
1768 * <p>
1769 * This is a cross-lane reduction operation which applies the
1770 * multiplication operation ({@code *}) to lane elements,
1771 * and the identity value is {@code 1.0}.
1772 *
1773 * <p>The order of multiplication operations of this method
1774 * is intentionally not defined to allow for JVM to generate optimal machine
1775 * code for the underlying platform at runtime. If the platform supports a vector
1776 * instruction to multiply all values in the vector, or if there is some other efficient machine
1777 * code sequence, then the JVM has the option of generating this machine code. Otherwise,
1778 * the default implementation of multiplying vectors sequentially from left to right is used.
1779 * For this reason, the output of this method may vary on the same input values.
1780 *
1781 * @param m the mask controlling lane selection
1782 * @return the multiplication of all the lane elements of this vector
1783 */
1784 public abstract float mulAll(VectorMask<Float> m);
1785
1786 /**
1787 * Returns the minimum lane element of this vector.
1788 * <p>
1789 * This is an associative cross-lane reduction operation which applies the operation
1790 * {@code (a, b) -> Math.min(a, b)} to lane elements,
1791 * and the identity value is
1792 * {@link Float#POSITIVE_INFINITY}.
1793 *
1794 * @return the minimum lane element of this vector
1795 */
1796 public abstract float minAll();
1797
1798 /**
1799 * Returns the minimum lane element of this vector, selecting lane elements
1800 * controlled by a mask.
1801 * <p>
1802 * This is an associative cross-lane reduction operation which applies the operation
1803 * {@code (a, b) -> Math.min(a, b)} to lane elements,
1804 * and the identity value is
1805 * {@link Float#POSITIVE_INFINITY}.
1806 *
1807 * @param m the mask controlling lane selection
1808 * @return the minimum lane element of this vector
1809 */
1810 public abstract float minAll(VectorMask<Float> m);
1811
1812 /**
1813 * Returns the maximum lane element of this vector.
1814 * <p>
1815 * This is an associative cross-lane reduction operation which applies the operation
1816 * {@code (a, b) -> Math.max(a, b)} to lane elements,
1817 * and the identity value is
1818 * {@link Float#NEGATIVE_INFINITY}.
1819 *
1820 * @return the maximum lane element of this vector
1821 */
1822 public abstract float maxAll();
1823
1824 /**
1825 * Returns the maximum lane element of this vector, selecting lane elements
1826 * controlled by a mask.
1827 * <p>
1828 * This is an associative cross-lane reduction operation which applies the operation
1829 * {@code (a, b) -> Math.max(a, b)} to lane elements,
1830 * and the identity value is
1831 * {@link Float#NEGATIVE_INFINITY}.
1832 *
1833 * @param m the mask controlling lane selection
1834 * @return the maximum lane element of this vector
1835 */
1836 public abstract float maxAll(VectorMask<Float> m);
1837
1838
1839 // Type specific accessors
1840
1841 /**
1842 * Gets the lane element at lane index {@code i}
1843 *
1844 * @param i the lane index
1845 * @return the lane element at lane index {@code i}
1846 * @throws IllegalArgumentException if the index is is out of range
1847 * ({@code < 0 || >= length()})
1848 */
1849 public abstract float lane(int i);
1850
1851 /**
1852 * Replaces the lane element of this vector at lane index {@code i} with
1853 * value {@code e}.
1854 * <p>
1855 * This is a cross-lane operation and behaves as if it returns the result
1856 * of blending this vector with an input vector that is the result of
1857 * broadcasting {@code e} and a mask that has only one lane set at lane
1858 * index {@code i}.
1859 *
1860 * @param i the lane index of the lane element to be replaced
1861 * @param e the value to be placed
1862 * @return the result of replacing the lane element of this vector at lane
1863 * index {@code i} with value {@code e}.
1864 * @throws IllegalArgumentException if the index is is out of range
1865 * ({@code < 0 || >= length()})
1866 */
1867 public abstract FloatVector with(int i, float e);
1868
1869 // Type specific extractors
1876 * <pre>{@code
1877 * float[] a = new float[this.length()];
1878 * this.intoArray(a, 0);
1879 * return a;
1880 * }</pre>
1881 *
1882 * @return an array containing the the lane elements of this vector
1883 */
1884 @ForceInline
1885 public final float[] toArray() {
1886 float[] a = new float[species().length()];
1887 intoArray(a, 0);
1888 return a;
1889 }
1890
1891 /**
1892 * Stores this vector into an array starting at offset.
1893 * <p>
1894 * For each vector lane, where {@code N} is the vector lane index,
1895 * the lane element at index {@code N} is stored into the array at index
1896 * {@code offset + N}.
1897 *
1898 * @param a the array
1899 * @param offset the offset into the array
1900 * @throws IndexOutOfBoundsException if {@code offset < 0}, or
1901 * {@code offset > a.length - this.length()}
1902 */
1903 public abstract void intoArray(float[] a, int offset);
1904
1905 /**
1906 * Stores this vector into an array starting at offset and using a mask.
1907 * <p>
1908 * For each vector lane, where {@code N} is the vector lane index,
1909 * if the mask lane at index {@code N} is set then the lane element at
1910 * index {@code N} is stored into the array index {@code offset + N}.
1911 *
1912 * @param a the array
1913 * @param offset the offset into the array
1914 * @param m the mask
1915 * @throws IndexOutOfBoundsException if {@code offset < 0}, or
1916 * for any vector lane index {@code N} where the mask at lane {@code N}
1917 * is set {@code offset >= a.length - N}
1918 */
1919 public abstract void intoArray(float[] a, int offset, VectorMask<Float> m);
1920
1921 /**
1922 * Stores this vector into an array using indexes obtained from an index
1923 * map.
1924 * <p>
1925 * For each vector lane, where {@code N} is the vector lane index, the
1926 * lane element at index {@code N} is stored into the array at index
1927 * {@code a_offset + indexMap[i_offset + N]}.
1928 *
1929 * @param a the array
1930 * @param a_offset the offset into the array, may be negative if relative
1931 * indexes in the index map compensate to produce a value within the
1932 * array bounds
1933 * @param indexMap the index map
1934 * @param i_offset the offset into the index map
1935 * @throws IndexOutOfBoundsException if {@code i_offset < 0}, or
1936 * {@code i_offset > indexMap.length - this.length()},
1937 * or for any vector lane index {@code N} the result of
1938 * {@code a_offset + indexMap[i_offset + N]} is {@code < 0} or {@code >= a.length}
1939 */
1940 public abstract void intoArray(float[] a, int a_offset, int[] indexMap, int i_offset);
1941
1942 /**
1943 * Stores this vector into an array using indexes obtained from an index
1944 * map and using a mask.
1945 * <p>
1946 * For each vector lane, where {@code N} is the vector lane index,
1947 * if the mask lane at index {@code N} is set then the lane element at
1948 * index {@code N} is stored into the array at index
1949 * {@code a_offset + indexMap[i_offset + N]}.
1950 *
1951 * @param a the array
1952 * @param a_offset the offset into the array, may be negative if relative
1953 * indexes in the index map compensate to produce a value within the
1954 * array bounds
1955 * @param m the mask
1956 * @param indexMap the index map
1957 * @param i_offset the offset into the index map
1958 * @throws IndexOutOfBoundsException if {@code j < 0}, or
1959 * {@code i_offset > indexMap.length - this.length()},
1960 * or for any vector lane index {@code N} where the mask at lane
1961 * {@code N} is set the result of {@code a_offset + indexMap[i_offset + N]} is
1962 * {@code < 0} or {@code >= a.length}
1963 */
1964 public abstract void intoArray(float[] a, int a_offset, VectorMask<Float> m, int[] indexMap, int i_offset);
1965 // Species
1966
1967 /**
1968 * {@inheritDoc}
1969 */
1970 @Override
1971 public abstract VectorSpecies<Float> species();
1972
1973 /**
1974 * Class representing {@link FloatVector}'s of the same {@link VectorShape VectorShape}.
1975 */
1976 static final class FloatSpecies extends AbstractSpecies<Float> {
1977 final Function<float[], FloatVector> vectorFactory;
1978
1979 private FloatSpecies(VectorShape shape,
1980 Class<?> boxType,
1981 Class<?> maskType,
1982 Function<float[], FloatVector> vectorFactory,
1983 Function<boolean[], VectorMask<Float>> maskFactory,
1984 Function<IntUnaryOperator, VectorShuffle<Float>> shuffleFromArrayFactory,
1985 fShuffleFromArray<Float> shuffleFromOpFactory) {
1986 super(shape, float.class, Float.SIZE, boxType, maskType, maskFactory,
1987 shuffleFromArrayFactory, shuffleFromOpFactory);
1988 this.vectorFactory = vectorFactory;
1989 }
|