1 // Licensed to the .NET Foundation under one or more agreements.
2 // The .NET Foundation licenses this file to you under the MIT license.
4 /////////////////////////////////////////////////////////////////////////////
6 // This file was auto-generated by a tool at 2020-06-22 05:27:48
8 // It is recommended you DO NOT directly edit this file but instead edit
9 // the code-generator that generated this source file instead.
10 /////////////////////////////////////////////////////////////////////////////
12 #ifndef BITONIC_SORT_AVX2_INT32_T_H
13 #define BITONIC_SORT_AVX2_INT32_T_H
17 #pragma clang attribute push (__attribute__((target("avx2"))), apply_to = any(function))
19 #pragma GCC push_options
20 #pragma GCC target("avx2")
24 #include <immintrin.h>
25 #include "bitonic_sort.h"
27 #define i2d _mm256_castsi256_pd
28 #define d2i _mm256_castpd_si256
29 #define i2s _mm256_castsi256_ps
30 #define s2i _mm256_castps_si256
31 #define s2d _mm256_castps_pd
32 #define d2s _mm256_castpd_ps
36 template<> struct bitonic<int32_t, AVX2> {
39 static INLINE void sort_01v_ascending(__m256i& d01) {
42 s = _mm256_shuffle_epi32(d01, 0xB1);
44 min = _mm256_min_epi32(s, d01);
45 max = _mm256_max_epi32(s, d01);
46 d01 = _mm256_blend_epi32(min, max, 0xAA);
48 s = _mm256_shuffle_epi32(d01, 0x1B);
50 min = _mm256_min_epi32(s, d01);
51 max = _mm256_max_epi32(s, d01);
52 d01 = _mm256_blend_epi32(min, max, 0xCC);
54 s = _mm256_shuffle_epi32(d01, 0xB1);
56 min = _mm256_min_epi32(s, d01);
57 max = _mm256_max_epi32(s, d01);
58 d01 = _mm256_blend_epi32(min, max, 0xAA);
60 s = d2i(_mm256_permute4x64_pd(i2d(_mm256_shuffle_epi32(d01, 0x1B)), 0x4E));
61 min = _mm256_min_epi32(s, d01);
62 max = _mm256_max_epi32(s, d01);
63 d01 = _mm256_blend_epi32(min, max, 0xF0);
65 s = _mm256_shuffle_epi32(d01, 0x4E);
66 min = _mm256_min_epi32(s, d01);
67 max = _mm256_max_epi32(s, d01);
68 d01 = _mm256_blend_epi32(min, max, 0xCC);
70 s = _mm256_shuffle_epi32(d01, 0xB1);
71 min = _mm256_min_epi32(s, d01);
72 max = _mm256_max_epi32(s, d01);
73 d01 = _mm256_blend_epi32(min, max, 0xAA);
75 static INLINE void sort_01v_merge_ascending(__m256i& d01) {
78 s = d2i(_mm256_permute4x64_pd(i2d(d01), 0x4E));
79 min = _mm256_min_epi32(s, d01);
80 max = _mm256_max_epi32(s, d01);
81 d01 = _mm256_blend_epi32(min, max, 0xF0);
83 s = _mm256_shuffle_epi32(d01, 0x4E);
85 min = _mm256_min_epi32(s, d01);
86 max = _mm256_max_epi32(s, d01);
87 d01 = _mm256_blend_epi32(min, max, 0xCC);
89 s = _mm256_shuffle_epi32(d01, 0xB1);
91 min = _mm256_min_epi32(s, d01);
92 max = _mm256_max_epi32(s, d01);
93 d01 = _mm256_blend_epi32(min, max, 0xAA);
95 static INLINE void sort_01v_descending(__m256i& d01) {
98 s = _mm256_shuffle_epi32(d01, 0xB1);
100 min = _mm256_min_epi32(s, d01);
101 max = _mm256_max_epi32(s, d01);
102 d01 = _mm256_blend_epi32(max, min, 0xAA);
104 s = _mm256_shuffle_epi32(d01, 0x1B);
106 min = _mm256_min_epi32(s, d01);
107 max = _mm256_max_epi32(s, d01);
108 d01 = _mm256_blend_epi32(max, min, 0xCC);
110 s = _mm256_shuffle_epi32(d01, 0xB1);
112 min = _mm256_min_epi32(s, d01);
113 max = _mm256_max_epi32(s, d01);
114 d01 = _mm256_blend_epi32(max, min, 0xAA);
116 s = d2i(_mm256_permute4x64_pd(i2d(_mm256_shuffle_epi32(d01, 0x1B)), 0x4E));
117 min = _mm256_min_epi32(s, d01);
118 max = _mm256_max_epi32(s, d01);
119 d01 = _mm256_blend_epi32(max, min, 0xF0);
121 s = _mm256_shuffle_epi32(d01, 0x4E);
122 min = _mm256_min_epi32(s, d01);
123 max = _mm256_max_epi32(s, d01);
124 d01 = _mm256_blend_epi32(max, min, 0xCC);
126 s = _mm256_shuffle_epi32(d01, 0xB1);
127 min = _mm256_min_epi32(s, d01);
128 max = _mm256_max_epi32(s, d01);
129 d01 = _mm256_blend_epi32(max, min, 0xAA);
131 static INLINE void sort_01v_merge_descending(__m256i& d01) {
134 s = d2i(_mm256_permute4x64_pd(i2d(d01), 0x4E));
135 min = _mm256_min_epi32(s, d01);
136 max = _mm256_max_epi32(s, d01);
137 d01 = _mm256_blend_epi32(max, min, 0xF0);
139 s = _mm256_shuffle_epi32(d01, 0x4E);
141 min = _mm256_min_epi32(s, d01);
142 max = _mm256_max_epi32(s, d01);
143 d01 = _mm256_blend_epi32(max, min, 0xCC);
145 s = _mm256_shuffle_epi32(d01, 0xB1);
147 min = _mm256_min_epi32(s, d01);
148 max = _mm256_max_epi32(s, d01);
149 d01 = _mm256_blend_epi32(max, min, 0xAA);
151 static INLINE void sort_02v_ascending(__m256i& d01, __m256i& d02) {
154 sort_01v_ascending(d01);
155 sort_01v_descending(d02);
159 d02 = _mm256_max_epi32(d01, d02);
160 d01 = _mm256_min_epi32(d01, tmp);
162 sort_01v_merge_ascending(d01);
163 sort_01v_merge_ascending(d02);
165 static INLINE void sort_02v_descending(__m256i& d01, __m256i& d02) {
168 sort_01v_descending(d01);
169 sort_01v_ascending(d02);
173 d02 = _mm256_max_epi32(d01, d02);
174 d01 = _mm256_min_epi32(d01, tmp);
176 sort_01v_merge_descending(d01);
177 sort_01v_merge_descending(d02);
179 static INLINE void sort_02v_merge_ascending(__m256i& d01, __m256i& d02) {
184 d01 = _mm256_min_epi32(d02, d01);
186 d02 = _mm256_max_epi32(d02, tmp);
188 sort_01v_merge_ascending(d01);
189 sort_01v_merge_ascending(d02);
191 static INLINE void sort_02v_merge_descending(__m256i& d01, __m256i& d02) {
196 d01 = _mm256_min_epi32(d02, d01);
198 d02 = _mm256_max_epi32(d02, tmp);
200 sort_01v_merge_descending(d01);
201 sort_01v_merge_descending(d02);
203 static INLINE void sort_03v_ascending(__m256i& d01, __m256i& d02, __m256i& d03) {
206 sort_02v_ascending(d01, d02);
207 sort_01v_descending(d03);
211 d03 = _mm256_max_epi32(d02, d03);
212 d02 = _mm256_min_epi32(d02, tmp);
214 sort_02v_merge_ascending(d01, d02);
215 sort_01v_merge_ascending(d03);
217 static INLINE void sort_03v_descending(__m256i& d01, __m256i& d02, __m256i& d03) {
220 sort_02v_descending(d01, d02);
221 sort_01v_ascending(d03);
225 d03 = _mm256_max_epi32(d02, d03);
226 d02 = _mm256_min_epi32(d02, tmp);
228 sort_02v_merge_descending(d01, d02);
229 sort_01v_merge_descending(d03);
231 static INLINE void sort_03v_merge_ascending(__m256i& d01, __m256i& d02, __m256i& d03) {
236 d01 = _mm256_min_epi32(d03, d01);
238 d03 = _mm256_max_epi32(d03, tmp);
240 sort_02v_merge_ascending(d01, d02);
241 sort_01v_merge_ascending(d03);
243 static INLINE void sort_03v_merge_descending(__m256i& d01, __m256i& d02, __m256i& d03) {
248 d01 = _mm256_min_epi32(d03, d01);
250 d03 = _mm256_max_epi32(d03, tmp);
252 sort_02v_merge_descending(d01, d02);
253 sort_01v_merge_descending(d03);
255 static INLINE void sort_04v_ascending(__m256i& d01, __m256i& d02, __m256i& d03, __m256i& d04) {
258 sort_02v_ascending(d01, d02);
259 sort_02v_descending(d03, d04);
263 d03 = _mm256_max_epi32(d02, d03);
264 d02 = _mm256_min_epi32(d02, tmp);
268 d04 = _mm256_max_epi32(d01, d04);
269 d01 = _mm256_min_epi32(d01, tmp);
271 sort_02v_merge_ascending(d01, d02);
272 sort_02v_merge_ascending(d03, d04);
274 static INLINE void sort_04v_descending(__m256i& d01, __m256i& d02, __m256i& d03, __m256i& d04) {
277 sort_02v_descending(d01, d02);
278 sort_02v_ascending(d03, d04);
282 d03 = _mm256_max_epi32(d02, d03);
283 d02 = _mm256_min_epi32(d02, tmp);
287 d04 = _mm256_max_epi32(d01, d04);
288 d01 = _mm256_min_epi32(d01, tmp);
290 sort_02v_merge_descending(d01, d02);
291 sort_02v_merge_descending(d03, d04);
293 static INLINE void sort_04v_merge_ascending(__m256i& d01, __m256i& d02, __m256i& d03, __m256i& d04) {
298 d01 = _mm256_min_epi32(d03, d01);
300 d03 = _mm256_max_epi32(d03, tmp);
304 d02 = _mm256_min_epi32(d04, d02);
306 d04 = _mm256_max_epi32(d04, tmp);
308 sort_02v_merge_ascending(d01, d02);
309 sort_02v_merge_ascending(d03, d04);
311 static INLINE void sort_04v_merge_descending(__m256i& d01, __m256i& d02, __m256i& d03, __m256i& d04) {
316 d01 = _mm256_min_epi32(d03, d01);
318 d03 = _mm256_max_epi32(d03, tmp);
322 d02 = _mm256_min_epi32(d04, d02);
324 d04 = _mm256_max_epi32(d04, tmp);
326 sort_02v_merge_descending(d01, d02);
327 sort_02v_merge_descending(d03, d04);
329 static INLINE void sort_05v_ascending(__m256i& d01, __m256i& d02, __m256i& d03, __m256i& d04, __m256i& d05) {
332 sort_04v_ascending(d01, d02, d03, d04);
333 sort_01v_descending(d05);
337 d05 = _mm256_max_epi32(d04, d05);
338 d04 = _mm256_min_epi32(d04, tmp);
340 sort_04v_merge_ascending(d01, d02, d03, d04);
341 sort_01v_merge_ascending(d05);
343 static INLINE void sort_05v_descending(__m256i& d01, __m256i& d02, __m256i& d03, __m256i& d04, __m256i& d05) {
346 sort_04v_descending(d01, d02, d03, d04);
347 sort_01v_ascending(d05);
351 d05 = _mm256_max_epi32(d04, d05);
352 d04 = _mm256_min_epi32(d04, tmp);
354 sort_04v_merge_descending(d01, d02, d03, d04);
355 sort_01v_merge_descending(d05);
357 static INLINE void sort_05v_merge_ascending(__m256i& d01, __m256i& d02, __m256i& d03, __m256i& d04, __m256i& d05) {
362 d01 = _mm256_min_epi32(d05, d01);
364 d05 = _mm256_max_epi32(d05, tmp);
366 sort_04v_merge_ascending(d01, d02, d03, d04);
367 sort_01v_merge_ascending(d05);
369 static INLINE void sort_05v_merge_descending(__m256i& d01, __m256i& d02, __m256i& d03, __m256i& d04, __m256i& d05) {
374 d01 = _mm256_min_epi32(d05, d01);
376 d05 = _mm256_max_epi32(d05, tmp);
378 sort_04v_merge_descending(d01, d02, d03, d04);
379 sort_01v_merge_descending(d05);
381 static INLINE void sort_06v_ascending(__m256i& d01, __m256i& d02, __m256i& d03, __m256i& d04, __m256i& d05, __m256i& d06) {
384 sort_04v_ascending(d01, d02, d03, d04);
385 sort_02v_descending(d05, d06);
389 d05 = _mm256_max_epi32(d04, d05);
390 d04 = _mm256_min_epi32(d04, tmp);
394 d06 = _mm256_max_epi32(d03, d06);
395 d03 = _mm256_min_epi32(d03, tmp);
397 sort_04v_merge_ascending(d01, d02, d03, d04);
398 sort_02v_merge_ascending(d05, d06);
400 static INLINE void sort_06v_descending(__m256i& d01, __m256i& d02, __m256i& d03, __m256i& d04, __m256i& d05, __m256i& d06) {
403 sort_04v_descending(d01, d02, d03, d04);
404 sort_02v_ascending(d05, d06);
408 d05 = _mm256_max_epi32(d04, d05);
409 d04 = _mm256_min_epi32(d04, tmp);
413 d06 = _mm256_max_epi32(d03, d06);
414 d03 = _mm256_min_epi32(d03, tmp);
416 sort_04v_merge_descending(d01, d02, d03, d04);
417 sort_02v_merge_descending(d05, d06);
419 static INLINE void sort_06v_merge_ascending(__m256i& d01, __m256i& d02, __m256i& d03, __m256i& d04, __m256i& d05, __m256i& d06) {
424 d01 = _mm256_min_epi32(d05, d01);
426 d05 = _mm256_max_epi32(d05, tmp);
430 d02 = _mm256_min_epi32(d06, d02);
432 d06 = _mm256_max_epi32(d06, tmp);
434 sort_04v_merge_ascending(d01, d02, d03, d04);
435 sort_02v_merge_ascending(d05, d06);
437 static INLINE void sort_06v_merge_descending(__m256i& d01, __m256i& d02, __m256i& d03, __m256i& d04, __m256i& d05, __m256i& d06) {
442 d01 = _mm256_min_epi32(d05, d01);
444 d05 = _mm256_max_epi32(d05, tmp);
448 d02 = _mm256_min_epi32(d06, d02);
450 d06 = _mm256_max_epi32(d06, tmp);
452 sort_04v_merge_descending(d01, d02, d03, d04);
453 sort_02v_merge_descending(d05, d06);
455 static INLINE void sort_07v_ascending(__m256i& d01, __m256i& d02, __m256i& d03, __m256i& d04, __m256i& d05, __m256i& d06, __m256i& d07) {
458 sort_04v_ascending(d01, d02, d03, d04);
459 sort_03v_descending(d05, d06, d07);
463 d05 = _mm256_max_epi32(d04, d05);
464 d04 = _mm256_min_epi32(d04, tmp);
468 d06 = _mm256_max_epi32(d03, d06);
469 d03 = _mm256_min_epi32(d03, tmp);
473 d07 = _mm256_max_epi32(d02, d07);
474 d02 = _mm256_min_epi32(d02, tmp);
476 sort_04v_merge_ascending(d01, d02, d03, d04);
477 sort_03v_merge_ascending(d05, d06, d07);
479 static INLINE void sort_07v_descending(__m256i& d01, __m256i& d02, __m256i& d03, __m256i& d04, __m256i& d05, __m256i& d06, __m256i& d07) {
482 sort_04v_descending(d01, d02, d03, d04);
483 sort_03v_ascending(d05, d06, d07);
487 d05 = _mm256_max_epi32(d04, d05);
488 d04 = _mm256_min_epi32(d04, tmp);
492 d06 = _mm256_max_epi32(d03, d06);
493 d03 = _mm256_min_epi32(d03, tmp);
497 d07 = _mm256_max_epi32(d02, d07);
498 d02 = _mm256_min_epi32(d02, tmp);
500 sort_04v_merge_descending(d01, d02, d03, d04);
501 sort_03v_merge_descending(d05, d06, d07);
503 static INLINE void sort_07v_merge_ascending(__m256i& d01, __m256i& d02, __m256i& d03, __m256i& d04, __m256i& d05, __m256i& d06, __m256i& d07) {
508 d01 = _mm256_min_epi32(d05, d01);
510 d05 = _mm256_max_epi32(d05, tmp);
514 d02 = _mm256_min_epi32(d06, d02);
516 d06 = _mm256_max_epi32(d06, tmp);
520 d03 = _mm256_min_epi32(d07, d03);
522 d07 = _mm256_max_epi32(d07, tmp);
524 sort_04v_merge_ascending(d01, d02, d03, d04);
525 sort_03v_merge_ascending(d05, d06, d07);
527 static INLINE void sort_07v_merge_descending(__m256i& d01, __m256i& d02, __m256i& d03, __m256i& d04, __m256i& d05, __m256i& d06, __m256i& d07) {
532 d01 = _mm256_min_epi32(d05, d01);
534 d05 = _mm256_max_epi32(d05, tmp);
538 d02 = _mm256_min_epi32(d06, d02);
540 d06 = _mm256_max_epi32(d06, tmp);
544 d03 = _mm256_min_epi32(d07, d03);
546 d07 = _mm256_max_epi32(d07, tmp);
548 sort_04v_merge_descending(d01, d02, d03, d04);
549 sort_03v_merge_descending(d05, d06, d07);
551 static INLINE void sort_08v_ascending(__m256i& d01, __m256i& d02, __m256i& d03, __m256i& d04, __m256i& d05, __m256i& d06, __m256i& d07, __m256i& d08) {
554 sort_04v_ascending(d01, d02, d03, d04);
555 sort_04v_descending(d05, d06, d07, d08);
559 d05 = _mm256_max_epi32(d04, d05);
560 d04 = _mm256_min_epi32(d04, tmp);
564 d06 = _mm256_max_epi32(d03, d06);
565 d03 = _mm256_min_epi32(d03, tmp);
569 d07 = _mm256_max_epi32(d02, d07);
570 d02 = _mm256_min_epi32(d02, tmp);
574 d08 = _mm256_max_epi32(d01, d08);
575 d01 = _mm256_min_epi32(d01, tmp);
577 sort_04v_merge_ascending(d01, d02, d03, d04);
578 sort_04v_merge_ascending(d05, d06, d07, d08);
580 static INLINE void sort_08v_descending(__m256i& d01, __m256i& d02, __m256i& d03, __m256i& d04, __m256i& d05, __m256i& d06, __m256i& d07, __m256i& d08) {
583 sort_04v_descending(d01, d02, d03, d04);
584 sort_04v_ascending(d05, d06, d07, d08);
588 d05 = _mm256_max_epi32(d04, d05);
589 d04 = _mm256_min_epi32(d04, tmp);
593 d06 = _mm256_max_epi32(d03, d06);
594 d03 = _mm256_min_epi32(d03, tmp);
598 d07 = _mm256_max_epi32(d02, d07);
599 d02 = _mm256_min_epi32(d02, tmp);
603 d08 = _mm256_max_epi32(d01, d08);
604 d01 = _mm256_min_epi32(d01, tmp);
606 sort_04v_merge_descending(d01, d02, d03, d04);
607 sort_04v_merge_descending(d05, d06, d07, d08);
609 static INLINE void sort_08v_merge_ascending(__m256i& d01, __m256i& d02, __m256i& d03, __m256i& d04, __m256i& d05, __m256i& d06, __m256i& d07, __m256i& d08) {
614 d01 = _mm256_min_epi32(d05, d01);
616 d05 = _mm256_max_epi32(d05, tmp);
620 d02 = _mm256_min_epi32(d06, d02);
622 d06 = _mm256_max_epi32(d06, tmp);
626 d03 = _mm256_min_epi32(d07, d03);
628 d07 = _mm256_max_epi32(d07, tmp);
632 d04 = _mm256_min_epi32(d08, d04);
634 d08 = _mm256_max_epi32(d08, tmp);
636 sort_04v_merge_ascending(d01, d02, d03, d04);
637 sort_04v_merge_ascending(d05, d06, d07, d08);
639 static INLINE void sort_08v_merge_descending(__m256i& d01, __m256i& d02, __m256i& d03, __m256i& d04, __m256i& d05, __m256i& d06, __m256i& d07, __m256i& d08) {
644 d01 = _mm256_min_epi32(d05, d01);
646 d05 = _mm256_max_epi32(d05, tmp);
650 d02 = _mm256_min_epi32(d06, d02);
652 d06 = _mm256_max_epi32(d06, tmp);
656 d03 = _mm256_min_epi32(d07, d03);
658 d07 = _mm256_max_epi32(d07, tmp);
662 d04 = _mm256_min_epi32(d08, d04);
664 d08 = _mm256_max_epi32(d08, tmp);
666 sort_04v_merge_descending(d01, d02, d03, d04);
667 sort_04v_merge_descending(d05, d06, d07, d08);
669 static INLINE void sort_09v_ascending(__m256i& d01, __m256i& d02, __m256i& d03, __m256i& d04, __m256i& d05, __m256i& d06, __m256i& d07, __m256i& d08, __m256i& d09) {
672 sort_08v_ascending(d01, d02, d03, d04, d05, d06, d07, d08);
673 sort_01v_descending(d09);
677 d09 = _mm256_max_epi32(d08, d09);
678 d08 = _mm256_min_epi32(d08, tmp);
680 sort_08v_merge_ascending(d01, d02, d03, d04, d05, d06, d07, d08);
681 sort_01v_merge_ascending(d09);
683 static INLINE void sort_09v_descending(__m256i& d01, __m256i& d02, __m256i& d03, __m256i& d04, __m256i& d05, __m256i& d06, __m256i& d07, __m256i& d08, __m256i& d09) {
686 sort_08v_descending(d01, d02, d03, d04, d05, d06, d07, d08);
687 sort_01v_ascending(d09);
691 d09 = _mm256_max_epi32(d08, d09);
692 d08 = _mm256_min_epi32(d08, tmp);
694 sort_08v_merge_descending(d01, d02, d03, d04, d05, d06, d07, d08);
695 sort_01v_merge_descending(d09);
697 static INLINE void sort_10v_ascending(__m256i& d01, __m256i& d02, __m256i& d03, __m256i& d04, __m256i& d05, __m256i& d06, __m256i& d07, __m256i& d08, __m256i& d09, __m256i& d10) {
700 sort_08v_ascending(d01, d02, d03, d04, d05, d06, d07, d08);
701 sort_02v_descending(d09, d10);
705 d09 = _mm256_max_epi32(d08, d09);
706 d08 = _mm256_min_epi32(d08, tmp);
710 d10 = _mm256_max_epi32(d07, d10);
711 d07 = _mm256_min_epi32(d07, tmp);
713 sort_08v_merge_ascending(d01, d02, d03, d04, d05, d06, d07, d08);
714 sort_02v_merge_ascending(d09, d10);
716 static INLINE void sort_10v_descending(__m256i& d01, __m256i& d02, __m256i& d03, __m256i& d04, __m256i& d05, __m256i& d06, __m256i& d07, __m256i& d08, __m256i& d09, __m256i& d10) {
719 sort_08v_descending(d01, d02, d03, d04, d05, d06, d07, d08);
720 sort_02v_ascending(d09, d10);
724 d09 = _mm256_max_epi32(d08, d09);
725 d08 = _mm256_min_epi32(d08, tmp);
729 d10 = _mm256_max_epi32(d07, d10);
730 d07 = _mm256_min_epi32(d07, tmp);
732 sort_08v_merge_descending(d01, d02, d03, d04, d05, d06, d07, d08);
733 sort_02v_merge_descending(d09, d10);
735 static INLINE void sort_11v_ascending(__m256i& d01, __m256i& d02, __m256i& d03, __m256i& d04, __m256i& d05, __m256i& d06, __m256i& d07, __m256i& d08, __m256i& d09, __m256i& d10, __m256i& d11) {
738 sort_08v_ascending(d01, d02, d03, d04, d05, d06, d07, d08);
739 sort_03v_descending(d09, d10, d11);
743 d09 = _mm256_max_epi32(d08, d09);
744 d08 = _mm256_min_epi32(d08, tmp);
748 d10 = _mm256_max_epi32(d07, d10);
749 d07 = _mm256_min_epi32(d07, tmp);
753 d11 = _mm256_max_epi32(d06, d11);
754 d06 = _mm256_min_epi32(d06, tmp);
756 sort_08v_merge_ascending(d01, d02, d03, d04, d05, d06, d07, d08);
757 sort_03v_merge_ascending(d09, d10, d11);
759 static INLINE void sort_11v_descending(__m256i& d01, __m256i& d02, __m256i& d03, __m256i& d04, __m256i& d05, __m256i& d06, __m256i& d07, __m256i& d08, __m256i& d09, __m256i& d10, __m256i& d11) {
762 sort_08v_descending(d01, d02, d03, d04, d05, d06, d07, d08);
763 sort_03v_ascending(d09, d10, d11);
767 d09 = _mm256_max_epi32(d08, d09);
768 d08 = _mm256_min_epi32(d08, tmp);
772 d10 = _mm256_max_epi32(d07, d10);
773 d07 = _mm256_min_epi32(d07, tmp);
777 d11 = _mm256_max_epi32(d06, d11);
778 d06 = _mm256_min_epi32(d06, tmp);
780 sort_08v_merge_descending(d01, d02, d03, d04, d05, d06, d07, d08);
781 sort_03v_merge_descending(d09, d10, d11);
783 static INLINE void sort_12v_ascending(__m256i& d01, __m256i& d02, __m256i& d03, __m256i& d04, __m256i& d05, __m256i& d06, __m256i& d07, __m256i& d08, __m256i& d09, __m256i& d10, __m256i& d11, __m256i& d12) {
786 sort_08v_ascending(d01, d02, d03, d04, d05, d06, d07, d08);
787 sort_04v_descending(d09, d10, d11, d12);
791 d09 = _mm256_max_epi32(d08, d09);
792 d08 = _mm256_min_epi32(d08, tmp);
796 d10 = _mm256_max_epi32(d07, d10);
797 d07 = _mm256_min_epi32(d07, tmp);
801 d11 = _mm256_max_epi32(d06, d11);
802 d06 = _mm256_min_epi32(d06, tmp);
806 d12 = _mm256_max_epi32(d05, d12);
807 d05 = _mm256_min_epi32(d05, tmp);
809 sort_08v_merge_ascending(d01, d02, d03, d04, d05, d06, d07, d08);
810 sort_04v_merge_ascending(d09, d10, d11, d12);
812 static INLINE void sort_12v_descending(__m256i& d01, __m256i& d02, __m256i& d03, __m256i& d04, __m256i& d05, __m256i& d06, __m256i& d07, __m256i& d08, __m256i& d09, __m256i& d10, __m256i& d11, __m256i& d12) {
815 sort_08v_descending(d01, d02, d03, d04, d05, d06, d07, d08);
816 sort_04v_ascending(d09, d10, d11, d12);
820 d09 = _mm256_max_epi32(d08, d09);
821 d08 = _mm256_min_epi32(d08, tmp);
825 d10 = _mm256_max_epi32(d07, d10);
826 d07 = _mm256_min_epi32(d07, tmp);
830 d11 = _mm256_max_epi32(d06, d11);
831 d06 = _mm256_min_epi32(d06, tmp);
835 d12 = _mm256_max_epi32(d05, d12);
836 d05 = _mm256_min_epi32(d05, tmp);
838 sort_08v_merge_descending(d01, d02, d03, d04, d05, d06, d07, d08);
839 sort_04v_merge_descending(d09, d10, d11, d12);
841 static INLINE void sort_13v_ascending(__m256i& d01, __m256i& d02, __m256i& d03, __m256i& d04, __m256i& d05, __m256i& d06, __m256i& d07, __m256i& d08, __m256i& d09, __m256i& d10, __m256i& d11, __m256i& d12, __m256i& d13) {
844 sort_08v_ascending(d01, d02, d03, d04, d05, d06, d07, d08);
845 sort_05v_descending(d09, d10, d11, d12, d13);
849 d09 = _mm256_max_epi32(d08, d09);
850 d08 = _mm256_min_epi32(d08, tmp);
854 d10 = _mm256_max_epi32(d07, d10);
855 d07 = _mm256_min_epi32(d07, tmp);
859 d11 = _mm256_max_epi32(d06, d11);
860 d06 = _mm256_min_epi32(d06, tmp);
864 d12 = _mm256_max_epi32(d05, d12);
865 d05 = _mm256_min_epi32(d05, tmp);
869 d13 = _mm256_max_epi32(d04, d13);
870 d04 = _mm256_min_epi32(d04, tmp);
872 sort_08v_merge_ascending(d01, d02, d03, d04, d05, d06, d07, d08);
873 sort_05v_merge_ascending(d09, d10, d11, d12, d13);
875 static INLINE void sort_13v_descending(__m256i& d01, __m256i& d02, __m256i& d03, __m256i& d04, __m256i& d05, __m256i& d06, __m256i& d07, __m256i& d08, __m256i& d09, __m256i& d10, __m256i& d11, __m256i& d12, __m256i& d13) {
878 sort_08v_descending(d01, d02, d03, d04, d05, d06, d07, d08);
879 sort_05v_ascending(d09, d10, d11, d12, d13);
883 d09 = _mm256_max_epi32(d08, d09);
884 d08 = _mm256_min_epi32(d08, tmp);
888 d10 = _mm256_max_epi32(d07, d10);
889 d07 = _mm256_min_epi32(d07, tmp);
893 d11 = _mm256_max_epi32(d06, d11);
894 d06 = _mm256_min_epi32(d06, tmp);
898 d12 = _mm256_max_epi32(d05, d12);
899 d05 = _mm256_min_epi32(d05, tmp);
903 d13 = _mm256_max_epi32(d04, d13);
904 d04 = _mm256_min_epi32(d04, tmp);
906 sort_08v_merge_descending(d01, d02, d03, d04, d05, d06, d07, d08);
907 sort_05v_merge_descending(d09, d10, d11, d12, d13);
909 static INLINE void sort_14v_ascending(__m256i& d01, __m256i& d02, __m256i& d03, __m256i& d04, __m256i& d05, __m256i& d06, __m256i& d07, __m256i& d08, __m256i& d09, __m256i& d10, __m256i& d11, __m256i& d12, __m256i& d13, __m256i& d14) {
912 sort_08v_ascending(d01, d02, d03, d04, d05, d06, d07, d08);
913 sort_06v_descending(d09, d10, d11, d12, d13, d14);
917 d09 = _mm256_max_epi32(d08, d09);
918 d08 = _mm256_min_epi32(d08, tmp);
922 d10 = _mm256_max_epi32(d07, d10);
923 d07 = _mm256_min_epi32(d07, tmp);
927 d11 = _mm256_max_epi32(d06, d11);
928 d06 = _mm256_min_epi32(d06, tmp);
932 d12 = _mm256_max_epi32(d05, d12);
933 d05 = _mm256_min_epi32(d05, tmp);
937 d13 = _mm256_max_epi32(d04, d13);
938 d04 = _mm256_min_epi32(d04, tmp);
942 d14 = _mm256_max_epi32(d03, d14);
943 d03 = _mm256_min_epi32(d03, tmp);
945 sort_08v_merge_ascending(d01, d02, d03, d04, d05, d06, d07, d08);
946 sort_06v_merge_ascending(d09, d10, d11, d12, d13, d14);
948 static INLINE void sort_14v_descending(__m256i& d01, __m256i& d02, __m256i& d03, __m256i& d04, __m256i& d05, __m256i& d06, __m256i& d07, __m256i& d08, __m256i& d09, __m256i& d10, __m256i& d11, __m256i& d12, __m256i& d13, __m256i& d14) {
951 sort_08v_descending(d01, d02, d03, d04, d05, d06, d07, d08);
952 sort_06v_ascending(d09, d10, d11, d12, d13, d14);
956 d09 = _mm256_max_epi32(d08, d09);
957 d08 = _mm256_min_epi32(d08, tmp);
961 d10 = _mm256_max_epi32(d07, d10);
962 d07 = _mm256_min_epi32(d07, tmp);
966 d11 = _mm256_max_epi32(d06, d11);
967 d06 = _mm256_min_epi32(d06, tmp);
971 d12 = _mm256_max_epi32(d05, d12);
972 d05 = _mm256_min_epi32(d05, tmp);
976 d13 = _mm256_max_epi32(d04, d13);
977 d04 = _mm256_min_epi32(d04, tmp);
981 d14 = _mm256_max_epi32(d03, d14);
982 d03 = _mm256_min_epi32(d03, tmp);
984 sort_08v_merge_descending(d01, d02, d03, d04, d05, d06, d07, d08);
985 sort_06v_merge_descending(d09, d10, d11, d12, d13, d14);
987 static INLINE void sort_15v_ascending(__m256i& d01, __m256i& d02, __m256i& d03, __m256i& d04, __m256i& d05, __m256i& d06, __m256i& d07, __m256i& d08, __m256i& d09, __m256i& d10, __m256i& d11, __m256i& d12, __m256i& d13, __m256i& d14, __m256i& d15) {
990 sort_08v_ascending(d01, d02, d03, d04, d05, d06, d07, d08);
991 sort_07v_descending(d09, d10, d11, d12, d13, d14, d15);
995 d09 = _mm256_max_epi32(d08, d09);
996 d08 = _mm256_min_epi32(d08, tmp);
1000 d10 = _mm256_max_epi32(d07, d10);
1001 d07 = _mm256_min_epi32(d07, tmp);
1005 d11 = _mm256_max_epi32(d06, d11);
1006 d06 = _mm256_min_epi32(d06, tmp);
1010 d12 = _mm256_max_epi32(d05, d12);
1011 d05 = _mm256_min_epi32(d05, tmp);
1015 d13 = _mm256_max_epi32(d04, d13);
1016 d04 = _mm256_min_epi32(d04, tmp);
1020 d14 = _mm256_max_epi32(d03, d14);
1021 d03 = _mm256_min_epi32(d03, tmp);
1025 d15 = _mm256_max_epi32(d02, d15);
1026 d02 = _mm256_min_epi32(d02, tmp);
1028 sort_08v_merge_ascending(d01, d02, d03, d04, d05, d06, d07, d08);
1029 sort_07v_merge_ascending(d09, d10, d11, d12, d13, d14, d15);
1031 static INLINE void sort_15v_descending(__m256i& d01, __m256i& d02, __m256i& d03, __m256i& d04, __m256i& d05, __m256i& d06, __m256i& d07, __m256i& d08, __m256i& d09, __m256i& d10, __m256i& d11, __m256i& d12, __m256i& d13, __m256i& d14, __m256i& d15) {
1034 sort_08v_descending(d01, d02, d03, d04, d05, d06, d07, d08);
1035 sort_07v_ascending(d09, d10, d11, d12, d13, d14, d15);
1039 d09 = _mm256_max_epi32(d08, d09);
1040 d08 = _mm256_min_epi32(d08, tmp);
1044 d10 = _mm256_max_epi32(d07, d10);
1045 d07 = _mm256_min_epi32(d07, tmp);
1049 d11 = _mm256_max_epi32(d06, d11);
1050 d06 = _mm256_min_epi32(d06, tmp);
1054 d12 = _mm256_max_epi32(d05, d12);
1055 d05 = _mm256_min_epi32(d05, tmp);
1059 d13 = _mm256_max_epi32(d04, d13);
1060 d04 = _mm256_min_epi32(d04, tmp);
1064 d14 = _mm256_max_epi32(d03, d14);
1065 d03 = _mm256_min_epi32(d03, tmp);
1069 d15 = _mm256_max_epi32(d02, d15);
1070 d02 = _mm256_min_epi32(d02, tmp);
1072 sort_08v_merge_descending(d01, d02, d03, d04, d05, d06, d07, d08);
1073 sort_07v_merge_descending(d09, d10, d11, d12, d13, d14, d15);
1075 static INLINE void sort_16v_ascending(__m256i& d01, __m256i& d02, __m256i& d03, __m256i& d04, __m256i& d05, __m256i& d06, __m256i& d07, __m256i& d08, __m256i& d09, __m256i& d10, __m256i& d11, __m256i& d12, __m256i& d13, __m256i& d14, __m256i& d15, __m256i& d16) {
1078 sort_08v_ascending(d01, d02, d03, d04, d05, d06, d07, d08);
1079 sort_08v_descending(d09, d10, d11, d12, d13, d14, d15, d16);
1083 d09 = _mm256_max_epi32(d08, d09);
1084 d08 = _mm256_min_epi32(d08, tmp);
1088 d10 = _mm256_max_epi32(d07, d10);
1089 d07 = _mm256_min_epi32(d07, tmp);
1093 d11 = _mm256_max_epi32(d06, d11);
1094 d06 = _mm256_min_epi32(d06, tmp);
1098 d12 = _mm256_max_epi32(d05, d12);
1099 d05 = _mm256_min_epi32(d05, tmp);
1103 d13 = _mm256_max_epi32(d04, d13);
1104 d04 = _mm256_min_epi32(d04, tmp);
1108 d14 = _mm256_max_epi32(d03, d14);
1109 d03 = _mm256_min_epi32(d03, tmp);
1113 d15 = _mm256_max_epi32(d02, d15);
1114 d02 = _mm256_min_epi32(d02, tmp);
1118 d16 = _mm256_max_epi32(d01, d16);
1119 d01 = _mm256_min_epi32(d01, tmp);
1121 sort_08v_merge_ascending(d01, d02, d03, d04, d05, d06, d07, d08);
1122 sort_08v_merge_ascending(d09, d10, d11, d12, d13, d14, d15, d16);
1124 static INLINE void sort_16v_descending(__m256i& d01, __m256i& d02, __m256i& d03, __m256i& d04, __m256i& d05, __m256i& d06, __m256i& d07, __m256i& d08, __m256i& d09, __m256i& d10, __m256i& d11, __m256i& d12, __m256i& d13, __m256i& d14, __m256i& d15, __m256i& d16) {
1127 sort_08v_descending(d01, d02, d03, d04, d05, d06, d07, d08);
1128 sort_08v_ascending(d09, d10, d11, d12, d13, d14, d15, d16);
1132 d09 = _mm256_max_epi32(d08, d09);
1133 d08 = _mm256_min_epi32(d08, tmp);
1137 d10 = _mm256_max_epi32(d07, d10);
1138 d07 = _mm256_min_epi32(d07, tmp);
1142 d11 = _mm256_max_epi32(d06, d11);
1143 d06 = _mm256_min_epi32(d06, tmp);
1147 d12 = _mm256_max_epi32(d05, d12);
1148 d05 = _mm256_min_epi32(d05, tmp);
1152 d13 = _mm256_max_epi32(d04, d13);
1153 d04 = _mm256_min_epi32(d04, tmp);
1157 d14 = _mm256_max_epi32(d03, d14);
1158 d03 = _mm256_min_epi32(d03, tmp);
1162 d15 = _mm256_max_epi32(d02, d15);
1163 d02 = _mm256_min_epi32(d02, tmp);
1167 d16 = _mm256_max_epi32(d01, d16);
1168 d01 = _mm256_min_epi32(d01, tmp);
1170 sort_08v_merge_descending(d01, d02, d03, d04, d05, d06, d07, d08);
1171 sort_08v_merge_descending(d09, d10, d11, d12, d13, d14, d15, d16);
1174 static NOINLINE void sort_01v(int32_t *ptr) {
1175 __m256i d01 = _mm256_lddqu_si256((__m256i const *) ptr + 0);;
1176 sort_01v_ascending(d01);
1177 _mm256_storeu_si256((__m256i *) ptr + 0, d01);
1180 static NOINLINE void sort_02v(int32_t *ptr) {
1181 __m256i d01 = _mm256_lddqu_si256((__m256i const *) ptr + 0);;
1182 __m256i d02 = _mm256_lddqu_si256((__m256i const *) ptr + 1);;
1183 sort_02v_ascending(d01, d02);
1184 _mm256_storeu_si256((__m256i *) ptr + 0, d01);
1185 _mm256_storeu_si256((__m256i *) ptr + 1, d02);
1188 static NOINLINE void sort_03v(int32_t *ptr) {
1189 __m256i d01 = _mm256_lddqu_si256((__m256i const *) ptr + 0);;
1190 __m256i d02 = _mm256_lddqu_si256((__m256i const *) ptr + 1);;
1191 __m256i d03 = _mm256_lddqu_si256((__m256i const *) ptr + 2);;
1192 sort_03v_ascending(d01, d02, d03);
1193 _mm256_storeu_si256((__m256i *) ptr + 0, d01);
1194 _mm256_storeu_si256((__m256i *) ptr + 1, d02);
1195 _mm256_storeu_si256((__m256i *) ptr + 2, d03);
1198 static NOINLINE void sort_04v(int32_t *ptr) {
1199 __m256i d01 = _mm256_lddqu_si256((__m256i const *) ptr + 0);;
1200 __m256i d02 = _mm256_lddqu_si256((__m256i const *) ptr + 1);;
1201 __m256i d03 = _mm256_lddqu_si256((__m256i const *) ptr + 2);;
1202 __m256i d04 = _mm256_lddqu_si256((__m256i const *) ptr + 3);;
1203 sort_04v_ascending(d01, d02, d03, d04);
1204 _mm256_storeu_si256((__m256i *) ptr + 0, d01);
1205 _mm256_storeu_si256((__m256i *) ptr + 1, d02);
1206 _mm256_storeu_si256((__m256i *) ptr + 2, d03);
1207 _mm256_storeu_si256((__m256i *) ptr + 3, d04);
1210 static NOINLINE void sort_05v(int32_t *ptr) {
1211 __m256i d01 = _mm256_lddqu_si256((__m256i const *) ptr + 0);;
1212 __m256i d02 = _mm256_lddqu_si256((__m256i const *) ptr + 1);;
1213 __m256i d03 = _mm256_lddqu_si256((__m256i const *) ptr + 2);;
1214 __m256i d04 = _mm256_lddqu_si256((__m256i const *) ptr + 3);;
1215 __m256i d05 = _mm256_lddqu_si256((__m256i const *) ptr + 4);;
1216 sort_05v_ascending(d01, d02, d03, d04, d05);
1217 _mm256_storeu_si256((__m256i *) ptr + 0, d01);
1218 _mm256_storeu_si256((__m256i *) ptr + 1, d02);
1219 _mm256_storeu_si256((__m256i *) ptr + 2, d03);
1220 _mm256_storeu_si256((__m256i *) ptr + 3, d04);
1221 _mm256_storeu_si256((__m256i *) ptr + 4, d05);
1224 static NOINLINE void sort_06v(int32_t *ptr) {
1225 __m256i d01 = _mm256_lddqu_si256((__m256i const *) ptr + 0);;
1226 __m256i d02 = _mm256_lddqu_si256((__m256i const *) ptr + 1);;
1227 __m256i d03 = _mm256_lddqu_si256((__m256i const *) ptr + 2);;
1228 __m256i d04 = _mm256_lddqu_si256((__m256i const *) ptr + 3);;
1229 __m256i d05 = _mm256_lddqu_si256((__m256i const *) ptr + 4);;
1230 __m256i d06 = _mm256_lddqu_si256((__m256i const *) ptr + 5);;
1231 sort_06v_ascending(d01, d02, d03, d04, d05, d06);
1232 _mm256_storeu_si256((__m256i *) ptr + 0, d01);
1233 _mm256_storeu_si256((__m256i *) ptr + 1, d02);
1234 _mm256_storeu_si256((__m256i *) ptr + 2, d03);
1235 _mm256_storeu_si256((__m256i *) ptr + 3, d04);
1236 _mm256_storeu_si256((__m256i *) ptr + 4, d05);
1237 _mm256_storeu_si256((__m256i *) ptr + 5, d06);
1240 static NOINLINE void sort_07v(int32_t *ptr) {
1241 __m256i d01 = _mm256_lddqu_si256((__m256i const *) ptr + 0);;
1242 __m256i d02 = _mm256_lddqu_si256((__m256i const *) ptr + 1);;
1243 __m256i d03 = _mm256_lddqu_si256((__m256i const *) ptr + 2);;
1244 __m256i d04 = _mm256_lddqu_si256((__m256i const *) ptr + 3);;
1245 __m256i d05 = _mm256_lddqu_si256((__m256i const *) ptr + 4);;
1246 __m256i d06 = _mm256_lddqu_si256((__m256i const *) ptr + 5);;
1247 __m256i d07 = _mm256_lddqu_si256((__m256i const *) ptr + 6);;
1248 sort_07v_ascending(d01, d02, d03, d04, d05, d06, d07);
1249 _mm256_storeu_si256((__m256i *) ptr + 0, d01);
1250 _mm256_storeu_si256((__m256i *) ptr + 1, d02);
1251 _mm256_storeu_si256((__m256i *) ptr + 2, d03);
1252 _mm256_storeu_si256((__m256i *) ptr + 3, d04);
1253 _mm256_storeu_si256((__m256i *) ptr + 4, d05);
1254 _mm256_storeu_si256((__m256i *) ptr + 5, d06);
1255 _mm256_storeu_si256((__m256i *) ptr + 6, d07);
1258 static NOINLINE void sort_08v(int32_t *ptr) {
1259 __m256i d01 = _mm256_lddqu_si256((__m256i const *) ptr + 0);;
1260 __m256i d02 = _mm256_lddqu_si256((__m256i const *) ptr + 1);;
1261 __m256i d03 = _mm256_lddqu_si256((__m256i const *) ptr + 2);;
1262 __m256i d04 = _mm256_lddqu_si256((__m256i const *) ptr + 3);;
1263 __m256i d05 = _mm256_lddqu_si256((__m256i const *) ptr + 4);;
1264 __m256i d06 = _mm256_lddqu_si256((__m256i const *) ptr + 5);;
1265 __m256i d07 = _mm256_lddqu_si256((__m256i const *) ptr + 6);;
1266 __m256i d08 = _mm256_lddqu_si256((__m256i const *) ptr + 7);;
1267 sort_08v_ascending(d01, d02, d03, d04, d05, d06, d07, d08);
1268 _mm256_storeu_si256((__m256i *) ptr + 0, d01);
1269 _mm256_storeu_si256((__m256i *) ptr + 1, d02);
1270 _mm256_storeu_si256((__m256i *) ptr + 2, d03);
1271 _mm256_storeu_si256((__m256i *) ptr + 3, d04);
1272 _mm256_storeu_si256((__m256i *) ptr + 4, d05);
1273 _mm256_storeu_si256((__m256i *) ptr + 5, d06);
1274 _mm256_storeu_si256((__m256i *) ptr + 6, d07);
1275 _mm256_storeu_si256((__m256i *) ptr + 7, d08);
1278 static NOINLINE void sort_09v(int32_t *ptr) {
1279 __m256i d01 = _mm256_lddqu_si256((__m256i const *) ptr + 0);;
1280 __m256i d02 = _mm256_lddqu_si256((__m256i const *) ptr + 1);;
1281 __m256i d03 = _mm256_lddqu_si256((__m256i const *) ptr + 2);;
1282 __m256i d04 = _mm256_lddqu_si256((__m256i const *) ptr + 3);;
1283 __m256i d05 = _mm256_lddqu_si256((__m256i const *) ptr + 4);;
1284 __m256i d06 = _mm256_lddqu_si256((__m256i const *) ptr + 5);;
1285 __m256i d07 = _mm256_lddqu_si256((__m256i const *) ptr + 6);;
1286 __m256i d08 = _mm256_lddqu_si256((__m256i const *) ptr + 7);;
1287 __m256i d09 = _mm256_lddqu_si256((__m256i const *) ptr + 8);;
1288 sort_09v_ascending(d01, d02, d03, d04, d05, d06, d07, d08, d09);
1289 _mm256_storeu_si256((__m256i *) ptr + 0, d01);
1290 _mm256_storeu_si256((__m256i *) ptr + 1, d02);
1291 _mm256_storeu_si256((__m256i *) ptr + 2, d03);
1292 _mm256_storeu_si256((__m256i *) ptr + 3, d04);
1293 _mm256_storeu_si256((__m256i *) ptr + 4, d05);
1294 _mm256_storeu_si256((__m256i *) ptr + 5, d06);
1295 _mm256_storeu_si256((__m256i *) ptr + 6, d07);
1296 _mm256_storeu_si256((__m256i *) ptr + 7, d08);
1297 _mm256_storeu_si256((__m256i *) ptr + 8, d09);
1300 static NOINLINE void sort_10v(int32_t *ptr) {
1301 __m256i d01 = _mm256_lddqu_si256((__m256i const *) ptr + 0);;
1302 __m256i d02 = _mm256_lddqu_si256((__m256i const *) ptr + 1);;
1303 __m256i d03 = _mm256_lddqu_si256((__m256i const *) ptr + 2);;
1304 __m256i d04 = _mm256_lddqu_si256((__m256i const *) ptr + 3);;
1305 __m256i d05 = _mm256_lddqu_si256((__m256i const *) ptr + 4);;
1306 __m256i d06 = _mm256_lddqu_si256((__m256i const *) ptr + 5);;
1307 __m256i d07 = _mm256_lddqu_si256((__m256i const *) ptr + 6);;
1308 __m256i d08 = _mm256_lddqu_si256((__m256i const *) ptr + 7);;
1309 __m256i d09 = _mm256_lddqu_si256((__m256i const *) ptr + 8);;
1310 __m256i d10 = _mm256_lddqu_si256((__m256i const *) ptr + 9);;
1311 sort_10v_ascending(d01, d02, d03, d04, d05, d06, d07, d08, d09, d10);
1312 _mm256_storeu_si256((__m256i *) ptr + 0, d01);
1313 _mm256_storeu_si256((__m256i *) ptr + 1, d02);
1314 _mm256_storeu_si256((__m256i *) ptr + 2, d03);
1315 _mm256_storeu_si256((__m256i *) ptr + 3, d04);
1316 _mm256_storeu_si256((__m256i *) ptr + 4, d05);
1317 _mm256_storeu_si256((__m256i *) ptr + 5, d06);
1318 _mm256_storeu_si256((__m256i *) ptr + 6, d07);
1319 _mm256_storeu_si256((__m256i *) ptr + 7, d08);
1320 _mm256_storeu_si256((__m256i *) ptr + 8, d09);
1321 _mm256_storeu_si256((__m256i *) ptr + 9, d10);
1324 static NOINLINE void sort_11v(int32_t *ptr) {
1325 __m256i d01 = _mm256_lddqu_si256((__m256i const *) ptr + 0);;
1326 __m256i d02 = _mm256_lddqu_si256((__m256i const *) ptr + 1);;
1327 __m256i d03 = _mm256_lddqu_si256((__m256i const *) ptr + 2);;
1328 __m256i d04 = _mm256_lddqu_si256((__m256i const *) ptr + 3);;
1329 __m256i d05 = _mm256_lddqu_si256((__m256i const *) ptr + 4);;
1330 __m256i d06 = _mm256_lddqu_si256((__m256i const *) ptr + 5);;
1331 __m256i d07 = _mm256_lddqu_si256((__m256i const *) ptr + 6);;
1332 __m256i d08 = _mm256_lddqu_si256((__m256i const *) ptr + 7);;
1333 __m256i d09 = _mm256_lddqu_si256((__m256i const *) ptr + 8);;
1334 __m256i d10 = _mm256_lddqu_si256((__m256i const *) ptr + 9);;
1335 __m256i d11 = _mm256_lddqu_si256((__m256i const *) ptr + 10);;
1336 sort_11v_ascending(d01, d02, d03, d04, d05, d06, d07, d08, d09, d10, d11);
1337 _mm256_storeu_si256((__m256i *) ptr + 0, d01);
1338 _mm256_storeu_si256((__m256i *) ptr + 1, d02);
1339 _mm256_storeu_si256((__m256i *) ptr + 2, d03);
1340 _mm256_storeu_si256((__m256i *) ptr + 3, d04);
1341 _mm256_storeu_si256((__m256i *) ptr + 4, d05);
1342 _mm256_storeu_si256((__m256i *) ptr + 5, d06);
1343 _mm256_storeu_si256((__m256i *) ptr + 6, d07);
1344 _mm256_storeu_si256((__m256i *) ptr + 7, d08);
1345 _mm256_storeu_si256((__m256i *) ptr + 8, d09);
1346 _mm256_storeu_si256((__m256i *) ptr + 9, d10);
1347 _mm256_storeu_si256((__m256i *) ptr + 10, d11);
1350 static NOINLINE void sort_12v(int32_t *ptr) {
1351 __m256i d01 = _mm256_lddqu_si256((__m256i const *) ptr + 0);;
1352 __m256i d02 = _mm256_lddqu_si256((__m256i const *) ptr + 1);;
1353 __m256i d03 = _mm256_lddqu_si256((__m256i const *) ptr + 2);;
1354 __m256i d04 = _mm256_lddqu_si256((__m256i const *) ptr + 3);;
1355 __m256i d05 = _mm256_lddqu_si256((__m256i const *) ptr + 4);;
1356 __m256i d06 = _mm256_lddqu_si256((__m256i const *) ptr + 5);;
1357 __m256i d07 = _mm256_lddqu_si256((__m256i const *) ptr + 6);;
1358 __m256i d08 = _mm256_lddqu_si256((__m256i const *) ptr + 7);;
1359 __m256i d09 = _mm256_lddqu_si256((__m256i const *) ptr + 8);;
1360 __m256i d10 = _mm256_lddqu_si256((__m256i const *) ptr + 9);;
1361 __m256i d11 = _mm256_lddqu_si256((__m256i const *) ptr + 10);;
1362 __m256i d12 = _mm256_lddqu_si256((__m256i const *) ptr + 11);;
1363 sort_12v_ascending(d01, d02, d03, d04, d05, d06, d07, d08, d09, d10, d11, d12);
1364 _mm256_storeu_si256((__m256i *) ptr + 0, d01);
1365 _mm256_storeu_si256((__m256i *) ptr + 1, d02);
1366 _mm256_storeu_si256((__m256i *) ptr + 2, d03);
1367 _mm256_storeu_si256((__m256i *) ptr + 3, d04);
1368 _mm256_storeu_si256((__m256i *) ptr + 4, d05);
1369 _mm256_storeu_si256((__m256i *) ptr + 5, d06);
1370 _mm256_storeu_si256((__m256i *) ptr + 6, d07);
1371 _mm256_storeu_si256((__m256i *) ptr + 7, d08);
1372 _mm256_storeu_si256((__m256i *) ptr + 8, d09);
1373 _mm256_storeu_si256((__m256i *) ptr + 9, d10);
1374 _mm256_storeu_si256((__m256i *) ptr + 10, d11);
1375 _mm256_storeu_si256((__m256i *) ptr + 11, d12);
1378 static NOINLINE void sort_13v(int32_t *ptr) {
1379 __m256i d01 = _mm256_lddqu_si256((__m256i const *) ptr + 0);;
1380 __m256i d02 = _mm256_lddqu_si256((__m256i const *) ptr + 1);;
1381 __m256i d03 = _mm256_lddqu_si256((__m256i const *) ptr + 2);;
1382 __m256i d04 = _mm256_lddqu_si256((__m256i const *) ptr + 3);;
1383 __m256i d05 = _mm256_lddqu_si256((__m256i const *) ptr + 4);;
1384 __m256i d06 = _mm256_lddqu_si256((__m256i const *) ptr + 5);;
1385 __m256i d07 = _mm256_lddqu_si256((__m256i const *) ptr + 6);;
1386 __m256i d08 = _mm256_lddqu_si256((__m256i const *) ptr + 7);;
1387 __m256i d09 = _mm256_lddqu_si256((__m256i const *) ptr + 8);;
1388 __m256i d10 = _mm256_lddqu_si256((__m256i const *) ptr + 9);;
1389 __m256i d11 = _mm256_lddqu_si256((__m256i const *) ptr + 10);;
1390 __m256i d12 = _mm256_lddqu_si256((__m256i const *) ptr + 11);;
1391 __m256i d13 = _mm256_lddqu_si256((__m256i const *) ptr + 12);;
1392 sort_13v_ascending(d01, d02, d03, d04, d05, d06, d07, d08, d09, d10, d11, d12, d13);
1393 _mm256_storeu_si256((__m256i *) ptr + 0, d01);
1394 _mm256_storeu_si256((__m256i *) ptr + 1, d02);
1395 _mm256_storeu_si256((__m256i *) ptr + 2, d03);
1396 _mm256_storeu_si256((__m256i *) ptr + 3, d04);
1397 _mm256_storeu_si256((__m256i *) ptr + 4, d05);
1398 _mm256_storeu_si256((__m256i *) ptr + 5, d06);
1399 _mm256_storeu_si256((__m256i *) ptr + 6, d07);
1400 _mm256_storeu_si256((__m256i *) ptr + 7, d08);
1401 _mm256_storeu_si256((__m256i *) ptr + 8, d09);
1402 _mm256_storeu_si256((__m256i *) ptr + 9, d10);
1403 _mm256_storeu_si256((__m256i *) ptr + 10, d11);
1404 _mm256_storeu_si256((__m256i *) ptr + 11, d12);
1405 _mm256_storeu_si256((__m256i *) ptr + 12, d13);
1408 static NOINLINE void sort_14v(int32_t *ptr) {
1409 __m256i d01 = _mm256_lddqu_si256((__m256i const *) ptr + 0);;
1410 __m256i d02 = _mm256_lddqu_si256((__m256i const *) ptr + 1);;
1411 __m256i d03 = _mm256_lddqu_si256((__m256i const *) ptr + 2);;
1412 __m256i d04 = _mm256_lddqu_si256((__m256i const *) ptr + 3);;
1413 __m256i d05 = _mm256_lddqu_si256((__m256i const *) ptr + 4);;
1414 __m256i d06 = _mm256_lddqu_si256((__m256i const *) ptr + 5);;
1415 __m256i d07 = _mm256_lddqu_si256((__m256i const *) ptr + 6);;
1416 __m256i d08 = _mm256_lddqu_si256((__m256i const *) ptr + 7);;
1417 __m256i d09 = _mm256_lddqu_si256((__m256i const *) ptr + 8);;
1418 __m256i d10 = _mm256_lddqu_si256((__m256i const *) ptr + 9);;
1419 __m256i d11 = _mm256_lddqu_si256((__m256i const *) ptr + 10);;
1420 __m256i d12 = _mm256_lddqu_si256((__m256i const *) ptr + 11);;
1421 __m256i d13 = _mm256_lddqu_si256((__m256i const *) ptr + 12);;
1422 __m256i d14 = _mm256_lddqu_si256((__m256i const *) ptr + 13);;
1423 sort_14v_ascending(d01, d02, d03, d04, d05, d06, d07, d08, d09, d10, d11, d12, d13, d14);
1424 _mm256_storeu_si256((__m256i *) ptr + 0, d01);
1425 _mm256_storeu_si256((__m256i *) ptr + 1, d02);
1426 _mm256_storeu_si256((__m256i *) ptr + 2, d03);
1427 _mm256_storeu_si256((__m256i *) ptr + 3, d04);
1428 _mm256_storeu_si256((__m256i *) ptr + 4, d05);
1429 _mm256_storeu_si256((__m256i *) ptr + 5, d06);
1430 _mm256_storeu_si256((__m256i *) ptr + 6, d07);
1431 _mm256_storeu_si256((__m256i *) ptr + 7, d08);
1432 _mm256_storeu_si256((__m256i *) ptr + 8, d09);
1433 _mm256_storeu_si256((__m256i *) ptr + 9, d10);
1434 _mm256_storeu_si256((__m256i *) ptr + 10, d11);
1435 _mm256_storeu_si256((__m256i *) ptr + 11, d12);
1436 _mm256_storeu_si256((__m256i *) ptr + 12, d13);
1437 _mm256_storeu_si256((__m256i *) ptr + 13, d14);
1440 static NOINLINE void sort_15v(int32_t *ptr) {
1441 __m256i d01 = _mm256_lddqu_si256((__m256i const *) ptr + 0);;
1442 __m256i d02 = _mm256_lddqu_si256((__m256i const *) ptr + 1);;
1443 __m256i d03 = _mm256_lddqu_si256((__m256i const *) ptr + 2);;
1444 __m256i d04 = _mm256_lddqu_si256((__m256i const *) ptr + 3);;
1445 __m256i d05 = _mm256_lddqu_si256((__m256i const *) ptr + 4);;
1446 __m256i d06 = _mm256_lddqu_si256((__m256i const *) ptr + 5);;
1447 __m256i d07 = _mm256_lddqu_si256((__m256i const *) ptr + 6);;
1448 __m256i d08 = _mm256_lddqu_si256((__m256i const *) ptr + 7);;
1449 __m256i d09 = _mm256_lddqu_si256((__m256i const *) ptr + 8);;
1450 __m256i d10 = _mm256_lddqu_si256((__m256i const *) ptr + 9);;
1451 __m256i d11 = _mm256_lddqu_si256((__m256i const *) ptr + 10);;
1452 __m256i d12 = _mm256_lddqu_si256((__m256i const *) ptr + 11);;
1453 __m256i d13 = _mm256_lddqu_si256((__m256i const *) ptr + 12);;
1454 __m256i d14 = _mm256_lddqu_si256((__m256i const *) ptr + 13);;
1455 __m256i d15 = _mm256_lddqu_si256((__m256i const *) ptr + 14);;
1456 sort_15v_ascending(d01, d02, d03, d04, d05, d06, d07, d08, d09, d10, d11, d12, d13, d14, d15);
1457 _mm256_storeu_si256((__m256i *) ptr + 0, d01);
1458 _mm256_storeu_si256((__m256i *) ptr + 1, d02);
1459 _mm256_storeu_si256((__m256i *) ptr + 2, d03);
1460 _mm256_storeu_si256((__m256i *) ptr + 3, d04);
1461 _mm256_storeu_si256((__m256i *) ptr + 4, d05);
1462 _mm256_storeu_si256((__m256i *) ptr + 5, d06);
1463 _mm256_storeu_si256((__m256i *) ptr + 6, d07);
1464 _mm256_storeu_si256((__m256i *) ptr + 7, d08);
1465 _mm256_storeu_si256((__m256i *) ptr + 8, d09);
1466 _mm256_storeu_si256((__m256i *) ptr + 9, d10);
1467 _mm256_storeu_si256((__m256i *) ptr + 10, d11);
1468 _mm256_storeu_si256((__m256i *) ptr + 11, d12);
1469 _mm256_storeu_si256((__m256i *) ptr + 12, d13);
1470 _mm256_storeu_si256((__m256i *) ptr + 13, d14);
1471 _mm256_storeu_si256((__m256i *) ptr + 14, d15);
1474 static NOINLINE void sort_16v(int32_t *ptr) {
1475 __m256i d01 = _mm256_lddqu_si256((__m256i const *) ptr + 0);;
1476 __m256i d02 = _mm256_lddqu_si256((__m256i const *) ptr + 1);;
1477 __m256i d03 = _mm256_lddqu_si256((__m256i const *) ptr + 2);;
1478 __m256i d04 = _mm256_lddqu_si256((__m256i const *) ptr + 3);;
1479 __m256i d05 = _mm256_lddqu_si256((__m256i const *) ptr + 4);;
1480 __m256i d06 = _mm256_lddqu_si256((__m256i const *) ptr + 5);;
1481 __m256i d07 = _mm256_lddqu_si256((__m256i const *) ptr + 6);;
1482 __m256i d08 = _mm256_lddqu_si256((__m256i const *) ptr + 7);;
1483 __m256i d09 = _mm256_lddqu_si256((__m256i const *) ptr + 8);;
1484 __m256i d10 = _mm256_lddqu_si256((__m256i const *) ptr + 9);;
1485 __m256i d11 = _mm256_lddqu_si256((__m256i const *) ptr + 10);;
1486 __m256i d12 = _mm256_lddqu_si256((__m256i const *) ptr + 11);;
1487 __m256i d13 = _mm256_lddqu_si256((__m256i const *) ptr + 12);;
1488 __m256i d14 = _mm256_lddqu_si256((__m256i const *) ptr + 13);;
1489 __m256i d15 = _mm256_lddqu_si256((__m256i const *) ptr + 14);;
1490 __m256i d16 = _mm256_lddqu_si256((__m256i const *) ptr + 15);;
1491 sort_16v_ascending(d01, d02, d03, d04, d05, d06, d07, d08, d09, d10, d11, d12, d13, d14, d15, d16);
1492 _mm256_storeu_si256((__m256i *) ptr + 0, d01);
1493 _mm256_storeu_si256((__m256i *) ptr + 1, d02);
1494 _mm256_storeu_si256((__m256i *) ptr + 2, d03);
1495 _mm256_storeu_si256((__m256i *) ptr + 3, d04);
1496 _mm256_storeu_si256((__m256i *) ptr + 4, d05);
1497 _mm256_storeu_si256((__m256i *) ptr + 5, d06);
1498 _mm256_storeu_si256((__m256i *) ptr + 6, d07);
1499 _mm256_storeu_si256((__m256i *) ptr + 7, d08);
1500 _mm256_storeu_si256((__m256i *) ptr + 8, d09);
1501 _mm256_storeu_si256((__m256i *) ptr + 9, d10);
1502 _mm256_storeu_si256((__m256i *) ptr + 10, d11);
1503 _mm256_storeu_si256((__m256i *) ptr + 11, d12);
1504 _mm256_storeu_si256((__m256i *) ptr + 12, d13);
1505 _mm256_storeu_si256((__m256i *) ptr + 13, d14);
1506 _mm256_storeu_si256((__m256i *) ptr + 14, d15);
1507 _mm256_storeu_si256((__m256i *) ptr + 15, d16);
1509 static void sort(int32_t *ptr, size_t length);
1524 #pragma clang attribute pop
1526 #pragma GCC pop_options