Vxsort (#37159)
[platform/upstream/dotnet/runtime.git] / src / coreclr / src / gc / vxsort / smallsort / bitonic_sort.AVX2.int32_t.generated.h
1 // Licensed to the .NET Foundation under one or more agreements.
2 // The .NET Foundation licenses this file to you under the MIT license.
3
4 /////////////////////////////////////////////////////////////////////////////
5 ////
6 // This file was auto-generated by a tool at 2020-06-22 05:27:48
7 //
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 /////////////////////////////////////////////////////////////////////////////
11
12 #ifndef BITONIC_SORT_AVX2_INT32_T_H
13 #define BITONIC_SORT_AVX2_INT32_T_H
14
15 #ifdef __GNUC__
16 #ifdef __clang__
17 #pragma clang attribute push (__attribute__((target("avx2"))), apply_to = any(function))
18 #else
19 #pragma GCC push_options
20 #pragma GCC target("avx2")
21 #endif
22 #endif
23
24 #include <immintrin.h>
25 #include "bitonic_sort.h"
26
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
33
34 namespace vxsort {
35 namespace smallsort {
36 template<> struct bitonic<int32_t, AVX2> {
37 public:
38
39     static INLINE void sort_01v_ascending(__m256i& d01) {
40             __m256i  min, max, s;
41
42             s = _mm256_shuffle_epi32(d01, 0xB1);
43             
44             min = _mm256_min_epi32(s, d01);
45             max = _mm256_max_epi32(s, d01);
46             d01 = _mm256_blend_epi32(min, max, 0xAA);
47
48             s = _mm256_shuffle_epi32(d01, 0x1B);
49             
50             min = _mm256_min_epi32(s, d01);
51             max = _mm256_max_epi32(s, d01);
52             d01 = _mm256_blend_epi32(min, max, 0xCC);
53
54             s = _mm256_shuffle_epi32(d01, 0xB1);
55             
56             min = _mm256_min_epi32(s, d01);
57             max = _mm256_max_epi32(s, d01);
58             d01 = _mm256_blend_epi32(min, max, 0xAA);
59
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);
64
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);
69
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);
74 }
75     static INLINE void sort_01v_merge_ascending(__m256i& d01) {
76             __m256i  min, max, s;
77
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);
82
83             s = _mm256_shuffle_epi32(d01, 0x4E);
84             
85             min = _mm256_min_epi32(s, d01);
86             max = _mm256_max_epi32(s, d01);
87             d01 = _mm256_blend_epi32(min, max, 0xCC);
88
89             s = _mm256_shuffle_epi32(d01, 0xB1);
90             
91             min = _mm256_min_epi32(s, d01);
92             max = _mm256_max_epi32(s, d01);
93             d01 = _mm256_blend_epi32(min, max, 0xAA);
94     }
95     static INLINE void sort_01v_descending(__m256i& d01) {
96             __m256i  min, max, s;
97
98             s = _mm256_shuffle_epi32(d01, 0xB1);
99             
100             min = _mm256_min_epi32(s, d01);
101             max = _mm256_max_epi32(s, d01);
102             d01 = _mm256_blend_epi32(max, min, 0xAA);
103
104             s = _mm256_shuffle_epi32(d01, 0x1B);
105             
106             min = _mm256_min_epi32(s, d01);
107             max = _mm256_max_epi32(s, d01);
108             d01 = _mm256_blend_epi32(max, min, 0xCC);
109
110             s = _mm256_shuffle_epi32(d01, 0xB1);
111             
112             min = _mm256_min_epi32(s, d01);
113             max = _mm256_max_epi32(s, d01);
114             d01 = _mm256_blend_epi32(max, min, 0xAA);
115
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);
120
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);
125
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);
130 }
131     static INLINE void sort_01v_merge_descending(__m256i& d01) {
132             __m256i  min, max, s;
133
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);
138
139             s = _mm256_shuffle_epi32(d01, 0x4E);
140             
141             min = _mm256_min_epi32(s, d01);
142             max = _mm256_max_epi32(s, d01);
143             d01 = _mm256_blend_epi32(max, min, 0xCC);
144
145             s = _mm256_shuffle_epi32(d01, 0xB1);
146             
147             min = _mm256_min_epi32(s, d01);
148             max = _mm256_max_epi32(s, d01);
149             d01 = _mm256_blend_epi32(max, min, 0xAA);
150     }
151     static INLINE void sort_02v_ascending(__m256i& d01, __m256i& d02) {
152         __m256i  tmp;
153
154         sort_01v_ascending(d01);
155         sort_01v_descending(d02);
156
157         tmp = d02;
158         
159         d02 = _mm256_max_epi32(d01, d02);
160         d01 = _mm256_min_epi32(d01, tmp);
161
162         sort_01v_merge_ascending(d01);
163         sort_01v_merge_ascending(d02);
164     }
165     static INLINE void sort_02v_descending(__m256i& d01, __m256i& d02) {
166         __m256i  tmp;
167
168         sort_01v_descending(d01);
169         sort_01v_ascending(d02);
170
171         tmp = d02;
172         
173         d02 = _mm256_max_epi32(d01, d02);
174         d01 = _mm256_min_epi32(d01, tmp);
175
176         sort_01v_merge_descending(d01);
177         sort_01v_merge_descending(d02);
178     }
179     static INLINE void sort_02v_merge_ascending(__m256i& d01, __m256i& d02) {
180         __m256i  tmp;
181
182         tmp = d01;
183         
184         d01 = _mm256_min_epi32(d02, d01);
185         
186         d02 = _mm256_max_epi32(d02, tmp);
187
188         sort_01v_merge_ascending(d01);
189         sort_01v_merge_ascending(d02);
190     }
191     static INLINE void sort_02v_merge_descending(__m256i& d01, __m256i& d02) {
192         __m256i  tmp;
193
194         tmp = d01;
195         
196         d01 = _mm256_min_epi32(d02, d01);
197         
198         d02 = _mm256_max_epi32(d02, tmp);
199
200         sort_01v_merge_descending(d01);
201         sort_01v_merge_descending(d02);
202     }
203     static INLINE void sort_03v_ascending(__m256i& d01, __m256i& d02, __m256i& d03) {
204         __m256i  tmp;
205
206         sort_02v_ascending(d01, d02);
207         sort_01v_descending(d03);
208
209         tmp = d03;
210         
211         d03 = _mm256_max_epi32(d02, d03);
212         d02 = _mm256_min_epi32(d02, tmp);
213
214         sort_02v_merge_ascending(d01, d02);
215         sort_01v_merge_ascending(d03);
216     }
217     static INLINE void sort_03v_descending(__m256i& d01, __m256i& d02, __m256i& d03) {
218         __m256i  tmp;
219
220         sort_02v_descending(d01, d02);
221         sort_01v_ascending(d03);
222
223         tmp = d03;
224         
225         d03 = _mm256_max_epi32(d02, d03);
226         d02 = _mm256_min_epi32(d02, tmp);
227
228         sort_02v_merge_descending(d01, d02);
229         sort_01v_merge_descending(d03);
230     }
231     static INLINE void sort_03v_merge_ascending(__m256i& d01, __m256i& d02, __m256i& d03) {
232         __m256i  tmp;
233
234         tmp = d01;
235         
236         d01 = _mm256_min_epi32(d03, d01);
237         
238         d03 = _mm256_max_epi32(d03, tmp);
239
240         sort_02v_merge_ascending(d01, d02);
241         sort_01v_merge_ascending(d03);
242     }
243     static INLINE void sort_03v_merge_descending(__m256i& d01, __m256i& d02, __m256i& d03) {
244         __m256i  tmp;
245
246         tmp = d01;
247         
248         d01 = _mm256_min_epi32(d03, d01);
249         
250         d03 = _mm256_max_epi32(d03, tmp);
251
252         sort_02v_merge_descending(d01, d02);
253         sort_01v_merge_descending(d03);
254     }
255     static INLINE void sort_04v_ascending(__m256i& d01, __m256i& d02, __m256i& d03, __m256i& d04) {
256         __m256i  tmp;
257
258         sort_02v_ascending(d01, d02);
259         sort_02v_descending(d03, d04);
260
261         tmp = d03;
262         
263         d03 = _mm256_max_epi32(d02, d03);
264         d02 = _mm256_min_epi32(d02, tmp);
265
266         tmp = d04;
267         
268         d04 = _mm256_max_epi32(d01, d04);
269         d01 = _mm256_min_epi32(d01, tmp);
270
271         sort_02v_merge_ascending(d01, d02);
272         sort_02v_merge_ascending(d03, d04);
273     }
274     static INLINE void sort_04v_descending(__m256i& d01, __m256i& d02, __m256i& d03, __m256i& d04) {
275         __m256i  tmp;
276
277         sort_02v_descending(d01, d02);
278         sort_02v_ascending(d03, d04);
279
280         tmp = d03;
281         
282         d03 = _mm256_max_epi32(d02, d03);
283         d02 = _mm256_min_epi32(d02, tmp);
284
285         tmp = d04;
286         
287         d04 = _mm256_max_epi32(d01, d04);
288         d01 = _mm256_min_epi32(d01, tmp);
289
290         sort_02v_merge_descending(d01, d02);
291         sort_02v_merge_descending(d03, d04);
292     }
293     static INLINE void sort_04v_merge_ascending(__m256i& d01, __m256i& d02, __m256i& d03, __m256i& d04) {
294         __m256i  tmp;
295
296         tmp = d01;
297         
298         d01 = _mm256_min_epi32(d03, d01);
299         
300         d03 = _mm256_max_epi32(d03, tmp);
301
302         tmp = d02;
303         
304         d02 = _mm256_min_epi32(d04, d02);
305         
306         d04 = _mm256_max_epi32(d04, tmp);
307
308         sort_02v_merge_ascending(d01, d02);
309         sort_02v_merge_ascending(d03, d04);
310     }
311     static INLINE void sort_04v_merge_descending(__m256i& d01, __m256i& d02, __m256i& d03, __m256i& d04) {
312         __m256i  tmp;
313
314         tmp = d01;
315         
316         d01 = _mm256_min_epi32(d03, d01);
317         
318         d03 = _mm256_max_epi32(d03, tmp);
319
320         tmp = d02;
321         
322         d02 = _mm256_min_epi32(d04, d02);
323         
324         d04 = _mm256_max_epi32(d04, tmp);
325
326         sort_02v_merge_descending(d01, d02);
327         sort_02v_merge_descending(d03, d04);
328     }
329     static INLINE void sort_05v_ascending(__m256i& d01, __m256i& d02, __m256i& d03, __m256i& d04, __m256i& d05) {
330         __m256i  tmp;
331
332         sort_04v_ascending(d01, d02, d03, d04);
333         sort_01v_descending(d05);
334
335         tmp = d05;
336         
337         d05 = _mm256_max_epi32(d04, d05);
338         d04 = _mm256_min_epi32(d04, tmp);
339
340         sort_04v_merge_ascending(d01, d02, d03, d04);
341         sort_01v_merge_ascending(d05);
342     }
343     static INLINE void sort_05v_descending(__m256i& d01, __m256i& d02, __m256i& d03, __m256i& d04, __m256i& d05) {
344         __m256i  tmp;
345
346         sort_04v_descending(d01, d02, d03, d04);
347         sort_01v_ascending(d05);
348
349         tmp = d05;
350         
351         d05 = _mm256_max_epi32(d04, d05);
352         d04 = _mm256_min_epi32(d04, tmp);
353
354         sort_04v_merge_descending(d01, d02, d03, d04);
355         sort_01v_merge_descending(d05);
356     }
357     static INLINE void sort_05v_merge_ascending(__m256i& d01, __m256i& d02, __m256i& d03, __m256i& d04, __m256i& d05) {
358         __m256i  tmp;
359
360         tmp = d01;
361         
362         d01 = _mm256_min_epi32(d05, d01);
363         
364         d05 = _mm256_max_epi32(d05, tmp);
365
366         sort_04v_merge_ascending(d01, d02, d03, d04);
367         sort_01v_merge_ascending(d05);
368     }
369     static INLINE void sort_05v_merge_descending(__m256i& d01, __m256i& d02, __m256i& d03, __m256i& d04, __m256i& d05) {
370         __m256i  tmp;
371
372         tmp = d01;
373         
374         d01 = _mm256_min_epi32(d05, d01);
375         
376         d05 = _mm256_max_epi32(d05, tmp);
377
378         sort_04v_merge_descending(d01, d02, d03, d04);
379         sort_01v_merge_descending(d05);
380     }
381     static INLINE void sort_06v_ascending(__m256i& d01, __m256i& d02, __m256i& d03, __m256i& d04, __m256i& d05, __m256i& d06) {
382         __m256i  tmp;
383
384         sort_04v_ascending(d01, d02, d03, d04);
385         sort_02v_descending(d05, d06);
386
387         tmp = d05;
388         
389         d05 = _mm256_max_epi32(d04, d05);
390         d04 = _mm256_min_epi32(d04, tmp);
391
392         tmp = d06;
393         
394         d06 = _mm256_max_epi32(d03, d06);
395         d03 = _mm256_min_epi32(d03, tmp);
396
397         sort_04v_merge_ascending(d01, d02, d03, d04);
398         sort_02v_merge_ascending(d05, d06);
399     }
400     static INLINE void sort_06v_descending(__m256i& d01, __m256i& d02, __m256i& d03, __m256i& d04, __m256i& d05, __m256i& d06) {
401         __m256i  tmp;
402
403         sort_04v_descending(d01, d02, d03, d04);
404         sort_02v_ascending(d05, d06);
405
406         tmp = d05;
407         
408         d05 = _mm256_max_epi32(d04, d05);
409         d04 = _mm256_min_epi32(d04, tmp);
410
411         tmp = d06;
412         
413         d06 = _mm256_max_epi32(d03, d06);
414         d03 = _mm256_min_epi32(d03, tmp);
415
416         sort_04v_merge_descending(d01, d02, d03, d04);
417         sort_02v_merge_descending(d05, d06);
418     }
419     static INLINE void sort_06v_merge_ascending(__m256i& d01, __m256i& d02, __m256i& d03, __m256i& d04, __m256i& d05, __m256i& d06) {
420         __m256i  tmp;
421
422         tmp = d01;
423         
424         d01 = _mm256_min_epi32(d05, d01);
425         
426         d05 = _mm256_max_epi32(d05, tmp);
427
428         tmp = d02;
429         
430         d02 = _mm256_min_epi32(d06, d02);
431         
432         d06 = _mm256_max_epi32(d06, tmp);
433
434         sort_04v_merge_ascending(d01, d02, d03, d04);
435         sort_02v_merge_ascending(d05, d06);
436     }
437     static INLINE void sort_06v_merge_descending(__m256i& d01, __m256i& d02, __m256i& d03, __m256i& d04, __m256i& d05, __m256i& d06) {
438         __m256i  tmp;
439
440         tmp = d01;
441         
442         d01 = _mm256_min_epi32(d05, d01);
443         
444         d05 = _mm256_max_epi32(d05, tmp);
445
446         tmp = d02;
447         
448         d02 = _mm256_min_epi32(d06, d02);
449         
450         d06 = _mm256_max_epi32(d06, tmp);
451
452         sort_04v_merge_descending(d01, d02, d03, d04);
453         sort_02v_merge_descending(d05, d06);
454     }
455     static INLINE void sort_07v_ascending(__m256i& d01, __m256i& d02, __m256i& d03, __m256i& d04, __m256i& d05, __m256i& d06, __m256i& d07) {
456         __m256i  tmp;
457
458         sort_04v_ascending(d01, d02, d03, d04);
459         sort_03v_descending(d05, d06, d07);
460
461         tmp = d05;
462         
463         d05 = _mm256_max_epi32(d04, d05);
464         d04 = _mm256_min_epi32(d04, tmp);
465
466         tmp = d06;
467         
468         d06 = _mm256_max_epi32(d03, d06);
469         d03 = _mm256_min_epi32(d03, tmp);
470
471         tmp = d07;
472         
473         d07 = _mm256_max_epi32(d02, d07);
474         d02 = _mm256_min_epi32(d02, tmp);
475
476         sort_04v_merge_ascending(d01, d02, d03, d04);
477         sort_03v_merge_ascending(d05, d06, d07);
478     }
479     static INLINE void sort_07v_descending(__m256i& d01, __m256i& d02, __m256i& d03, __m256i& d04, __m256i& d05, __m256i& d06, __m256i& d07) {
480         __m256i  tmp;
481
482         sort_04v_descending(d01, d02, d03, d04);
483         sort_03v_ascending(d05, d06, d07);
484
485         tmp = d05;
486         
487         d05 = _mm256_max_epi32(d04, d05);
488         d04 = _mm256_min_epi32(d04, tmp);
489
490         tmp = d06;
491         
492         d06 = _mm256_max_epi32(d03, d06);
493         d03 = _mm256_min_epi32(d03, tmp);
494
495         tmp = d07;
496         
497         d07 = _mm256_max_epi32(d02, d07);
498         d02 = _mm256_min_epi32(d02, tmp);
499
500         sort_04v_merge_descending(d01, d02, d03, d04);
501         sort_03v_merge_descending(d05, d06, d07);
502     }
503     static INLINE void sort_07v_merge_ascending(__m256i& d01, __m256i& d02, __m256i& d03, __m256i& d04, __m256i& d05, __m256i& d06, __m256i& d07) {
504         __m256i  tmp;
505
506         tmp = d01;
507         
508         d01 = _mm256_min_epi32(d05, d01);
509         
510         d05 = _mm256_max_epi32(d05, tmp);
511
512         tmp = d02;
513         
514         d02 = _mm256_min_epi32(d06, d02);
515         
516         d06 = _mm256_max_epi32(d06, tmp);
517
518         tmp = d03;
519         
520         d03 = _mm256_min_epi32(d07, d03);
521         
522         d07 = _mm256_max_epi32(d07, tmp);
523
524         sort_04v_merge_ascending(d01, d02, d03, d04);
525         sort_03v_merge_ascending(d05, d06, d07);
526     }
527     static INLINE void sort_07v_merge_descending(__m256i& d01, __m256i& d02, __m256i& d03, __m256i& d04, __m256i& d05, __m256i& d06, __m256i& d07) {
528         __m256i  tmp;
529
530         tmp = d01;
531         
532         d01 = _mm256_min_epi32(d05, d01);
533         
534         d05 = _mm256_max_epi32(d05, tmp);
535
536         tmp = d02;
537         
538         d02 = _mm256_min_epi32(d06, d02);
539         
540         d06 = _mm256_max_epi32(d06, tmp);
541
542         tmp = d03;
543         
544         d03 = _mm256_min_epi32(d07, d03);
545         
546         d07 = _mm256_max_epi32(d07, tmp);
547
548         sort_04v_merge_descending(d01, d02, d03, d04);
549         sort_03v_merge_descending(d05, d06, d07);
550     }
551     static INLINE void sort_08v_ascending(__m256i& d01, __m256i& d02, __m256i& d03, __m256i& d04, __m256i& d05, __m256i& d06, __m256i& d07, __m256i& d08) {
552         __m256i  tmp;
553
554         sort_04v_ascending(d01, d02, d03, d04);
555         sort_04v_descending(d05, d06, d07, d08);
556
557         tmp = d05;
558         
559         d05 = _mm256_max_epi32(d04, d05);
560         d04 = _mm256_min_epi32(d04, tmp);
561
562         tmp = d06;
563         
564         d06 = _mm256_max_epi32(d03, d06);
565         d03 = _mm256_min_epi32(d03, tmp);
566
567         tmp = d07;
568         
569         d07 = _mm256_max_epi32(d02, d07);
570         d02 = _mm256_min_epi32(d02, tmp);
571
572         tmp = d08;
573         
574         d08 = _mm256_max_epi32(d01, d08);
575         d01 = _mm256_min_epi32(d01, tmp);
576
577         sort_04v_merge_ascending(d01, d02, d03, d04);
578         sort_04v_merge_ascending(d05, d06, d07, d08);
579     }
580     static INLINE void sort_08v_descending(__m256i& d01, __m256i& d02, __m256i& d03, __m256i& d04, __m256i& d05, __m256i& d06, __m256i& d07, __m256i& d08) {
581         __m256i  tmp;
582
583         sort_04v_descending(d01, d02, d03, d04);
584         sort_04v_ascending(d05, d06, d07, d08);
585
586         tmp = d05;
587         
588         d05 = _mm256_max_epi32(d04, d05);
589         d04 = _mm256_min_epi32(d04, tmp);
590
591         tmp = d06;
592         
593         d06 = _mm256_max_epi32(d03, d06);
594         d03 = _mm256_min_epi32(d03, tmp);
595
596         tmp = d07;
597         
598         d07 = _mm256_max_epi32(d02, d07);
599         d02 = _mm256_min_epi32(d02, tmp);
600
601         tmp = d08;
602         
603         d08 = _mm256_max_epi32(d01, d08);
604         d01 = _mm256_min_epi32(d01, tmp);
605
606         sort_04v_merge_descending(d01, d02, d03, d04);
607         sort_04v_merge_descending(d05, d06, d07, d08);
608     }
609     static INLINE void sort_08v_merge_ascending(__m256i& d01, __m256i& d02, __m256i& d03, __m256i& d04, __m256i& d05, __m256i& d06, __m256i& d07, __m256i& d08) {
610         __m256i  tmp;
611
612         tmp = d01;
613         
614         d01 = _mm256_min_epi32(d05, d01);
615         
616         d05 = _mm256_max_epi32(d05, tmp);
617
618         tmp = d02;
619         
620         d02 = _mm256_min_epi32(d06, d02);
621         
622         d06 = _mm256_max_epi32(d06, tmp);
623
624         tmp = d03;
625         
626         d03 = _mm256_min_epi32(d07, d03);
627         
628         d07 = _mm256_max_epi32(d07, tmp);
629
630         tmp = d04;
631         
632         d04 = _mm256_min_epi32(d08, d04);
633         
634         d08 = _mm256_max_epi32(d08, tmp);
635
636         sort_04v_merge_ascending(d01, d02, d03, d04);
637         sort_04v_merge_ascending(d05, d06, d07, d08);
638     }
639     static INLINE void sort_08v_merge_descending(__m256i& d01, __m256i& d02, __m256i& d03, __m256i& d04, __m256i& d05, __m256i& d06, __m256i& d07, __m256i& d08) {
640         __m256i  tmp;
641
642         tmp = d01;
643         
644         d01 = _mm256_min_epi32(d05, d01);
645         
646         d05 = _mm256_max_epi32(d05, tmp);
647
648         tmp = d02;
649         
650         d02 = _mm256_min_epi32(d06, d02);
651         
652         d06 = _mm256_max_epi32(d06, tmp);
653
654         tmp = d03;
655         
656         d03 = _mm256_min_epi32(d07, d03);
657         
658         d07 = _mm256_max_epi32(d07, tmp);
659
660         tmp = d04;
661         
662         d04 = _mm256_min_epi32(d08, d04);
663         
664         d08 = _mm256_max_epi32(d08, tmp);
665
666         sort_04v_merge_descending(d01, d02, d03, d04);
667         sort_04v_merge_descending(d05, d06, d07, d08);
668     }
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) {
670         __m256i  tmp;
671
672         sort_08v_ascending(d01, d02, d03, d04, d05, d06, d07, d08);
673         sort_01v_descending(d09);
674
675         tmp = d09;
676         
677         d09 = _mm256_max_epi32(d08, d09);
678         d08 = _mm256_min_epi32(d08, tmp);
679
680         sort_08v_merge_ascending(d01, d02, d03, d04, d05, d06, d07, d08);
681         sort_01v_merge_ascending(d09);
682     }
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) {
684         __m256i  tmp;
685
686         sort_08v_descending(d01, d02, d03, d04, d05, d06, d07, d08);
687         sort_01v_ascending(d09);
688
689         tmp = d09;
690         
691         d09 = _mm256_max_epi32(d08, d09);
692         d08 = _mm256_min_epi32(d08, tmp);
693
694         sort_08v_merge_descending(d01, d02, d03, d04, d05, d06, d07, d08);
695         sort_01v_merge_descending(d09);
696     }
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) {
698         __m256i  tmp;
699
700         sort_08v_ascending(d01, d02, d03, d04, d05, d06, d07, d08);
701         sort_02v_descending(d09, d10);
702
703         tmp = d09;
704         
705         d09 = _mm256_max_epi32(d08, d09);
706         d08 = _mm256_min_epi32(d08, tmp);
707
708         tmp = d10;
709         
710         d10 = _mm256_max_epi32(d07, d10);
711         d07 = _mm256_min_epi32(d07, tmp);
712
713         sort_08v_merge_ascending(d01, d02, d03, d04, d05, d06, d07, d08);
714         sort_02v_merge_ascending(d09, d10);
715     }
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) {
717         __m256i  tmp;
718
719         sort_08v_descending(d01, d02, d03, d04, d05, d06, d07, d08);
720         sort_02v_ascending(d09, d10);
721
722         tmp = d09;
723         
724         d09 = _mm256_max_epi32(d08, d09);
725         d08 = _mm256_min_epi32(d08, tmp);
726
727         tmp = d10;
728         
729         d10 = _mm256_max_epi32(d07, d10);
730         d07 = _mm256_min_epi32(d07, tmp);
731
732         sort_08v_merge_descending(d01, d02, d03, d04, d05, d06, d07, d08);
733         sort_02v_merge_descending(d09, d10);
734     }
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) {
736         __m256i  tmp;
737
738         sort_08v_ascending(d01, d02, d03, d04, d05, d06, d07, d08);
739         sort_03v_descending(d09, d10, d11);
740
741         tmp = d09;
742         
743         d09 = _mm256_max_epi32(d08, d09);
744         d08 = _mm256_min_epi32(d08, tmp);
745
746         tmp = d10;
747         
748         d10 = _mm256_max_epi32(d07, d10);
749         d07 = _mm256_min_epi32(d07, tmp);
750
751         tmp = d11;
752         
753         d11 = _mm256_max_epi32(d06, d11);
754         d06 = _mm256_min_epi32(d06, tmp);
755
756         sort_08v_merge_ascending(d01, d02, d03, d04, d05, d06, d07, d08);
757         sort_03v_merge_ascending(d09, d10, d11);
758     }
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) {
760         __m256i  tmp;
761
762         sort_08v_descending(d01, d02, d03, d04, d05, d06, d07, d08);
763         sort_03v_ascending(d09, d10, d11);
764
765         tmp = d09;
766         
767         d09 = _mm256_max_epi32(d08, d09);
768         d08 = _mm256_min_epi32(d08, tmp);
769
770         tmp = d10;
771         
772         d10 = _mm256_max_epi32(d07, d10);
773         d07 = _mm256_min_epi32(d07, tmp);
774
775         tmp = d11;
776         
777         d11 = _mm256_max_epi32(d06, d11);
778         d06 = _mm256_min_epi32(d06, tmp);
779
780         sort_08v_merge_descending(d01, d02, d03, d04, d05, d06, d07, d08);
781         sort_03v_merge_descending(d09, d10, d11);
782     }
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) {
784         __m256i  tmp;
785
786         sort_08v_ascending(d01, d02, d03, d04, d05, d06, d07, d08);
787         sort_04v_descending(d09, d10, d11, d12);
788
789         tmp = d09;
790         
791         d09 = _mm256_max_epi32(d08, d09);
792         d08 = _mm256_min_epi32(d08, tmp);
793
794         tmp = d10;
795         
796         d10 = _mm256_max_epi32(d07, d10);
797         d07 = _mm256_min_epi32(d07, tmp);
798
799         tmp = d11;
800         
801         d11 = _mm256_max_epi32(d06, d11);
802         d06 = _mm256_min_epi32(d06, tmp);
803
804         tmp = d12;
805         
806         d12 = _mm256_max_epi32(d05, d12);
807         d05 = _mm256_min_epi32(d05, tmp);
808
809         sort_08v_merge_ascending(d01, d02, d03, d04, d05, d06, d07, d08);
810         sort_04v_merge_ascending(d09, d10, d11, d12);
811     }
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) {
813         __m256i  tmp;
814
815         sort_08v_descending(d01, d02, d03, d04, d05, d06, d07, d08);
816         sort_04v_ascending(d09, d10, d11, d12);
817
818         tmp = d09;
819         
820         d09 = _mm256_max_epi32(d08, d09);
821         d08 = _mm256_min_epi32(d08, tmp);
822
823         tmp = d10;
824         
825         d10 = _mm256_max_epi32(d07, d10);
826         d07 = _mm256_min_epi32(d07, tmp);
827
828         tmp = d11;
829         
830         d11 = _mm256_max_epi32(d06, d11);
831         d06 = _mm256_min_epi32(d06, tmp);
832
833         tmp = d12;
834         
835         d12 = _mm256_max_epi32(d05, d12);
836         d05 = _mm256_min_epi32(d05, tmp);
837
838         sort_08v_merge_descending(d01, d02, d03, d04, d05, d06, d07, d08);
839         sort_04v_merge_descending(d09, d10, d11, d12);
840     }
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) {
842         __m256i  tmp;
843
844         sort_08v_ascending(d01, d02, d03, d04, d05, d06, d07, d08);
845         sort_05v_descending(d09, d10, d11, d12, d13);
846
847         tmp = d09;
848         
849         d09 = _mm256_max_epi32(d08, d09);
850         d08 = _mm256_min_epi32(d08, tmp);
851
852         tmp = d10;
853         
854         d10 = _mm256_max_epi32(d07, d10);
855         d07 = _mm256_min_epi32(d07, tmp);
856
857         tmp = d11;
858         
859         d11 = _mm256_max_epi32(d06, d11);
860         d06 = _mm256_min_epi32(d06, tmp);
861
862         tmp = d12;
863         
864         d12 = _mm256_max_epi32(d05, d12);
865         d05 = _mm256_min_epi32(d05, tmp);
866
867         tmp = d13;
868         
869         d13 = _mm256_max_epi32(d04, d13);
870         d04 = _mm256_min_epi32(d04, tmp);
871
872         sort_08v_merge_ascending(d01, d02, d03, d04, d05, d06, d07, d08);
873         sort_05v_merge_ascending(d09, d10, d11, d12, d13);
874     }
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) {
876         __m256i  tmp;
877
878         sort_08v_descending(d01, d02, d03, d04, d05, d06, d07, d08);
879         sort_05v_ascending(d09, d10, d11, d12, d13);
880
881         tmp = d09;
882         
883         d09 = _mm256_max_epi32(d08, d09);
884         d08 = _mm256_min_epi32(d08, tmp);
885
886         tmp = d10;
887         
888         d10 = _mm256_max_epi32(d07, d10);
889         d07 = _mm256_min_epi32(d07, tmp);
890
891         tmp = d11;
892         
893         d11 = _mm256_max_epi32(d06, d11);
894         d06 = _mm256_min_epi32(d06, tmp);
895
896         tmp = d12;
897         
898         d12 = _mm256_max_epi32(d05, d12);
899         d05 = _mm256_min_epi32(d05, tmp);
900
901         tmp = d13;
902         
903         d13 = _mm256_max_epi32(d04, d13);
904         d04 = _mm256_min_epi32(d04, tmp);
905
906         sort_08v_merge_descending(d01, d02, d03, d04, d05, d06, d07, d08);
907         sort_05v_merge_descending(d09, d10, d11, d12, d13);
908     }
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) {
910         __m256i  tmp;
911
912         sort_08v_ascending(d01, d02, d03, d04, d05, d06, d07, d08);
913         sort_06v_descending(d09, d10, d11, d12, d13, d14);
914
915         tmp = d09;
916         
917         d09 = _mm256_max_epi32(d08, d09);
918         d08 = _mm256_min_epi32(d08, tmp);
919
920         tmp = d10;
921         
922         d10 = _mm256_max_epi32(d07, d10);
923         d07 = _mm256_min_epi32(d07, tmp);
924
925         tmp = d11;
926         
927         d11 = _mm256_max_epi32(d06, d11);
928         d06 = _mm256_min_epi32(d06, tmp);
929
930         tmp = d12;
931         
932         d12 = _mm256_max_epi32(d05, d12);
933         d05 = _mm256_min_epi32(d05, tmp);
934
935         tmp = d13;
936         
937         d13 = _mm256_max_epi32(d04, d13);
938         d04 = _mm256_min_epi32(d04, tmp);
939
940         tmp = d14;
941         
942         d14 = _mm256_max_epi32(d03, d14);
943         d03 = _mm256_min_epi32(d03, tmp);
944
945         sort_08v_merge_ascending(d01, d02, d03, d04, d05, d06, d07, d08);
946         sort_06v_merge_ascending(d09, d10, d11, d12, d13, d14);
947     }
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) {
949         __m256i  tmp;
950
951         sort_08v_descending(d01, d02, d03, d04, d05, d06, d07, d08);
952         sort_06v_ascending(d09, d10, d11, d12, d13, d14);
953
954         tmp = d09;
955         
956         d09 = _mm256_max_epi32(d08, d09);
957         d08 = _mm256_min_epi32(d08, tmp);
958
959         tmp = d10;
960         
961         d10 = _mm256_max_epi32(d07, d10);
962         d07 = _mm256_min_epi32(d07, tmp);
963
964         tmp = d11;
965         
966         d11 = _mm256_max_epi32(d06, d11);
967         d06 = _mm256_min_epi32(d06, tmp);
968
969         tmp = d12;
970         
971         d12 = _mm256_max_epi32(d05, d12);
972         d05 = _mm256_min_epi32(d05, tmp);
973
974         tmp = d13;
975         
976         d13 = _mm256_max_epi32(d04, d13);
977         d04 = _mm256_min_epi32(d04, tmp);
978
979         tmp = d14;
980         
981         d14 = _mm256_max_epi32(d03, d14);
982         d03 = _mm256_min_epi32(d03, tmp);
983
984         sort_08v_merge_descending(d01, d02, d03, d04, d05, d06, d07, d08);
985         sort_06v_merge_descending(d09, d10, d11, d12, d13, d14);
986     }
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) {
988         __m256i  tmp;
989
990         sort_08v_ascending(d01, d02, d03, d04, d05, d06, d07, d08);
991         sort_07v_descending(d09, d10, d11, d12, d13, d14, d15);
992
993         tmp = d09;
994         
995         d09 = _mm256_max_epi32(d08, d09);
996         d08 = _mm256_min_epi32(d08, tmp);
997
998         tmp = d10;
999         
1000         d10 = _mm256_max_epi32(d07, d10);
1001         d07 = _mm256_min_epi32(d07, tmp);
1002
1003         tmp = d11;
1004         
1005         d11 = _mm256_max_epi32(d06, d11);
1006         d06 = _mm256_min_epi32(d06, tmp);
1007
1008         tmp = d12;
1009         
1010         d12 = _mm256_max_epi32(d05, d12);
1011         d05 = _mm256_min_epi32(d05, tmp);
1012
1013         tmp = d13;
1014         
1015         d13 = _mm256_max_epi32(d04, d13);
1016         d04 = _mm256_min_epi32(d04, tmp);
1017
1018         tmp = d14;
1019         
1020         d14 = _mm256_max_epi32(d03, d14);
1021         d03 = _mm256_min_epi32(d03, tmp);
1022
1023         tmp = d15;
1024         
1025         d15 = _mm256_max_epi32(d02, d15);
1026         d02 = _mm256_min_epi32(d02, tmp);
1027
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);
1030     }
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) {
1032         __m256i  tmp;
1033
1034         sort_08v_descending(d01, d02, d03, d04, d05, d06, d07, d08);
1035         sort_07v_ascending(d09, d10, d11, d12, d13, d14, d15);
1036
1037         tmp = d09;
1038         
1039         d09 = _mm256_max_epi32(d08, d09);
1040         d08 = _mm256_min_epi32(d08, tmp);
1041
1042         tmp = d10;
1043         
1044         d10 = _mm256_max_epi32(d07, d10);
1045         d07 = _mm256_min_epi32(d07, tmp);
1046
1047         tmp = d11;
1048         
1049         d11 = _mm256_max_epi32(d06, d11);
1050         d06 = _mm256_min_epi32(d06, tmp);
1051
1052         tmp = d12;
1053         
1054         d12 = _mm256_max_epi32(d05, d12);
1055         d05 = _mm256_min_epi32(d05, tmp);
1056
1057         tmp = d13;
1058         
1059         d13 = _mm256_max_epi32(d04, d13);
1060         d04 = _mm256_min_epi32(d04, tmp);
1061
1062         tmp = d14;
1063         
1064         d14 = _mm256_max_epi32(d03, d14);
1065         d03 = _mm256_min_epi32(d03, tmp);
1066
1067         tmp = d15;
1068         
1069         d15 = _mm256_max_epi32(d02, d15);
1070         d02 = _mm256_min_epi32(d02, tmp);
1071
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);
1074     }
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) {
1076         __m256i  tmp;
1077
1078         sort_08v_ascending(d01, d02, d03, d04, d05, d06, d07, d08);
1079         sort_08v_descending(d09, d10, d11, d12, d13, d14, d15, d16);
1080
1081         tmp = d09;
1082         
1083         d09 = _mm256_max_epi32(d08, d09);
1084         d08 = _mm256_min_epi32(d08, tmp);
1085
1086         tmp = d10;
1087         
1088         d10 = _mm256_max_epi32(d07, d10);
1089         d07 = _mm256_min_epi32(d07, tmp);
1090
1091         tmp = d11;
1092         
1093         d11 = _mm256_max_epi32(d06, d11);
1094         d06 = _mm256_min_epi32(d06, tmp);
1095
1096         tmp = d12;
1097         
1098         d12 = _mm256_max_epi32(d05, d12);
1099         d05 = _mm256_min_epi32(d05, tmp);
1100
1101         tmp = d13;
1102         
1103         d13 = _mm256_max_epi32(d04, d13);
1104         d04 = _mm256_min_epi32(d04, tmp);
1105
1106         tmp = d14;
1107         
1108         d14 = _mm256_max_epi32(d03, d14);
1109         d03 = _mm256_min_epi32(d03, tmp);
1110
1111         tmp = d15;
1112         
1113         d15 = _mm256_max_epi32(d02, d15);
1114         d02 = _mm256_min_epi32(d02, tmp);
1115
1116         tmp = d16;
1117         
1118         d16 = _mm256_max_epi32(d01, d16);
1119         d01 = _mm256_min_epi32(d01, tmp);
1120
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);
1123     }
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) {
1125         __m256i  tmp;
1126
1127         sort_08v_descending(d01, d02, d03, d04, d05, d06, d07, d08);
1128         sort_08v_ascending(d09, d10, d11, d12, d13, d14, d15, d16);
1129
1130         tmp = d09;
1131         
1132         d09 = _mm256_max_epi32(d08, d09);
1133         d08 = _mm256_min_epi32(d08, tmp);
1134
1135         tmp = d10;
1136         
1137         d10 = _mm256_max_epi32(d07, d10);
1138         d07 = _mm256_min_epi32(d07, tmp);
1139
1140         tmp = d11;
1141         
1142         d11 = _mm256_max_epi32(d06, d11);
1143         d06 = _mm256_min_epi32(d06, tmp);
1144
1145         tmp = d12;
1146         
1147         d12 = _mm256_max_epi32(d05, d12);
1148         d05 = _mm256_min_epi32(d05, tmp);
1149
1150         tmp = d13;
1151         
1152         d13 = _mm256_max_epi32(d04, d13);
1153         d04 = _mm256_min_epi32(d04, tmp);
1154
1155         tmp = d14;
1156         
1157         d14 = _mm256_max_epi32(d03, d14);
1158         d03 = _mm256_min_epi32(d03, tmp);
1159
1160         tmp = d15;
1161         
1162         d15 = _mm256_max_epi32(d02, d15);
1163         d02 = _mm256_min_epi32(d02, tmp);
1164
1165         tmp = d16;
1166         
1167         d16 = _mm256_max_epi32(d01, d16);
1168         d01 = _mm256_min_epi32(d01, tmp);
1169
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);
1172     }
1173
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);
1178 }
1179
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);
1186 }
1187
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);
1196 }
1197
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);
1208 }
1209
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);
1222 }
1223
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);
1238 }
1239
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);
1256 }
1257
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);
1276 }
1277
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);
1298 }
1299
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);
1322 }
1323
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);
1348 }
1349
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);
1376 }
1377
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);
1406 }
1407
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);
1438 }
1439
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);
1472 }
1473
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);
1508 }
1509     static void sort(int32_t *ptr, size_t length);
1510
1511 };
1512 }
1513 }
1514
1515 #undef i2d
1516 #undef d2i
1517 #undef i2s
1518 #undef s2i
1519 #undef s2d
1520 #undef d2s
1521
1522 #ifdef __GNUC__
1523 #ifdef __clang__
1524 #pragma clang attribute pop
1525 #else
1526 #pragma GCC pop_options
1527 #endif
1528 #endif
1529 #endif
1530