44 using SharedTraitsForSortingNetwork =
50 const Base* base =
static_cast<const Base*
>(
this);
51 Vec<D> swapped = base->SwapAdjacentPairs(
d, v);
52 base->Sort2(
d, v, swapped);
53 return base->OddEvenPairs(
d, swapped, v);
59 const Base* base =
static_cast<const Base*
>(
this);
60 Vec<D> swapped = base->ReverseKeys8(
d, v);
61 base->Sort2(
d, v, swapped);
62 return base->OddEvenQuads(
d, swapped, v);
68 const Base* base =
static_cast<const Base*
>(
this);
70 Vec<D> swapped = base->ReverseKeys(
d, v);
71 base->Sort2(
d, v, swapped);
81template <
class D,
class Traits,
class V = Vec<D>>
82HWY_INLINE void Sort2(D
d, Traits st, V& v0, V& v1) {
86template <
class D,
class Traits,
class V = Vec<D>>
87HWY_INLINE void Sort4(D
d, Traits st, V& v0, V& v1, V& v2, V& v3) {
95template <
class D,
class Traits,
class V = Vec<D>>
96HWY_INLINE void Sort8(D
d, Traits st, V& v0, V& v1, V& v2, V& v3, V& v4, V& v5,
125template <
class D,
class Traits,
class V = Vec<D>>
126HWY_INLINE void Sort16(D
d, Traits st, V& v0, V& v1, V& v2, V& v3, V& v4, V& v5,
127 V& v6, V& v7, V& v8, V& v9, V& va, V& vb, V& vc, V& vd,
201template <
size_t kKeysPerVector,
class D,
class Traits,
class V,
203HWY_INLINE void Merge8x2(D, Traits, V, V, V, V, V, V, V, V) {}
204template <
size_t kKeysPerVector,
class D,
class Traits,
class V,
206HWY_INLINE void Merge8x4(D, Traits, V, V, V, V, V, V, V, V) {}
208template <
size_t kKeysPerVector,
class D,
class Traits,
class V,
210HWY_INLINE void Merge16x2(D, Traits, V, V, V, V, V, V, V, V, V, V, V, V, V, V,
212template <
size_t kKeysPerVector,
class D,
class Traits,
class V,
214HWY_INLINE void Merge16x4(D, Traits, V, V, V, V, V, V, V, V, V, V, V, V, V, V,
216template <
size_t kKeysPerVector,
class D,
class Traits,
class V,
218HWY_INLINE void Merge16x8(D, Traits, V, V, V, V, V, V, V, V, V, V, V, V, V, V,
220template <
size_t kKeysPerVector,
class D,
class Traits,
class V,
222HWY_INLINE void Merge16x16(D, Traits, V, V, V, V, V, V, V, V, V, V, V, V, V, V,
225template <
size_t kKeysPerVector,
class D,
class Traits,
class V = Vec<D>,
226 HWY_IF_LANES_GT(kKeysPerVector, 1)>
227HWY_INLINE void Merge8x2(D
d, Traits st, V& v0, V& v1, V& v2, V& v3, V& v4,
228 V& v5, V& v6, V& v7) {
229 v7 = st.ReverseKeys2(
d, v7);
230 v6 = st.ReverseKeys2(
d, v6);
231 v5 = st.ReverseKeys2(
d, v5);
232 v4 = st.ReverseKeys2(
d, v4);
238 v3 = st.ReverseKeys2(
d, v3);
239 v2 = st.ReverseKeys2(
d, v2);
240 v7 = st.ReverseKeys2(
d, v7);
241 v6 = st.ReverseKeys2(
d, v6);
247 v1 = st.ReverseKeys2(
d, v1);
248 v3 = st.ReverseKeys2(
d, v3);
249 v5 = st.ReverseKeys2(
d, v5);
250 v7 = st.ReverseKeys2(
d, v7);
256 v0 = st.SortPairsDistance1(
d, v0);
257 v1 = st.SortPairsDistance1(
d, v1);
258 v2 = st.SortPairsDistance1(
d, v2);
259 v3 = st.SortPairsDistance1(
d, v3);
260 v4 = st.SortPairsDistance1(
d, v4);
261 v5 = st.SortPairsDistance1(
d, v5);
262 v6 = st.SortPairsDistance1(
d, v6);
263 v7 = st.SortPairsDistance1(
d, v7);
266template <
size_t kKeysPerVector,
class D,
class Traits,
class V = Vec<D>,
267 HWY_IF_LANES_GT(kKeysPerVector, 2)>
268HWY_INLINE void Merge8x4(D
d, Traits st, V& v0, V& v1, V& v2, V& v3, V& v4,
269 V& v5, V& v6, V& v7) {
270 v7 = st.ReverseKeys4(
d, v7);
271 v6 = st.ReverseKeys4(
d, v6);
272 v5 = st.ReverseKeys4(
d, v5);
273 v4 = st.ReverseKeys4(
d, v4);
279 v3 = st.ReverseKeys4(
d, v3);
280 v2 = st.ReverseKeys4(
d, v2);
281 v7 = st.ReverseKeys4(
d, v7);
282 v6 = st.ReverseKeys4(
d, v6);
288 v1 = st.ReverseKeys4(
d, v1);
289 v3 = st.ReverseKeys4(
d, v3);
290 v5 = st.ReverseKeys4(
d, v5);
291 v7 = st.ReverseKeys4(
d, v7);
297 v0 = st.SortPairsReverse4(
d, v0);
298 v1 = st.SortPairsReverse4(
d, v1);
299 v2 = st.SortPairsReverse4(
d, v2);
300 v3 = st.SortPairsReverse4(
d, v3);
301 v4 = st.SortPairsReverse4(
d, v4);
302 v5 = st.SortPairsReverse4(
d, v5);
303 v6 = st.SortPairsReverse4(
d, v6);
304 v7 = st.SortPairsReverse4(
d, v7);
306 v0 = st.SortPairsDistance1(
d, v0);
307 v1 = st.SortPairsDistance1(
d, v1);
308 v2 = st.SortPairsDistance1(
d, v2);
309 v3 = st.SortPairsDistance1(
d, v3);
310 v4 = st.SortPairsDistance1(
d, v4);
311 v5 = st.SortPairsDistance1(
d, v5);
312 v6 = st.SortPairsDistance1(
d, v6);
313 v7 = st.SortPairsDistance1(
d, v7);
317template <
size_t kKeysPerVector,
class D,
class Traits,
class V = Vec<D>,
318 HWY_IF_LANES_GT(kKeysPerVector, 1)>
319HWY_INLINE void Merge16x2(D
d, Traits st, V& v0, V& v1, V& v2, V& v3, V& v4,
320 V& v5, V& v6, V& v7, V& v8, V& v9, V& va, V& vb,
321 V& vc, V& vd, V& ve, V& vf) {
322 vf = st.ReverseKeys2(
d, vf);
323 ve = st.ReverseKeys2(
d, ve);
324 vd = st.ReverseKeys2(
d, vd);
325 vc = st.ReverseKeys2(
d, vc);
326 vb = st.ReverseKeys2(
d, vb);
327 va = st.ReverseKeys2(
d, va);
328 v9 = st.ReverseKeys2(
d, v9);
329 v8 = st.ReverseKeys2(
d, v8);
339 v7 = st.ReverseKeys2(
d, v7);
340 v6 = st.ReverseKeys2(
d, v6);
341 v5 = st.ReverseKeys2(
d, v5);
342 v4 = st.ReverseKeys2(
d, v4);
343 vf = st.ReverseKeys2(
d, vf);
344 ve = st.ReverseKeys2(
d, ve);
345 vd = st.ReverseKeys2(
d, vd);
346 vc = st.ReverseKeys2(
d, vc);
356 v3 = st.ReverseKeys2(
d, v3);
357 v2 = st.ReverseKeys2(
d, v2);
358 v7 = st.ReverseKeys2(
d, v7);
359 v6 = st.ReverseKeys2(
d, v6);
360 vb = st.ReverseKeys2(
d, vb);
361 va = st.ReverseKeys2(
d, va);
362 vf = st.ReverseKeys2(
d, vf);
363 ve = st.ReverseKeys2(
d, ve);
373 v1 = st.ReverseKeys2(
d, v1);
374 v3 = st.ReverseKeys2(
d, v3);
375 v5 = st.ReverseKeys2(
d, v5);
376 v7 = st.ReverseKeys2(
d, v7);
377 v9 = st.ReverseKeys2(
d, v9);
378 vb = st.ReverseKeys2(
d, vb);
379 vd = st.ReverseKeys2(
d, vd);
380 vf = st.ReverseKeys2(
d, vf);
390 v0 = st.SortPairsDistance1(
d, v0);
391 v1 = st.SortPairsDistance1(
d, v1);
392 v2 = st.SortPairsDistance1(
d, v2);
393 v3 = st.SortPairsDistance1(
d, v3);
394 v4 = st.SortPairsDistance1(
d, v4);
395 v5 = st.SortPairsDistance1(
d, v5);
396 v6 = st.SortPairsDistance1(
d, v6);
397 v7 = st.SortPairsDistance1(
d, v7);
398 v8 = st.SortPairsDistance1(
d, v8);
399 v9 = st.SortPairsDistance1(
d, v9);
400 va = st.SortPairsDistance1(
d, va);
401 vb = st.SortPairsDistance1(
d, vb);
402 vc = st.SortPairsDistance1(
d, vc);
403 vd = st.SortPairsDistance1(
d, vd);
404 ve = st.SortPairsDistance1(
d, ve);
405 vf = st.SortPairsDistance1(
d, vf);
408template <
size_t kKeysPerVector,
class D,
class Traits,
class V = Vec<D>,
409 HWY_IF_LANES_GT(kKeysPerVector, 2)>
410HWY_INLINE void Merge16x4(D
d, Traits st, V& v0, V& v1, V& v2, V& v3, V& v4,
411 V& v5, V& v6, V& v7, V& v8, V& v9, V& va, V& vb,
412 V& vc, V& vd, V& ve, V& vf) {
413 vf = st.ReverseKeys4(
d, vf);
414 ve = st.ReverseKeys4(
d, ve);
415 vd = st.ReverseKeys4(
d, vd);
416 vc = st.ReverseKeys4(
d, vc);
417 vb = st.ReverseKeys4(
d, vb);
418 va = st.ReverseKeys4(
d, va);
419 v9 = st.ReverseKeys4(
d, v9);
420 v8 = st.ReverseKeys4(
d, v8);
430 v7 = st.ReverseKeys4(
d, v7);
431 v6 = st.ReverseKeys4(
d, v6);
432 v5 = st.ReverseKeys4(
d, v5);
433 v4 = st.ReverseKeys4(
d, v4);
434 vf = st.ReverseKeys4(
d, vf);
435 ve = st.ReverseKeys4(
d, ve);
436 vd = st.ReverseKeys4(
d, vd);
437 vc = st.ReverseKeys4(
d, vc);
447 v3 = st.ReverseKeys4(
d, v3);
448 v2 = st.ReverseKeys4(
d, v2);
449 v7 = st.ReverseKeys4(
d, v7);
450 v6 = st.ReverseKeys4(
d, v6);
451 vb = st.ReverseKeys4(
d, vb);
452 va = st.ReverseKeys4(
d, va);
453 vf = st.ReverseKeys4(
d, vf);
454 ve = st.ReverseKeys4(
d, ve);
464 v1 = st.ReverseKeys4(
d, v1);
465 v3 = st.ReverseKeys4(
d, v3);
466 v5 = st.ReverseKeys4(
d, v5);
467 v7 = st.ReverseKeys4(
d, v7);
468 v9 = st.ReverseKeys4(
d, v9);
469 vb = st.ReverseKeys4(
d, vb);
470 vd = st.ReverseKeys4(
d, vd);
471 vf = st.ReverseKeys4(
d, vf);
481 v0 = st.SortPairsReverse4(
d, v0);
482 v1 = st.SortPairsReverse4(
d, v1);
483 v2 = st.SortPairsReverse4(
d, v2);
484 v3 = st.SortPairsReverse4(
d, v3);
485 v4 = st.SortPairsReverse4(
d, v4);
486 v5 = st.SortPairsReverse4(
d, v5);
487 v6 = st.SortPairsReverse4(
d, v6);
488 v7 = st.SortPairsReverse4(
d, v7);
489 v8 = st.SortPairsReverse4(
d, v8);
490 v9 = st.SortPairsReverse4(
d, v9);
491 va = st.SortPairsReverse4(
d, va);
492 vb = st.SortPairsReverse4(
d, vb);
493 vc = st.SortPairsReverse4(
d, vc);
494 vd = st.SortPairsReverse4(
d, vd);
495 ve = st.SortPairsReverse4(
d, ve);
496 vf = st.SortPairsReverse4(
d, vf);
498 v0 = st.SortPairsDistance1(
d, v0);
499 v1 = st.SortPairsDistance1(
d, v1);
500 v2 = st.SortPairsDistance1(
d, v2);
501 v3 = st.SortPairsDistance1(
d, v3);
502 v4 = st.SortPairsDistance1(
d, v4);
503 v5 = st.SortPairsDistance1(
d, v5);
504 v6 = st.SortPairsDistance1(
d, v6);
505 v7 = st.SortPairsDistance1(
d, v7);
506 v8 = st.SortPairsDistance1(
d, v8);
507 v9 = st.SortPairsDistance1(
d, v9);
508 va = st.SortPairsDistance1(
d, va);
509 vb = st.SortPairsDistance1(
d, vb);
510 vc = st.SortPairsDistance1(
d, vc);
511 vd = st.SortPairsDistance1(
d, vd);
512 ve = st.SortPairsDistance1(
d, ve);
513 vf = st.SortPairsDistance1(
d, vf);
516template <
size_t kKeysPerVector,
class D,
class Traits,
class V = Vec<D>,
517 HWY_IF_LANES_GT(kKeysPerVector, 4)>
518HWY_INLINE void Merge16x8(D
d, Traits st, V& v0, V& v1, V& v2, V& v3, V& v4,
519 V& v5, V& v6, V& v7, V& v8, V& v9, V& va, V& vb,
520 V& vc, V& vd, V& ve, V& vf) {
521 vf = st.ReverseKeys8(
d, vf);
522 ve = st.ReverseKeys8(
d, ve);
523 vd = st.ReverseKeys8(
d, vd);
524 vc = st.ReverseKeys8(
d, vc);
525 vb = st.ReverseKeys8(
d, vb);
526 va = st.ReverseKeys8(
d, va);
527 v9 = st.ReverseKeys8(
d, v9);
528 v8 = st.ReverseKeys8(
d, v8);
538 v7 = st.ReverseKeys8(
d, v7);
539 v6 = st.ReverseKeys8(
d, v6);
540 v5 = st.ReverseKeys8(
d, v5);
541 v4 = st.ReverseKeys8(
d, v4);
542 vf = st.ReverseKeys8(
d, vf);
543 ve = st.ReverseKeys8(
d, ve);
544 vd = st.ReverseKeys8(
d, vd);
545 vc = st.ReverseKeys8(
d, vc);
555 v3 = st.ReverseKeys8(
d, v3);
556 v2 = st.ReverseKeys8(
d, v2);
557 v7 = st.ReverseKeys8(
d, v7);
558 v6 = st.ReverseKeys8(
d, v6);
559 vb = st.ReverseKeys8(
d, vb);
560 va = st.ReverseKeys8(
d, va);
561 vf = st.ReverseKeys8(
d, vf);
562 ve = st.ReverseKeys8(
d, ve);
572 v1 = st.ReverseKeys8(
d, v1);
573 v3 = st.ReverseKeys8(
d, v3);
574 v5 = st.ReverseKeys8(
d, v5);
575 v7 = st.ReverseKeys8(
d, v7);
576 v9 = st.ReverseKeys8(
d, v9);
577 vb = st.ReverseKeys8(
d, vb);
578 vd = st.ReverseKeys8(
d, vd);
579 vf = st.ReverseKeys8(
d, vf);
589 v0 = st.SortPairsReverse8(
d, v0);
590 v1 = st.SortPairsReverse8(
d, v1);
591 v2 = st.SortPairsReverse8(
d, v2);
592 v3 = st.SortPairsReverse8(
d, v3);
593 v4 = st.SortPairsReverse8(
d, v4);
594 v5 = st.SortPairsReverse8(
d, v5);
595 v6 = st.SortPairsReverse8(
d, v6);
596 v7 = st.SortPairsReverse8(
d, v7);
597 v8 = st.SortPairsReverse8(
d, v8);
598 v9 = st.SortPairsReverse8(
d, v9);
599 va = st.SortPairsReverse8(
d, va);
600 vb = st.SortPairsReverse8(
d, vb);
601 vc = st.SortPairsReverse8(
d, vc);
602 vd = st.SortPairsReverse8(
d, vd);
603 ve = st.SortPairsReverse8(
d, ve);
604 vf = st.SortPairsReverse8(
d, vf);
606 v0 = st.SortPairsDistance2(
d, v0);
607 v1 = st.SortPairsDistance2(
d, v1);
608 v2 = st.SortPairsDistance2(
d, v2);
609 v3 = st.SortPairsDistance2(
d, v3);
610 v4 = st.SortPairsDistance2(
d, v4);
611 v5 = st.SortPairsDistance2(
d, v5);
612 v6 = st.SortPairsDistance2(
d, v6);
613 v7 = st.SortPairsDistance2(
d, v7);
614 v8 = st.SortPairsDistance2(
d, v8);
615 v9 = st.SortPairsDistance2(
d, v9);
616 va = st.SortPairsDistance2(
d, va);
617 vb = st.SortPairsDistance2(
d, vb);
618 vc = st.SortPairsDistance2(
d, vc);
619 vd = st.SortPairsDistance2(
d, vd);
620 ve = st.SortPairsDistance2(
d, ve);
621 vf = st.SortPairsDistance2(
d, vf);
623 v0 = st.SortPairsDistance1(
d, v0);
624 v1 = st.SortPairsDistance1(
d, v1);
625 v2 = st.SortPairsDistance1(
d, v2);
626 v3 = st.SortPairsDistance1(
d, v3);
627 v4 = st.SortPairsDistance1(
d, v4);
628 v5 = st.SortPairsDistance1(
d, v5);
629 v6 = st.SortPairsDistance1(
d, v6);
630 v7 = st.SortPairsDistance1(
d, v7);
631 v8 = st.SortPairsDistance1(
d, v8);
632 v9 = st.SortPairsDistance1(
d, v9);
633 va = st.SortPairsDistance1(
d, va);
634 vb = st.SortPairsDistance1(
d, vb);
635 vc = st.SortPairsDistance1(
d, vc);
636 vd = st.SortPairsDistance1(
d, vd);
637 ve = st.SortPairsDistance1(
d, ve);
638 vf = st.SortPairsDistance1(
d, vf);
642#if !HWY_COMPILER_MSVC && !HWY_IS_DEBUG_BUILD
644template <
size_t kKeysPerVector,
class D,
class Traits,
class V = Vec<D>,
645 HWY_IF_LANES_GT(kKeysPerVector, 8)>
646HWY_INLINE void Merge16x16(D
d, Traits st, V& v0, V& v1, V& v2, V& v3, V& v4,
647 V& v5, V& v6, V& v7, V& v8, V& v9, V& va, V& vb,
648 V& vc, V& vd, V& ve, V& vf) {
649 vf = st.ReverseKeys16(
d, vf);
650 ve = st.ReverseKeys16(
d, ve);
651 vd = st.ReverseKeys16(
d, vd);
652 vc = st.ReverseKeys16(
d, vc);
653 vb = st.ReverseKeys16(
d, vb);
654 va = st.ReverseKeys16(
d, va);
655 v9 = st.ReverseKeys16(
d, v9);
656 v8 = st.ReverseKeys16(
d, v8);
666 v7 = st.ReverseKeys16(
d, v7);
667 v6 = st.ReverseKeys16(
d, v6);
668 v5 = st.ReverseKeys16(
d, v5);
669 v4 = st.ReverseKeys16(
d, v4);
670 vf = st.ReverseKeys16(
d, vf);
671 ve = st.ReverseKeys16(
d, ve);
672 vd = st.ReverseKeys16(
d, vd);
673 vc = st.ReverseKeys16(
d, vc);
683 v3 = st.ReverseKeys16(
d, v3);
684 v2 = st.ReverseKeys16(
d, v2);
685 v7 = st.ReverseKeys16(
d, v7);
686 v6 = st.ReverseKeys16(
d, v6);
687 vb = st.ReverseKeys16(
d, vb);
688 va = st.ReverseKeys16(
d, va);
689 vf = st.ReverseKeys16(
d, vf);
690 ve = st.ReverseKeys16(
d, ve);
700 v1 = st.ReverseKeys16(
d, v1);
701 v3 = st.ReverseKeys16(
d, v3);
702 v5 = st.ReverseKeys16(
d, v5);
703 v7 = st.ReverseKeys16(
d, v7);
704 v9 = st.ReverseKeys16(
d, v9);
705 vb = st.ReverseKeys16(
d, vb);
706 vd = st.ReverseKeys16(
d, vd);
707 vf = st.ReverseKeys16(
d, vf);
717 v0 = st.SortPairsReverse16(
d, v0);
718 v1 = st.SortPairsReverse16(
d, v1);
719 v2 = st.SortPairsReverse16(
d, v2);
720 v3 = st.SortPairsReverse16(
d, v3);
721 v4 = st.SortPairsReverse16(
d, v4);
722 v5 = st.SortPairsReverse16(
d, v5);
723 v6 = st.SortPairsReverse16(
d, v6);
724 v7 = st.SortPairsReverse16(
d, v7);
725 v8 = st.SortPairsReverse16(
d, v8);
726 v9 = st.SortPairsReverse16(
d, v9);
727 va = st.SortPairsReverse16(
d, va);
728 vb = st.SortPairsReverse16(
d, vb);
729 vc = st.SortPairsReverse16(
d, vc);
730 vd = st.SortPairsReverse16(
d, vd);
731 ve = st.SortPairsReverse16(
d, ve);
732 vf = st.SortPairsReverse16(
d, vf);
734 v0 = st.SortPairsDistance4(
d, v0);
735 v1 = st.SortPairsDistance4(
d, v1);
736 v2 = st.SortPairsDistance4(
d, v2);
737 v3 = st.SortPairsDistance4(
d, v3);
738 v4 = st.SortPairsDistance4(
d, v4);
739 v5 = st.SortPairsDistance4(
d, v5);
740 v6 = st.SortPairsDistance4(
d, v6);
741 v7 = st.SortPairsDistance4(
d, v7);
742 v8 = st.SortPairsDistance4(
d, v8);
743 v9 = st.SortPairsDistance4(
d, v9);
744 va = st.SortPairsDistance4(
d, va);
745 vb = st.SortPairsDistance4(
d, vb);
746 vc = st.SortPairsDistance4(
d, vc);
747 vd = st.SortPairsDistance4(
d, vd);
748 ve = st.SortPairsDistance4(
d, ve);
749 vf = st.SortPairsDistance4(
d, vf);
751 v0 = st.SortPairsDistance2(
d, v0);
752 v1 = st.SortPairsDistance2(
d, v1);
753 v2 = st.SortPairsDistance2(
d, v2);
754 v3 = st.SortPairsDistance2(
d, v3);
755 v4 = st.SortPairsDistance2(
d, v4);
756 v5 = st.SortPairsDistance2(
d, v5);
757 v6 = st.SortPairsDistance2(
d, v6);
758 v7 = st.SortPairsDistance2(
d, v7);
759 v8 = st.SortPairsDistance2(
d, v8);
760 v9 = st.SortPairsDistance2(
d, v9);
761 va = st.SortPairsDistance2(
d, va);
762 vb = st.SortPairsDistance2(
d, vb);
763 vc = st.SortPairsDistance2(
d, vc);
764 vd = st.SortPairsDistance2(
d, vd);
765 ve = st.SortPairsDistance2(
d, ve);
766 vf = st.SortPairsDistance2(
d, vf);
768 v0 = st.SortPairsDistance1(
d, v0);
769 v1 = st.SortPairsDistance1(
d, v1);
770 v2 = st.SortPairsDistance1(
d, v2);
771 v3 = st.SortPairsDistance1(
d, v3);
772 v4 = st.SortPairsDistance1(
d, v4);
773 v5 = st.SortPairsDistance1(
d, v5);
774 v6 = st.SortPairsDistance1(
d, v6);
775 v7 = st.SortPairsDistance1(
d, v7);
776 v8 = st.SortPairsDistance1(
d, v8);
777 v9 = st.SortPairsDistance1(
d, v9);
778 va = st.SortPairsDistance1(
d, va);
779 vb = st.SortPairsDistance1(
d, vb);
780 vc = st.SortPairsDistance1(
d, vc);
781 vd = st.SortPairsDistance1(
d, vd);
782 ve = st.SortPairsDistance1(
d, ve);
783 vf = st.SortPairsDistance1(
d, vf);
792template <
class Traits,
class V>
793HWY_INLINE void SortingNetwork(Traits st,
size_t cols, V& v0, V& v1, V& v2,
794 V& v3, V& v4, V& v5, V& v6, V& v7, V& v8, V& v9,
795 V& va, V& vb, V& vc, V& vd, V& ve, V& vf) {
802 constexpr size_t kLanesPerKey = st.LanesPerKey();
803 const size_t keys = cols / kLanesPerKey;
804 constexpr size_t kMaxKeys =
MaxLanes(
d) / kLanesPerKey;
806 Sort16(
d, st, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, va, vb, vc, vd, ve, vf);
811 Merge16x2<kMaxKeys>(
d, st, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, va, vb,
815 Merge16x4<kMaxKeys>(
d, st, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, va, vb,
819 Merge16x8<kMaxKeys>(
d, st, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, va,
823#if !HWY_COMPILER_MSVC && !HWY_IS_DEBUG_BUILD
824 if (
HWY_LIKELY(keys >= 16 && kMaxKeys >= 16)) {
825 Merge16x16<kMaxKeys>(
d, st, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9,
826 va, vb, vc, vd, ve, vf);
840template <
class Traits,
typename T>
846 using V =
decltype(
Zero(
d));
853 V v0 =
LoadU(
d, buf + 0x0 * cols);
854 V v1 =
LoadU(
d, buf + 0x1 * cols);
855 V v2 =
LoadU(
d, buf + 0x2 * cols);
856 V v3 =
LoadU(
d, buf + 0x3 * cols);
857 V v4 =
LoadU(
d, buf + 0x4 * cols);
858 V v5 =
LoadU(
d, buf + 0x5 * cols);
859 V v6 =
LoadU(
d, buf + 0x6 * cols);
860 V v7 =
LoadU(
d, buf + 0x7 * cols);
861 V v8 =
LoadU(
d, buf + 0x8 * cols);
862 V v9 =
LoadU(
d, buf + 0x9 * cols);
863 V va =
LoadU(
d, buf + 0xa * cols);
864 V vb =
LoadU(
d, buf + 0xb * cols);
865 V vc =
LoadU(
d, buf + 0xc * cols);
866 V vd =
LoadU(
d, buf + 0xd * cols);
867 V ve =
LoadU(
d, buf + 0xe * cols);
868 V vf =
LoadU(
d, buf + 0xf * cols);
870 SortingNetwork(st, cols, v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, va, vb, vc,
873 StoreU(v0,
d, buf + 0x0 * cols);
874 StoreU(v1,
d, buf + 0x1 * cols);
875 StoreU(v2,
d, buf + 0x2 * cols);
876 StoreU(v3,
d, buf + 0x3 * cols);
877 StoreU(v4,
d, buf + 0x4 * cols);
878 StoreU(v5,
d, buf + 0x5 * cols);
879 StoreU(v6,
d, buf + 0x6 * cols);
880 StoreU(v7,
d, buf + 0x7 * cols);
881 StoreU(v8,
d, buf + 0x8 * cols);
882 StoreU(v9,
d, buf + 0x9 * cols);
883 StoreU(va,
d, buf + 0xa * cols);
884 StoreU(vb,
d, buf + 0xb * cols);
885 StoreU(vc,
d, buf + 0xc * cols);
886 StoreU(vd,
d, buf + 0xd * cols);
887 StoreU(ve,
d, buf + 0xe * cols);
888 StoreU(vf,
d, buf + 0xf * cols);