From c3ff6a22cd810f6218bf53cd3ecd6a2fbe9eab6f Mon Sep 17 00:00:00 2001 From: DrMarkS Date: Sun, 11 Aug 2019 12:20:39 +0100 Subject: [PATCH 1/3] Added bitonic sorter. Made bitonic sort the default routine for small sortd and modified all other sorting algorithms to use SMALL_SORT as their base case --- Makefile | 12 +- benchmark.c | 4 + bitonic_sort.h | 6174 ++++++++++++++++++++++++++++++++++++++ demo.c | 29 +- generate_bitonic_sort.py | 127 + sort.h | 33 +- stresstest.c | 1 + 7 files changed, 6356 insertions(+), 24 deletions(-) create mode 100755 bitonic_sort.h create mode 100644 generate_bitonic_sort.py diff --git a/Makefile b/Makefile index a403397..a4d2cb5 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ # Copyright (c) 2012 Google Inc. All Rights Reserved. CC ?= gcc -CFLAGS ?= -O3 -g -Wall -std=c89 -pedantic -Wno-long-long +CFLAGS ?= -O3 -g -Wall -std=c89 -pedantic -Wno-long-long -Wno-format default: demo stresstest multidemo test @@ -15,17 +15,17 @@ test: stresstest benchmark clean: rm -f demo multidemo stresstest benchmark -demo: demo.c sort.h +demo: demo.c sort.h bitonic_sort.h $(CC) $(CFLAGS) demo.c -o demo -multidemo: multidemo.c sort.h +multidemo: multidemo.c sort.h bitonic_sort.h $(CC) $(CFLAGS) multidemo.c -o multidemo -stresstest: stresstest.c sort.h +stresstest: stresstest.c sort.h bitonic_sort.h $(CC) $(CFLAGS) stresstest.c -o stresstest -benchmark: benchmark.c sort.h +benchmark: benchmark.c sort.h bitonic_sort.h $(CC) $(CFLAGS) benchmark.c -o benchmark format: - astyle --options=astyle.options sort.h demo.c multidemo.c stresstest.c benchmark.c \ No newline at end of file + astyle --options=astyle.options sort.h bitonic_sort.h demo.c multidemo.c stresstest.c benchmark.c \ No newline at end of file diff --git a/benchmark.c b/benchmark.c index 3298e72..1fa234c 100644 --- a/benchmark.c +++ b/benchmark.c @@ -8,7 +8,10 @@ #define SORT_NAME sorter #define SORT_TYPE int64_t +#define MAX(x,y) (((x) > (y) ? (x) : (y))) +#define MIN(x,y) (((x) < (y) ? (x) : (y))) #define SORT_CMP(x, y) ((x) - (y)) +#define SORT_CSWAP(x, y) {SORT_TYPE _sort_swap_temp = MAX((x), (y)); (x) = MIN((x),(y)); (y) = _sort_swap_temp;} #include "sort.h" /* Used to control the stress test */ @@ -136,6 +139,7 @@ int main(void) { TEST_STDLIB(mergesort); #endif TEST_SORT_H(binary_insertion_sort); + TEST_SORT_H(bitonic_sort); TEST_SORT_H(quick_sort); TEST_SORT_H(merge_sort); TEST_SORT_H(heap_sort); diff --git a/bitonic_sort.h b/bitonic_sort.h new file mode 100755 index 0000000..9e2d41e --- /dev/null +++ b/bitonic_sort.h @@ -0,0 +1,6174 @@ + +#ifndef SORT_CSWAP +#define SORT_CSWAP(x, y) { if(SORT_CMP((x),(y)) > 0) {SORT_SWAP((x),(y));}} +#endif + +#define BITONIC_SORT_2 SORT_MAKE_STR(bitonic_sort_2) +static __inline void BITONIC_SORT_2(SORT_TYPE *dst) { + SORT_CSWAP(dst[0], dst[1]); +} + + +#define BITONIC_SORT_3 SORT_MAKE_STR(bitonic_sort_3) +static __inline void BITONIC_SORT_3(SORT_TYPE *dst) { + SORT_CSWAP(dst[1], dst[2]); + SORT_CSWAP(dst[0], dst[2]); + SORT_CSWAP(dst[0], dst[1]); +} + + +#define BITONIC_SORT_4 SORT_MAKE_STR(bitonic_sort_4) +static __inline void BITONIC_SORT_4(SORT_TYPE *dst) { + SORT_CSWAP(dst[0], dst[1]); + SORT_CSWAP(dst[2], dst[3]); + SORT_CSWAP(dst[0], dst[2]); + SORT_CSWAP(dst[1], dst[3]); + SORT_CSWAP(dst[1], dst[2]); +} + + +#define BITONIC_SORT_5 SORT_MAKE_STR(bitonic_sort_5) +static __inline void BITONIC_SORT_5(SORT_TYPE *dst) { + SORT_CSWAP(dst[0], dst[1]); + SORT_CSWAP(dst[3], dst[4]); + SORT_CSWAP(dst[2], dst[4]); + SORT_CSWAP(dst[2], dst[3]); + SORT_CSWAP(dst[1], dst[4]); + SORT_CSWAP(dst[0], dst[3]); + SORT_CSWAP(dst[0], dst[2]); + SORT_CSWAP(dst[1], dst[3]); + SORT_CSWAP(dst[1], dst[2]); +} + + +#define BITONIC_SORT_6 SORT_MAKE_STR(bitonic_sort_6) +static __inline void BITONIC_SORT_6(SORT_TYPE *dst) { + SORT_CSWAP(dst[1], dst[2]); + SORT_CSWAP(dst[4], dst[5]); + SORT_CSWAP(dst[0], dst[2]); + SORT_CSWAP(dst[3], dst[5]); + SORT_CSWAP(dst[0], dst[1]); + SORT_CSWAP(dst[3], dst[4]); + SORT_CSWAP(dst[2], dst[5]); + SORT_CSWAP(dst[0], dst[3]); + SORT_CSWAP(dst[1], dst[4]); + SORT_CSWAP(dst[2], dst[4]); + SORT_CSWAP(dst[1], dst[3]); + SORT_CSWAP(dst[2], dst[3]); +} + + +#define BITONIC_SORT_7 SORT_MAKE_STR(bitonic_sort_7) +static __inline void BITONIC_SORT_7(SORT_TYPE *dst) { + SORT_CSWAP(dst[1], dst[2]); + SORT_CSWAP(dst[3], dst[4]); + SORT_CSWAP(dst[5], dst[6]); + SORT_CSWAP(dst[0], dst[2]); + SORT_CSWAP(dst[3], dst[5]); + SORT_CSWAP(dst[4], dst[6]); + SORT_CSWAP(dst[0], dst[1]); + SORT_CSWAP(dst[4], dst[5]); + SORT_CSWAP(dst[2], dst[6]); + SORT_CSWAP(dst[0], dst[4]); + SORT_CSWAP(dst[1], dst[5]); + SORT_CSWAP(dst[0], dst[3]); + SORT_CSWAP(dst[2], dst[5]); + SORT_CSWAP(dst[1], dst[3]); + SORT_CSWAP(dst[2], dst[4]); + SORT_CSWAP(dst[2], dst[3]); +} + + +#define BITONIC_SORT_8 SORT_MAKE_STR(bitonic_sort_8) +static __inline void BITONIC_SORT_8(SORT_TYPE *dst) { + SORT_CSWAP(dst[0], dst[1]); + SORT_CSWAP(dst[2], dst[3]); + SORT_CSWAP(dst[4], dst[5]); + SORT_CSWAP(dst[6], dst[7]); + SORT_CSWAP(dst[0], dst[2]); + SORT_CSWAP(dst[1], dst[3]); + SORT_CSWAP(dst[4], dst[6]); + SORT_CSWAP(dst[5], dst[7]); + SORT_CSWAP(dst[1], dst[2]); + SORT_CSWAP(dst[5], dst[6]); + SORT_CSWAP(dst[0], dst[4]); + SORT_CSWAP(dst[3], dst[7]); + SORT_CSWAP(dst[1], dst[5]); + SORT_CSWAP(dst[2], dst[6]); + SORT_CSWAP(dst[1], dst[4]); + SORT_CSWAP(dst[3], dst[6]); + SORT_CSWAP(dst[2], dst[4]); + SORT_CSWAP(dst[3], dst[5]); + SORT_CSWAP(dst[3], dst[4]); +} + + +#define BITONIC_SORT_9 SORT_MAKE_STR(bitonic_sort_9) +static __inline void BITONIC_SORT_9(SORT_TYPE *dst) { + SORT_CSWAP(dst[0], dst[1]); + SORT_CSWAP(dst[3], dst[4]); + SORT_CSWAP(dst[6], dst[7]); + SORT_CSWAP(dst[1], dst[2]); + SORT_CSWAP(dst[4], dst[5]); + SORT_CSWAP(dst[7], dst[8]); + SORT_CSWAP(dst[0], dst[1]); + SORT_CSWAP(dst[3], dst[4]); + SORT_CSWAP(dst[6], dst[7]); + SORT_CSWAP(dst[2], dst[5]); + SORT_CSWAP(dst[0], dst[3]); + SORT_CSWAP(dst[1], dst[4]); + SORT_CSWAP(dst[5], dst[8]); + SORT_CSWAP(dst[3], dst[6]); + SORT_CSWAP(dst[4], dst[7]); + SORT_CSWAP(dst[2], dst[5]); + SORT_CSWAP(dst[0], dst[3]); + SORT_CSWAP(dst[1], dst[4]); + SORT_CSWAP(dst[5], dst[7]); + SORT_CSWAP(dst[2], dst[6]); + SORT_CSWAP(dst[1], dst[3]); + SORT_CSWAP(dst[4], dst[6]); + SORT_CSWAP(dst[2], dst[4]); + SORT_CSWAP(dst[5], dst[6]); + SORT_CSWAP(dst[2], dst[3]); +} + + +#define BITONIC_SORT_10 SORT_MAKE_STR(bitonic_sort_10) +static __inline void BITONIC_SORT_10(SORT_TYPE *dst) { + SORT_CSWAP(dst[4], dst[9]); + SORT_CSWAP(dst[3], dst[8]); + SORT_CSWAP(dst[2], dst[7]); + SORT_CSWAP(dst[1], dst[6]); + SORT_CSWAP(dst[0], dst[5]); + SORT_CSWAP(dst[1], dst[4]); + SORT_CSWAP(dst[6], dst[9]); + SORT_CSWAP(dst[0], dst[3]); + SORT_CSWAP(dst[5], dst[8]); + SORT_CSWAP(dst[0], dst[2]); + SORT_CSWAP(dst[3], dst[6]); + SORT_CSWAP(dst[7], dst[9]); + SORT_CSWAP(dst[0], dst[1]); + SORT_CSWAP(dst[2], dst[4]); + SORT_CSWAP(dst[5], dst[7]); + SORT_CSWAP(dst[8], dst[9]); + SORT_CSWAP(dst[1], dst[2]); + SORT_CSWAP(dst[4], dst[6]); + SORT_CSWAP(dst[7], dst[8]); + SORT_CSWAP(dst[3], dst[5]); + SORT_CSWAP(dst[2], dst[5]); + SORT_CSWAP(dst[6], dst[8]); + SORT_CSWAP(dst[1], dst[3]); + SORT_CSWAP(dst[4], dst[7]); + SORT_CSWAP(dst[2], dst[3]); + SORT_CSWAP(dst[6], dst[7]); + SORT_CSWAP(dst[3], dst[4]); + SORT_CSWAP(dst[5], dst[6]); + SORT_CSWAP(dst[4], dst[5]); +} + + +#define BITONIC_SORT_11 SORT_MAKE_STR(bitonic_sort_11) +static __inline void BITONIC_SORT_11(SORT_TYPE *dst) { + SORT_CSWAP(dst[0], dst[1]); + SORT_CSWAP(dst[2], dst[3]); + SORT_CSWAP(dst[4], dst[5]); + SORT_CSWAP(dst[6], dst[7]); + SORT_CSWAP(dst[8], dst[9]); + SORT_CSWAP(dst[1], dst[3]); + SORT_CSWAP(dst[5], dst[7]); + SORT_CSWAP(dst[0], dst[2]); + SORT_CSWAP(dst[4], dst[6]); + SORT_CSWAP(dst[8], dst[10]); + SORT_CSWAP(dst[1], dst[2]); + SORT_CSWAP(dst[5], dst[6]); + SORT_CSWAP(dst[9], dst[10]); + SORT_CSWAP(dst[0], dst[4]); + SORT_CSWAP(dst[3], dst[7]); + SORT_CSWAP(dst[1], dst[5]); + SORT_CSWAP(dst[6], dst[10]); + SORT_CSWAP(dst[4], dst[8]); + SORT_CSWAP(dst[5], dst[9]); + SORT_CSWAP(dst[2], dst[6]); + SORT_CSWAP(dst[0], dst[4]); + SORT_CSWAP(dst[3], dst[8]); + SORT_CSWAP(dst[1], dst[5]); + SORT_CSWAP(dst[6], dst[10]); + SORT_CSWAP(dst[2], dst[3]); + SORT_CSWAP(dst[8], dst[9]); + SORT_CSWAP(dst[1], dst[4]); + SORT_CSWAP(dst[7], dst[10]); + SORT_CSWAP(dst[3], dst[5]); + SORT_CSWAP(dst[6], dst[8]); + SORT_CSWAP(dst[2], dst[4]); + SORT_CSWAP(dst[7], dst[9]); + SORT_CSWAP(dst[5], dst[6]); + SORT_CSWAP(dst[3], dst[4]); + SORT_CSWAP(dst[7], dst[8]); +} + + +#define BITONIC_SORT_12 SORT_MAKE_STR(bitonic_sort_12) +static __inline void BITONIC_SORT_12(SORT_TYPE *dst) { + SORT_CSWAP(dst[0], dst[1]); + SORT_CSWAP(dst[2], dst[3]); + SORT_CSWAP(dst[4], dst[5]); + SORT_CSWAP(dst[6], dst[7]); + SORT_CSWAP(dst[8], dst[9]); + SORT_CSWAP(dst[10], dst[11]); + SORT_CSWAP(dst[1], dst[3]); + SORT_CSWAP(dst[5], dst[7]); + SORT_CSWAP(dst[9], dst[11]); + SORT_CSWAP(dst[0], dst[2]); + SORT_CSWAP(dst[4], dst[6]); + SORT_CSWAP(dst[8], dst[10]); + SORT_CSWAP(dst[1], dst[2]); + SORT_CSWAP(dst[5], dst[6]); + SORT_CSWAP(dst[9], dst[10]); + SORT_CSWAP(dst[0], dst[4]); + SORT_CSWAP(dst[7], dst[11]); + SORT_CSWAP(dst[1], dst[5]); + SORT_CSWAP(dst[6], dst[10]); + SORT_CSWAP(dst[3], dst[7]); + SORT_CSWAP(dst[4], dst[8]); + SORT_CSWAP(dst[5], dst[9]); + SORT_CSWAP(dst[2], dst[6]); + SORT_CSWAP(dst[0], dst[4]); + SORT_CSWAP(dst[7], dst[11]); + SORT_CSWAP(dst[3], dst[8]); + SORT_CSWAP(dst[1], dst[5]); + SORT_CSWAP(dst[6], dst[10]); + SORT_CSWAP(dst[2], dst[3]); + SORT_CSWAP(dst[8], dst[9]); + SORT_CSWAP(dst[1], dst[4]); + SORT_CSWAP(dst[7], dst[10]); + SORT_CSWAP(dst[3], dst[5]); + SORT_CSWAP(dst[6], dst[8]); + SORT_CSWAP(dst[2], dst[4]); + SORT_CSWAP(dst[7], dst[9]); + SORT_CSWAP(dst[5], dst[6]); + SORT_CSWAP(dst[3], dst[4]); + SORT_CSWAP(dst[7], dst[8]); +} + + +#define BITONIC_SORT_13 SORT_MAKE_STR(bitonic_sort_13) +static __inline void BITONIC_SORT_13(SORT_TYPE *dst) { + SORT_CSWAP(dst[1], dst[7]); + SORT_CSWAP(dst[9], dst[11]); + SORT_CSWAP(dst[3], dst[4]); + SORT_CSWAP(dst[5], dst[8]); + SORT_CSWAP(dst[0], dst[12]); + SORT_CSWAP(dst[2], dst[6]); + SORT_CSWAP(dst[0], dst[1]); + SORT_CSWAP(dst[2], dst[3]); + SORT_CSWAP(dst[4], dst[6]); + SORT_CSWAP(dst[8], dst[11]); + SORT_CSWAP(dst[7], dst[12]); + SORT_CSWAP(dst[5], dst[9]); + SORT_CSWAP(dst[0], dst[2]); + SORT_CSWAP(dst[3], dst[7]); + SORT_CSWAP(dst[10], dst[11]); + SORT_CSWAP(dst[1], dst[4]); + SORT_CSWAP(dst[6], dst[12]); + SORT_CSWAP(dst[7], dst[8]); + SORT_CSWAP(dst[11], dst[12]); + SORT_CSWAP(dst[4], dst[9]); + SORT_CSWAP(dst[6], dst[10]); + SORT_CSWAP(dst[3], dst[4]); + SORT_CSWAP(dst[5], dst[6]); + SORT_CSWAP(dst[8], dst[9]); + SORT_CSWAP(dst[10], dst[11]); + SORT_CSWAP(dst[1], dst[7]); + SORT_CSWAP(dst[2], dst[6]); + SORT_CSWAP(dst[9], dst[11]); + SORT_CSWAP(dst[1], dst[3]); + SORT_CSWAP(dst[4], dst[7]); + SORT_CSWAP(dst[8], dst[10]); + SORT_CSWAP(dst[0], dst[5]); + SORT_CSWAP(dst[2], dst[5]); + SORT_CSWAP(dst[6], dst[8]); + SORT_CSWAP(dst[9], dst[10]); + SORT_CSWAP(dst[1], dst[2]); + SORT_CSWAP(dst[3], dst[5]); + SORT_CSWAP(dst[7], dst[8]); + SORT_CSWAP(dst[4], dst[6]); + SORT_CSWAP(dst[2], dst[3]); + SORT_CSWAP(dst[4], dst[5]); + SORT_CSWAP(dst[6], dst[7]); + SORT_CSWAP(dst[8], dst[9]); + SORT_CSWAP(dst[3], dst[4]); + SORT_CSWAP(dst[5], dst[6]); +} + + +#define BITONIC_SORT_14 SORT_MAKE_STR(bitonic_sort_14) +static __inline void BITONIC_SORT_14(SORT_TYPE *dst) { + SORT_CSWAP(dst[0], dst[1]); + SORT_CSWAP(dst[2], dst[3]); + SORT_CSWAP(dst[4], dst[5]); + SORT_CSWAP(dst[6], dst[7]); + SORT_CSWAP(dst[8], dst[9]); + SORT_CSWAP(dst[10], dst[11]); + SORT_CSWAP(dst[12], dst[13]); + SORT_CSWAP(dst[0], dst[2]); + SORT_CSWAP(dst[4], dst[6]); + SORT_CSWAP(dst[8], dst[10]); + SORT_CSWAP(dst[1], dst[3]); + SORT_CSWAP(dst[5], dst[7]); + SORT_CSWAP(dst[9], dst[11]); + SORT_CSWAP(dst[0], dst[4]); + SORT_CSWAP(dst[8], dst[12]); + SORT_CSWAP(dst[1], dst[5]); + SORT_CSWAP(dst[9], dst[13]); + SORT_CSWAP(dst[2], dst[6]); + SORT_CSWAP(dst[3], dst[7]); + SORT_CSWAP(dst[0], dst[8]); + SORT_CSWAP(dst[1], dst[9]); + SORT_CSWAP(dst[2], dst[10]); + SORT_CSWAP(dst[3], dst[11]); + SORT_CSWAP(dst[4], dst[12]); + SORT_CSWAP(dst[5], dst[13]); + SORT_CSWAP(dst[5], dst[10]); + SORT_CSWAP(dst[6], dst[9]); + SORT_CSWAP(dst[3], dst[12]); + SORT_CSWAP(dst[7], dst[11]); + SORT_CSWAP(dst[1], dst[2]); + SORT_CSWAP(dst[4], dst[8]); + SORT_CSWAP(dst[1], dst[4]); + SORT_CSWAP(dst[7], dst[13]); + SORT_CSWAP(dst[2], dst[8]); + SORT_CSWAP(dst[5], dst[6]); + SORT_CSWAP(dst[9], dst[10]); + SORT_CSWAP(dst[2], dst[4]); + SORT_CSWAP(dst[11], dst[13]); + SORT_CSWAP(dst[3], dst[8]); + SORT_CSWAP(dst[7], dst[12]); + SORT_CSWAP(dst[6], dst[8]); + SORT_CSWAP(dst[10], dst[12]); + SORT_CSWAP(dst[3], dst[5]); + SORT_CSWAP(dst[7], dst[9]); + SORT_CSWAP(dst[3], dst[4]); + SORT_CSWAP(dst[5], dst[6]); + SORT_CSWAP(dst[7], dst[8]); + SORT_CSWAP(dst[9], dst[10]); + SORT_CSWAP(dst[11], dst[12]); + SORT_CSWAP(dst[6], dst[7]); + SORT_CSWAP(dst[8], dst[9]); +} + + +#define BITONIC_SORT_15 SORT_MAKE_STR(bitonic_sort_15) +static __inline void BITONIC_SORT_15(SORT_TYPE *dst) { + SORT_CSWAP(dst[0], dst[1]); + SORT_CSWAP(dst[2], dst[3]); + SORT_CSWAP(dst[4], dst[5]); + SORT_CSWAP(dst[6], dst[7]); + SORT_CSWAP(dst[8], dst[9]); + SORT_CSWAP(dst[10], dst[11]); + SORT_CSWAP(dst[12], dst[13]); + SORT_CSWAP(dst[0], dst[2]); + SORT_CSWAP(dst[4], dst[6]); + SORT_CSWAP(dst[8], dst[10]); + SORT_CSWAP(dst[12], dst[14]); + SORT_CSWAP(dst[1], dst[3]); + SORT_CSWAP(dst[5], dst[7]); + SORT_CSWAP(dst[9], dst[11]); + SORT_CSWAP(dst[0], dst[4]); + SORT_CSWAP(dst[8], dst[12]); + SORT_CSWAP(dst[1], dst[5]); + SORT_CSWAP(dst[9], dst[13]); + SORT_CSWAP(dst[2], dst[6]); + SORT_CSWAP(dst[10], dst[14]); + SORT_CSWAP(dst[3], dst[7]); + SORT_CSWAP(dst[0], dst[8]); + SORT_CSWAP(dst[1], dst[9]); + SORT_CSWAP(dst[2], dst[10]); + SORT_CSWAP(dst[3], dst[11]); + SORT_CSWAP(dst[4], dst[12]); + SORT_CSWAP(dst[5], dst[13]); + SORT_CSWAP(dst[6], dst[14]); + SORT_CSWAP(dst[5], dst[10]); + SORT_CSWAP(dst[6], dst[9]); + SORT_CSWAP(dst[3], dst[12]); + SORT_CSWAP(dst[13], dst[14]); + SORT_CSWAP(dst[7], dst[11]); + SORT_CSWAP(dst[1], dst[2]); + SORT_CSWAP(dst[4], dst[8]); + SORT_CSWAP(dst[1], dst[4]); + SORT_CSWAP(dst[7], dst[13]); + SORT_CSWAP(dst[2], dst[8]); + SORT_CSWAP(dst[11], dst[14]); + SORT_CSWAP(dst[5], dst[6]); + SORT_CSWAP(dst[9], dst[10]); + SORT_CSWAP(dst[2], dst[4]); + SORT_CSWAP(dst[11], dst[13]); + SORT_CSWAP(dst[3], dst[8]); + SORT_CSWAP(dst[7], dst[12]); + SORT_CSWAP(dst[6], dst[8]); + SORT_CSWAP(dst[10], dst[12]); + SORT_CSWAP(dst[3], dst[5]); + SORT_CSWAP(dst[7], dst[9]); + SORT_CSWAP(dst[3], dst[4]); + SORT_CSWAP(dst[5], dst[6]); + SORT_CSWAP(dst[7], dst[8]); + SORT_CSWAP(dst[9], dst[10]); + SORT_CSWAP(dst[11], dst[12]); + SORT_CSWAP(dst[6], dst[7]); + SORT_CSWAP(dst[8], dst[9]); +} + + +#define BITONIC_SORT_16 SORT_MAKE_STR(bitonic_sort_16) +static __inline void BITONIC_SORT_16(SORT_TYPE *dst) { + SORT_CSWAP(dst[0], dst[1]); + SORT_CSWAP(dst[2], dst[3]); + SORT_CSWAP(dst[4], dst[5]); + SORT_CSWAP(dst[6], dst[7]); + SORT_CSWAP(dst[8], dst[9]); + SORT_CSWAP(dst[10], dst[11]); + SORT_CSWAP(dst[12], dst[13]); + SORT_CSWAP(dst[14], dst[15]); + SORT_CSWAP(dst[0], dst[2]); + SORT_CSWAP(dst[4], dst[6]); + SORT_CSWAP(dst[8], dst[10]); + SORT_CSWAP(dst[12], dst[14]); + SORT_CSWAP(dst[1], dst[3]); + SORT_CSWAP(dst[5], dst[7]); + SORT_CSWAP(dst[9], dst[11]); + SORT_CSWAP(dst[13], dst[15]); + SORT_CSWAP(dst[0], dst[4]); + SORT_CSWAP(dst[8], dst[12]); + SORT_CSWAP(dst[1], dst[5]); + SORT_CSWAP(dst[9], dst[13]); + SORT_CSWAP(dst[2], dst[6]); + SORT_CSWAP(dst[10], dst[14]); + SORT_CSWAP(dst[3], dst[7]); + SORT_CSWAP(dst[11], dst[15]); + SORT_CSWAP(dst[0], dst[8]); + SORT_CSWAP(dst[1], dst[9]); + SORT_CSWAP(dst[2], dst[10]); + SORT_CSWAP(dst[3], dst[11]); + SORT_CSWAP(dst[4], dst[12]); + SORT_CSWAP(dst[5], dst[13]); + SORT_CSWAP(dst[6], dst[14]); + SORT_CSWAP(dst[7], dst[15]); + SORT_CSWAP(dst[5], dst[10]); + SORT_CSWAP(dst[6], dst[9]); + SORT_CSWAP(dst[3], dst[12]); + SORT_CSWAP(dst[13], dst[14]); + SORT_CSWAP(dst[7], dst[11]); + SORT_CSWAP(dst[1], dst[2]); + SORT_CSWAP(dst[4], dst[8]); + SORT_CSWAP(dst[1], dst[4]); + SORT_CSWAP(dst[7], dst[13]); + SORT_CSWAP(dst[2], dst[8]); + SORT_CSWAP(dst[11], dst[14]); + SORT_CSWAP(dst[5], dst[6]); + SORT_CSWAP(dst[9], dst[10]); + SORT_CSWAP(dst[2], dst[4]); + SORT_CSWAP(dst[11], dst[13]); + SORT_CSWAP(dst[3], dst[8]); + SORT_CSWAP(dst[7], dst[12]); + SORT_CSWAP(dst[6], dst[8]); + SORT_CSWAP(dst[10], dst[12]); + SORT_CSWAP(dst[3], dst[5]); + SORT_CSWAP(dst[7], dst[9]); + SORT_CSWAP(dst[3], dst[4]); + SORT_CSWAP(dst[5], dst[6]); + SORT_CSWAP(dst[7], dst[8]); + SORT_CSWAP(dst[9], dst[10]); + SORT_CSWAP(dst[11], dst[12]); + SORT_CSWAP(dst[6], dst[7]); + SORT_CSWAP(dst[8], dst[9]); +} + + +#define BITONIC_SORT_17 SORT_MAKE_STR(bitonic_sort_17) +static __inline void BITONIC_SORT_17(SORT_TYPE *dst) { + SORT_CSWAP(dst[0], dst[1]); + SORT_CSWAP(dst[2], dst[3]); + SORT_CSWAP(dst[4], dst[5]); + SORT_CSWAP(dst[6], dst[7]); + SORT_CSWAP(dst[8], dst[9]); + SORT_CSWAP(dst[10], dst[11]); + SORT_CSWAP(dst[12], dst[13]); + SORT_CSWAP(dst[15], dst[16]); + SORT_CSWAP(dst[0], dst[2]); + SORT_CSWAP(dst[1], dst[3]); + SORT_CSWAP(dst[4], dst[6]); + SORT_CSWAP(dst[5], dst[7]); + SORT_CSWAP(dst[8], dst[10]); + SORT_CSWAP(dst[9], dst[11]); + SORT_CSWAP(dst[14], dst[16]); + SORT_CSWAP(dst[1], dst[2]); + SORT_CSWAP(dst[5], dst[6]); + SORT_CSWAP(dst[0], dst[4]); + SORT_CSWAP(dst[3], dst[7]); + SORT_CSWAP(dst[9], dst[10]); + SORT_CSWAP(dst[14], dst[15]); + SORT_CSWAP(dst[13], dst[16]); + SORT_CSWAP(dst[1], dst[5]); + SORT_CSWAP(dst[2], dst[6]); + SORT_CSWAP(dst[12], dst[15]); + SORT_CSWAP(dst[11], dst[16]); + SORT_CSWAP(dst[1], dst[4]); + SORT_CSWAP(dst[3], dst[6]); + SORT_CSWAP(dst[12], dst[14]); + SORT_CSWAP(dst[13], dst[15]); + SORT_CSWAP(dst[7], dst[16]); + SORT_CSWAP(dst[2], dst[4]); + SORT_CSWAP(dst[3], dst[5]); + SORT_CSWAP(dst[13], dst[14]); + SORT_CSWAP(dst[10], dst[15]); + SORT_CSWAP(dst[3], dst[4]); + SORT_CSWAP(dst[8], dst[13]); + SORT_CSWAP(dst[9], dst[14]); + SORT_CSWAP(dst[11], dst[15]); + SORT_CSWAP(dst[8], dst[12]); + SORT_CSWAP(dst[9], dst[13]); + SORT_CSWAP(dst[11], dst[14]); + SORT_CSWAP(dst[6], dst[15]); + SORT_CSWAP(dst[9], dst[12]); + SORT_CSWAP(dst[10], dst[13]); + SORT_CSWAP(dst[5], dst[14]); + SORT_CSWAP(dst[7], dst[15]); + SORT_CSWAP(dst[10], dst[12]); + SORT_CSWAP(dst[11], dst[13]); + SORT_CSWAP(dst[0], dst[9]); + SORT_CSWAP(dst[7], dst[14]); + SORT_CSWAP(dst[11], dst[12]); + SORT_CSWAP(dst[0], dst[8]); + SORT_CSWAP(dst[1], dst[10]); + SORT_CSWAP(dst[4], dst[13]); + SORT_CSWAP(dst[1], dst[9]); + SORT_CSWAP(dst[2], dst[11]); + SORT_CSWAP(dst[3], dst[12]); + SORT_CSWAP(dst[5], dst[13]); + SORT_CSWAP(dst[1], dst[8]); + SORT_CSWAP(dst[3], dst[11]); + SORT_CSWAP(dst[2], dst[9]); + SORT_CSWAP(dst[6], dst[13]); + SORT_CSWAP(dst[2], dst[8]); + SORT_CSWAP(dst[3], dst[10]); + SORT_CSWAP(dst[7], dst[13]); + SORT_CSWAP(dst[6], dst[11]); + SORT_CSWAP(dst[3], dst[9]); + SORT_CSWAP(dst[5], dst[10]); + SORT_CSWAP(dst[7], dst[12]); + SORT_CSWAP(dst[3], dst[8]); + SORT_CSWAP(dst[4], dst[9]); + SORT_CSWAP(dst[7], dst[11]); + SORT_CSWAP(dst[4], dst[8]); + SORT_CSWAP(dst[5], dst[9]); + SORT_CSWAP(dst[7], dst[10]); + SORT_CSWAP(dst[5], dst[8]); + SORT_CSWAP(dst[6], dst[9]); + SORT_CSWAP(dst[6], dst[8]); + SORT_CSWAP(dst[7], dst[9]); + SORT_CSWAP(dst[7], dst[8]); +} + + +#define BITONIC_SORT_18 SORT_MAKE_STR(bitonic_sort_18) +static __inline void BITONIC_SORT_18(SORT_TYPE *dst) { + SORT_CSWAP(dst[0], dst[1]); + SORT_CSWAP(dst[2], dst[3]); + SORT_CSWAP(dst[4], dst[5]); + SORT_CSWAP(dst[7], dst[8]); + SORT_CSWAP(dst[9], dst[10]); + SORT_CSWAP(dst[11], dst[12]); + SORT_CSWAP(dst[13], dst[14]); + SORT_CSWAP(dst[16], dst[17]); + SORT_CSWAP(dst[0], dst[2]); + SORT_CSWAP(dst[1], dst[3]); + SORT_CSWAP(dst[6], dst[8]); + SORT_CSWAP(dst[9], dst[11]); + SORT_CSWAP(dst[10], dst[12]); + SORT_CSWAP(dst[15], dst[17]); + SORT_CSWAP(dst[1], dst[2]); + SORT_CSWAP(dst[6], dst[7]); + SORT_CSWAP(dst[5], dst[8]); + SORT_CSWAP(dst[10], dst[11]); + SORT_CSWAP(dst[15], dst[16]); + SORT_CSWAP(dst[14], dst[17]); + SORT_CSWAP(dst[4], dst[7]); + SORT_CSWAP(dst[3], dst[8]); + SORT_CSWAP(dst[13], dst[16]); + SORT_CSWAP(dst[12], dst[17]); + SORT_CSWAP(dst[4], dst[6]); + SORT_CSWAP(dst[5], dst[7]); + SORT_CSWAP(dst[13], dst[15]); + SORT_CSWAP(dst[14], dst[16]); + SORT_CSWAP(dst[8], dst[17]); + SORT_CSWAP(dst[5], dst[6]); + SORT_CSWAP(dst[2], dst[7]); + SORT_CSWAP(dst[14], dst[15]); + SORT_CSWAP(dst[11], dst[16]); + SORT_CSWAP(dst[0], dst[5]); + SORT_CSWAP(dst[1], dst[6]); + SORT_CSWAP(dst[3], dst[7]); + SORT_CSWAP(dst[9], dst[14]); + SORT_CSWAP(dst[10], dst[15]); + SORT_CSWAP(dst[12], dst[16]); + SORT_CSWAP(dst[0], dst[4]); + SORT_CSWAP(dst[1], dst[5]); + SORT_CSWAP(dst[3], dst[6]); + SORT_CSWAP(dst[9], dst[13]); + SORT_CSWAP(dst[10], dst[14]); + SORT_CSWAP(dst[12], dst[15]); + SORT_CSWAP(dst[7], dst[16]); + SORT_CSWAP(dst[1], dst[4]); + SORT_CSWAP(dst[2], dst[5]); + SORT_CSWAP(dst[10], dst[13]); + SORT_CSWAP(dst[11], dst[14]); + SORT_CSWAP(dst[0], dst[9]); + SORT_CSWAP(dst[6], dst[15]); + SORT_CSWAP(dst[8], dst[16]); + SORT_CSWAP(dst[2], dst[4]); + SORT_CSWAP(dst[3], dst[5]); + SORT_CSWAP(dst[11], dst[13]); + SORT_CSWAP(dst[12], dst[14]); + SORT_CSWAP(dst[1], dst[10]); + SORT_CSWAP(dst[7], dst[15]); + SORT_CSWAP(dst[3], dst[4]); + SORT_CSWAP(dst[12], dst[13]); + SORT_CSWAP(dst[1], dst[9]); + SORT_CSWAP(dst[2], dst[11]); + SORT_CSWAP(dst[5], dst[14]); + SORT_CSWAP(dst[8], dst[15]); + SORT_CSWAP(dst[3], dst[12]); + SORT_CSWAP(dst[2], dst[9]); + SORT_CSWAP(dst[4], dst[13]); + SORT_CSWAP(dst[7], dst[14]); + SORT_CSWAP(dst[3], dst[11]); + SORT_CSWAP(dst[5], dst[13]); + SORT_CSWAP(dst[8], dst[14]); + SORT_CSWAP(dst[3], dst[10]); + SORT_CSWAP(dst[6], dst[13]); + SORT_CSWAP(dst[3], dst[9]); + SORT_CSWAP(dst[7], dst[13]); + SORT_CSWAP(dst[5], dst[10]); + SORT_CSWAP(dst[6], dst[11]); + SORT_CSWAP(dst[8], dst[13]); + SORT_CSWAP(dst[4], dst[9]); + SORT_CSWAP(dst[7], dst[12]); + SORT_CSWAP(dst[5], dst[9]); + SORT_CSWAP(dst[8], dst[12]); + SORT_CSWAP(dst[7], dst[11]); + SORT_CSWAP(dst[8], dst[11]); + SORT_CSWAP(dst[6], dst[9]); + SORT_CSWAP(dst[7], dst[10]); + SORT_CSWAP(dst[8], dst[10]); + SORT_CSWAP(dst[7], dst[9]); + SORT_CSWAP(dst[8], dst[9]); +} + + +#define BITONIC_SORT_19 SORT_MAKE_STR(bitonic_sort_19) +static __inline void BITONIC_SORT_19(SORT_TYPE *dst) { + SORT_CSWAP(dst[0], dst[1]); + SORT_CSWAP(dst[2], dst[3]); + SORT_CSWAP(dst[4], dst[5]); + SORT_CSWAP(dst[7], dst[8]); + SORT_CSWAP(dst[9], dst[10]); + SORT_CSWAP(dst[12], dst[13]); + SORT_CSWAP(dst[14], dst[15]); + SORT_CSWAP(dst[17], dst[18]); + SORT_CSWAP(dst[0], dst[2]); + SORT_CSWAP(dst[1], dst[3]); + SORT_CSWAP(dst[6], dst[8]); + SORT_CSWAP(dst[11], dst[13]); + SORT_CSWAP(dst[16], dst[18]); + SORT_CSWAP(dst[1], dst[2]); + SORT_CSWAP(dst[6], dst[7]); + SORT_CSWAP(dst[5], dst[8]); + SORT_CSWAP(dst[11], dst[12]); + SORT_CSWAP(dst[10], dst[13]); + SORT_CSWAP(dst[16], dst[17]); + SORT_CSWAP(dst[15], dst[18]); + SORT_CSWAP(dst[4], dst[7]); + SORT_CSWAP(dst[3], dst[8]); + SORT_CSWAP(dst[9], dst[12]); + SORT_CSWAP(dst[14], dst[17]); + SORT_CSWAP(dst[13], dst[18]); + SORT_CSWAP(dst[4], dst[6]); + SORT_CSWAP(dst[5], dst[7]); + SORT_CSWAP(dst[9], dst[11]); + SORT_CSWAP(dst[10], dst[12]); + SORT_CSWAP(dst[14], dst[16]); + SORT_CSWAP(dst[15], dst[17]); + SORT_CSWAP(dst[8], dst[18]); + SORT_CSWAP(dst[5], dst[6]); + SORT_CSWAP(dst[2], dst[7]); + SORT_CSWAP(dst[10], dst[11]); + SORT_CSWAP(dst[15], dst[16]); + SORT_CSWAP(dst[9], dst[14]); + SORT_CSWAP(dst[12], dst[17]); + SORT_CSWAP(dst[0], dst[5]); + SORT_CSWAP(dst[1], dst[6]); + SORT_CSWAP(dst[3], dst[7]); + SORT_CSWAP(dst[10], dst[15]); + SORT_CSWAP(dst[11], dst[16]); + SORT_CSWAP(dst[13], dst[17]); + SORT_CSWAP(dst[0], dst[4]); + SORT_CSWAP(dst[1], dst[5]); + SORT_CSWAP(dst[3], dst[6]); + SORT_CSWAP(dst[10], dst[14]); + SORT_CSWAP(dst[12], dst[16]); + SORT_CSWAP(dst[7], dst[17]); + SORT_CSWAP(dst[1], dst[4]); + SORT_CSWAP(dst[2], dst[5]); + SORT_CSWAP(dst[13], dst[16]); + SORT_CSWAP(dst[11], dst[14]); + SORT_CSWAP(dst[12], dst[15]); + SORT_CSWAP(dst[0], dst[10]); + SORT_CSWAP(dst[8], dst[17]); + SORT_CSWAP(dst[2], dst[4]); + SORT_CSWAP(dst[3], dst[5]); + SORT_CSWAP(dst[13], dst[15]); + SORT_CSWAP(dst[12], dst[14]); + SORT_CSWAP(dst[0], dst[9]); + SORT_CSWAP(dst[1], dst[11]); + SORT_CSWAP(dst[6], dst[16]); + SORT_CSWAP(dst[3], dst[4]); + SORT_CSWAP(dst[13], dst[14]); + SORT_CSWAP(dst[1], dst[10]); + SORT_CSWAP(dst[2], dst[12]); + SORT_CSWAP(dst[5], dst[15]); + SORT_CSWAP(dst[7], dst[16]); + SORT_CSWAP(dst[1], dst[9]); + SORT_CSWAP(dst[3], dst[13]); + SORT_CSWAP(dst[2], dst[10]); + SORT_CSWAP(dst[4], dst[14]); + SORT_CSWAP(dst[8], dst[16]); + SORT_CSWAP(dst[7], dst[15]); + SORT_CSWAP(dst[3], dst[12]); + SORT_CSWAP(dst[2], dst[9]); + SORT_CSWAP(dst[5], dst[14]); + SORT_CSWAP(dst[8], dst[15]); + SORT_CSWAP(dst[3], dst[11]); + SORT_CSWAP(dst[6], dst[14]); + SORT_CSWAP(dst[3], dst[10]); + SORT_CSWAP(dst[7], dst[14]); + SORT_CSWAP(dst[6], dst[11]); + SORT_CSWAP(dst[3], dst[9]); + SORT_CSWAP(dst[8], dst[14]); + SORT_CSWAP(dst[5], dst[10]); + SORT_CSWAP(dst[7], dst[12]); + SORT_CSWAP(dst[4], dst[9]); + SORT_CSWAP(dst[8], dst[13]); + SORT_CSWAP(dst[7], dst[11]); + SORT_CSWAP(dst[5], dst[9]); + SORT_CSWAP(dst[8], dst[12]); + SORT_CSWAP(dst[7], dst[10]); + SORT_CSWAP(dst[8], dst[11]); + SORT_CSWAP(dst[6], dst[9]); + SORT_CSWAP(dst[8], dst[10]); + SORT_CSWAP(dst[7], dst[9]); + SORT_CSWAP(dst[8], dst[9]); +} + + +#define BITONIC_SORT_20 SORT_MAKE_STR(bitonic_sort_20) +static __inline void BITONIC_SORT_20(SORT_TYPE *dst) { + SORT_CSWAP(dst[0], dst[1]); + SORT_CSWAP(dst[3], dst[4]); + SORT_CSWAP(dst[5], dst[6]); + SORT_CSWAP(dst[8], dst[9]); + SORT_CSWAP(dst[10], dst[11]); + SORT_CSWAP(dst[13], dst[14]); + SORT_CSWAP(dst[15], dst[16]); + SORT_CSWAP(dst[18], dst[19]); + SORT_CSWAP(dst[2], dst[4]); + SORT_CSWAP(dst[7], dst[9]); + SORT_CSWAP(dst[12], dst[14]); + SORT_CSWAP(dst[17], dst[19]); + SORT_CSWAP(dst[2], dst[3]); + SORT_CSWAP(dst[1], dst[4]); + SORT_CSWAP(dst[7], dst[8]); + SORT_CSWAP(dst[6], dst[9]); + SORT_CSWAP(dst[12], dst[13]); + SORT_CSWAP(dst[11], dst[14]); + SORT_CSWAP(dst[17], dst[18]); + SORT_CSWAP(dst[16], dst[19]); + SORT_CSWAP(dst[0], dst[3]); + SORT_CSWAP(dst[5], dst[8]); + SORT_CSWAP(dst[4], dst[9]); + SORT_CSWAP(dst[10], dst[13]); + SORT_CSWAP(dst[15], dst[18]); + SORT_CSWAP(dst[14], dst[19]); + SORT_CSWAP(dst[0], dst[2]); + SORT_CSWAP(dst[1], dst[3]); + SORT_CSWAP(dst[5], dst[7]); + SORT_CSWAP(dst[6], dst[8]); + SORT_CSWAP(dst[10], dst[12]); + SORT_CSWAP(dst[11], dst[13]); + SORT_CSWAP(dst[15], dst[17]); + SORT_CSWAP(dst[16], dst[18]); + SORT_CSWAP(dst[9], dst[19]); + SORT_CSWAP(dst[1], dst[2]); + SORT_CSWAP(dst[6], dst[7]); + SORT_CSWAP(dst[0], dst[5]); + SORT_CSWAP(dst[3], dst[8]); + SORT_CSWAP(dst[11], dst[12]); + SORT_CSWAP(dst[16], dst[17]); + SORT_CSWAP(dst[10], dst[15]); + SORT_CSWAP(dst[13], dst[18]); + SORT_CSWAP(dst[1], dst[6]); + SORT_CSWAP(dst[2], dst[7]); + SORT_CSWAP(dst[4], dst[8]); + SORT_CSWAP(dst[11], dst[16]); + SORT_CSWAP(dst[12], dst[17]); + SORT_CSWAP(dst[14], dst[18]); + SORT_CSWAP(dst[0], dst[10]); + SORT_CSWAP(dst[1], dst[5]); + SORT_CSWAP(dst[3], dst[7]); + SORT_CSWAP(dst[11], dst[15]); + SORT_CSWAP(dst[13], dst[17]); + SORT_CSWAP(dst[8], dst[18]); + SORT_CSWAP(dst[4], dst[7]); + SORT_CSWAP(dst[2], dst[5]); + SORT_CSWAP(dst[3], dst[6]); + SORT_CSWAP(dst[14], dst[17]); + SORT_CSWAP(dst[12], dst[15]); + SORT_CSWAP(dst[13], dst[16]); + SORT_CSWAP(dst[1], dst[11]); + SORT_CSWAP(dst[9], dst[18]); + SORT_CSWAP(dst[4], dst[6]); + SORT_CSWAP(dst[3], dst[5]); + SORT_CSWAP(dst[14], dst[16]); + SORT_CSWAP(dst[13], dst[15]); + SORT_CSWAP(dst[1], dst[10]); + SORT_CSWAP(dst[2], dst[12]); + SORT_CSWAP(dst[7], dst[17]); + SORT_CSWAP(dst[4], dst[5]); + SORT_CSWAP(dst[14], dst[15]); + SORT_CSWAP(dst[3], dst[13]); + SORT_CSWAP(dst[2], dst[10]); + SORT_CSWAP(dst[6], dst[16]); + SORT_CSWAP(dst[8], dst[17]); + SORT_CSWAP(dst[4], dst[14]); + SORT_CSWAP(dst[3], dst[12]); + SORT_CSWAP(dst[5], dst[15]); + SORT_CSWAP(dst[9], dst[17]); + SORT_CSWAP(dst[8], dst[16]); + SORT_CSWAP(dst[4], dst[13]); + SORT_CSWAP(dst[3], dst[11]); + SORT_CSWAP(dst[6], dst[15]); + SORT_CSWAP(dst[9], dst[16]); + SORT_CSWAP(dst[4], dst[12]); + SORT_CSWAP(dst[3], dst[10]); + SORT_CSWAP(dst[7], dst[15]); + SORT_CSWAP(dst[4], dst[11]); + SORT_CSWAP(dst[8], dst[15]); + SORT_CSWAP(dst[7], dst[12]); + SORT_CSWAP(dst[4], dst[10]); + SORT_CSWAP(dst[9], dst[15]); + SORT_CSWAP(dst[6], dst[11]); + SORT_CSWAP(dst[8], dst[13]); + SORT_CSWAP(dst[5], dst[10]); + SORT_CSWAP(dst[9], dst[14]); + SORT_CSWAP(dst[8], dst[12]); + SORT_CSWAP(dst[6], dst[10]); + SORT_CSWAP(dst[9], dst[13]); + SORT_CSWAP(dst[8], dst[11]); + SORT_CSWAP(dst[9], dst[12]); + SORT_CSWAP(dst[7], dst[10]); + SORT_CSWAP(dst[9], dst[11]); + SORT_CSWAP(dst[8], dst[10]); + SORT_CSWAP(dst[9], dst[10]); +} + + +#define BITONIC_SORT_21 SORT_MAKE_STR(bitonic_sort_21) +static __inline void BITONIC_SORT_21(SORT_TYPE *dst) { + SORT_CSWAP(dst[0], dst[1]); + SORT_CSWAP(dst[3], dst[4]); + SORT_CSWAP(dst[5], dst[6]); + SORT_CSWAP(dst[8], dst[9]); + SORT_CSWAP(dst[10], dst[11]); + SORT_CSWAP(dst[13], dst[14]); + SORT_CSWAP(dst[16], dst[17]); + SORT_CSWAP(dst[19], dst[20]); + SORT_CSWAP(dst[2], dst[4]); + SORT_CSWAP(dst[7], dst[9]); + SORT_CSWAP(dst[12], dst[14]); + SORT_CSWAP(dst[15], dst[17]); + SORT_CSWAP(dst[18], dst[20]); + SORT_CSWAP(dst[2], dst[3]); + SORT_CSWAP(dst[1], dst[4]); + SORT_CSWAP(dst[7], dst[8]); + SORT_CSWAP(dst[6], dst[9]); + SORT_CSWAP(dst[12], dst[13]); + SORT_CSWAP(dst[11], dst[14]); + SORT_CSWAP(dst[15], dst[16]); + SORT_CSWAP(dst[18], dst[19]); + SORT_CSWAP(dst[17], dst[20]); + SORT_CSWAP(dst[0], dst[3]); + SORT_CSWAP(dst[5], dst[8]); + SORT_CSWAP(dst[4], dst[9]); + SORT_CSWAP(dst[10], dst[13]); + SORT_CSWAP(dst[15], dst[18]); + SORT_CSWAP(dst[16], dst[19]); + SORT_CSWAP(dst[14], dst[20]); + SORT_CSWAP(dst[0], dst[2]); + SORT_CSWAP(dst[1], dst[3]); + SORT_CSWAP(dst[5], dst[7]); + SORT_CSWAP(dst[6], dst[8]); + SORT_CSWAP(dst[10], dst[12]); + SORT_CSWAP(dst[11], dst[13]); + SORT_CSWAP(dst[17], dst[19]); + SORT_CSWAP(dst[16], dst[18]); + SORT_CSWAP(dst[9], dst[20]); + SORT_CSWAP(dst[1], dst[2]); + SORT_CSWAP(dst[6], dst[7]); + SORT_CSWAP(dst[0], dst[5]); + SORT_CSWAP(dst[3], dst[8]); + SORT_CSWAP(dst[11], dst[12]); + SORT_CSWAP(dst[17], dst[18]); + SORT_CSWAP(dst[10], dst[16]); + SORT_CSWAP(dst[13], dst[19]); + SORT_CSWAP(dst[1], dst[6]); + SORT_CSWAP(dst[2], dst[7]); + SORT_CSWAP(dst[4], dst[8]); + SORT_CSWAP(dst[10], dst[15]); + SORT_CSWAP(dst[11], dst[17]); + SORT_CSWAP(dst[12], dst[18]); + SORT_CSWAP(dst[14], dst[19]); + SORT_CSWAP(dst[1], dst[5]); + SORT_CSWAP(dst[3], dst[7]); + SORT_CSWAP(dst[11], dst[16]); + SORT_CSWAP(dst[13], dst[18]); + SORT_CSWAP(dst[8], dst[19]); + SORT_CSWAP(dst[4], dst[7]); + SORT_CSWAP(dst[2], dst[5]); + SORT_CSWAP(dst[3], dst[6]); + SORT_CSWAP(dst[11], dst[15]); + SORT_CSWAP(dst[14], dst[18]); + SORT_CSWAP(dst[13], dst[16]); + SORT_CSWAP(dst[9], dst[19]); + SORT_CSWAP(dst[4], dst[6]); + SORT_CSWAP(dst[3], dst[5]); + SORT_CSWAP(dst[12], dst[15]); + SORT_CSWAP(dst[14], dst[17]); + SORT_CSWAP(dst[0], dst[11]); + SORT_CSWAP(dst[7], dst[18]); + SORT_CSWAP(dst[4], dst[5]); + SORT_CSWAP(dst[14], dst[16]); + SORT_CSWAP(dst[13], dst[15]); + SORT_CSWAP(dst[0], dst[10]); + SORT_CSWAP(dst[1], dst[12]); + SORT_CSWAP(dst[6], dst[17]); + SORT_CSWAP(dst[8], dst[18]); + SORT_CSWAP(dst[14], dst[15]); + SORT_CSWAP(dst[1], dst[11]); + SORT_CSWAP(dst[2], dst[13]); + SORT_CSWAP(dst[5], dst[16]); + SORT_CSWAP(dst[9], dst[18]); + SORT_CSWAP(dst[8], dst[17]); + SORT_CSWAP(dst[1], dst[10]); + SORT_CSWAP(dst[3], dst[14]); + SORT_CSWAP(dst[4], dst[15]); + SORT_CSWAP(dst[6], dst[16]); + SORT_CSWAP(dst[9], dst[17]); + SORT_CSWAP(dst[4], dst[14]); + SORT_CSWAP(dst[3], dst[13]); + SORT_CSWAP(dst[2], dst[10]); + SORT_CSWAP(dst[7], dst[16]); + SORT_CSWAP(dst[4], dst[13]); + SORT_CSWAP(dst[3], dst[11]); + SORT_CSWAP(dst[8], dst[16]); + SORT_CSWAP(dst[4], dst[12]); + SORT_CSWAP(dst[3], dst[10]); + SORT_CSWAP(dst[9], dst[16]); + SORT_CSWAP(dst[7], dst[13]); + SORT_CSWAP(dst[8], dst[14]); + SORT_CSWAP(dst[4], dst[11]); + SORT_CSWAP(dst[6], dst[12]); + SORT_CSWAP(dst[9], dst[15]); + SORT_CSWAP(dst[8], dst[13]); + SORT_CSWAP(dst[4], dst[10]); + SORT_CSWAP(dst[5], dst[11]); + SORT_CSWAP(dst[9], dst[14]); + SORT_CSWAP(dst[5], dst[10]); + SORT_CSWAP(dst[6], dst[11]); + SORT_CSWAP(dst[9], dst[13]); + SORT_CSWAP(dst[6], dst[10]); + SORT_CSWAP(dst[8], dst[11]); + SORT_CSWAP(dst[9], dst[12]); + SORT_CSWAP(dst[7], dst[10]); + SORT_CSWAP(dst[9], dst[11]); + SORT_CSWAP(dst[8], dst[10]); + SORT_CSWAP(dst[9], dst[10]); +} + + +#define BITONIC_SORT_22 SORT_MAKE_STR(bitonic_sort_22) +static __inline void BITONIC_SORT_22(SORT_TYPE *dst) { + SORT_CSWAP(dst[0], dst[1]); + SORT_CSWAP(dst[3], dst[4]); + SORT_CSWAP(dst[6], dst[7]); + SORT_CSWAP(dst[9], dst[10]); + SORT_CSWAP(dst[11], dst[12]); + SORT_CSWAP(dst[14], dst[15]); + SORT_CSWAP(dst[17], dst[18]); + SORT_CSWAP(dst[20], dst[21]); + SORT_CSWAP(dst[2], dst[4]); + SORT_CSWAP(dst[5], dst[7]); + SORT_CSWAP(dst[8], dst[10]); + SORT_CSWAP(dst[13], dst[15]); + SORT_CSWAP(dst[16], dst[18]); + SORT_CSWAP(dst[19], dst[21]); + SORT_CSWAP(dst[2], dst[3]); + SORT_CSWAP(dst[1], dst[4]); + SORT_CSWAP(dst[5], dst[6]); + SORT_CSWAP(dst[8], dst[9]); + SORT_CSWAP(dst[7], dst[10]); + SORT_CSWAP(dst[13], dst[14]); + SORT_CSWAP(dst[12], dst[15]); + SORT_CSWAP(dst[16], dst[17]); + SORT_CSWAP(dst[19], dst[20]); + SORT_CSWAP(dst[18], dst[21]); + SORT_CSWAP(dst[0], dst[3]); + SORT_CSWAP(dst[5], dst[8]); + SORT_CSWAP(dst[6], dst[9]); + SORT_CSWAP(dst[4], dst[10]); + SORT_CSWAP(dst[11], dst[14]); + SORT_CSWAP(dst[16], dst[19]); + SORT_CSWAP(dst[17], dst[20]); + SORT_CSWAP(dst[15], dst[21]); + SORT_CSWAP(dst[0], dst[2]); + SORT_CSWAP(dst[1], dst[3]); + SORT_CSWAP(dst[7], dst[9]); + SORT_CSWAP(dst[6], dst[8]); + SORT_CSWAP(dst[11], dst[13]); + SORT_CSWAP(dst[12], dst[14]); + SORT_CSWAP(dst[18], dst[20]); + SORT_CSWAP(dst[17], dst[19]); + SORT_CSWAP(dst[10], dst[21]); + SORT_CSWAP(dst[1], dst[2]); + SORT_CSWAP(dst[7], dst[8]); + SORT_CSWAP(dst[0], dst[6]); + SORT_CSWAP(dst[3], dst[9]); + SORT_CSWAP(dst[12], dst[13]); + SORT_CSWAP(dst[18], dst[19]); + SORT_CSWAP(dst[11], dst[17]); + SORT_CSWAP(dst[14], dst[20]); + SORT_CSWAP(dst[0], dst[5]); + SORT_CSWAP(dst[1], dst[7]); + SORT_CSWAP(dst[2], dst[8]); + SORT_CSWAP(dst[4], dst[9]); + SORT_CSWAP(dst[11], dst[16]); + SORT_CSWAP(dst[12], dst[18]); + SORT_CSWAP(dst[13], dst[19]); + SORT_CSWAP(dst[15], dst[20]); + SORT_CSWAP(dst[1], dst[6]); + SORT_CSWAP(dst[3], dst[8]); + SORT_CSWAP(dst[12], dst[17]); + SORT_CSWAP(dst[14], dst[19]); + SORT_CSWAP(dst[0], dst[11]); + SORT_CSWAP(dst[9], dst[20]); + SORT_CSWAP(dst[1], dst[5]); + SORT_CSWAP(dst[4], dst[8]); + SORT_CSWAP(dst[3], dst[6]); + SORT_CSWAP(dst[12], dst[16]); + SORT_CSWAP(dst[15], dst[19]); + SORT_CSWAP(dst[14], dst[17]); + SORT_CSWAP(dst[10], dst[20]); + SORT_CSWAP(dst[2], dst[5]); + SORT_CSWAP(dst[4], dst[7]); + SORT_CSWAP(dst[13], dst[16]); + SORT_CSWAP(dst[15], dst[18]); + SORT_CSWAP(dst[1], dst[12]); + SORT_CSWAP(dst[8], dst[19]); + SORT_CSWAP(dst[4], dst[6]); + SORT_CSWAP(dst[3], dst[5]); + SORT_CSWAP(dst[15], dst[17]); + SORT_CSWAP(dst[14], dst[16]); + SORT_CSWAP(dst[1], dst[11]); + SORT_CSWAP(dst[2], dst[13]); + SORT_CSWAP(dst[7], dst[18]); + SORT_CSWAP(dst[9], dst[19]); + SORT_CSWAP(dst[4], dst[5]); + SORT_CSWAP(dst[15], dst[16]); + SORT_CSWAP(dst[3], dst[14]); + SORT_CSWAP(dst[2], dst[11]); + SORT_CSWAP(dst[6], dst[17]); + SORT_CSWAP(dst[10], dst[19]); + SORT_CSWAP(dst[4], dst[15]); + SORT_CSWAP(dst[3], dst[13]); + SORT_CSWAP(dst[5], dst[16]); + SORT_CSWAP(dst[7], dst[17]); + SORT_CSWAP(dst[10], dst[18]); + SORT_CSWAP(dst[4], dst[14]); + SORT_CSWAP(dst[3], dst[12]); + SORT_CSWAP(dst[6], dst[16]); + SORT_CSWAP(dst[9], dst[17]); + SORT_CSWAP(dst[4], dst[13]); + SORT_CSWAP(dst[3], dst[11]); + SORT_CSWAP(dst[7], dst[16]); + SORT_CSWAP(dst[10], dst[17]); + SORT_CSWAP(dst[4], dst[12]); + SORT_CSWAP(dst[8], dst[16]); + SORT_CSWAP(dst[7], dst[13]); + SORT_CSWAP(dst[4], dst[11]); + SORT_CSWAP(dst[9], dst[16]); + SORT_CSWAP(dst[6], dst[12]); + SORT_CSWAP(dst[8], dst[14]); + SORT_CSWAP(dst[10], dst[16]); + SORT_CSWAP(dst[5], dst[11]); + SORT_CSWAP(dst[7], dst[12]); + SORT_CSWAP(dst[9], dst[15]); + SORT_CSWAP(dst[6], dst[11]); + SORT_CSWAP(dst[10], dst[15]); + SORT_CSWAP(dst[9], dst[14]); + SORT_CSWAP(dst[7], dst[11]); + SORT_CSWAP(dst[10], dst[14]); + SORT_CSWAP(dst[9], dst[12]); + SORT_CSWAP(dst[8], dst[11]); + SORT_CSWAP(dst[10], dst[13]); + SORT_CSWAP(dst[10], dst[12]); + SORT_CSWAP(dst[9], dst[11]); + SORT_CSWAP(dst[10], dst[11]); +} + + +#define BITONIC_SORT_23 SORT_MAKE_STR(bitonic_sort_23) +static __inline void BITONIC_SORT_23(SORT_TYPE *dst) { + SORT_CSWAP(dst[0], dst[1]); + SORT_CSWAP(dst[3], dst[4]); + SORT_CSWAP(dst[6], dst[7]); + SORT_CSWAP(dst[9], dst[10]); + SORT_CSWAP(dst[12], dst[13]); + SORT_CSWAP(dst[15], dst[16]); + SORT_CSWAP(dst[18], dst[19]); + SORT_CSWAP(dst[21], dst[22]); + SORT_CSWAP(dst[2], dst[4]); + SORT_CSWAP(dst[5], dst[7]); + SORT_CSWAP(dst[8], dst[10]); + SORT_CSWAP(dst[11], dst[13]); + SORT_CSWAP(dst[14], dst[16]); + SORT_CSWAP(dst[17], dst[19]); + SORT_CSWAP(dst[20], dst[22]); + SORT_CSWAP(dst[2], dst[3]); + SORT_CSWAP(dst[1], dst[4]); + SORT_CSWAP(dst[5], dst[6]); + SORT_CSWAP(dst[8], dst[9]); + SORT_CSWAP(dst[7], dst[10]); + SORT_CSWAP(dst[11], dst[12]); + SORT_CSWAP(dst[14], dst[15]); + SORT_CSWAP(dst[13], dst[16]); + SORT_CSWAP(dst[17], dst[18]); + SORT_CSWAP(dst[20], dst[21]); + SORT_CSWAP(dst[19], dst[22]); + SORT_CSWAP(dst[0], dst[3]); + SORT_CSWAP(dst[5], dst[8]); + SORT_CSWAP(dst[6], dst[9]); + SORT_CSWAP(dst[4], dst[10]); + SORT_CSWAP(dst[11], dst[14]); + SORT_CSWAP(dst[12], dst[15]); + SORT_CSWAP(dst[17], dst[20]); + SORT_CSWAP(dst[18], dst[21]); + SORT_CSWAP(dst[16], dst[22]); + SORT_CSWAP(dst[0], dst[2]); + SORT_CSWAP(dst[1], dst[3]); + SORT_CSWAP(dst[7], dst[9]); + SORT_CSWAP(dst[6], dst[8]); + SORT_CSWAP(dst[13], dst[15]); + SORT_CSWAP(dst[12], dst[14]); + SORT_CSWAP(dst[19], dst[21]); + SORT_CSWAP(dst[18], dst[20]); + SORT_CSWAP(dst[11], dst[17]); + SORT_CSWAP(dst[10], dst[22]); + SORT_CSWAP(dst[1], dst[2]); + SORT_CSWAP(dst[7], dst[8]); + SORT_CSWAP(dst[0], dst[6]); + SORT_CSWAP(dst[3], dst[9]); + SORT_CSWAP(dst[13], dst[14]); + SORT_CSWAP(dst[19], dst[20]); + SORT_CSWAP(dst[12], dst[18]); + SORT_CSWAP(dst[15], dst[21]); + SORT_CSWAP(dst[0], dst[5]); + SORT_CSWAP(dst[1], dst[7]); + SORT_CSWAP(dst[2], dst[8]); + SORT_CSWAP(dst[4], dst[9]); + SORT_CSWAP(dst[13], dst[19]); + SORT_CSWAP(dst[12], dst[17]); + SORT_CSWAP(dst[14], dst[20]); + SORT_CSWAP(dst[16], dst[21]); + SORT_CSWAP(dst[1], dst[6]); + SORT_CSWAP(dst[3], dst[8]); + SORT_CSWAP(dst[13], dst[18]); + SORT_CSWAP(dst[15], dst[20]); + SORT_CSWAP(dst[0], dst[12]); + SORT_CSWAP(dst[9], dst[21]); + SORT_CSWAP(dst[1], dst[5]); + SORT_CSWAP(dst[4], dst[8]); + SORT_CSWAP(dst[3], dst[6]); + SORT_CSWAP(dst[13], dst[17]); + SORT_CSWAP(dst[16], dst[20]); + SORT_CSWAP(dst[15], dst[18]); + SORT_CSWAP(dst[0], dst[11]); + SORT_CSWAP(dst[10], dst[21]); + SORT_CSWAP(dst[2], dst[5]); + SORT_CSWAP(dst[4], dst[7]); + SORT_CSWAP(dst[14], dst[17]); + SORT_CSWAP(dst[16], dst[19]); + SORT_CSWAP(dst[1], dst[13]); + SORT_CSWAP(dst[8], dst[20]); + SORT_CSWAP(dst[4], dst[6]); + SORT_CSWAP(dst[3], dst[5]); + SORT_CSWAP(dst[16], dst[18]); + SORT_CSWAP(dst[15], dst[17]); + SORT_CSWAP(dst[1], dst[12]); + SORT_CSWAP(dst[2], dst[14]); + SORT_CSWAP(dst[7], dst[19]); + SORT_CSWAP(dst[9], dst[20]); + SORT_CSWAP(dst[4], dst[5]); + SORT_CSWAP(dst[16], dst[17]); + SORT_CSWAP(dst[1], dst[11]); + SORT_CSWAP(dst[3], dst[15]); + SORT_CSWAP(dst[6], dst[18]); + SORT_CSWAP(dst[10], dst[20]); + SORT_CSWAP(dst[4], dst[16]); + SORT_CSWAP(dst[3], dst[14]); + SORT_CSWAP(dst[2], dst[11]); + SORT_CSWAP(dst[5], dst[17]); + SORT_CSWAP(dst[7], dst[18]); + SORT_CSWAP(dst[10], dst[19]); + SORT_CSWAP(dst[4], dst[15]); + SORT_CSWAP(dst[3], dst[12]); + SORT_CSWAP(dst[6], dst[17]); + SORT_CSWAP(dst[9], dst[18]); + SORT_CSWAP(dst[4], dst[14]); + SORT_CSWAP(dst[3], dst[11]); + SORT_CSWAP(dst[7], dst[17]); + SORT_CSWAP(dst[10], dst[18]); + SORT_CSWAP(dst[4], dst[13]); + SORT_CSWAP(dst[8], dst[17]); + SORT_CSWAP(dst[4], dst[12]); + SORT_CSWAP(dst[9], dst[17]); + SORT_CSWAP(dst[7], dst[13]); + SORT_CSWAP(dst[8], dst[14]); + SORT_CSWAP(dst[4], dst[11]); + SORT_CSWAP(dst[10], dst[17]); + SORT_CSWAP(dst[6], dst[12]); + SORT_CSWAP(dst[9], dst[15]); + SORT_CSWAP(dst[5], dst[11]); + SORT_CSWAP(dst[7], dst[12]); + SORT_CSWAP(dst[10], dst[16]); + SORT_CSWAP(dst[9], dst[14]); + SORT_CSWAP(dst[6], dst[11]); + SORT_CSWAP(dst[10], dst[15]); + SORT_CSWAP(dst[9], dst[12]); + SORT_CSWAP(dst[7], dst[11]); + SORT_CSWAP(dst[10], dst[14]); + SORT_CSWAP(dst[8], dst[11]); + SORT_CSWAP(dst[10], dst[13]); + SORT_CSWAP(dst[10], dst[12]); + SORT_CSWAP(dst[9], dst[11]); + SORT_CSWAP(dst[10], dst[11]); +} + + +#define BITONIC_SORT_24 SORT_MAKE_STR(bitonic_sort_24) +static __inline void BITONIC_SORT_24(SORT_TYPE *dst) { + SORT_CSWAP(dst[1], dst[2]); + SORT_CSWAP(dst[4], dst[5]); + SORT_CSWAP(dst[7], dst[8]); + SORT_CSWAP(dst[10], dst[11]); + SORT_CSWAP(dst[13], dst[14]); + SORT_CSWAP(dst[16], dst[17]); + SORT_CSWAP(dst[19], dst[20]); + SORT_CSWAP(dst[22], dst[23]); + SORT_CSWAP(dst[0], dst[2]); + SORT_CSWAP(dst[3], dst[5]); + SORT_CSWAP(dst[6], dst[8]); + SORT_CSWAP(dst[9], dst[11]); + SORT_CSWAP(dst[12], dst[14]); + SORT_CSWAP(dst[15], dst[17]); + SORT_CSWAP(dst[18], dst[20]); + SORT_CSWAP(dst[21], dst[23]); + SORT_CSWAP(dst[0], dst[1]); + SORT_CSWAP(dst[3], dst[4]); + SORT_CSWAP(dst[2], dst[5]); + SORT_CSWAP(dst[6], dst[7]); + SORT_CSWAP(dst[9], dst[10]); + SORT_CSWAP(dst[8], dst[11]); + SORT_CSWAP(dst[12], dst[13]); + SORT_CSWAP(dst[15], dst[16]); + SORT_CSWAP(dst[14], dst[17]); + SORT_CSWAP(dst[18], dst[19]); + SORT_CSWAP(dst[21], dst[22]); + SORT_CSWAP(dst[20], dst[23]); + SORT_CSWAP(dst[0], dst[3]); + SORT_CSWAP(dst[1], dst[4]); + SORT_CSWAP(dst[6], dst[9]); + SORT_CSWAP(dst[7], dst[10]); + SORT_CSWAP(dst[5], dst[11]); + SORT_CSWAP(dst[12], dst[15]); + SORT_CSWAP(dst[13], dst[16]); + SORT_CSWAP(dst[18], dst[21]); + SORT_CSWAP(dst[19], dst[22]); + SORT_CSWAP(dst[17], dst[23]); + SORT_CSWAP(dst[2], dst[4]); + SORT_CSWAP(dst[1], dst[3]); + SORT_CSWAP(dst[8], dst[10]); + SORT_CSWAP(dst[7], dst[9]); + SORT_CSWAP(dst[0], dst[6]); + SORT_CSWAP(dst[14], dst[16]); + SORT_CSWAP(dst[13], dst[15]); + SORT_CSWAP(dst[20], dst[22]); + SORT_CSWAP(dst[19], dst[21]); + SORT_CSWAP(dst[12], dst[18]); + SORT_CSWAP(dst[11], dst[23]); + SORT_CSWAP(dst[2], dst[3]); + SORT_CSWAP(dst[8], dst[9]); + SORT_CSWAP(dst[1], dst[7]); + SORT_CSWAP(dst[4], dst[10]); + SORT_CSWAP(dst[14], dst[15]); + SORT_CSWAP(dst[20], dst[21]); + SORT_CSWAP(dst[13], dst[19]); + SORT_CSWAP(dst[16], dst[22]); + SORT_CSWAP(dst[0], dst[12]); + SORT_CSWAP(dst[2], dst[8]); + SORT_CSWAP(dst[1], dst[6]); + SORT_CSWAP(dst[3], dst[9]); + SORT_CSWAP(dst[5], dst[10]); + SORT_CSWAP(dst[14], dst[20]); + SORT_CSWAP(dst[13], dst[18]); + SORT_CSWAP(dst[15], dst[21]); + SORT_CSWAP(dst[17], dst[22]); + SORT_CSWAP(dst[2], dst[7]); + SORT_CSWAP(dst[4], dst[9]); + SORT_CSWAP(dst[14], dst[19]); + SORT_CSWAP(dst[16], dst[21]); + SORT_CSWAP(dst[1], dst[13]); + SORT_CSWAP(dst[10], dst[22]); + SORT_CSWAP(dst[2], dst[6]); + SORT_CSWAP(dst[5], dst[9]); + SORT_CSWAP(dst[4], dst[7]); + SORT_CSWAP(dst[14], dst[18]); + SORT_CSWAP(dst[17], dst[21]); + SORT_CSWAP(dst[16], dst[19]); + SORT_CSWAP(dst[1], dst[12]); + SORT_CSWAP(dst[11], dst[22]); + SORT_CSWAP(dst[3], dst[6]); + SORT_CSWAP(dst[5], dst[8]); + SORT_CSWAP(dst[15], dst[18]); + SORT_CSWAP(dst[17], dst[20]); + SORT_CSWAP(dst[2], dst[14]); + SORT_CSWAP(dst[9], dst[21]); + SORT_CSWAP(dst[5], dst[7]); + SORT_CSWAP(dst[4], dst[6]); + SORT_CSWAP(dst[17], dst[19]); + SORT_CSWAP(dst[16], dst[18]); + SORT_CSWAP(dst[2], dst[13]); + SORT_CSWAP(dst[3], dst[15]); + SORT_CSWAP(dst[8], dst[20]); + SORT_CSWAP(dst[10], dst[21]); + SORT_CSWAP(dst[5], dst[6]); + SORT_CSWAP(dst[17], dst[18]); + SORT_CSWAP(dst[2], dst[12]); + SORT_CSWAP(dst[4], dst[16]); + SORT_CSWAP(dst[7], dst[19]); + SORT_CSWAP(dst[11], dst[21]); + SORT_CSWAP(dst[5], dst[17]); + SORT_CSWAP(dst[4], dst[15]); + SORT_CSWAP(dst[3], dst[12]); + SORT_CSWAP(dst[6], dst[18]); + SORT_CSWAP(dst[8], dst[19]); + SORT_CSWAP(dst[11], dst[20]); + SORT_CSWAP(dst[5], dst[16]); + SORT_CSWAP(dst[4], dst[13]); + SORT_CSWAP(dst[7], dst[18]); + SORT_CSWAP(dst[10], dst[19]); + SORT_CSWAP(dst[5], dst[15]); + SORT_CSWAP(dst[4], dst[12]); + SORT_CSWAP(dst[8], dst[18]); + SORT_CSWAP(dst[11], dst[19]); + SORT_CSWAP(dst[5], dst[14]); + SORT_CSWAP(dst[9], dst[18]); + SORT_CSWAP(dst[5], dst[13]); + SORT_CSWAP(dst[10], dst[18]); + SORT_CSWAP(dst[8], dst[14]); + SORT_CSWAP(dst[9], dst[15]); + SORT_CSWAP(dst[5], dst[12]); + SORT_CSWAP(dst[11], dst[18]); + SORT_CSWAP(dst[7], dst[13]); + SORT_CSWAP(dst[10], dst[16]); + SORT_CSWAP(dst[6], dst[12]); + SORT_CSWAP(dst[8], dst[13]); + SORT_CSWAP(dst[11], dst[17]); + SORT_CSWAP(dst[10], dst[15]); + SORT_CSWAP(dst[7], dst[12]); + SORT_CSWAP(dst[11], dst[16]); + SORT_CSWAP(dst[10], dst[13]); + SORT_CSWAP(dst[8], dst[12]); + SORT_CSWAP(dst[11], dst[15]); + SORT_CSWAP(dst[9], dst[12]); + SORT_CSWAP(dst[11], dst[14]); + SORT_CSWAP(dst[11], dst[13]); + SORT_CSWAP(dst[10], dst[12]); + SORT_CSWAP(dst[11], dst[12]); +} + + +#define BITONIC_SORT_25 SORT_MAKE_STR(bitonic_sort_25) +static __inline void BITONIC_SORT_25(SORT_TYPE *dst) { + SORT_CSWAP(dst[1], dst[2]); + SORT_CSWAP(dst[4], dst[5]); + SORT_CSWAP(dst[7], dst[8]); + SORT_CSWAP(dst[10], dst[11]); + SORT_CSWAP(dst[13], dst[14]); + SORT_CSWAP(dst[16], dst[17]); + SORT_CSWAP(dst[19], dst[20]); + SORT_CSWAP(dst[21], dst[22]); + SORT_CSWAP(dst[23], dst[24]); + SORT_CSWAP(dst[0], dst[2]); + SORT_CSWAP(dst[3], dst[5]); + SORT_CSWAP(dst[6], dst[8]); + SORT_CSWAP(dst[9], dst[11]); + SORT_CSWAP(dst[12], dst[14]); + SORT_CSWAP(dst[15], dst[17]); + SORT_CSWAP(dst[18], dst[20]); + SORT_CSWAP(dst[21], dst[23]); + SORT_CSWAP(dst[22], dst[24]); + SORT_CSWAP(dst[0], dst[1]); + SORT_CSWAP(dst[3], dst[4]); + SORT_CSWAP(dst[2], dst[5]); + SORT_CSWAP(dst[6], dst[7]); + SORT_CSWAP(dst[9], dst[10]); + SORT_CSWAP(dst[8], dst[11]); + SORT_CSWAP(dst[12], dst[13]); + SORT_CSWAP(dst[15], dst[16]); + SORT_CSWAP(dst[14], dst[17]); + SORT_CSWAP(dst[18], dst[19]); + SORT_CSWAP(dst[22], dst[23]); + SORT_CSWAP(dst[20], dst[24]); + SORT_CSWAP(dst[0], dst[3]); + SORT_CSWAP(dst[1], dst[4]); + SORT_CSWAP(dst[6], dst[9]); + SORT_CSWAP(dst[7], dst[10]); + SORT_CSWAP(dst[5], dst[11]); + SORT_CSWAP(dst[12], dst[15]); + SORT_CSWAP(dst[13], dst[16]); + SORT_CSWAP(dst[18], dst[22]); + SORT_CSWAP(dst[19], dst[23]); + SORT_CSWAP(dst[17], dst[24]); + SORT_CSWAP(dst[2], dst[4]); + SORT_CSWAP(dst[1], dst[3]); + SORT_CSWAP(dst[8], dst[10]); + SORT_CSWAP(dst[7], dst[9]); + SORT_CSWAP(dst[0], dst[6]); + SORT_CSWAP(dst[14], dst[16]); + SORT_CSWAP(dst[13], dst[15]); + SORT_CSWAP(dst[18], dst[21]); + SORT_CSWAP(dst[20], dst[23]); + SORT_CSWAP(dst[11], dst[24]); + SORT_CSWAP(dst[2], dst[3]); + SORT_CSWAP(dst[8], dst[9]); + SORT_CSWAP(dst[1], dst[7]); + SORT_CSWAP(dst[4], dst[10]); + SORT_CSWAP(dst[14], dst[15]); + SORT_CSWAP(dst[19], dst[21]); + SORT_CSWAP(dst[20], dst[22]); + SORT_CSWAP(dst[16], dst[23]); + SORT_CSWAP(dst[2], dst[8]); + SORT_CSWAP(dst[1], dst[6]); + SORT_CSWAP(dst[3], dst[9]); + SORT_CSWAP(dst[5], dst[10]); + SORT_CSWAP(dst[20], dst[21]); + SORT_CSWAP(dst[12], dst[19]); + SORT_CSWAP(dst[15], dst[22]); + SORT_CSWAP(dst[17], dst[23]); + SORT_CSWAP(dst[2], dst[7]); + SORT_CSWAP(dst[4], dst[9]); + SORT_CSWAP(dst[12], dst[18]); + SORT_CSWAP(dst[13], dst[20]); + SORT_CSWAP(dst[14], dst[21]); + SORT_CSWAP(dst[16], dst[22]); + SORT_CSWAP(dst[10], dst[23]); + SORT_CSWAP(dst[2], dst[6]); + SORT_CSWAP(dst[5], dst[9]); + SORT_CSWAP(dst[4], dst[7]); + SORT_CSWAP(dst[14], dst[20]); + SORT_CSWAP(dst[13], dst[18]); + SORT_CSWAP(dst[17], dst[22]); + SORT_CSWAP(dst[11], dst[23]); + SORT_CSWAP(dst[3], dst[6]); + SORT_CSWAP(dst[5], dst[8]); + SORT_CSWAP(dst[14], dst[19]); + SORT_CSWAP(dst[16], dst[20]); + SORT_CSWAP(dst[17], dst[21]); + SORT_CSWAP(dst[0], dst[13]); + SORT_CSWAP(dst[9], dst[22]); + SORT_CSWAP(dst[5], dst[7]); + SORT_CSWAP(dst[4], dst[6]); + SORT_CSWAP(dst[14], dst[18]); + SORT_CSWAP(dst[15], dst[19]); + SORT_CSWAP(dst[17], dst[20]); + SORT_CSWAP(dst[0], dst[12]); + SORT_CSWAP(dst[8], dst[21]); + SORT_CSWAP(dst[10], dst[22]); + SORT_CSWAP(dst[5], dst[6]); + SORT_CSWAP(dst[15], dst[18]); + SORT_CSWAP(dst[17], dst[19]); + SORT_CSWAP(dst[1], dst[14]); + SORT_CSWAP(dst[7], dst[20]); + SORT_CSWAP(dst[11], dst[22]); + SORT_CSWAP(dst[16], dst[18]); + SORT_CSWAP(dst[2], dst[15]); + SORT_CSWAP(dst[1], dst[12]); + SORT_CSWAP(dst[6], dst[19]); + SORT_CSWAP(dst[8], dst[20]); + SORT_CSWAP(dst[11], dst[21]); + SORT_CSWAP(dst[17], dst[18]); + SORT_CSWAP(dst[2], dst[14]); + SORT_CSWAP(dst[3], dst[16]); + SORT_CSWAP(dst[7], dst[19]); + SORT_CSWAP(dst[10], dst[20]); + SORT_CSWAP(dst[2], dst[13]); + SORT_CSWAP(dst[4], dst[17]); + SORT_CSWAP(dst[5], dst[18]); + SORT_CSWAP(dst[8], dst[19]); + SORT_CSWAP(dst[11], dst[20]); + SORT_CSWAP(dst[2], dst[12]); + SORT_CSWAP(dst[5], dst[17]); + SORT_CSWAP(dst[4], dst[16]); + SORT_CSWAP(dst[3], dst[13]); + SORT_CSWAP(dst[9], dst[19]); + SORT_CSWAP(dst[5], dst[16]); + SORT_CSWAP(dst[3], dst[12]); + SORT_CSWAP(dst[4], dst[14]); + SORT_CSWAP(dst[10], dst[19]); + SORT_CSWAP(dst[5], dst[15]); + SORT_CSWAP(dst[4], dst[12]); + SORT_CSWAP(dst[11], dst[19]); + SORT_CSWAP(dst[9], dst[16]); + SORT_CSWAP(dst[10], dst[17]); + SORT_CSWAP(dst[5], dst[14]); + SORT_CSWAP(dst[8], dst[15]); + SORT_CSWAP(dst[11], dst[18]); + SORT_CSWAP(dst[10], dst[16]); + SORT_CSWAP(dst[5], dst[13]); + SORT_CSWAP(dst[7], dst[14]); + SORT_CSWAP(dst[11], dst[17]); + SORT_CSWAP(dst[5], dst[12]); + SORT_CSWAP(dst[6], dst[13]); + SORT_CSWAP(dst[8], dst[14]); + SORT_CSWAP(dst[11], dst[16]); + SORT_CSWAP(dst[6], dst[12]); + SORT_CSWAP(dst[8], dst[13]); + SORT_CSWAP(dst[10], dst[14]); + SORT_CSWAP(dst[11], dst[15]); + SORT_CSWAP(dst[7], dst[12]); + SORT_CSWAP(dst[9], dst[13]); + SORT_CSWAP(dst[11], dst[14]); + SORT_CSWAP(dst[8], dst[12]); + SORT_CSWAP(dst[11], dst[13]); + SORT_CSWAP(dst[9], dst[12]); + SORT_CSWAP(dst[10], dst[12]); + SORT_CSWAP(dst[11], dst[12]); +} + + +#define BITONIC_SORT_26 SORT_MAKE_STR(bitonic_sort_26) +static __inline void BITONIC_SORT_26(SORT_TYPE *dst) { + SORT_CSWAP(dst[1], dst[2]); + SORT_CSWAP(dst[4], dst[5]); + SORT_CSWAP(dst[7], dst[8]); + SORT_CSWAP(dst[9], dst[10]); + SORT_CSWAP(dst[11], dst[12]); + SORT_CSWAP(dst[14], dst[15]); + SORT_CSWAP(dst[17], dst[18]); + SORT_CSWAP(dst[20], dst[21]); + SORT_CSWAP(dst[22], dst[23]); + SORT_CSWAP(dst[24], dst[25]); + SORT_CSWAP(dst[0], dst[2]); + SORT_CSWAP(dst[3], dst[5]); + SORT_CSWAP(dst[6], dst[8]); + SORT_CSWAP(dst[9], dst[11]); + SORT_CSWAP(dst[10], dst[12]); + SORT_CSWAP(dst[13], dst[15]); + SORT_CSWAP(dst[16], dst[18]); + SORT_CSWAP(dst[19], dst[21]); + SORT_CSWAP(dst[22], dst[24]); + SORT_CSWAP(dst[23], dst[25]); + SORT_CSWAP(dst[0], dst[1]); + SORT_CSWAP(dst[3], dst[4]); + SORT_CSWAP(dst[2], dst[5]); + SORT_CSWAP(dst[6], dst[7]); + SORT_CSWAP(dst[10], dst[11]); + SORT_CSWAP(dst[8], dst[12]); + SORT_CSWAP(dst[13], dst[14]); + SORT_CSWAP(dst[16], dst[17]); + SORT_CSWAP(dst[15], dst[18]); + SORT_CSWAP(dst[19], dst[20]); + SORT_CSWAP(dst[23], dst[24]); + SORT_CSWAP(dst[21], dst[25]); + SORT_CSWAP(dst[0], dst[3]); + SORT_CSWAP(dst[1], dst[4]); + SORT_CSWAP(dst[6], dst[10]); + SORT_CSWAP(dst[7], dst[11]); + SORT_CSWAP(dst[5], dst[12]); + SORT_CSWAP(dst[13], dst[16]); + SORT_CSWAP(dst[14], dst[17]); + SORT_CSWAP(dst[19], dst[23]); + SORT_CSWAP(dst[20], dst[24]); + SORT_CSWAP(dst[18], dst[25]); + SORT_CSWAP(dst[2], dst[4]); + SORT_CSWAP(dst[1], dst[3]); + SORT_CSWAP(dst[6], dst[9]); + SORT_CSWAP(dst[8], dst[11]); + SORT_CSWAP(dst[15], dst[17]); + SORT_CSWAP(dst[14], dst[16]); + SORT_CSWAP(dst[19], dst[22]); + SORT_CSWAP(dst[21], dst[24]); + SORT_CSWAP(dst[12], dst[25]); + SORT_CSWAP(dst[2], dst[3]); + SORT_CSWAP(dst[7], dst[9]); + SORT_CSWAP(dst[8], dst[10]); + SORT_CSWAP(dst[4], dst[11]); + SORT_CSWAP(dst[15], dst[16]); + SORT_CSWAP(dst[20], dst[22]); + SORT_CSWAP(dst[21], dst[23]); + SORT_CSWAP(dst[17], dst[24]); + SORT_CSWAP(dst[8], dst[9]); + SORT_CSWAP(dst[0], dst[7]); + SORT_CSWAP(dst[3], dst[10]); + SORT_CSWAP(dst[5], dst[11]); + SORT_CSWAP(dst[21], dst[22]); + SORT_CSWAP(dst[13], dst[20]); + SORT_CSWAP(dst[16], dst[23]); + SORT_CSWAP(dst[18], dst[24]); + SORT_CSWAP(dst[0], dst[6]); + SORT_CSWAP(dst[1], dst[8]); + SORT_CSWAP(dst[2], dst[9]); + SORT_CSWAP(dst[4], dst[10]); + SORT_CSWAP(dst[13], dst[19]); + SORT_CSWAP(dst[14], dst[21]); + SORT_CSWAP(dst[15], dst[22]); + SORT_CSWAP(dst[17], dst[23]); + SORT_CSWAP(dst[11], dst[24]); + SORT_CSWAP(dst[2], dst[8]); + SORT_CSWAP(dst[1], dst[6]); + SORT_CSWAP(dst[5], dst[10]); + SORT_CSWAP(dst[15], dst[21]); + SORT_CSWAP(dst[14], dst[19]); + SORT_CSWAP(dst[18], dst[23]); + SORT_CSWAP(dst[0], dst[13]); + SORT_CSWAP(dst[12], dst[24]); + SORT_CSWAP(dst[2], dst[7]); + SORT_CSWAP(dst[4], dst[8]); + SORT_CSWAP(dst[5], dst[9]); + SORT_CSWAP(dst[15], dst[20]); + SORT_CSWAP(dst[17], dst[21]); + SORT_CSWAP(dst[18], dst[22]); + SORT_CSWAP(dst[1], dst[14]); + SORT_CSWAP(dst[10], dst[23]); + SORT_CSWAP(dst[2], dst[6]); + SORT_CSWAP(dst[3], dst[7]); + SORT_CSWAP(dst[5], dst[8]); + SORT_CSWAP(dst[15], dst[19]); + SORT_CSWAP(dst[16], dst[20]); + SORT_CSWAP(dst[18], dst[21]); + SORT_CSWAP(dst[1], dst[13]); + SORT_CSWAP(dst[9], dst[22]); + SORT_CSWAP(dst[12], dst[23]); + SORT_CSWAP(dst[3], dst[6]); + SORT_CSWAP(dst[5], dst[7]); + SORT_CSWAP(dst[16], dst[19]); + SORT_CSWAP(dst[18], dst[20]); + SORT_CSWAP(dst[2], dst[15]); + SORT_CSWAP(dst[8], dst[21]); + SORT_CSWAP(dst[10], dst[22]); + SORT_CSWAP(dst[4], dst[6]); + SORT_CSWAP(dst[17], dst[19]); + SORT_CSWAP(dst[2], dst[14]); + SORT_CSWAP(dst[3], dst[16]); + SORT_CSWAP(dst[7], dst[20]); + SORT_CSWAP(dst[11], dst[22]); + SORT_CSWAP(dst[5], dst[6]); + SORT_CSWAP(dst[18], dst[19]); + SORT_CSWAP(dst[2], dst[13]); + SORT_CSWAP(dst[4], dst[17]); + SORT_CSWAP(dst[8], dst[20]); + SORT_CSWAP(dst[12], dst[22]); + SORT_CSWAP(dst[11], dst[21]); + SORT_CSWAP(dst[5], dst[18]); + SORT_CSWAP(dst[4], dst[16]); + SORT_CSWAP(dst[3], dst[13]); + SORT_CSWAP(dst[6], dst[19]); + SORT_CSWAP(dst[10], dst[20]); + SORT_CSWAP(dst[12], dst[21]); + SORT_CSWAP(dst[5], dst[17]); + SORT_CSWAP(dst[4], dst[14]); + SORT_CSWAP(dst[7], dst[19]); + SORT_CSWAP(dst[12], dst[20]); + SORT_CSWAP(dst[5], dst[16]); + SORT_CSWAP(dst[4], dst[13]); + SORT_CSWAP(dst[8], dst[19]); + SORT_CSWAP(dst[5], dst[15]); + SORT_CSWAP(dst[9], dst[19]); + SORT_CSWAP(dst[5], dst[14]); + SORT_CSWAP(dst[10], dst[19]); + SORT_CSWAP(dst[8], dst[15]); + SORT_CSWAP(dst[9], dst[16]); + SORT_CSWAP(dst[5], dst[13]); + SORT_CSWAP(dst[11], dst[19]); + SORT_CSWAP(dst[7], dst[14]); + SORT_CSWAP(dst[10], dst[17]); + SORT_CSWAP(dst[12], dst[19]); + SORT_CSWAP(dst[6], dst[13]); + SORT_CSWAP(dst[8], dst[14]); + SORT_CSWAP(dst[10], dst[16]); + SORT_CSWAP(dst[11], dst[18]); + SORT_CSWAP(dst[7], dst[13]); + SORT_CSWAP(dst[12], dst[18]); + SORT_CSWAP(dst[11], dst[16]); + SORT_CSWAP(dst[10], dst[14]); + SORT_CSWAP(dst[8], dst[13]); + SORT_CSWAP(dst[12], dst[17]); + SORT_CSWAP(dst[11], dst[15]); + SORT_CSWAP(dst[12], dst[16]); + SORT_CSWAP(dst[9], dst[13]); + SORT_CSWAP(dst[10], dst[13]); + SORT_CSWAP(dst[12], dst[15]); + SORT_CSWAP(dst[11], dst[13]); + SORT_CSWAP(dst[12], dst[14]); + SORT_CSWAP(dst[12], dst[13]); +} + + +#define BITONIC_SORT_27 SORT_MAKE_STR(bitonic_sort_27) +static __inline void BITONIC_SORT_27(SORT_TYPE *dst) { + SORT_CSWAP(dst[1], dst[2]); + SORT_CSWAP(dst[4], dst[5]); + SORT_CSWAP(dst[7], dst[8]); + SORT_CSWAP(dst[9], dst[10]); + SORT_CSWAP(dst[11], dst[12]); + SORT_CSWAP(dst[14], dst[15]); + SORT_CSWAP(dst[16], dst[17]); + SORT_CSWAP(dst[18], dst[19]); + SORT_CSWAP(dst[21], dst[22]); + SORT_CSWAP(dst[23], dst[24]); + SORT_CSWAP(dst[25], dst[26]); + SORT_CSWAP(dst[0], dst[2]); + SORT_CSWAP(dst[3], dst[5]); + SORT_CSWAP(dst[6], dst[8]); + SORT_CSWAP(dst[9], dst[11]); + SORT_CSWAP(dst[10], dst[12]); + SORT_CSWAP(dst[13], dst[15]); + SORT_CSWAP(dst[16], dst[18]); + SORT_CSWAP(dst[17], dst[19]); + SORT_CSWAP(dst[20], dst[22]); + SORT_CSWAP(dst[23], dst[25]); + SORT_CSWAP(dst[24], dst[26]); + SORT_CSWAP(dst[0], dst[1]); + SORT_CSWAP(dst[3], dst[4]); + SORT_CSWAP(dst[2], dst[5]); + SORT_CSWAP(dst[6], dst[7]); + SORT_CSWAP(dst[10], dst[11]); + SORT_CSWAP(dst[8], dst[12]); + SORT_CSWAP(dst[13], dst[14]); + SORT_CSWAP(dst[17], dst[18]); + SORT_CSWAP(dst[15], dst[19]); + SORT_CSWAP(dst[20], dst[21]); + SORT_CSWAP(dst[24], dst[25]); + SORT_CSWAP(dst[22], dst[26]); + SORT_CSWAP(dst[0], dst[3]); + SORT_CSWAP(dst[1], dst[4]); + SORT_CSWAP(dst[6], dst[10]); + SORT_CSWAP(dst[7], dst[11]); + SORT_CSWAP(dst[5], dst[12]); + SORT_CSWAP(dst[13], dst[17]); + SORT_CSWAP(dst[14], dst[18]); + SORT_CSWAP(dst[20], dst[24]); + SORT_CSWAP(dst[21], dst[25]); + SORT_CSWAP(dst[19], dst[26]); + SORT_CSWAP(dst[2], dst[4]); + SORT_CSWAP(dst[1], dst[3]); + SORT_CSWAP(dst[6], dst[9]); + SORT_CSWAP(dst[8], dst[11]); + SORT_CSWAP(dst[13], dst[16]); + SORT_CSWAP(dst[15], dst[18]); + SORT_CSWAP(dst[20], dst[23]); + SORT_CSWAP(dst[22], dst[25]); + SORT_CSWAP(dst[12], dst[26]); + SORT_CSWAP(dst[2], dst[3]); + SORT_CSWAP(dst[7], dst[9]); + SORT_CSWAP(dst[8], dst[10]); + SORT_CSWAP(dst[4], dst[11]); + SORT_CSWAP(dst[14], dst[16]); + SORT_CSWAP(dst[15], dst[17]); + SORT_CSWAP(dst[21], dst[23]); + SORT_CSWAP(dst[22], dst[24]); + SORT_CSWAP(dst[13], dst[20]); + SORT_CSWAP(dst[18], dst[25]); + SORT_CSWAP(dst[8], dst[9]); + SORT_CSWAP(dst[0], dst[7]); + SORT_CSWAP(dst[3], dst[10]); + SORT_CSWAP(dst[5], dst[11]); + SORT_CSWAP(dst[15], dst[16]); + SORT_CSWAP(dst[22], dst[23]); + SORT_CSWAP(dst[14], dst[21]); + SORT_CSWAP(dst[17], dst[24]); + SORT_CSWAP(dst[19], dst[25]); + SORT_CSWAP(dst[0], dst[6]); + SORT_CSWAP(dst[1], dst[8]); + SORT_CSWAP(dst[2], dst[9]); + SORT_CSWAP(dst[4], dst[10]); + SORT_CSWAP(dst[15], dst[22]); + SORT_CSWAP(dst[14], dst[20]); + SORT_CSWAP(dst[16], dst[23]); + SORT_CSWAP(dst[19], dst[24]); + SORT_CSWAP(dst[11], dst[25]); + SORT_CSWAP(dst[2], dst[8]); + SORT_CSWAP(dst[1], dst[6]); + SORT_CSWAP(dst[5], dst[10]); + SORT_CSWAP(dst[15], dst[21]); + SORT_CSWAP(dst[17], dst[23]); + SORT_CSWAP(dst[0], dst[14]); + SORT_CSWAP(dst[12], dst[25]); + SORT_CSWAP(dst[2], dst[7]); + SORT_CSWAP(dst[4], dst[8]); + SORT_CSWAP(dst[5], dst[9]); + SORT_CSWAP(dst[15], dst[20]); + SORT_CSWAP(dst[18], dst[23]); + SORT_CSWAP(dst[17], dst[21]); + SORT_CSWAP(dst[0], dst[13]); + SORT_CSWAP(dst[10], dst[24]); + SORT_CSWAP(dst[2], dst[6]); + SORT_CSWAP(dst[3], dst[7]); + SORT_CSWAP(dst[5], dst[8]); + SORT_CSWAP(dst[19], dst[23]); + SORT_CSWAP(dst[16], dst[20]); + SORT_CSWAP(dst[18], dst[22]); + SORT_CSWAP(dst[1], dst[15]); + SORT_CSWAP(dst[12], dst[24]); + SORT_CSWAP(dst[3], dst[6]); + SORT_CSWAP(dst[5], dst[7]); + SORT_CSWAP(dst[17], dst[20]); + SORT_CSWAP(dst[19], dst[22]); + SORT_CSWAP(dst[2], dst[16]); + SORT_CSWAP(dst[1], dst[13]); + SORT_CSWAP(dst[9], dst[23]); + SORT_CSWAP(dst[4], dst[6]); + SORT_CSWAP(dst[18], dst[20]); + SORT_CSWAP(dst[19], dst[21]); + SORT_CSWAP(dst[2], dst[15]); + SORT_CSWAP(dst[3], dst[17]); + SORT_CSWAP(dst[8], dst[22]); + SORT_CSWAP(dst[10], dst[23]); + SORT_CSWAP(dst[5], dst[6]); + SORT_CSWAP(dst[19], dst[20]); + SORT_CSWAP(dst[2], dst[14]); + SORT_CSWAP(dst[4], dst[18]); + SORT_CSWAP(dst[7], dst[21]); + SORT_CSWAP(dst[11], dst[23]); + SORT_CSWAP(dst[2], dst[13]); + SORT_CSWAP(dst[5], dst[19]); + SORT_CSWAP(dst[4], dst[17]); + SORT_CSWAP(dst[3], dst[14]); + SORT_CSWAP(dst[6], dst[20]); + SORT_CSWAP(dst[8], dst[21]); + SORT_CSWAP(dst[12], dst[23]); + SORT_CSWAP(dst[11], dst[22]); + SORT_CSWAP(dst[5], dst[18]); + SORT_CSWAP(dst[3], dst[13]); + SORT_CSWAP(dst[4], dst[15]); + SORT_CSWAP(dst[7], dst[20]); + SORT_CSWAP(dst[10], dst[21]); + SORT_CSWAP(dst[12], dst[22]); + SORT_CSWAP(dst[5], dst[17]); + SORT_CSWAP(dst[4], dst[13]); + SORT_CSWAP(dst[8], dst[20]); + SORT_CSWAP(dst[12], dst[21]); + SORT_CSWAP(dst[5], dst[16]); + SORT_CSWAP(dst[9], dst[20]); + SORT_CSWAP(dst[5], dst[15]); + SORT_CSWAP(dst[10], dst[20]); + SORT_CSWAP(dst[9], dst[16]); + SORT_CSWAP(dst[5], dst[14]); + SORT_CSWAP(dst[11], dst[20]); + SORT_CSWAP(dst[8], dst[15]); + SORT_CSWAP(dst[10], dst[17]); + SORT_CSWAP(dst[5], dst[13]); + SORT_CSWAP(dst[12], dst[20]); + SORT_CSWAP(dst[7], dst[14]); + SORT_CSWAP(dst[10], dst[16]); + SORT_CSWAP(dst[11], dst[18]); + SORT_CSWAP(dst[6], dst[13]); + SORT_CSWAP(dst[8], dst[14]); + SORT_CSWAP(dst[12], dst[19]); + SORT_CSWAP(dst[11], dst[16]); + SORT_CSWAP(dst[7], dst[13]); + SORT_CSWAP(dst[12], dst[18]); + SORT_CSWAP(dst[10], dst[14]); + SORT_CSWAP(dst[11], dst[15]); + SORT_CSWAP(dst[8], dst[13]); + SORT_CSWAP(dst[12], dst[17]); + SORT_CSWAP(dst[12], dst[16]); + SORT_CSWAP(dst[9], dst[13]); + SORT_CSWAP(dst[10], dst[13]); + SORT_CSWAP(dst[12], dst[15]); + SORT_CSWAP(dst[11], dst[13]); + SORT_CSWAP(dst[12], dst[14]); + SORT_CSWAP(dst[12], dst[13]); +} + + +#define BITONIC_SORT_28 SORT_MAKE_STR(bitonic_sort_28) +static __inline void BITONIC_SORT_28(SORT_TYPE *dst) { + SORT_CSWAP(dst[1], dst[2]); + SORT_CSWAP(dst[3], dst[4]); + SORT_CSWAP(dst[5], dst[6]); + SORT_CSWAP(dst[8], dst[9]); + SORT_CSWAP(dst[10], dst[11]); + SORT_CSWAP(dst[12], dst[13]); + SORT_CSWAP(dst[15], dst[16]); + SORT_CSWAP(dst[17], dst[18]); + SORT_CSWAP(dst[19], dst[20]); + SORT_CSWAP(dst[22], dst[23]); + SORT_CSWAP(dst[24], dst[25]); + SORT_CSWAP(dst[26], dst[27]); + SORT_CSWAP(dst[0], dst[2]); + SORT_CSWAP(dst[3], dst[5]); + SORT_CSWAP(dst[4], dst[6]); + SORT_CSWAP(dst[7], dst[9]); + SORT_CSWAP(dst[10], dst[12]); + SORT_CSWAP(dst[11], dst[13]); + SORT_CSWAP(dst[14], dst[16]); + SORT_CSWAP(dst[17], dst[19]); + SORT_CSWAP(dst[18], dst[20]); + SORT_CSWAP(dst[21], dst[23]); + SORT_CSWAP(dst[24], dst[26]); + SORT_CSWAP(dst[25], dst[27]); + SORT_CSWAP(dst[0], dst[1]); + SORT_CSWAP(dst[4], dst[5]); + SORT_CSWAP(dst[2], dst[6]); + SORT_CSWAP(dst[7], dst[8]); + SORT_CSWAP(dst[11], dst[12]); + SORT_CSWAP(dst[9], dst[13]); + SORT_CSWAP(dst[14], dst[15]); + SORT_CSWAP(dst[18], dst[19]); + SORT_CSWAP(dst[16], dst[20]); + SORT_CSWAP(dst[21], dst[22]); + SORT_CSWAP(dst[25], dst[26]); + SORT_CSWAP(dst[23], dst[27]); + SORT_CSWAP(dst[0], dst[4]); + SORT_CSWAP(dst[1], dst[5]); + SORT_CSWAP(dst[7], dst[11]); + SORT_CSWAP(dst[8], dst[12]); + SORT_CSWAP(dst[6], dst[13]); + SORT_CSWAP(dst[14], dst[18]); + SORT_CSWAP(dst[15], dst[19]); + SORT_CSWAP(dst[21], dst[25]); + SORT_CSWAP(dst[22], dst[26]); + SORT_CSWAP(dst[20], dst[27]); + SORT_CSWAP(dst[0], dst[3]); + SORT_CSWAP(dst[2], dst[5]); + SORT_CSWAP(dst[7], dst[10]); + SORT_CSWAP(dst[9], dst[12]); + SORT_CSWAP(dst[14], dst[17]); + SORT_CSWAP(dst[16], dst[19]); + SORT_CSWAP(dst[21], dst[24]); + SORT_CSWAP(dst[23], dst[26]); + SORT_CSWAP(dst[13], dst[27]); + SORT_CSWAP(dst[1], dst[3]); + SORT_CSWAP(dst[2], dst[4]); + SORT_CSWAP(dst[8], dst[10]); + SORT_CSWAP(dst[9], dst[11]); + SORT_CSWAP(dst[0], dst[7]); + SORT_CSWAP(dst[5], dst[12]); + SORT_CSWAP(dst[15], dst[17]); + SORT_CSWAP(dst[16], dst[18]); + SORT_CSWAP(dst[22], dst[24]); + SORT_CSWAP(dst[23], dst[25]); + SORT_CSWAP(dst[14], dst[21]); + SORT_CSWAP(dst[19], dst[26]); + SORT_CSWAP(dst[2], dst[3]); + SORT_CSWAP(dst[9], dst[10]); + SORT_CSWAP(dst[1], dst[8]); + SORT_CSWAP(dst[4], dst[11]); + SORT_CSWAP(dst[6], dst[12]); + SORT_CSWAP(dst[16], dst[17]); + SORT_CSWAP(dst[23], dst[24]); + SORT_CSWAP(dst[15], dst[22]); + SORT_CSWAP(dst[18], dst[25]); + SORT_CSWAP(dst[20], dst[26]); + SORT_CSWAP(dst[0], dst[14]); + SORT_CSWAP(dst[2], dst[9]); + SORT_CSWAP(dst[1], dst[7]); + SORT_CSWAP(dst[3], dst[10]); + SORT_CSWAP(dst[6], dst[11]); + SORT_CSWAP(dst[16], dst[23]); + SORT_CSWAP(dst[15], dst[21]); + SORT_CSWAP(dst[17], dst[24]); + SORT_CSWAP(dst[20], dst[25]); + SORT_CSWAP(dst[12], dst[26]); + SORT_CSWAP(dst[2], dst[8]); + SORT_CSWAP(dst[4], dst[10]); + SORT_CSWAP(dst[16], dst[22]); + SORT_CSWAP(dst[18], dst[24]); + SORT_CSWAP(dst[1], dst[15]); + SORT_CSWAP(dst[11], dst[25]); + SORT_CSWAP(dst[13], dst[26]); + SORT_CSWAP(dst[2], dst[7]); + SORT_CSWAP(dst[5], dst[10]); + SORT_CSWAP(dst[4], dst[8]); + SORT_CSWAP(dst[16], dst[21]); + SORT_CSWAP(dst[19], dst[24]); + SORT_CSWAP(dst[18], dst[22]); + SORT_CSWAP(dst[1], dst[14]); + SORT_CSWAP(dst[13], dst[25]); + SORT_CSWAP(dst[6], dst[10]); + SORT_CSWAP(dst[3], dst[7]); + SORT_CSWAP(dst[5], dst[9]); + SORT_CSWAP(dst[20], dst[24]); + SORT_CSWAP(dst[17], dst[21]); + SORT_CSWAP(dst[19], dst[23]); + SORT_CSWAP(dst[2], dst[16]); + SORT_CSWAP(dst[4], dst[7]); + SORT_CSWAP(dst[6], dst[9]); + SORT_CSWAP(dst[18], dst[21]); + SORT_CSWAP(dst[20], dst[23]); + SORT_CSWAP(dst[2], dst[15]); + SORT_CSWAP(dst[3], dst[17]); + SORT_CSWAP(dst[10], dst[24]); + SORT_CSWAP(dst[5], dst[7]); + SORT_CSWAP(dst[6], dst[8]); + SORT_CSWAP(dst[19], dst[21]); + SORT_CSWAP(dst[20], dst[22]); + SORT_CSWAP(dst[2], dst[14]); + SORT_CSWAP(dst[4], dst[18]); + SORT_CSWAP(dst[9], dst[23]); + SORT_CSWAP(dst[11], dst[24]); + SORT_CSWAP(dst[6], dst[7]); + SORT_CSWAP(dst[20], dst[21]); + SORT_CSWAP(dst[4], dst[17]); + SORT_CSWAP(dst[5], dst[19]); + SORT_CSWAP(dst[3], dst[14]); + SORT_CSWAP(dst[8], dst[22]); + SORT_CSWAP(dst[12], dst[24]); + SORT_CSWAP(dst[6], dst[20]); + SORT_CSWAP(dst[5], dst[17]); + SORT_CSWAP(dst[4], dst[15]); + SORT_CSWAP(dst[7], dst[21]); + SORT_CSWAP(dst[9], dst[22]); + SORT_CSWAP(dst[13], dst[24]); + SORT_CSWAP(dst[12], dst[23]); + SORT_CSWAP(dst[6], dst[19]); + SORT_CSWAP(dst[4], dst[14]); + SORT_CSWAP(dst[5], dst[16]); + SORT_CSWAP(dst[8], dst[21]); + SORT_CSWAP(dst[11], dst[22]); + SORT_CSWAP(dst[13], dst[23]); + SORT_CSWAP(dst[6], dst[18]); + SORT_CSWAP(dst[5], dst[14]); + SORT_CSWAP(dst[9], dst[21]); + SORT_CSWAP(dst[13], dst[22]); + SORT_CSWAP(dst[6], dst[17]); + SORT_CSWAP(dst[10], dst[21]); + SORT_CSWAP(dst[6], dst[16]); + SORT_CSWAP(dst[11], dst[21]); + SORT_CSWAP(dst[10], dst[17]); + SORT_CSWAP(dst[6], dst[15]); + SORT_CSWAP(dst[12], dst[21]); + SORT_CSWAP(dst[9], dst[16]); + SORT_CSWAP(dst[11], dst[18]); + SORT_CSWAP(dst[6], dst[14]); + SORT_CSWAP(dst[13], dst[21]); + SORT_CSWAP(dst[8], dst[15]); + SORT_CSWAP(dst[11], dst[17]); + SORT_CSWAP(dst[12], dst[19]); + SORT_CSWAP(dst[7], dst[14]); + SORT_CSWAP(dst[9], dst[15]); + SORT_CSWAP(dst[13], dst[20]); + SORT_CSWAP(dst[12], dst[17]); + SORT_CSWAP(dst[8], dst[14]); + SORT_CSWAP(dst[13], dst[19]); + SORT_CSWAP(dst[11], dst[15]); + SORT_CSWAP(dst[12], dst[16]); + SORT_CSWAP(dst[9], dst[14]); + SORT_CSWAP(dst[13], dst[18]); + SORT_CSWAP(dst[13], dst[17]); + SORT_CSWAP(dst[10], dst[14]); + SORT_CSWAP(dst[11], dst[14]); + SORT_CSWAP(dst[13], dst[16]); + SORT_CSWAP(dst[12], dst[14]); + SORT_CSWAP(dst[13], dst[15]); + SORT_CSWAP(dst[13], dst[14]); +} + + +#define BITONIC_SORT_29 SORT_MAKE_STR(bitonic_sort_29) +static __inline void BITONIC_SORT_29(SORT_TYPE *dst) { + SORT_CSWAP(dst[1], dst[2]); + SORT_CSWAP(dst[3], dst[4]); + SORT_CSWAP(dst[5], dst[6]); + SORT_CSWAP(dst[8], dst[9]); + SORT_CSWAP(dst[10], dst[11]); + SORT_CSWAP(dst[12], dst[13]); + SORT_CSWAP(dst[15], dst[16]); + SORT_CSWAP(dst[17], dst[18]); + SORT_CSWAP(dst[19], dst[20]); + SORT_CSWAP(dst[21], dst[22]); + SORT_CSWAP(dst[23], dst[24]); + SORT_CSWAP(dst[25], dst[26]); + SORT_CSWAP(dst[27], dst[28]); + SORT_CSWAP(dst[0], dst[2]); + SORT_CSWAP(dst[3], dst[5]); + SORT_CSWAP(dst[4], dst[6]); + SORT_CSWAP(dst[7], dst[9]); + SORT_CSWAP(dst[10], dst[12]); + SORT_CSWAP(dst[11], dst[13]); + SORT_CSWAP(dst[14], dst[16]); + SORT_CSWAP(dst[17], dst[19]); + SORT_CSWAP(dst[18], dst[20]); + SORT_CSWAP(dst[21], dst[23]); + SORT_CSWAP(dst[22], dst[24]); + SORT_CSWAP(dst[25], dst[27]); + SORT_CSWAP(dst[26], dst[28]); + SORT_CSWAP(dst[0], dst[1]); + SORT_CSWAP(dst[4], dst[5]); + SORT_CSWAP(dst[2], dst[6]); + SORT_CSWAP(dst[7], dst[8]); + SORT_CSWAP(dst[11], dst[12]); + SORT_CSWAP(dst[9], dst[13]); + SORT_CSWAP(dst[14], dst[15]); + SORT_CSWAP(dst[18], dst[19]); + SORT_CSWAP(dst[16], dst[20]); + SORT_CSWAP(dst[22], dst[23]); + SORT_CSWAP(dst[26], dst[27]); + SORT_CSWAP(dst[21], dst[25]); + SORT_CSWAP(dst[24], dst[28]); + SORT_CSWAP(dst[0], dst[4]); + SORT_CSWAP(dst[1], dst[5]); + SORT_CSWAP(dst[7], dst[11]); + SORT_CSWAP(dst[8], dst[12]); + SORT_CSWAP(dst[6], dst[13]); + SORT_CSWAP(dst[14], dst[18]); + SORT_CSWAP(dst[15], dst[19]); + SORT_CSWAP(dst[22], dst[26]); + SORT_CSWAP(dst[23], dst[27]); + SORT_CSWAP(dst[20], dst[28]); + SORT_CSWAP(dst[0], dst[3]); + SORT_CSWAP(dst[2], dst[5]); + SORT_CSWAP(dst[7], dst[10]); + SORT_CSWAP(dst[9], dst[12]); + SORT_CSWAP(dst[14], dst[17]); + SORT_CSWAP(dst[16], dst[19]); + SORT_CSWAP(dst[22], dst[25]); + SORT_CSWAP(dst[24], dst[27]); + SORT_CSWAP(dst[13], dst[28]); + SORT_CSWAP(dst[1], dst[3]); + SORT_CSWAP(dst[2], dst[4]); + SORT_CSWAP(dst[8], dst[10]); + SORT_CSWAP(dst[9], dst[11]); + SORT_CSWAP(dst[0], dst[7]); + SORT_CSWAP(dst[5], dst[12]); + SORT_CSWAP(dst[15], dst[17]); + SORT_CSWAP(dst[16], dst[18]); + SORT_CSWAP(dst[23], dst[25]); + SORT_CSWAP(dst[24], dst[26]); + SORT_CSWAP(dst[14], dst[22]); + SORT_CSWAP(dst[19], dst[27]); + SORT_CSWAP(dst[2], dst[3]); + SORT_CSWAP(dst[9], dst[10]); + SORT_CSWAP(dst[1], dst[8]); + SORT_CSWAP(dst[4], dst[11]); + SORT_CSWAP(dst[6], dst[12]); + SORT_CSWAP(dst[16], dst[17]); + SORT_CSWAP(dst[24], dst[25]); + SORT_CSWAP(dst[14], dst[21]); + SORT_CSWAP(dst[15], dst[23]); + SORT_CSWAP(dst[18], dst[26]); + SORT_CSWAP(dst[20], dst[27]); + SORT_CSWAP(dst[2], dst[9]); + SORT_CSWAP(dst[1], dst[7]); + SORT_CSWAP(dst[3], dst[10]); + SORT_CSWAP(dst[6], dst[11]); + SORT_CSWAP(dst[16], dst[24]); + SORT_CSWAP(dst[15], dst[21]); + SORT_CSWAP(dst[17], dst[25]); + SORT_CSWAP(dst[20], dst[26]); + SORT_CSWAP(dst[12], dst[27]); + SORT_CSWAP(dst[2], dst[8]); + SORT_CSWAP(dst[4], dst[10]); + SORT_CSWAP(dst[16], dst[23]); + SORT_CSWAP(dst[18], dst[25]); + SORT_CSWAP(dst[0], dst[15]); + SORT_CSWAP(dst[11], dst[26]); + SORT_CSWAP(dst[13], dst[27]); + SORT_CSWAP(dst[2], dst[7]); + SORT_CSWAP(dst[5], dst[10]); + SORT_CSWAP(dst[4], dst[8]); + SORT_CSWAP(dst[16], dst[22]); + SORT_CSWAP(dst[19], dst[25]); + SORT_CSWAP(dst[0], dst[14]); + SORT_CSWAP(dst[13], dst[26]); + SORT_CSWAP(dst[6], dst[10]); + SORT_CSWAP(dst[3], dst[7]); + SORT_CSWAP(dst[5], dst[9]); + SORT_CSWAP(dst[16], dst[21]); + SORT_CSWAP(dst[20], dst[25]); + SORT_CSWAP(dst[18], dst[22]); + SORT_CSWAP(dst[19], dst[23]); + SORT_CSWAP(dst[4], dst[7]); + SORT_CSWAP(dst[6], dst[9]); + SORT_CSWAP(dst[17], dst[21]); + SORT_CSWAP(dst[20], dst[24]); + SORT_CSWAP(dst[1], dst[16]); + SORT_CSWAP(dst[10], dst[25]); + SORT_CSWAP(dst[5], dst[7]); + SORT_CSWAP(dst[6], dst[8]); + SORT_CSWAP(dst[18], dst[21]); + SORT_CSWAP(dst[20], dst[23]); + SORT_CSWAP(dst[2], dst[17]); + SORT_CSWAP(dst[1], dst[14]); + SORT_CSWAP(dst[9], dst[24]); + SORT_CSWAP(dst[11], dst[25]); + SORT_CSWAP(dst[6], dst[7]); + SORT_CSWAP(dst[19], dst[21]); + SORT_CSWAP(dst[20], dst[22]); + SORT_CSWAP(dst[2], dst[16]); + SORT_CSWAP(dst[3], dst[18]); + SORT_CSWAP(dst[8], dst[23]); + SORT_CSWAP(dst[12], dst[25]); + SORT_CSWAP(dst[20], dst[21]); + SORT_CSWAP(dst[2], dst[15]); + SORT_CSWAP(dst[4], dst[19]); + SORT_CSWAP(dst[7], dst[22]); + SORT_CSWAP(dst[9], dst[23]); + SORT_CSWAP(dst[13], dst[25]); + SORT_CSWAP(dst[12], dst[24]); + SORT_CSWAP(dst[2], dst[14]); + SORT_CSWAP(dst[4], dst[18]); + SORT_CSWAP(dst[5], dst[20]); + SORT_CSWAP(dst[6], dst[21]); + SORT_CSWAP(dst[8], dst[22]); + SORT_CSWAP(dst[11], dst[23]); + SORT_CSWAP(dst[13], dst[24]); + SORT_CSWAP(dst[6], dst[20]); + SORT_CSWAP(dst[5], dst[18]); + SORT_CSWAP(dst[3], dst[14]); + SORT_CSWAP(dst[4], dst[15]); + SORT_CSWAP(dst[9], dst[22]); + SORT_CSWAP(dst[13], dst[23]); + SORT_CSWAP(dst[6], dst[19]); + SORT_CSWAP(dst[4], dst[14]); + SORT_CSWAP(dst[5], dst[16]); + SORT_CSWAP(dst[10], dst[22]); + SORT_CSWAP(dst[6], dst[18]); + SORT_CSWAP(dst[5], dst[14]); + SORT_CSWAP(dst[11], dst[22]); + SORT_CSWAP(dst[6], dst[17]); + SORT_CSWAP(dst[12], dst[22]); + SORT_CSWAP(dst[10], dst[18]); + SORT_CSWAP(dst[11], dst[19]); + SORT_CSWAP(dst[6], dst[16]); + SORT_CSWAP(dst[13], dst[22]); + SORT_CSWAP(dst[9], dst[17]); + SORT_CSWAP(dst[11], dst[18]); + SORT_CSWAP(dst[12], dst[20]); + SORT_CSWAP(dst[6], dst[15]); + SORT_CSWAP(dst[8], dst[16]); + SORT_CSWAP(dst[13], dst[21]); + SORT_CSWAP(dst[12], dst[18]); + SORT_CSWAP(dst[6], dst[14]); + SORT_CSWAP(dst[7], dst[15]); + SORT_CSWAP(dst[9], dst[16]); + SORT_CSWAP(dst[13], dst[20]); + SORT_CSWAP(dst[7], dst[14]); + SORT_CSWAP(dst[9], dst[15]); + SORT_CSWAP(dst[13], dst[19]); + SORT_CSWAP(dst[12], dst[16]); + SORT_CSWAP(dst[8], dst[14]); + SORT_CSWAP(dst[13], dst[18]); + SORT_CSWAP(dst[11], dst[15]); + SORT_CSWAP(dst[9], dst[14]); + SORT_CSWAP(dst[13], dst[17]); + SORT_CSWAP(dst[10], dst[14]); + SORT_CSWAP(dst[13], dst[16]); + SORT_CSWAP(dst[11], dst[14]); + SORT_CSWAP(dst[13], dst[15]); + SORT_CSWAP(dst[12], dst[14]); + SORT_CSWAP(dst[13], dst[14]); +} + + +#define BITONIC_SORT_30 SORT_MAKE_STR(bitonic_sort_30) +static __inline void BITONIC_SORT_30(SORT_TYPE *dst) { + SORT_CSWAP(dst[1], dst[2]); + SORT_CSWAP(dst[3], dst[4]); + SORT_CSWAP(dst[5], dst[6]); + SORT_CSWAP(dst[7], dst[8]); + SORT_CSWAP(dst[9], dst[10]); + SORT_CSWAP(dst[11], dst[12]); + SORT_CSWAP(dst[13], dst[14]); + SORT_CSWAP(dst[16], dst[17]); + SORT_CSWAP(dst[18], dst[19]); + SORT_CSWAP(dst[20], dst[21]); + SORT_CSWAP(dst[22], dst[23]); + SORT_CSWAP(dst[24], dst[25]); + SORT_CSWAP(dst[26], dst[27]); + SORT_CSWAP(dst[28], dst[29]); + SORT_CSWAP(dst[0], dst[2]); + SORT_CSWAP(dst[3], dst[5]); + SORT_CSWAP(dst[4], dst[6]); + SORT_CSWAP(dst[7], dst[9]); + SORT_CSWAP(dst[8], dst[10]); + SORT_CSWAP(dst[11], dst[13]); + SORT_CSWAP(dst[12], dst[14]); + SORT_CSWAP(dst[15], dst[17]); + SORT_CSWAP(dst[18], dst[20]); + SORT_CSWAP(dst[19], dst[21]); + SORT_CSWAP(dst[22], dst[24]); + SORT_CSWAP(dst[23], dst[25]); + SORT_CSWAP(dst[26], dst[28]); + SORT_CSWAP(dst[27], dst[29]); + SORT_CSWAP(dst[0], dst[1]); + SORT_CSWAP(dst[4], dst[5]); + SORT_CSWAP(dst[2], dst[6]); + SORT_CSWAP(dst[8], dst[9]); + SORT_CSWAP(dst[12], dst[13]); + SORT_CSWAP(dst[7], dst[11]); + SORT_CSWAP(dst[10], dst[14]); + SORT_CSWAP(dst[15], dst[16]); + SORT_CSWAP(dst[19], dst[20]); + SORT_CSWAP(dst[17], dst[21]); + SORT_CSWAP(dst[23], dst[24]); + SORT_CSWAP(dst[27], dst[28]); + SORT_CSWAP(dst[22], dst[26]); + SORT_CSWAP(dst[25], dst[29]); + SORT_CSWAP(dst[0], dst[4]); + SORT_CSWAP(dst[1], dst[5]); + SORT_CSWAP(dst[8], dst[12]); + SORT_CSWAP(dst[9], dst[13]); + SORT_CSWAP(dst[6], dst[14]); + SORT_CSWAP(dst[15], dst[19]); + SORT_CSWAP(dst[16], dst[20]); + SORT_CSWAP(dst[23], dst[27]); + SORT_CSWAP(dst[24], dst[28]); + SORT_CSWAP(dst[21], dst[29]); + SORT_CSWAP(dst[0], dst[3]); + SORT_CSWAP(dst[2], dst[5]); + SORT_CSWAP(dst[8], dst[11]); + SORT_CSWAP(dst[10], dst[13]); + SORT_CSWAP(dst[15], dst[18]); + SORT_CSWAP(dst[17], dst[20]); + SORT_CSWAP(dst[23], dst[26]); + SORT_CSWAP(dst[25], dst[28]); + SORT_CSWAP(dst[14], dst[29]); + SORT_CSWAP(dst[1], dst[3]); + SORT_CSWAP(dst[2], dst[4]); + SORT_CSWAP(dst[9], dst[11]); + SORT_CSWAP(dst[10], dst[12]); + SORT_CSWAP(dst[0], dst[8]); + SORT_CSWAP(dst[5], dst[13]); + SORT_CSWAP(dst[16], dst[18]); + SORT_CSWAP(dst[17], dst[19]); + SORT_CSWAP(dst[24], dst[26]); + SORT_CSWAP(dst[25], dst[27]); + SORT_CSWAP(dst[15], dst[23]); + SORT_CSWAP(dst[20], dst[28]); + SORT_CSWAP(dst[2], dst[3]); + SORT_CSWAP(dst[10], dst[11]); + SORT_CSWAP(dst[0], dst[7]); + SORT_CSWAP(dst[1], dst[9]); + SORT_CSWAP(dst[4], dst[12]); + SORT_CSWAP(dst[6], dst[13]); + SORT_CSWAP(dst[17], dst[18]); + SORT_CSWAP(dst[25], dst[26]); + SORT_CSWAP(dst[15], dst[22]); + SORT_CSWAP(dst[16], dst[24]); + SORT_CSWAP(dst[19], dst[27]); + SORT_CSWAP(dst[21], dst[28]); + SORT_CSWAP(dst[2], dst[10]); + SORT_CSWAP(dst[1], dst[7]); + SORT_CSWAP(dst[3], dst[11]); + SORT_CSWAP(dst[6], dst[12]); + SORT_CSWAP(dst[17], dst[25]); + SORT_CSWAP(dst[16], dst[22]); + SORT_CSWAP(dst[18], dst[26]); + SORT_CSWAP(dst[21], dst[27]); + SORT_CSWAP(dst[0], dst[15]); + SORT_CSWAP(dst[13], dst[28]); + SORT_CSWAP(dst[2], dst[9]); + SORT_CSWAP(dst[4], dst[11]); + SORT_CSWAP(dst[17], dst[24]); + SORT_CSWAP(dst[19], dst[26]); + SORT_CSWAP(dst[1], dst[16]); + SORT_CSWAP(dst[12], dst[27]); + SORT_CSWAP(dst[14], dst[28]); + SORT_CSWAP(dst[2], dst[8]); + SORT_CSWAP(dst[5], dst[11]); + SORT_CSWAP(dst[17], dst[23]); + SORT_CSWAP(dst[20], dst[26]); + SORT_CSWAP(dst[1], dst[15]); + SORT_CSWAP(dst[14], dst[27]); + SORT_CSWAP(dst[2], dst[7]); + SORT_CSWAP(dst[6], dst[11]); + SORT_CSWAP(dst[4], dst[8]); + SORT_CSWAP(dst[5], dst[9]); + SORT_CSWAP(dst[17], dst[22]); + SORT_CSWAP(dst[21], dst[26]); + SORT_CSWAP(dst[19], dst[23]); + SORT_CSWAP(dst[20], dst[24]); + SORT_CSWAP(dst[3], dst[7]); + SORT_CSWAP(dst[6], dst[10]); + SORT_CSWAP(dst[18], dst[22]); + SORT_CSWAP(dst[21], dst[25]); + SORT_CSWAP(dst[2], dst[17]); + SORT_CSWAP(dst[11], dst[26]); + SORT_CSWAP(dst[4], dst[7]); + SORT_CSWAP(dst[6], dst[9]); + SORT_CSWAP(dst[19], dst[22]); + SORT_CSWAP(dst[21], dst[24]); + SORT_CSWAP(dst[2], dst[16]); + SORT_CSWAP(dst[3], dst[18]); + SORT_CSWAP(dst[10], dst[25]); + SORT_CSWAP(dst[12], dst[26]); + SORT_CSWAP(dst[5], dst[7]); + SORT_CSWAP(dst[6], dst[8]); + SORT_CSWAP(dst[20], dst[22]); + SORT_CSWAP(dst[21], dst[23]); + SORT_CSWAP(dst[2], dst[15]); + SORT_CSWAP(dst[4], dst[19]); + SORT_CSWAP(dst[9], dst[24]); + SORT_CSWAP(dst[13], dst[26]); + SORT_CSWAP(dst[6], dst[7]); + SORT_CSWAP(dst[21], dst[22]); + SORT_CSWAP(dst[4], dst[18]); + SORT_CSWAP(dst[5], dst[20]); + SORT_CSWAP(dst[3], dst[15]); + SORT_CSWAP(dst[8], dst[23]); + SORT_CSWAP(dst[10], dst[24]); + SORT_CSWAP(dst[14], dst[26]); + SORT_CSWAP(dst[6], dst[21]); + SORT_CSWAP(dst[5], dst[18]); + SORT_CSWAP(dst[4], dst[16]); + SORT_CSWAP(dst[7], dst[22]); + SORT_CSWAP(dst[10], dst[23]); + SORT_CSWAP(dst[13], dst[24]); + SORT_CSWAP(dst[14], dst[25]); + SORT_CSWAP(dst[6], dst[20]); + SORT_CSWAP(dst[4], dst[15]); + SORT_CSWAP(dst[5], dst[17]); + SORT_CSWAP(dst[8], dst[22]); + SORT_CSWAP(dst[12], dst[23]); + SORT_CSWAP(dst[14], dst[24]); + SORT_CSWAP(dst[6], dst[19]); + SORT_CSWAP(dst[5], dst[15]); + SORT_CSWAP(dst[9], dst[22]); + SORT_CSWAP(dst[14], dst[23]); + SORT_CSWAP(dst[6], dst[18]); + SORT_CSWAP(dst[10], dst[22]); + SORT_CSWAP(dst[6], dst[17]); + SORT_CSWAP(dst[11], dst[22]); + SORT_CSWAP(dst[10], dst[18]); + SORT_CSWAP(dst[6], dst[16]); + SORT_CSWAP(dst[12], dst[22]); + SORT_CSWAP(dst[9], dst[17]); + SORT_CSWAP(dst[11], dst[19]); + SORT_CSWAP(dst[6], dst[15]); + SORT_CSWAP(dst[13], dst[22]); + SORT_CSWAP(dst[8], dst[16]); + SORT_CSWAP(dst[10], dst[17]); + SORT_CSWAP(dst[12], dst[20]); + SORT_CSWAP(dst[14], dst[22]); + SORT_CSWAP(dst[7], dst[15]); + SORT_CSWAP(dst[10], dst[16]); + SORT_CSWAP(dst[12], dst[19]); + SORT_CSWAP(dst[13], dst[21]); + SORT_CSWAP(dst[8], dst[15]); + SORT_CSWAP(dst[14], dst[21]); + SORT_CSWAP(dst[13], dst[19]); + SORT_CSWAP(dst[12], dst[16]); + SORT_CSWAP(dst[9], dst[15]); + SORT_CSWAP(dst[14], dst[20]); + SORT_CSWAP(dst[13], dst[17]); + SORT_CSWAP(dst[10], dst[15]); + SORT_CSWAP(dst[14], dst[19]); + SORT_CSWAP(dst[11], dst[15]); + SORT_CSWAP(dst[14], dst[18]); + SORT_CSWAP(dst[12], dst[15]); + SORT_CSWAP(dst[14], dst[17]); + SORT_CSWAP(dst[13], dst[15]); + SORT_CSWAP(dst[14], dst[16]); + SORT_CSWAP(dst[14], dst[15]); +} + + +#define BITONIC_SORT_31 SORT_MAKE_STR(bitonic_sort_31) +static __inline void BITONIC_SORT_31(SORT_TYPE *dst) { + SORT_CSWAP(dst[1], dst[2]); + SORT_CSWAP(dst[3], dst[4]); + SORT_CSWAP(dst[5], dst[6]); + SORT_CSWAP(dst[7], dst[8]); + SORT_CSWAP(dst[9], dst[10]); + SORT_CSWAP(dst[11], dst[12]); + SORT_CSWAP(dst[13], dst[14]); + SORT_CSWAP(dst[15], dst[16]); + SORT_CSWAP(dst[17], dst[18]); + SORT_CSWAP(dst[19], dst[20]); + SORT_CSWAP(dst[21], dst[22]); + SORT_CSWAP(dst[23], dst[24]); + SORT_CSWAP(dst[25], dst[26]); + SORT_CSWAP(dst[27], dst[28]); + SORT_CSWAP(dst[29], dst[30]); + SORT_CSWAP(dst[0], dst[2]); + SORT_CSWAP(dst[3], dst[5]); + SORT_CSWAP(dst[4], dst[6]); + SORT_CSWAP(dst[7], dst[9]); + SORT_CSWAP(dst[8], dst[10]); + SORT_CSWAP(dst[11], dst[13]); + SORT_CSWAP(dst[12], dst[14]); + SORT_CSWAP(dst[15], dst[17]); + SORT_CSWAP(dst[16], dst[18]); + SORT_CSWAP(dst[19], dst[21]); + SORT_CSWAP(dst[20], dst[22]); + SORT_CSWAP(dst[23], dst[25]); + SORT_CSWAP(dst[24], dst[26]); + SORT_CSWAP(dst[27], dst[29]); + SORT_CSWAP(dst[28], dst[30]); + SORT_CSWAP(dst[0], dst[1]); + SORT_CSWAP(dst[4], dst[5]); + SORT_CSWAP(dst[2], dst[6]); + SORT_CSWAP(dst[8], dst[9]); + SORT_CSWAP(dst[12], dst[13]); + SORT_CSWAP(dst[7], dst[11]); + SORT_CSWAP(dst[10], dst[14]); + SORT_CSWAP(dst[16], dst[17]); + SORT_CSWAP(dst[20], dst[21]); + SORT_CSWAP(dst[15], dst[19]); + SORT_CSWAP(dst[18], dst[22]); + SORT_CSWAP(dst[24], dst[25]); + SORT_CSWAP(dst[28], dst[29]); + SORT_CSWAP(dst[23], dst[27]); + SORT_CSWAP(dst[26], dst[30]); + SORT_CSWAP(dst[0], dst[4]); + SORT_CSWAP(dst[1], dst[5]); + SORT_CSWAP(dst[8], dst[12]); + SORT_CSWAP(dst[9], dst[13]); + SORT_CSWAP(dst[6], dst[14]); + SORT_CSWAP(dst[16], dst[20]); + SORT_CSWAP(dst[17], dst[21]); + SORT_CSWAP(dst[24], dst[28]); + SORT_CSWAP(dst[25], dst[29]); + SORT_CSWAP(dst[15], dst[23]); + SORT_CSWAP(dst[22], dst[30]); + SORT_CSWAP(dst[0], dst[3]); + SORT_CSWAP(dst[2], dst[5]); + SORT_CSWAP(dst[8], dst[11]); + SORT_CSWAP(dst[10], dst[13]); + SORT_CSWAP(dst[16], dst[19]); + SORT_CSWAP(dst[18], dst[21]); + SORT_CSWAP(dst[24], dst[27]); + SORT_CSWAP(dst[26], dst[29]); + SORT_CSWAP(dst[14], dst[30]); + SORT_CSWAP(dst[1], dst[3]); + SORT_CSWAP(dst[2], dst[4]); + SORT_CSWAP(dst[9], dst[11]); + SORT_CSWAP(dst[10], dst[12]); + SORT_CSWAP(dst[0], dst[8]); + SORT_CSWAP(dst[5], dst[13]); + SORT_CSWAP(dst[17], dst[19]); + SORT_CSWAP(dst[18], dst[20]); + SORT_CSWAP(dst[25], dst[27]); + SORT_CSWAP(dst[26], dst[28]); + SORT_CSWAP(dst[16], dst[24]); + SORT_CSWAP(dst[21], dst[29]); + SORT_CSWAP(dst[2], dst[3]); + SORT_CSWAP(dst[10], dst[11]); + SORT_CSWAP(dst[0], dst[7]); + SORT_CSWAP(dst[1], dst[9]); + SORT_CSWAP(dst[4], dst[12]); + SORT_CSWAP(dst[6], dst[13]); + SORT_CSWAP(dst[18], dst[19]); + SORT_CSWAP(dst[26], dst[27]); + SORT_CSWAP(dst[16], dst[23]); + SORT_CSWAP(dst[17], dst[25]); + SORT_CSWAP(dst[20], dst[28]); + SORT_CSWAP(dst[22], dst[29]); + SORT_CSWAP(dst[2], dst[10]); + SORT_CSWAP(dst[1], dst[7]); + SORT_CSWAP(dst[3], dst[11]); + SORT_CSWAP(dst[6], dst[12]); + SORT_CSWAP(dst[18], dst[26]); + SORT_CSWAP(dst[17], dst[23]); + SORT_CSWAP(dst[19], dst[27]); + SORT_CSWAP(dst[22], dst[28]); + SORT_CSWAP(dst[0], dst[16]); + SORT_CSWAP(dst[13], dst[29]); + SORT_CSWAP(dst[2], dst[9]); + SORT_CSWAP(dst[4], dst[11]); + SORT_CSWAP(dst[18], dst[25]); + SORT_CSWAP(dst[20], dst[27]); + SORT_CSWAP(dst[0], dst[15]); + SORT_CSWAP(dst[1], dst[17]); + SORT_CSWAP(dst[12], dst[28]); + SORT_CSWAP(dst[14], dst[29]); + SORT_CSWAP(dst[2], dst[8]); + SORT_CSWAP(dst[5], dst[11]); + SORT_CSWAP(dst[18], dst[24]); + SORT_CSWAP(dst[21], dst[27]); + SORT_CSWAP(dst[1], dst[15]); + SORT_CSWAP(dst[14], dst[28]); + SORT_CSWAP(dst[2], dst[7]); + SORT_CSWAP(dst[6], dst[11]); + SORT_CSWAP(dst[4], dst[8]); + SORT_CSWAP(dst[5], dst[9]); + SORT_CSWAP(dst[18], dst[23]); + SORT_CSWAP(dst[22], dst[27]); + SORT_CSWAP(dst[20], dst[24]); + SORT_CSWAP(dst[21], dst[25]); + SORT_CSWAP(dst[3], dst[7]); + SORT_CSWAP(dst[6], dst[10]); + SORT_CSWAP(dst[19], dst[23]); + SORT_CSWAP(dst[22], dst[26]); + SORT_CSWAP(dst[2], dst[18]); + SORT_CSWAP(dst[11], dst[27]); + SORT_CSWAP(dst[4], dst[7]); + SORT_CSWAP(dst[6], dst[9]); + SORT_CSWAP(dst[20], dst[23]); + SORT_CSWAP(dst[22], dst[25]); + SORT_CSWAP(dst[2], dst[17]); + SORT_CSWAP(dst[3], dst[19]); + SORT_CSWAP(dst[10], dst[26]); + SORT_CSWAP(dst[12], dst[27]); + SORT_CSWAP(dst[5], dst[7]); + SORT_CSWAP(dst[6], dst[8]); + SORT_CSWAP(dst[21], dst[23]); + SORT_CSWAP(dst[22], dst[24]); + SORT_CSWAP(dst[2], dst[16]); + SORT_CSWAP(dst[4], dst[20]); + SORT_CSWAP(dst[9], dst[25]); + SORT_CSWAP(dst[13], dst[27]); + SORT_CSWAP(dst[6], dst[7]); + SORT_CSWAP(dst[22], dst[23]); + SORT_CSWAP(dst[2], dst[15]); + SORT_CSWAP(dst[4], dst[19]); + SORT_CSWAP(dst[5], dst[21]); + SORT_CSWAP(dst[8], dst[24]); + SORT_CSWAP(dst[10], dst[25]); + SORT_CSWAP(dst[14], dst[27]); + SORT_CSWAP(dst[6], dst[22]); + SORT_CSWAP(dst[5], dst[19]); + SORT_CSWAP(dst[3], dst[15]); + SORT_CSWAP(dst[4], dst[16]); + SORT_CSWAP(dst[7], dst[23]); + SORT_CSWAP(dst[10], dst[24]); + SORT_CSWAP(dst[13], dst[25]); + SORT_CSWAP(dst[14], dst[26]); + SORT_CSWAP(dst[6], dst[21]); + SORT_CSWAP(dst[4], dst[15]); + SORT_CSWAP(dst[5], dst[17]); + SORT_CSWAP(dst[8], dst[23]); + SORT_CSWAP(dst[12], dst[24]); + SORT_CSWAP(dst[14], dst[25]); + SORT_CSWAP(dst[6], dst[20]); + SORT_CSWAP(dst[5], dst[15]); + SORT_CSWAP(dst[9], dst[23]); + SORT_CSWAP(dst[14], dst[24]); + SORT_CSWAP(dst[6], dst[19]); + SORT_CSWAP(dst[10], dst[23]); + SORT_CSWAP(dst[6], dst[18]); + SORT_CSWAP(dst[11], dst[23]); + SORT_CSWAP(dst[6], dst[17]); + SORT_CSWAP(dst[12], dst[23]); + SORT_CSWAP(dst[10], dst[18]); + SORT_CSWAP(dst[11], dst[19]); + SORT_CSWAP(dst[6], dst[16]); + SORT_CSWAP(dst[13], dst[23]); + SORT_CSWAP(dst[9], dst[17]); + SORT_CSWAP(dst[12], dst[20]); + SORT_CSWAP(dst[6], dst[15]); + SORT_CSWAP(dst[14], dst[23]); + SORT_CSWAP(dst[8], dst[16]); + SORT_CSWAP(dst[10], dst[17]); + SORT_CSWAP(dst[12], dst[19]); + SORT_CSWAP(dst[13], dst[21]); + SORT_CSWAP(dst[7], dst[15]); + SORT_CSWAP(dst[10], dst[16]); + SORT_CSWAP(dst[14], dst[22]); + SORT_CSWAP(dst[13], dst[19]); + SORT_CSWAP(dst[8], dst[15]); + SORT_CSWAP(dst[14], dst[21]); + SORT_CSWAP(dst[12], dst[16]); + SORT_CSWAP(dst[13], dst[17]); + SORT_CSWAP(dst[9], dst[15]); + SORT_CSWAP(dst[14], dst[20]); + SORT_CSWAP(dst[10], dst[15]); + SORT_CSWAP(dst[14], dst[19]); + SORT_CSWAP(dst[11], dst[15]); + SORT_CSWAP(dst[14], dst[18]); + SORT_CSWAP(dst[12], dst[15]); + SORT_CSWAP(dst[14], dst[17]); + SORT_CSWAP(dst[13], dst[15]); + SORT_CSWAP(dst[14], dst[16]); + SORT_CSWAP(dst[14], dst[15]); +} + + +#define BITONIC_SORT_32 SORT_MAKE_STR(bitonic_sort_32) +static __inline void BITONIC_SORT_32(SORT_TYPE *dst) { + SORT_CSWAP(dst[0], dst[1]); + SORT_CSWAP(dst[2], dst[3]); + SORT_CSWAP(dst[4], dst[5]); + SORT_CSWAP(dst[6], dst[7]); + SORT_CSWAP(dst[8], dst[9]); + SORT_CSWAP(dst[10], dst[11]); + SORT_CSWAP(dst[12], dst[13]); + SORT_CSWAP(dst[14], dst[15]); + SORT_CSWAP(dst[16], dst[17]); + SORT_CSWAP(dst[18], dst[19]); + SORT_CSWAP(dst[20], dst[21]); + SORT_CSWAP(dst[22], dst[23]); + SORT_CSWAP(dst[24], dst[25]); + SORT_CSWAP(dst[26], dst[27]); + SORT_CSWAP(dst[28], dst[29]); + SORT_CSWAP(dst[30], dst[31]); + SORT_CSWAP(dst[0], dst[2]); + SORT_CSWAP(dst[1], dst[3]); + SORT_CSWAP(dst[4], dst[6]); + SORT_CSWAP(dst[5], dst[7]); + SORT_CSWAP(dst[8], dst[10]); + SORT_CSWAP(dst[9], dst[11]); + SORT_CSWAP(dst[12], dst[14]); + SORT_CSWAP(dst[13], dst[15]); + SORT_CSWAP(dst[16], dst[18]); + SORT_CSWAP(dst[17], dst[19]); + SORT_CSWAP(dst[20], dst[22]); + SORT_CSWAP(dst[21], dst[23]); + SORT_CSWAP(dst[24], dst[26]); + SORT_CSWAP(dst[25], dst[27]); + SORT_CSWAP(dst[28], dst[30]); + SORT_CSWAP(dst[29], dst[31]); + SORT_CSWAP(dst[1], dst[2]); + SORT_CSWAP(dst[5], dst[6]); + SORT_CSWAP(dst[0], dst[4]); + SORT_CSWAP(dst[3], dst[7]); + SORT_CSWAP(dst[9], dst[10]); + SORT_CSWAP(dst[13], dst[14]); + SORT_CSWAP(dst[8], dst[12]); + SORT_CSWAP(dst[11], dst[15]); + SORT_CSWAP(dst[17], dst[18]); + SORT_CSWAP(dst[21], dst[22]); + SORT_CSWAP(dst[16], dst[20]); + SORT_CSWAP(dst[19], dst[23]); + SORT_CSWAP(dst[25], dst[26]); + SORT_CSWAP(dst[29], dst[30]); + SORT_CSWAP(dst[24], dst[28]); + SORT_CSWAP(dst[27], dst[31]); + SORT_CSWAP(dst[1], dst[5]); + SORT_CSWAP(dst[2], dst[6]); + SORT_CSWAP(dst[9], dst[13]); + SORT_CSWAP(dst[10], dst[14]); + SORT_CSWAP(dst[0], dst[8]); + SORT_CSWAP(dst[7], dst[15]); + SORT_CSWAP(dst[17], dst[21]); + SORT_CSWAP(dst[18], dst[22]); + SORT_CSWAP(dst[25], dst[29]); + SORT_CSWAP(dst[26], dst[30]); + SORT_CSWAP(dst[16], dst[24]); + SORT_CSWAP(dst[23], dst[31]); + SORT_CSWAP(dst[1], dst[4]); + SORT_CSWAP(dst[3], dst[6]); + SORT_CSWAP(dst[9], dst[12]); + SORT_CSWAP(dst[11], dst[14]); + SORT_CSWAP(dst[17], dst[20]); + SORT_CSWAP(dst[19], dst[22]); + SORT_CSWAP(dst[25], dst[28]); + SORT_CSWAP(dst[27], dst[30]); + SORT_CSWAP(dst[0], dst[16]); + SORT_CSWAP(dst[15], dst[31]); + SORT_CSWAP(dst[2], dst[4]); + SORT_CSWAP(dst[3], dst[5]); + SORT_CSWAP(dst[10], dst[12]); + SORT_CSWAP(dst[11], dst[13]); + SORT_CSWAP(dst[1], dst[9]); + SORT_CSWAP(dst[6], dst[14]); + SORT_CSWAP(dst[18], dst[20]); + SORT_CSWAP(dst[19], dst[21]); + SORT_CSWAP(dst[26], dst[28]); + SORT_CSWAP(dst[27], dst[29]); + SORT_CSWAP(dst[17], dst[25]); + SORT_CSWAP(dst[22], dst[30]); + SORT_CSWAP(dst[3], dst[4]); + SORT_CSWAP(dst[11], dst[12]); + SORT_CSWAP(dst[1], dst[8]); + SORT_CSWAP(dst[2], dst[10]); + SORT_CSWAP(dst[5], dst[13]); + SORT_CSWAP(dst[7], dst[14]); + SORT_CSWAP(dst[19], dst[20]); + SORT_CSWAP(dst[27], dst[28]); + SORT_CSWAP(dst[17], dst[24]); + SORT_CSWAP(dst[18], dst[26]); + SORT_CSWAP(dst[21], dst[29]); + SORT_CSWAP(dst[23], dst[30]); + SORT_CSWAP(dst[3], dst[11]); + SORT_CSWAP(dst[2], dst[8]); + SORT_CSWAP(dst[4], dst[12]); + SORT_CSWAP(dst[7], dst[13]); + SORT_CSWAP(dst[19], dst[27]); + SORT_CSWAP(dst[18], dst[24]); + SORT_CSWAP(dst[20], dst[28]); + SORT_CSWAP(dst[23], dst[29]); + SORT_CSWAP(dst[1], dst[17]); + SORT_CSWAP(dst[14], dst[30]); + SORT_CSWAP(dst[3], dst[10]); + SORT_CSWAP(dst[5], dst[12]); + SORT_CSWAP(dst[19], dst[26]); + SORT_CSWAP(dst[21], dst[28]); + SORT_CSWAP(dst[1], dst[16]); + SORT_CSWAP(dst[2], dst[18]); + SORT_CSWAP(dst[13], dst[29]); + SORT_CSWAP(dst[15], dst[30]); + SORT_CSWAP(dst[3], dst[9]); + SORT_CSWAP(dst[6], dst[12]); + SORT_CSWAP(dst[19], dst[25]); + SORT_CSWAP(dst[22], dst[28]); + SORT_CSWAP(dst[2], dst[16]); + SORT_CSWAP(dst[15], dst[29]); + SORT_CSWAP(dst[3], dst[8]); + SORT_CSWAP(dst[7], dst[12]); + SORT_CSWAP(dst[5], dst[9]); + SORT_CSWAP(dst[6], dst[10]); + SORT_CSWAP(dst[19], dst[24]); + SORT_CSWAP(dst[23], dst[28]); + SORT_CSWAP(dst[21], dst[25]); + SORT_CSWAP(dst[22], dst[26]); + SORT_CSWAP(dst[4], dst[8]); + SORT_CSWAP(dst[7], dst[11]); + SORT_CSWAP(dst[20], dst[24]); + SORT_CSWAP(dst[23], dst[27]); + SORT_CSWAP(dst[3], dst[19]); + SORT_CSWAP(dst[12], dst[28]); + SORT_CSWAP(dst[5], dst[8]); + SORT_CSWAP(dst[7], dst[10]); + SORT_CSWAP(dst[21], dst[24]); + SORT_CSWAP(dst[23], dst[26]); + SORT_CSWAP(dst[3], dst[18]); + SORT_CSWAP(dst[4], dst[20]); + SORT_CSWAP(dst[11], dst[27]); + SORT_CSWAP(dst[13], dst[28]); + SORT_CSWAP(dst[6], dst[8]); + SORT_CSWAP(dst[7], dst[9]); + SORT_CSWAP(dst[22], dst[24]); + SORT_CSWAP(dst[23], dst[25]); + SORT_CSWAP(dst[3], dst[17]); + SORT_CSWAP(dst[5], dst[21]); + SORT_CSWAP(dst[10], dst[26]); + SORT_CSWAP(dst[14], dst[28]); + SORT_CSWAP(dst[7], dst[8]); + SORT_CSWAP(dst[23], dst[24]); + SORT_CSWAP(dst[3], dst[16]); + SORT_CSWAP(dst[5], dst[20]); + SORT_CSWAP(dst[6], dst[22]); + SORT_CSWAP(dst[9], dst[25]); + SORT_CSWAP(dst[11], dst[26]); + SORT_CSWAP(dst[15], dst[28]); + SORT_CSWAP(dst[7], dst[23]); + SORT_CSWAP(dst[6], dst[20]); + SORT_CSWAP(dst[4], dst[16]); + SORT_CSWAP(dst[5], dst[17]); + SORT_CSWAP(dst[8], dst[24]); + SORT_CSWAP(dst[11], dst[25]); + SORT_CSWAP(dst[14], dst[26]); + SORT_CSWAP(dst[15], dst[27]); + SORT_CSWAP(dst[7], dst[22]); + SORT_CSWAP(dst[5], dst[16]); + SORT_CSWAP(dst[6], dst[18]); + SORT_CSWAP(dst[9], dst[24]); + SORT_CSWAP(dst[13], dst[25]); + SORT_CSWAP(dst[15], dst[26]); + SORT_CSWAP(dst[7], dst[21]); + SORT_CSWAP(dst[6], dst[16]); + SORT_CSWAP(dst[10], dst[24]); + SORT_CSWAP(dst[15], dst[25]); + SORT_CSWAP(dst[7], dst[20]); + SORT_CSWAP(dst[11], dst[24]); + SORT_CSWAP(dst[7], dst[19]); + SORT_CSWAP(dst[12], dst[24]); + SORT_CSWAP(dst[7], dst[18]); + SORT_CSWAP(dst[13], dst[24]); + SORT_CSWAP(dst[11], dst[19]); + SORT_CSWAP(dst[12], dst[20]); + SORT_CSWAP(dst[7], dst[17]); + SORT_CSWAP(dst[14], dst[24]); + SORT_CSWAP(dst[10], dst[18]); + SORT_CSWAP(dst[13], dst[21]); + SORT_CSWAP(dst[7], dst[16]); + SORT_CSWAP(dst[15], dst[24]); + SORT_CSWAP(dst[9], dst[17]); + SORT_CSWAP(dst[11], dst[18]); + SORT_CSWAP(dst[13], dst[20]); + SORT_CSWAP(dst[14], dst[22]); + SORT_CSWAP(dst[8], dst[16]); + SORT_CSWAP(dst[11], dst[17]); + SORT_CSWAP(dst[15], dst[23]); + SORT_CSWAP(dst[14], dst[20]); + SORT_CSWAP(dst[9], dst[16]); + SORT_CSWAP(dst[15], dst[22]); + SORT_CSWAP(dst[13], dst[17]); + SORT_CSWAP(dst[14], dst[18]); + SORT_CSWAP(dst[10], dst[16]); + SORT_CSWAP(dst[15], dst[21]); + SORT_CSWAP(dst[11], dst[16]); + SORT_CSWAP(dst[15], dst[20]); + SORT_CSWAP(dst[12], dst[16]); + SORT_CSWAP(dst[15], dst[19]); + SORT_CSWAP(dst[13], dst[16]); + SORT_CSWAP(dst[15], dst[18]); + SORT_CSWAP(dst[14], dst[16]); + SORT_CSWAP(dst[15], dst[17]); + SORT_CSWAP(dst[15], dst[16]); +} + +#define BITONIC_SORT_REVERSE_2 SORT_MAKE_STR(bitonic_sort_reverse_2) +static __inline void BITONIC_SORT_REVERSE_2(SORT_TYPE *dst) { + SORT_CSWAP(dst[1], dst[0]); +} + + +#define BITONIC_SORT_REVERSE_3 SORT_MAKE_STR(bitonic_sort_reverse_3) +static __inline void BITONIC_SORT_REVERSE_3(SORT_TYPE *dst) { + SORT_CSWAP(dst[2], dst[1]); + SORT_CSWAP(dst[2], dst[0]); + SORT_CSWAP(dst[1], dst[0]); +} + + +#define BITONIC_SORT_REVERSE_4 SORT_MAKE_STR(bitonic_sort_reverse_4) +static __inline void BITONIC_SORT_REVERSE_4(SORT_TYPE *dst) { + SORT_CSWAP(dst[1], dst[0]); + SORT_CSWAP(dst[3], dst[2]); + SORT_CSWAP(dst[2], dst[0]); + SORT_CSWAP(dst[3], dst[1]); + SORT_CSWAP(dst[2], dst[1]); +} + + +#define BITONIC_SORT_REVERSE_5 SORT_MAKE_STR(bitonic_sort_reverse_5) +static __inline void BITONIC_SORT_REVERSE_5(SORT_TYPE *dst) { + SORT_CSWAP(dst[1], dst[0]); + SORT_CSWAP(dst[4], dst[3]); + SORT_CSWAP(dst[4], dst[2]); + SORT_CSWAP(dst[3], dst[2]); + SORT_CSWAP(dst[4], dst[1]); + SORT_CSWAP(dst[3], dst[0]); + SORT_CSWAP(dst[2], dst[0]); + SORT_CSWAP(dst[3], dst[1]); + SORT_CSWAP(dst[2], dst[1]); +} + + +#define BITONIC_SORT_REVERSE_6 SORT_MAKE_STR(bitonic_sort_reverse_6) +static __inline void BITONIC_SORT_REVERSE_6(SORT_TYPE *dst) { + SORT_CSWAP(dst[2], dst[1]); + SORT_CSWAP(dst[5], dst[4]); + SORT_CSWAP(dst[2], dst[0]); + SORT_CSWAP(dst[5], dst[3]); + SORT_CSWAP(dst[1], dst[0]); + SORT_CSWAP(dst[4], dst[3]); + SORT_CSWAP(dst[5], dst[2]); + SORT_CSWAP(dst[3], dst[0]); + SORT_CSWAP(dst[4], dst[1]); + SORT_CSWAP(dst[4], dst[2]); + SORT_CSWAP(dst[3], dst[1]); + SORT_CSWAP(dst[3], dst[2]); +} + + +#define BITONIC_SORT_REVERSE_7 SORT_MAKE_STR(bitonic_sort_reverse_7) +static __inline void BITONIC_SORT_REVERSE_7(SORT_TYPE *dst) { + SORT_CSWAP(dst[2], dst[1]); + SORT_CSWAP(dst[4], dst[3]); + SORT_CSWAP(dst[6], dst[5]); + SORT_CSWAP(dst[2], dst[0]); + SORT_CSWAP(dst[5], dst[3]); + SORT_CSWAP(dst[6], dst[4]); + SORT_CSWAP(dst[1], dst[0]); + SORT_CSWAP(dst[5], dst[4]); + SORT_CSWAP(dst[6], dst[2]); + SORT_CSWAP(dst[4], dst[0]); + SORT_CSWAP(dst[5], dst[1]); + SORT_CSWAP(dst[3], dst[0]); + SORT_CSWAP(dst[5], dst[2]); + SORT_CSWAP(dst[3], dst[1]); + SORT_CSWAP(dst[4], dst[2]); + SORT_CSWAP(dst[3], dst[2]); +} + + +#define BITONIC_SORT_REVERSE_8 SORT_MAKE_STR(bitonic_sort_reverse_8) +static __inline void BITONIC_SORT_REVERSE_8(SORT_TYPE *dst) { + SORT_CSWAP(dst[1], dst[0]); + SORT_CSWAP(dst[3], dst[2]); + SORT_CSWAP(dst[5], dst[4]); + SORT_CSWAP(dst[7], dst[6]); + SORT_CSWAP(dst[2], dst[0]); + SORT_CSWAP(dst[3], dst[1]); + SORT_CSWAP(dst[6], dst[4]); + SORT_CSWAP(dst[7], dst[5]); + SORT_CSWAP(dst[2], dst[1]); + SORT_CSWAP(dst[6], dst[5]); + SORT_CSWAP(dst[4], dst[0]); + SORT_CSWAP(dst[7], dst[3]); + SORT_CSWAP(dst[5], dst[1]); + SORT_CSWAP(dst[6], dst[2]); + SORT_CSWAP(dst[4], dst[1]); + SORT_CSWAP(dst[6], dst[3]); + SORT_CSWAP(dst[4], dst[2]); + SORT_CSWAP(dst[5], dst[3]); + SORT_CSWAP(dst[4], dst[3]); +} + + +#define BITONIC_SORT_REVERSE_9 SORT_MAKE_STR(bitonic_sort_reverse_9) +static __inline void BITONIC_SORT_REVERSE_9(SORT_TYPE *dst) { + SORT_CSWAP(dst[1], dst[0]); + SORT_CSWAP(dst[4], dst[3]); + SORT_CSWAP(dst[7], dst[6]); + SORT_CSWAP(dst[2], dst[1]); + SORT_CSWAP(dst[5], dst[4]); + SORT_CSWAP(dst[8], dst[7]); + SORT_CSWAP(dst[1], dst[0]); + SORT_CSWAP(dst[4], dst[3]); + SORT_CSWAP(dst[7], dst[6]); + SORT_CSWAP(dst[5], dst[2]); + SORT_CSWAP(dst[3], dst[0]); + SORT_CSWAP(dst[4], dst[1]); + SORT_CSWAP(dst[8], dst[5]); + SORT_CSWAP(dst[6], dst[3]); + SORT_CSWAP(dst[7], dst[4]); + SORT_CSWAP(dst[5], dst[2]); + SORT_CSWAP(dst[3], dst[0]); + SORT_CSWAP(dst[4], dst[1]); + SORT_CSWAP(dst[7], dst[5]); + SORT_CSWAP(dst[6], dst[2]); + SORT_CSWAP(dst[3], dst[1]); + SORT_CSWAP(dst[6], dst[4]); + SORT_CSWAP(dst[4], dst[2]); + SORT_CSWAP(dst[6], dst[5]); + SORT_CSWAP(dst[3], dst[2]); +} + + +#define BITONIC_SORT_REVERSE_10 SORT_MAKE_STR(bitonic_sort_reverse_10) +static __inline void BITONIC_SORT_REVERSE_10(SORT_TYPE *dst) { + SORT_CSWAP(dst[9], dst[4]); + SORT_CSWAP(dst[8], dst[3]); + SORT_CSWAP(dst[7], dst[2]); + SORT_CSWAP(dst[6], dst[1]); + SORT_CSWAP(dst[5], dst[0]); + SORT_CSWAP(dst[4], dst[1]); + SORT_CSWAP(dst[9], dst[6]); + SORT_CSWAP(dst[3], dst[0]); + SORT_CSWAP(dst[8], dst[5]); + SORT_CSWAP(dst[2], dst[0]); + SORT_CSWAP(dst[6], dst[3]); + SORT_CSWAP(dst[9], dst[7]); + SORT_CSWAP(dst[1], dst[0]); + SORT_CSWAP(dst[4], dst[2]); + SORT_CSWAP(dst[7], dst[5]); + SORT_CSWAP(dst[9], dst[8]); + SORT_CSWAP(dst[2], dst[1]); + SORT_CSWAP(dst[6], dst[4]); + SORT_CSWAP(dst[8], dst[7]); + SORT_CSWAP(dst[5], dst[3]); + SORT_CSWAP(dst[5], dst[2]); + SORT_CSWAP(dst[8], dst[6]); + SORT_CSWAP(dst[3], dst[1]); + SORT_CSWAP(dst[7], dst[4]); + SORT_CSWAP(dst[3], dst[2]); + SORT_CSWAP(dst[7], dst[6]); + SORT_CSWAP(dst[4], dst[3]); + SORT_CSWAP(dst[6], dst[5]); + SORT_CSWAP(dst[5], dst[4]); +} + + +#define BITONIC_SORT_REVERSE_11 SORT_MAKE_STR(bitonic_sort_reverse_11) +static __inline void BITONIC_SORT_REVERSE_11(SORT_TYPE *dst) { + SORT_CSWAP(dst[1], dst[0]); + SORT_CSWAP(dst[3], dst[2]); + SORT_CSWAP(dst[5], dst[4]); + SORT_CSWAP(dst[7], dst[6]); + SORT_CSWAP(dst[9], dst[8]); + SORT_CSWAP(dst[3], dst[1]); + SORT_CSWAP(dst[7], dst[5]); + SORT_CSWAP(dst[2], dst[0]); + SORT_CSWAP(dst[6], dst[4]); + SORT_CSWAP(dst[10], dst[8]); + SORT_CSWAP(dst[2], dst[1]); + SORT_CSWAP(dst[6], dst[5]); + SORT_CSWAP(dst[10], dst[9]); + SORT_CSWAP(dst[4], dst[0]); + SORT_CSWAP(dst[7], dst[3]); + SORT_CSWAP(dst[5], dst[1]); + SORT_CSWAP(dst[10], dst[6]); + SORT_CSWAP(dst[8], dst[4]); + SORT_CSWAP(dst[9], dst[5]); + SORT_CSWAP(dst[6], dst[2]); + SORT_CSWAP(dst[4], dst[0]); + SORT_CSWAP(dst[8], dst[3]); + SORT_CSWAP(dst[5], dst[1]); + SORT_CSWAP(dst[10], dst[6]); + SORT_CSWAP(dst[3], dst[2]); + SORT_CSWAP(dst[9], dst[8]); + SORT_CSWAP(dst[4], dst[1]); + SORT_CSWAP(dst[10], dst[7]); + SORT_CSWAP(dst[5], dst[3]); + SORT_CSWAP(dst[8], dst[6]); + SORT_CSWAP(dst[4], dst[2]); + SORT_CSWAP(dst[9], dst[7]); + SORT_CSWAP(dst[6], dst[5]); + SORT_CSWAP(dst[4], dst[3]); + SORT_CSWAP(dst[8], dst[7]); +} + + +#define BITONIC_SORT_REVERSE_12 SORT_MAKE_STR(bitonic_sort_reverse_12) +static __inline void BITONIC_SORT_REVERSE_12(SORT_TYPE *dst) { + SORT_CSWAP(dst[1], dst[0]); + SORT_CSWAP(dst[3], dst[2]); + SORT_CSWAP(dst[5], dst[4]); + SORT_CSWAP(dst[7], dst[6]); + SORT_CSWAP(dst[9], dst[8]); + SORT_CSWAP(dst[11], dst[10]); + SORT_CSWAP(dst[3], dst[1]); + SORT_CSWAP(dst[7], dst[5]); + SORT_CSWAP(dst[11], dst[9]); + SORT_CSWAP(dst[2], dst[0]); + SORT_CSWAP(dst[6], dst[4]); + SORT_CSWAP(dst[10], dst[8]); + SORT_CSWAP(dst[2], dst[1]); + SORT_CSWAP(dst[6], dst[5]); + SORT_CSWAP(dst[10], dst[9]); + SORT_CSWAP(dst[4], dst[0]); + SORT_CSWAP(dst[11], dst[7]); + SORT_CSWAP(dst[5], dst[1]); + SORT_CSWAP(dst[10], dst[6]); + SORT_CSWAP(dst[7], dst[3]); + SORT_CSWAP(dst[8], dst[4]); + SORT_CSWAP(dst[9], dst[5]); + SORT_CSWAP(dst[6], dst[2]); + SORT_CSWAP(dst[4], dst[0]); + SORT_CSWAP(dst[11], dst[7]); + SORT_CSWAP(dst[8], dst[3]); + SORT_CSWAP(dst[5], dst[1]); + SORT_CSWAP(dst[10], dst[6]); + SORT_CSWAP(dst[3], dst[2]); + SORT_CSWAP(dst[9], dst[8]); + SORT_CSWAP(dst[4], dst[1]); + SORT_CSWAP(dst[10], dst[7]); + SORT_CSWAP(dst[5], dst[3]); + SORT_CSWAP(dst[8], dst[6]); + SORT_CSWAP(dst[4], dst[2]); + SORT_CSWAP(dst[9], dst[7]); + SORT_CSWAP(dst[6], dst[5]); + SORT_CSWAP(dst[4], dst[3]); + SORT_CSWAP(dst[8], dst[7]); +} + + +#define BITONIC_SORT_REVERSE_13 SORT_MAKE_STR(bitonic_sort_reverse_13) +static __inline void BITONIC_SORT_REVERSE_13(SORT_TYPE *dst) { + SORT_CSWAP(dst[7], dst[1]); + SORT_CSWAP(dst[11], dst[9]); + SORT_CSWAP(dst[4], dst[3]); + SORT_CSWAP(dst[8], dst[5]); + SORT_CSWAP(dst[12], dst[0]); + SORT_CSWAP(dst[6], dst[2]); + SORT_CSWAP(dst[1], dst[0]); + SORT_CSWAP(dst[3], dst[2]); + SORT_CSWAP(dst[6], dst[4]); + SORT_CSWAP(dst[11], dst[8]); + SORT_CSWAP(dst[12], dst[7]); + SORT_CSWAP(dst[9], dst[5]); + SORT_CSWAP(dst[2], dst[0]); + SORT_CSWAP(dst[7], dst[3]); + SORT_CSWAP(dst[11], dst[10]); + SORT_CSWAP(dst[4], dst[1]); + SORT_CSWAP(dst[12], dst[6]); + SORT_CSWAP(dst[8], dst[7]); + SORT_CSWAP(dst[12], dst[11]); + SORT_CSWAP(dst[9], dst[4]); + SORT_CSWAP(dst[10], dst[6]); + SORT_CSWAP(dst[4], dst[3]); + SORT_CSWAP(dst[6], dst[5]); + SORT_CSWAP(dst[9], dst[8]); + SORT_CSWAP(dst[11], dst[10]); + SORT_CSWAP(dst[7], dst[1]); + SORT_CSWAP(dst[6], dst[2]); + SORT_CSWAP(dst[11], dst[9]); + SORT_CSWAP(dst[3], dst[1]); + SORT_CSWAP(dst[7], dst[4]); + SORT_CSWAP(dst[10], dst[8]); + SORT_CSWAP(dst[5], dst[0]); + SORT_CSWAP(dst[5], dst[2]); + SORT_CSWAP(dst[8], dst[6]); + SORT_CSWAP(dst[10], dst[9]); + SORT_CSWAP(dst[2], dst[1]); + SORT_CSWAP(dst[5], dst[3]); + SORT_CSWAP(dst[8], dst[7]); + SORT_CSWAP(dst[6], dst[4]); + SORT_CSWAP(dst[3], dst[2]); + SORT_CSWAP(dst[5], dst[4]); + SORT_CSWAP(dst[7], dst[6]); + SORT_CSWAP(dst[9], dst[8]); + SORT_CSWAP(dst[4], dst[3]); + SORT_CSWAP(dst[6], dst[5]); +} + + +#define BITONIC_SORT_REVERSE_14 SORT_MAKE_STR(bitonic_sort_reverse_14) +static __inline void BITONIC_SORT_REVERSE_14(SORT_TYPE *dst) { + SORT_CSWAP(dst[1], dst[0]); + SORT_CSWAP(dst[3], dst[2]); + SORT_CSWAP(dst[5], dst[4]); + SORT_CSWAP(dst[7], dst[6]); + SORT_CSWAP(dst[9], dst[8]); + SORT_CSWAP(dst[11], dst[10]); + SORT_CSWAP(dst[13], dst[12]); + SORT_CSWAP(dst[2], dst[0]); + SORT_CSWAP(dst[6], dst[4]); + SORT_CSWAP(dst[10], dst[8]); + SORT_CSWAP(dst[3], dst[1]); + SORT_CSWAP(dst[7], dst[5]); + SORT_CSWAP(dst[11], dst[9]); + SORT_CSWAP(dst[4], dst[0]); + SORT_CSWAP(dst[12], dst[8]); + SORT_CSWAP(dst[5], dst[1]); + SORT_CSWAP(dst[13], dst[9]); + SORT_CSWAP(dst[6], dst[2]); + SORT_CSWAP(dst[7], dst[3]); + SORT_CSWAP(dst[8], dst[0]); + SORT_CSWAP(dst[9], dst[1]); + SORT_CSWAP(dst[10], dst[2]); + SORT_CSWAP(dst[11], dst[3]); + SORT_CSWAP(dst[12], dst[4]); + SORT_CSWAP(dst[13], dst[5]); + SORT_CSWAP(dst[10], dst[5]); + SORT_CSWAP(dst[9], dst[6]); + SORT_CSWAP(dst[12], dst[3]); + SORT_CSWAP(dst[11], dst[7]); + SORT_CSWAP(dst[2], dst[1]); + SORT_CSWAP(dst[8], dst[4]); + SORT_CSWAP(dst[4], dst[1]); + SORT_CSWAP(dst[13], dst[7]); + SORT_CSWAP(dst[8], dst[2]); + SORT_CSWAP(dst[6], dst[5]); + SORT_CSWAP(dst[10], dst[9]); + SORT_CSWAP(dst[4], dst[2]); + SORT_CSWAP(dst[13], dst[11]); + SORT_CSWAP(dst[8], dst[3]); + SORT_CSWAP(dst[12], dst[7]); + SORT_CSWAP(dst[8], dst[6]); + SORT_CSWAP(dst[12], dst[10]); + SORT_CSWAP(dst[5], dst[3]); + SORT_CSWAP(dst[9], dst[7]); + SORT_CSWAP(dst[4], dst[3]); + SORT_CSWAP(dst[6], dst[5]); + SORT_CSWAP(dst[8], dst[7]); + SORT_CSWAP(dst[10], dst[9]); + SORT_CSWAP(dst[12], dst[11]); + SORT_CSWAP(dst[7], dst[6]); + SORT_CSWAP(dst[9], dst[8]); +} + + +#define BITONIC_SORT_REVERSE_15 SORT_MAKE_STR(bitonic_sort_reverse_15) +static __inline void BITONIC_SORT_REVERSE_15(SORT_TYPE *dst) { + SORT_CSWAP(dst[1], dst[0]); + SORT_CSWAP(dst[3], dst[2]); + SORT_CSWAP(dst[5], dst[4]); + SORT_CSWAP(dst[7], dst[6]); + SORT_CSWAP(dst[9], dst[8]); + SORT_CSWAP(dst[11], dst[10]); + SORT_CSWAP(dst[13], dst[12]); + SORT_CSWAP(dst[2], dst[0]); + SORT_CSWAP(dst[6], dst[4]); + SORT_CSWAP(dst[10], dst[8]); + SORT_CSWAP(dst[14], dst[12]); + SORT_CSWAP(dst[3], dst[1]); + SORT_CSWAP(dst[7], dst[5]); + SORT_CSWAP(dst[11], dst[9]); + SORT_CSWAP(dst[4], dst[0]); + SORT_CSWAP(dst[12], dst[8]); + SORT_CSWAP(dst[5], dst[1]); + SORT_CSWAP(dst[13], dst[9]); + SORT_CSWAP(dst[6], dst[2]); + SORT_CSWAP(dst[14], dst[10]); + SORT_CSWAP(dst[7], dst[3]); + SORT_CSWAP(dst[8], dst[0]); + SORT_CSWAP(dst[9], dst[1]); + SORT_CSWAP(dst[10], dst[2]); + SORT_CSWAP(dst[11], dst[3]); + SORT_CSWAP(dst[12], dst[4]); + SORT_CSWAP(dst[13], dst[5]); + SORT_CSWAP(dst[14], dst[6]); + SORT_CSWAP(dst[10], dst[5]); + SORT_CSWAP(dst[9], dst[6]); + SORT_CSWAP(dst[12], dst[3]); + SORT_CSWAP(dst[14], dst[13]); + SORT_CSWAP(dst[11], dst[7]); + SORT_CSWAP(dst[2], dst[1]); + SORT_CSWAP(dst[8], dst[4]); + SORT_CSWAP(dst[4], dst[1]); + SORT_CSWAP(dst[13], dst[7]); + SORT_CSWAP(dst[8], dst[2]); + SORT_CSWAP(dst[14], dst[11]); + SORT_CSWAP(dst[6], dst[5]); + SORT_CSWAP(dst[10], dst[9]); + SORT_CSWAP(dst[4], dst[2]); + SORT_CSWAP(dst[13], dst[11]); + SORT_CSWAP(dst[8], dst[3]); + SORT_CSWAP(dst[12], dst[7]); + SORT_CSWAP(dst[8], dst[6]); + SORT_CSWAP(dst[12], dst[10]); + SORT_CSWAP(dst[5], dst[3]); + SORT_CSWAP(dst[9], dst[7]); + SORT_CSWAP(dst[4], dst[3]); + SORT_CSWAP(dst[6], dst[5]); + SORT_CSWAP(dst[8], dst[7]); + SORT_CSWAP(dst[10], dst[9]); + SORT_CSWAP(dst[12], dst[11]); + SORT_CSWAP(dst[7], dst[6]); + SORT_CSWAP(dst[9], dst[8]); +} + + +#define BITONIC_SORT_REVERSE_16 SORT_MAKE_STR(bitonic_sort_reverse_16) +static __inline void BITONIC_SORT_REVERSE_16(SORT_TYPE *dst) { + SORT_CSWAP(dst[1], dst[0]); + SORT_CSWAP(dst[3], dst[2]); + SORT_CSWAP(dst[5], dst[4]); + SORT_CSWAP(dst[7], dst[6]); + SORT_CSWAP(dst[9], dst[8]); + SORT_CSWAP(dst[11], dst[10]); + SORT_CSWAP(dst[13], dst[12]); + SORT_CSWAP(dst[15], dst[14]); + SORT_CSWAP(dst[2], dst[0]); + SORT_CSWAP(dst[6], dst[4]); + SORT_CSWAP(dst[10], dst[8]); + SORT_CSWAP(dst[14], dst[12]); + SORT_CSWAP(dst[3], dst[1]); + SORT_CSWAP(dst[7], dst[5]); + SORT_CSWAP(dst[11], dst[9]); + SORT_CSWAP(dst[15], dst[13]); + SORT_CSWAP(dst[4], dst[0]); + SORT_CSWAP(dst[12], dst[8]); + SORT_CSWAP(dst[5], dst[1]); + SORT_CSWAP(dst[13], dst[9]); + SORT_CSWAP(dst[6], dst[2]); + SORT_CSWAP(dst[14], dst[10]); + SORT_CSWAP(dst[7], dst[3]); + SORT_CSWAP(dst[15], dst[11]); + SORT_CSWAP(dst[8], dst[0]); + SORT_CSWAP(dst[9], dst[1]); + SORT_CSWAP(dst[10], dst[2]); + SORT_CSWAP(dst[11], dst[3]); + SORT_CSWAP(dst[12], dst[4]); + SORT_CSWAP(dst[13], dst[5]); + SORT_CSWAP(dst[14], dst[6]); + SORT_CSWAP(dst[15], dst[7]); + SORT_CSWAP(dst[10], dst[5]); + SORT_CSWAP(dst[9], dst[6]); + SORT_CSWAP(dst[12], dst[3]); + SORT_CSWAP(dst[14], dst[13]); + SORT_CSWAP(dst[11], dst[7]); + SORT_CSWAP(dst[2], dst[1]); + SORT_CSWAP(dst[8], dst[4]); + SORT_CSWAP(dst[4], dst[1]); + SORT_CSWAP(dst[13], dst[7]); + SORT_CSWAP(dst[8], dst[2]); + SORT_CSWAP(dst[14], dst[11]); + SORT_CSWAP(dst[6], dst[5]); + SORT_CSWAP(dst[10], dst[9]); + SORT_CSWAP(dst[4], dst[2]); + SORT_CSWAP(dst[13], dst[11]); + SORT_CSWAP(dst[8], dst[3]); + SORT_CSWAP(dst[12], dst[7]); + SORT_CSWAP(dst[8], dst[6]); + SORT_CSWAP(dst[12], dst[10]); + SORT_CSWAP(dst[5], dst[3]); + SORT_CSWAP(dst[9], dst[7]); + SORT_CSWAP(dst[4], dst[3]); + SORT_CSWAP(dst[6], dst[5]); + SORT_CSWAP(dst[8], dst[7]); + SORT_CSWAP(dst[10], dst[9]); + SORT_CSWAP(dst[12], dst[11]); + SORT_CSWAP(dst[7], dst[6]); + SORT_CSWAP(dst[9], dst[8]); +} + + +#define BITONIC_SORT_REVERSE_17 SORT_MAKE_STR(bitonic_sort_reverse_17) +static __inline void BITONIC_SORT_REVERSE_17(SORT_TYPE *dst) { + SORT_CSWAP(dst[1], dst[0]); + SORT_CSWAP(dst[3], dst[2]); + SORT_CSWAP(dst[5], dst[4]); + SORT_CSWAP(dst[7], dst[6]); + SORT_CSWAP(dst[9], dst[8]); + SORT_CSWAP(dst[11], dst[10]); + SORT_CSWAP(dst[13], dst[12]); + SORT_CSWAP(dst[16], dst[15]); + SORT_CSWAP(dst[2], dst[0]); + SORT_CSWAP(dst[3], dst[1]); + SORT_CSWAP(dst[6], dst[4]); + SORT_CSWAP(dst[7], dst[5]); + SORT_CSWAP(dst[10], dst[8]); + SORT_CSWAP(dst[11], dst[9]); + SORT_CSWAP(dst[16], dst[14]); + SORT_CSWAP(dst[2], dst[1]); + SORT_CSWAP(dst[6], dst[5]); + SORT_CSWAP(dst[4], dst[0]); + SORT_CSWAP(dst[7], dst[3]); + SORT_CSWAP(dst[10], dst[9]); + SORT_CSWAP(dst[15], dst[14]); + SORT_CSWAP(dst[16], dst[13]); + SORT_CSWAP(dst[5], dst[1]); + SORT_CSWAP(dst[6], dst[2]); + SORT_CSWAP(dst[15], dst[12]); + SORT_CSWAP(dst[16], dst[11]); + SORT_CSWAP(dst[4], dst[1]); + SORT_CSWAP(dst[6], dst[3]); + SORT_CSWAP(dst[14], dst[12]); + SORT_CSWAP(dst[15], dst[13]); + SORT_CSWAP(dst[16], dst[7]); + SORT_CSWAP(dst[4], dst[2]); + SORT_CSWAP(dst[5], dst[3]); + SORT_CSWAP(dst[14], dst[13]); + SORT_CSWAP(dst[15], dst[10]); + SORT_CSWAP(dst[4], dst[3]); + SORT_CSWAP(dst[13], dst[8]); + SORT_CSWAP(dst[14], dst[9]); + SORT_CSWAP(dst[15], dst[11]); + SORT_CSWAP(dst[12], dst[8]); + SORT_CSWAP(dst[13], dst[9]); + SORT_CSWAP(dst[14], dst[11]); + SORT_CSWAP(dst[15], dst[6]); + SORT_CSWAP(dst[12], dst[9]); + SORT_CSWAP(dst[13], dst[10]); + SORT_CSWAP(dst[14], dst[5]); + SORT_CSWAP(dst[15], dst[7]); + SORT_CSWAP(dst[12], dst[10]); + SORT_CSWAP(dst[13], dst[11]); + SORT_CSWAP(dst[9], dst[0]); + SORT_CSWAP(dst[14], dst[7]); + SORT_CSWAP(dst[12], dst[11]); + SORT_CSWAP(dst[8], dst[0]); + SORT_CSWAP(dst[10], dst[1]); + SORT_CSWAP(dst[13], dst[4]); + SORT_CSWAP(dst[9], dst[1]); + SORT_CSWAP(dst[11], dst[2]); + SORT_CSWAP(dst[12], dst[3]); + SORT_CSWAP(dst[13], dst[5]); + SORT_CSWAP(dst[8], dst[1]); + SORT_CSWAP(dst[11], dst[3]); + SORT_CSWAP(dst[9], dst[2]); + SORT_CSWAP(dst[13], dst[6]); + SORT_CSWAP(dst[8], dst[2]); + SORT_CSWAP(dst[10], dst[3]); + SORT_CSWAP(dst[13], dst[7]); + SORT_CSWAP(dst[11], dst[6]); + SORT_CSWAP(dst[9], dst[3]); + SORT_CSWAP(dst[10], dst[5]); + SORT_CSWAP(dst[12], dst[7]); + SORT_CSWAP(dst[8], dst[3]); + SORT_CSWAP(dst[9], dst[4]); + SORT_CSWAP(dst[11], dst[7]); + SORT_CSWAP(dst[8], dst[4]); + SORT_CSWAP(dst[9], dst[5]); + SORT_CSWAP(dst[10], dst[7]); + SORT_CSWAP(dst[8], dst[5]); + SORT_CSWAP(dst[9], dst[6]); + SORT_CSWAP(dst[8], dst[6]); + SORT_CSWAP(dst[9], dst[7]); + SORT_CSWAP(dst[8], dst[7]); +} + + +#define BITONIC_SORT_REVERSE_18 SORT_MAKE_STR(bitonic_sort_reverse_18) +static __inline void BITONIC_SORT_REVERSE_18(SORT_TYPE *dst) { + SORT_CSWAP(dst[1], dst[0]); + SORT_CSWAP(dst[3], dst[2]); + SORT_CSWAP(dst[5], dst[4]); + SORT_CSWAP(dst[8], dst[7]); + SORT_CSWAP(dst[10], dst[9]); + SORT_CSWAP(dst[12], dst[11]); + SORT_CSWAP(dst[14], dst[13]); + SORT_CSWAP(dst[17], dst[16]); + SORT_CSWAP(dst[2], dst[0]); + SORT_CSWAP(dst[3], dst[1]); + SORT_CSWAP(dst[8], dst[6]); + SORT_CSWAP(dst[11], dst[9]); + SORT_CSWAP(dst[12], dst[10]); + SORT_CSWAP(dst[17], dst[15]); + SORT_CSWAP(dst[2], dst[1]); + SORT_CSWAP(dst[7], dst[6]); + SORT_CSWAP(dst[8], dst[5]); + SORT_CSWAP(dst[11], dst[10]); + SORT_CSWAP(dst[16], dst[15]); + SORT_CSWAP(dst[17], dst[14]); + SORT_CSWAP(dst[7], dst[4]); + SORT_CSWAP(dst[8], dst[3]); + SORT_CSWAP(dst[16], dst[13]); + SORT_CSWAP(dst[17], dst[12]); + SORT_CSWAP(dst[6], dst[4]); + SORT_CSWAP(dst[7], dst[5]); + SORT_CSWAP(dst[15], dst[13]); + SORT_CSWAP(dst[16], dst[14]); + SORT_CSWAP(dst[17], dst[8]); + SORT_CSWAP(dst[6], dst[5]); + SORT_CSWAP(dst[7], dst[2]); + SORT_CSWAP(dst[15], dst[14]); + SORT_CSWAP(dst[16], dst[11]); + SORT_CSWAP(dst[5], dst[0]); + SORT_CSWAP(dst[6], dst[1]); + SORT_CSWAP(dst[7], dst[3]); + SORT_CSWAP(dst[14], dst[9]); + SORT_CSWAP(dst[15], dst[10]); + SORT_CSWAP(dst[16], dst[12]); + SORT_CSWAP(dst[4], dst[0]); + SORT_CSWAP(dst[5], dst[1]); + SORT_CSWAP(dst[6], dst[3]); + SORT_CSWAP(dst[13], dst[9]); + SORT_CSWAP(dst[14], dst[10]); + SORT_CSWAP(dst[15], dst[12]); + SORT_CSWAP(dst[16], dst[7]); + SORT_CSWAP(dst[4], dst[1]); + SORT_CSWAP(dst[5], dst[2]); + SORT_CSWAP(dst[13], dst[10]); + SORT_CSWAP(dst[14], dst[11]); + SORT_CSWAP(dst[9], dst[0]); + SORT_CSWAP(dst[15], dst[6]); + SORT_CSWAP(dst[16], dst[8]); + SORT_CSWAP(dst[4], dst[2]); + SORT_CSWAP(dst[5], dst[3]); + SORT_CSWAP(dst[13], dst[11]); + SORT_CSWAP(dst[14], dst[12]); + SORT_CSWAP(dst[10], dst[1]); + SORT_CSWAP(dst[15], dst[7]); + SORT_CSWAP(dst[4], dst[3]); + SORT_CSWAP(dst[13], dst[12]); + SORT_CSWAP(dst[9], dst[1]); + SORT_CSWAP(dst[11], dst[2]); + SORT_CSWAP(dst[14], dst[5]); + SORT_CSWAP(dst[15], dst[8]); + SORT_CSWAP(dst[12], dst[3]); + SORT_CSWAP(dst[9], dst[2]); + SORT_CSWAP(dst[13], dst[4]); + SORT_CSWAP(dst[14], dst[7]); + SORT_CSWAP(dst[11], dst[3]); + SORT_CSWAP(dst[13], dst[5]); + SORT_CSWAP(dst[14], dst[8]); + SORT_CSWAP(dst[10], dst[3]); + SORT_CSWAP(dst[13], dst[6]); + SORT_CSWAP(dst[9], dst[3]); + SORT_CSWAP(dst[13], dst[7]); + SORT_CSWAP(dst[10], dst[5]); + SORT_CSWAP(dst[11], dst[6]); + SORT_CSWAP(dst[13], dst[8]); + SORT_CSWAP(dst[9], dst[4]); + SORT_CSWAP(dst[12], dst[7]); + SORT_CSWAP(dst[9], dst[5]); + SORT_CSWAP(dst[12], dst[8]); + SORT_CSWAP(dst[11], dst[7]); + SORT_CSWAP(dst[11], dst[8]); + SORT_CSWAP(dst[9], dst[6]); + SORT_CSWAP(dst[10], dst[7]); + SORT_CSWAP(dst[10], dst[8]); + SORT_CSWAP(dst[9], dst[7]); + SORT_CSWAP(dst[9], dst[8]); +} + + +#define BITONIC_SORT_REVERSE_19 SORT_MAKE_STR(bitonic_sort_reverse_19) +static __inline void BITONIC_SORT_REVERSE_19(SORT_TYPE *dst) { + SORT_CSWAP(dst[1], dst[0]); + SORT_CSWAP(dst[3], dst[2]); + SORT_CSWAP(dst[5], dst[4]); + SORT_CSWAP(dst[8], dst[7]); + SORT_CSWAP(dst[10], dst[9]); + SORT_CSWAP(dst[13], dst[12]); + SORT_CSWAP(dst[15], dst[14]); + SORT_CSWAP(dst[18], dst[17]); + SORT_CSWAP(dst[2], dst[0]); + SORT_CSWAP(dst[3], dst[1]); + SORT_CSWAP(dst[8], dst[6]); + SORT_CSWAP(dst[13], dst[11]); + SORT_CSWAP(dst[18], dst[16]); + SORT_CSWAP(dst[2], dst[1]); + SORT_CSWAP(dst[7], dst[6]); + SORT_CSWAP(dst[8], dst[5]); + SORT_CSWAP(dst[12], dst[11]); + SORT_CSWAP(dst[13], dst[10]); + SORT_CSWAP(dst[17], dst[16]); + SORT_CSWAP(dst[18], dst[15]); + SORT_CSWAP(dst[7], dst[4]); + SORT_CSWAP(dst[8], dst[3]); + SORT_CSWAP(dst[12], dst[9]); + SORT_CSWAP(dst[17], dst[14]); + SORT_CSWAP(dst[18], dst[13]); + SORT_CSWAP(dst[6], dst[4]); + SORT_CSWAP(dst[7], dst[5]); + SORT_CSWAP(dst[11], dst[9]); + SORT_CSWAP(dst[12], dst[10]); + SORT_CSWAP(dst[16], dst[14]); + SORT_CSWAP(dst[17], dst[15]); + SORT_CSWAP(dst[18], dst[8]); + SORT_CSWAP(dst[6], dst[5]); + SORT_CSWAP(dst[7], dst[2]); + SORT_CSWAP(dst[11], dst[10]); + SORT_CSWAP(dst[16], dst[15]); + SORT_CSWAP(dst[14], dst[9]); + SORT_CSWAP(dst[17], dst[12]); + SORT_CSWAP(dst[5], dst[0]); + SORT_CSWAP(dst[6], dst[1]); + SORT_CSWAP(dst[7], dst[3]); + SORT_CSWAP(dst[15], dst[10]); + SORT_CSWAP(dst[16], dst[11]); + SORT_CSWAP(dst[17], dst[13]); + SORT_CSWAP(dst[4], dst[0]); + SORT_CSWAP(dst[5], dst[1]); + SORT_CSWAP(dst[6], dst[3]); + SORT_CSWAP(dst[14], dst[10]); + SORT_CSWAP(dst[16], dst[12]); + SORT_CSWAP(dst[17], dst[7]); + SORT_CSWAP(dst[4], dst[1]); + SORT_CSWAP(dst[5], dst[2]); + SORT_CSWAP(dst[16], dst[13]); + SORT_CSWAP(dst[14], dst[11]); + SORT_CSWAP(dst[15], dst[12]); + SORT_CSWAP(dst[10], dst[0]); + SORT_CSWAP(dst[17], dst[8]); + SORT_CSWAP(dst[4], dst[2]); + SORT_CSWAP(dst[5], dst[3]); + SORT_CSWAP(dst[15], dst[13]); + SORT_CSWAP(dst[14], dst[12]); + SORT_CSWAP(dst[9], dst[0]); + SORT_CSWAP(dst[11], dst[1]); + SORT_CSWAP(dst[16], dst[6]); + SORT_CSWAP(dst[4], dst[3]); + SORT_CSWAP(dst[14], dst[13]); + SORT_CSWAP(dst[10], dst[1]); + SORT_CSWAP(dst[12], dst[2]); + SORT_CSWAP(dst[15], dst[5]); + SORT_CSWAP(dst[16], dst[7]); + SORT_CSWAP(dst[9], dst[1]); + SORT_CSWAP(dst[13], dst[3]); + SORT_CSWAP(dst[10], dst[2]); + SORT_CSWAP(dst[14], dst[4]); + SORT_CSWAP(dst[16], dst[8]); + SORT_CSWAP(dst[15], dst[7]); + SORT_CSWAP(dst[12], dst[3]); + SORT_CSWAP(dst[9], dst[2]); + SORT_CSWAP(dst[14], dst[5]); + SORT_CSWAP(dst[15], dst[8]); + SORT_CSWAP(dst[11], dst[3]); + SORT_CSWAP(dst[14], dst[6]); + SORT_CSWAP(dst[10], dst[3]); + SORT_CSWAP(dst[14], dst[7]); + SORT_CSWAP(dst[11], dst[6]); + SORT_CSWAP(dst[9], dst[3]); + SORT_CSWAP(dst[14], dst[8]); + SORT_CSWAP(dst[10], dst[5]); + SORT_CSWAP(dst[12], dst[7]); + SORT_CSWAP(dst[9], dst[4]); + SORT_CSWAP(dst[13], dst[8]); + SORT_CSWAP(dst[11], dst[7]); + SORT_CSWAP(dst[9], dst[5]); + SORT_CSWAP(dst[12], dst[8]); + SORT_CSWAP(dst[10], dst[7]); + SORT_CSWAP(dst[11], dst[8]); + SORT_CSWAP(dst[9], dst[6]); + SORT_CSWAP(dst[10], dst[8]); + SORT_CSWAP(dst[9], dst[7]); + SORT_CSWAP(dst[9], dst[8]); +} + + +#define BITONIC_SORT_REVERSE_20 SORT_MAKE_STR(bitonic_sort_reverse_20) +static __inline void BITONIC_SORT_REVERSE_20(SORT_TYPE *dst) { + SORT_CSWAP(dst[1], dst[0]); + SORT_CSWAP(dst[4], dst[3]); + SORT_CSWAP(dst[6], dst[5]); + SORT_CSWAP(dst[9], dst[8]); + SORT_CSWAP(dst[11], dst[10]); + SORT_CSWAP(dst[14], dst[13]); + SORT_CSWAP(dst[16], dst[15]); + SORT_CSWAP(dst[19], dst[18]); + SORT_CSWAP(dst[4], dst[2]); + SORT_CSWAP(dst[9], dst[7]); + SORT_CSWAP(dst[14], dst[12]); + SORT_CSWAP(dst[19], dst[17]); + SORT_CSWAP(dst[3], dst[2]); + SORT_CSWAP(dst[4], dst[1]); + SORT_CSWAP(dst[8], dst[7]); + SORT_CSWAP(dst[9], dst[6]); + SORT_CSWAP(dst[13], dst[12]); + SORT_CSWAP(dst[14], dst[11]); + SORT_CSWAP(dst[18], dst[17]); + SORT_CSWAP(dst[19], dst[16]); + SORT_CSWAP(dst[3], dst[0]); + SORT_CSWAP(dst[8], dst[5]); + SORT_CSWAP(dst[9], dst[4]); + SORT_CSWAP(dst[13], dst[10]); + SORT_CSWAP(dst[18], dst[15]); + SORT_CSWAP(dst[19], dst[14]); + SORT_CSWAP(dst[2], dst[0]); + SORT_CSWAP(dst[3], dst[1]); + SORT_CSWAP(dst[7], dst[5]); + SORT_CSWAP(dst[8], dst[6]); + SORT_CSWAP(dst[12], dst[10]); + SORT_CSWAP(dst[13], dst[11]); + SORT_CSWAP(dst[17], dst[15]); + SORT_CSWAP(dst[18], dst[16]); + SORT_CSWAP(dst[19], dst[9]); + SORT_CSWAP(dst[2], dst[1]); + SORT_CSWAP(dst[7], dst[6]); + SORT_CSWAP(dst[5], dst[0]); + SORT_CSWAP(dst[8], dst[3]); + SORT_CSWAP(dst[12], dst[11]); + SORT_CSWAP(dst[17], dst[16]); + SORT_CSWAP(dst[15], dst[10]); + SORT_CSWAP(dst[18], dst[13]); + SORT_CSWAP(dst[6], dst[1]); + SORT_CSWAP(dst[7], dst[2]); + SORT_CSWAP(dst[8], dst[4]); + SORT_CSWAP(dst[16], dst[11]); + SORT_CSWAP(dst[17], dst[12]); + SORT_CSWAP(dst[18], dst[14]); + SORT_CSWAP(dst[10], dst[0]); + SORT_CSWAP(dst[5], dst[1]); + SORT_CSWAP(dst[7], dst[3]); + SORT_CSWAP(dst[15], dst[11]); + SORT_CSWAP(dst[17], dst[13]); + SORT_CSWAP(dst[18], dst[8]); + SORT_CSWAP(dst[7], dst[4]); + SORT_CSWAP(dst[5], dst[2]); + SORT_CSWAP(dst[6], dst[3]); + SORT_CSWAP(dst[17], dst[14]); + SORT_CSWAP(dst[15], dst[12]); + SORT_CSWAP(dst[16], dst[13]); + SORT_CSWAP(dst[11], dst[1]); + SORT_CSWAP(dst[18], dst[9]); + SORT_CSWAP(dst[6], dst[4]); + SORT_CSWAP(dst[5], dst[3]); + SORT_CSWAP(dst[16], dst[14]); + SORT_CSWAP(dst[15], dst[13]); + SORT_CSWAP(dst[10], dst[1]); + SORT_CSWAP(dst[12], dst[2]); + SORT_CSWAP(dst[17], dst[7]); + SORT_CSWAP(dst[5], dst[4]); + SORT_CSWAP(dst[15], dst[14]); + SORT_CSWAP(dst[13], dst[3]); + SORT_CSWAP(dst[10], dst[2]); + SORT_CSWAP(dst[16], dst[6]); + SORT_CSWAP(dst[17], dst[8]); + SORT_CSWAP(dst[14], dst[4]); + SORT_CSWAP(dst[12], dst[3]); + SORT_CSWAP(dst[15], dst[5]); + SORT_CSWAP(dst[17], dst[9]); + SORT_CSWAP(dst[16], dst[8]); + SORT_CSWAP(dst[13], dst[4]); + SORT_CSWAP(dst[11], dst[3]); + SORT_CSWAP(dst[15], dst[6]); + SORT_CSWAP(dst[16], dst[9]); + SORT_CSWAP(dst[12], dst[4]); + SORT_CSWAP(dst[10], dst[3]); + SORT_CSWAP(dst[15], dst[7]); + SORT_CSWAP(dst[11], dst[4]); + SORT_CSWAP(dst[15], dst[8]); + SORT_CSWAP(dst[12], dst[7]); + SORT_CSWAP(dst[10], dst[4]); + SORT_CSWAP(dst[15], dst[9]); + SORT_CSWAP(dst[11], dst[6]); + SORT_CSWAP(dst[13], dst[8]); + SORT_CSWAP(dst[10], dst[5]); + SORT_CSWAP(dst[14], dst[9]); + SORT_CSWAP(dst[12], dst[8]); + SORT_CSWAP(dst[10], dst[6]); + SORT_CSWAP(dst[13], dst[9]); + SORT_CSWAP(dst[11], dst[8]); + SORT_CSWAP(dst[12], dst[9]); + SORT_CSWAP(dst[10], dst[7]); + SORT_CSWAP(dst[11], dst[9]); + SORT_CSWAP(dst[10], dst[8]); + SORT_CSWAP(dst[10], dst[9]); +} + + +#define BITONIC_SORT_REVERSE_21 SORT_MAKE_STR(bitonic_sort_reverse_21) +static __inline void BITONIC_SORT_REVERSE_21(SORT_TYPE *dst) { + SORT_CSWAP(dst[1], dst[0]); + SORT_CSWAP(dst[4], dst[3]); + SORT_CSWAP(dst[6], dst[5]); + SORT_CSWAP(dst[9], dst[8]); + SORT_CSWAP(dst[11], dst[10]); + SORT_CSWAP(dst[14], dst[13]); + SORT_CSWAP(dst[17], dst[16]); + SORT_CSWAP(dst[20], dst[19]); + SORT_CSWAP(dst[4], dst[2]); + SORT_CSWAP(dst[9], dst[7]); + SORT_CSWAP(dst[14], dst[12]); + SORT_CSWAP(dst[17], dst[15]); + SORT_CSWAP(dst[20], dst[18]); + SORT_CSWAP(dst[3], dst[2]); + SORT_CSWAP(dst[4], dst[1]); + SORT_CSWAP(dst[8], dst[7]); + SORT_CSWAP(dst[9], dst[6]); + SORT_CSWAP(dst[13], dst[12]); + SORT_CSWAP(dst[14], dst[11]); + SORT_CSWAP(dst[16], dst[15]); + SORT_CSWAP(dst[19], dst[18]); + SORT_CSWAP(dst[20], dst[17]); + SORT_CSWAP(dst[3], dst[0]); + SORT_CSWAP(dst[8], dst[5]); + SORT_CSWAP(dst[9], dst[4]); + SORT_CSWAP(dst[13], dst[10]); + SORT_CSWAP(dst[18], dst[15]); + SORT_CSWAP(dst[19], dst[16]); + SORT_CSWAP(dst[20], dst[14]); + SORT_CSWAP(dst[2], dst[0]); + SORT_CSWAP(dst[3], dst[1]); + SORT_CSWAP(dst[7], dst[5]); + SORT_CSWAP(dst[8], dst[6]); + SORT_CSWAP(dst[12], dst[10]); + SORT_CSWAP(dst[13], dst[11]); + SORT_CSWAP(dst[19], dst[17]); + SORT_CSWAP(dst[18], dst[16]); + SORT_CSWAP(dst[20], dst[9]); + SORT_CSWAP(dst[2], dst[1]); + SORT_CSWAP(dst[7], dst[6]); + SORT_CSWAP(dst[5], dst[0]); + SORT_CSWAP(dst[8], dst[3]); + SORT_CSWAP(dst[12], dst[11]); + SORT_CSWAP(dst[18], dst[17]); + SORT_CSWAP(dst[16], dst[10]); + SORT_CSWAP(dst[19], dst[13]); + SORT_CSWAP(dst[6], dst[1]); + SORT_CSWAP(dst[7], dst[2]); + SORT_CSWAP(dst[8], dst[4]); + SORT_CSWAP(dst[15], dst[10]); + SORT_CSWAP(dst[17], dst[11]); + SORT_CSWAP(dst[18], dst[12]); + SORT_CSWAP(dst[19], dst[14]); + SORT_CSWAP(dst[5], dst[1]); + SORT_CSWAP(dst[7], dst[3]); + SORT_CSWAP(dst[16], dst[11]); + SORT_CSWAP(dst[18], dst[13]); + SORT_CSWAP(dst[19], dst[8]); + SORT_CSWAP(dst[7], dst[4]); + SORT_CSWAP(dst[5], dst[2]); + SORT_CSWAP(dst[6], dst[3]); + SORT_CSWAP(dst[15], dst[11]); + SORT_CSWAP(dst[18], dst[14]); + SORT_CSWAP(dst[16], dst[13]); + SORT_CSWAP(dst[19], dst[9]); + SORT_CSWAP(dst[6], dst[4]); + SORT_CSWAP(dst[5], dst[3]); + SORT_CSWAP(dst[15], dst[12]); + SORT_CSWAP(dst[17], dst[14]); + SORT_CSWAP(dst[11], dst[0]); + SORT_CSWAP(dst[18], dst[7]); + SORT_CSWAP(dst[5], dst[4]); + SORT_CSWAP(dst[16], dst[14]); + SORT_CSWAP(dst[15], dst[13]); + SORT_CSWAP(dst[10], dst[0]); + SORT_CSWAP(dst[12], dst[1]); + SORT_CSWAP(dst[17], dst[6]); + SORT_CSWAP(dst[18], dst[8]); + SORT_CSWAP(dst[15], dst[14]); + SORT_CSWAP(dst[11], dst[1]); + SORT_CSWAP(dst[13], dst[2]); + SORT_CSWAP(dst[16], dst[5]); + SORT_CSWAP(dst[18], dst[9]); + SORT_CSWAP(dst[17], dst[8]); + SORT_CSWAP(dst[10], dst[1]); + SORT_CSWAP(dst[14], dst[3]); + SORT_CSWAP(dst[15], dst[4]); + SORT_CSWAP(dst[16], dst[6]); + SORT_CSWAP(dst[17], dst[9]); + SORT_CSWAP(dst[14], dst[4]); + SORT_CSWAP(dst[13], dst[3]); + SORT_CSWAP(dst[10], dst[2]); + SORT_CSWAP(dst[16], dst[7]); + SORT_CSWAP(dst[13], dst[4]); + SORT_CSWAP(dst[11], dst[3]); + SORT_CSWAP(dst[16], dst[8]); + SORT_CSWAP(dst[12], dst[4]); + SORT_CSWAP(dst[10], dst[3]); + SORT_CSWAP(dst[16], dst[9]); + SORT_CSWAP(dst[13], dst[7]); + SORT_CSWAP(dst[14], dst[8]); + SORT_CSWAP(dst[11], dst[4]); + SORT_CSWAP(dst[12], dst[6]); + SORT_CSWAP(dst[15], dst[9]); + SORT_CSWAP(dst[13], dst[8]); + SORT_CSWAP(dst[10], dst[4]); + SORT_CSWAP(dst[11], dst[5]); + SORT_CSWAP(dst[14], dst[9]); + SORT_CSWAP(dst[10], dst[5]); + SORT_CSWAP(dst[11], dst[6]); + SORT_CSWAP(dst[13], dst[9]); + SORT_CSWAP(dst[10], dst[6]); + SORT_CSWAP(dst[11], dst[8]); + SORT_CSWAP(dst[12], dst[9]); + SORT_CSWAP(dst[10], dst[7]); + SORT_CSWAP(dst[11], dst[9]); + SORT_CSWAP(dst[10], dst[8]); + SORT_CSWAP(dst[10], dst[9]); +} + + +#define BITONIC_SORT_REVERSE_22 SORT_MAKE_STR(bitonic_sort_reverse_22) +static __inline void BITONIC_SORT_REVERSE_22(SORT_TYPE *dst) { + SORT_CSWAP(dst[1], dst[0]); + SORT_CSWAP(dst[4], dst[3]); + SORT_CSWAP(dst[7], dst[6]); + SORT_CSWAP(dst[10], dst[9]); + SORT_CSWAP(dst[12], dst[11]); + SORT_CSWAP(dst[15], dst[14]); + SORT_CSWAP(dst[18], dst[17]); + SORT_CSWAP(dst[21], dst[20]); + SORT_CSWAP(dst[4], dst[2]); + SORT_CSWAP(dst[7], dst[5]); + SORT_CSWAP(dst[10], dst[8]); + SORT_CSWAP(dst[15], dst[13]); + SORT_CSWAP(dst[18], dst[16]); + SORT_CSWAP(dst[21], dst[19]); + SORT_CSWAP(dst[3], dst[2]); + SORT_CSWAP(dst[4], dst[1]); + SORT_CSWAP(dst[6], dst[5]); + SORT_CSWAP(dst[9], dst[8]); + SORT_CSWAP(dst[10], dst[7]); + SORT_CSWAP(dst[14], dst[13]); + SORT_CSWAP(dst[15], dst[12]); + SORT_CSWAP(dst[17], dst[16]); + SORT_CSWAP(dst[20], dst[19]); + SORT_CSWAP(dst[21], dst[18]); + SORT_CSWAP(dst[3], dst[0]); + SORT_CSWAP(dst[8], dst[5]); + SORT_CSWAP(dst[9], dst[6]); + SORT_CSWAP(dst[10], dst[4]); + SORT_CSWAP(dst[14], dst[11]); + SORT_CSWAP(dst[19], dst[16]); + SORT_CSWAP(dst[20], dst[17]); + SORT_CSWAP(dst[21], dst[15]); + SORT_CSWAP(dst[2], dst[0]); + SORT_CSWAP(dst[3], dst[1]); + SORT_CSWAP(dst[9], dst[7]); + SORT_CSWAP(dst[8], dst[6]); + SORT_CSWAP(dst[13], dst[11]); + SORT_CSWAP(dst[14], dst[12]); + SORT_CSWAP(dst[20], dst[18]); + SORT_CSWAP(dst[19], dst[17]); + SORT_CSWAP(dst[21], dst[10]); + SORT_CSWAP(dst[2], dst[1]); + SORT_CSWAP(dst[8], dst[7]); + SORT_CSWAP(dst[6], dst[0]); + SORT_CSWAP(dst[9], dst[3]); + SORT_CSWAP(dst[13], dst[12]); + SORT_CSWAP(dst[19], dst[18]); + SORT_CSWAP(dst[17], dst[11]); + SORT_CSWAP(dst[20], dst[14]); + SORT_CSWAP(dst[5], dst[0]); + SORT_CSWAP(dst[7], dst[1]); + SORT_CSWAP(dst[8], dst[2]); + SORT_CSWAP(dst[9], dst[4]); + SORT_CSWAP(dst[16], dst[11]); + SORT_CSWAP(dst[18], dst[12]); + SORT_CSWAP(dst[19], dst[13]); + SORT_CSWAP(dst[20], dst[15]); + SORT_CSWAP(dst[6], dst[1]); + SORT_CSWAP(dst[8], dst[3]); + SORT_CSWAP(dst[17], dst[12]); + SORT_CSWAP(dst[19], dst[14]); + SORT_CSWAP(dst[11], dst[0]); + SORT_CSWAP(dst[20], dst[9]); + SORT_CSWAP(dst[5], dst[1]); + SORT_CSWAP(dst[8], dst[4]); + SORT_CSWAP(dst[6], dst[3]); + SORT_CSWAP(dst[16], dst[12]); + SORT_CSWAP(dst[19], dst[15]); + SORT_CSWAP(dst[17], dst[14]); + SORT_CSWAP(dst[20], dst[10]); + SORT_CSWAP(dst[5], dst[2]); + SORT_CSWAP(dst[7], dst[4]); + SORT_CSWAP(dst[16], dst[13]); + SORT_CSWAP(dst[18], dst[15]); + SORT_CSWAP(dst[12], dst[1]); + SORT_CSWAP(dst[19], dst[8]); + SORT_CSWAP(dst[6], dst[4]); + SORT_CSWAP(dst[5], dst[3]); + SORT_CSWAP(dst[17], dst[15]); + SORT_CSWAP(dst[16], dst[14]); + SORT_CSWAP(dst[11], dst[1]); + SORT_CSWAP(dst[13], dst[2]); + SORT_CSWAP(dst[18], dst[7]); + SORT_CSWAP(dst[19], dst[9]); + SORT_CSWAP(dst[5], dst[4]); + SORT_CSWAP(dst[16], dst[15]); + SORT_CSWAP(dst[14], dst[3]); + SORT_CSWAP(dst[11], dst[2]); + SORT_CSWAP(dst[17], dst[6]); + SORT_CSWAP(dst[19], dst[10]); + SORT_CSWAP(dst[15], dst[4]); + SORT_CSWAP(dst[13], dst[3]); + SORT_CSWAP(dst[16], dst[5]); + SORT_CSWAP(dst[17], dst[7]); + SORT_CSWAP(dst[18], dst[10]); + SORT_CSWAP(dst[14], dst[4]); + SORT_CSWAP(dst[12], dst[3]); + SORT_CSWAP(dst[16], dst[6]); + SORT_CSWAP(dst[17], dst[9]); + SORT_CSWAP(dst[13], dst[4]); + SORT_CSWAP(dst[11], dst[3]); + SORT_CSWAP(dst[16], dst[7]); + SORT_CSWAP(dst[17], dst[10]); + SORT_CSWAP(dst[12], dst[4]); + SORT_CSWAP(dst[16], dst[8]); + SORT_CSWAP(dst[13], dst[7]); + SORT_CSWAP(dst[11], dst[4]); + SORT_CSWAP(dst[16], dst[9]); + SORT_CSWAP(dst[12], dst[6]); + SORT_CSWAP(dst[14], dst[8]); + SORT_CSWAP(dst[16], dst[10]); + SORT_CSWAP(dst[11], dst[5]); + SORT_CSWAP(dst[12], dst[7]); + SORT_CSWAP(dst[15], dst[9]); + SORT_CSWAP(dst[11], dst[6]); + SORT_CSWAP(dst[15], dst[10]); + SORT_CSWAP(dst[14], dst[9]); + SORT_CSWAP(dst[11], dst[7]); + SORT_CSWAP(dst[14], dst[10]); + SORT_CSWAP(dst[12], dst[9]); + SORT_CSWAP(dst[11], dst[8]); + SORT_CSWAP(dst[13], dst[10]); + SORT_CSWAP(dst[12], dst[10]); + SORT_CSWAP(dst[11], dst[9]); + SORT_CSWAP(dst[11], dst[10]); +} + + +#define BITONIC_SORT_REVERSE_23 SORT_MAKE_STR(bitonic_sort_reverse_23) +static __inline void BITONIC_SORT_REVERSE_23(SORT_TYPE *dst) { + SORT_CSWAP(dst[1], dst[0]); + SORT_CSWAP(dst[4], dst[3]); + SORT_CSWAP(dst[7], dst[6]); + SORT_CSWAP(dst[10], dst[9]); + SORT_CSWAP(dst[13], dst[12]); + SORT_CSWAP(dst[16], dst[15]); + SORT_CSWAP(dst[19], dst[18]); + SORT_CSWAP(dst[22], dst[21]); + SORT_CSWAP(dst[4], dst[2]); + SORT_CSWAP(dst[7], dst[5]); + SORT_CSWAP(dst[10], dst[8]); + SORT_CSWAP(dst[13], dst[11]); + SORT_CSWAP(dst[16], dst[14]); + SORT_CSWAP(dst[19], dst[17]); + SORT_CSWAP(dst[22], dst[20]); + SORT_CSWAP(dst[3], dst[2]); + SORT_CSWAP(dst[4], dst[1]); + SORT_CSWAP(dst[6], dst[5]); + SORT_CSWAP(dst[9], dst[8]); + SORT_CSWAP(dst[10], dst[7]); + SORT_CSWAP(dst[12], dst[11]); + SORT_CSWAP(dst[15], dst[14]); + SORT_CSWAP(dst[16], dst[13]); + SORT_CSWAP(dst[18], dst[17]); + SORT_CSWAP(dst[21], dst[20]); + SORT_CSWAP(dst[22], dst[19]); + SORT_CSWAP(dst[3], dst[0]); + SORT_CSWAP(dst[8], dst[5]); + SORT_CSWAP(dst[9], dst[6]); + SORT_CSWAP(dst[10], dst[4]); + SORT_CSWAP(dst[14], dst[11]); + SORT_CSWAP(dst[15], dst[12]); + SORT_CSWAP(dst[20], dst[17]); + SORT_CSWAP(dst[21], dst[18]); + SORT_CSWAP(dst[22], dst[16]); + SORT_CSWAP(dst[2], dst[0]); + SORT_CSWAP(dst[3], dst[1]); + SORT_CSWAP(dst[9], dst[7]); + SORT_CSWAP(dst[8], dst[6]); + SORT_CSWAP(dst[15], dst[13]); + SORT_CSWAP(dst[14], dst[12]); + SORT_CSWAP(dst[21], dst[19]); + SORT_CSWAP(dst[20], dst[18]); + SORT_CSWAP(dst[17], dst[11]); + SORT_CSWAP(dst[22], dst[10]); + SORT_CSWAP(dst[2], dst[1]); + SORT_CSWAP(dst[8], dst[7]); + SORT_CSWAP(dst[6], dst[0]); + SORT_CSWAP(dst[9], dst[3]); + SORT_CSWAP(dst[14], dst[13]); + SORT_CSWAP(dst[20], dst[19]); + SORT_CSWAP(dst[18], dst[12]); + SORT_CSWAP(dst[21], dst[15]); + SORT_CSWAP(dst[5], dst[0]); + SORT_CSWAP(dst[7], dst[1]); + SORT_CSWAP(dst[8], dst[2]); + SORT_CSWAP(dst[9], dst[4]); + SORT_CSWAP(dst[19], dst[13]); + SORT_CSWAP(dst[17], dst[12]); + SORT_CSWAP(dst[20], dst[14]); + SORT_CSWAP(dst[21], dst[16]); + SORT_CSWAP(dst[6], dst[1]); + SORT_CSWAP(dst[8], dst[3]); + SORT_CSWAP(dst[18], dst[13]); + SORT_CSWAP(dst[20], dst[15]); + SORT_CSWAP(dst[12], dst[0]); + SORT_CSWAP(dst[21], dst[9]); + SORT_CSWAP(dst[5], dst[1]); + SORT_CSWAP(dst[8], dst[4]); + SORT_CSWAP(dst[6], dst[3]); + SORT_CSWAP(dst[17], dst[13]); + SORT_CSWAP(dst[20], dst[16]); + SORT_CSWAP(dst[18], dst[15]); + SORT_CSWAP(dst[11], dst[0]); + SORT_CSWAP(dst[21], dst[10]); + SORT_CSWAP(dst[5], dst[2]); + SORT_CSWAP(dst[7], dst[4]); + SORT_CSWAP(dst[17], dst[14]); + SORT_CSWAP(dst[19], dst[16]); + SORT_CSWAP(dst[13], dst[1]); + SORT_CSWAP(dst[20], dst[8]); + SORT_CSWAP(dst[6], dst[4]); + SORT_CSWAP(dst[5], dst[3]); + SORT_CSWAP(dst[18], dst[16]); + SORT_CSWAP(dst[17], dst[15]); + SORT_CSWAP(dst[12], dst[1]); + SORT_CSWAP(dst[14], dst[2]); + SORT_CSWAP(dst[19], dst[7]); + SORT_CSWAP(dst[20], dst[9]); + SORT_CSWAP(dst[5], dst[4]); + SORT_CSWAP(dst[17], dst[16]); + SORT_CSWAP(dst[11], dst[1]); + SORT_CSWAP(dst[15], dst[3]); + SORT_CSWAP(dst[18], dst[6]); + SORT_CSWAP(dst[20], dst[10]); + SORT_CSWAP(dst[16], dst[4]); + SORT_CSWAP(dst[14], dst[3]); + SORT_CSWAP(dst[11], dst[2]); + SORT_CSWAP(dst[17], dst[5]); + SORT_CSWAP(dst[18], dst[7]); + SORT_CSWAP(dst[19], dst[10]); + SORT_CSWAP(dst[15], dst[4]); + SORT_CSWAP(dst[12], dst[3]); + SORT_CSWAP(dst[17], dst[6]); + SORT_CSWAP(dst[18], dst[9]); + SORT_CSWAP(dst[14], dst[4]); + SORT_CSWAP(dst[11], dst[3]); + SORT_CSWAP(dst[17], dst[7]); + SORT_CSWAP(dst[18], dst[10]); + SORT_CSWAP(dst[13], dst[4]); + SORT_CSWAP(dst[17], dst[8]); + SORT_CSWAP(dst[12], dst[4]); + SORT_CSWAP(dst[17], dst[9]); + SORT_CSWAP(dst[13], dst[7]); + SORT_CSWAP(dst[14], dst[8]); + SORT_CSWAP(dst[11], dst[4]); + SORT_CSWAP(dst[17], dst[10]); + SORT_CSWAP(dst[12], dst[6]); + SORT_CSWAP(dst[15], dst[9]); + SORT_CSWAP(dst[11], dst[5]); + SORT_CSWAP(dst[12], dst[7]); + SORT_CSWAP(dst[16], dst[10]); + SORT_CSWAP(dst[14], dst[9]); + SORT_CSWAP(dst[11], dst[6]); + SORT_CSWAP(dst[15], dst[10]); + SORT_CSWAP(dst[12], dst[9]); + SORT_CSWAP(dst[11], dst[7]); + SORT_CSWAP(dst[14], dst[10]); + SORT_CSWAP(dst[11], dst[8]); + SORT_CSWAP(dst[13], dst[10]); + SORT_CSWAP(dst[12], dst[10]); + SORT_CSWAP(dst[11], dst[9]); + SORT_CSWAP(dst[11], dst[10]); +} + + +#define BITONIC_SORT_REVERSE_24 SORT_MAKE_STR(bitonic_sort_reverse_24) +static __inline void BITONIC_SORT_REVERSE_24(SORT_TYPE *dst) { + SORT_CSWAP(dst[2], dst[1]); + SORT_CSWAP(dst[5], dst[4]); + SORT_CSWAP(dst[8], dst[7]); + SORT_CSWAP(dst[11], dst[10]); + SORT_CSWAP(dst[14], dst[13]); + SORT_CSWAP(dst[17], dst[16]); + SORT_CSWAP(dst[20], dst[19]); + SORT_CSWAP(dst[23], dst[22]); + SORT_CSWAP(dst[2], dst[0]); + SORT_CSWAP(dst[5], dst[3]); + SORT_CSWAP(dst[8], dst[6]); + SORT_CSWAP(dst[11], dst[9]); + SORT_CSWAP(dst[14], dst[12]); + SORT_CSWAP(dst[17], dst[15]); + SORT_CSWAP(dst[20], dst[18]); + SORT_CSWAP(dst[23], dst[21]); + SORT_CSWAP(dst[1], dst[0]); + SORT_CSWAP(dst[4], dst[3]); + SORT_CSWAP(dst[5], dst[2]); + SORT_CSWAP(dst[7], dst[6]); + SORT_CSWAP(dst[10], dst[9]); + SORT_CSWAP(dst[11], dst[8]); + SORT_CSWAP(dst[13], dst[12]); + SORT_CSWAP(dst[16], dst[15]); + SORT_CSWAP(dst[17], dst[14]); + SORT_CSWAP(dst[19], dst[18]); + SORT_CSWAP(dst[22], dst[21]); + SORT_CSWAP(dst[23], dst[20]); + SORT_CSWAP(dst[3], dst[0]); + SORT_CSWAP(dst[4], dst[1]); + SORT_CSWAP(dst[9], dst[6]); + SORT_CSWAP(dst[10], dst[7]); + SORT_CSWAP(dst[11], dst[5]); + SORT_CSWAP(dst[15], dst[12]); + SORT_CSWAP(dst[16], dst[13]); + SORT_CSWAP(dst[21], dst[18]); + SORT_CSWAP(dst[22], dst[19]); + SORT_CSWAP(dst[23], dst[17]); + SORT_CSWAP(dst[4], dst[2]); + SORT_CSWAP(dst[3], dst[1]); + SORT_CSWAP(dst[10], dst[8]); + SORT_CSWAP(dst[9], dst[7]); + SORT_CSWAP(dst[6], dst[0]); + SORT_CSWAP(dst[16], dst[14]); + SORT_CSWAP(dst[15], dst[13]); + SORT_CSWAP(dst[22], dst[20]); + SORT_CSWAP(dst[21], dst[19]); + SORT_CSWAP(dst[18], dst[12]); + SORT_CSWAP(dst[23], dst[11]); + SORT_CSWAP(dst[3], dst[2]); + SORT_CSWAP(dst[9], dst[8]); + SORT_CSWAP(dst[7], dst[1]); + SORT_CSWAP(dst[10], dst[4]); + SORT_CSWAP(dst[15], dst[14]); + SORT_CSWAP(dst[21], dst[20]); + SORT_CSWAP(dst[19], dst[13]); + SORT_CSWAP(dst[22], dst[16]); + SORT_CSWAP(dst[12], dst[0]); + SORT_CSWAP(dst[8], dst[2]); + SORT_CSWAP(dst[6], dst[1]); + SORT_CSWAP(dst[9], dst[3]); + SORT_CSWAP(dst[10], dst[5]); + SORT_CSWAP(dst[20], dst[14]); + SORT_CSWAP(dst[18], dst[13]); + SORT_CSWAP(dst[21], dst[15]); + SORT_CSWAP(dst[22], dst[17]); + SORT_CSWAP(dst[7], dst[2]); + SORT_CSWAP(dst[9], dst[4]); + SORT_CSWAP(dst[19], dst[14]); + SORT_CSWAP(dst[21], dst[16]); + SORT_CSWAP(dst[13], dst[1]); + SORT_CSWAP(dst[22], dst[10]); + SORT_CSWAP(dst[6], dst[2]); + SORT_CSWAP(dst[9], dst[5]); + SORT_CSWAP(dst[7], dst[4]); + SORT_CSWAP(dst[18], dst[14]); + SORT_CSWAP(dst[21], dst[17]); + SORT_CSWAP(dst[19], dst[16]); + SORT_CSWAP(dst[12], dst[1]); + SORT_CSWAP(dst[22], dst[11]); + SORT_CSWAP(dst[6], dst[3]); + SORT_CSWAP(dst[8], dst[5]); + SORT_CSWAP(dst[18], dst[15]); + SORT_CSWAP(dst[20], dst[17]); + SORT_CSWAP(dst[14], dst[2]); + SORT_CSWAP(dst[21], dst[9]); + SORT_CSWAP(dst[7], dst[5]); + SORT_CSWAP(dst[6], dst[4]); + SORT_CSWAP(dst[19], dst[17]); + SORT_CSWAP(dst[18], dst[16]); + SORT_CSWAP(dst[13], dst[2]); + SORT_CSWAP(dst[15], dst[3]); + SORT_CSWAP(dst[20], dst[8]); + SORT_CSWAP(dst[21], dst[10]); + SORT_CSWAP(dst[6], dst[5]); + SORT_CSWAP(dst[18], dst[17]); + SORT_CSWAP(dst[12], dst[2]); + SORT_CSWAP(dst[16], dst[4]); + SORT_CSWAP(dst[19], dst[7]); + SORT_CSWAP(dst[21], dst[11]); + SORT_CSWAP(dst[17], dst[5]); + SORT_CSWAP(dst[15], dst[4]); + SORT_CSWAP(dst[12], dst[3]); + SORT_CSWAP(dst[18], dst[6]); + SORT_CSWAP(dst[19], dst[8]); + SORT_CSWAP(dst[20], dst[11]); + SORT_CSWAP(dst[16], dst[5]); + SORT_CSWAP(dst[13], dst[4]); + SORT_CSWAP(dst[18], dst[7]); + SORT_CSWAP(dst[19], dst[10]); + SORT_CSWAP(dst[15], dst[5]); + SORT_CSWAP(dst[12], dst[4]); + SORT_CSWAP(dst[18], dst[8]); + SORT_CSWAP(dst[19], dst[11]); + SORT_CSWAP(dst[14], dst[5]); + SORT_CSWAP(dst[18], dst[9]); + SORT_CSWAP(dst[13], dst[5]); + SORT_CSWAP(dst[18], dst[10]); + SORT_CSWAP(dst[14], dst[8]); + SORT_CSWAP(dst[15], dst[9]); + SORT_CSWAP(dst[12], dst[5]); + SORT_CSWAP(dst[18], dst[11]); + SORT_CSWAP(dst[13], dst[7]); + SORT_CSWAP(dst[16], dst[10]); + SORT_CSWAP(dst[12], dst[6]); + SORT_CSWAP(dst[13], dst[8]); + SORT_CSWAP(dst[17], dst[11]); + SORT_CSWAP(dst[15], dst[10]); + SORT_CSWAP(dst[12], dst[7]); + SORT_CSWAP(dst[16], dst[11]); + SORT_CSWAP(dst[13], dst[10]); + SORT_CSWAP(dst[12], dst[8]); + SORT_CSWAP(dst[15], dst[11]); + SORT_CSWAP(dst[12], dst[9]); + SORT_CSWAP(dst[14], dst[11]); + SORT_CSWAP(dst[13], dst[11]); + SORT_CSWAP(dst[12], dst[10]); + SORT_CSWAP(dst[12], dst[11]); +} + + +#define BITONIC_SORT_REVERSE_25 SORT_MAKE_STR(bitonic_sort_reverse_25) +static __inline void BITONIC_SORT_REVERSE_25(SORT_TYPE *dst) { + SORT_CSWAP(dst[2], dst[1]); + SORT_CSWAP(dst[5], dst[4]); + SORT_CSWAP(dst[8], dst[7]); + SORT_CSWAP(dst[11], dst[10]); + SORT_CSWAP(dst[14], dst[13]); + SORT_CSWAP(dst[17], dst[16]); + SORT_CSWAP(dst[20], dst[19]); + SORT_CSWAP(dst[22], dst[21]); + SORT_CSWAP(dst[24], dst[23]); + SORT_CSWAP(dst[2], dst[0]); + SORT_CSWAP(dst[5], dst[3]); + SORT_CSWAP(dst[8], dst[6]); + SORT_CSWAP(dst[11], dst[9]); + SORT_CSWAP(dst[14], dst[12]); + SORT_CSWAP(dst[17], dst[15]); + SORT_CSWAP(dst[20], dst[18]); + SORT_CSWAP(dst[23], dst[21]); + SORT_CSWAP(dst[24], dst[22]); + SORT_CSWAP(dst[1], dst[0]); + SORT_CSWAP(dst[4], dst[3]); + SORT_CSWAP(dst[5], dst[2]); + SORT_CSWAP(dst[7], dst[6]); + SORT_CSWAP(dst[10], dst[9]); + SORT_CSWAP(dst[11], dst[8]); + SORT_CSWAP(dst[13], dst[12]); + SORT_CSWAP(dst[16], dst[15]); + SORT_CSWAP(dst[17], dst[14]); + SORT_CSWAP(dst[19], dst[18]); + SORT_CSWAP(dst[23], dst[22]); + SORT_CSWAP(dst[24], dst[20]); + SORT_CSWAP(dst[3], dst[0]); + SORT_CSWAP(dst[4], dst[1]); + SORT_CSWAP(dst[9], dst[6]); + SORT_CSWAP(dst[10], dst[7]); + SORT_CSWAP(dst[11], dst[5]); + SORT_CSWAP(dst[15], dst[12]); + SORT_CSWAP(dst[16], dst[13]); + SORT_CSWAP(dst[22], dst[18]); + SORT_CSWAP(dst[23], dst[19]); + SORT_CSWAP(dst[24], dst[17]); + SORT_CSWAP(dst[4], dst[2]); + SORT_CSWAP(dst[3], dst[1]); + SORT_CSWAP(dst[10], dst[8]); + SORT_CSWAP(dst[9], dst[7]); + SORT_CSWAP(dst[6], dst[0]); + SORT_CSWAP(dst[16], dst[14]); + SORT_CSWAP(dst[15], dst[13]); + SORT_CSWAP(dst[21], dst[18]); + SORT_CSWAP(dst[23], dst[20]); + SORT_CSWAP(dst[24], dst[11]); + SORT_CSWAP(dst[3], dst[2]); + SORT_CSWAP(dst[9], dst[8]); + SORT_CSWAP(dst[7], dst[1]); + SORT_CSWAP(dst[10], dst[4]); + SORT_CSWAP(dst[15], dst[14]); + SORT_CSWAP(dst[21], dst[19]); + SORT_CSWAP(dst[22], dst[20]); + SORT_CSWAP(dst[23], dst[16]); + SORT_CSWAP(dst[8], dst[2]); + SORT_CSWAP(dst[6], dst[1]); + SORT_CSWAP(dst[9], dst[3]); + SORT_CSWAP(dst[10], dst[5]); + SORT_CSWAP(dst[21], dst[20]); + SORT_CSWAP(dst[19], dst[12]); + SORT_CSWAP(dst[22], dst[15]); + SORT_CSWAP(dst[23], dst[17]); + SORT_CSWAP(dst[7], dst[2]); + SORT_CSWAP(dst[9], dst[4]); + SORT_CSWAP(dst[18], dst[12]); + SORT_CSWAP(dst[20], dst[13]); + SORT_CSWAP(dst[21], dst[14]); + SORT_CSWAP(dst[22], dst[16]); + SORT_CSWAP(dst[23], dst[10]); + SORT_CSWAP(dst[6], dst[2]); + SORT_CSWAP(dst[9], dst[5]); + SORT_CSWAP(dst[7], dst[4]); + SORT_CSWAP(dst[20], dst[14]); + SORT_CSWAP(dst[18], dst[13]); + SORT_CSWAP(dst[22], dst[17]); + SORT_CSWAP(dst[23], dst[11]); + SORT_CSWAP(dst[6], dst[3]); + SORT_CSWAP(dst[8], dst[5]); + SORT_CSWAP(dst[19], dst[14]); + SORT_CSWAP(dst[20], dst[16]); + SORT_CSWAP(dst[21], dst[17]); + SORT_CSWAP(dst[13], dst[0]); + SORT_CSWAP(dst[22], dst[9]); + SORT_CSWAP(dst[7], dst[5]); + SORT_CSWAP(dst[6], dst[4]); + SORT_CSWAP(dst[18], dst[14]); + SORT_CSWAP(dst[19], dst[15]); + SORT_CSWAP(dst[20], dst[17]); + SORT_CSWAP(dst[12], dst[0]); + SORT_CSWAP(dst[21], dst[8]); + SORT_CSWAP(dst[22], dst[10]); + SORT_CSWAP(dst[6], dst[5]); + SORT_CSWAP(dst[18], dst[15]); + SORT_CSWAP(dst[19], dst[17]); + SORT_CSWAP(dst[14], dst[1]); + SORT_CSWAP(dst[20], dst[7]); + SORT_CSWAP(dst[22], dst[11]); + SORT_CSWAP(dst[18], dst[16]); + SORT_CSWAP(dst[15], dst[2]); + SORT_CSWAP(dst[12], dst[1]); + SORT_CSWAP(dst[19], dst[6]); + SORT_CSWAP(dst[20], dst[8]); + SORT_CSWAP(dst[21], dst[11]); + SORT_CSWAP(dst[18], dst[17]); + SORT_CSWAP(dst[14], dst[2]); + SORT_CSWAP(dst[16], dst[3]); + SORT_CSWAP(dst[19], dst[7]); + SORT_CSWAP(dst[20], dst[10]); + SORT_CSWAP(dst[13], dst[2]); + SORT_CSWAP(dst[17], dst[4]); + SORT_CSWAP(dst[18], dst[5]); + SORT_CSWAP(dst[19], dst[8]); + SORT_CSWAP(dst[20], dst[11]); + SORT_CSWAP(dst[12], dst[2]); + SORT_CSWAP(dst[17], dst[5]); + SORT_CSWAP(dst[16], dst[4]); + SORT_CSWAP(dst[13], dst[3]); + SORT_CSWAP(dst[19], dst[9]); + SORT_CSWAP(dst[16], dst[5]); + SORT_CSWAP(dst[12], dst[3]); + SORT_CSWAP(dst[14], dst[4]); + SORT_CSWAP(dst[19], dst[10]); + SORT_CSWAP(dst[15], dst[5]); + SORT_CSWAP(dst[12], dst[4]); + SORT_CSWAP(dst[19], dst[11]); + SORT_CSWAP(dst[16], dst[9]); + SORT_CSWAP(dst[17], dst[10]); + SORT_CSWAP(dst[14], dst[5]); + SORT_CSWAP(dst[15], dst[8]); + SORT_CSWAP(dst[18], dst[11]); + SORT_CSWAP(dst[16], dst[10]); + SORT_CSWAP(dst[13], dst[5]); + SORT_CSWAP(dst[14], dst[7]); + SORT_CSWAP(dst[17], dst[11]); + SORT_CSWAP(dst[12], dst[5]); + SORT_CSWAP(dst[13], dst[6]); + SORT_CSWAP(dst[14], dst[8]); + SORT_CSWAP(dst[16], dst[11]); + SORT_CSWAP(dst[12], dst[6]); + SORT_CSWAP(dst[13], dst[8]); + SORT_CSWAP(dst[14], dst[10]); + SORT_CSWAP(dst[15], dst[11]); + SORT_CSWAP(dst[12], dst[7]); + SORT_CSWAP(dst[13], dst[9]); + SORT_CSWAP(dst[14], dst[11]); + SORT_CSWAP(dst[12], dst[8]); + SORT_CSWAP(dst[13], dst[11]); + SORT_CSWAP(dst[12], dst[9]); + SORT_CSWAP(dst[12], dst[10]); + SORT_CSWAP(dst[12], dst[11]); +} + + +#define BITONIC_SORT_REVERSE_26 SORT_MAKE_STR(bitonic_sort_reverse_26) +static __inline void BITONIC_SORT_REVERSE_26(SORT_TYPE *dst) { + SORT_CSWAP(dst[2], dst[1]); + SORT_CSWAP(dst[5], dst[4]); + SORT_CSWAP(dst[8], dst[7]); + SORT_CSWAP(dst[10], dst[9]); + SORT_CSWAP(dst[12], dst[11]); + SORT_CSWAP(dst[15], dst[14]); + SORT_CSWAP(dst[18], dst[17]); + SORT_CSWAP(dst[21], dst[20]); + SORT_CSWAP(dst[23], dst[22]); + SORT_CSWAP(dst[25], dst[24]); + SORT_CSWAP(dst[2], dst[0]); + SORT_CSWAP(dst[5], dst[3]); + SORT_CSWAP(dst[8], dst[6]); + SORT_CSWAP(dst[11], dst[9]); + SORT_CSWAP(dst[12], dst[10]); + SORT_CSWAP(dst[15], dst[13]); + SORT_CSWAP(dst[18], dst[16]); + SORT_CSWAP(dst[21], dst[19]); + SORT_CSWAP(dst[24], dst[22]); + SORT_CSWAP(dst[25], dst[23]); + SORT_CSWAP(dst[1], dst[0]); + SORT_CSWAP(dst[4], dst[3]); + SORT_CSWAP(dst[5], dst[2]); + SORT_CSWAP(dst[7], dst[6]); + SORT_CSWAP(dst[11], dst[10]); + SORT_CSWAP(dst[12], dst[8]); + SORT_CSWAP(dst[14], dst[13]); + SORT_CSWAP(dst[17], dst[16]); + SORT_CSWAP(dst[18], dst[15]); + SORT_CSWAP(dst[20], dst[19]); + SORT_CSWAP(dst[24], dst[23]); + SORT_CSWAP(dst[25], dst[21]); + SORT_CSWAP(dst[3], dst[0]); + SORT_CSWAP(dst[4], dst[1]); + SORT_CSWAP(dst[10], dst[6]); + SORT_CSWAP(dst[11], dst[7]); + SORT_CSWAP(dst[12], dst[5]); + SORT_CSWAP(dst[16], dst[13]); + SORT_CSWAP(dst[17], dst[14]); + SORT_CSWAP(dst[23], dst[19]); + SORT_CSWAP(dst[24], dst[20]); + SORT_CSWAP(dst[25], dst[18]); + SORT_CSWAP(dst[4], dst[2]); + SORT_CSWAP(dst[3], dst[1]); + SORT_CSWAP(dst[9], dst[6]); + SORT_CSWAP(dst[11], dst[8]); + SORT_CSWAP(dst[17], dst[15]); + SORT_CSWAP(dst[16], dst[14]); + SORT_CSWAP(dst[22], dst[19]); + SORT_CSWAP(dst[24], dst[21]); + SORT_CSWAP(dst[25], dst[12]); + SORT_CSWAP(dst[3], dst[2]); + SORT_CSWAP(dst[9], dst[7]); + SORT_CSWAP(dst[10], dst[8]); + SORT_CSWAP(dst[11], dst[4]); + SORT_CSWAP(dst[16], dst[15]); + SORT_CSWAP(dst[22], dst[20]); + SORT_CSWAP(dst[23], dst[21]); + SORT_CSWAP(dst[24], dst[17]); + SORT_CSWAP(dst[9], dst[8]); + SORT_CSWAP(dst[7], dst[0]); + SORT_CSWAP(dst[10], dst[3]); + SORT_CSWAP(dst[11], dst[5]); + SORT_CSWAP(dst[22], dst[21]); + SORT_CSWAP(dst[20], dst[13]); + SORT_CSWAP(dst[23], dst[16]); + SORT_CSWAP(dst[24], dst[18]); + SORT_CSWAP(dst[6], dst[0]); + SORT_CSWAP(dst[8], dst[1]); + SORT_CSWAP(dst[9], dst[2]); + SORT_CSWAP(dst[10], dst[4]); + SORT_CSWAP(dst[19], dst[13]); + SORT_CSWAP(dst[21], dst[14]); + SORT_CSWAP(dst[22], dst[15]); + SORT_CSWAP(dst[23], dst[17]); + SORT_CSWAP(dst[24], dst[11]); + SORT_CSWAP(dst[8], dst[2]); + SORT_CSWAP(dst[6], dst[1]); + SORT_CSWAP(dst[10], dst[5]); + SORT_CSWAP(dst[21], dst[15]); + SORT_CSWAP(dst[19], dst[14]); + SORT_CSWAP(dst[23], dst[18]); + SORT_CSWAP(dst[13], dst[0]); + SORT_CSWAP(dst[24], dst[12]); + SORT_CSWAP(dst[7], dst[2]); + SORT_CSWAP(dst[8], dst[4]); + SORT_CSWAP(dst[9], dst[5]); + SORT_CSWAP(dst[20], dst[15]); + SORT_CSWAP(dst[21], dst[17]); + SORT_CSWAP(dst[22], dst[18]); + SORT_CSWAP(dst[14], dst[1]); + SORT_CSWAP(dst[23], dst[10]); + SORT_CSWAP(dst[6], dst[2]); + SORT_CSWAP(dst[7], dst[3]); + SORT_CSWAP(dst[8], dst[5]); + SORT_CSWAP(dst[19], dst[15]); + SORT_CSWAP(dst[20], dst[16]); + SORT_CSWAP(dst[21], dst[18]); + SORT_CSWAP(dst[13], dst[1]); + SORT_CSWAP(dst[22], dst[9]); + SORT_CSWAP(dst[23], dst[12]); + SORT_CSWAP(dst[6], dst[3]); + SORT_CSWAP(dst[7], dst[5]); + SORT_CSWAP(dst[19], dst[16]); + SORT_CSWAP(dst[20], dst[18]); + SORT_CSWAP(dst[15], dst[2]); + SORT_CSWAP(dst[21], dst[8]); + SORT_CSWAP(dst[22], dst[10]); + SORT_CSWAP(dst[6], dst[4]); + SORT_CSWAP(dst[19], dst[17]); + SORT_CSWAP(dst[14], dst[2]); + SORT_CSWAP(dst[16], dst[3]); + SORT_CSWAP(dst[20], dst[7]); + SORT_CSWAP(dst[22], dst[11]); + SORT_CSWAP(dst[6], dst[5]); + SORT_CSWAP(dst[19], dst[18]); + SORT_CSWAP(dst[13], dst[2]); + SORT_CSWAP(dst[17], dst[4]); + SORT_CSWAP(dst[20], dst[8]); + SORT_CSWAP(dst[22], dst[12]); + SORT_CSWAP(dst[21], dst[11]); + SORT_CSWAP(dst[18], dst[5]); + SORT_CSWAP(dst[16], dst[4]); + SORT_CSWAP(dst[13], dst[3]); + SORT_CSWAP(dst[19], dst[6]); + SORT_CSWAP(dst[20], dst[10]); + SORT_CSWAP(dst[21], dst[12]); + SORT_CSWAP(dst[17], dst[5]); + SORT_CSWAP(dst[14], dst[4]); + SORT_CSWAP(dst[19], dst[7]); + SORT_CSWAP(dst[20], dst[12]); + SORT_CSWAP(dst[16], dst[5]); + SORT_CSWAP(dst[13], dst[4]); + SORT_CSWAP(dst[19], dst[8]); + SORT_CSWAP(dst[15], dst[5]); + SORT_CSWAP(dst[19], dst[9]); + SORT_CSWAP(dst[14], dst[5]); + SORT_CSWAP(dst[19], dst[10]); + SORT_CSWAP(dst[15], dst[8]); + SORT_CSWAP(dst[16], dst[9]); + SORT_CSWAP(dst[13], dst[5]); + SORT_CSWAP(dst[19], dst[11]); + SORT_CSWAP(dst[14], dst[7]); + SORT_CSWAP(dst[17], dst[10]); + SORT_CSWAP(dst[19], dst[12]); + SORT_CSWAP(dst[13], dst[6]); + SORT_CSWAP(dst[14], dst[8]); + SORT_CSWAP(dst[16], dst[10]); + SORT_CSWAP(dst[18], dst[11]); + SORT_CSWAP(dst[13], dst[7]); + SORT_CSWAP(dst[18], dst[12]); + SORT_CSWAP(dst[16], dst[11]); + SORT_CSWAP(dst[14], dst[10]); + SORT_CSWAP(dst[13], dst[8]); + SORT_CSWAP(dst[17], dst[12]); + SORT_CSWAP(dst[15], dst[11]); + SORT_CSWAP(dst[16], dst[12]); + SORT_CSWAP(dst[13], dst[9]); + SORT_CSWAP(dst[13], dst[10]); + SORT_CSWAP(dst[15], dst[12]); + SORT_CSWAP(dst[13], dst[11]); + SORT_CSWAP(dst[14], dst[12]); + SORT_CSWAP(dst[13], dst[12]); +} + + +#define BITONIC_SORT_REVERSE_27 SORT_MAKE_STR(bitonic_sort_reverse_27) +static __inline void BITONIC_SORT_REVERSE_27(SORT_TYPE *dst) { + SORT_CSWAP(dst[2], dst[1]); + SORT_CSWAP(dst[5], dst[4]); + SORT_CSWAP(dst[8], dst[7]); + SORT_CSWAP(dst[10], dst[9]); + SORT_CSWAP(dst[12], dst[11]); + SORT_CSWAP(dst[15], dst[14]); + SORT_CSWAP(dst[17], dst[16]); + SORT_CSWAP(dst[19], dst[18]); + SORT_CSWAP(dst[22], dst[21]); + SORT_CSWAP(dst[24], dst[23]); + SORT_CSWAP(dst[26], dst[25]); + SORT_CSWAP(dst[2], dst[0]); + SORT_CSWAP(dst[5], dst[3]); + SORT_CSWAP(dst[8], dst[6]); + SORT_CSWAP(dst[11], dst[9]); + SORT_CSWAP(dst[12], dst[10]); + SORT_CSWAP(dst[15], dst[13]); + SORT_CSWAP(dst[18], dst[16]); + SORT_CSWAP(dst[19], dst[17]); + SORT_CSWAP(dst[22], dst[20]); + SORT_CSWAP(dst[25], dst[23]); + SORT_CSWAP(dst[26], dst[24]); + SORT_CSWAP(dst[1], dst[0]); + SORT_CSWAP(dst[4], dst[3]); + SORT_CSWAP(dst[5], dst[2]); + SORT_CSWAP(dst[7], dst[6]); + SORT_CSWAP(dst[11], dst[10]); + SORT_CSWAP(dst[12], dst[8]); + SORT_CSWAP(dst[14], dst[13]); + SORT_CSWAP(dst[18], dst[17]); + SORT_CSWAP(dst[19], dst[15]); + SORT_CSWAP(dst[21], dst[20]); + SORT_CSWAP(dst[25], dst[24]); + SORT_CSWAP(dst[26], dst[22]); + SORT_CSWAP(dst[3], dst[0]); + SORT_CSWAP(dst[4], dst[1]); + SORT_CSWAP(dst[10], dst[6]); + SORT_CSWAP(dst[11], dst[7]); + SORT_CSWAP(dst[12], dst[5]); + SORT_CSWAP(dst[17], dst[13]); + SORT_CSWAP(dst[18], dst[14]); + SORT_CSWAP(dst[24], dst[20]); + SORT_CSWAP(dst[25], dst[21]); + SORT_CSWAP(dst[26], dst[19]); + SORT_CSWAP(dst[4], dst[2]); + SORT_CSWAP(dst[3], dst[1]); + SORT_CSWAP(dst[9], dst[6]); + SORT_CSWAP(dst[11], dst[8]); + SORT_CSWAP(dst[16], dst[13]); + SORT_CSWAP(dst[18], dst[15]); + SORT_CSWAP(dst[23], dst[20]); + SORT_CSWAP(dst[25], dst[22]); + SORT_CSWAP(dst[26], dst[12]); + SORT_CSWAP(dst[3], dst[2]); + SORT_CSWAP(dst[9], dst[7]); + SORT_CSWAP(dst[10], dst[8]); + SORT_CSWAP(dst[11], dst[4]); + SORT_CSWAP(dst[16], dst[14]); + SORT_CSWAP(dst[17], dst[15]); + SORT_CSWAP(dst[23], dst[21]); + SORT_CSWAP(dst[24], dst[22]); + SORT_CSWAP(dst[20], dst[13]); + SORT_CSWAP(dst[25], dst[18]); + SORT_CSWAP(dst[9], dst[8]); + SORT_CSWAP(dst[7], dst[0]); + SORT_CSWAP(dst[10], dst[3]); + SORT_CSWAP(dst[11], dst[5]); + SORT_CSWAP(dst[16], dst[15]); + SORT_CSWAP(dst[23], dst[22]); + SORT_CSWAP(dst[21], dst[14]); + SORT_CSWAP(dst[24], dst[17]); + SORT_CSWAP(dst[25], dst[19]); + SORT_CSWAP(dst[6], dst[0]); + SORT_CSWAP(dst[8], dst[1]); + SORT_CSWAP(dst[9], dst[2]); + SORT_CSWAP(dst[10], dst[4]); + SORT_CSWAP(dst[22], dst[15]); + SORT_CSWAP(dst[20], dst[14]); + SORT_CSWAP(dst[23], dst[16]); + SORT_CSWAP(dst[24], dst[19]); + SORT_CSWAP(dst[25], dst[11]); + SORT_CSWAP(dst[8], dst[2]); + SORT_CSWAP(dst[6], dst[1]); + SORT_CSWAP(dst[10], dst[5]); + SORT_CSWAP(dst[21], dst[15]); + SORT_CSWAP(dst[23], dst[17]); + SORT_CSWAP(dst[14], dst[0]); + SORT_CSWAP(dst[25], dst[12]); + SORT_CSWAP(dst[7], dst[2]); + SORT_CSWAP(dst[8], dst[4]); + SORT_CSWAP(dst[9], dst[5]); + SORT_CSWAP(dst[20], dst[15]); + SORT_CSWAP(dst[23], dst[18]); + SORT_CSWAP(dst[21], dst[17]); + SORT_CSWAP(dst[13], dst[0]); + SORT_CSWAP(dst[24], dst[10]); + SORT_CSWAP(dst[6], dst[2]); + SORT_CSWAP(dst[7], dst[3]); + SORT_CSWAP(dst[8], dst[5]); + SORT_CSWAP(dst[23], dst[19]); + SORT_CSWAP(dst[20], dst[16]); + SORT_CSWAP(dst[22], dst[18]); + SORT_CSWAP(dst[15], dst[1]); + SORT_CSWAP(dst[24], dst[12]); + SORT_CSWAP(dst[6], dst[3]); + SORT_CSWAP(dst[7], dst[5]); + SORT_CSWAP(dst[20], dst[17]); + SORT_CSWAP(dst[22], dst[19]); + SORT_CSWAP(dst[16], dst[2]); + SORT_CSWAP(dst[13], dst[1]); + SORT_CSWAP(dst[23], dst[9]); + SORT_CSWAP(dst[6], dst[4]); + SORT_CSWAP(dst[20], dst[18]); + SORT_CSWAP(dst[21], dst[19]); + SORT_CSWAP(dst[15], dst[2]); + SORT_CSWAP(dst[17], dst[3]); + SORT_CSWAP(dst[22], dst[8]); + SORT_CSWAP(dst[23], dst[10]); + SORT_CSWAP(dst[6], dst[5]); + SORT_CSWAP(dst[20], dst[19]); + SORT_CSWAP(dst[14], dst[2]); + SORT_CSWAP(dst[18], dst[4]); + SORT_CSWAP(dst[21], dst[7]); + SORT_CSWAP(dst[23], dst[11]); + SORT_CSWAP(dst[13], dst[2]); + SORT_CSWAP(dst[19], dst[5]); + SORT_CSWAP(dst[17], dst[4]); + SORT_CSWAP(dst[14], dst[3]); + SORT_CSWAP(dst[20], dst[6]); + SORT_CSWAP(dst[21], dst[8]); + SORT_CSWAP(dst[23], dst[12]); + SORT_CSWAP(dst[22], dst[11]); + SORT_CSWAP(dst[18], dst[5]); + SORT_CSWAP(dst[13], dst[3]); + SORT_CSWAP(dst[15], dst[4]); + SORT_CSWAP(dst[20], dst[7]); + SORT_CSWAP(dst[21], dst[10]); + SORT_CSWAP(dst[22], dst[12]); + SORT_CSWAP(dst[17], dst[5]); + SORT_CSWAP(dst[13], dst[4]); + SORT_CSWAP(dst[20], dst[8]); + SORT_CSWAP(dst[21], dst[12]); + SORT_CSWAP(dst[16], dst[5]); + SORT_CSWAP(dst[20], dst[9]); + SORT_CSWAP(dst[15], dst[5]); + SORT_CSWAP(dst[20], dst[10]); + SORT_CSWAP(dst[16], dst[9]); + SORT_CSWAP(dst[14], dst[5]); + SORT_CSWAP(dst[20], dst[11]); + SORT_CSWAP(dst[15], dst[8]); + SORT_CSWAP(dst[17], dst[10]); + SORT_CSWAP(dst[13], dst[5]); + SORT_CSWAP(dst[20], dst[12]); + SORT_CSWAP(dst[14], dst[7]); + SORT_CSWAP(dst[16], dst[10]); + SORT_CSWAP(dst[18], dst[11]); + SORT_CSWAP(dst[13], dst[6]); + SORT_CSWAP(dst[14], dst[8]); + SORT_CSWAP(dst[19], dst[12]); + SORT_CSWAP(dst[16], dst[11]); + SORT_CSWAP(dst[13], dst[7]); + SORT_CSWAP(dst[18], dst[12]); + SORT_CSWAP(dst[14], dst[10]); + SORT_CSWAP(dst[15], dst[11]); + SORT_CSWAP(dst[13], dst[8]); + SORT_CSWAP(dst[17], dst[12]); + SORT_CSWAP(dst[16], dst[12]); + SORT_CSWAP(dst[13], dst[9]); + SORT_CSWAP(dst[13], dst[10]); + SORT_CSWAP(dst[15], dst[12]); + SORT_CSWAP(dst[13], dst[11]); + SORT_CSWAP(dst[14], dst[12]); + SORT_CSWAP(dst[13], dst[12]); +} + + +#define BITONIC_SORT_REVERSE_28 SORT_MAKE_STR(bitonic_sort_reverse_28) +static __inline void BITONIC_SORT_REVERSE_28(SORT_TYPE *dst) { + SORT_CSWAP(dst[2], dst[1]); + SORT_CSWAP(dst[4], dst[3]); + SORT_CSWAP(dst[6], dst[5]); + SORT_CSWAP(dst[9], dst[8]); + SORT_CSWAP(dst[11], dst[10]); + SORT_CSWAP(dst[13], dst[12]); + SORT_CSWAP(dst[16], dst[15]); + SORT_CSWAP(dst[18], dst[17]); + SORT_CSWAP(dst[20], dst[19]); + SORT_CSWAP(dst[23], dst[22]); + SORT_CSWAP(dst[25], dst[24]); + SORT_CSWAP(dst[27], dst[26]); + SORT_CSWAP(dst[2], dst[0]); + SORT_CSWAP(dst[5], dst[3]); + SORT_CSWAP(dst[6], dst[4]); + SORT_CSWAP(dst[9], dst[7]); + SORT_CSWAP(dst[12], dst[10]); + SORT_CSWAP(dst[13], dst[11]); + SORT_CSWAP(dst[16], dst[14]); + SORT_CSWAP(dst[19], dst[17]); + SORT_CSWAP(dst[20], dst[18]); + SORT_CSWAP(dst[23], dst[21]); + SORT_CSWAP(dst[26], dst[24]); + SORT_CSWAP(dst[27], dst[25]); + SORT_CSWAP(dst[1], dst[0]); + SORT_CSWAP(dst[5], dst[4]); + SORT_CSWAP(dst[6], dst[2]); + SORT_CSWAP(dst[8], dst[7]); + SORT_CSWAP(dst[12], dst[11]); + SORT_CSWAP(dst[13], dst[9]); + SORT_CSWAP(dst[15], dst[14]); + SORT_CSWAP(dst[19], dst[18]); + SORT_CSWAP(dst[20], dst[16]); + SORT_CSWAP(dst[22], dst[21]); + SORT_CSWAP(dst[26], dst[25]); + SORT_CSWAP(dst[27], dst[23]); + SORT_CSWAP(dst[4], dst[0]); + SORT_CSWAP(dst[5], dst[1]); + SORT_CSWAP(dst[11], dst[7]); + SORT_CSWAP(dst[12], dst[8]); + SORT_CSWAP(dst[13], dst[6]); + SORT_CSWAP(dst[18], dst[14]); + SORT_CSWAP(dst[19], dst[15]); + SORT_CSWAP(dst[25], dst[21]); + SORT_CSWAP(dst[26], dst[22]); + SORT_CSWAP(dst[27], dst[20]); + SORT_CSWAP(dst[3], dst[0]); + SORT_CSWAP(dst[5], dst[2]); + SORT_CSWAP(dst[10], dst[7]); + SORT_CSWAP(dst[12], dst[9]); + SORT_CSWAP(dst[17], dst[14]); + SORT_CSWAP(dst[19], dst[16]); + SORT_CSWAP(dst[24], dst[21]); + SORT_CSWAP(dst[26], dst[23]); + SORT_CSWAP(dst[27], dst[13]); + SORT_CSWAP(dst[3], dst[1]); + SORT_CSWAP(dst[4], dst[2]); + SORT_CSWAP(dst[10], dst[8]); + SORT_CSWAP(dst[11], dst[9]); + SORT_CSWAP(dst[7], dst[0]); + SORT_CSWAP(dst[12], dst[5]); + SORT_CSWAP(dst[17], dst[15]); + SORT_CSWAP(dst[18], dst[16]); + SORT_CSWAP(dst[24], dst[22]); + SORT_CSWAP(dst[25], dst[23]); + SORT_CSWAP(dst[21], dst[14]); + SORT_CSWAP(dst[26], dst[19]); + SORT_CSWAP(dst[3], dst[2]); + SORT_CSWAP(dst[10], dst[9]); + SORT_CSWAP(dst[8], dst[1]); + SORT_CSWAP(dst[11], dst[4]); + SORT_CSWAP(dst[12], dst[6]); + SORT_CSWAP(dst[17], dst[16]); + SORT_CSWAP(dst[24], dst[23]); + SORT_CSWAP(dst[22], dst[15]); + SORT_CSWAP(dst[25], dst[18]); + SORT_CSWAP(dst[26], dst[20]); + SORT_CSWAP(dst[14], dst[0]); + SORT_CSWAP(dst[9], dst[2]); + SORT_CSWAP(dst[7], dst[1]); + SORT_CSWAP(dst[10], dst[3]); + SORT_CSWAP(dst[11], dst[6]); + SORT_CSWAP(dst[23], dst[16]); + SORT_CSWAP(dst[21], dst[15]); + SORT_CSWAP(dst[24], dst[17]); + SORT_CSWAP(dst[25], dst[20]); + SORT_CSWAP(dst[26], dst[12]); + SORT_CSWAP(dst[8], dst[2]); + SORT_CSWAP(dst[10], dst[4]); + SORT_CSWAP(dst[22], dst[16]); + SORT_CSWAP(dst[24], dst[18]); + SORT_CSWAP(dst[15], dst[1]); + SORT_CSWAP(dst[25], dst[11]); + SORT_CSWAP(dst[26], dst[13]); + SORT_CSWAP(dst[7], dst[2]); + SORT_CSWAP(dst[10], dst[5]); + SORT_CSWAP(dst[8], dst[4]); + SORT_CSWAP(dst[21], dst[16]); + SORT_CSWAP(dst[24], dst[19]); + SORT_CSWAP(dst[22], dst[18]); + SORT_CSWAP(dst[14], dst[1]); + SORT_CSWAP(dst[25], dst[13]); + SORT_CSWAP(dst[10], dst[6]); + SORT_CSWAP(dst[7], dst[3]); + SORT_CSWAP(dst[9], dst[5]); + SORT_CSWAP(dst[24], dst[20]); + SORT_CSWAP(dst[21], dst[17]); + SORT_CSWAP(dst[23], dst[19]); + SORT_CSWAP(dst[16], dst[2]); + SORT_CSWAP(dst[7], dst[4]); + SORT_CSWAP(dst[9], dst[6]); + SORT_CSWAP(dst[21], dst[18]); + SORT_CSWAP(dst[23], dst[20]); + SORT_CSWAP(dst[15], dst[2]); + SORT_CSWAP(dst[17], dst[3]); + SORT_CSWAP(dst[24], dst[10]); + SORT_CSWAP(dst[7], dst[5]); + SORT_CSWAP(dst[8], dst[6]); + SORT_CSWAP(dst[21], dst[19]); + SORT_CSWAP(dst[22], dst[20]); + SORT_CSWAP(dst[14], dst[2]); + SORT_CSWAP(dst[18], dst[4]); + SORT_CSWAP(dst[23], dst[9]); + SORT_CSWAP(dst[24], dst[11]); + SORT_CSWAP(dst[7], dst[6]); + SORT_CSWAP(dst[21], dst[20]); + SORT_CSWAP(dst[17], dst[4]); + SORT_CSWAP(dst[19], dst[5]); + SORT_CSWAP(dst[14], dst[3]); + SORT_CSWAP(dst[22], dst[8]); + SORT_CSWAP(dst[24], dst[12]); + SORT_CSWAP(dst[20], dst[6]); + SORT_CSWAP(dst[17], dst[5]); + SORT_CSWAP(dst[15], dst[4]); + SORT_CSWAP(dst[21], dst[7]); + SORT_CSWAP(dst[22], dst[9]); + SORT_CSWAP(dst[24], dst[13]); + SORT_CSWAP(dst[23], dst[12]); + SORT_CSWAP(dst[19], dst[6]); + SORT_CSWAP(dst[14], dst[4]); + SORT_CSWAP(dst[16], dst[5]); + SORT_CSWAP(dst[21], dst[8]); + SORT_CSWAP(dst[22], dst[11]); + SORT_CSWAP(dst[23], dst[13]); + SORT_CSWAP(dst[18], dst[6]); + SORT_CSWAP(dst[14], dst[5]); + SORT_CSWAP(dst[21], dst[9]); + SORT_CSWAP(dst[22], dst[13]); + SORT_CSWAP(dst[17], dst[6]); + SORT_CSWAP(dst[21], dst[10]); + SORT_CSWAP(dst[16], dst[6]); + SORT_CSWAP(dst[21], dst[11]); + SORT_CSWAP(dst[17], dst[10]); + SORT_CSWAP(dst[15], dst[6]); + SORT_CSWAP(dst[21], dst[12]); + SORT_CSWAP(dst[16], dst[9]); + SORT_CSWAP(dst[18], dst[11]); + SORT_CSWAP(dst[14], dst[6]); + SORT_CSWAP(dst[21], dst[13]); + SORT_CSWAP(dst[15], dst[8]); + SORT_CSWAP(dst[17], dst[11]); + SORT_CSWAP(dst[19], dst[12]); + SORT_CSWAP(dst[14], dst[7]); + SORT_CSWAP(dst[15], dst[9]); + SORT_CSWAP(dst[20], dst[13]); + SORT_CSWAP(dst[17], dst[12]); + SORT_CSWAP(dst[14], dst[8]); + SORT_CSWAP(dst[19], dst[13]); + SORT_CSWAP(dst[15], dst[11]); + SORT_CSWAP(dst[16], dst[12]); + SORT_CSWAP(dst[14], dst[9]); + SORT_CSWAP(dst[18], dst[13]); + SORT_CSWAP(dst[17], dst[13]); + SORT_CSWAP(dst[14], dst[10]); + SORT_CSWAP(dst[14], dst[11]); + SORT_CSWAP(dst[16], dst[13]); + SORT_CSWAP(dst[14], dst[12]); + SORT_CSWAP(dst[15], dst[13]); + SORT_CSWAP(dst[14], dst[13]); +} + + +#define BITONIC_SORT_REVERSE_29 SORT_MAKE_STR(bitonic_sort_reverse_29) +static __inline void BITONIC_SORT_REVERSE_29(SORT_TYPE *dst) { + SORT_CSWAP(dst[2], dst[1]); + SORT_CSWAP(dst[4], dst[3]); + SORT_CSWAP(dst[6], dst[5]); + SORT_CSWAP(dst[9], dst[8]); + SORT_CSWAP(dst[11], dst[10]); + SORT_CSWAP(dst[13], dst[12]); + SORT_CSWAP(dst[16], dst[15]); + SORT_CSWAP(dst[18], dst[17]); + SORT_CSWAP(dst[20], dst[19]); + SORT_CSWAP(dst[22], dst[21]); + SORT_CSWAP(dst[24], dst[23]); + SORT_CSWAP(dst[26], dst[25]); + SORT_CSWAP(dst[28], dst[27]); + SORT_CSWAP(dst[2], dst[0]); + SORT_CSWAP(dst[5], dst[3]); + SORT_CSWAP(dst[6], dst[4]); + SORT_CSWAP(dst[9], dst[7]); + SORT_CSWAP(dst[12], dst[10]); + SORT_CSWAP(dst[13], dst[11]); + SORT_CSWAP(dst[16], dst[14]); + SORT_CSWAP(dst[19], dst[17]); + SORT_CSWAP(dst[20], dst[18]); + SORT_CSWAP(dst[23], dst[21]); + SORT_CSWAP(dst[24], dst[22]); + SORT_CSWAP(dst[27], dst[25]); + SORT_CSWAP(dst[28], dst[26]); + SORT_CSWAP(dst[1], dst[0]); + SORT_CSWAP(dst[5], dst[4]); + SORT_CSWAP(dst[6], dst[2]); + SORT_CSWAP(dst[8], dst[7]); + SORT_CSWAP(dst[12], dst[11]); + SORT_CSWAP(dst[13], dst[9]); + SORT_CSWAP(dst[15], dst[14]); + SORT_CSWAP(dst[19], dst[18]); + SORT_CSWAP(dst[20], dst[16]); + SORT_CSWAP(dst[23], dst[22]); + SORT_CSWAP(dst[27], dst[26]); + SORT_CSWAP(dst[25], dst[21]); + SORT_CSWAP(dst[28], dst[24]); + SORT_CSWAP(dst[4], dst[0]); + SORT_CSWAP(dst[5], dst[1]); + SORT_CSWAP(dst[11], dst[7]); + SORT_CSWAP(dst[12], dst[8]); + SORT_CSWAP(dst[13], dst[6]); + SORT_CSWAP(dst[18], dst[14]); + SORT_CSWAP(dst[19], dst[15]); + SORT_CSWAP(dst[26], dst[22]); + SORT_CSWAP(dst[27], dst[23]); + SORT_CSWAP(dst[28], dst[20]); + SORT_CSWAP(dst[3], dst[0]); + SORT_CSWAP(dst[5], dst[2]); + SORT_CSWAP(dst[10], dst[7]); + SORT_CSWAP(dst[12], dst[9]); + SORT_CSWAP(dst[17], dst[14]); + SORT_CSWAP(dst[19], dst[16]); + SORT_CSWAP(dst[25], dst[22]); + SORT_CSWAP(dst[27], dst[24]); + SORT_CSWAP(dst[28], dst[13]); + SORT_CSWAP(dst[3], dst[1]); + SORT_CSWAP(dst[4], dst[2]); + SORT_CSWAP(dst[10], dst[8]); + SORT_CSWAP(dst[11], dst[9]); + SORT_CSWAP(dst[7], dst[0]); + SORT_CSWAP(dst[12], dst[5]); + SORT_CSWAP(dst[17], dst[15]); + SORT_CSWAP(dst[18], dst[16]); + SORT_CSWAP(dst[25], dst[23]); + SORT_CSWAP(dst[26], dst[24]); + SORT_CSWAP(dst[22], dst[14]); + SORT_CSWAP(dst[27], dst[19]); + SORT_CSWAP(dst[3], dst[2]); + SORT_CSWAP(dst[10], dst[9]); + SORT_CSWAP(dst[8], dst[1]); + SORT_CSWAP(dst[11], dst[4]); + SORT_CSWAP(dst[12], dst[6]); + SORT_CSWAP(dst[17], dst[16]); + SORT_CSWAP(dst[25], dst[24]); + SORT_CSWAP(dst[21], dst[14]); + SORT_CSWAP(dst[23], dst[15]); + SORT_CSWAP(dst[26], dst[18]); + SORT_CSWAP(dst[27], dst[20]); + SORT_CSWAP(dst[9], dst[2]); + SORT_CSWAP(dst[7], dst[1]); + SORT_CSWAP(dst[10], dst[3]); + SORT_CSWAP(dst[11], dst[6]); + SORT_CSWAP(dst[24], dst[16]); + SORT_CSWAP(dst[21], dst[15]); + SORT_CSWAP(dst[25], dst[17]); + SORT_CSWAP(dst[26], dst[20]); + SORT_CSWAP(dst[27], dst[12]); + SORT_CSWAP(dst[8], dst[2]); + SORT_CSWAP(dst[10], dst[4]); + SORT_CSWAP(dst[23], dst[16]); + SORT_CSWAP(dst[25], dst[18]); + SORT_CSWAP(dst[15], dst[0]); + SORT_CSWAP(dst[26], dst[11]); + SORT_CSWAP(dst[27], dst[13]); + SORT_CSWAP(dst[7], dst[2]); + SORT_CSWAP(dst[10], dst[5]); + SORT_CSWAP(dst[8], dst[4]); + SORT_CSWAP(dst[22], dst[16]); + SORT_CSWAP(dst[25], dst[19]); + SORT_CSWAP(dst[14], dst[0]); + SORT_CSWAP(dst[26], dst[13]); + SORT_CSWAP(dst[10], dst[6]); + SORT_CSWAP(dst[7], dst[3]); + SORT_CSWAP(dst[9], dst[5]); + SORT_CSWAP(dst[21], dst[16]); + SORT_CSWAP(dst[25], dst[20]); + SORT_CSWAP(dst[22], dst[18]); + SORT_CSWAP(dst[23], dst[19]); + SORT_CSWAP(dst[7], dst[4]); + SORT_CSWAP(dst[9], dst[6]); + SORT_CSWAP(dst[21], dst[17]); + SORT_CSWAP(dst[24], dst[20]); + SORT_CSWAP(dst[16], dst[1]); + SORT_CSWAP(dst[25], dst[10]); + SORT_CSWAP(dst[7], dst[5]); + SORT_CSWAP(dst[8], dst[6]); + SORT_CSWAP(dst[21], dst[18]); + SORT_CSWAP(dst[23], dst[20]); + SORT_CSWAP(dst[17], dst[2]); + SORT_CSWAP(dst[14], dst[1]); + SORT_CSWAP(dst[24], dst[9]); + SORT_CSWAP(dst[25], dst[11]); + SORT_CSWAP(dst[7], dst[6]); + SORT_CSWAP(dst[21], dst[19]); + SORT_CSWAP(dst[22], dst[20]); + SORT_CSWAP(dst[16], dst[2]); + SORT_CSWAP(dst[18], dst[3]); + SORT_CSWAP(dst[23], dst[8]); + SORT_CSWAP(dst[25], dst[12]); + SORT_CSWAP(dst[21], dst[20]); + SORT_CSWAP(dst[15], dst[2]); + SORT_CSWAP(dst[19], dst[4]); + SORT_CSWAP(dst[22], dst[7]); + SORT_CSWAP(dst[23], dst[9]); + SORT_CSWAP(dst[25], dst[13]); + SORT_CSWAP(dst[24], dst[12]); + SORT_CSWAP(dst[14], dst[2]); + SORT_CSWAP(dst[18], dst[4]); + SORT_CSWAP(dst[20], dst[5]); + SORT_CSWAP(dst[21], dst[6]); + SORT_CSWAP(dst[22], dst[8]); + SORT_CSWAP(dst[23], dst[11]); + SORT_CSWAP(dst[24], dst[13]); + SORT_CSWAP(dst[20], dst[6]); + SORT_CSWAP(dst[18], dst[5]); + SORT_CSWAP(dst[14], dst[3]); + SORT_CSWAP(dst[15], dst[4]); + SORT_CSWAP(dst[22], dst[9]); + SORT_CSWAP(dst[23], dst[13]); + SORT_CSWAP(dst[19], dst[6]); + SORT_CSWAP(dst[14], dst[4]); + SORT_CSWAP(dst[16], dst[5]); + SORT_CSWAP(dst[22], dst[10]); + SORT_CSWAP(dst[18], dst[6]); + SORT_CSWAP(dst[14], dst[5]); + SORT_CSWAP(dst[22], dst[11]); + SORT_CSWAP(dst[17], dst[6]); + SORT_CSWAP(dst[22], dst[12]); + SORT_CSWAP(dst[18], dst[10]); + SORT_CSWAP(dst[19], dst[11]); + SORT_CSWAP(dst[16], dst[6]); + SORT_CSWAP(dst[22], dst[13]); + SORT_CSWAP(dst[17], dst[9]); + SORT_CSWAP(dst[18], dst[11]); + SORT_CSWAP(dst[20], dst[12]); + SORT_CSWAP(dst[15], dst[6]); + SORT_CSWAP(dst[16], dst[8]); + SORT_CSWAP(dst[21], dst[13]); + SORT_CSWAP(dst[18], dst[12]); + SORT_CSWAP(dst[14], dst[6]); + SORT_CSWAP(dst[15], dst[7]); + SORT_CSWAP(dst[16], dst[9]); + SORT_CSWAP(dst[20], dst[13]); + SORT_CSWAP(dst[14], dst[7]); + SORT_CSWAP(dst[15], dst[9]); + SORT_CSWAP(dst[19], dst[13]); + SORT_CSWAP(dst[16], dst[12]); + SORT_CSWAP(dst[14], dst[8]); + SORT_CSWAP(dst[18], dst[13]); + SORT_CSWAP(dst[15], dst[11]); + SORT_CSWAP(dst[14], dst[9]); + SORT_CSWAP(dst[17], dst[13]); + SORT_CSWAP(dst[14], dst[10]); + SORT_CSWAP(dst[16], dst[13]); + SORT_CSWAP(dst[14], dst[11]); + SORT_CSWAP(dst[15], dst[13]); + SORT_CSWAP(dst[14], dst[12]); + SORT_CSWAP(dst[14], dst[13]); +} + + +#define BITONIC_SORT_REVERSE_30 SORT_MAKE_STR(bitonic_sort_reverse_30) +static __inline void BITONIC_SORT_REVERSE_30(SORT_TYPE *dst) { + SORT_CSWAP(dst[2], dst[1]); + SORT_CSWAP(dst[4], dst[3]); + SORT_CSWAP(dst[6], dst[5]); + SORT_CSWAP(dst[8], dst[7]); + SORT_CSWAP(dst[10], dst[9]); + SORT_CSWAP(dst[12], dst[11]); + SORT_CSWAP(dst[14], dst[13]); + SORT_CSWAP(dst[17], dst[16]); + SORT_CSWAP(dst[19], dst[18]); + SORT_CSWAP(dst[21], dst[20]); + SORT_CSWAP(dst[23], dst[22]); + SORT_CSWAP(dst[25], dst[24]); + SORT_CSWAP(dst[27], dst[26]); + SORT_CSWAP(dst[29], dst[28]); + SORT_CSWAP(dst[2], dst[0]); + SORT_CSWAP(dst[5], dst[3]); + SORT_CSWAP(dst[6], dst[4]); + SORT_CSWAP(dst[9], dst[7]); + SORT_CSWAP(dst[10], dst[8]); + SORT_CSWAP(dst[13], dst[11]); + SORT_CSWAP(dst[14], dst[12]); + SORT_CSWAP(dst[17], dst[15]); + SORT_CSWAP(dst[20], dst[18]); + SORT_CSWAP(dst[21], dst[19]); + SORT_CSWAP(dst[24], dst[22]); + SORT_CSWAP(dst[25], dst[23]); + SORT_CSWAP(dst[28], dst[26]); + SORT_CSWAP(dst[29], dst[27]); + SORT_CSWAP(dst[1], dst[0]); + SORT_CSWAP(dst[5], dst[4]); + SORT_CSWAP(dst[6], dst[2]); + SORT_CSWAP(dst[9], dst[8]); + SORT_CSWAP(dst[13], dst[12]); + SORT_CSWAP(dst[11], dst[7]); + SORT_CSWAP(dst[14], dst[10]); + SORT_CSWAP(dst[16], dst[15]); + SORT_CSWAP(dst[20], dst[19]); + SORT_CSWAP(dst[21], dst[17]); + SORT_CSWAP(dst[24], dst[23]); + SORT_CSWAP(dst[28], dst[27]); + SORT_CSWAP(dst[26], dst[22]); + SORT_CSWAP(dst[29], dst[25]); + SORT_CSWAP(dst[4], dst[0]); + SORT_CSWAP(dst[5], dst[1]); + SORT_CSWAP(dst[12], dst[8]); + SORT_CSWAP(dst[13], dst[9]); + SORT_CSWAP(dst[14], dst[6]); + SORT_CSWAP(dst[19], dst[15]); + SORT_CSWAP(dst[20], dst[16]); + SORT_CSWAP(dst[27], dst[23]); + SORT_CSWAP(dst[28], dst[24]); + SORT_CSWAP(dst[29], dst[21]); + SORT_CSWAP(dst[3], dst[0]); + SORT_CSWAP(dst[5], dst[2]); + SORT_CSWAP(dst[11], dst[8]); + SORT_CSWAP(dst[13], dst[10]); + SORT_CSWAP(dst[18], dst[15]); + SORT_CSWAP(dst[20], dst[17]); + SORT_CSWAP(dst[26], dst[23]); + SORT_CSWAP(dst[28], dst[25]); + SORT_CSWAP(dst[29], dst[14]); + SORT_CSWAP(dst[3], dst[1]); + SORT_CSWAP(dst[4], dst[2]); + SORT_CSWAP(dst[11], dst[9]); + SORT_CSWAP(dst[12], dst[10]); + SORT_CSWAP(dst[8], dst[0]); + SORT_CSWAP(dst[13], dst[5]); + SORT_CSWAP(dst[18], dst[16]); + SORT_CSWAP(dst[19], dst[17]); + SORT_CSWAP(dst[26], dst[24]); + SORT_CSWAP(dst[27], dst[25]); + SORT_CSWAP(dst[23], dst[15]); + SORT_CSWAP(dst[28], dst[20]); + SORT_CSWAP(dst[3], dst[2]); + SORT_CSWAP(dst[11], dst[10]); + SORT_CSWAP(dst[7], dst[0]); + SORT_CSWAP(dst[9], dst[1]); + SORT_CSWAP(dst[12], dst[4]); + SORT_CSWAP(dst[13], dst[6]); + SORT_CSWAP(dst[18], dst[17]); + SORT_CSWAP(dst[26], dst[25]); + SORT_CSWAP(dst[22], dst[15]); + SORT_CSWAP(dst[24], dst[16]); + SORT_CSWAP(dst[27], dst[19]); + SORT_CSWAP(dst[28], dst[21]); + SORT_CSWAP(dst[10], dst[2]); + SORT_CSWAP(dst[7], dst[1]); + SORT_CSWAP(dst[11], dst[3]); + SORT_CSWAP(dst[12], dst[6]); + SORT_CSWAP(dst[25], dst[17]); + SORT_CSWAP(dst[22], dst[16]); + SORT_CSWAP(dst[26], dst[18]); + SORT_CSWAP(dst[27], dst[21]); + SORT_CSWAP(dst[15], dst[0]); + SORT_CSWAP(dst[28], dst[13]); + SORT_CSWAP(dst[9], dst[2]); + SORT_CSWAP(dst[11], dst[4]); + SORT_CSWAP(dst[24], dst[17]); + SORT_CSWAP(dst[26], dst[19]); + SORT_CSWAP(dst[16], dst[1]); + SORT_CSWAP(dst[27], dst[12]); + SORT_CSWAP(dst[28], dst[14]); + SORT_CSWAP(dst[8], dst[2]); + SORT_CSWAP(dst[11], dst[5]); + SORT_CSWAP(dst[23], dst[17]); + SORT_CSWAP(dst[26], dst[20]); + SORT_CSWAP(dst[15], dst[1]); + SORT_CSWAP(dst[27], dst[14]); + SORT_CSWAP(dst[7], dst[2]); + SORT_CSWAP(dst[11], dst[6]); + SORT_CSWAP(dst[8], dst[4]); + SORT_CSWAP(dst[9], dst[5]); + SORT_CSWAP(dst[22], dst[17]); + SORT_CSWAP(dst[26], dst[21]); + SORT_CSWAP(dst[23], dst[19]); + SORT_CSWAP(dst[24], dst[20]); + SORT_CSWAP(dst[7], dst[3]); + SORT_CSWAP(dst[10], dst[6]); + SORT_CSWAP(dst[22], dst[18]); + SORT_CSWAP(dst[25], dst[21]); + SORT_CSWAP(dst[17], dst[2]); + SORT_CSWAP(dst[26], dst[11]); + SORT_CSWAP(dst[7], dst[4]); + SORT_CSWAP(dst[9], dst[6]); + SORT_CSWAP(dst[22], dst[19]); + SORT_CSWAP(dst[24], dst[21]); + SORT_CSWAP(dst[16], dst[2]); + SORT_CSWAP(dst[18], dst[3]); + SORT_CSWAP(dst[25], dst[10]); + SORT_CSWAP(dst[26], dst[12]); + SORT_CSWAP(dst[7], dst[5]); + SORT_CSWAP(dst[8], dst[6]); + SORT_CSWAP(dst[22], dst[20]); + SORT_CSWAP(dst[23], dst[21]); + SORT_CSWAP(dst[15], dst[2]); + SORT_CSWAP(dst[19], dst[4]); + SORT_CSWAP(dst[24], dst[9]); + SORT_CSWAP(dst[26], dst[13]); + SORT_CSWAP(dst[7], dst[6]); + SORT_CSWAP(dst[22], dst[21]); + SORT_CSWAP(dst[18], dst[4]); + SORT_CSWAP(dst[20], dst[5]); + SORT_CSWAP(dst[15], dst[3]); + SORT_CSWAP(dst[23], dst[8]); + SORT_CSWAP(dst[24], dst[10]); + SORT_CSWAP(dst[26], dst[14]); + SORT_CSWAP(dst[21], dst[6]); + SORT_CSWAP(dst[18], dst[5]); + SORT_CSWAP(dst[16], dst[4]); + SORT_CSWAP(dst[22], dst[7]); + SORT_CSWAP(dst[23], dst[10]); + SORT_CSWAP(dst[24], dst[13]); + SORT_CSWAP(dst[25], dst[14]); + SORT_CSWAP(dst[20], dst[6]); + SORT_CSWAP(dst[15], dst[4]); + SORT_CSWAP(dst[17], dst[5]); + SORT_CSWAP(dst[22], dst[8]); + SORT_CSWAP(dst[23], dst[12]); + SORT_CSWAP(dst[24], dst[14]); + SORT_CSWAP(dst[19], dst[6]); + SORT_CSWAP(dst[15], dst[5]); + SORT_CSWAP(dst[22], dst[9]); + SORT_CSWAP(dst[23], dst[14]); + SORT_CSWAP(dst[18], dst[6]); + SORT_CSWAP(dst[22], dst[10]); + SORT_CSWAP(dst[17], dst[6]); + SORT_CSWAP(dst[22], dst[11]); + SORT_CSWAP(dst[18], dst[10]); + SORT_CSWAP(dst[16], dst[6]); + SORT_CSWAP(dst[22], dst[12]); + SORT_CSWAP(dst[17], dst[9]); + SORT_CSWAP(dst[19], dst[11]); + SORT_CSWAP(dst[15], dst[6]); + SORT_CSWAP(dst[22], dst[13]); + SORT_CSWAP(dst[16], dst[8]); + SORT_CSWAP(dst[17], dst[10]); + SORT_CSWAP(dst[20], dst[12]); + SORT_CSWAP(dst[22], dst[14]); + SORT_CSWAP(dst[15], dst[7]); + SORT_CSWAP(dst[16], dst[10]); + SORT_CSWAP(dst[19], dst[12]); + SORT_CSWAP(dst[21], dst[13]); + SORT_CSWAP(dst[15], dst[8]); + SORT_CSWAP(dst[21], dst[14]); + SORT_CSWAP(dst[19], dst[13]); + SORT_CSWAP(dst[16], dst[12]); + SORT_CSWAP(dst[15], dst[9]); + SORT_CSWAP(dst[20], dst[14]); + SORT_CSWAP(dst[17], dst[13]); + SORT_CSWAP(dst[15], dst[10]); + SORT_CSWAP(dst[19], dst[14]); + SORT_CSWAP(dst[15], dst[11]); + SORT_CSWAP(dst[18], dst[14]); + SORT_CSWAP(dst[15], dst[12]); + SORT_CSWAP(dst[17], dst[14]); + SORT_CSWAP(dst[15], dst[13]); + SORT_CSWAP(dst[16], dst[14]); + SORT_CSWAP(dst[15], dst[14]); +} + + +#define BITONIC_SORT_REVERSE_31 SORT_MAKE_STR(bitonic_sort_reverse_31) +static __inline void BITONIC_SORT_REVERSE_31(SORT_TYPE *dst) { + SORT_CSWAP(dst[2], dst[1]); + SORT_CSWAP(dst[4], dst[3]); + SORT_CSWAP(dst[6], dst[5]); + SORT_CSWAP(dst[8], dst[7]); + SORT_CSWAP(dst[10], dst[9]); + SORT_CSWAP(dst[12], dst[11]); + SORT_CSWAP(dst[14], dst[13]); + SORT_CSWAP(dst[16], dst[15]); + SORT_CSWAP(dst[18], dst[17]); + SORT_CSWAP(dst[20], dst[19]); + SORT_CSWAP(dst[22], dst[21]); + SORT_CSWAP(dst[24], dst[23]); + SORT_CSWAP(dst[26], dst[25]); + SORT_CSWAP(dst[28], dst[27]); + SORT_CSWAP(dst[30], dst[29]); + SORT_CSWAP(dst[2], dst[0]); + SORT_CSWAP(dst[5], dst[3]); + SORT_CSWAP(dst[6], dst[4]); + SORT_CSWAP(dst[9], dst[7]); + SORT_CSWAP(dst[10], dst[8]); + SORT_CSWAP(dst[13], dst[11]); + SORT_CSWAP(dst[14], dst[12]); + SORT_CSWAP(dst[17], dst[15]); + SORT_CSWAP(dst[18], dst[16]); + SORT_CSWAP(dst[21], dst[19]); + SORT_CSWAP(dst[22], dst[20]); + SORT_CSWAP(dst[25], dst[23]); + SORT_CSWAP(dst[26], dst[24]); + SORT_CSWAP(dst[29], dst[27]); + SORT_CSWAP(dst[30], dst[28]); + SORT_CSWAP(dst[1], dst[0]); + SORT_CSWAP(dst[5], dst[4]); + SORT_CSWAP(dst[6], dst[2]); + SORT_CSWAP(dst[9], dst[8]); + SORT_CSWAP(dst[13], dst[12]); + SORT_CSWAP(dst[11], dst[7]); + SORT_CSWAP(dst[14], dst[10]); + SORT_CSWAP(dst[17], dst[16]); + SORT_CSWAP(dst[21], dst[20]); + SORT_CSWAP(dst[19], dst[15]); + SORT_CSWAP(dst[22], dst[18]); + SORT_CSWAP(dst[25], dst[24]); + SORT_CSWAP(dst[29], dst[28]); + SORT_CSWAP(dst[27], dst[23]); + SORT_CSWAP(dst[30], dst[26]); + SORT_CSWAP(dst[4], dst[0]); + SORT_CSWAP(dst[5], dst[1]); + SORT_CSWAP(dst[12], dst[8]); + SORT_CSWAP(dst[13], dst[9]); + SORT_CSWAP(dst[14], dst[6]); + SORT_CSWAP(dst[20], dst[16]); + SORT_CSWAP(dst[21], dst[17]); + SORT_CSWAP(dst[28], dst[24]); + SORT_CSWAP(dst[29], dst[25]); + SORT_CSWAP(dst[23], dst[15]); + SORT_CSWAP(dst[30], dst[22]); + SORT_CSWAP(dst[3], dst[0]); + SORT_CSWAP(dst[5], dst[2]); + SORT_CSWAP(dst[11], dst[8]); + SORT_CSWAP(dst[13], dst[10]); + SORT_CSWAP(dst[19], dst[16]); + SORT_CSWAP(dst[21], dst[18]); + SORT_CSWAP(dst[27], dst[24]); + SORT_CSWAP(dst[29], dst[26]); + SORT_CSWAP(dst[30], dst[14]); + SORT_CSWAP(dst[3], dst[1]); + SORT_CSWAP(dst[4], dst[2]); + SORT_CSWAP(dst[11], dst[9]); + SORT_CSWAP(dst[12], dst[10]); + SORT_CSWAP(dst[8], dst[0]); + SORT_CSWAP(dst[13], dst[5]); + SORT_CSWAP(dst[19], dst[17]); + SORT_CSWAP(dst[20], dst[18]); + SORT_CSWAP(dst[27], dst[25]); + SORT_CSWAP(dst[28], dst[26]); + SORT_CSWAP(dst[24], dst[16]); + SORT_CSWAP(dst[29], dst[21]); + SORT_CSWAP(dst[3], dst[2]); + SORT_CSWAP(dst[11], dst[10]); + SORT_CSWAP(dst[7], dst[0]); + SORT_CSWAP(dst[9], dst[1]); + SORT_CSWAP(dst[12], dst[4]); + SORT_CSWAP(dst[13], dst[6]); + SORT_CSWAP(dst[19], dst[18]); + SORT_CSWAP(dst[27], dst[26]); + SORT_CSWAP(dst[23], dst[16]); + SORT_CSWAP(dst[25], dst[17]); + SORT_CSWAP(dst[28], dst[20]); + SORT_CSWAP(dst[29], dst[22]); + SORT_CSWAP(dst[10], dst[2]); + SORT_CSWAP(dst[7], dst[1]); + SORT_CSWAP(dst[11], dst[3]); + SORT_CSWAP(dst[12], dst[6]); + SORT_CSWAP(dst[26], dst[18]); + SORT_CSWAP(dst[23], dst[17]); + SORT_CSWAP(dst[27], dst[19]); + SORT_CSWAP(dst[28], dst[22]); + SORT_CSWAP(dst[16], dst[0]); + SORT_CSWAP(dst[29], dst[13]); + SORT_CSWAP(dst[9], dst[2]); + SORT_CSWAP(dst[11], dst[4]); + SORT_CSWAP(dst[25], dst[18]); + SORT_CSWAP(dst[27], dst[20]); + SORT_CSWAP(dst[15], dst[0]); + SORT_CSWAP(dst[17], dst[1]); + SORT_CSWAP(dst[28], dst[12]); + SORT_CSWAP(dst[29], dst[14]); + SORT_CSWAP(dst[8], dst[2]); + SORT_CSWAP(dst[11], dst[5]); + SORT_CSWAP(dst[24], dst[18]); + SORT_CSWAP(dst[27], dst[21]); + SORT_CSWAP(dst[15], dst[1]); + SORT_CSWAP(dst[28], dst[14]); + SORT_CSWAP(dst[7], dst[2]); + SORT_CSWAP(dst[11], dst[6]); + SORT_CSWAP(dst[8], dst[4]); + SORT_CSWAP(dst[9], dst[5]); + SORT_CSWAP(dst[23], dst[18]); + SORT_CSWAP(dst[27], dst[22]); + SORT_CSWAP(dst[24], dst[20]); + SORT_CSWAP(dst[25], dst[21]); + SORT_CSWAP(dst[7], dst[3]); + SORT_CSWAP(dst[10], dst[6]); + SORT_CSWAP(dst[23], dst[19]); + SORT_CSWAP(dst[26], dst[22]); + SORT_CSWAP(dst[18], dst[2]); + SORT_CSWAP(dst[27], dst[11]); + SORT_CSWAP(dst[7], dst[4]); + SORT_CSWAP(dst[9], dst[6]); + SORT_CSWAP(dst[23], dst[20]); + SORT_CSWAP(dst[25], dst[22]); + SORT_CSWAP(dst[17], dst[2]); + SORT_CSWAP(dst[19], dst[3]); + SORT_CSWAP(dst[26], dst[10]); + SORT_CSWAP(dst[27], dst[12]); + SORT_CSWAP(dst[7], dst[5]); + SORT_CSWAP(dst[8], dst[6]); + SORT_CSWAP(dst[23], dst[21]); + SORT_CSWAP(dst[24], dst[22]); + SORT_CSWAP(dst[16], dst[2]); + SORT_CSWAP(dst[20], dst[4]); + SORT_CSWAP(dst[25], dst[9]); + SORT_CSWAP(dst[27], dst[13]); + SORT_CSWAP(dst[7], dst[6]); + SORT_CSWAP(dst[23], dst[22]); + SORT_CSWAP(dst[15], dst[2]); + SORT_CSWAP(dst[19], dst[4]); + SORT_CSWAP(dst[21], dst[5]); + SORT_CSWAP(dst[24], dst[8]); + SORT_CSWAP(dst[25], dst[10]); + SORT_CSWAP(dst[27], dst[14]); + SORT_CSWAP(dst[22], dst[6]); + SORT_CSWAP(dst[19], dst[5]); + SORT_CSWAP(dst[15], dst[3]); + SORT_CSWAP(dst[16], dst[4]); + SORT_CSWAP(dst[23], dst[7]); + SORT_CSWAP(dst[24], dst[10]); + SORT_CSWAP(dst[25], dst[13]); + SORT_CSWAP(dst[26], dst[14]); + SORT_CSWAP(dst[21], dst[6]); + SORT_CSWAP(dst[15], dst[4]); + SORT_CSWAP(dst[17], dst[5]); + SORT_CSWAP(dst[23], dst[8]); + SORT_CSWAP(dst[24], dst[12]); + SORT_CSWAP(dst[25], dst[14]); + SORT_CSWAP(dst[20], dst[6]); + SORT_CSWAP(dst[15], dst[5]); + SORT_CSWAP(dst[23], dst[9]); + SORT_CSWAP(dst[24], dst[14]); + SORT_CSWAP(dst[19], dst[6]); + SORT_CSWAP(dst[23], dst[10]); + SORT_CSWAP(dst[18], dst[6]); + SORT_CSWAP(dst[23], dst[11]); + SORT_CSWAP(dst[17], dst[6]); + SORT_CSWAP(dst[23], dst[12]); + SORT_CSWAP(dst[18], dst[10]); + SORT_CSWAP(dst[19], dst[11]); + SORT_CSWAP(dst[16], dst[6]); + SORT_CSWAP(dst[23], dst[13]); + SORT_CSWAP(dst[17], dst[9]); + SORT_CSWAP(dst[20], dst[12]); + SORT_CSWAP(dst[15], dst[6]); + SORT_CSWAP(dst[23], dst[14]); + SORT_CSWAP(dst[16], dst[8]); + SORT_CSWAP(dst[17], dst[10]); + SORT_CSWAP(dst[19], dst[12]); + SORT_CSWAP(dst[21], dst[13]); + SORT_CSWAP(dst[15], dst[7]); + SORT_CSWAP(dst[16], dst[10]); + SORT_CSWAP(dst[22], dst[14]); + SORT_CSWAP(dst[19], dst[13]); + SORT_CSWAP(dst[15], dst[8]); + SORT_CSWAP(dst[21], dst[14]); + SORT_CSWAP(dst[16], dst[12]); + SORT_CSWAP(dst[17], dst[13]); + SORT_CSWAP(dst[15], dst[9]); + SORT_CSWAP(dst[20], dst[14]); + SORT_CSWAP(dst[15], dst[10]); + SORT_CSWAP(dst[19], dst[14]); + SORT_CSWAP(dst[15], dst[11]); + SORT_CSWAP(dst[18], dst[14]); + SORT_CSWAP(dst[15], dst[12]); + SORT_CSWAP(dst[17], dst[14]); + SORT_CSWAP(dst[15], dst[13]); + SORT_CSWAP(dst[16], dst[14]); + SORT_CSWAP(dst[15], dst[14]); +} + + +#define BITONIC_SORT_REVERSE_32 SORT_MAKE_STR(bitonic_sort_reverse_32) +static __inline void BITONIC_SORT_REVERSE_32(SORT_TYPE *dst) { + SORT_CSWAP(dst[1], dst[0]); + SORT_CSWAP(dst[3], dst[2]); + SORT_CSWAP(dst[5], dst[4]); + SORT_CSWAP(dst[7], dst[6]); + SORT_CSWAP(dst[9], dst[8]); + SORT_CSWAP(dst[11], dst[10]); + SORT_CSWAP(dst[13], dst[12]); + SORT_CSWAP(dst[15], dst[14]); + SORT_CSWAP(dst[17], dst[16]); + SORT_CSWAP(dst[19], dst[18]); + SORT_CSWAP(dst[21], dst[20]); + SORT_CSWAP(dst[23], dst[22]); + SORT_CSWAP(dst[25], dst[24]); + SORT_CSWAP(dst[27], dst[26]); + SORT_CSWAP(dst[29], dst[28]); + SORT_CSWAP(dst[31], dst[30]); + SORT_CSWAP(dst[2], dst[0]); + SORT_CSWAP(dst[3], dst[1]); + SORT_CSWAP(dst[6], dst[4]); + SORT_CSWAP(dst[7], dst[5]); + SORT_CSWAP(dst[10], dst[8]); + SORT_CSWAP(dst[11], dst[9]); + SORT_CSWAP(dst[14], dst[12]); + SORT_CSWAP(dst[15], dst[13]); + SORT_CSWAP(dst[18], dst[16]); + SORT_CSWAP(dst[19], dst[17]); + SORT_CSWAP(dst[22], dst[20]); + SORT_CSWAP(dst[23], dst[21]); + SORT_CSWAP(dst[26], dst[24]); + SORT_CSWAP(dst[27], dst[25]); + SORT_CSWAP(dst[30], dst[28]); + SORT_CSWAP(dst[31], dst[29]); + SORT_CSWAP(dst[2], dst[1]); + SORT_CSWAP(dst[6], dst[5]); + SORT_CSWAP(dst[4], dst[0]); + SORT_CSWAP(dst[7], dst[3]); + SORT_CSWAP(dst[10], dst[9]); + SORT_CSWAP(dst[14], dst[13]); + SORT_CSWAP(dst[12], dst[8]); + SORT_CSWAP(dst[15], dst[11]); + SORT_CSWAP(dst[18], dst[17]); + SORT_CSWAP(dst[22], dst[21]); + SORT_CSWAP(dst[20], dst[16]); + SORT_CSWAP(dst[23], dst[19]); + SORT_CSWAP(dst[26], dst[25]); + SORT_CSWAP(dst[30], dst[29]); + SORT_CSWAP(dst[28], dst[24]); + SORT_CSWAP(dst[31], dst[27]); + SORT_CSWAP(dst[5], dst[1]); + SORT_CSWAP(dst[6], dst[2]); + SORT_CSWAP(dst[13], dst[9]); + SORT_CSWAP(dst[14], dst[10]); + SORT_CSWAP(dst[8], dst[0]); + SORT_CSWAP(dst[15], dst[7]); + SORT_CSWAP(dst[21], dst[17]); + SORT_CSWAP(dst[22], dst[18]); + SORT_CSWAP(dst[29], dst[25]); + SORT_CSWAP(dst[30], dst[26]); + SORT_CSWAP(dst[24], dst[16]); + SORT_CSWAP(dst[31], dst[23]); + SORT_CSWAP(dst[4], dst[1]); + SORT_CSWAP(dst[6], dst[3]); + SORT_CSWAP(dst[12], dst[9]); + SORT_CSWAP(dst[14], dst[11]); + SORT_CSWAP(dst[20], dst[17]); + SORT_CSWAP(dst[22], dst[19]); + SORT_CSWAP(dst[28], dst[25]); + SORT_CSWAP(dst[30], dst[27]); + SORT_CSWAP(dst[16], dst[0]); + SORT_CSWAP(dst[31], dst[15]); + SORT_CSWAP(dst[4], dst[2]); + SORT_CSWAP(dst[5], dst[3]); + SORT_CSWAP(dst[12], dst[10]); + SORT_CSWAP(dst[13], dst[11]); + SORT_CSWAP(dst[9], dst[1]); + SORT_CSWAP(dst[14], dst[6]); + SORT_CSWAP(dst[20], dst[18]); + SORT_CSWAP(dst[21], dst[19]); + SORT_CSWAP(dst[28], dst[26]); + SORT_CSWAP(dst[29], dst[27]); + SORT_CSWAP(dst[25], dst[17]); + SORT_CSWAP(dst[30], dst[22]); + SORT_CSWAP(dst[4], dst[3]); + SORT_CSWAP(dst[12], dst[11]); + SORT_CSWAP(dst[8], dst[1]); + SORT_CSWAP(dst[10], dst[2]); + SORT_CSWAP(dst[13], dst[5]); + SORT_CSWAP(dst[14], dst[7]); + SORT_CSWAP(dst[20], dst[19]); + SORT_CSWAP(dst[28], dst[27]); + SORT_CSWAP(dst[24], dst[17]); + SORT_CSWAP(dst[26], dst[18]); + SORT_CSWAP(dst[29], dst[21]); + SORT_CSWAP(dst[30], dst[23]); + SORT_CSWAP(dst[11], dst[3]); + SORT_CSWAP(dst[8], dst[2]); + SORT_CSWAP(dst[12], dst[4]); + SORT_CSWAP(dst[13], dst[7]); + SORT_CSWAP(dst[27], dst[19]); + SORT_CSWAP(dst[24], dst[18]); + SORT_CSWAP(dst[28], dst[20]); + SORT_CSWAP(dst[29], dst[23]); + SORT_CSWAP(dst[17], dst[1]); + SORT_CSWAP(dst[30], dst[14]); + SORT_CSWAP(dst[10], dst[3]); + SORT_CSWAP(dst[12], dst[5]); + SORT_CSWAP(dst[26], dst[19]); + SORT_CSWAP(dst[28], dst[21]); + SORT_CSWAP(dst[16], dst[1]); + SORT_CSWAP(dst[18], dst[2]); + SORT_CSWAP(dst[29], dst[13]); + SORT_CSWAP(dst[30], dst[15]); + SORT_CSWAP(dst[9], dst[3]); + SORT_CSWAP(dst[12], dst[6]); + SORT_CSWAP(dst[25], dst[19]); + SORT_CSWAP(dst[28], dst[22]); + SORT_CSWAP(dst[16], dst[2]); + SORT_CSWAP(dst[29], dst[15]); + SORT_CSWAP(dst[8], dst[3]); + SORT_CSWAP(dst[12], dst[7]); + SORT_CSWAP(dst[9], dst[5]); + SORT_CSWAP(dst[10], dst[6]); + SORT_CSWAP(dst[24], dst[19]); + SORT_CSWAP(dst[28], dst[23]); + SORT_CSWAP(dst[25], dst[21]); + SORT_CSWAP(dst[26], dst[22]); + SORT_CSWAP(dst[8], dst[4]); + SORT_CSWAP(dst[11], dst[7]); + SORT_CSWAP(dst[24], dst[20]); + SORT_CSWAP(dst[27], dst[23]); + SORT_CSWAP(dst[19], dst[3]); + SORT_CSWAP(dst[28], dst[12]); + SORT_CSWAP(dst[8], dst[5]); + SORT_CSWAP(dst[10], dst[7]); + SORT_CSWAP(dst[24], dst[21]); + SORT_CSWAP(dst[26], dst[23]); + SORT_CSWAP(dst[18], dst[3]); + SORT_CSWAP(dst[20], dst[4]); + SORT_CSWAP(dst[27], dst[11]); + SORT_CSWAP(dst[28], dst[13]); + SORT_CSWAP(dst[8], dst[6]); + SORT_CSWAP(dst[9], dst[7]); + SORT_CSWAP(dst[24], dst[22]); + SORT_CSWAP(dst[25], dst[23]); + SORT_CSWAP(dst[17], dst[3]); + SORT_CSWAP(dst[21], dst[5]); + SORT_CSWAP(dst[26], dst[10]); + SORT_CSWAP(dst[28], dst[14]); + SORT_CSWAP(dst[8], dst[7]); + SORT_CSWAP(dst[24], dst[23]); + SORT_CSWAP(dst[16], dst[3]); + SORT_CSWAP(dst[20], dst[5]); + SORT_CSWAP(dst[22], dst[6]); + SORT_CSWAP(dst[25], dst[9]); + SORT_CSWAP(dst[26], dst[11]); + SORT_CSWAP(dst[28], dst[15]); + SORT_CSWAP(dst[23], dst[7]); + SORT_CSWAP(dst[20], dst[6]); + SORT_CSWAP(dst[16], dst[4]); + SORT_CSWAP(dst[17], dst[5]); + SORT_CSWAP(dst[24], dst[8]); + SORT_CSWAP(dst[25], dst[11]); + SORT_CSWAP(dst[26], dst[14]); + SORT_CSWAP(dst[27], dst[15]); + SORT_CSWAP(dst[22], dst[7]); + SORT_CSWAP(dst[16], dst[5]); + SORT_CSWAP(dst[18], dst[6]); + SORT_CSWAP(dst[24], dst[9]); + SORT_CSWAP(dst[25], dst[13]); + SORT_CSWAP(dst[26], dst[15]); + SORT_CSWAP(dst[21], dst[7]); + SORT_CSWAP(dst[16], dst[6]); + SORT_CSWAP(dst[24], dst[10]); + SORT_CSWAP(dst[25], dst[15]); + SORT_CSWAP(dst[20], dst[7]); + SORT_CSWAP(dst[24], dst[11]); + SORT_CSWAP(dst[19], dst[7]); + SORT_CSWAP(dst[24], dst[12]); + SORT_CSWAP(dst[18], dst[7]); + SORT_CSWAP(dst[24], dst[13]); + SORT_CSWAP(dst[19], dst[11]); + SORT_CSWAP(dst[20], dst[12]); + SORT_CSWAP(dst[17], dst[7]); + SORT_CSWAP(dst[24], dst[14]); + SORT_CSWAP(dst[18], dst[10]); + SORT_CSWAP(dst[21], dst[13]); + SORT_CSWAP(dst[16], dst[7]); + SORT_CSWAP(dst[24], dst[15]); + SORT_CSWAP(dst[17], dst[9]); + SORT_CSWAP(dst[18], dst[11]); + SORT_CSWAP(dst[20], dst[13]); + SORT_CSWAP(dst[22], dst[14]); + SORT_CSWAP(dst[16], dst[8]); + SORT_CSWAP(dst[17], dst[11]); + SORT_CSWAP(dst[23], dst[15]); + SORT_CSWAP(dst[20], dst[14]); + SORT_CSWAP(dst[16], dst[9]); + SORT_CSWAP(dst[22], dst[15]); + SORT_CSWAP(dst[17], dst[13]); + SORT_CSWAP(dst[18], dst[14]); + SORT_CSWAP(dst[16], dst[10]); + SORT_CSWAP(dst[21], dst[15]); + SORT_CSWAP(dst[16], dst[11]); + SORT_CSWAP(dst[20], dst[15]); + SORT_CSWAP(dst[16], dst[12]); + SORT_CSWAP(dst[19], dst[15]); + SORT_CSWAP(dst[16], dst[13]); + SORT_CSWAP(dst[18], dst[15]); + SORT_CSWAP(dst[16], dst[14]); + SORT_CSWAP(dst[17], dst[15]); + SORT_CSWAP(dst[16], dst[15]); +} + +#define BITONIC_SORT SORT_MAKE_STR(bitonic_sort) +void BITONIC_SORT(SORT_TYPE *dst, const size_t size); +#define BITONIC_SORT_REVERSE SORT_MAKE_STR(bitonic_sort_reverse) +void BITONIC_SORT_REVERSE(SORT_TYPE *dst, const size_t size); + +#define BITONIC_MERGE SORT_MAKE_STR(bitonic_merge) +void BITONIC_MERGE(SORT_TYPE *dst, const size_t size) { + size_t m, i, j; + + if (size <= 1) { + return; + } + + m = 1 << (63 - CLZ(size - 1)); + j = m; + + for (i = 0; i < size - m; ++i, ++j) { + SORT_CSWAP(dst[i], dst[j]); + } + + BITONIC_MERGE(dst, m); + BITONIC_MERGE(dst + m, size - m); +} + +#define BITONIC_MERGE_REVERSE SORT_MAKE_STR(bitonic_merge_reverse) +void BITONIC_MERGE_REVERSE(SORT_TYPE *dst, const size_t size) { + size_t m, i, j; + + if (size <= 1) { + return; + } + + m = 1 << (63 - CLZ(size - 1)); + j = m; + + for (i = 0; i < size - m; ++i, ++j) { + SORT_CSWAP(dst[j], dst[i]); + } + + BITONIC_MERGE_REVERSE(dst, m); + BITONIC_MERGE_REVERSE(dst + m, size - m); +} + + +void BITONIC_SORT(SORT_TYPE *dst, const size_t size) { + switch (size) { + case 0: + case 1: + break; + + case 2: + BITONIC_SORT_2(dst); + break; + + case 3: + BITONIC_SORT_3(dst); + break; + + case 4: + BITONIC_SORT_4(dst); + break; + + case 5: + BITONIC_SORT_5(dst); + break; + + case 6: + BITONIC_SORT_6(dst); + break; + + case 7: + BITONIC_SORT_7(dst); + break; + + case 8: + BITONIC_SORT_8(dst); + break; + + case 9: + BITONIC_SORT_9(dst); + break; + + case 10: + BITONIC_SORT_10(dst); + break; + + case 11: + BITONIC_SORT_11(dst); + break; + + case 12: + BITONIC_SORT_12(dst); + break; + + case 13: + BITONIC_SORT_13(dst); + break; + + case 14: + BITONIC_SORT_14(dst); + break; + + case 15: + BITONIC_SORT_15(dst); + break; + + case 16: + BITONIC_SORT_16(dst); + break; + + case 17: + BITONIC_SORT_17(dst); + break; + + case 18: + BITONIC_SORT_18(dst); + break; + + case 19: + BITONIC_SORT_19(dst); + break; + + case 20: + BITONIC_SORT_20(dst); + break; + + case 21: + BITONIC_SORT_21(dst); + break; + + case 22: + BITONIC_SORT_22(dst); + break; + + case 23: + BITONIC_SORT_23(dst); + break; + + case 24: + BITONIC_SORT_24(dst); + break; + + case 25: + BITONIC_SORT_25(dst); + break; + + case 26: + BITONIC_SORT_26(dst); + break; + + case 27: + BITONIC_SORT_27(dst); + break; + + case 28: + BITONIC_SORT_28(dst); + break; + + case 29: + BITONIC_SORT_29(dst); + break; + + case 30: + BITONIC_SORT_30(dst); + break; + + case 31: + BITONIC_SORT_31(dst); + break; + + case 32: + BITONIC_SORT_32(dst); + break; + + default: + /*printf("Bitonic sort size = %ld", size);*/ + BITONIC_SORT_REVERSE(dst, (size >> 1)); + BITONIC_SORT(dst + (size >> 1), size - (size >> 1)); + BITONIC_MERGE(dst, size); + } +} + +void BITONIC_SORT_REVERSE(SORT_TYPE *dst, const size_t size) { + switch (size) { + case 0: + case 1: + break; + + case 2: + BITONIC_SORT_REVERSE_2(dst); + break; + + case 3: + BITONIC_SORT_REVERSE_3(dst); + break; + + case 4: + BITONIC_SORT_REVERSE_4(dst); + break; + + case 5: + BITONIC_SORT_REVERSE_5(dst); + break; + + case 6: + BITONIC_SORT_REVERSE_6(dst); + break; + + case 7: + BITONIC_SORT_REVERSE_7(dst); + break; + + case 8: + BITONIC_SORT_REVERSE_8(dst); + break; + + case 9: + BITONIC_SORT_REVERSE_9(dst); + break; + + case 10: + BITONIC_SORT_REVERSE_10(dst); + break; + + case 11: + BITONIC_SORT_REVERSE_11(dst); + break; + + case 12: + BITONIC_SORT_REVERSE_12(dst); + break; + + case 13: + BITONIC_SORT_REVERSE_13(dst); + break; + + case 14: + BITONIC_SORT_REVERSE_14(dst); + break; + + case 15: + BITONIC_SORT_REVERSE_15(dst); + break; + + case 16: + BITONIC_SORT_REVERSE_16(dst); + break; + + case 17: + BITONIC_SORT_REVERSE_17(dst); + break; + + case 18: + BITONIC_SORT_REVERSE_18(dst); + break; + + case 19: + BITONIC_SORT_REVERSE_19(dst); + break; + + case 20: + BITONIC_SORT_REVERSE_20(dst); + break; + + case 21: + BITONIC_SORT_REVERSE_21(dst); + break; + + case 22: + BITONIC_SORT_REVERSE_22(dst); + break; + + case 23: + BITONIC_SORT_REVERSE_23(dst); + break; + + case 24: + BITONIC_SORT_REVERSE_24(dst); + break; + + case 25: + BITONIC_SORT_REVERSE_25(dst); + break; + + case 26: + BITONIC_SORT_REVERSE_26(dst); + break; + + case 27: + BITONIC_SORT_REVERSE_27(dst); + break; + + case 28: + BITONIC_SORT_REVERSE_28(dst); + break; + + case 29: + BITONIC_SORT_REVERSE_29(dst); + break; + + case 30: + BITONIC_SORT_REVERSE_30(dst); + break; + + case 31: + BITONIC_SORT_REVERSE_31(dst); + break; + + case 32: + BITONIC_SORT_REVERSE_32(dst); + break; + + default: + /*printf("Bitonic sort reverse size = %ld", size);*/ + BITONIC_SORT(dst, (size >> 1)); + BITONIC_SORT_REVERSE(dst + (size >> 1), size - (size >> 1)); + BITONIC_MERGE_REVERSE(dst, size); + } +} diff --git a/demo.c b/demo.c index a818c7d..ae0b36e 100644 --- a/demo.c +++ b/demo.c @@ -12,6 +12,9 @@ but the one below is often faster for integer types. */ #define SORT_CMP(x, y) (x - y) +#define MAX(x,y) (((x) > (y) ? (x) : (y))) +#define MIN(x,y) (((x) < (y) ? (x) : (y))) +#define SORT_CSWAP(x, y) {SORT_TYPE _sort_swap_temp = MAX((x), (y)); (x) = MIN((x),(y)); (y) = _sort_swap_temp;} #include "sort.h" /* @@ -40,11 +43,11 @@ void verify(int64_t *dst, const int size) { for (i = 1; i < size; i++) { if (dst[i - 1] > dst[i]) { printf("Verify failed! at %d\n", i); - - for (i = i - 2; i < SIZE; i++) { - printf(" %lld", (long long) dst[i]); - } - + /* + for (i = i - 2; i < SIZE; i++) { + printf(" %lld", (long long) dst[i]); + } + */ printf("\n"); break; } @@ -155,7 +158,7 @@ void run_tests(void) { printf("selection sort time: %10.2f us per iteration\n", total_time / RUNS); srand48(SEED); total_time = 0.0; - + for (i = 0; i < RUNS; i++) { fill(arr, SIZE); memcpy(dst, arr, sizeof(int64_t) * SIZE); @@ -170,6 +173,20 @@ void run_tests(void) { srand48(SEED); total_time = 0.0; + for (i = 0; i < RUNS; i++) { + fill(arr, SIZE); + memcpy(dst, arr, sizeof(int64_t) * SIZE); + start_time = utime(); + sorter_bitonic_sort(dst, SIZE); + end_time = utime(); + total_time += end_time - start_time; + verify(dst, SIZE); + } + + printf("bitonic sort time: %10.2f us per iteration\n", total_time / RUNS); + srand48(SEED); + total_time = 0.0; + for (i = 0; i < RUNS; i++) { fill(arr, SIZE); memcpy(dst, arr, sizeof(int64_t) * SIZE); diff --git a/generate_bitonic_sort.py b/generate_bitonic_sort.py new file mode 100644 index 0000000..cb1d2e4 --- /dev/null +++ b/generate_bitonic_sort.py @@ -0,0 +1,127 @@ +import requests + +max_small_sort = 32 + +def generate_small_sort(n, rev=False): + s = "http://jgamble.ripco.net/cgi-bin/nw.cgi?inputs=%d&algorithm=best&output=svg" % n + ret = requests.get(s) + content = ret.text + lines = [l for l in content.split('\n') if l.startswith('[[')] + swps = "" + for _l in lines: + l = _l[1:-1] + ll = l.split(']') + for _t in ll: + if '[' not in _t: + continue + t = _t.split('[')[-1] + i, j = t.split(',') + if not rev: + swps += "\tSORT_CSWAP(dst[%s], dst[%s]);\n" % (i, j) + else: + swps += "\tSORT_CSWAP(dst[%s], dst[%s]);\n" % (j, i) + swps += '\n' + if not rev: + f = """ +#define BITONIC_SORT_%d SORT_MAKE_STR(bitonic_sort_%d) +static __inline void BITONIC_SORT_%d(SORT_TYPE *dst) { +%s} +""" % (n, n, n, swps[:-1]) + else: + f = """ +#define BITONIC_SORT_REVERSE_%d SORT_MAKE_STR(bitonic_sort_reverse_%d) +static __inline void BITONIC_SORT_REVERSE_%d(SORT_TYPE *dst) { +%s} +""" % (n, n, n, swps[:-1]) + return f + + +bitonic_sort_str = """ +#ifndef SORT_CSWAP + #define SORT_CSWAP(x, y) { if(SORT_CMP((x),(y)) > 0) {SORT_SWAP((x),(y));}} +#endif +""" +bitonic_sort_str += "\n".join(generate_small_sort(i) for i in range(2,max_small_sort+1)) +bitonic_sort_str += "\n".join(generate_small_sort(i, rev=True) for i in range(2,max_small_sort+1)) + +bitonic_sort_case = "\n".join(" case %d:\n BITONIC_SORT_%d(dst);\n break;" % (n, n) for n in range(2, max_small_sort+1)) +bitonic_sort_case_rev = "\n".join(" case %d:\n BITONIC_SORT_REVERSE_%d(dst);\n break;" % (n, n) for n in range(2, max_small_sort+1)) + +bitonic_sort_str += """ +#define BITONIC_SORT SORT_MAKE_STR(bitonic_sort) +void BITONIC_SORT(SORT_TYPE *dst, const size_t size); +#define BITONIC_SORT_REVERSE SORT_MAKE_STR(bitonic_sort_reverse) +void BITONIC_SORT_REVERSE(SORT_TYPE *dst, const size_t size); +""" + +bitonic_sort_str += """ +#define BITONIC_MERGE SORT_MAKE_STR(bitonic_merge) +void BITONIC_MERGE(SORT_TYPE *dst, const size_t size) { + size_t m, i, j; + if (size <= 1) { + return; + } + m = 1<<(63 - CLZ(size-1)); + j = m; + for (i = 0; i < size - m; ++i, ++j) { + SORT_CSWAP(dst[i], dst[j]); + } + BITONIC_MERGE(dst, m); + BITONIC_MERGE(dst + m, size - m); +} + +#define BITONIC_MERGE_REVERSE SORT_MAKE_STR(bitonic_merge_reverse) +void BITONIC_MERGE_REVERSE(SORT_TYPE *dst, const size_t size) { + size_t m, i, j; + if (size <= 1) { + return; + } + m = 1<<(63 - CLZ(size-1)); + j = m; + for (i = 0; i < size - m; ++i, ++j) { + SORT_CSWAP(dst[j], dst[i]); + } + BITONIC_MERGE_REVERSE(dst, m); + BITONIC_MERGE_REVERSE(dst + m, size - m); +} + +""" + +bitonic_sort_str += """ +void BITONIC_SORT(SORT_TYPE *dst, const size_t size) { + switch(size) { + case 0: + case 1: + break; +%s + default: + /*printf("Bitonic sort size = %%ld", size);*/ + BITONIC_SORT_REVERSE(dst, (size>>1)); + BITONIC_SORT(dst + (size>>1), size - (size>>1)); + BITONIC_MERGE(dst, size); + } +} +""" % (bitonic_sort_case) + +bitonic_sort_str += """ +void BITONIC_SORT_REVERSE(SORT_TYPE *dst, const size_t size) { + switch(size) { + case 0: + case 1: + break; +%s + default: + /*printf("Bitonic sort reverse size = %%ld", size);*/ + BITONIC_SORT(dst, (size>>1)); + BITONIC_SORT_REVERSE(dst + (size>>1), size - (size>>1)); + BITONIC_MERGE_REVERSE(dst, size); + } +} +""" % (bitonic_sort_case_rev) + +import os + +with open('bitonic_sort.h', 'w') as F: + F.write(bitonic_sort_str) + +os.system('astyle --options=astyle.options bitonic_sort.h') \ No newline at end of file diff --git a/sort.h b/sort.h index 393ca33..1bf93a9 100644 --- a/sort.h +++ b/sort.h @@ -31,7 +31,6 @@ #define SORT_SWAP(x,y) {SORT_TYPE _sort_swap_temp = (x); (x) = (y); (y) = _sort_swap_temp;} #endif - /* Common, type-agnostic functions and constants that we don't want to declare twice. */ #ifndef SORT_COMMON_H #define SORT_COMMON_H @@ -136,6 +135,14 @@ static __inline size_t rbnd(size_t len) { #define SORT_MAKE_STR1(x, y) SORT_CONCAT(x,y) #define SORT_MAKE_STR(x) SORT_MAKE_STR1(SORT_NAME,x) +#ifndef SMALL_SORT_BND +#define SMALL_SORT_BND 16 +#endif +#ifndef SMALL_SORT +#define SMALL_SORT BITONIC_SORT +/*#define SMALL_SORT BINARY_INSERTION_SORT*/ +#endif + #define BINARY_INSERTION_FIND SORT_MAKE_STR(binary_insertion_find) #define BINARY_INSERTION_SORT_START SORT_MAKE_STR(binary_insertion_sort_start) #define BINARY_INSERTION_SORT SORT_MAKE_STR(binary_insertion_sort) @@ -228,6 +235,8 @@ void SELECTION_SORT(SORT_TYPE *dst, const size_t size); void TIM_SORT(SORT_TYPE *dst, const size_t size); void BUBBLE_SORT(SORT_TYPE *dst, const size_t size); +#include "bitonic_sort.h" + /* Shell sort implementation based on Wikipedia article http://en.wikipedia.org/wiki/Shell_sort @@ -501,8 +510,8 @@ void MERGE_SORT_IN_PLACE(SORT_TYPE *dst, const size_t len) { return; } - if (len < 16) { - BINARY_INSERTION_SORT(dst, len); + if (len <= SMALL_SORT_BND) { + SMALL_SORT(dst, len); return; } @@ -596,8 +605,8 @@ void MERGE_SORT(SORT_TYPE *dst, const size_t size) { return; } - if (size < 16) { - BINARY_INSERTION_SORT(dst, size); + if (size <= SMALL_SORT_BND) { + SMALL_SORT(dst, size); return; } @@ -714,8 +723,8 @@ static void QUICK_SORT_RECURSIVE(SORT_TYPE *dst, const size_t left, const size_t return; } - if ((right - left + 1U) < 16U) { - BINARY_INSERTION_SORT(&dst[left], right - left + 1U); + if ((right - left + 1U) <= SMALL_SORT_BND) { + SMALL_SORT(&dst[left], right - left + 1U); return; } @@ -1298,7 +1307,7 @@ void TIM_SORT(SORT_TYPE *dst, const size_t size) { } if (size < 64) { - BINARY_INSERTION_SORT(dst, size); + SMALL_SORT(dst, size); return; } @@ -2316,7 +2325,7 @@ static void GRAIL_COMBINE_BLOCKS(SORT_TYPE *keys, SORT_TYPE *arr, int len, int L arr1 = arr + b * 2 * LL; NBlk = (b == M ? lrest : 2 * LL) / lblock; - BINARY_INSERTION_SORT(keys, NBlk + (b == M ? 1 : 0)); + SMALL_SORT(keys, NBlk + (b == M ? 1 : 0)); midkey = LL / lblock; for (u = 1; u < NBlk; u++) { @@ -2376,8 +2385,8 @@ static void GRAIL_COMMON_SORT(SORT_TYPE *arr, int Len, SORT_TYPE *extbuf, int LE int havebuf, chavebuf; long long s; - if (Len < 16) { - BINARY_INSERTION_SORT(arr, Len); + if (Len <= SMALL_SORT_BND) { + SMALL_SORT(arr, Len); return; } @@ -2442,7 +2451,7 @@ static void GRAIL_COMMON_SORT(SORT_TYPE *arr, int Len, SORT_TYPE *extbuf, int LE && lb <= LExtBuf ? extbuf : NULL); } - BINARY_INSERTION_SORT(arr, ptr); + SMALL_SORT(arr, ptr); GRAIL_MERGE_WITHOUT_BUFFER(arr, ptr, Len - ptr); } diff --git a/stresstest.c b/stresstest.c index 1de8d14..c944eef 100644 --- a/stresstest.c +++ b/stresstest.c @@ -220,6 +220,7 @@ int run_tests(int64_t *sizes, int sizes_cnt, int type) { TEST_SORT_H(selection_sort); TEST_SORT_H(bubble_sort); TEST_SORT_H(binary_insertion_sort); + TEST_SORT_H(bitonic_sort); } TEST_SORT_H(quick_sort); From b5f326a08f447d2199e0bc0c303c34b0f0656d6c Mon Sep 17 00:00:00 2001 From: DrMarkS Date: Sun, 11 Aug 2019 15:18:14 +0100 Subject: [PATCH 2/3] Placed routines for small sorting networks into sort.h. --- bitonic_sort.h | 6174 -------------------------------------- generate_bitonic_sort.py | 27 +- sort.h | 563 +++- 3 files changed, 585 insertions(+), 6179 deletions(-) delete mode 100755 bitonic_sort.h diff --git a/bitonic_sort.h b/bitonic_sort.h deleted file mode 100755 index 9e2d41e..0000000 --- a/bitonic_sort.h +++ /dev/null @@ -1,6174 +0,0 @@ - -#ifndef SORT_CSWAP -#define SORT_CSWAP(x, y) { if(SORT_CMP((x),(y)) > 0) {SORT_SWAP((x),(y));}} -#endif - -#define BITONIC_SORT_2 SORT_MAKE_STR(bitonic_sort_2) -static __inline void BITONIC_SORT_2(SORT_TYPE *dst) { - SORT_CSWAP(dst[0], dst[1]); -} - - -#define BITONIC_SORT_3 SORT_MAKE_STR(bitonic_sort_3) -static __inline void BITONIC_SORT_3(SORT_TYPE *dst) { - SORT_CSWAP(dst[1], dst[2]); - SORT_CSWAP(dst[0], dst[2]); - SORT_CSWAP(dst[0], dst[1]); -} - - -#define BITONIC_SORT_4 SORT_MAKE_STR(bitonic_sort_4) -static __inline void BITONIC_SORT_4(SORT_TYPE *dst) { - SORT_CSWAP(dst[0], dst[1]); - SORT_CSWAP(dst[2], dst[3]); - SORT_CSWAP(dst[0], dst[2]); - SORT_CSWAP(dst[1], dst[3]); - SORT_CSWAP(dst[1], dst[2]); -} - - -#define BITONIC_SORT_5 SORT_MAKE_STR(bitonic_sort_5) -static __inline void BITONIC_SORT_5(SORT_TYPE *dst) { - SORT_CSWAP(dst[0], dst[1]); - SORT_CSWAP(dst[3], dst[4]); - SORT_CSWAP(dst[2], dst[4]); - SORT_CSWAP(dst[2], dst[3]); - SORT_CSWAP(dst[1], dst[4]); - SORT_CSWAP(dst[0], dst[3]); - SORT_CSWAP(dst[0], dst[2]); - SORT_CSWAP(dst[1], dst[3]); - SORT_CSWAP(dst[1], dst[2]); -} - - -#define BITONIC_SORT_6 SORT_MAKE_STR(bitonic_sort_6) -static __inline void BITONIC_SORT_6(SORT_TYPE *dst) { - SORT_CSWAP(dst[1], dst[2]); - SORT_CSWAP(dst[4], dst[5]); - SORT_CSWAP(dst[0], dst[2]); - SORT_CSWAP(dst[3], dst[5]); - SORT_CSWAP(dst[0], dst[1]); - SORT_CSWAP(dst[3], dst[4]); - SORT_CSWAP(dst[2], dst[5]); - SORT_CSWAP(dst[0], dst[3]); - SORT_CSWAP(dst[1], dst[4]); - SORT_CSWAP(dst[2], dst[4]); - SORT_CSWAP(dst[1], dst[3]); - SORT_CSWAP(dst[2], dst[3]); -} - - -#define BITONIC_SORT_7 SORT_MAKE_STR(bitonic_sort_7) -static __inline void BITONIC_SORT_7(SORT_TYPE *dst) { - SORT_CSWAP(dst[1], dst[2]); - SORT_CSWAP(dst[3], dst[4]); - SORT_CSWAP(dst[5], dst[6]); - SORT_CSWAP(dst[0], dst[2]); - SORT_CSWAP(dst[3], dst[5]); - SORT_CSWAP(dst[4], dst[6]); - SORT_CSWAP(dst[0], dst[1]); - SORT_CSWAP(dst[4], dst[5]); - SORT_CSWAP(dst[2], dst[6]); - SORT_CSWAP(dst[0], dst[4]); - SORT_CSWAP(dst[1], dst[5]); - SORT_CSWAP(dst[0], dst[3]); - SORT_CSWAP(dst[2], dst[5]); - SORT_CSWAP(dst[1], dst[3]); - SORT_CSWAP(dst[2], dst[4]); - SORT_CSWAP(dst[2], dst[3]); -} - - -#define BITONIC_SORT_8 SORT_MAKE_STR(bitonic_sort_8) -static __inline void BITONIC_SORT_8(SORT_TYPE *dst) { - SORT_CSWAP(dst[0], dst[1]); - SORT_CSWAP(dst[2], dst[3]); - SORT_CSWAP(dst[4], dst[5]); - SORT_CSWAP(dst[6], dst[7]); - SORT_CSWAP(dst[0], dst[2]); - SORT_CSWAP(dst[1], dst[3]); - SORT_CSWAP(dst[4], dst[6]); - SORT_CSWAP(dst[5], dst[7]); - SORT_CSWAP(dst[1], dst[2]); - SORT_CSWAP(dst[5], dst[6]); - SORT_CSWAP(dst[0], dst[4]); - SORT_CSWAP(dst[3], dst[7]); - SORT_CSWAP(dst[1], dst[5]); - SORT_CSWAP(dst[2], dst[6]); - SORT_CSWAP(dst[1], dst[4]); - SORT_CSWAP(dst[3], dst[6]); - SORT_CSWAP(dst[2], dst[4]); - SORT_CSWAP(dst[3], dst[5]); - SORT_CSWAP(dst[3], dst[4]); -} - - -#define BITONIC_SORT_9 SORT_MAKE_STR(bitonic_sort_9) -static __inline void BITONIC_SORT_9(SORT_TYPE *dst) { - SORT_CSWAP(dst[0], dst[1]); - SORT_CSWAP(dst[3], dst[4]); - SORT_CSWAP(dst[6], dst[7]); - SORT_CSWAP(dst[1], dst[2]); - SORT_CSWAP(dst[4], dst[5]); - SORT_CSWAP(dst[7], dst[8]); - SORT_CSWAP(dst[0], dst[1]); - SORT_CSWAP(dst[3], dst[4]); - SORT_CSWAP(dst[6], dst[7]); - SORT_CSWAP(dst[2], dst[5]); - SORT_CSWAP(dst[0], dst[3]); - SORT_CSWAP(dst[1], dst[4]); - SORT_CSWAP(dst[5], dst[8]); - SORT_CSWAP(dst[3], dst[6]); - SORT_CSWAP(dst[4], dst[7]); - SORT_CSWAP(dst[2], dst[5]); - SORT_CSWAP(dst[0], dst[3]); - SORT_CSWAP(dst[1], dst[4]); - SORT_CSWAP(dst[5], dst[7]); - SORT_CSWAP(dst[2], dst[6]); - SORT_CSWAP(dst[1], dst[3]); - SORT_CSWAP(dst[4], dst[6]); - SORT_CSWAP(dst[2], dst[4]); - SORT_CSWAP(dst[5], dst[6]); - SORT_CSWAP(dst[2], dst[3]); -} - - -#define BITONIC_SORT_10 SORT_MAKE_STR(bitonic_sort_10) -static __inline void BITONIC_SORT_10(SORT_TYPE *dst) { - SORT_CSWAP(dst[4], dst[9]); - SORT_CSWAP(dst[3], dst[8]); - SORT_CSWAP(dst[2], dst[7]); - SORT_CSWAP(dst[1], dst[6]); - SORT_CSWAP(dst[0], dst[5]); - SORT_CSWAP(dst[1], dst[4]); - SORT_CSWAP(dst[6], dst[9]); - SORT_CSWAP(dst[0], dst[3]); - SORT_CSWAP(dst[5], dst[8]); - SORT_CSWAP(dst[0], dst[2]); - SORT_CSWAP(dst[3], dst[6]); - SORT_CSWAP(dst[7], dst[9]); - SORT_CSWAP(dst[0], dst[1]); - SORT_CSWAP(dst[2], dst[4]); - SORT_CSWAP(dst[5], dst[7]); - SORT_CSWAP(dst[8], dst[9]); - SORT_CSWAP(dst[1], dst[2]); - SORT_CSWAP(dst[4], dst[6]); - SORT_CSWAP(dst[7], dst[8]); - SORT_CSWAP(dst[3], dst[5]); - SORT_CSWAP(dst[2], dst[5]); - SORT_CSWAP(dst[6], dst[8]); - SORT_CSWAP(dst[1], dst[3]); - SORT_CSWAP(dst[4], dst[7]); - SORT_CSWAP(dst[2], dst[3]); - SORT_CSWAP(dst[6], dst[7]); - SORT_CSWAP(dst[3], dst[4]); - SORT_CSWAP(dst[5], dst[6]); - SORT_CSWAP(dst[4], dst[5]); -} - - -#define BITONIC_SORT_11 SORT_MAKE_STR(bitonic_sort_11) -static __inline void BITONIC_SORT_11(SORT_TYPE *dst) { - SORT_CSWAP(dst[0], dst[1]); - SORT_CSWAP(dst[2], dst[3]); - SORT_CSWAP(dst[4], dst[5]); - SORT_CSWAP(dst[6], dst[7]); - SORT_CSWAP(dst[8], dst[9]); - SORT_CSWAP(dst[1], dst[3]); - SORT_CSWAP(dst[5], dst[7]); - SORT_CSWAP(dst[0], dst[2]); - SORT_CSWAP(dst[4], dst[6]); - SORT_CSWAP(dst[8], dst[10]); - SORT_CSWAP(dst[1], dst[2]); - SORT_CSWAP(dst[5], dst[6]); - SORT_CSWAP(dst[9], dst[10]); - SORT_CSWAP(dst[0], dst[4]); - SORT_CSWAP(dst[3], dst[7]); - SORT_CSWAP(dst[1], dst[5]); - SORT_CSWAP(dst[6], dst[10]); - SORT_CSWAP(dst[4], dst[8]); - SORT_CSWAP(dst[5], dst[9]); - SORT_CSWAP(dst[2], dst[6]); - SORT_CSWAP(dst[0], dst[4]); - SORT_CSWAP(dst[3], dst[8]); - SORT_CSWAP(dst[1], dst[5]); - SORT_CSWAP(dst[6], dst[10]); - SORT_CSWAP(dst[2], dst[3]); - SORT_CSWAP(dst[8], dst[9]); - SORT_CSWAP(dst[1], dst[4]); - SORT_CSWAP(dst[7], dst[10]); - SORT_CSWAP(dst[3], dst[5]); - SORT_CSWAP(dst[6], dst[8]); - SORT_CSWAP(dst[2], dst[4]); - SORT_CSWAP(dst[7], dst[9]); - SORT_CSWAP(dst[5], dst[6]); - SORT_CSWAP(dst[3], dst[4]); - SORT_CSWAP(dst[7], dst[8]); -} - - -#define BITONIC_SORT_12 SORT_MAKE_STR(bitonic_sort_12) -static __inline void BITONIC_SORT_12(SORT_TYPE *dst) { - SORT_CSWAP(dst[0], dst[1]); - SORT_CSWAP(dst[2], dst[3]); - SORT_CSWAP(dst[4], dst[5]); - SORT_CSWAP(dst[6], dst[7]); - SORT_CSWAP(dst[8], dst[9]); - SORT_CSWAP(dst[10], dst[11]); - SORT_CSWAP(dst[1], dst[3]); - SORT_CSWAP(dst[5], dst[7]); - SORT_CSWAP(dst[9], dst[11]); - SORT_CSWAP(dst[0], dst[2]); - SORT_CSWAP(dst[4], dst[6]); - SORT_CSWAP(dst[8], dst[10]); - SORT_CSWAP(dst[1], dst[2]); - SORT_CSWAP(dst[5], dst[6]); - SORT_CSWAP(dst[9], dst[10]); - SORT_CSWAP(dst[0], dst[4]); - SORT_CSWAP(dst[7], dst[11]); - SORT_CSWAP(dst[1], dst[5]); - SORT_CSWAP(dst[6], dst[10]); - SORT_CSWAP(dst[3], dst[7]); - SORT_CSWAP(dst[4], dst[8]); - SORT_CSWAP(dst[5], dst[9]); - SORT_CSWAP(dst[2], dst[6]); - SORT_CSWAP(dst[0], dst[4]); - SORT_CSWAP(dst[7], dst[11]); - SORT_CSWAP(dst[3], dst[8]); - SORT_CSWAP(dst[1], dst[5]); - SORT_CSWAP(dst[6], dst[10]); - SORT_CSWAP(dst[2], dst[3]); - SORT_CSWAP(dst[8], dst[9]); - SORT_CSWAP(dst[1], dst[4]); - SORT_CSWAP(dst[7], dst[10]); - SORT_CSWAP(dst[3], dst[5]); - SORT_CSWAP(dst[6], dst[8]); - SORT_CSWAP(dst[2], dst[4]); - SORT_CSWAP(dst[7], dst[9]); - SORT_CSWAP(dst[5], dst[6]); - SORT_CSWAP(dst[3], dst[4]); - SORT_CSWAP(dst[7], dst[8]); -} - - -#define BITONIC_SORT_13 SORT_MAKE_STR(bitonic_sort_13) -static __inline void BITONIC_SORT_13(SORT_TYPE *dst) { - SORT_CSWAP(dst[1], dst[7]); - SORT_CSWAP(dst[9], dst[11]); - SORT_CSWAP(dst[3], dst[4]); - SORT_CSWAP(dst[5], dst[8]); - SORT_CSWAP(dst[0], dst[12]); - SORT_CSWAP(dst[2], dst[6]); - SORT_CSWAP(dst[0], dst[1]); - SORT_CSWAP(dst[2], dst[3]); - SORT_CSWAP(dst[4], dst[6]); - SORT_CSWAP(dst[8], dst[11]); - SORT_CSWAP(dst[7], dst[12]); - SORT_CSWAP(dst[5], dst[9]); - SORT_CSWAP(dst[0], dst[2]); - SORT_CSWAP(dst[3], dst[7]); - SORT_CSWAP(dst[10], dst[11]); - SORT_CSWAP(dst[1], dst[4]); - SORT_CSWAP(dst[6], dst[12]); - SORT_CSWAP(dst[7], dst[8]); - SORT_CSWAP(dst[11], dst[12]); - SORT_CSWAP(dst[4], dst[9]); - SORT_CSWAP(dst[6], dst[10]); - SORT_CSWAP(dst[3], dst[4]); - SORT_CSWAP(dst[5], dst[6]); - SORT_CSWAP(dst[8], dst[9]); - SORT_CSWAP(dst[10], dst[11]); - SORT_CSWAP(dst[1], dst[7]); - SORT_CSWAP(dst[2], dst[6]); - SORT_CSWAP(dst[9], dst[11]); - SORT_CSWAP(dst[1], dst[3]); - SORT_CSWAP(dst[4], dst[7]); - SORT_CSWAP(dst[8], dst[10]); - SORT_CSWAP(dst[0], dst[5]); - SORT_CSWAP(dst[2], dst[5]); - SORT_CSWAP(dst[6], dst[8]); - SORT_CSWAP(dst[9], dst[10]); - SORT_CSWAP(dst[1], dst[2]); - SORT_CSWAP(dst[3], dst[5]); - SORT_CSWAP(dst[7], dst[8]); - SORT_CSWAP(dst[4], dst[6]); - SORT_CSWAP(dst[2], dst[3]); - SORT_CSWAP(dst[4], dst[5]); - SORT_CSWAP(dst[6], dst[7]); - SORT_CSWAP(dst[8], dst[9]); - SORT_CSWAP(dst[3], dst[4]); - SORT_CSWAP(dst[5], dst[6]); -} - - -#define BITONIC_SORT_14 SORT_MAKE_STR(bitonic_sort_14) -static __inline void BITONIC_SORT_14(SORT_TYPE *dst) { - SORT_CSWAP(dst[0], dst[1]); - SORT_CSWAP(dst[2], dst[3]); - SORT_CSWAP(dst[4], dst[5]); - SORT_CSWAP(dst[6], dst[7]); - SORT_CSWAP(dst[8], dst[9]); - SORT_CSWAP(dst[10], dst[11]); - SORT_CSWAP(dst[12], dst[13]); - SORT_CSWAP(dst[0], dst[2]); - SORT_CSWAP(dst[4], dst[6]); - SORT_CSWAP(dst[8], dst[10]); - SORT_CSWAP(dst[1], dst[3]); - SORT_CSWAP(dst[5], dst[7]); - SORT_CSWAP(dst[9], dst[11]); - SORT_CSWAP(dst[0], dst[4]); - SORT_CSWAP(dst[8], dst[12]); - SORT_CSWAP(dst[1], dst[5]); - SORT_CSWAP(dst[9], dst[13]); - SORT_CSWAP(dst[2], dst[6]); - SORT_CSWAP(dst[3], dst[7]); - SORT_CSWAP(dst[0], dst[8]); - SORT_CSWAP(dst[1], dst[9]); - SORT_CSWAP(dst[2], dst[10]); - SORT_CSWAP(dst[3], dst[11]); - SORT_CSWAP(dst[4], dst[12]); - SORT_CSWAP(dst[5], dst[13]); - SORT_CSWAP(dst[5], dst[10]); - SORT_CSWAP(dst[6], dst[9]); - SORT_CSWAP(dst[3], dst[12]); - SORT_CSWAP(dst[7], dst[11]); - SORT_CSWAP(dst[1], dst[2]); - SORT_CSWAP(dst[4], dst[8]); - SORT_CSWAP(dst[1], dst[4]); - SORT_CSWAP(dst[7], dst[13]); - SORT_CSWAP(dst[2], dst[8]); - SORT_CSWAP(dst[5], dst[6]); - SORT_CSWAP(dst[9], dst[10]); - SORT_CSWAP(dst[2], dst[4]); - SORT_CSWAP(dst[11], dst[13]); - SORT_CSWAP(dst[3], dst[8]); - SORT_CSWAP(dst[7], dst[12]); - SORT_CSWAP(dst[6], dst[8]); - SORT_CSWAP(dst[10], dst[12]); - SORT_CSWAP(dst[3], dst[5]); - SORT_CSWAP(dst[7], dst[9]); - SORT_CSWAP(dst[3], dst[4]); - SORT_CSWAP(dst[5], dst[6]); - SORT_CSWAP(dst[7], dst[8]); - SORT_CSWAP(dst[9], dst[10]); - SORT_CSWAP(dst[11], dst[12]); - SORT_CSWAP(dst[6], dst[7]); - SORT_CSWAP(dst[8], dst[9]); -} - - -#define BITONIC_SORT_15 SORT_MAKE_STR(bitonic_sort_15) -static __inline void BITONIC_SORT_15(SORT_TYPE *dst) { - SORT_CSWAP(dst[0], dst[1]); - SORT_CSWAP(dst[2], dst[3]); - SORT_CSWAP(dst[4], dst[5]); - SORT_CSWAP(dst[6], dst[7]); - SORT_CSWAP(dst[8], dst[9]); - SORT_CSWAP(dst[10], dst[11]); - SORT_CSWAP(dst[12], dst[13]); - SORT_CSWAP(dst[0], dst[2]); - SORT_CSWAP(dst[4], dst[6]); - SORT_CSWAP(dst[8], dst[10]); - SORT_CSWAP(dst[12], dst[14]); - SORT_CSWAP(dst[1], dst[3]); - SORT_CSWAP(dst[5], dst[7]); - SORT_CSWAP(dst[9], dst[11]); - SORT_CSWAP(dst[0], dst[4]); - SORT_CSWAP(dst[8], dst[12]); - SORT_CSWAP(dst[1], dst[5]); - SORT_CSWAP(dst[9], dst[13]); - SORT_CSWAP(dst[2], dst[6]); - SORT_CSWAP(dst[10], dst[14]); - SORT_CSWAP(dst[3], dst[7]); - SORT_CSWAP(dst[0], dst[8]); - SORT_CSWAP(dst[1], dst[9]); - SORT_CSWAP(dst[2], dst[10]); - SORT_CSWAP(dst[3], dst[11]); - SORT_CSWAP(dst[4], dst[12]); - SORT_CSWAP(dst[5], dst[13]); - SORT_CSWAP(dst[6], dst[14]); - SORT_CSWAP(dst[5], dst[10]); - SORT_CSWAP(dst[6], dst[9]); - SORT_CSWAP(dst[3], dst[12]); - SORT_CSWAP(dst[13], dst[14]); - SORT_CSWAP(dst[7], dst[11]); - SORT_CSWAP(dst[1], dst[2]); - SORT_CSWAP(dst[4], dst[8]); - SORT_CSWAP(dst[1], dst[4]); - SORT_CSWAP(dst[7], dst[13]); - SORT_CSWAP(dst[2], dst[8]); - SORT_CSWAP(dst[11], dst[14]); - SORT_CSWAP(dst[5], dst[6]); - SORT_CSWAP(dst[9], dst[10]); - SORT_CSWAP(dst[2], dst[4]); - SORT_CSWAP(dst[11], dst[13]); - SORT_CSWAP(dst[3], dst[8]); - SORT_CSWAP(dst[7], dst[12]); - SORT_CSWAP(dst[6], dst[8]); - SORT_CSWAP(dst[10], dst[12]); - SORT_CSWAP(dst[3], dst[5]); - SORT_CSWAP(dst[7], dst[9]); - SORT_CSWAP(dst[3], dst[4]); - SORT_CSWAP(dst[5], dst[6]); - SORT_CSWAP(dst[7], dst[8]); - SORT_CSWAP(dst[9], dst[10]); - SORT_CSWAP(dst[11], dst[12]); - SORT_CSWAP(dst[6], dst[7]); - SORT_CSWAP(dst[8], dst[9]); -} - - -#define BITONIC_SORT_16 SORT_MAKE_STR(bitonic_sort_16) -static __inline void BITONIC_SORT_16(SORT_TYPE *dst) { - SORT_CSWAP(dst[0], dst[1]); - SORT_CSWAP(dst[2], dst[3]); - SORT_CSWAP(dst[4], dst[5]); - SORT_CSWAP(dst[6], dst[7]); - SORT_CSWAP(dst[8], dst[9]); - SORT_CSWAP(dst[10], dst[11]); - SORT_CSWAP(dst[12], dst[13]); - SORT_CSWAP(dst[14], dst[15]); - SORT_CSWAP(dst[0], dst[2]); - SORT_CSWAP(dst[4], dst[6]); - SORT_CSWAP(dst[8], dst[10]); - SORT_CSWAP(dst[12], dst[14]); - SORT_CSWAP(dst[1], dst[3]); - SORT_CSWAP(dst[5], dst[7]); - SORT_CSWAP(dst[9], dst[11]); - SORT_CSWAP(dst[13], dst[15]); - SORT_CSWAP(dst[0], dst[4]); - SORT_CSWAP(dst[8], dst[12]); - SORT_CSWAP(dst[1], dst[5]); - SORT_CSWAP(dst[9], dst[13]); - SORT_CSWAP(dst[2], dst[6]); - SORT_CSWAP(dst[10], dst[14]); - SORT_CSWAP(dst[3], dst[7]); - SORT_CSWAP(dst[11], dst[15]); - SORT_CSWAP(dst[0], dst[8]); - SORT_CSWAP(dst[1], dst[9]); - SORT_CSWAP(dst[2], dst[10]); - SORT_CSWAP(dst[3], dst[11]); - SORT_CSWAP(dst[4], dst[12]); - SORT_CSWAP(dst[5], dst[13]); - SORT_CSWAP(dst[6], dst[14]); - SORT_CSWAP(dst[7], dst[15]); - SORT_CSWAP(dst[5], dst[10]); - SORT_CSWAP(dst[6], dst[9]); - SORT_CSWAP(dst[3], dst[12]); - SORT_CSWAP(dst[13], dst[14]); - SORT_CSWAP(dst[7], dst[11]); - SORT_CSWAP(dst[1], dst[2]); - SORT_CSWAP(dst[4], dst[8]); - SORT_CSWAP(dst[1], dst[4]); - SORT_CSWAP(dst[7], dst[13]); - SORT_CSWAP(dst[2], dst[8]); - SORT_CSWAP(dst[11], dst[14]); - SORT_CSWAP(dst[5], dst[6]); - SORT_CSWAP(dst[9], dst[10]); - SORT_CSWAP(dst[2], dst[4]); - SORT_CSWAP(dst[11], dst[13]); - SORT_CSWAP(dst[3], dst[8]); - SORT_CSWAP(dst[7], dst[12]); - SORT_CSWAP(dst[6], dst[8]); - SORT_CSWAP(dst[10], dst[12]); - SORT_CSWAP(dst[3], dst[5]); - SORT_CSWAP(dst[7], dst[9]); - SORT_CSWAP(dst[3], dst[4]); - SORT_CSWAP(dst[5], dst[6]); - SORT_CSWAP(dst[7], dst[8]); - SORT_CSWAP(dst[9], dst[10]); - SORT_CSWAP(dst[11], dst[12]); - SORT_CSWAP(dst[6], dst[7]); - SORT_CSWAP(dst[8], dst[9]); -} - - -#define BITONIC_SORT_17 SORT_MAKE_STR(bitonic_sort_17) -static __inline void BITONIC_SORT_17(SORT_TYPE *dst) { - SORT_CSWAP(dst[0], dst[1]); - SORT_CSWAP(dst[2], dst[3]); - SORT_CSWAP(dst[4], dst[5]); - SORT_CSWAP(dst[6], dst[7]); - SORT_CSWAP(dst[8], dst[9]); - SORT_CSWAP(dst[10], dst[11]); - SORT_CSWAP(dst[12], dst[13]); - SORT_CSWAP(dst[15], dst[16]); - SORT_CSWAP(dst[0], dst[2]); - SORT_CSWAP(dst[1], dst[3]); - SORT_CSWAP(dst[4], dst[6]); - SORT_CSWAP(dst[5], dst[7]); - SORT_CSWAP(dst[8], dst[10]); - SORT_CSWAP(dst[9], dst[11]); - SORT_CSWAP(dst[14], dst[16]); - SORT_CSWAP(dst[1], dst[2]); - SORT_CSWAP(dst[5], dst[6]); - SORT_CSWAP(dst[0], dst[4]); - SORT_CSWAP(dst[3], dst[7]); - SORT_CSWAP(dst[9], dst[10]); - SORT_CSWAP(dst[14], dst[15]); - SORT_CSWAP(dst[13], dst[16]); - SORT_CSWAP(dst[1], dst[5]); - SORT_CSWAP(dst[2], dst[6]); - SORT_CSWAP(dst[12], dst[15]); - SORT_CSWAP(dst[11], dst[16]); - SORT_CSWAP(dst[1], dst[4]); - SORT_CSWAP(dst[3], dst[6]); - SORT_CSWAP(dst[12], dst[14]); - SORT_CSWAP(dst[13], dst[15]); - SORT_CSWAP(dst[7], dst[16]); - SORT_CSWAP(dst[2], dst[4]); - SORT_CSWAP(dst[3], dst[5]); - SORT_CSWAP(dst[13], dst[14]); - SORT_CSWAP(dst[10], dst[15]); - SORT_CSWAP(dst[3], dst[4]); - SORT_CSWAP(dst[8], dst[13]); - SORT_CSWAP(dst[9], dst[14]); - SORT_CSWAP(dst[11], dst[15]); - SORT_CSWAP(dst[8], dst[12]); - SORT_CSWAP(dst[9], dst[13]); - SORT_CSWAP(dst[11], dst[14]); - SORT_CSWAP(dst[6], dst[15]); - SORT_CSWAP(dst[9], dst[12]); - SORT_CSWAP(dst[10], dst[13]); - SORT_CSWAP(dst[5], dst[14]); - SORT_CSWAP(dst[7], dst[15]); - SORT_CSWAP(dst[10], dst[12]); - SORT_CSWAP(dst[11], dst[13]); - SORT_CSWAP(dst[0], dst[9]); - SORT_CSWAP(dst[7], dst[14]); - SORT_CSWAP(dst[11], dst[12]); - SORT_CSWAP(dst[0], dst[8]); - SORT_CSWAP(dst[1], dst[10]); - SORT_CSWAP(dst[4], dst[13]); - SORT_CSWAP(dst[1], dst[9]); - SORT_CSWAP(dst[2], dst[11]); - SORT_CSWAP(dst[3], dst[12]); - SORT_CSWAP(dst[5], dst[13]); - SORT_CSWAP(dst[1], dst[8]); - SORT_CSWAP(dst[3], dst[11]); - SORT_CSWAP(dst[2], dst[9]); - SORT_CSWAP(dst[6], dst[13]); - SORT_CSWAP(dst[2], dst[8]); - SORT_CSWAP(dst[3], dst[10]); - SORT_CSWAP(dst[7], dst[13]); - SORT_CSWAP(dst[6], dst[11]); - SORT_CSWAP(dst[3], dst[9]); - SORT_CSWAP(dst[5], dst[10]); - SORT_CSWAP(dst[7], dst[12]); - SORT_CSWAP(dst[3], dst[8]); - SORT_CSWAP(dst[4], dst[9]); - SORT_CSWAP(dst[7], dst[11]); - SORT_CSWAP(dst[4], dst[8]); - SORT_CSWAP(dst[5], dst[9]); - SORT_CSWAP(dst[7], dst[10]); - SORT_CSWAP(dst[5], dst[8]); - SORT_CSWAP(dst[6], dst[9]); - SORT_CSWAP(dst[6], dst[8]); - SORT_CSWAP(dst[7], dst[9]); - SORT_CSWAP(dst[7], dst[8]); -} - - -#define BITONIC_SORT_18 SORT_MAKE_STR(bitonic_sort_18) -static __inline void BITONIC_SORT_18(SORT_TYPE *dst) { - SORT_CSWAP(dst[0], dst[1]); - SORT_CSWAP(dst[2], dst[3]); - SORT_CSWAP(dst[4], dst[5]); - SORT_CSWAP(dst[7], dst[8]); - SORT_CSWAP(dst[9], dst[10]); - SORT_CSWAP(dst[11], dst[12]); - SORT_CSWAP(dst[13], dst[14]); - SORT_CSWAP(dst[16], dst[17]); - SORT_CSWAP(dst[0], dst[2]); - SORT_CSWAP(dst[1], dst[3]); - SORT_CSWAP(dst[6], dst[8]); - SORT_CSWAP(dst[9], dst[11]); - SORT_CSWAP(dst[10], dst[12]); - SORT_CSWAP(dst[15], dst[17]); - SORT_CSWAP(dst[1], dst[2]); - SORT_CSWAP(dst[6], dst[7]); - SORT_CSWAP(dst[5], dst[8]); - SORT_CSWAP(dst[10], dst[11]); - SORT_CSWAP(dst[15], dst[16]); - SORT_CSWAP(dst[14], dst[17]); - SORT_CSWAP(dst[4], dst[7]); - SORT_CSWAP(dst[3], dst[8]); - SORT_CSWAP(dst[13], dst[16]); - SORT_CSWAP(dst[12], dst[17]); - SORT_CSWAP(dst[4], dst[6]); - SORT_CSWAP(dst[5], dst[7]); - SORT_CSWAP(dst[13], dst[15]); - SORT_CSWAP(dst[14], dst[16]); - SORT_CSWAP(dst[8], dst[17]); - SORT_CSWAP(dst[5], dst[6]); - SORT_CSWAP(dst[2], dst[7]); - SORT_CSWAP(dst[14], dst[15]); - SORT_CSWAP(dst[11], dst[16]); - SORT_CSWAP(dst[0], dst[5]); - SORT_CSWAP(dst[1], dst[6]); - SORT_CSWAP(dst[3], dst[7]); - SORT_CSWAP(dst[9], dst[14]); - SORT_CSWAP(dst[10], dst[15]); - SORT_CSWAP(dst[12], dst[16]); - SORT_CSWAP(dst[0], dst[4]); - SORT_CSWAP(dst[1], dst[5]); - SORT_CSWAP(dst[3], dst[6]); - SORT_CSWAP(dst[9], dst[13]); - SORT_CSWAP(dst[10], dst[14]); - SORT_CSWAP(dst[12], dst[15]); - SORT_CSWAP(dst[7], dst[16]); - SORT_CSWAP(dst[1], dst[4]); - SORT_CSWAP(dst[2], dst[5]); - SORT_CSWAP(dst[10], dst[13]); - SORT_CSWAP(dst[11], dst[14]); - SORT_CSWAP(dst[0], dst[9]); - SORT_CSWAP(dst[6], dst[15]); - SORT_CSWAP(dst[8], dst[16]); - SORT_CSWAP(dst[2], dst[4]); - SORT_CSWAP(dst[3], dst[5]); - SORT_CSWAP(dst[11], dst[13]); - SORT_CSWAP(dst[12], dst[14]); - SORT_CSWAP(dst[1], dst[10]); - SORT_CSWAP(dst[7], dst[15]); - SORT_CSWAP(dst[3], dst[4]); - SORT_CSWAP(dst[12], dst[13]); - SORT_CSWAP(dst[1], dst[9]); - SORT_CSWAP(dst[2], dst[11]); - SORT_CSWAP(dst[5], dst[14]); - SORT_CSWAP(dst[8], dst[15]); - SORT_CSWAP(dst[3], dst[12]); - SORT_CSWAP(dst[2], dst[9]); - SORT_CSWAP(dst[4], dst[13]); - SORT_CSWAP(dst[7], dst[14]); - SORT_CSWAP(dst[3], dst[11]); - SORT_CSWAP(dst[5], dst[13]); - SORT_CSWAP(dst[8], dst[14]); - SORT_CSWAP(dst[3], dst[10]); - SORT_CSWAP(dst[6], dst[13]); - SORT_CSWAP(dst[3], dst[9]); - SORT_CSWAP(dst[7], dst[13]); - SORT_CSWAP(dst[5], dst[10]); - SORT_CSWAP(dst[6], dst[11]); - SORT_CSWAP(dst[8], dst[13]); - SORT_CSWAP(dst[4], dst[9]); - SORT_CSWAP(dst[7], dst[12]); - SORT_CSWAP(dst[5], dst[9]); - SORT_CSWAP(dst[8], dst[12]); - SORT_CSWAP(dst[7], dst[11]); - SORT_CSWAP(dst[8], dst[11]); - SORT_CSWAP(dst[6], dst[9]); - SORT_CSWAP(dst[7], dst[10]); - SORT_CSWAP(dst[8], dst[10]); - SORT_CSWAP(dst[7], dst[9]); - SORT_CSWAP(dst[8], dst[9]); -} - - -#define BITONIC_SORT_19 SORT_MAKE_STR(bitonic_sort_19) -static __inline void BITONIC_SORT_19(SORT_TYPE *dst) { - SORT_CSWAP(dst[0], dst[1]); - SORT_CSWAP(dst[2], dst[3]); - SORT_CSWAP(dst[4], dst[5]); - SORT_CSWAP(dst[7], dst[8]); - SORT_CSWAP(dst[9], dst[10]); - SORT_CSWAP(dst[12], dst[13]); - SORT_CSWAP(dst[14], dst[15]); - SORT_CSWAP(dst[17], dst[18]); - SORT_CSWAP(dst[0], dst[2]); - SORT_CSWAP(dst[1], dst[3]); - SORT_CSWAP(dst[6], dst[8]); - SORT_CSWAP(dst[11], dst[13]); - SORT_CSWAP(dst[16], dst[18]); - SORT_CSWAP(dst[1], dst[2]); - SORT_CSWAP(dst[6], dst[7]); - SORT_CSWAP(dst[5], dst[8]); - SORT_CSWAP(dst[11], dst[12]); - SORT_CSWAP(dst[10], dst[13]); - SORT_CSWAP(dst[16], dst[17]); - SORT_CSWAP(dst[15], dst[18]); - SORT_CSWAP(dst[4], dst[7]); - SORT_CSWAP(dst[3], dst[8]); - SORT_CSWAP(dst[9], dst[12]); - SORT_CSWAP(dst[14], dst[17]); - SORT_CSWAP(dst[13], dst[18]); - SORT_CSWAP(dst[4], dst[6]); - SORT_CSWAP(dst[5], dst[7]); - SORT_CSWAP(dst[9], dst[11]); - SORT_CSWAP(dst[10], dst[12]); - SORT_CSWAP(dst[14], dst[16]); - SORT_CSWAP(dst[15], dst[17]); - SORT_CSWAP(dst[8], dst[18]); - SORT_CSWAP(dst[5], dst[6]); - SORT_CSWAP(dst[2], dst[7]); - SORT_CSWAP(dst[10], dst[11]); - SORT_CSWAP(dst[15], dst[16]); - SORT_CSWAP(dst[9], dst[14]); - SORT_CSWAP(dst[12], dst[17]); - SORT_CSWAP(dst[0], dst[5]); - SORT_CSWAP(dst[1], dst[6]); - SORT_CSWAP(dst[3], dst[7]); - SORT_CSWAP(dst[10], dst[15]); - SORT_CSWAP(dst[11], dst[16]); - SORT_CSWAP(dst[13], dst[17]); - SORT_CSWAP(dst[0], dst[4]); - SORT_CSWAP(dst[1], dst[5]); - SORT_CSWAP(dst[3], dst[6]); - SORT_CSWAP(dst[10], dst[14]); - SORT_CSWAP(dst[12], dst[16]); - SORT_CSWAP(dst[7], dst[17]); - SORT_CSWAP(dst[1], dst[4]); - SORT_CSWAP(dst[2], dst[5]); - SORT_CSWAP(dst[13], dst[16]); - SORT_CSWAP(dst[11], dst[14]); - SORT_CSWAP(dst[12], dst[15]); - SORT_CSWAP(dst[0], dst[10]); - SORT_CSWAP(dst[8], dst[17]); - SORT_CSWAP(dst[2], dst[4]); - SORT_CSWAP(dst[3], dst[5]); - SORT_CSWAP(dst[13], dst[15]); - SORT_CSWAP(dst[12], dst[14]); - SORT_CSWAP(dst[0], dst[9]); - SORT_CSWAP(dst[1], dst[11]); - SORT_CSWAP(dst[6], dst[16]); - SORT_CSWAP(dst[3], dst[4]); - SORT_CSWAP(dst[13], dst[14]); - SORT_CSWAP(dst[1], dst[10]); - SORT_CSWAP(dst[2], dst[12]); - SORT_CSWAP(dst[5], dst[15]); - SORT_CSWAP(dst[7], dst[16]); - SORT_CSWAP(dst[1], dst[9]); - SORT_CSWAP(dst[3], dst[13]); - SORT_CSWAP(dst[2], dst[10]); - SORT_CSWAP(dst[4], dst[14]); - SORT_CSWAP(dst[8], dst[16]); - SORT_CSWAP(dst[7], dst[15]); - SORT_CSWAP(dst[3], dst[12]); - SORT_CSWAP(dst[2], dst[9]); - SORT_CSWAP(dst[5], dst[14]); - SORT_CSWAP(dst[8], dst[15]); - SORT_CSWAP(dst[3], dst[11]); - SORT_CSWAP(dst[6], dst[14]); - SORT_CSWAP(dst[3], dst[10]); - SORT_CSWAP(dst[7], dst[14]); - SORT_CSWAP(dst[6], dst[11]); - SORT_CSWAP(dst[3], dst[9]); - SORT_CSWAP(dst[8], dst[14]); - SORT_CSWAP(dst[5], dst[10]); - SORT_CSWAP(dst[7], dst[12]); - SORT_CSWAP(dst[4], dst[9]); - SORT_CSWAP(dst[8], dst[13]); - SORT_CSWAP(dst[7], dst[11]); - SORT_CSWAP(dst[5], dst[9]); - SORT_CSWAP(dst[8], dst[12]); - SORT_CSWAP(dst[7], dst[10]); - SORT_CSWAP(dst[8], dst[11]); - SORT_CSWAP(dst[6], dst[9]); - SORT_CSWAP(dst[8], dst[10]); - SORT_CSWAP(dst[7], dst[9]); - SORT_CSWAP(dst[8], dst[9]); -} - - -#define BITONIC_SORT_20 SORT_MAKE_STR(bitonic_sort_20) -static __inline void BITONIC_SORT_20(SORT_TYPE *dst) { - SORT_CSWAP(dst[0], dst[1]); - SORT_CSWAP(dst[3], dst[4]); - SORT_CSWAP(dst[5], dst[6]); - SORT_CSWAP(dst[8], dst[9]); - SORT_CSWAP(dst[10], dst[11]); - SORT_CSWAP(dst[13], dst[14]); - SORT_CSWAP(dst[15], dst[16]); - SORT_CSWAP(dst[18], dst[19]); - SORT_CSWAP(dst[2], dst[4]); - SORT_CSWAP(dst[7], dst[9]); - SORT_CSWAP(dst[12], dst[14]); - SORT_CSWAP(dst[17], dst[19]); - SORT_CSWAP(dst[2], dst[3]); - SORT_CSWAP(dst[1], dst[4]); - SORT_CSWAP(dst[7], dst[8]); - SORT_CSWAP(dst[6], dst[9]); - SORT_CSWAP(dst[12], dst[13]); - SORT_CSWAP(dst[11], dst[14]); - SORT_CSWAP(dst[17], dst[18]); - SORT_CSWAP(dst[16], dst[19]); - SORT_CSWAP(dst[0], dst[3]); - SORT_CSWAP(dst[5], dst[8]); - SORT_CSWAP(dst[4], dst[9]); - SORT_CSWAP(dst[10], dst[13]); - SORT_CSWAP(dst[15], dst[18]); - SORT_CSWAP(dst[14], dst[19]); - SORT_CSWAP(dst[0], dst[2]); - SORT_CSWAP(dst[1], dst[3]); - SORT_CSWAP(dst[5], dst[7]); - SORT_CSWAP(dst[6], dst[8]); - SORT_CSWAP(dst[10], dst[12]); - SORT_CSWAP(dst[11], dst[13]); - SORT_CSWAP(dst[15], dst[17]); - SORT_CSWAP(dst[16], dst[18]); - SORT_CSWAP(dst[9], dst[19]); - SORT_CSWAP(dst[1], dst[2]); - SORT_CSWAP(dst[6], dst[7]); - SORT_CSWAP(dst[0], dst[5]); - SORT_CSWAP(dst[3], dst[8]); - SORT_CSWAP(dst[11], dst[12]); - SORT_CSWAP(dst[16], dst[17]); - SORT_CSWAP(dst[10], dst[15]); - SORT_CSWAP(dst[13], dst[18]); - SORT_CSWAP(dst[1], dst[6]); - SORT_CSWAP(dst[2], dst[7]); - SORT_CSWAP(dst[4], dst[8]); - SORT_CSWAP(dst[11], dst[16]); - SORT_CSWAP(dst[12], dst[17]); - SORT_CSWAP(dst[14], dst[18]); - SORT_CSWAP(dst[0], dst[10]); - SORT_CSWAP(dst[1], dst[5]); - SORT_CSWAP(dst[3], dst[7]); - SORT_CSWAP(dst[11], dst[15]); - SORT_CSWAP(dst[13], dst[17]); - SORT_CSWAP(dst[8], dst[18]); - SORT_CSWAP(dst[4], dst[7]); - SORT_CSWAP(dst[2], dst[5]); - SORT_CSWAP(dst[3], dst[6]); - SORT_CSWAP(dst[14], dst[17]); - SORT_CSWAP(dst[12], dst[15]); - SORT_CSWAP(dst[13], dst[16]); - SORT_CSWAP(dst[1], dst[11]); - SORT_CSWAP(dst[9], dst[18]); - SORT_CSWAP(dst[4], dst[6]); - SORT_CSWAP(dst[3], dst[5]); - SORT_CSWAP(dst[14], dst[16]); - SORT_CSWAP(dst[13], dst[15]); - SORT_CSWAP(dst[1], dst[10]); - SORT_CSWAP(dst[2], dst[12]); - SORT_CSWAP(dst[7], dst[17]); - SORT_CSWAP(dst[4], dst[5]); - SORT_CSWAP(dst[14], dst[15]); - SORT_CSWAP(dst[3], dst[13]); - SORT_CSWAP(dst[2], dst[10]); - SORT_CSWAP(dst[6], dst[16]); - SORT_CSWAP(dst[8], dst[17]); - SORT_CSWAP(dst[4], dst[14]); - SORT_CSWAP(dst[3], dst[12]); - SORT_CSWAP(dst[5], dst[15]); - SORT_CSWAP(dst[9], dst[17]); - SORT_CSWAP(dst[8], dst[16]); - SORT_CSWAP(dst[4], dst[13]); - SORT_CSWAP(dst[3], dst[11]); - SORT_CSWAP(dst[6], dst[15]); - SORT_CSWAP(dst[9], dst[16]); - SORT_CSWAP(dst[4], dst[12]); - SORT_CSWAP(dst[3], dst[10]); - SORT_CSWAP(dst[7], dst[15]); - SORT_CSWAP(dst[4], dst[11]); - SORT_CSWAP(dst[8], dst[15]); - SORT_CSWAP(dst[7], dst[12]); - SORT_CSWAP(dst[4], dst[10]); - SORT_CSWAP(dst[9], dst[15]); - SORT_CSWAP(dst[6], dst[11]); - SORT_CSWAP(dst[8], dst[13]); - SORT_CSWAP(dst[5], dst[10]); - SORT_CSWAP(dst[9], dst[14]); - SORT_CSWAP(dst[8], dst[12]); - SORT_CSWAP(dst[6], dst[10]); - SORT_CSWAP(dst[9], dst[13]); - SORT_CSWAP(dst[8], dst[11]); - SORT_CSWAP(dst[9], dst[12]); - SORT_CSWAP(dst[7], dst[10]); - SORT_CSWAP(dst[9], dst[11]); - SORT_CSWAP(dst[8], dst[10]); - SORT_CSWAP(dst[9], dst[10]); -} - - -#define BITONIC_SORT_21 SORT_MAKE_STR(bitonic_sort_21) -static __inline void BITONIC_SORT_21(SORT_TYPE *dst) { - SORT_CSWAP(dst[0], dst[1]); - SORT_CSWAP(dst[3], dst[4]); - SORT_CSWAP(dst[5], dst[6]); - SORT_CSWAP(dst[8], dst[9]); - SORT_CSWAP(dst[10], dst[11]); - SORT_CSWAP(dst[13], dst[14]); - SORT_CSWAP(dst[16], dst[17]); - SORT_CSWAP(dst[19], dst[20]); - SORT_CSWAP(dst[2], dst[4]); - SORT_CSWAP(dst[7], dst[9]); - SORT_CSWAP(dst[12], dst[14]); - SORT_CSWAP(dst[15], dst[17]); - SORT_CSWAP(dst[18], dst[20]); - SORT_CSWAP(dst[2], dst[3]); - SORT_CSWAP(dst[1], dst[4]); - SORT_CSWAP(dst[7], dst[8]); - SORT_CSWAP(dst[6], dst[9]); - SORT_CSWAP(dst[12], dst[13]); - SORT_CSWAP(dst[11], dst[14]); - SORT_CSWAP(dst[15], dst[16]); - SORT_CSWAP(dst[18], dst[19]); - SORT_CSWAP(dst[17], dst[20]); - SORT_CSWAP(dst[0], dst[3]); - SORT_CSWAP(dst[5], dst[8]); - SORT_CSWAP(dst[4], dst[9]); - SORT_CSWAP(dst[10], dst[13]); - SORT_CSWAP(dst[15], dst[18]); - SORT_CSWAP(dst[16], dst[19]); - SORT_CSWAP(dst[14], dst[20]); - SORT_CSWAP(dst[0], dst[2]); - SORT_CSWAP(dst[1], dst[3]); - SORT_CSWAP(dst[5], dst[7]); - SORT_CSWAP(dst[6], dst[8]); - SORT_CSWAP(dst[10], dst[12]); - SORT_CSWAP(dst[11], dst[13]); - SORT_CSWAP(dst[17], dst[19]); - SORT_CSWAP(dst[16], dst[18]); - SORT_CSWAP(dst[9], dst[20]); - SORT_CSWAP(dst[1], dst[2]); - SORT_CSWAP(dst[6], dst[7]); - SORT_CSWAP(dst[0], dst[5]); - SORT_CSWAP(dst[3], dst[8]); - SORT_CSWAP(dst[11], dst[12]); - SORT_CSWAP(dst[17], dst[18]); - SORT_CSWAP(dst[10], dst[16]); - SORT_CSWAP(dst[13], dst[19]); - SORT_CSWAP(dst[1], dst[6]); - SORT_CSWAP(dst[2], dst[7]); - SORT_CSWAP(dst[4], dst[8]); - SORT_CSWAP(dst[10], dst[15]); - SORT_CSWAP(dst[11], dst[17]); - SORT_CSWAP(dst[12], dst[18]); - SORT_CSWAP(dst[14], dst[19]); - SORT_CSWAP(dst[1], dst[5]); - SORT_CSWAP(dst[3], dst[7]); - SORT_CSWAP(dst[11], dst[16]); - SORT_CSWAP(dst[13], dst[18]); - SORT_CSWAP(dst[8], dst[19]); - SORT_CSWAP(dst[4], dst[7]); - SORT_CSWAP(dst[2], dst[5]); - SORT_CSWAP(dst[3], dst[6]); - SORT_CSWAP(dst[11], dst[15]); - SORT_CSWAP(dst[14], dst[18]); - SORT_CSWAP(dst[13], dst[16]); - SORT_CSWAP(dst[9], dst[19]); - SORT_CSWAP(dst[4], dst[6]); - SORT_CSWAP(dst[3], dst[5]); - SORT_CSWAP(dst[12], dst[15]); - SORT_CSWAP(dst[14], dst[17]); - SORT_CSWAP(dst[0], dst[11]); - SORT_CSWAP(dst[7], dst[18]); - SORT_CSWAP(dst[4], dst[5]); - SORT_CSWAP(dst[14], dst[16]); - SORT_CSWAP(dst[13], dst[15]); - SORT_CSWAP(dst[0], dst[10]); - SORT_CSWAP(dst[1], dst[12]); - SORT_CSWAP(dst[6], dst[17]); - SORT_CSWAP(dst[8], dst[18]); - SORT_CSWAP(dst[14], dst[15]); - SORT_CSWAP(dst[1], dst[11]); - SORT_CSWAP(dst[2], dst[13]); - SORT_CSWAP(dst[5], dst[16]); - SORT_CSWAP(dst[9], dst[18]); - SORT_CSWAP(dst[8], dst[17]); - SORT_CSWAP(dst[1], dst[10]); - SORT_CSWAP(dst[3], dst[14]); - SORT_CSWAP(dst[4], dst[15]); - SORT_CSWAP(dst[6], dst[16]); - SORT_CSWAP(dst[9], dst[17]); - SORT_CSWAP(dst[4], dst[14]); - SORT_CSWAP(dst[3], dst[13]); - SORT_CSWAP(dst[2], dst[10]); - SORT_CSWAP(dst[7], dst[16]); - SORT_CSWAP(dst[4], dst[13]); - SORT_CSWAP(dst[3], dst[11]); - SORT_CSWAP(dst[8], dst[16]); - SORT_CSWAP(dst[4], dst[12]); - SORT_CSWAP(dst[3], dst[10]); - SORT_CSWAP(dst[9], dst[16]); - SORT_CSWAP(dst[7], dst[13]); - SORT_CSWAP(dst[8], dst[14]); - SORT_CSWAP(dst[4], dst[11]); - SORT_CSWAP(dst[6], dst[12]); - SORT_CSWAP(dst[9], dst[15]); - SORT_CSWAP(dst[8], dst[13]); - SORT_CSWAP(dst[4], dst[10]); - SORT_CSWAP(dst[5], dst[11]); - SORT_CSWAP(dst[9], dst[14]); - SORT_CSWAP(dst[5], dst[10]); - SORT_CSWAP(dst[6], dst[11]); - SORT_CSWAP(dst[9], dst[13]); - SORT_CSWAP(dst[6], dst[10]); - SORT_CSWAP(dst[8], dst[11]); - SORT_CSWAP(dst[9], dst[12]); - SORT_CSWAP(dst[7], dst[10]); - SORT_CSWAP(dst[9], dst[11]); - SORT_CSWAP(dst[8], dst[10]); - SORT_CSWAP(dst[9], dst[10]); -} - - -#define BITONIC_SORT_22 SORT_MAKE_STR(bitonic_sort_22) -static __inline void BITONIC_SORT_22(SORT_TYPE *dst) { - SORT_CSWAP(dst[0], dst[1]); - SORT_CSWAP(dst[3], dst[4]); - SORT_CSWAP(dst[6], dst[7]); - SORT_CSWAP(dst[9], dst[10]); - SORT_CSWAP(dst[11], dst[12]); - SORT_CSWAP(dst[14], dst[15]); - SORT_CSWAP(dst[17], dst[18]); - SORT_CSWAP(dst[20], dst[21]); - SORT_CSWAP(dst[2], dst[4]); - SORT_CSWAP(dst[5], dst[7]); - SORT_CSWAP(dst[8], dst[10]); - SORT_CSWAP(dst[13], dst[15]); - SORT_CSWAP(dst[16], dst[18]); - SORT_CSWAP(dst[19], dst[21]); - SORT_CSWAP(dst[2], dst[3]); - SORT_CSWAP(dst[1], dst[4]); - SORT_CSWAP(dst[5], dst[6]); - SORT_CSWAP(dst[8], dst[9]); - SORT_CSWAP(dst[7], dst[10]); - SORT_CSWAP(dst[13], dst[14]); - SORT_CSWAP(dst[12], dst[15]); - SORT_CSWAP(dst[16], dst[17]); - SORT_CSWAP(dst[19], dst[20]); - SORT_CSWAP(dst[18], dst[21]); - SORT_CSWAP(dst[0], dst[3]); - SORT_CSWAP(dst[5], dst[8]); - SORT_CSWAP(dst[6], dst[9]); - SORT_CSWAP(dst[4], dst[10]); - SORT_CSWAP(dst[11], dst[14]); - SORT_CSWAP(dst[16], dst[19]); - SORT_CSWAP(dst[17], dst[20]); - SORT_CSWAP(dst[15], dst[21]); - SORT_CSWAP(dst[0], dst[2]); - SORT_CSWAP(dst[1], dst[3]); - SORT_CSWAP(dst[7], dst[9]); - SORT_CSWAP(dst[6], dst[8]); - SORT_CSWAP(dst[11], dst[13]); - SORT_CSWAP(dst[12], dst[14]); - SORT_CSWAP(dst[18], dst[20]); - SORT_CSWAP(dst[17], dst[19]); - SORT_CSWAP(dst[10], dst[21]); - SORT_CSWAP(dst[1], dst[2]); - SORT_CSWAP(dst[7], dst[8]); - SORT_CSWAP(dst[0], dst[6]); - SORT_CSWAP(dst[3], dst[9]); - SORT_CSWAP(dst[12], dst[13]); - SORT_CSWAP(dst[18], dst[19]); - SORT_CSWAP(dst[11], dst[17]); - SORT_CSWAP(dst[14], dst[20]); - SORT_CSWAP(dst[0], dst[5]); - SORT_CSWAP(dst[1], dst[7]); - SORT_CSWAP(dst[2], dst[8]); - SORT_CSWAP(dst[4], dst[9]); - SORT_CSWAP(dst[11], dst[16]); - SORT_CSWAP(dst[12], dst[18]); - SORT_CSWAP(dst[13], dst[19]); - SORT_CSWAP(dst[15], dst[20]); - SORT_CSWAP(dst[1], dst[6]); - SORT_CSWAP(dst[3], dst[8]); - SORT_CSWAP(dst[12], dst[17]); - SORT_CSWAP(dst[14], dst[19]); - SORT_CSWAP(dst[0], dst[11]); - SORT_CSWAP(dst[9], dst[20]); - SORT_CSWAP(dst[1], dst[5]); - SORT_CSWAP(dst[4], dst[8]); - SORT_CSWAP(dst[3], dst[6]); - SORT_CSWAP(dst[12], dst[16]); - SORT_CSWAP(dst[15], dst[19]); - SORT_CSWAP(dst[14], dst[17]); - SORT_CSWAP(dst[10], dst[20]); - SORT_CSWAP(dst[2], dst[5]); - SORT_CSWAP(dst[4], dst[7]); - SORT_CSWAP(dst[13], dst[16]); - SORT_CSWAP(dst[15], dst[18]); - SORT_CSWAP(dst[1], dst[12]); - SORT_CSWAP(dst[8], dst[19]); - SORT_CSWAP(dst[4], dst[6]); - SORT_CSWAP(dst[3], dst[5]); - SORT_CSWAP(dst[15], dst[17]); - SORT_CSWAP(dst[14], dst[16]); - SORT_CSWAP(dst[1], dst[11]); - SORT_CSWAP(dst[2], dst[13]); - SORT_CSWAP(dst[7], dst[18]); - SORT_CSWAP(dst[9], dst[19]); - SORT_CSWAP(dst[4], dst[5]); - SORT_CSWAP(dst[15], dst[16]); - SORT_CSWAP(dst[3], dst[14]); - SORT_CSWAP(dst[2], dst[11]); - SORT_CSWAP(dst[6], dst[17]); - SORT_CSWAP(dst[10], dst[19]); - SORT_CSWAP(dst[4], dst[15]); - SORT_CSWAP(dst[3], dst[13]); - SORT_CSWAP(dst[5], dst[16]); - SORT_CSWAP(dst[7], dst[17]); - SORT_CSWAP(dst[10], dst[18]); - SORT_CSWAP(dst[4], dst[14]); - SORT_CSWAP(dst[3], dst[12]); - SORT_CSWAP(dst[6], dst[16]); - SORT_CSWAP(dst[9], dst[17]); - SORT_CSWAP(dst[4], dst[13]); - SORT_CSWAP(dst[3], dst[11]); - SORT_CSWAP(dst[7], dst[16]); - SORT_CSWAP(dst[10], dst[17]); - SORT_CSWAP(dst[4], dst[12]); - SORT_CSWAP(dst[8], dst[16]); - SORT_CSWAP(dst[7], dst[13]); - SORT_CSWAP(dst[4], dst[11]); - SORT_CSWAP(dst[9], dst[16]); - SORT_CSWAP(dst[6], dst[12]); - SORT_CSWAP(dst[8], dst[14]); - SORT_CSWAP(dst[10], dst[16]); - SORT_CSWAP(dst[5], dst[11]); - SORT_CSWAP(dst[7], dst[12]); - SORT_CSWAP(dst[9], dst[15]); - SORT_CSWAP(dst[6], dst[11]); - SORT_CSWAP(dst[10], dst[15]); - SORT_CSWAP(dst[9], dst[14]); - SORT_CSWAP(dst[7], dst[11]); - SORT_CSWAP(dst[10], dst[14]); - SORT_CSWAP(dst[9], dst[12]); - SORT_CSWAP(dst[8], dst[11]); - SORT_CSWAP(dst[10], dst[13]); - SORT_CSWAP(dst[10], dst[12]); - SORT_CSWAP(dst[9], dst[11]); - SORT_CSWAP(dst[10], dst[11]); -} - - -#define BITONIC_SORT_23 SORT_MAKE_STR(bitonic_sort_23) -static __inline void BITONIC_SORT_23(SORT_TYPE *dst) { - SORT_CSWAP(dst[0], dst[1]); - SORT_CSWAP(dst[3], dst[4]); - SORT_CSWAP(dst[6], dst[7]); - SORT_CSWAP(dst[9], dst[10]); - SORT_CSWAP(dst[12], dst[13]); - SORT_CSWAP(dst[15], dst[16]); - SORT_CSWAP(dst[18], dst[19]); - SORT_CSWAP(dst[21], dst[22]); - SORT_CSWAP(dst[2], dst[4]); - SORT_CSWAP(dst[5], dst[7]); - SORT_CSWAP(dst[8], dst[10]); - SORT_CSWAP(dst[11], dst[13]); - SORT_CSWAP(dst[14], dst[16]); - SORT_CSWAP(dst[17], dst[19]); - SORT_CSWAP(dst[20], dst[22]); - SORT_CSWAP(dst[2], dst[3]); - SORT_CSWAP(dst[1], dst[4]); - SORT_CSWAP(dst[5], dst[6]); - SORT_CSWAP(dst[8], dst[9]); - SORT_CSWAP(dst[7], dst[10]); - SORT_CSWAP(dst[11], dst[12]); - SORT_CSWAP(dst[14], dst[15]); - SORT_CSWAP(dst[13], dst[16]); - SORT_CSWAP(dst[17], dst[18]); - SORT_CSWAP(dst[20], dst[21]); - SORT_CSWAP(dst[19], dst[22]); - SORT_CSWAP(dst[0], dst[3]); - SORT_CSWAP(dst[5], dst[8]); - SORT_CSWAP(dst[6], dst[9]); - SORT_CSWAP(dst[4], dst[10]); - SORT_CSWAP(dst[11], dst[14]); - SORT_CSWAP(dst[12], dst[15]); - SORT_CSWAP(dst[17], dst[20]); - SORT_CSWAP(dst[18], dst[21]); - SORT_CSWAP(dst[16], dst[22]); - SORT_CSWAP(dst[0], dst[2]); - SORT_CSWAP(dst[1], dst[3]); - SORT_CSWAP(dst[7], dst[9]); - SORT_CSWAP(dst[6], dst[8]); - SORT_CSWAP(dst[13], dst[15]); - SORT_CSWAP(dst[12], dst[14]); - SORT_CSWAP(dst[19], dst[21]); - SORT_CSWAP(dst[18], dst[20]); - SORT_CSWAP(dst[11], dst[17]); - SORT_CSWAP(dst[10], dst[22]); - SORT_CSWAP(dst[1], dst[2]); - SORT_CSWAP(dst[7], dst[8]); - SORT_CSWAP(dst[0], dst[6]); - SORT_CSWAP(dst[3], dst[9]); - SORT_CSWAP(dst[13], dst[14]); - SORT_CSWAP(dst[19], dst[20]); - SORT_CSWAP(dst[12], dst[18]); - SORT_CSWAP(dst[15], dst[21]); - SORT_CSWAP(dst[0], dst[5]); - SORT_CSWAP(dst[1], dst[7]); - SORT_CSWAP(dst[2], dst[8]); - SORT_CSWAP(dst[4], dst[9]); - SORT_CSWAP(dst[13], dst[19]); - SORT_CSWAP(dst[12], dst[17]); - SORT_CSWAP(dst[14], dst[20]); - SORT_CSWAP(dst[16], dst[21]); - SORT_CSWAP(dst[1], dst[6]); - SORT_CSWAP(dst[3], dst[8]); - SORT_CSWAP(dst[13], dst[18]); - SORT_CSWAP(dst[15], dst[20]); - SORT_CSWAP(dst[0], dst[12]); - SORT_CSWAP(dst[9], dst[21]); - SORT_CSWAP(dst[1], dst[5]); - SORT_CSWAP(dst[4], dst[8]); - SORT_CSWAP(dst[3], dst[6]); - SORT_CSWAP(dst[13], dst[17]); - SORT_CSWAP(dst[16], dst[20]); - SORT_CSWAP(dst[15], dst[18]); - SORT_CSWAP(dst[0], dst[11]); - SORT_CSWAP(dst[10], dst[21]); - SORT_CSWAP(dst[2], dst[5]); - SORT_CSWAP(dst[4], dst[7]); - SORT_CSWAP(dst[14], dst[17]); - SORT_CSWAP(dst[16], dst[19]); - SORT_CSWAP(dst[1], dst[13]); - SORT_CSWAP(dst[8], dst[20]); - SORT_CSWAP(dst[4], dst[6]); - SORT_CSWAP(dst[3], dst[5]); - SORT_CSWAP(dst[16], dst[18]); - SORT_CSWAP(dst[15], dst[17]); - SORT_CSWAP(dst[1], dst[12]); - SORT_CSWAP(dst[2], dst[14]); - SORT_CSWAP(dst[7], dst[19]); - SORT_CSWAP(dst[9], dst[20]); - SORT_CSWAP(dst[4], dst[5]); - SORT_CSWAP(dst[16], dst[17]); - SORT_CSWAP(dst[1], dst[11]); - SORT_CSWAP(dst[3], dst[15]); - SORT_CSWAP(dst[6], dst[18]); - SORT_CSWAP(dst[10], dst[20]); - SORT_CSWAP(dst[4], dst[16]); - SORT_CSWAP(dst[3], dst[14]); - SORT_CSWAP(dst[2], dst[11]); - SORT_CSWAP(dst[5], dst[17]); - SORT_CSWAP(dst[7], dst[18]); - SORT_CSWAP(dst[10], dst[19]); - SORT_CSWAP(dst[4], dst[15]); - SORT_CSWAP(dst[3], dst[12]); - SORT_CSWAP(dst[6], dst[17]); - SORT_CSWAP(dst[9], dst[18]); - SORT_CSWAP(dst[4], dst[14]); - SORT_CSWAP(dst[3], dst[11]); - SORT_CSWAP(dst[7], dst[17]); - SORT_CSWAP(dst[10], dst[18]); - SORT_CSWAP(dst[4], dst[13]); - SORT_CSWAP(dst[8], dst[17]); - SORT_CSWAP(dst[4], dst[12]); - SORT_CSWAP(dst[9], dst[17]); - SORT_CSWAP(dst[7], dst[13]); - SORT_CSWAP(dst[8], dst[14]); - SORT_CSWAP(dst[4], dst[11]); - SORT_CSWAP(dst[10], dst[17]); - SORT_CSWAP(dst[6], dst[12]); - SORT_CSWAP(dst[9], dst[15]); - SORT_CSWAP(dst[5], dst[11]); - SORT_CSWAP(dst[7], dst[12]); - SORT_CSWAP(dst[10], dst[16]); - SORT_CSWAP(dst[9], dst[14]); - SORT_CSWAP(dst[6], dst[11]); - SORT_CSWAP(dst[10], dst[15]); - SORT_CSWAP(dst[9], dst[12]); - SORT_CSWAP(dst[7], dst[11]); - SORT_CSWAP(dst[10], dst[14]); - SORT_CSWAP(dst[8], dst[11]); - SORT_CSWAP(dst[10], dst[13]); - SORT_CSWAP(dst[10], dst[12]); - SORT_CSWAP(dst[9], dst[11]); - SORT_CSWAP(dst[10], dst[11]); -} - - -#define BITONIC_SORT_24 SORT_MAKE_STR(bitonic_sort_24) -static __inline void BITONIC_SORT_24(SORT_TYPE *dst) { - SORT_CSWAP(dst[1], dst[2]); - SORT_CSWAP(dst[4], dst[5]); - SORT_CSWAP(dst[7], dst[8]); - SORT_CSWAP(dst[10], dst[11]); - SORT_CSWAP(dst[13], dst[14]); - SORT_CSWAP(dst[16], dst[17]); - SORT_CSWAP(dst[19], dst[20]); - SORT_CSWAP(dst[22], dst[23]); - SORT_CSWAP(dst[0], dst[2]); - SORT_CSWAP(dst[3], dst[5]); - SORT_CSWAP(dst[6], dst[8]); - SORT_CSWAP(dst[9], dst[11]); - SORT_CSWAP(dst[12], dst[14]); - SORT_CSWAP(dst[15], dst[17]); - SORT_CSWAP(dst[18], dst[20]); - SORT_CSWAP(dst[21], dst[23]); - SORT_CSWAP(dst[0], dst[1]); - SORT_CSWAP(dst[3], dst[4]); - SORT_CSWAP(dst[2], dst[5]); - SORT_CSWAP(dst[6], dst[7]); - SORT_CSWAP(dst[9], dst[10]); - SORT_CSWAP(dst[8], dst[11]); - SORT_CSWAP(dst[12], dst[13]); - SORT_CSWAP(dst[15], dst[16]); - SORT_CSWAP(dst[14], dst[17]); - SORT_CSWAP(dst[18], dst[19]); - SORT_CSWAP(dst[21], dst[22]); - SORT_CSWAP(dst[20], dst[23]); - SORT_CSWAP(dst[0], dst[3]); - SORT_CSWAP(dst[1], dst[4]); - SORT_CSWAP(dst[6], dst[9]); - SORT_CSWAP(dst[7], dst[10]); - SORT_CSWAP(dst[5], dst[11]); - SORT_CSWAP(dst[12], dst[15]); - SORT_CSWAP(dst[13], dst[16]); - SORT_CSWAP(dst[18], dst[21]); - SORT_CSWAP(dst[19], dst[22]); - SORT_CSWAP(dst[17], dst[23]); - SORT_CSWAP(dst[2], dst[4]); - SORT_CSWAP(dst[1], dst[3]); - SORT_CSWAP(dst[8], dst[10]); - SORT_CSWAP(dst[7], dst[9]); - SORT_CSWAP(dst[0], dst[6]); - SORT_CSWAP(dst[14], dst[16]); - SORT_CSWAP(dst[13], dst[15]); - SORT_CSWAP(dst[20], dst[22]); - SORT_CSWAP(dst[19], dst[21]); - SORT_CSWAP(dst[12], dst[18]); - SORT_CSWAP(dst[11], dst[23]); - SORT_CSWAP(dst[2], dst[3]); - SORT_CSWAP(dst[8], dst[9]); - SORT_CSWAP(dst[1], dst[7]); - SORT_CSWAP(dst[4], dst[10]); - SORT_CSWAP(dst[14], dst[15]); - SORT_CSWAP(dst[20], dst[21]); - SORT_CSWAP(dst[13], dst[19]); - SORT_CSWAP(dst[16], dst[22]); - SORT_CSWAP(dst[0], dst[12]); - SORT_CSWAP(dst[2], dst[8]); - SORT_CSWAP(dst[1], dst[6]); - SORT_CSWAP(dst[3], dst[9]); - SORT_CSWAP(dst[5], dst[10]); - SORT_CSWAP(dst[14], dst[20]); - SORT_CSWAP(dst[13], dst[18]); - SORT_CSWAP(dst[15], dst[21]); - SORT_CSWAP(dst[17], dst[22]); - SORT_CSWAP(dst[2], dst[7]); - SORT_CSWAP(dst[4], dst[9]); - SORT_CSWAP(dst[14], dst[19]); - SORT_CSWAP(dst[16], dst[21]); - SORT_CSWAP(dst[1], dst[13]); - SORT_CSWAP(dst[10], dst[22]); - SORT_CSWAP(dst[2], dst[6]); - SORT_CSWAP(dst[5], dst[9]); - SORT_CSWAP(dst[4], dst[7]); - SORT_CSWAP(dst[14], dst[18]); - SORT_CSWAP(dst[17], dst[21]); - SORT_CSWAP(dst[16], dst[19]); - SORT_CSWAP(dst[1], dst[12]); - SORT_CSWAP(dst[11], dst[22]); - SORT_CSWAP(dst[3], dst[6]); - SORT_CSWAP(dst[5], dst[8]); - SORT_CSWAP(dst[15], dst[18]); - SORT_CSWAP(dst[17], dst[20]); - SORT_CSWAP(dst[2], dst[14]); - SORT_CSWAP(dst[9], dst[21]); - SORT_CSWAP(dst[5], dst[7]); - SORT_CSWAP(dst[4], dst[6]); - SORT_CSWAP(dst[17], dst[19]); - SORT_CSWAP(dst[16], dst[18]); - SORT_CSWAP(dst[2], dst[13]); - SORT_CSWAP(dst[3], dst[15]); - SORT_CSWAP(dst[8], dst[20]); - SORT_CSWAP(dst[10], dst[21]); - SORT_CSWAP(dst[5], dst[6]); - SORT_CSWAP(dst[17], dst[18]); - SORT_CSWAP(dst[2], dst[12]); - SORT_CSWAP(dst[4], dst[16]); - SORT_CSWAP(dst[7], dst[19]); - SORT_CSWAP(dst[11], dst[21]); - SORT_CSWAP(dst[5], dst[17]); - SORT_CSWAP(dst[4], dst[15]); - SORT_CSWAP(dst[3], dst[12]); - SORT_CSWAP(dst[6], dst[18]); - SORT_CSWAP(dst[8], dst[19]); - SORT_CSWAP(dst[11], dst[20]); - SORT_CSWAP(dst[5], dst[16]); - SORT_CSWAP(dst[4], dst[13]); - SORT_CSWAP(dst[7], dst[18]); - SORT_CSWAP(dst[10], dst[19]); - SORT_CSWAP(dst[5], dst[15]); - SORT_CSWAP(dst[4], dst[12]); - SORT_CSWAP(dst[8], dst[18]); - SORT_CSWAP(dst[11], dst[19]); - SORT_CSWAP(dst[5], dst[14]); - SORT_CSWAP(dst[9], dst[18]); - SORT_CSWAP(dst[5], dst[13]); - SORT_CSWAP(dst[10], dst[18]); - SORT_CSWAP(dst[8], dst[14]); - SORT_CSWAP(dst[9], dst[15]); - SORT_CSWAP(dst[5], dst[12]); - SORT_CSWAP(dst[11], dst[18]); - SORT_CSWAP(dst[7], dst[13]); - SORT_CSWAP(dst[10], dst[16]); - SORT_CSWAP(dst[6], dst[12]); - SORT_CSWAP(dst[8], dst[13]); - SORT_CSWAP(dst[11], dst[17]); - SORT_CSWAP(dst[10], dst[15]); - SORT_CSWAP(dst[7], dst[12]); - SORT_CSWAP(dst[11], dst[16]); - SORT_CSWAP(dst[10], dst[13]); - SORT_CSWAP(dst[8], dst[12]); - SORT_CSWAP(dst[11], dst[15]); - SORT_CSWAP(dst[9], dst[12]); - SORT_CSWAP(dst[11], dst[14]); - SORT_CSWAP(dst[11], dst[13]); - SORT_CSWAP(dst[10], dst[12]); - SORT_CSWAP(dst[11], dst[12]); -} - - -#define BITONIC_SORT_25 SORT_MAKE_STR(bitonic_sort_25) -static __inline void BITONIC_SORT_25(SORT_TYPE *dst) { - SORT_CSWAP(dst[1], dst[2]); - SORT_CSWAP(dst[4], dst[5]); - SORT_CSWAP(dst[7], dst[8]); - SORT_CSWAP(dst[10], dst[11]); - SORT_CSWAP(dst[13], dst[14]); - SORT_CSWAP(dst[16], dst[17]); - SORT_CSWAP(dst[19], dst[20]); - SORT_CSWAP(dst[21], dst[22]); - SORT_CSWAP(dst[23], dst[24]); - SORT_CSWAP(dst[0], dst[2]); - SORT_CSWAP(dst[3], dst[5]); - SORT_CSWAP(dst[6], dst[8]); - SORT_CSWAP(dst[9], dst[11]); - SORT_CSWAP(dst[12], dst[14]); - SORT_CSWAP(dst[15], dst[17]); - SORT_CSWAP(dst[18], dst[20]); - SORT_CSWAP(dst[21], dst[23]); - SORT_CSWAP(dst[22], dst[24]); - SORT_CSWAP(dst[0], dst[1]); - SORT_CSWAP(dst[3], dst[4]); - SORT_CSWAP(dst[2], dst[5]); - SORT_CSWAP(dst[6], dst[7]); - SORT_CSWAP(dst[9], dst[10]); - SORT_CSWAP(dst[8], dst[11]); - SORT_CSWAP(dst[12], dst[13]); - SORT_CSWAP(dst[15], dst[16]); - SORT_CSWAP(dst[14], dst[17]); - SORT_CSWAP(dst[18], dst[19]); - SORT_CSWAP(dst[22], dst[23]); - SORT_CSWAP(dst[20], dst[24]); - SORT_CSWAP(dst[0], dst[3]); - SORT_CSWAP(dst[1], dst[4]); - SORT_CSWAP(dst[6], dst[9]); - SORT_CSWAP(dst[7], dst[10]); - SORT_CSWAP(dst[5], dst[11]); - SORT_CSWAP(dst[12], dst[15]); - SORT_CSWAP(dst[13], dst[16]); - SORT_CSWAP(dst[18], dst[22]); - SORT_CSWAP(dst[19], dst[23]); - SORT_CSWAP(dst[17], dst[24]); - SORT_CSWAP(dst[2], dst[4]); - SORT_CSWAP(dst[1], dst[3]); - SORT_CSWAP(dst[8], dst[10]); - SORT_CSWAP(dst[7], dst[9]); - SORT_CSWAP(dst[0], dst[6]); - SORT_CSWAP(dst[14], dst[16]); - SORT_CSWAP(dst[13], dst[15]); - SORT_CSWAP(dst[18], dst[21]); - SORT_CSWAP(dst[20], dst[23]); - SORT_CSWAP(dst[11], dst[24]); - SORT_CSWAP(dst[2], dst[3]); - SORT_CSWAP(dst[8], dst[9]); - SORT_CSWAP(dst[1], dst[7]); - SORT_CSWAP(dst[4], dst[10]); - SORT_CSWAP(dst[14], dst[15]); - SORT_CSWAP(dst[19], dst[21]); - SORT_CSWAP(dst[20], dst[22]); - SORT_CSWAP(dst[16], dst[23]); - SORT_CSWAP(dst[2], dst[8]); - SORT_CSWAP(dst[1], dst[6]); - SORT_CSWAP(dst[3], dst[9]); - SORT_CSWAP(dst[5], dst[10]); - SORT_CSWAP(dst[20], dst[21]); - SORT_CSWAP(dst[12], dst[19]); - SORT_CSWAP(dst[15], dst[22]); - SORT_CSWAP(dst[17], dst[23]); - SORT_CSWAP(dst[2], dst[7]); - SORT_CSWAP(dst[4], dst[9]); - SORT_CSWAP(dst[12], dst[18]); - SORT_CSWAP(dst[13], dst[20]); - SORT_CSWAP(dst[14], dst[21]); - SORT_CSWAP(dst[16], dst[22]); - SORT_CSWAP(dst[10], dst[23]); - SORT_CSWAP(dst[2], dst[6]); - SORT_CSWAP(dst[5], dst[9]); - SORT_CSWAP(dst[4], dst[7]); - SORT_CSWAP(dst[14], dst[20]); - SORT_CSWAP(dst[13], dst[18]); - SORT_CSWAP(dst[17], dst[22]); - SORT_CSWAP(dst[11], dst[23]); - SORT_CSWAP(dst[3], dst[6]); - SORT_CSWAP(dst[5], dst[8]); - SORT_CSWAP(dst[14], dst[19]); - SORT_CSWAP(dst[16], dst[20]); - SORT_CSWAP(dst[17], dst[21]); - SORT_CSWAP(dst[0], dst[13]); - SORT_CSWAP(dst[9], dst[22]); - SORT_CSWAP(dst[5], dst[7]); - SORT_CSWAP(dst[4], dst[6]); - SORT_CSWAP(dst[14], dst[18]); - SORT_CSWAP(dst[15], dst[19]); - SORT_CSWAP(dst[17], dst[20]); - SORT_CSWAP(dst[0], dst[12]); - SORT_CSWAP(dst[8], dst[21]); - SORT_CSWAP(dst[10], dst[22]); - SORT_CSWAP(dst[5], dst[6]); - SORT_CSWAP(dst[15], dst[18]); - SORT_CSWAP(dst[17], dst[19]); - SORT_CSWAP(dst[1], dst[14]); - SORT_CSWAP(dst[7], dst[20]); - SORT_CSWAP(dst[11], dst[22]); - SORT_CSWAP(dst[16], dst[18]); - SORT_CSWAP(dst[2], dst[15]); - SORT_CSWAP(dst[1], dst[12]); - SORT_CSWAP(dst[6], dst[19]); - SORT_CSWAP(dst[8], dst[20]); - SORT_CSWAP(dst[11], dst[21]); - SORT_CSWAP(dst[17], dst[18]); - SORT_CSWAP(dst[2], dst[14]); - SORT_CSWAP(dst[3], dst[16]); - SORT_CSWAP(dst[7], dst[19]); - SORT_CSWAP(dst[10], dst[20]); - SORT_CSWAP(dst[2], dst[13]); - SORT_CSWAP(dst[4], dst[17]); - SORT_CSWAP(dst[5], dst[18]); - SORT_CSWAP(dst[8], dst[19]); - SORT_CSWAP(dst[11], dst[20]); - SORT_CSWAP(dst[2], dst[12]); - SORT_CSWAP(dst[5], dst[17]); - SORT_CSWAP(dst[4], dst[16]); - SORT_CSWAP(dst[3], dst[13]); - SORT_CSWAP(dst[9], dst[19]); - SORT_CSWAP(dst[5], dst[16]); - SORT_CSWAP(dst[3], dst[12]); - SORT_CSWAP(dst[4], dst[14]); - SORT_CSWAP(dst[10], dst[19]); - SORT_CSWAP(dst[5], dst[15]); - SORT_CSWAP(dst[4], dst[12]); - SORT_CSWAP(dst[11], dst[19]); - SORT_CSWAP(dst[9], dst[16]); - SORT_CSWAP(dst[10], dst[17]); - SORT_CSWAP(dst[5], dst[14]); - SORT_CSWAP(dst[8], dst[15]); - SORT_CSWAP(dst[11], dst[18]); - SORT_CSWAP(dst[10], dst[16]); - SORT_CSWAP(dst[5], dst[13]); - SORT_CSWAP(dst[7], dst[14]); - SORT_CSWAP(dst[11], dst[17]); - SORT_CSWAP(dst[5], dst[12]); - SORT_CSWAP(dst[6], dst[13]); - SORT_CSWAP(dst[8], dst[14]); - SORT_CSWAP(dst[11], dst[16]); - SORT_CSWAP(dst[6], dst[12]); - SORT_CSWAP(dst[8], dst[13]); - SORT_CSWAP(dst[10], dst[14]); - SORT_CSWAP(dst[11], dst[15]); - SORT_CSWAP(dst[7], dst[12]); - SORT_CSWAP(dst[9], dst[13]); - SORT_CSWAP(dst[11], dst[14]); - SORT_CSWAP(dst[8], dst[12]); - SORT_CSWAP(dst[11], dst[13]); - SORT_CSWAP(dst[9], dst[12]); - SORT_CSWAP(dst[10], dst[12]); - SORT_CSWAP(dst[11], dst[12]); -} - - -#define BITONIC_SORT_26 SORT_MAKE_STR(bitonic_sort_26) -static __inline void BITONIC_SORT_26(SORT_TYPE *dst) { - SORT_CSWAP(dst[1], dst[2]); - SORT_CSWAP(dst[4], dst[5]); - SORT_CSWAP(dst[7], dst[8]); - SORT_CSWAP(dst[9], dst[10]); - SORT_CSWAP(dst[11], dst[12]); - SORT_CSWAP(dst[14], dst[15]); - SORT_CSWAP(dst[17], dst[18]); - SORT_CSWAP(dst[20], dst[21]); - SORT_CSWAP(dst[22], dst[23]); - SORT_CSWAP(dst[24], dst[25]); - SORT_CSWAP(dst[0], dst[2]); - SORT_CSWAP(dst[3], dst[5]); - SORT_CSWAP(dst[6], dst[8]); - SORT_CSWAP(dst[9], dst[11]); - SORT_CSWAP(dst[10], dst[12]); - SORT_CSWAP(dst[13], dst[15]); - SORT_CSWAP(dst[16], dst[18]); - SORT_CSWAP(dst[19], dst[21]); - SORT_CSWAP(dst[22], dst[24]); - SORT_CSWAP(dst[23], dst[25]); - SORT_CSWAP(dst[0], dst[1]); - SORT_CSWAP(dst[3], dst[4]); - SORT_CSWAP(dst[2], dst[5]); - SORT_CSWAP(dst[6], dst[7]); - SORT_CSWAP(dst[10], dst[11]); - SORT_CSWAP(dst[8], dst[12]); - SORT_CSWAP(dst[13], dst[14]); - SORT_CSWAP(dst[16], dst[17]); - SORT_CSWAP(dst[15], dst[18]); - SORT_CSWAP(dst[19], dst[20]); - SORT_CSWAP(dst[23], dst[24]); - SORT_CSWAP(dst[21], dst[25]); - SORT_CSWAP(dst[0], dst[3]); - SORT_CSWAP(dst[1], dst[4]); - SORT_CSWAP(dst[6], dst[10]); - SORT_CSWAP(dst[7], dst[11]); - SORT_CSWAP(dst[5], dst[12]); - SORT_CSWAP(dst[13], dst[16]); - SORT_CSWAP(dst[14], dst[17]); - SORT_CSWAP(dst[19], dst[23]); - SORT_CSWAP(dst[20], dst[24]); - SORT_CSWAP(dst[18], dst[25]); - SORT_CSWAP(dst[2], dst[4]); - SORT_CSWAP(dst[1], dst[3]); - SORT_CSWAP(dst[6], dst[9]); - SORT_CSWAP(dst[8], dst[11]); - SORT_CSWAP(dst[15], dst[17]); - SORT_CSWAP(dst[14], dst[16]); - SORT_CSWAP(dst[19], dst[22]); - SORT_CSWAP(dst[21], dst[24]); - SORT_CSWAP(dst[12], dst[25]); - SORT_CSWAP(dst[2], dst[3]); - SORT_CSWAP(dst[7], dst[9]); - SORT_CSWAP(dst[8], dst[10]); - SORT_CSWAP(dst[4], dst[11]); - SORT_CSWAP(dst[15], dst[16]); - SORT_CSWAP(dst[20], dst[22]); - SORT_CSWAP(dst[21], dst[23]); - SORT_CSWAP(dst[17], dst[24]); - SORT_CSWAP(dst[8], dst[9]); - SORT_CSWAP(dst[0], dst[7]); - SORT_CSWAP(dst[3], dst[10]); - SORT_CSWAP(dst[5], dst[11]); - SORT_CSWAP(dst[21], dst[22]); - SORT_CSWAP(dst[13], dst[20]); - SORT_CSWAP(dst[16], dst[23]); - SORT_CSWAP(dst[18], dst[24]); - SORT_CSWAP(dst[0], dst[6]); - SORT_CSWAP(dst[1], dst[8]); - SORT_CSWAP(dst[2], dst[9]); - SORT_CSWAP(dst[4], dst[10]); - SORT_CSWAP(dst[13], dst[19]); - SORT_CSWAP(dst[14], dst[21]); - SORT_CSWAP(dst[15], dst[22]); - SORT_CSWAP(dst[17], dst[23]); - SORT_CSWAP(dst[11], dst[24]); - SORT_CSWAP(dst[2], dst[8]); - SORT_CSWAP(dst[1], dst[6]); - SORT_CSWAP(dst[5], dst[10]); - SORT_CSWAP(dst[15], dst[21]); - SORT_CSWAP(dst[14], dst[19]); - SORT_CSWAP(dst[18], dst[23]); - SORT_CSWAP(dst[0], dst[13]); - SORT_CSWAP(dst[12], dst[24]); - SORT_CSWAP(dst[2], dst[7]); - SORT_CSWAP(dst[4], dst[8]); - SORT_CSWAP(dst[5], dst[9]); - SORT_CSWAP(dst[15], dst[20]); - SORT_CSWAP(dst[17], dst[21]); - SORT_CSWAP(dst[18], dst[22]); - SORT_CSWAP(dst[1], dst[14]); - SORT_CSWAP(dst[10], dst[23]); - SORT_CSWAP(dst[2], dst[6]); - SORT_CSWAP(dst[3], dst[7]); - SORT_CSWAP(dst[5], dst[8]); - SORT_CSWAP(dst[15], dst[19]); - SORT_CSWAP(dst[16], dst[20]); - SORT_CSWAP(dst[18], dst[21]); - SORT_CSWAP(dst[1], dst[13]); - SORT_CSWAP(dst[9], dst[22]); - SORT_CSWAP(dst[12], dst[23]); - SORT_CSWAP(dst[3], dst[6]); - SORT_CSWAP(dst[5], dst[7]); - SORT_CSWAP(dst[16], dst[19]); - SORT_CSWAP(dst[18], dst[20]); - SORT_CSWAP(dst[2], dst[15]); - SORT_CSWAP(dst[8], dst[21]); - SORT_CSWAP(dst[10], dst[22]); - SORT_CSWAP(dst[4], dst[6]); - SORT_CSWAP(dst[17], dst[19]); - SORT_CSWAP(dst[2], dst[14]); - SORT_CSWAP(dst[3], dst[16]); - SORT_CSWAP(dst[7], dst[20]); - SORT_CSWAP(dst[11], dst[22]); - SORT_CSWAP(dst[5], dst[6]); - SORT_CSWAP(dst[18], dst[19]); - SORT_CSWAP(dst[2], dst[13]); - SORT_CSWAP(dst[4], dst[17]); - SORT_CSWAP(dst[8], dst[20]); - SORT_CSWAP(dst[12], dst[22]); - SORT_CSWAP(dst[11], dst[21]); - SORT_CSWAP(dst[5], dst[18]); - SORT_CSWAP(dst[4], dst[16]); - SORT_CSWAP(dst[3], dst[13]); - SORT_CSWAP(dst[6], dst[19]); - SORT_CSWAP(dst[10], dst[20]); - SORT_CSWAP(dst[12], dst[21]); - SORT_CSWAP(dst[5], dst[17]); - SORT_CSWAP(dst[4], dst[14]); - SORT_CSWAP(dst[7], dst[19]); - SORT_CSWAP(dst[12], dst[20]); - SORT_CSWAP(dst[5], dst[16]); - SORT_CSWAP(dst[4], dst[13]); - SORT_CSWAP(dst[8], dst[19]); - SORT_CSWAP(dst[5], dst[15]); - SORT_CSWAP(dst[9], dst[19]); - SORT_CSWAP(dst[5], dst[14]); - SORT_CSWAP(dst[10], dst[19]); - SORT_CSWAP(dst[8], dst[15]); - SORT_CSWAP(dst[9], dst[16]); - SORT_CSWAP(dst[5], dst[13]); - SORT_CSWAP(dst[11], dst[19]); - SORT_CSWAP(dst[7], dst[14]); - SORT_CSWAP(dst[10], dst[17]); - SORT_CSWAP(dst[12], dst[19]); - SORT_CSWAP(dst[6], dst[13]); - SORT_CSWAP(dst[8], dst[14]); - SORT_CSWAP(dst[10], dst[16]); - SORT_CSWAP(dst[11], dst[18]); - SORT_CSWAP(dst[7], dst[13]); - SORT_CSWAP(dst[12], dst[18]); - SORT_CSWAP(dst[11], dst[16]); - SORT_CSWAP(dst[10], dst[14]); - SORT_CSWAP(dst[8], dst[13]); - SORT_CSWAP(dst[12], dst[17]); - SORT_CSWAP(dst[11], dst[15]); - SORT_CSWAP(dst[12], dst[16]); - SORT_CSWAP(dst[9], dst[13]); - SORT_CSWAP(dst[10], dst[13]); - SORT_CSWAP(dst[12], dst[15]); - SORT_CSWAP(dst[11], dst[13]); - SORT_CSWAP(dst[12], dst[14]); - SORT_CSWAP(dst[12], dst[13]); -} - - -#define BITONIC_SORT_27 SORT_MAKE_STR(bitonic_sort_27) -static __inline void BITONIC_SORT_27(SORT_TYPE *dst) { - SORT_CSWAP(dst[1], dst[2]); - SORT_CSWAP(dst[4], dst[5]); - SORT_CSWAP(dst[7], dst[8]); - SORT_CSWAP(dst[9], dst[10]); - SORT_CSWAP(dst[11], dst[12]); - SORT_CSWAP(dst[14], dst[15]); - SORT_CSWAP(dst[16], dst[17]); - SORT_CSWAP(dst[18], dst[19]); - SORT_CSWAP(dst[21], dst[22]); - SORT_CSWAP(dst[23], dst[24]); - SORT_CSWAP(dst[25], dst[26]); - SORT_CSWAP(dst[0], dst[2]); - SORT_CSWAP(dst[3], dst[5]); - SORT_CSWAP(dst[6], dst[8]); - SORT_CSWAP(dst[9], dst[11]); - SORT_CSWAP(dst[10], dst[12]); - SORT_CSWAP(dst[13], dst[15]); - SORT_CSWAP(dst[16], dst[18]); - SORT_CSWAP(dst[17], dst[19]); - SORT_CSWAP(dst[20], dst[22]); - SORT_CSWAP(dst[23], dst[25]); - SORT_CSWAP(dst[24], dst[26]); - SORT_CSWAP(dst[0], dst[1]); - SORT_CSWAP(dst[3], dst[4]); - SORT_CSWAP(dst[2], dst[5]); - SORT_CSWAP(dst[6], dst[7]); - SORT_CSWAP(dst[10], dst[11]); - SORT_CSWAP(dst[8], dst[12]); - SORT_CSWAP(dst[13], dst[14]); - SORT_CSWAP(dst[17], dst[18]); - SORT_CSWAP(dst[15], dst[19]); - SORT_CSWAP(dst[20], dst[21]); - SORT_CSWAP(dst[24], dst[25]); - SORT_CSWAP(dst[22], dst[26]); - SORT_CSWAP(dst[0], dst[3]); - SORT_CSWAP(dst[1], dst[4]); - SORT_CSWAP(dst[6], dst[10]); - SORT_CSWAP(dst[7], dst[11]); - SORT_CSWAP(dst[5], dst[12]); - SORT_CSWAP(dst[13], dst[17]); - SORT_CSWAP(dst[14], dst[18]); - SORT_CSWAP(dst[20], dst[24]); - SORT_CSWAP(dst[21], dst[25]); - SORT_CSWAP(dst[19], dst[26]); - SORT_CSWAP(dst[2], dst[4]); - SORT_CSWAP(dst[1], dst[3]); - SORT_CSWAP(dst[6], dst[9]); - SORT_CSWAP(dst[8], dst[11]); - SORT_CSWAP(dst[13], dst[16]); - SORT_CSWAP(dst[15], dst[18]); - SORT_CSWAP(dst[20], dst[23]); - SORT_CSWAP(dst[22], dst[25]); - SORT_CSWAP(dst[12], dst[26]); - SORT_CSWAP(dst[2], dst[3]); - SORT_CSWAP(dst[7], dst[9]); - SORT_CSWAP(dst[8], dst[10]); - SORT_CSWAP(dst[4], dst[11]); - SORT_CSWAP(dst[14], dst[16]); - SORT_CSWAP(dst[15], dst[17]); - SORT_CSWAP(dst[21], dst[23]); - SORT_CSWAP(dst[22], dst[24]); - SORT_CSWAP(dst[13], dst[20]); - SORT_CSWAP(dst[18], dst[25]); - SORT_CSWAP(dst[8], dst[9]); - SORT_CSWAP(dst[0], dst[7]); - SORT_CSWAP(dst[3], dst[10]); - SORT_CSWAP(dst[5], dst[11]); - SORT_CSWAP(dst[15], dst[16]); - SORT_CSWAP(dst[22], dst[23]); - SORT_CSWAP(dst[14], dst[21]); - SORT_CSWAP(dst[17], dst[24]); - SORT_CSWAP(dst[19], dst[25]); - SORT_CSWAP(dst[0], dst[6]); - SORT_CSWAP(dst[1], dst[8]); - SORT_CSWAP(dst[2], dst[9]); - SORT_CSWAP(dst[4], dst[10]); - SORT_CSWAP(dst[15], dst[22]); - SORT_CSWAP(dst[14], dst[20]); - SORT_CSWAP(dst[16], dst[23]); - SORT_CSWAP(dst[19], dst[24]); - SORT_CSWAP(dst[11], dst[25]); - SORT_CSWAP(dst[2], dst[8]); - SORT_CSWAP(dst[1], dst[6]); - SORT_CSWAP(dst[5], dst[10]); - SORT_CSWAP(dst[15], dst[21]); - SORT_CSWAP(dst[17], dst[23]); - SORT_CSWAP(dst[0], dst[14]); - SORT_CSWAP(dst[12], dst[25]); - SORT_CSWAP(dst[2], dst[7]); - SORT_CSWAP(dst[4], dst[8]); - SORT_CSWAP(dst[5], dst[9]); - SORT_CSWAP(dst[15], dst[20]); - SORT_CSWAP(dst[18], dst[23]); - SORT_CSWAP(dst[17], dst[21]); - SORT_CSWAP(dst[0], dst[13]); - SORT_CSWAP(dst[10], dst[24]); - SORT_CSWAP(dst[2], dst[6]); - SORT_CSWAP(dst[3], dst[7]); - SORT_CSWAP(dst[5], dst[8]); - SORT_CSWAP(dst[19], dst[23]); - SORT_CSWAP(dst[16], dst[20]); - SORT_CSWAP(dst[18], dst[22]); - SORT_CSWAP(dst[1], dst[15]); - SORT_CSWAP(dst[12], dst[24]); - SORT_CSWAP(dst[3], dst[6]); - SORT_CSWAP(dst[5], dst[7]); - SORT_CSWAP(dst[17], dst[20]); - SORT_CSWAP(dst[19], dst[22]); - SORT_CSWAP(dst[2], dst[16]); - SORT_CSWAP(dst[1], dst[13]); - SORT_CSWAP(dst[9], dst[23]); - SORT_CSWAP(dst[4], dst[6]); - SORT_CSWAP(dst[18], dst[20]); - SORT_CSWAP(dst[19], dst[21]); - SORT_CSWAP(dst[2], dst[15]); - SORT_CSWAP(dst[3], dst[17]); - SORT_CSWAP(dst[8], dst[22]); - SORT_CSWAP(dst[10], dst[23]); - SORT_CSWAP(dst[5], dst[6]); - SORT_CSWAP(dst[19], dst[20]); - SORT_CSWAP(dst[2], dst[14]); - SORT_CSWAP(dst[4], dst[18]); - SORT_CSWAP(dst[7], dst[21]); - SORT_CSWAP(dst[11], dst[23]); - SORT_CSWAP(dst[2], dst[13]); - SORT_CSWAP(dst[5], dst[19]); - SORT_CSWAP(dst[4], dst[17]); - SORT_CSWAP(dst[3], dst[14]); - SORT_CSWAP(dst[6], dst[20]); - SORT_CSWAP(dst[8], dst[21]); - SORT_CSWAP(dst[12], dst[23]); - SORT_CSWAP(dst[11], dst[22]); - SORT_CSWAP(dst[5], dst[18]); - SORT_CSWAP(dst[3], dst[13]); - SORT_CSWAP(dst[4], dst[15]); - SORT_CSWAP(dst[7], dst[20]); - SORT_CSWAP(dst[10], dst[21]); - SORT_CSWAP(dst[12], dst[22]); - SORT_CSWAP(dst[5], dst[17]); - SORT_CSWAP(dst[4], dst[13]); - SORT_CSWAP(dst[8], dst[20]); - SORT_CSWAP(dst[12], dst[21]); - SORT_CSWAP(dst[5], dst[16]); - SORT_CSWAP(dst[9], dst[20]); - SORT_CSWAP(dst[5], dst[15]); - SORT_CSWAP(dst[10], dst[20]); - SORT_CSWAP(dst[9], dst[16]); - SORT_CSWAP(dst[5], dst[14]); - SORT_CSWAP(dst[11], dst[20]); - SORT_CSWAP(dst[8], dst[15]); - SORT_CSWAP(dst[10], dst[17]); - SORT_CSWAP(dst[5], dst[13]); - SORT_CSWAP(dst[12], dst[20]); - SORT_CSWAP(dst[7], dst[14]); - SORT_CSWAP(dst[10], dst[16]); - SORT_CSWAP(dst[11], dst[18]); - SORT_CSWAP(dst[6], dst[13]); - SORT_CSWAP(dst[8], dst[14]); - SORT_CSWAP(dst[12], dst[19]); - SORT_CSWAP(dst[11], dst[16]); - SORT_CSWAP(dst[7], dst[13]); - SORT_CSWAP(dst[12], dst[18]); - SORT_CSWAP(dst[10], dst[14]); - SORT_CSWAP(dst[11], dst[15]); - SORT_CSWAP(dst[8], dst[13]); - SORT_CSWAP(dst[12], dst[17]); - SORT_CSWAP(dst[12], dst[16]); - SORT_CSWAP(dst[9], dst[13]); - SORT_CSWAP(dst[10], dst[13]); - SORT_CSWAP(dst[12], dst[15]); - SORT_CSWAP(dst[11], dst[13]); - SORT_CSWAP(dst[12], dst[14]); - SORT_CSWAP(dst[12], dst[13]); -} - - -#define BITONIC_SORT_28 SORT_MAKE_STR(bitonic_sort_28) -static __inline void BITONIC_SORT_28(SORT_TYPE *dst) { - SORT_CSWAP(dst[1], dst[2]); - SORT_CSWAP(dst[3], dst[4]); - SORT_CSWAP(dst[5], dst[6]); - SORT_CSWAP(dst[8], dst[9]); - SORT_CSWAP(dst[10], dst[11]); - SORT_CSWAP(dst[12], dst[13]); - SORT_CSWAP(dst[15], dst[16]); - SORT_CSWAP(dst[17], dst[18]); - SORT_CSWAP(dst[19], dst[20]); - SORT_CSWAP(dst[22], dst[23]); - SORT_CSWAP(dst[24], dst[25]); - SORT_CSWAP(dst[26], dst[27]); - SORT_CSWAP(dst[0], dst[2]); - SORT_CSWAP(dst[3], dst[5]); - SORT_CSWAP(dst[4], dst[6]); - SORT_CSWAP(dst[7], dst[9]); - SORT_CSWAP(dst[10], dst[12]); - SORT_CSWAP(dst[11], dst[13]); - SORT_CSWAP(dst[14], dst[16]); - SORT_CSWAP(dst[17], dst[19]); - SORT_CSWAP(dst[18], dst[20]); - SORT_CSWAP(dst[21], dst[23]); - SORT_CSWAP(dst[24], dst[26]); - SORT_CSWAP(dst[25], dst[27]); - SORT_CSWAP(dst[0], dst[1]); - SORT_CSWAP(dst[4], dst[5]); - SORT_CSWAP(dst[2], dst[6]); - SORT_CSWAP(dst[7], dst[8]); - SORT_CSWAP(dst[11], dst[12]); - SORT_CSWAP(dst[9], dst[13]); - SORT_CSWAP(dst[14], dst[15]); - SORT_CSWAP(dst[18], dst[19]); - SORT_CSWAP(dst[16], dst[20]); - SORT_CSWAP(dst[21], dst[22]); - SORT_CSWAP(dst[25], dst[26]); - SORT_CSWAP(dst[23], dst[27]); - SORT_CSWAP(dst[0], dst[4]); - SORT_CSWAP(dst[1], dst[5]); - SORT_CSWAP(dst[7], dst[11]); - SORT_CSWAP(dst[8], dst[12]); - SORT_CSWAP(dst[6], dst[13]); - SORT_CSWAP(dst[14], dst[18]); - SORT_CSWAP(dst[15], dst[19]); - SORT_CSWAP(dst[21], dst[25]); - SORT_CSWAP(dst[22], dst[26]); - SORT_CSWAP(dst[20], dst[27]); - SORT_CSWAP(dst[0], dst[3]); - SORT_CSWAP(dst[2], dst[5]); - SORT_CSWAP(dst[7], dst[10]); - SORT_CSWAP(dst[9], dst[12]); - SORT_CSWAP(dst[14], dst[17]); - SORT_CSWAP(dst[16], dst[19]); - SORT_CSWAP(dst[21], dst[24]); - SORT_CSWAP(dst[23], dst[26]); - SORT_CSWAP(dst[13], dst[27]); - SORT_CSWAP(dst[1], dst[3]); - SORT_CSWAP(dst[2], dst[4]); - SORT_CSWAP(dst[8], dst[10]); - SORT_CSWAP(dst[9], dst[11]); - SORT_CSWAP(dst[0], dst[7]); - SORT_CSWAP(dst[5], dst[12]); - SORT_CSWAP(dst[15], dst[17]); - SORT_CSWAP(dst[16], dst[18]); - SORT_CSWAP(dst[22], dst[24]); - SORT_CSWAP(dst[23], dst[25]); - SORT_CSWAP(dst[14], dst[21]); - SORT_CSWAP(dst[19], dst[26]); - SORT_CSWAP(dst[2], dst[3]); - SORT_CSWAP(dst[9], dst[10]); - SORT_CSWAP(dst[1], dst[8]); - SORT_CSWAP(dst[4], dst[11]); - SORT_CSWAP(dst[6], dst[12]); - SORT_CSWAP(dst[16], dst[17]); - SORT_CSWAP(dst[23], dst[24]); - SORT_CSWAP(dst[15], dst[22]); - SORT_CSWAP(dst[18], dst[25]); - SORT_CSWAP(dst[20], dst[26]); - SORT_CSWAP(dst[0], dst[14]); - SORT_CSWAP(dst[2], dst[9]); - SORT_CSWAP(dst[1], dst[7]); - SORT_CSWAP(dst[3], dst[10]); - SORT_CSWAP(dst[6], dst[11]); - SORT_CSWAP(dst[16], dst[23]); - SORT_CSWAP(dst[15], dst[21]); - SORT_CSWAP(dst[17], dst[24]); - SORT_CSWAP(dst[20], dst[25]); - SORT_CSWAP(dst[12], dst[26]); - SORT_CSWAP(dst[2], dst[8]); - SORT_CSWAP(dst[4], dst[10]); - SORT_CSWAP(dst[16], dst[22]); - SORT_CSWAP(dst[18], dst[24]); - SORT_CSWAP(dst[1], dst[15]); - SORT_CSWAP(dst[11], dst[25]); - SORT_CSWAP(dst[13], dst[26]); - SORT_CSWAP(dst[2], dst[7]); - SORT_CSWAP(dst[5], dst[10]); - SORT_CSWAP(dst[4], dst[8]); - SORT_CSWAP(dst[16], dst[21]); - SORT_CSWAP(dst[19], dst[24]); - SORT_CSWAP(dst[18], dst[22]); - SORT_CSWAP(dst[1], dst[14]); - SORT_CSWAP(dst[13], dst[25]); - SORT_CSWAP(dst[6], dst[10]); - SORT_CSWAP(dst[3], dst[7]); - SORT_CSWAP(dst[5], dst[9]); - SORT_CSWAP(dst[20], dst[24]); - SORT_CSWAP(dst[17], dst[21]); - SORT_CSWAP(dst[19], dst[23]); - SORT_CSWAP(dst[2], dst[16]); - SORT_CSWAP(dst[4], dst[7]); - SORT_CSWAP(dst[6], dst[9]); - SORT_CSWAP(dst[18], dst[21]); - SORT_CSWAP(dst[20], dst[23]); - SORT_CSWAP(dst[2], dst[15]); - SORT_CSWAP(dst[3], dst[17]); - SORT_CSWAP(dst[10], dst[24]); - SORT_CSWAP(dst[5], dst[7]); - SORT_CSWAP(dst[6], dst[8]); - SORT_CSWAP(dst[19], dst[21]); - SORT_CSWAP(dst[20], dst[22]); - SORT_CSWAP(dst[2], dst[14]); - SORT_CSWAP(dst[4], dst[18]); - SORT_CSWAP(dst[9], dst[23]); - SORT_CSWAP(dst[11], dst[24]); - SORT_CSWAP(dst[6], dst[7]); - SORT_CSWAP(dst[20], dst[21]); - SORT_CSWAP(dst[4], dst[17]); - SORT_CSWAP(dst[5], dst[19]); - SORT_CSWAP(dst[3], dst[14]); - SORT_CSWAP(dst[8], dst[22]); - SORT_CSWAP(dst[12], dst[24]); - SORT_CSWAP(dst[6], dst[20]); - SORT_CSWAP(dst[5], dst[17]); - SORT_CSWAP(dst[4], dst[15]); - SORT_CSWAP(dst[7], dst[21]); - SORT_CSWAP(dst[9], dst[22]); - SORT_CSWAP(dst[13], dst[24]); - SORT_CSWAP(dst[12], dst[23]); - SORT_CSWAP(dst[6], dst[19]); - SORT_CSWAP(dst[4], dst[14]); - SORT_CSWAP(dst[5], dst[16]); - SORT_CSWAP(dst[8], dst[21]); - SORT_CSWAP(dst[11], dst[22]); - SORT_CSWAP(dst[13], dst[23]); - SORT_CSWAP(dst[6], dst[18]); - SORT_CSWAP(dst[5], dst[14]); - SORT_CSWAP(dst[9], dst[21]); - SORT_CSWAP(dst[13], dst[22]); - SORT_CSWAP(dst[6], dst[17]); - SORT_CSWAP(dst[10], dst[21]); - SORT_CSWAP(dst[6], dst[16]); - SORT_CSWAP(dst[11], dst[21]); - SORT_CSWAP(dst[10], dst[17]); - SORT_CSWAP(dst[6], dst[15]); - SORT_CSWAP(dst[12], dst[21]); - SORT_CSWAP(dst[9], dst[16]); - SORT_CSWAP(dst[11], dst[18]); - SORT_CSWAP(dst[6], dst[14]); - SORT_CSWAP(dst[13], dst[21]); - SORT_CSWAP(dst[8], dst[15]); - SORT_CSWAP(dst[11], dst[17]); - SORT_CSWAP(dst[12], dst[19]); - SORT_CSWAP(dst[7], dst[14]); - SORT_CSWAP(dst[9], dst[15]); - SORT_CSWAP(dst[13], dst[20]); - SORT_CSWAP(dst[12], dst[17]); - SORT_CSWAP(dst[8], dst[14]); - SORT_CSWAP(dst[13], dst[19]); - SORT_CSWAP(dst[11], dst[15]); - SORT_CSWAP(dst[12], dst[16]); - SORT_CSWAP(dst[9], dst[14]); - SORT_CSWAP(dst[13], dst[18]); - SORT_CSWAP(dst[13], dst[17]); - SORT_CSWAP(dst[10], dst[14]); - SORT_CSWAP(dst[11], dst[14]); - SORT_CSWAP(dst[13], dst[16]); - SORT_CSWAP(dst[12], dst[14]); - SORT_CSWAP(dst[13], dst[15]); - SORT_CSWAP(dst[13], dst[14]); -} - - -#define BITONIC_SORT_29 SORT_MAKE_STR(bitonic_sort_29) -static __inline void BITONIC_SORT_29(SORT_TYPE *dst) { - SORT_CSWAP(dst[1], dst[2]); - SORT_CSWAP(dst[3], dst[4]); - SORT_CSWAP(dst[5], dst[6]); - SORT_CSWAP(dst[8], dst[9]); - SORT_CSWAP(dst[10], dst[11]); - SORT_CSWAP(dst[12], dst[13]); - SORT_CSWAP(dst[15], dst[16]); - SORT_CSWAP(dst[17], dst[18]); - SORT_CSWAP(dst[19], dst[20]); - SORT_CSWAP(dst[21], dst[22]); - SORT_CSWAP(dst[23], dst[24]); - SORT_CSWAP(dst[25], dst[26]); - SORT_CSWAP(dst[27], dst[28]); - SORT_CSWAP(dst[0], dst[2]); - SORT_CSWAP(dst[3], dst[5]); - SORT_CSWAP(dst[4], dst[6]); - SORT_CSWAP(dst[7], dst[9]); - SORT_CSWAP(dst[10], dst[12]); - SORT_CSWAP(dst[11], dst[13]); - SORT_CSWAP(dst[14], dst[16]); - SORT_CSWAP(dst[17], dst[19]); - SORT_CSWAP(dst[18], dst[20]); - SORT_CSWAP(dst[21], dst[23]); - SORT_CSWAP(dst[22], dst[24]); - SORT_CSWAP(dst[25], dst[27]); - SORT_CSWAP(dst[26], dst[28]); - SORT_CSWAP(dst[0], dst[1]); - SORT_CSWAP(dst[4], dst[5]); - SORT_CSWAP(dst[2], dst[6]); - SORT_CSWAP(dst[7], dst[8]); - SORT_CSWAP(dst[11], dst[12]); - SORT_CSWAP(dst[9], dst[13]); - SORT_CSWAP(dst[14], dst[15]); - SORT_CSWAP(dst[18], dst[19]); - SORT_CSWAP(dst[16], dst[20]); - SORT_CSWAP(dst[22], dst[23]); - SORT_CSWAP(dst[26], dst[27]); - SORT_CSWAP(dst[21], dst[25]); - SORT_CSWAP(dst[24], dst[28]); - SORT_CSWAP(dst[0], dst[4]); - SORT_CSWAP(dst[1], dst[5]); - SORT_CSWAP(dst[7], dst[11]); - SORT_CSWAP(dst[8], dst[12]); - SORT_CSWAP(dst[6], dst[13]); - SORT_CSWAP(dst[14], dst[18]); - SORT_CSWAP(dst[15], dst[19]); - SORT_CSWAP(dst[22], dst[26]); - SORT_CSWAP(dst[23], dst[27]); - SORT_CSWAP(dst[20], dst[28]); - SORT_CSWAP(dst[0], dst[3]); - SORT_CSWAP(dst[2], dst[5]); - SORT_CSWAP(dst[7], dst[10]); - SORT_CSWAP(dst[9], dst[12]); - SORT_CSWAP(dst[14], dst[17]); - SORT_CSWAP(dst[16], dst[19]); - SORT_CSWAP(dst[22], dst[25]); - SORT_CSWAP(dst[24], dst[27]); - SORT_CSWAP(dst[13], dst[28]); - SORT_CSWAP(dst[1], dst[3]); - SORT_CSWAP(dst[2], dst[4]); - SORT_CSWAP(dst[8], dst[10]); - SORT_CSWAP(dst[9], dst[11]); - SORT_CSWAP(dst[0], dst[7]); - SORT_CSWAP(dst[5], dst[12]); - SORT_CSWAP(dst[15], dst[17]); - SORT_CSWAP(dst[16], dst[18]); - SORT_CSWAP(dst[23], dst[25]); - SORT_CSWAP(dst[24], dst[26]); - SORT_CSWAP(dst[14], dst[22]); - SORT_CSWAP(dst[19], dst[27]); - SORT_CSWAP(dst[2], dst[3]); - SORT_CSWAP(dst[9], dst[10]); - SORT_CSWAP(dst[1], dst[8]); - SORT_CSWAP(dst[4], dst[11]); - SORT_CSWAP(dst[6], dst[12]); - SORT_CSWAP(dst[16], dst[17]); - SORT_CSWAP(dst[24], dst[25]); - SORT_CSWAP(dst[14], dst[21]); - SORT_CSWAP(dst[15], dst[23]); - SORT_CSWAP(dst[18], dst[26]); - SORT_CSWAP(dst[20], dst[27]); - SORT_CSWAP(dst[2], dst[9]); - SORT_CSWAP(dst[1], dst[7]); - SORT_CSWAP(dst[3], dst[10]); - SORT_CSWAP(dst[6], dst[11]); - SORT_CSWAP(dst[16], dst[24]); - SORT_CSWAP(dst[15], dst[21]); - SORT_CSWAP(dst[17], dst[25]); - SORT_CSWAP(dst[20], dst[26]); - SORT_CSWAP(dst[12], dst[27]); - SORT_CSWAP(dst[2], dst[8]); - SORT_CSWAP(dst[4], dst[10]); - SORT_CSWAP(dst[16], dst[23]); - SORT_CSWAP(dst[18], dst[25]); - SORT_CSWAP(dst[0], dst[15]); - SORT_CSWAP(dst[11], dst[26]); - SORT_CSWAP(dst[13], dst[27]); - SORT_CSWAP(dst[2], dst[7]); - SORT_CSWAP(dst[5], dst[10]); - SORT_CSWAP(dst[4], dst[8]); - SORT_CSWAP(dst[16], dst[22]); - SORT_CSWAP(dst[19], dst[25]); - SORT_CSWAP(dst[0], dst[14]); - SORT_CSWAP(dst[13], dst[26]); - SORT_CSWAP(dst[6], dst[10]); - SORT_CSWAP(dst[3], dst[7]); - SORT_CSWAP(dst[5], dst[9]); - SORT_CSWAP(dst[16], dst[21]); - SORT_CSWAP(dst[20], dst[25]); - SORT_CSWAP(dst[18], dst[22]); - SORT_CSWAP(dst[19], dst[23]); - SORT_CSWAP(dst[4], dst[7]); - SORT_CSWAP(dst[6], dst[9]); - SORT_CSWAP(dst[17], dst[21]); - SORT_CSWAP(dst[20], dst[24]); - SORT_CSWAP(dst[1], dst[16]); - SORT_CSWAP(dst[10], dst[25]); - SORT_CSWAP(dst[5], dst[7]); - SORT_CSWAP(dst[6], dst[8]); - SORT_CSWAP(dst[18], dst[21]); - SORT_CSWAP(dst[20], dst[23]); - SORT_CSWAP(dst[2], dst[17]); - SORT_CSWAP(dst[1], dst[14]); - SORT_CSWAP(dst[9], dst[24]); - SORT_CSWAP(dst[11], dst[25]); - SORT_CSWAP(dst[6], dst[7]); - SORT_CSWAP(dst[19], dst[21]); - SORT_CSWAP(dst[20], dst[22]); - SORT_CSWAP(dst[2], dst[16]); - SORT_CSWAP(dst[3], dst[18]); - SORT_CSWAP(dst[8], dst[23]); - SORT_CSWAP(dst[12], dst[25]); - SORT_CSWAP(dst[20], dst[21]); - SORT_CSWAP(dst[2], dst[15]); - SORT_CSWAP(dst[4], dst[19]); - SORT_CSWAP(dst[7], dst[22]); - SORT_CSWAP(dst[9], dst[23]); - SORT_CSWAP(dst[13], dst[25]); - SORT_CSWAP(dst[12], dst[24]); - SORT_CSWAP(dst[2], dst[14]); - SORT_CSWAP(dst[4], dst[18]); - SORT_CSWAP(dst[5], dst[20]); - SORT_CSWAP(dst[6], dst[21]); - SORT_CSWAP(dst[8], dst[22]); - SORT_CSWAP(dst[11], dst[23]); - SORT_CSWAP(dst[13], dst[24]); - SORT_CSWAP(dst[6], dst[20]); - SORT_CSWAP(dst[5], dst[18]); - SORT_CSWAP(dst[3], dst[14]); - SORT_CSWAP(dst[4], dst[15]); - SORT_CSWAP(dst[9], dst[22]); - SORT_CSWAP(dst[13], dst[23]); - SORT_CSWAP(dst[6], dst[19]); - SORT_CSWAP(dst[4], dst[14]); - SORT_CSWAP(dst[5], dst[16]); - SORT_CSWAP(dst[10], dst[22]); - SORT_CSWAP(dst[6], dst[18]); - SORT_CSWAP(dst[5], dst[14]); - SORT_CSWAP(dst[11], dst[22]); - SORT_CSWAP(dst[6], dst[17]); - SORT_CSWAP(dst[12], dst[22]); - SORT_CSWAP(dst[10], dst[18]); - SORT_CSWAP(dst[11], dst[19]); - SORT_CSWAP(dst[6], dst[16]); - SORT_CSWAP(dst[13], dst[22]); - SORT_CSWAP(dst[9], dst[17]); - SORT_CSWAP(dst[11], dst[18]); - SORT_CSWAP(dst[12], dst[20]); - SORT_CSWAP(dst[6], dst[15]); - SORT_CSWAP(dst[8], dst[16]); - SORT_CSWAP(dst[13], dst[21]); - SORT_CSWAP(dst[12], dst[18]); - SORT_CSWAP(dst[6], dst[14]); - SORT_CSWAP(dst[7], dst[15]); - SORT_CSWAP(dst[9], dst[16]); - SORT_CSWAP(dst[13], dst[20]); - SORT_CSWAP(dst[7], dst[14]); - SORT_CSWAP(dst[9], dst[15]); - SORT_CSWAP(dst[13], dst[19]); - SORT_CSWAP(dst[12], dst[16]); - SORT_CSWAP(dst[8], dst[14]); - SORT_CSWAP(dst[13], dst[18]); - SORT_CSWAP(dst[11], dst[15]); - SORT_CSWAP(dst[9], dst[14]); - SORT_CSWAP(dst[13], dst[17]); - SORT_CSWAP(dst[10], dst[14]); - SORT_CSWAP(dst[13], dst[16]); - SORT_CSWAP(dst[11], dst[14]); - SORT_CSWAP(dst[13], dst[15]); - SORT_CSWAP(dst[12], dst[14]); - SORT_CSWAP(dst[13], dst[14]); -} - - -#define BITONIC_SORT_30 SORT_MAKE_STR(bitonic_sort_30) -static __inline void BITONIC_SORT_30(SORT_TYPE *dst) { - SORT_CSWAP(dst[1], dst[2]); - SORT_CSWAP(dst[3], dst[4]); - SORT_CSWAP(dst[5], dst[6]); - SORT_CSWAP(dst[7], dst[8]); - SORT_CSWAP(dst[9], dst[10]); - SORT_CSWAP(dst[11], dst[12]); - SORT_CSWAP(dst[13], dst[14]); - SORT_CSWAP(dst[16], dst[17]); - SORT_CSWAP(dst[18], dst[19]); - SORT_CSWAP(dst[20], dst[21]); - SORT_CSWAP(dst[22], dst[23]); - SORT_CSWAP(dst[24], dst[25]); - SORT_CSWAP(dst[26], dst[27]); - SORT_CSWAP(dst[28], dst[29]); - SORT_CSWAP(dst[0], dst[2]); - SORT_CSWAP(dst[3], dst[5]); - SORT_CSWAP(dst[4], dst[6]); - SORT_CSWAP(dst[7], dst[9]); - SORT_CSWAP(dst[8], dst[10]); - SORT_CSWAP(dst[11], dst[13]); - SORT_CSWAP(dst[12], dst[14]); - SORT_CSWAP(dst[15], dst[17]); - SORT_CSWAP(dst[18], dst[20]); - SORT_CSWAP(dst[19], dst[21]); - SORT_CSWAP(dst[22], dst[24]); - SORT_CSWAP(dst[23], dst[25]); - SORT_CSWAP(dst[26], dst[28]); - SORT_CSWAP(dst[27], dst[29]); - SORT_CSWAP(dst[0], dst[1]); - SORT_CSWAP(dst[4], dst[5]); - SORT_CSWAP(dst[2], dst[6]); - SORT_CSWAP(dst[8], dst[9]); - SORT_CSWAP(dst[12], dst[13]); - SORT_CSWAP(dst[7], dst[11]); - SORT_CSWAP(dst[10], dst[14]); - SORT_CSWAP(dst[15], dst[16]); - SORT_CSWAP(dst[19], dst[20]); - SORT_CSWAP(dst[17], dst[21]); - SORT_CSWAP(dst[23], dst[24]); - SORT_CSWAP(dst[27], dst[28]); - SORT_CSWAP(dst[22], dst[26]); - SORT_CSWAP(dst[25], dst[29]); - SORT_CSWAP(dst[0], dst[4]); - SORT_CSWAP(dst[1], dst[5]); - SORT_CSWAP(dst[8], dst[12]); - SORT_CSWAP(dst[9], dst[13]); - SORT_CSWAP(dst[6], dst[14]); - SORT_CSWAP(dst[15], dst[19]); - SORT_CSWAP(dst[16], dst[20]); - SORT_CSWAP(dst[23], dst[27]); - SORT_CSWAP(dst[24], dst[28]); - SORT_CSWAP(dst[21], dst[29]); - SORT_CSWAP(dst[0], dst[3]); - SORT_CSWAP(dst[2], dst[5]); - SORT_CSWAP(dst[8], dst[11]); - SORT_CSWAP(dst[10], dst[13]); - SORT_CSWAP(dst[15], dst[18]); - SORT_CSWAP(dst[17], dst[20]); - SORT_CSWAP(dst[23], dst[26]); - SORT_CSWAP(dst[25], dst[28]); - SORT_CSWAP(dst[14], dst[29]); - SORT_CSWAP(dst[1], dst[3]); - SORT_CSWAP(dst[2], dst[4]); - SORT_CSWAP(dst[9], dst[11]); - SORT_CSWAP(dst[10], dst[12]); - SORT_CSWAP(dst[0], dst[8]); - SORT_CSWAP(dst[5], dst[13]); - SORT_CSWAP(dst[16], dst[18]); - SORT_CSWAP(dst[17], dst[19]); - SORT_CSWAP(dst[24], dst[26]); - SORT_CSWAP(dst[25], dst[27]); - SORT_CSWAP(dst[15], dst[23]); - SORT_CSWAP(dst[20], dst[28]); - SORT_CSWAP(dst[2], dst[3]); - SORT_CSWAP(dst[10], dst[11]); - SORT_CSWAP(dst[0], dst[7]); - SORT_CSWAP(dst[1], dst[9]); - SORT_CSWAP(dst[4], dst[12]); - SORT_CSWAP(dst[6], dst[13]); - SORT_CSWAP(dst[17], dst[18]); - SORT_CSWAP(dst[25], dst[26]); - SORT_CSWAP(dst[15], dst[22]); - SORT_CSWAP(dst[16], dst[24]); - SORT_CSWAP(dst[19], dst[27]); - SORT_CSWAP(dst[21], dst[28]); - SORT_CSWAP(dst[2], dst[10]); - SORT_CSWAP(dst[1], dst[7]); - SORT_CSWAP(dst[3], dst[11]); - SORT_CSWAP(dst[6], dst[12]); - SORT_CSWAP(dst[17], dst[25]); - SORT_CSWAP(dst[16], dst[22]); - SORT_CSWAP(dst[18], dst[26]); - SORT_CSWAP(dst[21], dst[27]); - SORT_CSWAP(dst[0], dst[15]); - SORT_CSWAP(dst[13], dst[28]); - SORT_CSWAP(dst[2], dst[9]); - SORT_CSWAP(dst[4], dst[11]); - SORT_CSWAP(dst[17], dst[24]); - SORT_CSWAP(dst[19], dst[26]); - SORT_CSWAP(dst[1], dst[16]); - SORT_CSWAP(dst[12], dst[27]); - SORT_CSWAP(dst[14], dst[28]); - SORT_CSWAP(dst[2], dst[8]); - SORT_CSWAP(dst[5], dst[11]); - SORT_CSWAP(dst[17], dst[23]); - SORT_CSWAP(dst[20], dst[26]); - SORT_CSWAP(dst[1], dst[15]); - SORT_CSWAP(dst[14], dst[27]); - SORT_CSWAP(dst[2], dst[7]); - SORT_CSWAP(dst[6], dst[11]); - SORT_CSWAP(dst[4], dst[8]); - SORT_CSWAP(dst[5], dst[9]); - SORT_CSWAP(dst[17], dst[22]); - SORT_CSWAP(dst[21], dst[26]); - SORT_CSWAP(dst[19], dst[23]); - SORT_CSWAP(dst[20], dst[24]); - SORT_CSWAP(dst[3], dst[7]); - SORT_CSWAP(dst[6], dst[10]); - SORT_CSWAP(dst[18], dst[22]); - SORT_CSWAP(dst[21], dst[25]); - SORT_CSWAP(dst[2], dst[17]); - SORT_CSWAP(dst[11], dst[26]); - SORT_CSWAP(dst[4], dst[7]); - SORT_CSWAP(dst[6], dst[9]); - SORT_CSWAP(dst[19], dst[22]); - SORT_CSWAP(dst[21], dst[24]); - SORT_CSWAP(dst[2], dst[16]); - SORT_CSWAP(dst[3], dst[18]); - SORT_CSWAP(dst[10], dst[25]); - SORT_CSWAP(dst[12], dst[26]); - SORT_CSWAP(dst[5], dst[7]); - SORT_CSWAP(dst[6], dst[8]); - SORT_CSWAP(dst[20], dst[22]); - SORT_CSWAP(dst[21], dst[23]); - SORT_CSWAP(dst[2], dst[15]); - SORT_CSWAP(dst[4], dst[19]); - SORT_CSWAP(dst[9], dst[24]); - SORT_CSWAP(dst[13], dst[26]); - SORT_CSWAP(dst[6], dst[7]); - SORT_CSWAP(dst[21], dst[22]); - SORT_CSWAP(dst[4], dst[18]); - SORT_CSWAP(dst[5], dst[20]); - SORT_CSWAP(dst[3], dst[15]); - SORT_CSWAP(dst[8], dst[23]); - SORT_CSWAP(dst[10], dst[24]); - SORT_CSWAP(dst[14], dst[26]); - SORT_CSWAP(dst[6], dst[21]); - SORT_CSWAP(dst[5], dst[18]); - SORT_CSWAP(dst[4], dst[16]); - SORT_CSWAP(dst[7], dst[22]); - SORT_CSWAP(dst[10], dst[23]); - SORT_CSWAP(dst[13], dst[24]); - SORT_CSWAP(dst[14], dst[25]); - SORT_CSWAP(dst[6], dst[20]); - SORT_CSWAP(dst[4], dst[15]); - SORT_CSWAP(dst[5], dst[17]); - SORT_CSWAP(dst[8], dst[22]); - SORT_CSWAP(dst[12], dst[23]); - SORT_CSWAP(dst[14], dst[24]); - SORT_CSWAP(dst[6], dst[19]); - SORT_CSWAP(dst[5], dst[15]); - SORT_CSWAP(dst[9], dst[22]); - SORT_CSWAP(dst[14], dst[23]); - SORT_CSWAP(dst[6], dst[18]); - SORT_CSWAP(dst[10], dst[22]); - SORT_CSWAP(dst[6], dst[17]); - SORT_CSWAP(dst[11], dst[22]); - SORT_CSWAP(dst[10], dst[18]); - SORT_CSWAP(dst[6], dst[16]); - SORT_CSWAP(dst[12], dst[22]); - SORT_CSWAP(dst[9], dst[17]); - SORT_CSWAP(dst[11], dst[19]); - SORT_CSWAP(dst[6], dst[15]); - SORT_CSWAP(dst[13], dst[22]); - SORT_CSWAP(dst[8], dst[16]); - SORT_CSWAP(dst[10], dst[17]); - SORT_CSWAP(dst[12], dst[20]); - SORT_CSWAP(dst[14], dst[22]); - SORT_CSWAP(dst[7], dst[15]); - SORT_CSWAP(dst[10], dst[16]); - SORT_CSWAP(dst[12], dst[19]); - SORT_CSWAP(dst[13], dst[21]); - SORT_CSWAP(dst[8], dst[15]); - SORT_CSWAP(dst[14], dst[21]); - SORT_CSWAP(dst[13], dst[19]); - SORT_CSWAP(dst[12], dst[16]); - SORT_CSWAP(dst[9], dst[15]); - SORT_CSWAP(dst[14], dst[20]); - SORT_CSWAP(dst[13], dst[17]); - SORT_CSWAP(dst[10], dst[15]); - SORT_CSWAP(dst[14], dst[19]); - SORT_CSWAP(dst[11], dst[15]); - SORT_CSWAP(dst[14], dst[18]); - SORT_CSWAP(dst[12], dst[15]); - SORT_CSWAP(dst[14], dst[17]); - SORT_CSWAP(dst[13], dst[15]); - SORT_CSWAP(dst[14], dst[16]); - SORT_CSWAP(dst[14], dst[15]); -} - - -#define BITONIC_SORT_31 SORT_MAKE_STR(bitonic_sort_31) -static __inline void BITONIC_SORT_31(SORT_TYPE *dst) { - SORT_CSWAP(dst[1], dst[2]); - SORT_CSWAP(dst[3], dst[4]); - SORT_CSWAP(dst[5], dst[6]); - SORT_CSWAP(dst[7], dst[8]); - SORT_CSWAP(dst[9], dst[10]); - SORT_CSWAP(dst[11], dst[12]); - SORT_CSWAP(dst[13], dst[14]); - SORT_CSWAP(dst[15], dst[16]); - SORT_CSWAP(dst[17], dst[18]); - SORT_CSWAP(dst[19], dst[20]); - SORT_CSWAP(dst[21], dst[22]); - SORT_CSWAP(dst[23], dst[24]); - SORT_CSWAP(dst[25], dst[26]); - SORT_CSWAP(dst[27], dst[28]); - SORT_CSWAP(dst[29], dst[30]); - SORT_CSWAP(dst[0], dst[2]); - SORT_CSWAP(dst[3], dst[5]); - SORT_CSWAP(dst[4], dst[6]); - SORT_CSWAP(dst[7], dst[9]); - SORT_CSWAP(dst[8], dst[10]); - SORT_CSWAP(dst[11], dst[13]); - SORT_CSWAP(dst[12], dst[14]); - SORT_CSWAP(dst[15], dst[17]); - SORT_CSWAP(dst[16], dst[18]); - SORT_CSWAP(dst[19], dst[21]); - SORT_CSWAP(dst[20], dst[22]); - SORT_CSWAP(dst[23], dst[25]); - SORT_CSWAP(dst[24], dst[26]); - SORT_CSWAP(dst[27], dst[29]); - SORT_CSWAP(dst[28], dst[30]); - SORT_CSWAP(dst[0], dst[1]); - SORT_CSWAP(dst[4], dst[5]); - SORT_CSWAP(dst[2], dst[6]); - SORT_CSWAP(dst[8], dst[9]); - SORT_CSWAP(dst[12], dst[13]); - SORT_CSWAP(dst[7], dst[11]); - SORT_CSWAP(dst[10], dst[14]); - SORT_CSWAP(dst[16], dst[17]); - SORT_CSWAP(dst[20], dst[21]); - SORT_CSWAP(dst[15], dst[19]); - SORT_CSWAP(dst[18], dst[22]); - SORT_CSWAP(dst[24], dst[25]); - SORT_CSWAP(dst[28], dst[29]); - SORT_CSWAP(dst[23], dst[27]); - SORT_CSWAP(dst[26], dst[30]); - SORT_CSWAP(dst[0], dst[4]); - SORT_CSWAP(dst[1], dst[5]); - SORT_CSWAP(dst[8], dst[12]); - SORT_CSWAP(dst[9], dst[13]); - SORT_CSWAP(dst[6], dst[14]); - SORT_CSWAP(dst[16], dst[20]); - SORT_CSWAP(dst[17], dst[21]); - SORT_CSWAP(dst[24], dst[28]); - SORT_CSWAP(dst[25], dst[29]); - SORT_CSWAP(dst[15], dst[23]); - SORT_CSWAP(dst[22], dst[30]); - SORT_CSWAP(dst[0], dst[3]); - SORT_CSWAP(dst[2], dst[5]); - SORT_CSWAP(dst[8], dst[11]); - SORT_CSWAP(dst[10], dst[13]); - SORT_CSWAP(dst[16], dst[19]); - SORT_CSWAP(dst[18], dst[21]); - SORT_CSWAP(dst[24], dst[27]); - SORT_CSWAP(dst[26], dst[29]); - SORT_CSWAP(dst[14], dst[30]); - SORT_CSWAP(dst[1], dst[3]); - SORT_CSWAP(dst[2], dst[4]); - SORT_CSWAP(dst[9], dst[11]); - SORT_CSWAP(dst[10], dst[12]); - SORT_CSWAP(dst[0], dst[8]); - SORT_CSWAP(dst[5], dst[13]); - SORT_CSWAP(dst[17], dst[19]); - SORT_CSWAP(dst[18], dst[20]); - SORT_CSWAP(dst[25], dst[27]); - SORT_CSWAP(dst[26], dst[28]); - SORT_CSWAP(dst[16], dst[24]); - SORT_CSWAP(dst[21], dst[29]); - SORT_CSWAP(dst[2], dst[3]); - SORT_CSWAP(dst[10], dst[11]); - SORT_CSWAP(dst[0], dst[7]); - SORT_CSWAP(dst[1], dst[9]); - SORT_CSWAP(dst[4], dst[12]); - SORT_CSWAP(dst[6], dst[13]); - SORT_CSWAP(dst[18], dst[19]); - SORT_CSWAP(dst[26], dst[27]); - SORT_CSWAP(dst[16], dst[23]); - SORT_CSWAP(dst[17], dst[25]); - SORT_CSWAP(dst[20], dst[28]); - SORT_CSWAP(dst[22], dst[29]); - SORT_CSWAP(dst[2], dst[10]); - SORT_CSWAP(dst[1], dst[7]); - SORT_CSWAP(dst[3], dst[11]); - SORT_CSWAP(dst[6], dst[12]); - SORT_CSWAP(dst[18], dst[26]); - SORT_CSWAP(dst[17], dst[23]); - SORT_CSWAP(dst[19], dst[27]); - SORT_CSWAP(dst[22], dst[28]); - SORT_CSWAP(dst[0], dst[16]); - SORT_CSWAP(dst[13], dst[29]); - SORT_CSWAP(dst[2], dst[9]); - SORT_CSWAP(dst[4], dst[11]); - SORT_CSWAP(dst[18], dst[25]); - SORT_CSWAP(dst[20], dst[27]); - SORT_CSWAP(dst[0], dst[15]); - SORT_CSWAP(dst[1], dst[17]); - SORT_CSWAP(dst[12], dst[28]); - SORT_CSWAP(dst[14], dst[29]); - SORT_CSWAP(dst[2], dst[8]); - SORT_CSWAP(dst[5], dst[11]); - SORT_CSWAP(dst[18], dst[24]); - SORT_CSWAP(dst[21], dst[27]); - SORT_CSWAP(dst[1], dst[15]); - SORT_CSWAP(dst[14], dst[28]); - SORT_CSWAP(dst[2], dst[7]); - SORT_CSWAP(dst[6], dst[11]); - SORT_CSWAP(dst[4], dst[8]); - SORT_CSWAP(dst[5], dst[9]); - SORT_CSWAP(dst[18], dst[23]); - SORT_CSWAP(dst[22], dst[27]); - SORT_CSWAP(dst[20], dst[24]); - SORT_CSWAP(dst[21], dst[25]); - SORT_CSWAP(dst[3], dst[7]); - SORT_CSWAP(dst[6], dst[10]); - SORT_CSWAP(dst[19], dst[23]); - SORT_CSWAP(dst[22], dst[26]); - SORT_CSWAP(dst[2], dst[18]); - SORT_CSWAP(dst[11], dst[27]); - SORT_CSWAP(dst[4], dst[7]); - SORT_CSWAP(dst[6], dst[9]); - SORT_CSWAP(dst[20], dst[23]); - SORT_CSWAP(dst[22], dst[25]); - SORT_CSWAP(dst[2], dst[17]); - SORT_CSWAP(dst[3], dst[19]); - SORT_CSWAP(dst[10], dst[26]); - SORT_CSWAP(dst[12], dst[27]); - SORT_CSWAP(dst[5], dst[7]); - SORT_CSWAP(dst[6], dst[8]); - SORT_CSWAP(dst[21], dst[23]); - SORT_CSWAP(dst[22], dst[24]); - SORT_CSWAP(dst[2], dst[16]); - SORT_CSWAP(dst[4], dst[20]); - SORT_CSWAP(dst[9], dst[25]); - SORT_CSWAP(dst[13], dst[27]); - SORT_CSWAP(dst[6], dst[7]); - SORT_CSWAP(dst[22], dst[23]); - SORT_CSWAP(dst[2], dst[15]); - SORT_CSWAP(dst[4], dst[19]); - SORT_CSWAP(dst[5], dst[21]); - SORT_CSWAP(dst[8], dst[24]); - SORT_CSWAP(dst[10], dst[25]); - SORT_CSWAP(dst[14], dst[27]); - SORT_CSWAP(dst[6], dst[22]); - SORT_CSWAP(dst[5], dst[19]); - SORT_CSWAP(dst[3], dst[15]); - SORT_CSWAP(dst[4], dst[16]); - SORT_CSWAP(dst[7], dst[23]); - SORT_CSWAP(dst[10], dst[24]); - SORT_CSWAP(dst[13], dst[25]); - SORT_CSWAP(dst[14], dst[26]); - SORT_CSWAP(dst[6], dst[21]); - SORT_CSWAP(dst[4], dst[15]); - SORT_CSWAP(dst[5], dst[17]); - SORT_CSWAP(dst[8], dst[23]); - SORT_CSWAP(dst[12], dst[24]); - SORT_CSWAP(dst[14], dst[25]); - SORT_CSWAP(dst[6], dst[20]); - SORT_CSWAP(dst[5], dst[15]); - SORT_CSWAP(dst[9], dst[23]); - SORT_CSWAP(dst[14], dst[24]); - SORT_CSWAP(dst[6], dst[19]); - SORT_CSWAP(dst[10], dst[23]); - SORT_CSWAP(dst[6], dst[18]); - SORT_CSWAP(dst[11], dst[23]); - SORT_CSWAP(dst[6], dst[17]); - SORT_CSWAP(dst[12], dst[23]); - SORT_CSWAP(dst[10], dst[18]); - SORT_CSWAP(dst[11], dst[19]); - SORT_CSWAP(dst[6], dst[16]); - SORT_CSWAP(dst[13], dst[23]); - SORT_CSWAP(dst[9], dst[17]); - SORT_CSWAP(dst[12], dst[20]); - SORT_CSWAP(dst[6], dst[15]); - SORT_CSWAP(dst[14], dst[23]); - SORT_CSWAP(dst[8], dst[16]); - SORT_CSWAP(dst[10], dst[17]); - SORT_CSWAP(dst[12], dst[19]); - SORT_CSWAP(dst[13], dst[21]); - SORT_CSWAP(dst[7], dst[15]); - SORT_CSWAP(dst[10], dst[16]); - SORT_CSWAP(dst[14], dst[22]); - SORT_CSWAP(dst[13], dst[19]); - SORT_CSWAP(dst[8], dst[15]); - SORT_CSWAP(dst[14], dst[21]); - SORT_CSWAP(dst[12], dst[16]); - SORT_CSWAP(dst[13], dst[17]); - SORT_CSWAP(dst[9], dst[15]); - SORT_CSWAP(dst[14], dst[20]); - SORT_CSWAP(dst[10], dst[15]); - SORT_CSWAP(dst[14], dst[19]); - SORT_CSWAP(dst[11], dst[15]); - SORT_CSWAP(dst[14], dst[18]); - SORT_CSWAP(dst[12], dst[15]); - SORT_CSWAP(dst[14], dst[17]); - SORT_CSWAP(dst[13], dst[15]); - SORT_CSWAP(dst[14], dst[16]); - SORT_CSWAP(dst[14], dst[15]); -} - - -#define BITONIC_SORT_32 SORT_MAKE_STR(bitonic_sort_32) -static __inline void BITONIC_SORT_32(SORT_TYPE *dst) { - SORT_CSWAP(dst[0], dst[1]); - SORT_CSWAP(dst[2], dst[3]); - SORT_CSWAP(dst[4], dst[5]); - SORT_CSWAP(dst[6], dst[7]); - SORT_CSWAP(dst[8], dst[9]); - SORT_CSWAP(dst[10], dst[11]); - SORT_CSWAP(dst[12], dst[13]); - SORT_CSWAP(dst[14], dst[15]); - SORT_CSWAP(dst[16], dst[17]); - SORT_CSWAP(dst[18], dst[19]); - SORT_CSWAP(dst[20], dst[21]); - SORT_CSWAP(dst[22], dst[23]); - SORT_CSWAP(dst[24], dst[25]); - SORT_CSWAP(dst[26], dst[27]); - SORT_CSWAP(dst[28], dst[29]); - SORT_CSWAP(dst[30], dst[31]); - SORT_CSWAP(dst[0], dst[2]); - SORT_CSWAP(dst[1], dst[3]); - SORT_CSWAP(dst[4], dst[6]); - SORT_CSWAP(dst[5], dst[7]); - SORT_CSWAP(dst[8], dst[10]); - SORT_CSWAP(dst[9], dst[11]); - SORT_CSWAP(dst[12], dst[14]); - SORT_CSWAP(dst[13], dst[15]); - SORT_CSWAP(dst[16], dst[18]); - SORT_CSWAP(dst[17], dst[19]); - SORT_CSWAP(dst[20], dst[22]); - SORT_CSWAP(dst[21], dst[23]); - SORT_CSWAP(dst[24], dst[26]); - SORT_CSWAP(dst[25], dst[27]); - SORT_CSWAP(dst[28], dst[30]); - SORT_CSWAP(dst[29], dst[31]); - SORT_CSWAP(dst[1], dst[2]); - SORT_CSWAP(dst[5], dst[6]); - SORT_CSWAP(dst[0], dst[4]); - SORT_CSWAP(dst[3], dst[7]); - SORT_CSWAP(dst[9], dst[10]); - SORT_CSWAP(dst[13], dst[14]); - SORT_CSWAP(dst[8], dst[12]); - SORT_CSWAP(dst[11], dst[15]); - SORT_CSWAP(dst[17], dst[18]); - SORT_CSWAP(dst[21], dst[22]); - SORT_CSWAP(dst[16], dst[20]); - SORT_CSWAP(dst[19], dst[23]); - SORT_CSWAP(dst[25], dst[26]); - SORT_CSWAP(dst[29], dst[30]); - SORT_CSWAP(dst[24], dst[28]); - SORT_CSWAP(dst[27], dst[31]); - SORT_CSWAP(dst[1], dst[5]); - SORT_CSWAP(dst[2], dst[6]); - SORT_CSWAP(dst[9], dst[13]); - SORT_CSWAP(dst[10], dst[14]); - SORT_CSWAP(dst[0], dst[8]); - SORT_CSWAP(dst[7], dst[15]); - SORT_CSWAP(dst[17], dst[21]); - SORT_CSWAP(dst[18], dst[22]); - SORT_CSWAP(dst[25], dst[29]); - SORT_CSWAP(dst[26], dst[30]); - SORT_CSWAP(dst[16], dst[24]); - SORT_CSWAP(dst[23], dst[31]); - SORT_CSWAP(dst[1], dst[4]); - SORT_CSWAP(dst[3], dst[6]); - SORT_CSWAP(dst[9], dst[12]); - SORT_CSWAP(dst[11], dst[14]); - SORT_CSWAP(dst[17], dst[20]); - SORT_CSWAP(dst[19], dst[22]); - SORT_CSWAP(dst[25], dst[28]); - SORT_CSWAP(dst[27], dst[30]); - SORT_CSWAP(dst[0], dst[16]); - SORT_CSWAP(dst[15], dst[31]); - SORT_CSWAP(dst[2], dst[4]); - SORT_CSWAP(dst[3], dst[5]); - SORT_CSWAP(dst[10], dst[12]); - SORT_CSWAP(dst[11], dst[13]); - SORT_CSWAP(dst[1], dst[9]); - SORT_CSWAP(dst[6], dst[14]); - SORT_CSWAP(dst[18], dst[20]); - SORT_CSWAP(dst[19], dst[21]); - SORT_CSWAP(dst[26], dst[28]); - SORT_CSWAP(dst[27], dst[29]); - SORT_CSWAP(dst[17], dst[25]); - SORT_CSWAP(dst[22], dst[30]); - SORT_CSWAP(dst[3], dst[4]); - SORT_CSWAP(dst[11], dst[12]); - SORT_CSWAP(dst[1], dst[8]); - SORT_CSWAP(dst[2], dst[10]); - SORT_CSWAP(dst[5], dst[13]); - SORT_CSWAP(dst[7], dst[14]); - SORT_CSWAP(dst[19], dst[20]); - SORT_CSWAP(dst[27], dst[28]); - SORT_CSWAP(dst[17], dst[24]); - SORT_CSWAP(dst[18], dst[26]); - SORT_CSWAP(dst[21], dst[29]); - SORT_CSWAP(dst[23], dst[30]); - SORT_CSWAP(dst[3], dst[11]); - SORT_CSWAP(dst[2], dst[8]); - SORT_CSWAP(dst[4], dst[12]); - SORT_CSWAP(dst[7], dst[13]); - SORT_CSWAP(dst[19], dst[27]); - SORT_CSWAP(dst[18], dst[24]); - SORT_CSWAP(dst[20], dst[28]); - SORT_CSWAP(dst[23], dst[29]); - SORT_CSWAP(dst[1], dst[17]); - SORT_CSWAP(dst[14], dst[30]); - SORT_CSWAP(dst[3], dst[10]); - SORT_CSWAP(dst[5], dst[12]); - SORT_CSWAP(dst[19], dst[26]); - SORT_CSWAP(dst[21], dst[28]); - SORT_CSWAP(dst[1], dst[16]); - SORT_CSWAP(dst[2], dst[18]); - SORT_CSWAP(dst[13], dst[29]); - SORT_CSWAP(dst[15], dst[30]); - SORT_CSWAP(dst[3], dst[9]); - SORT_CSWAP(dst[6], dst[12]); - SORT_CSWAP(dst[19], dst[25]); - SORT_CSWAP(dst[22], dst[28]); - SORT_CSWAP(dst[2], dst[16]); - SORT_CSWAP(dst[15], dst[29]); - SORT_CSWAP(dst[3], dst[8]); - SORT_CSWAP(dst[7], dst[12]); - SORT_CSWAP(dst[5], dst[9]); - SORT_CSWAP(dst[6], dst[10]); - SORT_CSWAP(dst[19], dst[24]); - SORT_CSWAP(dst[23], dst[28]); - SORT_CSWAP(dst[21], dst[25]); - SORT_CSWAP(dst[22], dst[26]); - SORT_CSWAP(dst[4], dst[8]); - SORT_CSWAP(dst[7], dst[11]); - SORT_CSWAP(dst[20], dst[24]); - SORT_CSWAP(dst[23], dst[27]); - SORT_CSWAP(dst[3], dst[19]); - SORT_CSWAP(dst[12], dst[28]); - SORT_CSWAP(dst[5], dst[8]); - SORT_CSWAP(dst[7], dst[10]); - SORT_CSWAP(dst[21], dst[24]); - SORT_CSWAP(dst[23], dst[26]); - SORT_CSWAP(dst[3], dst[18]); - SORT_CSWAP(dst[4], dst[20]); - SORT_CSWAP(dst[11], dst[27]); - SORT_CSWAP(dst[13], dst[28]); - SORT_CSWAP(dst[6], dst[8]); - SORT_CSWAP(dst[7], dst[9]); - SORT_CSWAP(dst[22], dst[24]); - SORT_CSWAP(dst[23], dst[25]); - SORT_CSWAP(dst[3], dst[17]); - SORT_CSWAP(dst[5], dst[21]); - SORT_CSWAP(dst[10], dst[26]); - SORT_CSWAP(dst[14], dst[28]); - SORT_CSWAP(dst[7], dst[8]); - SORT_CSWAP(dst[23], dst[24]); - SORT_CSWAP(dst[3], dst[16]); - SORT_CSWAP(dst[5], dst[20]); - SORT_CSWAP(dst[6], dst[22]); - SORT_CSWAP(dst[9], dst[25]); - SORT_CSWAP(dst[11], dst[26]); - SORT_CSWAP(dst[15], dst[28]); - SORT_CSWAP(dst[7], dst[23]); - SORT_CSWAP(dst[6], dst[20]); - SORT_CSWAP(dst[4], dst[16]); - SORT_CSWAP(dst[5], dst[17]); - SORT_CSWAP(dst[8], dst[24]); - SORT_CSWAP(dst[11], dst[25]); - SORT_CSWAP(dst[14], dst[26]); - SORT_CSWAP(dst[15], dst[27]); - SORT_CSWAP(dst[7], dst[22]); - SORT_CSWAP(dst[5], dst[16]); - SORT_CSWAP(dst[6], dst[18]); - SORT_CSWAP(dst[9], dst[24]); - SORT_CSWAP(dst[13], dst[25]); - SORT_CSWAP(dst[15], dst[26]); - SORT_CSWAP(dst[7], dst[21]); - SORT_CSWAP(dst[6], dst[16]); - SORT_CSWAP(dst[10], dst[24]); - SORT_CSWAP(dst[15], dst[25]); - SORT_CSWAP(dst[7], dst[20]); - SORT_CSWAP(dst[11], dst[24]); - SORT_CSWAP(dst[7], dst[19]); - SORT_CSWAP(dst[12], dst[24]); - SORT_CSWAP(dst[7], dst[18]); - SORT_CSWAP(dst[13], dst[24]); - SORT_CSWAP(dst[11], dst[19]); - SORT_CSWAP(dst[12], dst[20]); - SORT_CSWAP(dst[7], dst[17]); - SORT_CSWAP(dst[14], dst[24]); - SORT_CSWAP(dst[10], dst[18]); - SORT_CSWAP(dst[13], dst[21]); - SORT_CSWAP(dst[7], dst[16]); - SORT_CSWAP(dst[15], dst[24]); - SORT_CSWAP(dst[9], dst[17]); - SORT_CSWAP(dst[11], dst[18]); - SORT_CSWAP(dst[13], dst[20]); - SORT_CSWAP(dst[14], dst[22]); - SORT_CSWAP(dst[8], dst[16]); - SORT_CSWAP(dst[11], dst[17]); - SORT_CSWAP(dst[15], dst[23]); - SORT_CSWAP(dst[14], dst[20]); - SORT_CSWAP(dst[9], dst[16]); - SORT_CSWAP(dst[15], dst[22]); - SORT_CSWAP(dst[13], dst[17]); - SORT_CSWAP(dst[14], dst[18]); - SORT_CSWAP(dst[10], dst[16]); - SORT_CSWAP(dst[15], dst[21]); - SORT_CSWAP(dst[11], dst[16]); - SORT_CSWAP(dst[15], dst[20]); - SORT_CSWAP(dst[12], dst[16]); - SORT_CSWAP(dst[15], dst[19]); - SORT_CSWAP(dst[13], dst[16]); - SORT_CSWAP(dst[15], dst[18]); - SORT_CSWAP(dst[14], dst[16]); - SORT_CSWAP(dst[15], dst[17]); - SORT_CSWAP(dst[15], dst[16]); -} - -#define BITONIC_SORT_REVERSE_2 SORT_MAKE_STR(bitonic_sort_reverse_2) -static __inline void BITONIC_SORT_REVERSE_2(SORT_TYPE *dst) { - SORT_CSWAP(dst[1], dst[0]); -} - - -#define BITONIC_SORT_REVERSE_3 SORT_MAKE_STR(bitonic_sort_reverse_3) -static __inline void BITONIC_SORT_REVERSE_3(SORT_TYPE *dst) { - SORT_CSWAP(dst[2], dst[1]); - SORT_CSWAP(dst[2], dst[0]); - SORT_CSWAP(dst[1], dst[0]); -} - - -#define BITONIC_SORT_REVERSE_4 SORT_MAKE_STR(bitonic_sort_reverse_4) -static __inline void BITONIC_SORT_REVERSE_4(SORT_TYPE *dst) { - SORT_CSWAP(dst[1], dst[0]); - SORT_CSWAP(dst[3], dst[2]); - SORT_CSWAP(dst[2], dst[0]); - SORT_CSWAP(dst[3], dst[1]); - SORT_CSWAP(dst[2], dst[1]); -} - - -#define BITONIC_SORT_REVERSE_5 SORT_MAKE_STR(bitonic_sort_reverse_5) -static __inline void BITONIC_SORT_REVERSE_5(SORT_TYPE *dst) { - SORT_CSWAP(dst[1], dst[0]); - SORT_CSWAP(dst[4], dst[3]); - SORT_CSWAP(dst[4], dst[2]); - SORT_CSWAP(dst[3], dst[2]); - SORT_CSWAP(dst[4], dst[1]); - SORT_CSWAP(dst[3], dst[0]); - SORT_CSWAP(dst[2], dst[0]); - SORT_CSWAP(dst[3], dst[1]); - SORT_CSWAP(dst[2], dst[1]); -} - - -#define BITONIC_SORT_REVERSE_6 SORT_MAKE_STR(bitonic_sort_reverse_6) -static __inline void BITONIC_SORT_REVERSE_6(SORT_TYPE *dst) { - SORT_CSWAP(dst[2], dst[1]); - SORT_CSWAP(dst[5], dst[4]); - SORT_CSWAP(dst[2], dst[0]); - SORT_CSWAP(dst[5], dst[3]); - SORT_CSWAP(dst[1], dst[0]); - SORT_CSWAP(dst[4], dst[3]); - SORT_CSWAP(dst[5], dst[2]); - SORT_CSWAP(dst[3], dst[0]); - SORT_CSWAP(dst[4], dst[1]); - SORT_CSWAP(dst[4], dst[2]); - SORT_CSWAP(dst[3], dst[1]); - SORT_CSWAP(dst[3], dst[2]); -} - - -#define BITONIC_SORT_REVERSE_7 SORT_MAKE_STR(bitonic_sort_reverse_7) -static __inline void BITONIC_SORT_REVERSE_7(SORT_TYPE *dst) { - SORT_CSWAP(dst[2], dst[1]); - SORT_CSWAP(dst[4], dst[3]); - SORT_CSWAP(dst[6], dst[5]); - SORT_CSWAP(dst[2], dst[0]); - SORT_CSWAP(dst[5], dst[3]); - SORT_CSWAP(dst[6], dst[4]); - SORT_CSWAP(dst[1], dst[0]); - SORT_CSWAP(dst[5], dst[4]); - SORT_CSWAP(dst[6], dst[2]); - SORT_CSWAP(dst[4], dst[0]); - SORT_CSWAP(dst[5], dst[1]); - SORT_CSWAP(dst[3], dst[0]); - SORT_CSWAP(dst[5], dst[2]); - SORT_CSWAP(dst[3], dst[1]); - SORT_CSWAP(dst[4], dst[2]); - SORT_CSWAP(dst[3], dst[2]); -} - - -#define BITONIC_SORT_REVERSE_8 SORT_MAKE_STR(bitonic_sort_reverse_8) -static __inline void BITONIC_SORT_REVERSE_8(SORT_TYPE *dst) { - SORT_CSWAP(dst[1], dst[0]); - SORT_CSWAP(dst[3], dst[2]); - SORT_CSWAP(dst[5], dst[4]); - SORT_CSWAP(dst[7], dst[6]); - SORT_CSWAP(dst[2], dst[0]); - SORT_CSWAP(dst[3], dst[1]); - SORT_CSWAP(dst[6], dst[4]); - SORT_CSWAP(dst[7], dst[5]); - SORT_CSWAP(dst[2], dst[1]); - SORT_CSWAP(dst[6], dst[5]); - SORT_CSWAP(dst[4], dst[0]); - SORT_CSWAP(dst[7], dst[3]); - SORT_CSWAP(dst[5], dst[1]); - SORT_CSWAP(dst[6], dst[2]); - SORT_CSWAP(dst[4], dst[1]); - SORT_CSWAP(dst[6], dst[3]); - SORT_CSWAP(dst[4], dst[2]); - SORT_CSWAP(dst[5], dst[3]); - SORT_CSWAP(dst[4], dst[3]); -} - - -#define BITONIC_SORT_REVERSE_9 SORT_MAKE_STR(bitonic_sort_reverse_9) -static __inline void BITONIC_SORT_REVERSE_9(SORT_TYPE *dst) { - SORT_CSWAP(dst[1], dst[0]); - SORT_CSWAP(dst[4], dst[3]); - SORT_CSWAP(dst[7], dst[6]); - SORT_CSWAP(dst[2], dst[1]); - SORT_CSWAP(dst[5], dst[4]); - SORT_CSWAP(dst[8], dst[7]); - SORT_CSWAP(dst[1], dst[0]); - SORT_CSWAP(dst[4], dst[3]); - SORT_CSWAP(dst[7], dst[6]); - SORT_CSWAP(dst[5], dst[2]); - SORT_CSWAP(dst[3], dst[0]); - SORT_CSWAP(dst[4], dst[1]); - SORT_CSWAP(dst[8], dst[5]); - SORT_CSWAP(dst[6], dst[3]); - SORT_CSWAP(dst[7], dst[4]); - SORT_CSWAP(dst[5], dst[2]); - SORT_CSWAP(dst[3], dst[0]); - SORT_CSWAP(dst[4], dst[1]); - SORT_CSWAP(dst[7], dst[5]); - SORT_CSWAP(dst[6], dst[2]); - SORT_CSWAP(dst[3], dst[1]); - SORT_CSWAP(dst[6], dst[4]); - SORT_CSWAP(dst[4], dst[2]); - SORT_CSWAP(dst[6], dst[5]); - SORT_CSWAP(dst[3], dst[2]); -} - - -#define BITONIC_SORT_REVERSE_10 SORT_MAKE_STR(bitonic_sort_reverse_10) -static __inline void BITONIC_SORT_REVERSE_10(SORT_TYPE *dst) { - SORT_CSWAP(dst[9], dst[4]); - SORT_CSWAP(dst[8], dst[3]); - SORT_CSWAP(dst[7], dst[2]); - SORT_CSWAP(dst[6], dst[1]); - SORT_CSWAP(dst[5], dst[0]); - SORT_CSWAP(dst[4], dst[1]); - SORT_CSWAP(dst[9], dst[6]); - SORT_CSWAP(dst[3], dst[0]); - SORT_CSWAP(dst[8], dst[5]); - SORT_CSWAP(dst[2], dst[0]); - SORT_CSWAP(dst[6], dst[3]); - SORT_CSWAP(dst[9], dst[7]); - SORT_CSWAP(dst[1], dst[0]); - SORT_CSWAP(dst[4], dst[2]); - SORT_CSWAP(dst[7], dst[5]); - SORT_CSWAP(dst[9], dst[8]); - SORT_CSWAP(dst[2], dst[1]); - SORT_CSWAP(dst[6], dst[4]); - SORT_CSWAP(dst[8], dst[7]); - SORT_CSWAP(dst[5], dst[3]); - SORT_CSWAP(dst[5], dst[2]); - SORT_CSWAP(dst[8], dst[6]); - SORT_CSWAP(dst[3], dst[1]); - SORT_CSWAP(dst[7], dst[4]); - SORT_CSWAP(dst[3], dst[2]); - SORT_CSWAP(dst[7], dst[6]); - SORT_CSWAP(dst[4], dst[3]); - SORT_CSWAP(dst[6], dst[5]); - SORT_CSWAP(dst[5], dst[4]); -} - - -#define BITONIC_SORT_REVERSE_11 SORT_MAKE_STR(bitonic_sort_reverse_11) -static __inline void BITONIC_SORT_REVERSE_11(SORT_TYPE *dst) { - SORT_CSWAP(dst[1], dst[0]); - SORT_CSWAP(dst[3], dst[2]); - SORT_CSWAP(dst[5], dst[4]); - SORT_CSWAP(dst[7], dst[6]); - SORT_CSWAP(dst[9], dst[8]); - SORT_CSWAP(dst[3], dst[1]); - SORT_CSWAP(dst[7], dst[5]); - SORT_CSWAP(dst[2], dst[0]); - SORT_CSWAP(dst[6], dst[4]); - SORT_CSWAP(dst[10], dst[8]); - SORT_CSWAP(dst[2], dst[1]); - SORT_CSWAP(dst[6], dst[5]); - SORT_CSWAP(dst[10], dst[9]); - SORT_CSWAP(dst[4], dst[0]); - SORT_CSWAP(dst[7], dst[3]); - SORT_CSWAP(dst[5], dst[1]); - SORT_CSWAP(dst[10], dst[6]); - SORT_CSWAP(dst[8], dst[4]); - SORT_CSWAP(dst[9], dst[5]); - SORT_CSWAP(dst[6], dst[2]); - SORT_CSWAP(dst[4], dst[0]); - SORT_CSWAP(dst[8], dst[3]); - SORT_CSWAP(dst[5], dst[1]); - SORT_CSWAP(dst[10], dst[6]); - SORT_CSWAP(dst[3], dst[2]); - SORT_CSWAP(dst[9], dst[8]); - SORT_CSWAP(dst[4], dst[1]); - SORT_CSWAP(dst[10], dst[7]); - SORT_CSWAP(dst[5], dst[3]); - SORT_CSWAP(dst[8], dst[6]); - SORT_CSWAP(dst[4], dst[2]); - SORT_CSWAP(dst[9], dst[7]); - SORT_CSWAP(dst[6], dst[5]); - SORT_CSWAP(dst[4], dst[3]); - SORT_CSWAP(dst[8], dst[7]); -} - - -#define BITONIC_SORT_REVERSE_12 SORT_MAKE_STR(bitonic_sort_reverse_12) -static __inline void BITONIC_SORT_REVERSE_12(SORT_TYPE *dst) { - SORT_CSWAP(dst[1], dst[0]); - SORT_CSWAP(dst[3], dst[2]); - SORT_CSWAP(dst[5], dst[4]); - SORT_CSWAP(dst[7], dst[6]); - SORT_CSWAP(dst[9], dst[8]); - SORT_CSWAP(dst[11], dst[10]); - SORT_CSWAP(dst[3], dst[1]); - SORT_CSWAP(dst[7], dst[5]); - SORT_CSWAP(dst[11], dst[9]); - SORT_CSWAP(dst[2], dst[0]); - SORT_CSWAP(dst[6], dst[4]); - SORT_CSWAP(dst[10], dst[8]); - SORT_CSWAP(dst[2], dst[1]); - SORT_CSWAP(dst[6], dst[5]); - SORT_CSWAP(dst[10], dst[9]); - SORT_CSWAP(dst[4], dst[0]); - SORT_CSWAP(dst[11], dst[7]); - SORT_CSWAP(dst[5], dst[1]); - SORT_CSWAP(dst[10], dst[6]); - SORT_CSWAP(dst[7], dst[3]); - SORT_CSWAP(dst[8], dst[4]); - SORT_CSWAP(dst[9], dst[5]); - SORT_CSWAP(dst[6], dst[2]); - SORT_CSWAP(dst[4], dst[0]); - SORT_CSWAP(dst[11], dst[7]); - SORT_CSWAP(dst[8], dst[3]); - SORT_CSWAP(dst[5], dst[1]); - SORT_CSWAP(dst[10], dst[6]); - SORT_CSWAP(dst[3], dst[2]); - SORT_CSWAP(dst[9], dst[8]); - SORT_CSWAP(dst[4], dst[1]); - SORT_CSWAP(dst[10], dst[7]); - SORT_CSWAP(dst[5], dst[3]); - SORT_CSWAP(dst[8], dst[6]); - SORT_CSWAP(dst[4], dst[2]); - SORT_CSWAP(dst[9], dst[7]); - SORT_CSWAP(dst[6], dst[5]); - SORT_CSWAP(dst[4], dst[3]); - SORT_CSWAP(dst[8], dst[7]); -} - - -#define BITONIC_SORT_REVERSE_13 SORT_MAKE_STR(bitonic_sort_reverse_13) -static __inline void BITONIC_SORT_REVERSE_13(SORT_TYPE *dst) { - SORT_CSWAP(dst[7], dst[1]); - SORT_CSWAP(dst[11], dst[9]); - SORT_CSWAP(dst[4], dst[3]); - SORT_CSWAP(dst[8], dst[5]); - SORT_CSWAP(dst[12], dst[0]); - SORT_CSWAP(dst[6], dst[2]); - SORT_CSWAP(dst[1], dst[0]); - SORT_CSWAP(dst[3], dst[2]); - SORT_CSWAP(dst[6], dst[4]); - SORT_CSWAP(dst[11], dst[8]); - SORT_CSWAP(dst[12], dst[7]); - SORT_CSWAP(dst[9], dst[5]); - SORT_CSWAP(dst[2], dst[0]); - SORT_CSWAP(dst[7], dst[3]); - SORT_CSWAP(dst[11], dst[10]); - SORT_CSWAP(dst[4], dst[1]); - SORT_CSWAP(dst[12], dst[6]); - SORT_CSWAP(dst[8], dst[7]); - SORT_CSWAP(dst[12], dst[11]); - SORT_CSWAP(dst[9], dst[4]); - SORT_CSWAP(dst[10], dst[6]); - SORT_CSWAP(dst[4], dst[3]); - SORT_CSWAP(dst[6], dst[5]); - SORT_CSWAP(dst[9], dst[8]); - SORT_CSWAP(dst[11], dst[10]); - SORT_CSWAP(dst[7], dst[1]); - SORT_CSWAP(dst[6], dst[2]); - SORT_CSWAP(dst[11], dst[9]); - SORT_CSWAP(dst[3], dst[1]); - SORT_CSWAP(dst[7], dst[4]); - SORT_CSWAP(dst[10], dst[8]); - SORT_CSWAP(dst[5], dst[0]); - SORT_CSWAP(dst[5], dst[2]); - SORT_CSWAP(dst[8], dst[6]); - SORT_CSWAP(dst[10], dst[9]); - SORT_CSWAP(dst[2], dst[1]); - SORT_CSWAP(dst[5], dst[3]); - SORT_CSWAP(dst[8], dst[7]); - SORT_CSWAP(dst[6], dst[4]); - SORT_CSWAP(dst[3], dst[2]); - SORT_CSWAP(dst[5], dst[4]); - SORT_CSWAP(dst[7], dst[6]); - SORT_CSWAP(dst[9], dst[8]); - SORT_CSWAP(dst[4], dst[3]); - SORT_CSWAP(dst[6], dst[5]); -} - - -#define BITONIC_SORT_REVERSE_14 SORT_MAKE_STR(bitonic_sort_reverse_14) -static __inline void BITONIC_SORT_REVERSE_14(SORT_TYPE *dst) { - SORT_CSWAP(dst[1], dst[0]); - SORT_CSWAP(dst[3], dst[2]); - SORT_CSWAP(dst[5], dst[4]); - SORT_CSWAP(dst[7], dst[6]); - SORT_CSWAP(dst[9], dst[8]); - SORT_CSWAP(dst[11], dst[10]); - SORT_CSWAP(dst[13], dst[12]); - SORT_CSWAP(dst[2], dst[0]); - SORT_CSWAP(dst[6], dst[4]); - SORT_CSWAP(dst[10], dst[8]); - SORT_CSWAP(dst[3], dst[1]); - SORT_CSWAP(dst[7], dst[5]); - SORT_CSWAP(dst[11], dst[9]); - SORT_CSWAP(dst[4], dst[0]); - SORT_CSWAP(dst[12], dst[8]); - SORT_CSWAP(dst[5], dst[1]); - SORT_CSWAP(dst[13], dst[9]); - SORT_CSWAP(dst[6], dst[2]); - SORT_CSWAP(dst[7], dst[3]); - SORT_CSWAP(dst[8], dst[0]); - SORT_CSWAP(dst[9], dst[1]); - SORT_CSWAP(dst[10], dst[2]); - SORT_CSWAP(dst[11], dst[3]); - SORT_CSWAP(dst[12], dst[4]); - SORT_CSWAP(dst[13], dst[5]); - SORT_CSWAP(dst[10], dst[5]); - SORT_CSWAP(dst[9], dst[6]); - SORT_CSWAP(dst[12], dst[3]); - SORT_CSWAP(dst[11], dst[7]); - SORT_CSWAP(dst[2], dst[1]); - SORT_CSWAP(dst[8], dst[4]); - SORT_CSWAP(dst[4], dst[1]); - SORT_CSWAP(dst[13], dst[7]); - SORT_CSWAP(dst[8], dst[2]); - SORT_CSWAP(dst[6], dst[5]); - SORT_CSWAP(dst[10], dst[9]); - SORT_CSWAP(dst[4], dst[2]); - SORT_CSWAP(dst[13], dst[11]); - SORT_CSWAP(dst[8], dst[3]); - SORT_CSWAP(dst[12], dst[7]); - SORT_CSWAP(dst[8], dst[6]); - SORT_CSWAP(dst[12], dst[10]); - SORT_CSWAP(dst[5], dst[3]); - SORT_CSWAP(dst[9], dst[7]); - SORT_CSWAP(dst[4], dst[3]); - SORT_CSWAP(dst[6], dst[5]); - SORT_CSWAP(dst[8], dst[7]); - SORT_CSWAP(dst[10], dst[9]); - SORT_CSWAP(dst[12], dst[11]); - SORT_CSWAP(dst[7], dst[6]); - SORT_CSWAP(dst[9], dst[8]); -} - - -#define BITONIC_SORT_REVERSE_15 SORT_MAKE_STR(bitonic_sort_reverse_15) -static __inline void BITONIC_SORT_REVERSE_15(SORT_TYPE *dst) { - SORT_CSWAP(dst[1], dst[0]); - SORT_CSWAP(dst[3], dst[2]); - SORT_CSWAP(dst[5], dst[4]); - SORT_CSWAP(dst[7], dst[6]); - SORT_CSWAP(dst[9], dst[8]); - SORT_CSWAP(dst[11], dst[10]); - SORT_CSWAP(dst[13], dst[12]); - SORT_CSWAP(dst[2], dst[0]); - SORT_CSWAP(dst[6], dst[4]); - SORT_CSWAP(dst[10], dst[8]); - SORT_CSWAP(dst[14], dst[12]); - SORT_CSWAP(dst[3], dst[1]); - SORT_CSWAP(dst[7], dst[5]); - SORT_CSWAP(dst[11], dst[9]); - SORT_CSWAP(dst[4], dst[0]); - SORT_CSWAP(dst[12], dst[8]); - SORT_CSWAP(dst[5], dst[1]); - SORT_CSWAP(dst[13], dst[9]); - SORT_CSWAP(dst[6], dst[2]); - SORT_CSWAP(dst[14], dst[10]); - SORT_CSWAP(dst[7], dst[3]); - SORT_CSWAP(dst[8], dst[0]); - SORT_CSWAP(dst[9], dst[1]); - SORT_CSWAP(dst[10], dst[2]); - SORT_CSWAP(dst[11], dst[3]); - SORT_CSWAP(dst[12], dst[4]); - SORT_CSWAP(dst[13], dst[5]); - SORT_CSWAP(dst[14], dst[6]); - SORT_CSWAP(dst[10], dst[5]); - SORT_CSWAP(dst[9], dst[6]); - SORT_CSWAP(dst[12], dst[3]); - SORT_CSWAP(dst[14], dst[13]); - SORT_CSWAP(dst[11], dst[7]); - SORT_CSWAP(dst[2], dst[1]); - SORT_CSWAP(dst[8], dst[4]); - SORT_CSWAP(dst[4], dst[1]); - SORT_CSWAP(dst[13], dst[7]); - SORT_CSWAP(dst[8], dst[2]); - SORT_CSWAP(dst[14], dst[11]); - SORT_CSWAP(dst[6], dst[5]); - SORT_CSWAP(dst[10], dst[9]); - SORT_CSWAP(dst[4], dst[2]); - SORT_CSWAP(dst[13], dst[11]); - SORT_CSWAP(dst[8], dst[3]); - SORT_CSWAP(dst[12], dst[7]); - SORT_CSWAP(dst[8], dst[6]); - SORT_CSWAP(dst[12], dst[10]); - SORT_CSWAP(dst[5], dst[3]); - SORT_CSWAP(dst[9], dst[7]); - SORT_CSWAP(dst[4], dst[3]); - SORT_CSWAP(dst[6], dst[5]); - SORT_CSWAP(dst[8], dst[7]); - SORT_CSWAP(dst[10], dst[9]); - SORT_CSWAP(dst[12], dst[11]); - SORT_CSWAP(dst[7], dst[6]); - SORT_CSWAP(dst[9], dst[8]); -} - - -#define BITONIC_SORT_REVERSE_16 SORT_MAKE_STR(bitonic_sort_reverse_16) -static __inline void BITONIC_SORT_REVERSE_16(SORT_TYPE *dst) { - SORT_CSWAP(dst[1], dst[0]); - SORT_CSWAP(dst[3], dst[2]); - SORT_CSWAP(dst[5], dst[4]); - SORT_CSWAP(dst[7], dst[6]); - SORT_CSWAP(dst[9], dst[8]); - SORT_CSWAP(dst[11], dst[10]); - SORT_CSWAP(dst[13], dst[12]); - SORT_CSWAP(dst[15], dst[14]); - SORT_CSWAP(dst[2], dst[0]); - SORT_CSWAP(dst[6], dst[4]); - SORT_CSWAP(dst[10], dst[8]); - SORT_CSWAP(dst[14], dst[12]); - SORT_CSWAP(dst[3], dst[1]); - SORT_CSWAP(dst[7], dst[5]); - SORT_CSWAP(dst[11], dst[9]); - SORT_CSWAP(dst[15], dst[13]); - SORT_CSWAP(dst[4], dst[0]); - SORT_CSWAP(dst[12], dst[8]); - SORT_CSWAP(dst[5], dst[1]); - SORT_CSWAP(dst[13], dst[9]); - SORT_CSWAP(dst[6], dst[2]); - SORT_CSWAP(dst[14], dst[10]); - SORT_CSWAP(dst[7], dst[3]); - SORT_CSWAP(dst[15], dst[11]); - SORT_CSWAP(dst[8], dst[0]); - SORT_CSWAP(dst[9], dst[1]); - SORT_CSWAP(dst[10], dst[2]); - SORT_CSWAP(dst[11], dst[3]); - SORT_CSWAP(dst[12], dst[4]); - SORT_CSWAP(dst[13], dst[5]); - SORT_CSWAP(dst[14], dst[6]); - SORT_CSWAP(dst[15], dst[7]); - SORT_CSWAP(dst[10], dst[5]); - SORT_CSWAP(dst[9], dst[6]); - SORT_CSWAP(dst[12], dst[3]); - SORT_CSWAP(dst[14], dst[13]); - SORT_CSWAP(dst[11], dst[7]); - SORT_CSWAP(dst[2], dst[1]); - SORT_CSWAP(dst[8], dst[4]); - SORT_CSWAP(dst[4], dst[1]); - SORT_CSWAP(dst[13], dst[7]); - SORT_CSWAP(dst[8], dst[2]); - SORT_CSWAP(dst[14], dst[11]); - SORT_CSWAP(dst[6], dst[5]); - SORT_CSWAP(dst[10], dst[9]); - SORT_CSWAP(dst[4], dst[2]); - SORT_CSWAP(dst[13], dst[11]); - SORT_CSWAP(dst[8], dst[3]); - SORT_CSWAP(dst[12], dst[7]); - SORT_CSWAP(dst[8], dst[6]); - SORT_CSWAP(dst[12], dst[10]); - SORT_CSWAP(dst[5], dst[3]); - SORT_CSWAP(dst[9], dst[7]); - SORT_CSWAP(dst[4], dst[3]); - SORT_CSWAP(dst[6], dst[5]); - SORT_CSWAP(dst[8], dst[7]); - SORT_CSWAP(dst[10], dst[9]); - SORT_CSWAP(dst[12], dst[11]); - SORT_CSWAP(dst[7], dst[6]); - SORT_CSWAP(dst[9], dst[8]); -} - - -#define BITONIC_SORT_REVERSE_17 SORT_MAKE_STR(bitonic_sort_reverse_17) -static __inline void BITONIC_SORT_REVERSE_17(SORT_TYPE *dst) { - SORT_CSWAP(dst[1], dst[0]); - SORT_CSWAP(dst[3], dst[2]); - SORT_CSWAP(dst[5], dst[4]); - SORT_CSWAP(dst[7], dst[6]); - SORT_CSWAP(dst[9], dst[8]); - SORT_CSWAP(dst[11], dst[10]); - SORT_CSWAP(dst[13], dst[12]); - SORT_CSWAP(dst[16], dst[15]); - SORT_CSWAP(dst[2], dst[0]); - SORT_CSWAP(dst[3], dst[1]); - SORT_CSWAP(dst[6], dst[4]); - SORT_CSWAP(dst[7], dst[5]); - SORT_CSWAP(dst[10], dst[8]); - SORT_CSWAP(dst[11], dst[9]); - SORT_CSWAP(dst[16], dst[14]); - SORT_CSWAP(dst[2], dst[1]); - SORT_CSWAP(dst[6], dst[5]); - SORT_CSWAP(dst[4], dst[0]); - SORT_CSWAP(dst[7], dst[3]); - SORT_CSWAP(dst[10], dst[9]); - SORT_CSWAP(dst[15], dst[14]); - SORT_CSWAP(dst[16], dst[13]); - SORT_CSWAP(dst[5], dst[1]); - SORT_CSWAP(dst[6], dst[2]); - SORT_CSWAP(dst[15], dst[12]); - SORT_CSWAP(dst[16], dst[11]); - SORT_CSWAP(dst[4], dst[1]); - SORT_CSWAP(dst[6], dst[3]); - SORT_CSWAP(dst[14], dst[12]); - SORT_CSWAP(dst[15], dst[13]); - SORT_CSWAP(dst[16], dst[7]); - SORT_CSWAP(dst[4], dst[2]); - SORT_CSWAP(dst[5], dst[3]); - SORT_CSWAP(dst[14], dst[13]); - SORT_CSWAP(dst[15], dst[10]); - SORT_CSWAP(dst[4], dst[3]); - SORT_CSWAP(dst[13], dst[8]); - SORT_CSWAP(dst[14], dst[9]); - SORT_CSWAP(dst[15], dst[11]); - SORT_CSWAP(dst[12], dst[8]); - SORT_CSWAP(dst[13], dst[9]); - SORT_CSWAP(dst[14], dst[11]); - SORT_CSWAP(dst[15], dst[6]); - SORT_CSWAP(dst[12], dst[9]); - SORT_CSWAP(dst[13], dst[10]); - SORT_CSWAP(dst[14], dst[5]); - SORT_CSWAP(dst[15], dst[7]); - SORT_CSWAP(dst[12], dst[10]); - SORT_CSWAP(dst[13], dst[11]); - SORT_CSWAP(dst[9], dst[0]); - SORT_CSWAP(dst[14], dst[7]); - SORT_CSWAP(dst[12], dst[11]); - SORT_CSWAP(dst[8], dst[0]); - SORT_CSWAP(dst[10], dst[1]); - SORT_CSWAP(dst[13], dst[4]); - SORT_CSWAP(dst[9], dst[1]); - SORT_CSWAP(dst[11], dst[2]); - SORT_CSWAP(dst[12], dst[3]); - SORT_CSWAP(dst[13], dst[5]); - SORT_CSWAP(dst[8], dst[1]); - SORT_CSWAP(dst[11], dst[3]); - SORT_CSWAP(dst[9], dst[2]); - SORT_CSWAP(dst[13], dst[6]); - SORT_CSWAP(dst[8], dst[2]); - SORT_CSWAP(dst[10], dst[3]); - SORT_CSWAP(dst[13], dst[7]); - SORT_CSWAP(dst[11], dst[6]); - SORT_CSWAP(dst[9], dst[3]); - SORT_CSWAP(dst[10], dst[5]); - SORT_CSWAP(dst[12], dst[7]); - SORT_CSWAP(dst[8], dst[3]); - SORT_CSWAP(dst[9], dst[4]); - SORT_CSWAP(dst[11], dst[7]); - SORT_CSWAP(dst[8], dst[4]); - SORT_CSWAP(dst[9], dst[5]); - SORT_CSWAP(dst[10], dst[7]); - SORT_CSWAP(dst[8], dst[5]); - SORT_CSWAP(dst[9], dst[6]); - SORT_CSWAP(dst[8], dst[6]); - SORT_CSWAP(dst[9], dst[7]); - SORT_CSWAP(dst[8], dst[7]); -} - - -#define BITONIC_SORT_REVERSE_18 SORT_MAKE_STR(bitonic_sort_reverse_18) -static __inline void BITONIC_SORT_REVERSE_18(SORT_TYPE *dst) { - SORT_CSWAP(dst[1], dst[0]); - SORT_CSWAP(dst[3], dst[2]); - SORT_CSWAP(dst[5], dst[4]); - SORT_CSWAP(dst[8], dst[7]); - SORT_CSWAP(dst[10], dst[9]); - SORT_CSWAP(dst[12], dst[11]); - SORT_CSWAP(dst[14], dst[13]); - SORT_CSWAP(dst[17], dst[16]); - SORT_CSWAP(dst[2], dst[0]); - SORT_CSWAP(dst[3], dst[1]); - SORT_CSWAP(dst[8], dst[6]); - SORT_CSWAP(dst[11], dst[9]); - SORT_CSWAP(dst[12], dst[10]); - SORT_CSWAP(dst[17], dst[15]); - SORT_CSWAP(dst[2], dst[1]); - SORT_CSWAP(dst[7], dst[6]); - SORT_CSWAP(dst[8], dst[5]); - SORT_CSWAP(dst[11], dst[10]); - SORT_CSWAP(dst[16], dst[15]); - SORT_CSWAP(dst[17], dst[14]); - SORT_CSWAP(dst[7], dst[4]); - SORT_CSWAP(dst[8], dst[3]); - SORT_CSWAP(dst[16], dst[13]); - SORT_CSWAP(dst[17], dst[12]); - SORT_CSWAP(dst[6], dst[4]); - SORT_CSWAP(dst[7], dst[5]); - SORT_CSWAP(dst[15], dst[13]); - SORT_CSWAP(dst[16], dst[14]); - SORT_CSWAP(dst[17], dst[8]); - SORT_CSWAP(dst[6], dst[5]); - SORT_CSWAP(dst[7], dst[2]); - SORT_CSWAP(dst[15], dst[14]); - SORT_CSWAP(dst[16], dst[11]); - SORT_CSWAP(dst[5], dst[0]); - SORT_CSWAP(dst[6], dst[1]); - SORT_CSWAP(dst[7], dst[3]); - SORT_CSWAP(dst[14], dst[9]); - SORT_CSWAP(dst[15], dst[10]); - SORT_CSWAP(dst[16], dst[12]); - SORT_CSWAP(dst[4], dst[0]); - SORT_CSWAP(dst[5], dst[1]); - SORT_CSWAP(dst[6], dst[3]); - SORT_CSWAP(dst[13], dst[9]); - SORT_CSWAP(dst[14], dst[10]); - SORT_CSWAP(dst[15], dst[12]); - SORT_CSWAP(dst[16], dst[7]); - SORT_CSWAP(dst[4], dst[1]); - SORT_CSWAP(dst[5], dst[2]); - SORT_CSWAP(dst[13], dst[10]); - SORT_CSWAP(dst[14], dst[11]); - SORT_CSWAP(dst[9], dst[0]); - SORT_CSWAP(dst[15], dst[6]); - SORT_CSWAP(dst[16], dst[8]); - SORT_CSWAP(dst[4], dst[2]); - SORT_CSWAP(dst[5], dst[3]); - SORT_CSWAP(dst[13], dst[11]); - SORT_CSWAP(dst[14], dst[12]); - SORT_CSWAP(dst[10], dst[1]); - SORT_CSWAP(dst[15], dst[7]); - SORT_CSWAP(dst[4], dst[3]); - SORT_CSWAP(dst[13], dst[12]); - SORT_CSWAP(dst[9], dst[1]); - SORT_CSWAP(dst[11], dst[2]); - SORT_CSWAP(dst[14], dst[5]); - SORT_CSWAP(dst[15], dst[8]); - SORT_CSWAP(dst[12], dst[3]); - SORT_CSWAP(dst[9], dst[2]); - SORT_CSWAP(dst[13], dst[4]); - SORT_CSWAP(dst[14], dst[7]); - SORT_CSWAP(dst[11], dst[3]); - SORT_CSWAP(dst[13], dst[5]); - SORT_CSWAP(dst[14], dst[8]); - SORT_CSWAP(dst[10], dst[3]); - SORT_CSWAP(dst[13], dst[6]); - SORT_CSWAP(dst[9], dst[3]); - SORT_CSWAP(dst[13], dst[7]); - SORT_CSWAP(dst[10], dst[5]); - SORT_CSWAP(dst[11], dst[6]); - SORT_CSWAP(dst[13], dst[8]); - SORT_CSWAP(dst[9], dst[4]); - SORT_CSWAP(dst[12], dst[7]); - SORT_CSWAP(dst[9], dst[5]); - SORT_CSWAP(dst[12], dst[8]); - SORT_CSWAP(dst[11], dst[7]); - SORT_CSWAP(dst[11], dst[8]); - SORT_CSWAP(dst[9], dst[6]); - SORT_CSWAP(dst[10], dst[7]); - SORT_CSWAP(dst[10], dst[8]); - SORT_CSWAP(dst[9], dst[7]); - SORT_CSWAP(dst[9], dst[8]); -} - - -#define BITONIC_SORT_REVERSE_19 SORT_MAKE_STR(bitonic_sort_reverse_19) -static __inline void BITONIC_SORT_REVERSE_19(SORT_TYPE *dst) { - SORT_CSWAP(dst[1], dst[0]); - SORT_CSWAP(dst[3], dst[2]); - SORT_CSWAP(dst[5], dst[4]); - SORT_CSWAP(dst[8], dst[7]); - SORT_CSWAP(dst[10], dst[9]); - SORT_CSWAP(dst[13], dst[12]); - SORT_CSWAP(dst[15], dst[14]); - SORT_CSWAP(dst[18], dst[17]); - SORT_CSWAP(dst[2], dst[0]); - SORT_CSWAP(dst[3], dst[1]); - SORT_CSWAP(dst[8], dst[6]); - SORT_CSWAP(dst[13], dst[11]); - SORT_CSWAP(dst[18], dst[16]); - SORT_CSWAP(dst[2], dst[1]); - SORT_CSWAP(dst[7], dst[6]); - SORT_CSWAP(dst[8], dst[5]); - SORT_CSWAP(dst[12], dst[11]); - SORT_CSWAP(dst[13], dst[10]); - SORT_CSWAP(dst[17], dst[16]); - SORT_CSWAP(dst[18], dst[15]); - SORT_CSWAP(dst[7], dst[4]); - SORT_CSWAP(dst[8], dst[3]); - SORT_CSWAP(dst[12], dst[9]); - SORT_CSWAP(dst[17], dst[14]); - SORT_CSWAP(dst[18], dst[13]); - SORT_CSWAP(dst[6], dst[4]); - SORT_CSWAP(dst[7], dst[5]); - SORT_CSWAP(dst[11], dst[9]); - SORT_CSWAP(dst[12], dst[10]); - SORT_CSWAP(dst[16], dst[14]); - SORT_CSWAP(dst[17], dst[15]); - SORT_CSWAP(dst[18], dst[8]); - SORT_CSWAP(dst[6], dst[5]); - SORT_CSWAP(dst[7], dst[2]); - SORT_CSWAP(dst[11], dst[10]); - SORT_CSWAP(dst[16], dst[15]); - SORT_CSWAP(dst[14], dst[9]); - SORT_CSWAP(dst[17], dst[12]); - SORT_CSWAP(dst[5], dst[0]); - SORT_CSWAP(dst[6], dst[1]); - SORT_CSWAP(dst[7], dst[3]); - SORT_CSWAP(dst[15], dst[10]); - SORT_CSWAP(dst[16], dst[11]); - SORT_CSWAP(dst[17], dst[13]); - SORT_CSWAP(dst[4], dst[0]); - SORT_CSWAP(dst[5], dst[1]); - SORT_CSWAP(dst[6], dst[3]); - SORT_CSWAP(dst[14], dst[10]); - SORT_CSWAP(dst[16], dst[12]); - SORT_CSWAP(dst[17], dst[7]); - SORT_CSWAP(dst[4], dst[1]); - SORT_CSWAP(dst[5], dst[2]); - SORT_CSWAP(dst[16], dst[13]); - SORT_CSWAP(dst[14], dst[11]); - SORT_CSWAP(dst[15], dst[12]); - SORT_CSWAP(dst[10], dst[0]); - SORT_CSWAP(dst[17], dst[8]); - SORT_CSWAP(dst[4], dst[2]); - SORT_CSWAP(dst[5], dst[3]); - SORT_CSWAP(dst[15], dst[13]); - SORT_CSWAP(dst[14], dst[12]); - SORT_CSWAP(dst[9], dst[0]); - SORT_CSWAP(dst[11], dst[1]); - SORT_CSWAP(dst[16], dst[6]); - SORT_CSWAP(dst[4], dst[3]); - SORT_CSWAP(dst[14], dst[13]); - SORT_CSWAP(dst[10], dst[1]); - SORT_CSWAP(dst[12], dst[2]); - SORT_CSWAP(dst[15], dst[5]); - SORT_CSWAP(dst[16], dst[7]); - SORT_CSWAP(dst[9], dst[1]); - SORT_CSWAP(dst[13], dst[3]); - SORT_CSWAP(dst[10], dst[2]); - SORT_CSWAP(dst[14], dst[4]); - SORT_CSWAP(dst[16], dst[8]); - SORT_CSWAP(dst[15], dst[7]); - SORT_CSWAP(dst[12], dst[3]); - SORT_CSWAP(dst[9], dst[2]); - SORT_CSWAP(dst[14], dst[5]); - SORT_CSWAP(dst[15], dst[8]); - SORT_CSWAP(dst[11], dst[3]); - SORT_CSWAP(dst[14], dst[6]); - SORT_CSWAP(dst[10], dst[3]); - SORT_CSWAP(dst[14], dst[7]); - SORT_CSWAP(dst[11], dst[6]); - SORT_CSWAP(dst[9], dst[3]); - SORT_CSWAP(dst[14], dst[8]); - SORT_CSWAP(dst[10], dst[5]); - SORT_CSWAP(dst[12], dst[7]); - SORT_CSWAP(dst[9], dst[4]); - SORT_CSWAP(dst[13], dst[8]); - SORT_CSWAP(dst[11], dst[7]); - SORT_CSWAP(dst[9], dst[5]); - SORT_CSWAP(dst[12], dst[8]); - SORT_CSWAP(dst[10], dst[7]); - SORT_CSWAP(dst[11], dst[8]); - SORT_CSWAP(dst[9], dst[6]); - SORT_CSWAP(dst[10], dst[8]); - SORT_CSWAP(dst[9], dst[7]); - SORT_CSWAP(dst[9], dst[8]); -} - - -#define BITONIC_SORT_REVERSE_20 SORT_MAKE_STR(bitonic_sort_reverse_20) -static __inline void BITONIC_SORT_REVERSE_20(SORT_TYPE *dst) { - SORT_CSWAP(dst[1], dst[0]); - SORT_CSWAP(dst[4], dst[3]); - SORT_CSWAP(dst[6], dst[5]); - SORT_CSWAP(dst[9], dst[8]); - SORT_CSWAP(dst[11], dst[10]); - SORT_CSWAP(dst[14], dst[13]); - SORT_CSWAP(dst[16], dst[15]); - SORT_CSWAP(dst[19], dst[18]); - SORT_CSWAP(dst[4], dst[2]); - SORT_CSWAP(dst[9], dst[7]); - SORT_CSWAP(dst[14], dst[12]); - SORT_CSWAP(dst[19], dst[17]); - SORT_CSWAP(dst[3], dst[2]); - SORT_CSWAP(dst[4], dst[1]); - SORT_CSWAP(dst[8], dst[7]); - SORT_CSWAP(dst[9], dst[6]); - SORT_CSWAP(dst[13], dst[12]); - SORT_CSWAP(dst[14], dst[11]); - SORT_CSWAP(dst[18], dst[17]); - SORT_CSWAP(dst[19], dst[16]); - SORT_CSWAP(dst[3], dst[0]); - SORT_CSWAP(dst[8], dst[5]); - SORT_CSWAP(dst[9], dst[4]); - SORT_CSWAP(dst[13], dst[10]); - SORT_CSWAP(dst[18], dst[15]); - SORT_CSWAP(dst[19], dst[14]); - SORT_CSWAP(dst[2], dst[0]); - SORT_CSWAP(dst[3], dst[1]); - SORT_CSWAP(dst[7], dst[5]); - SORT_CSWAP(dst[8], dst[6]); - SORT_CSWAP(dst[12], dst[10]); - SORT_CSWAP(dst[13], dst[11]); - SORT_CSWAP(dst[17], dst[15]); - SORT_CSWAP(dst[18], dst[16]); - SORT_CSWAP(dst[19], dst[9]); - SORT_CSWAP(dst[2], dst[1]); - SORT_CSWAP(dst[7], dst[6]); - SORT_CSWAP(dst[5], dst[0]); - SORT_CSWAP(dst[8], dst[3]); - SORT_CSWAP(dst[12], dst[11]); - SORT_CSWAP(dst[17], dst[16]); - SORT_CSWAP(dst[15], dst[10]); - SORT_CSWAP(dst[18], dst[13]); - SORT_CSWAP(dst[6], dst[1]); - SORT_CSWAP(dst[7], dst[2]); - SORT_CSWAP(dst[8], dst[4]); - SORT_CSWAP(dst[16], dst[11]); - SORT_CSWAP(dst[17], dst[12]); - SORT_CSWAP(dst[18], dst[14]); - SORT_CSWAP(dst[10], dst[0]); - SORT_CSWAP(dst[5], dst[1]); - SORT_CSWAP(dst[7], dst[3]); - SORT_CSWAP(dst[15], dst[11]); - SORT_CSWAP(dst[17], dst[13]); - SORT_CSWAP(dst[18], dst[8]); - SORT_CSWAP(dst[7], dst[4]); - SORT_CSWAP(dst[5], dst[2]); - SORT_CSWAP(dst[6], dst[3]); - SORT_CSWAP(dst[17], dst[14]); - SORT_CSWAP(dst[15], dst[12]); - SORT_CSWAP(dst[16], dst[13]); - SORT_CSWAP(dst[11], dst[1]); - SORT_CSWAP(dst[18], dst[9]); - SORT_CSWAP(dst[6], dst[4]); - SORT_CSWAP(dst[5], dst[3]); - SORT_CSWAP(dst[16], dst[14]); - SORT_CSWAP(dst[15], dst[13]); - SORT_CSWAP(dst[10], dst[1]); - SORT_CSWAP(dst[12], dst[2]); - SORT_CSWAP(dst[17], dst[7]); - SORT_CSWAP(dst[5], dst[4]); - SORT_CSWAP(dst[15], dst[14]); - SORT_CSWAP(dst[13], dst[3]); - SORT_CSWAP(dst[10], dst[2]); - SORT_CSWAP(dst[16], dst[6]); - SORT_CSWAP(dst[17], dst[8]); - SORT_CSWAP(dst[14], dst[4]); - SORT_CSWAP(dst[12], dst[3]); - SORT_CSWAP(dst[15], dst[5]); - SORT_CSWAP(dst[17], dst[9]); - SORT_CSWAP(dst[16], dst[8]); - SORT_CSWAP(dst[13], dst[4]); - SORT_CSWAP(dst[11], dst[3]); - SORT_CSWAP(dst[15], dst[6]); - SORT_CSWAP(dst[16], dst[9]); - SORT_CSWAP(dst[12], dst[4]); - SORT_CSWAP(dst[10], dst[3]); - SORT_CSWAP(dst[15], dst[7]); - SORT_CSWAP(dst[11], dst[4]); - SORT_CSWAP(dst[15], dst[8]); - SORT_CSWAP(dst[12], dst[7]); - SORT_CSWAP(dst[10], dst[4]); - SORT_CSWAP(dst[15], dst[9]); - SORT_CSWAP(dst[11], dst[6]); - SORT_CSWAP(dst[13], dst[8]); - SORT_CSWAP(dst[10], dst[5]); - SORT_CSWAP(dst[14], dst[9]); - SORT_CSWAP(dst[12], dst[8]); - SORT_CSWAP(dst[10], dst[6]); - SORT_CSWAP(dst[13], dst[9]); - SORT_CSWAP(dst[11], dst[8]); - SORT_CSWAP(dst[12], dst[9]); - SORT_CSWAP(dst[10], dst[7]); - SORT_CSWAP(dst[11], dst[9]); - SORT_CSWAP(dst[10], dst[8]); - SORT_CSWAP(dst[10], dst[9]); -} - - -#define BITONIC_SORT_REVERSE_21 SORT_MAKE_STR(bitonic_sort_reverse_21) -static __inline void BITONIC_SORT_REVERSE_21(SORT_TYPE *dst) { - SORT_CSWAP(dst[1], dst[0]); - SORT_CSWAP(dst[4], dst[3]); - SORT_CSWAP(dst[6], dst[5]); - SORT_CSWAP(dst[9], dst[8]); - SORT_CSWAP(dst[11], dst[10]); - SORT_CSWAP(dst[14], dst[13]); - SORT_CSWAP(dst[17], dst[16]); - SORT_CSWAP(dst[20], dst[19]); - SORT_CSWAP(dst[4], dst[2]); - SORT_CSWAP(dst[9], dst[7]); - SORT_CSWAP(dst[14], dst[12]); - SORT_CSWAP(dst[17], dst[15]); - SORT_CSWAP(dst[20], dst[18]); - SORT_CSWAP(dst[3], dst[2]); - SORT_CSWAP(dst[4], dst[1]); - SORT_CSWAP(dst[8], dst[7]); - SORT_CSWAP(dst[9], dst[6]); - SORT_CSWAP(dst[13], dst[12]); - SORT_CSWAP(dst[14], dst[11]); - SORT_CSWAP(dst[16], dst[15]); - SORT_CSWAP(dst[19], dst[18]); - SORT_CSWAP(dst[20], dst[17]); - SORT_CSWAP(dst[3], dst[0]); - SORT_CSWAP(dst[8], dst[5]); - SORT_CSWAP(dst[9], dst[4]); - SORT_CSWAP(dst[13], dst[10]); - SORT_CSWAP(dst[18], dst[15]); - SORT_CSWAP(dst[19], dst[16]); - SORT_CSWAP(dst[20], dst[14]); - SORT_CSWAP(dst[2], dst[0]); - SORT_CSWAP(dst[3], dst[1]); - SORT_CSWAP(dst[7], dst[5]); - SORT_CSWAP(dst[8], dst[6]); - SORT_CSWAP(dst[12], dst[10]); - SORT_CSWAP(dst[13], dst[11]); - SORT_CSWAP(dst[19], dst[17]); - SORT_CSWAP(dst[18], dst[16]); - SORT_CSWAP(dst[20], dst[9]); - SORT_CSWAP(dst[2], dst[1]); - SORT_CSWAP(dst[7], dst[6]); - SORT_CSWAP(dst[5], dst[0]); - SORT_CSWAP(dst[8], dst[3]); - SORT_CSWAP(dst[12], dst[11]); - SORT_CSWAP(dst[18], dst[17]); - SORT_CSWAP(dst[16], dst[10]); - SORT_CSWAP(dst[19], dst[13]); - SORT_CSWAP(dst[6], dst[1]); - SORT_CSWAP(dst[7], dst[2]); - SORT_CSWAP(dst[8], dst[4]); - SORT_CSWAP(dst[15], dst[10]); - SORT_CSWAP(dst[17], dst[11]); - SORT_CSWAP(dst[18], dst[12]); - SORT_CSWAP(dst[19], dst[14]); - SORT_CSWAP(dst[5], dst[1]); - SORT_CSWAP(dst[7], dst[3]); - SORT_CSWAP(dst[16], dst[11]); - SORT_CSWAP(dst[18], dst[13]); - SORT_CSWAP(dst[19], dst[8]); - SORT_CSWAP(dst[7], dst[4]); - SORT_CSWAP(dst[5], dst[2]); - SORT_CSWAP(dst[6], dst[3]); - SORT_CSWAP(dst[15], dst[11]); - SORT_CSWAP(dst[18], dst[14]); - SORT_CSWAP(dst[16], dst[13]); - SORT_CSWAP(dst[19], dst[9]); - SORT_CSWAP(dst[6], dst[4]); - SORT_CSWAP(dst[5], dst[3]); - SORT_CSWAP(dst[15], dst[12]); - SORT_CSWAP(dst[17], dst[14]); - SORT_CSWAP(dst[11], dst[0]); - SORT_CSWAP(dst[18], dst[7]); - SORT_CSWAP(dst[5], dst[4]); - SORT_CSWAP(dst[16], dst[14]); - SORT_CSWAP(dst[15], dst[13]); - SORT_CSWAP(dst[10], dst[0]); - SORT_CSWAP(dst[12], dst[1]); - SORT_CSWAP(dst[17], dst[6]); - SORT_CSWAP(dst[18], dst[8]); - SORT_CSWAP(dst[15], dst[14]); - SORT_CSWAP(dst[11], dst[1]); - SORT_CSWAP(dst[13], dst[2]); - SORT_CSWAP(dst[16], dst[5]); - SORT_CSWAP(dst[18], dst[9]); - SORT_CSWAP(dst[17], dst[8]); - SORT_CSWAP(dst[10], dst[1]); - SORT_CSWAP(dst[14], dst[3]); - SORT_CSWAP(dst[15], dst[4]); - SORT_CSWAP(dst[16], dst[6]); - SORT_CSWAP(dst[17], dst[9]); - SORT_CSWAP(dst[14], dst[4]); - SORT_CSWAP(dst[13], dst[3]); - SORT_CSWAP(dst[10], dst[2]); - SORT_CSWAP(dst[16], dst[7]); - SORT_CSWAP(dst[13], dst[4]); - SORT_CSWAP(dst[11], dst[3]); - SORT_CSWAP(dst[16], dst[8]); - SORT_CSWAP(dst[12], dst[4]); - SORT_CSWAP(dst[10], dst[3]); - SORT_CSWAP(dst[16], dst[9]); - SORT_CSWAP(dst[13], dst[7]); - SORT_CSWAP(dst[14], dst[8]); - SORT_CSWAP(dst[11], dst[4]); - SORT_CSWAP(dst[12], dst[6]); - SORT_CSWAP(dst[15], dst[9]); - SORT_CSWAP(dst[13], dst[8]); - SORT_CSWAP(dst[10], dst[4]); - SORT_CSWAP(dst[11], dst[5]); - SORT_CSWAP(dst[14], dst[9]); - SORT_CSWAP(dst[10], dst[5]); - SORT_CSWAP(dst[11], dst[6]); - SORT_CSWAP(dst[13], dst[9]); - SORT_CSWAP(dst[10], dst[6]); - SORT_CSWAP(dst[11], dst[8]); - SORT_CSWAP(dst[12], dst[9]); - SORT_CSWAP(dst[10], dst[7]); - SORT_CSWAP(dst[11], dst[9]); - SORT_CSWAP(dst[10], dst[8]); - SORT_CSWAP(dst[10], dst[9]); -} - - -#define BITONIC_SORT_REVERSE_22 SORT_MAKE_STR(bitonic_sort_reverse_22) -static __inline void BITONIC_SORT_REVERSE_22(SORT_TYPE *dst) { - SORT_CSWAP(dst[1], dst[0]); - SORT_CSWAP(dst[4], dst[3]); - SORT_CSWAP(dst[7], dst[6]); - SORT_CSWAP(dst[10], dst[9]); - SORT_CSWAP(dst[12], dst[11]); - SORT_CSWAP(dst[15], dst[14]); - SORT_CSWAP(dst[18], dst[17]); - SORT_CSWAP(dst[21], dst[20]); - SORT_CSWAP(dst[4], dst[2]); - SORT_CSWAP(dst[7], dst[5]); - SORT_CSWAP(dst[10], dst[8]); - SORT_CSWAP(dst[15], dst[13]); - SORT_CSWAP(dst[18], dst[16]); - SORT_CSWAP(dst[21], dst[19]); - SORT_CSWAP(dst[3], dst[2]); - SORT_CSWAP(dst[4], dst[1]); - SORT_CSWAP(dst[6], dst[5]); - SORT_CSWAP(dst[9], dst[8]); - SORT_CSWAP(dst[10], dst[7]); - SORT_CSWAP(dst[14], dst[13]); - SORT_CSWAP(dst[15], dst[12]); - SORT_CSWAP(dst[17], dst[16]); - SORT_CSWAP(dst[20], dst[19]); - SORT_CSWAP(dst[21], dst[18]); - SORT_CSWAP(dst[3], dst[0]); - SORT_CSWAP(dst[8], dst[5]); - SORT_CSWAP(dst[9], dst[6]); - SORT_CSWAP(dst[10], dst[4]); - SORT_CSWAP(dst[14], dst[11]); - SORT_CSWAP(dst[19], dst[16]); - SORT_CSWAP(dst[20], dst[17]); - SORT_CSWAP(dst[21], dst[15]); - SORT_CSWAP(dst[2], dst[0]); - SORT_CSWAP(dst[3], dst[1]); - SORT_CSWAP(dst[9], dst[7]); - SORT_CSWAP(dst[8], dst[6]); - SORT_CSWAP(dst[13], dst[11]); - SORT_CSWAP(dst[14], dst[12]); - SORT_CSWAP(dst[20], dst[18]); - SORT_CSWAP(dst[19], dst[17]); - SORT_CSWAP(dst[21], dst[10]); - SORT_CSWAP(dst[2], dst[1]); - SORT_CSWAP(dst[8], dst[7]); - SORT_CSWAP(dst[6], dst[0]); - SORT_CSWAP(dst[9], dst[3]); - SORT_CSWAP(dst[13], dst[12]); - SORT_CSWAP(dst[19], dst[18]); - SORT_CSWAP(dst[17], dst[11]); - SORT_CSWAP(dst[20], dst[14]); - SORT_CSWAP(dst[5], dst[0]); - SORT_CSWAP(dst[7], dst[1]); - SORT_CSWAP(dst[8], dst[2]); - SORT_CSWAP(dst[9], dst[4]); - SORT_CSWAP(dst[16], dst[11]); - SORT_CSWAP(dst[18], dst[12]); - SORT_CSWAP(dst[19], dst[13]); - SORT_CSWAP(dst[20], dst[15]); - SORT_CSWAP(dst[6], dst[1]); - SORT_CSWAP(dst[8], dst[3]); - SORT_CSWAP(dst[17], dst[12]); - SORT_CSWAP(dst[19], dst[14]); - SORT_CSWAP(dst[11], dst[0]); - SORT_CSWAP(dst[20], dst[9]); - SORT_CSWAP(dst[5], dst[1]); - SORT_CSWAP(dst[8], dst[4]); - SORT_CSWAP(dst[6], dst[3]); - SORT_CSWAP(dst[16], dst[12]); - SORT_CSWAP(dst[19], dst[15]); - SORT_CSWAP(dst[17], dst[14]); - SORT_CSWAP(dst[20], dst[10]); - SORT_CSWAP(dst[5], dst[2]); - SORT_CSWAP(dst[7], dst[4]); - SORT_CSWAP(dst[16], dst[13]); - SORT_CSWAP(dst[18], dst[15]); - SORT_CSWAP(dst[12], dst[1]); - SORT_CSWAP(dst[19], dst[8]); - SORT_CSWAP(dst[6], dst[4]); - SORT_CSWAP(dst[5], dst[3]); - SORT_CSWAP(dst[17], dst[15]); - SORT_CSWAP(dst[16], dst[14]); - SORT_CSWAP(dst[11], dst[1]); - SORT_CSWAP(dst[13], dst[2]); - SORT_CSWAP(dst[18], dst[7]); - SORT_CSWAP(dst[19], dst[9]); - SORT_CSWAP(dst[5], dst[4]); - SORT_CSWAP(dst[16], dst[15]); - SORT_CSWAP(dst[14], dst[3]); - SORT_CSWAP(dst[11], dst[2]); - SORT_CSWAP(dst[17], dst[6]); - SORT_CSWAP(dst[19], dst[10]); - SORT_CSWAP(dst[15], dst[4]); - SORT_CSWAP(dst[13], dst[3]); - SORT_CSWAP(dst[16], dst[5]); - SORT_CSWAP(dst[17], dst[7]); - SORT_CSWAP(dst[18], dst[10]); - SORT_CSWAP(dst[14], dst[4]); - SORT_CSWAP(dst[12], dst[3]); - SORT_CSWAP(dst[16], dst[6]); - SORT_CSWAP(dst[17], dst[9]); - SORT_CSWAP(dst[13], dst[4]); - SORT_CSWAP(dst[11], dst[3]); - SORT_CSWAP(dst[16], dst[7]); - SORT_CSWAP(dst[17], dst[10]); - SORT_CSWAP(dst[12], dst[4]); - SORT_CSWAP(dst[16], dst[8]); - SORT_CSWAP(dst[13], dst[7]); - SORT_CSWAP(dst[11], dst[4]); - SORT_CSWAP(dst[16], dst[9]); - SORT_CSWAP(dst[12], dst[6]); - SORT_CSWAP(dst[14], dst[8]); - SORT_CSWAP(dst[16], dst[10]); - SORT_CSWAP(dst[11], dst[5]); - SORT_CSWAP(dst[12], dst[7]); - SORT_CSWAP(dst[15], dst[9]); - SORT_CSWAP(dst[11], dst[6]); - SORT_CSWAP(dst[15], dst[10]); - SORT_CSWAP(dst[14], dst[9]); - SORT_CSWAP(dst[11], dst[7]); - SORT_CSWAP(dst[14], dst[10]); - SORT_CSWAP(dst[12], dst[9]); - SORT_CSWAP(dst[11], dst[8]); - SORT_CSWAP(dst[13], dst[10]); - SORT_CSWAP(dst[12], dst[10]); - SORT_CSWAP(dst[11], dst[9]); - SORT_CSWAP(dst[11], dst[10]); -} - - -#define BITONIC_SORT_REVERSE_23 SORT_MAKE_STR(bitonic_sort_reverse_23) -static __inline void BITONIC_SORT_REVERSE_23(SORT_TYPE *dst) { - SORT_CSWAP(dst[1], dst[0]); - SORT_CSWAP(dst[4], dst[3]); - SORT_CSWAP(dst[7], dst[6]); - SORT_CSWAP(dst[10], dst[9]); - SORT_CSWAP(dst[13], dst[12]); - SORT_CSWAP(dst[16], dst[15]); - SORT_CSWAP(dst[19], dst[18]); - SORT_CSWAP(dst[22], dst[21]); - SORT_CSWAP(dst[4], dst[2]); - SORT_CSWAP(dst[7], dst[5]); - SORT_CSWAP(dst[10], dst[8]); - SORT_CSWAP(dst[13], dst[11]); - SORT_CSWAP(dst[16], dst[14]); - SORT_CSWAP(dst[19], dst[17]); - SORT_CSWAP(dst[22], dst[20]); - SORT_CSWAP(dst[3], dst[2]); - SORT_CSWAP(dst[4], dst[1]); - SORT_CSWAP(dst[6], dst[5]); - SORT_CSWAP(dst[9], dst[8]); - SORT_CSWAP(dst[10], dst[7]); - SORT_CSWAP(dst[12], dst[11]); - SORT_CSWAP(dst[15], dst[14]); - SORT_CSWAP(dst[16], dst[13]); - SORT_CSWAP(dst[18], dst[17]); - SORT_CSWAP(dst[21], dst[20]); - SORT_CSWAP(dst[22], dst[19]); - SORT_CSWAP(dst[3], dst[0]); - SORT_CSWAP(dst[8], dst[5]); - SORT_CSWAP(dst[9], dst[6]); - SORT_CSWAP(dst[10], dst[4]); - SORT_CSWAP(dst[14], dst[11]); - SORT_CSWAP(dst[15], dst[12]); - SORT_CSWAP(dst[20], dst[17]); - SORT_CSWAP(dst[21], dst[18]); - SORT_CSWAP(dst[22], dst[16]); - SORT_CSWAP(dst[2], dst[0]); - SORT_CSWAP(dst[3], dst[1]); - SORT_CSWAP(dst[9], dst[7]); - SORT_CSWAP(dst[8], dst[6]); - SORT_CSWAP(dst[15], dst[13]); - SORT_CSWAP(dst[14], dst[12]); - SORT_CSWAP(dst[21], dst[19]); - SORT_CSWAP(dst[20], dst[18]); - SORT_CSWAP(dst[17], dst[11]); - SORT_CSWAP(dst[22], dst[10]); - SORT_CSWAP(dst[2], dst[1]); - SORT_CSWAP(dst[8], dst[7]); - SORT_CSWAP(dst[6], dst[0]); - SORT_CSWAP(dst[9], dst[3]); - SORT_CSWAP(dst[14], dst[13]); - SORT_CSWAP(dst[20], dst[19]); - SORT_CSWAP(dst[18], dst[12]); - SORT_CSWAP(dst[21], dst[15]); - SORT_CSWAP(dst[5], dst[0]); - SORT_CSWAP(dst[7], dst[1]); - SORT_CSWAP(dst[8], dst[2]); - SORT_CSWAP(dst[9], dst[4]); - SORT_CSWAP(dst[19], dst[13]); - SORT_CSWAP(dst[17], dst[12]); - SORT_CSWAP(dst[20], dst[14]); - SORT_CSWAP(dst[21], dst[16]); - SORT_CSWAP(dst[6], dst[1]); - SORT_CSWAP(dst[8], dst[3]); - SORT_CSWAP(dst[18], dst[13]); - SORT_CSWAP(dst[20], dst[15]); - SORT_CSWAP(dst[12], dst[0]); - SORT_CSWAP(dst[21], dst[9]); - SORT_CSWAP(dst[5], dst[1]); - SORT_CSWAP(dst[8], dst[4]); - SORT_CSWAP(dst[6], dst[3]); - SORT_CSWAP(dst[17], dst[13]); - SORT_CSWAP(dst[20], dst[16]); - SORT_CSWAP(dst[18], dst[15]); - SORT_CSWAP(dst[11], dst[0]); - SORT_CSWAP(dst[21], dst[10]); - SORT_CSWAP(dst[5], dst[2]); - SORT_CSWAP(dst[7], dst[4]); - SORT_CSWAP(dst[17], dst[14]); - SORT_CSWAP(dst[19], dst[16]); - SORT_CSWAP(dst[13], dst[1]); - SORT_CSWAP(dst[20], dst[8]); - SORT_CSWAP(dst[6], dst[4]); - SORT_CSWAP(dst[5], dst[3]); - SORT_CSWAP(dst[18], dst[16]); - SORT_CSWAP(dst[17], dst[15]); - SORT_CSWAP(dst[12], dst[1]); - SORT_CSWAP(dst[14], dst[2]); - SORT_CSWAP(dst[19], dst[7]); - SORT_CSWAP(dst[20], dst[9]); - SORT_CSWAP(dst[5], dst[4]); - SORT_CSWAP(dst[17], dst[16]); - SORT_CSWAP(dst[11], dst[1]); - SORT_CSWAP(dst[15], dst[3]); - SORT_CSWAP(dst[18], dst[6]); - SORT_CSWAP(dst[20], dst[10]); - SORT_CSWAP(dst[16], dst[4]); - SORT_CSWAP(dst[14], dst[3]); - SORT_CSWAP(dst[11], dst[2]); - SORT_CSWAP(dst[17], dst[5]); - SORT_CSWAP(dst[18], dst[7]); - SORT_CSWAP(dst[19], dst[10]); - SORT_CSWAP(dst[15], dst[4]); - SORT_CSWAP(dst[12], dst[3]); - SORT_CSWAP(dst[17], dst[6]); - SORT_CSWAP(dst[18], dst[9]); - SORT_CSWAP(dst[14], dst[4]); - SORT_CSWAP(dst[11], dst[3]); - SORT_CSWAP(dst[17], dst[7]); - SORT_CSWAP(dst[18], dst[10]); - SORT_CSWAP(dst[13], dst[4]); - SORT_CSWAP(dst[17], dst[8]); - SORT_CSWAP(dst[12], dst[4]); - SORT_CSWAP(dst[17], dst[9]); - SORT_CSWAP(dst[13], dst[7]); - SORT_CSWAP(dst[14], dst[8]); - SORT_CSWAP(dst[11], dst[4]); - SORT_CSWAP(dst[17], dst[10]); - SORT_CSWAP(dst[12], dst[6]); - SORT_CSWAP(dst[15], dst[9]); - SORT_CSWAP(dst[11], dst[5]); - SORT_CSWAP(dst[12], dst[7]); - SORT_CSWAP(dst[16], dst[10]); - SORT_CSWAP(dst[14], dst[9]); - SORT_CSWAP(dst[11], dst[6]); - SORT_CSWAP(dst[15], dst[10]); - SORT_CSWAP(dst[12], dst[9]); - SORT_CSWAP(dst[11], dst[7]); - SORT_CSWAP(dst[14], dst[10]); - SORT_CSWAP(dst[11], dst[8]); - SORT_CSWAP(dst[13], dst[10]); - SORT_CSWAP(dst[12], dst[10]); - SORT_CSWAP(dst[11], dst[9]); - SORT_CSWAP(dst[11], dst[10]); -} - - -#define BITONIC_SORT_REVERSE_24 SORT_MAKE_STR(bitonic_sort_reverse_24) -static __inline void BITONIC_SORT_REVERSE_24(SORT_TYPE *dst) { - SORT_CSWAP(dst[2], dst[1]); - SORT_CSWAP(dst[5], dst[4]); - SORT_CSWAP(dst[8], dst[7]); - SORT_CSWAP(dst[11], dst[10]); - SORT_CSWAP(dst[14], dst[13]); - SORT_CSWAP(dst[17], dst[16]); - SORT_CSWAP(dst[20], dst[19]); - SORT_CSWAP(dst[23], dst[22]); - SORT_CSWAP(dst[2], dst[0]); - SORT_CSWAP(dst[5], dst[3]); - SORT_CSWAP(dst[8], dst[6]); - SORT_CSWAP(dst[11], dst[9]); - SORT_CSWAP(dst[14], dst[12]); - SORT_CSWAP(dst[17], dst[15]); - SORT_CSWAP(dst[20], dst[18]); - SORT_CSWAP(dst[23], dst[21]); - SORT_CSWAP(dst[1], dst[0]); - SORT_CSWAP(dst[4], dst[3]); - SORT_CSWAP(dst[5], dst[2]); - SORT_CSWAP(dst[7], dst[6]); - SORT_CSWAP(dst[10], dst[9]); - SORT_CSWAP(dst[11], dst[8]); - SORT_CSWAP(dst[13], dst[12]); - SORT_CSWAP(dst[16], dst[15]); - SORT_CSWAP(dst[17], dst[14]); - SORT_CSWAP(dst[19], dst[18]); - SORT_CSWAP(dst[22], dst[21]); - SORT_CSWAP(dst[23], dst[20]); - SORT_CSWAP(dst[3], dst[0]); - SORT_CSWAP(dst[4], dst[1]); - SORT_CSWAP(dst[9], dst[6]); - SORT_CSWAP(dst[10], dst[7]); - SORT_CSWAP(dst[11], dst[5]); - SORT_CSWAP(dst[15], dst[12]); - SORT_CSWAP(dst[16], dst[13]); - SORT_CSWAP(dst[21], dst[18]); - SORT_CSWAP(dst[22], dst[19]); - SORT_CSWAP(dst[23], dst[17]); - SORT_CSWAP(dst[4], dst[2]); - SORT_CSWAP(dst[3], dst[1]); - SORT_CSWAP(dst[10], dst[8]); - SORT_CSWAP(dst[9], dst[7]); - SORT_CSWAP(dst[6], dst[0]); - SORT_CSWAP(dst[16], dst[14]); - SORT_CSWAP(dst[15], dst[13]); - SORT_CSWAP(dst[22], dst[20]); - SORT_CSWAP(dst[21], dst[19]); - SORT_CSWAP(dst[18], dst[12]); - SORT_CSWAP(dst[23], dst[11]); - SORT_CSWAP(dst[3], dst[2]); - SORT_CSWAP(dst[9], dst[8]); - SORT_CSWAP(dst[7], dst[1]); - SORT_CSWAP(dst[10], dst[4]); - SORT_CSWAP(dst[15], dst[14]); - SORT_CSWAP(dst[21], dst[20]); - SORT_CSWAP(dst[19], dst[13]); - SORT_CSWAP(dst[22], dst[16]); - SORT_CSWAP(dst[12], dst[0]); - SORT_CSWAP(dst[8], dst[2]); - SORT_CSWAP(dst[6], dst[1]); - SORT_CSWAP(dst[9], dst[3]); - SORT_CSWAP(dst[10], dst[5]); - SORT_CSWAP(dst[20], dst[14]); - SORT_CSWAP(dst[18], dst[13]); - SORT_CSWAP(dst[21], dst[15]); - SORT_CSWAP(dst[22], dst[17]); - SORT_CSWAP(dst[7], dst[2]); - SORT_CSWAP(dst[9], dst[4]); - SORT_CSWAP(dst[19], dst[14]); - SORT_CSWAP(dst[21], dst[16]); - SORT_CSWAP(dst[13], dst[1]); - SORT_CSWAP(dst[22], dst[10]); - SORT_CSWAP(dst[6], dst[2]); - SORT_CSWAP(dst[9], dst[5]); - SORT_CSWAP(dst[7], dst[4]); - SORT_CSWAP(dst[18], dst[14]); - SORT_CSWAP(dst[21], dst[17]); - SORT_CSWAP(dst[19], dst[16]); - SORT_CSWAP(dst[12], dst[1]); - SORT_CSWAP(dst[22], dst[11]); - SORT_CSWAP(dst[6], dst[3]); - SORT_CSWAP(dst[8], dst[5]); - SORT_CSWAP(dst[18], dst[15]); - SORT_CSWAP(dst[20], dst[17]); - SORT_CSWAP(dst[14], dst[2]); - SORT_CSWAP(dst[21], dst[9]); - SORT_CSWAP(dst[7], dst[5]); - SORT_CSWAP(dst[6], dst[4]); - SORT_CSWAP(dst[19], dst[17]); - SORT_CSWAP(dst[18], dst[16]); - SORT_CSWAP(dst[13], dst[2]); - SORT_CSWAP(dst[15], dst[3]); - SORT_CSWAP(dst[20], dst[8]); - SORT_CSWAP(dst[21], dst[10]); - SORT_CSWAP(dst[6], dst[5]); - SORT_CSWAP(dst[18], dst[17]); - SORT_CSWAP(dst[12], dst[2]); - SORT_CSWAP(dst[16], dst[4]); - SORT_CSWAP(dst[19], dst[7]); - SORT_CSWAP(dst[21], dst[11]); - SORT_CSWAP(dst[17], dst[5]); - SORT_CSWAP(dst[15], dst[4]); - SORT_CSWAP(dst[12], dst[3]); - SORT_CSWAP(dst[18], dst[6]); - SORT_CSWAP(dst[19], dst[8]); - SORT_CSWAP(dst[20], dst[11]); - SORT_CSWAP(dst[16], dst[5]); - SORT_CSWAP(dst[13], dst[4]); - SORT_CSWAP(dst[18], dst[7]); - SORT_CSWAP(dst[19], dst[10]); - SORT_CSWAP(dst[15], dst[5]); - SORT_CSWAP(dst[12], dst[4]); - SORT_CSWAP(dst[18], dst[8]); - SORT_CSWAP(dst[19], dst[11]); - SORT_CSWAP(dst[14], dst[5]); - SORT_CSWAP(dst[18], dst[9]); - SORT_CSWAP(dst[13], dst[5]); - SORT_CSWAP(dst[18], dst[10]); - SORT_CSWAP(dst[14], dst[8]); - SORT_CSWAP(dst[15], dst[9]); - SORT_CSWAP(dst[12], dst[5]); - SORT_CSWAP(dst[18], dst[11]); - SORT_CSWAP(dst[13], dst[7]); - SORT_CSWAP(dst[16], dst[10]); - SORT_CSWAP(dst[12], dst[6]); - SORT_CSWAP(dst[13], dst[8]); - SORT_CSWAP(dst[17], dst[11]); - SORT_CSWAP(dst[15], dst[10]); - SORT_CSWAP(dst[12], dst[7]); - SORT_CSWAP(dst[16], dst[11]); - SORT_CSWAP(dst[13], dst[10]); - SORT_CSWAP(dst[12], dst[8]); - SORT_CSWAP(dst[15], dst[11]); - SORT_CSWAP(dst[12], dst[9]); - SORT_CSWAP(dst[14], dst[11]); - SORT_CSWAP(dst[13], dst[11]); - SORT_CSWAP(dst[12], dst[10]); - SORT_CSWAP(dst[12], dst[11]); -} - - -#define BITONIC_SORT_REVERSE_25 SORT_MAKE_STR(bitonic_sort_reverse_25) -static __inline void BITONIC_SORT_REVERSE_25(SORT_TYPE *dst) { - SORT_CSWAP(dst[2], dst[1]); - SORT_CSWAP(dst[5], dst[4]); - SORT_CSWAP(dst[8], dst[7]); - SORT_CSWAP(dst[11], dst[10]); - SORT_CSWAP(dst[14], dst[13]); - SORT_CSWAP(dst[17], dst[16]); - SORT_CSWAP(dst[20], dst[19]); - SORT_CSWAP(dst[22], dst[21]); - SORT_CSWAP(dst[24], dst[23]); - SORT_CSWAP(dst[2], dst[0]); - SORT_CSWAP(dst[5], dst[3]); - SORT_CSWAP(dst[8], dst[6]); - SORT_CSWAP(dst[11], dst[9]); - SORT_CSWAP(dst[14], dst[12]); - SORT_CSWAP(dst[17], dst[15]); - SORT_CSWAP(dst[20], dst[18]); - SORT_CSWAP(dst[23], dst[21]); - SORT_CSWAP(dst[24], dst[22]); - SORT_CSWAP(dst[1], dst[0]); - SORT_CSWAP(dst[4], dst[3]); - SORT_CSWAP(dst[5], dst[2]); - SORT_CSWAP(dst[7], dst[6]); - SORT_CSWAP(dst[10], dst[9]); - SORT_CSWAP(dst[11], dst[8]); - SORT_CSWAP(dst[13], dst[12]); - SORT_CSWAP(dst[16], dst[15]); - SORT_CSWAP(dst[17], dst[14]); - SORT_CSWAP(dst[19], dst[18]); - SORT_CSWAP(dst[23], dst[22]); - SORT_CSWAP(dst[24], dst[20]); - SORT_CSWAP(dst[3], dst[0]); - SORT_CSWAP(dst[4], dst[1]); - SORT_CSWAP(dst[9], dst[6]); - SORT_CSWAP(dst[10], dst[7]); - SORT_CSWAP(dst[11], dst[5]); - SORT_CSWAP(dst[15], dst[12]); - SORT_CSWAP(dst[16], dst[13]); - SORT_CSWAP(dst[22], dst[18]); - SORT_CSWAP(dst[23], dst[19]); - SORT_CSWAP(dst[24], dst[17]); - SORT_CSWAP(dst[4], dst[2]); - SORT_CSWAP(dst[3], dst[1]); - SORT_CSWAP(dst[10], dst[8]); - SORT_CSWAP(dst[9], dst[7]); - SORT_CSWAP(dst[6], dst[0]); - SORT_CSWAP(dst[16], dst[14]); - SORT_CSWAP(dst[15], dst[13]); - SORT_CSWAP(dst[21], dst[18]); - SORT_CSWAP(dst[23], dst[20]); - SORT_CSWAP(dst[24], dst[11]); - SORT_CSWAP(dst[3], dst[2]); - SORT_CSWAP(dst[9], dst[8]); - SORT_CSWAP(dst[7], dst[1]); - SORT_CSWAP(dst[10], dst[4]); - SORT_CSWAP(dst[15], dst[14]); - SORT_CSWAP(dst[21], dst[19]); - SORT_CSWAP(dst[22], dst[20]); - SORT_CSWAP(dst[23], dst[16]); - SORT_CSWAP(dst[8], dst[2]); - SORT_CSWAP(dst[6], dst[1]); - SORT_CSWAP(dst[9], dst[3]); - SORT_CSWAP(dst[10], dst[5]); - SORT_CSWAP(dst[21], dst[20]); - SORT_CSWAP(dst[19], dst[12]); - SORT_CSWAP(dst[22], dst[15]); - SORT_CSWAP(dst[23], dst[17]); - SORT_CSWAP(dst[7], dst[2]); - SORT_CSWAP(dst[9], dst[4]); - SORT_CSWAP(dst[18], dst[12]); - SORT_CSWAP(dst[20], dst[13]); - SORT_CSWAP(dst[21], dst[14]); - SORT_CSWAP(dst[22], dst[16]); - SORT_CSWAP(dst[23], dst[10]); - SORT_CSWAP(dst[6], dst[2]); - SORT_CSWAP(dst[9], dst[5]); - SORT_CSWAP(dst[7], dst[4]); - SORT_CSWAP(dst[20], dst[14]); - SORT_CSWAP(dst[18], dst[13]); - SORT_CSWAP(dst[22], dst[17]); - SORT_CSWAP(dst[23], dst[11]); - SORT_CSWAP(dst[6], dst[3]); - SORT_CSWAP(dst[8], dst[5]); - SORT_CSWAP(dst[19], dst[14]); - SORT_CSWAP(dst[20], dst[16]); - SORT_CSWAP(dst[21], dst[17]); - SORT_CSWAP(dst[13], dst[0]); - SORT_CSWAP(dst[22], dst[9]); - SORT_CSWAP(dst[7], dst[5]); - SORT_CSWAP(dst[6], dst[4]); - SORT_CSWAP(dst[18], dst[14]); - SORT_CSWAP(dst[19], dst[15]); - SORT_CSWAP(dst[20], dst[17]); - SORT_CSWAP(dst[12], dst[0]); - SORT_CSWAP(dst[21], dst[8]); - SORT_CSWAP(dst[22], dst[10]); - SORT_CSWAP(dst[6], dst[5]); - SORT_CSWAP(dst[18], dst[15]); - SORT_CSWAP(dst[19], dst[17]); - SORT_CSWAP(dst[14], dst[1]); - SORT_CSWAP(dst[20], dst[7]); - SORT_CSWAP(dst[22], dst[11]); - SORT_CSWAP(dst[18], dst[16]); - SORT_CSWAP(dst[15], dst[2]); - SORT_CSWAP(dst[12], dst[1]); - SORT_CSWAP(dst[19], dst[6]); - SORT_CSWAP(dst[20], dst[8]); - SORT_CSWAP(dst[21], dst[11]); - SORT_CSWAP(dst[18], dst[17]); - SORT_CSWAP(dst[14], dst[2]); - SORT_CSWAP(dst[16], dst[3]); - SORT_CSWAP(dst[19], dst[7]); - SORT_CSWAP(dst[20], dst[10]); - SORT_CSWAP(dst[13], dst[2]); - SORT_CSWAP(dst[17], dst[4]); - SORT_CSWAP(dst[18], dst[5]); - SORT_CSWAP(dst[19], dst[8]); - SORT_CSWAP(dst[20], dst[11]); - SORT_CSWAP(dst[12], dst[2]); - SORT_CSWAP(dst[17], dst[5]); - SORT_CSWAP(dst[16], dst[4]); - SORT_CSWAP(dst[13], dst[3]); - SORT_CSWAP(dst[19], dst[9]); - SORT_CSWAP(dst[16], dst[5]); - SORT_CSWAP(dst[12], dst[3]); - SORT_CSWAP(dst[14], dst[4]); - SORT_CSWAP(dst[19], dst[10]); - SORT_CSWAP(dst[15], dst[5]); - SORT_CSWAP(dst[12], dst[4]); - SORT_CSWAP(dst[19], dst[11]); - SORT_CSWAP(dst[16], dst[9]); - SORT_CSWAP(dst[17], dst[10]); - SORT_CSWAP(dst[14], dst[5]); - SORT_CSWAP(dst[15], dst[8]); - SORT_CSWAP(dst[18], dst[11]); - SORT_CSWAP(dst[16], dst[10]); - SORT_CSWAP(dst[13], dst[5]); - SORT_CSWAP(dst[14], dst[7]); - SORT_CSWAP(dst[17], dst[11]); - SORT_CSWAP(dst[12], dst[5]); - SORT_CSWAP(dst[13], dst[6]); - SORT_CSWAP(dst[14], dst[8]); - SORT_CSWAP(dst[16], dst[11]); - SORT_CSWAP(dst[12], dst[6]); - SORT_CSWAP(dst[13], dst[8]); - SORT_CSWAP(dst[14], dst[10]); - SORT_CSWAP(dst[15], dst[11]); - SORT_CSWAP(dst[12], dst[7]); - SORT_CSWAP(dst[13], dst[9]); - SORT_CSWAP(dst[14], dst[11]); - SORT_CSWAP(dst[12], dst[8]); - SORT_CSWAP(dst[13], dst[11]); - SORT_CSWAP(dst[12], dst[9]); - SORT_CSWAP(dst[12], dst[10]); - SORT_CSWAP(dst[12], dst[11]); -} - - -#define BITONIC_SORT_REVERSE_26 SORT_MAKE_STR(bitonic_sort_reverse_26) -static __inline void BITONIC_SORT_REVERSE_26(SORT_TYPE *dst) { - SORT_CSWAP(dst[2], dst[1]); - SORT_CSWAP(dst[5], dst[4]); - SORT_CSWAP(dst[8], dst[7]); - SORT_CSWAP(dst[10], dst[9]); - SORT_CSWAP(dst[12], dst[11]); - SORT_CSWAP(dst[15], dst[14]); - SORT_CSWAP(dst[18], dst[17]); - SORT_CSWAP(dst[21], dst[20]); - SORT_CSWAP(dst[23], dst[22]); - SORT_CSWAP(dst[25], dst[24]); - SORT_CSWAP(dst[2], dst[0]); - SORT_CSWAP(dst[5], dst[3]); - SORT_CSWAP(dst[8], dst[6]); - SORT_CSWAP(dst[11], dst[9]); - SORT_CSWAP(dst[12], dst[10]); - SORT_CSWAP(dst[15], dst[13]); - SORT_CSWAP(dst[18], dst[16]); - SORT_CSWAP(dst[21], dst[19]); - SORT_CSWAP(dst[24], dst[22]); - SORT_CSWAP(dst[25], dst[23]); - SORT_CSWAP(dst[1], dst[0]); - SORT_CSWAP(dst[4], dst[3]); - SORT_CSWAP(dst[5], dst[2]); - SORT_CSWAP(dst[7], dst[6]); - SORT_CSWAP(dst[11], dst[10]); - SORT_CSWAP(dst[12], dst[8]); - SORT_CSWAP(dst[14], dst[13]); - SORT_CSWAP(dst[17], dst[16]); - SORT_CSWAP(dst[18], dst[15]); - SORT_CSWAP(dst[20], dst[19]); - SORT_CSWAP(dst[24], dst[23]); - SORT_CSWAP(dst[25], dst[21]); - SORT_CSWAP(dst[3], dst[0]); - SORT_CSWAP(dst[4], dst[1]); - SORT_CSWAP(dst[10], dst[6]); - SORT_CSWAP(dst[11], dst[7]); - SORT_CSWAP(dst[12], dst[5]); - SORT_CSWAP(dst[16], dst[13]); - SORT_CSWAP(dst[17], dst[14]); - SORT_CSWAP(dst[23], dst[19]); - SORT_CSWAP(dst[24], dst[20]); - SORT_CSWAP(dst[25], dst[18]); - SORT_CSWAP(dst[4], dst[2]); - SORT_CSWAP(dst[3], dst[1]); - SORT_CSWAP(dst[9], dst[6]); - SORT_CSWAP(dst[11], dst[8]); - SORT_CSWAP(dst[17], dst[15]); - SORT_CSWAP(dst[16], dst[14]); - SORT_CSWAP(dst[22], dst[19]); - SORT_CSWAP(dst[24], dst[21]); - SORT_CSWAP(dst[25], dst[12]); - SORT_CSWAP(dst[3], dst[2]); - SORT_CSWAP(dst[9], dst[7]); - SORT_CSWAP(dst[10], dst[8]); - SORT_CSWAP(dst[11], dst[4]); - SORT_CSWAP(dst[16], dst[15]); - SORT_CSWAP(dst[22], dst[20]); - SORT_CSWAP(dst[23], dst[21]); - SORT_CSWAP(dst[24], dst[17]); - SORT_CSWAP(dst[9], dst[8]); - SORT_CSWAP(dst[7], dst[0]); - SORT_CSWAP(dst[10], dst[3]); - SORT_CSWAP(dst[11], dst[5]); - SORT_CSWAP(dst[22], dst[21]); - SORT_CSWAP(dst[20], dst[13]); - SORT_CSWAP(dst[23], dst[16]); - SORT_CSWAP(dst[24], dst[18]); - SORT_CSWAP(dst[6], dst[0]); - SORT_CSWAP(dst[8], dst[1]); - SORT_CSWAP(dst[9], dst[2]); - SORT_CSWAP(dst[10], dst[4]); - SORT_CSWAP(dst[19], dst[13]); - SORT_CSWAP(dst[21], dst[14]); - SORT_CSWAP(dst[22], dst[15]); - SORT_CSWAP(dst[23], dst[17]); - SORT_CSWAP(dst[24], dst[11]); - SORT_CSWAP(dst[8], dst[2]); - SORT_CSWAP(dst[6], dst[1]); - SORT_CSWAP(dst[10], dst[5]); - SORT_CSWAP(dst[21], dst[15]); - SORT_CSWAP(dst[19], dst[14]); - SORT_CSWAP(dst[23], dst[18]); - SORT_CSWAP(dst[13], dst[0]); - SORT_CSWAP(dst[24], dst[12]); - SORT_CSWAP(dst[7], dst[2]); - SORT_CSWAP(dst[8], dst[4]); - SORT_CSWAP(dst[9], dst[5]); - SORT_CSWAP(dst[20], dst[15]); - SORT_CSWAP(dst[21], dst[17]); - SORT_CSWAP(dst[22], dst[18]); - SORT_CSWAP(dst[14], dst[1]); - SORT_CSWAP(dst[23], dst[10]); - SORT_CSWAP(dst[6], dst[2]); - SORT_CSWAP(dst[7], dst[3]); - SORT_CSWAP(dst[8], dst[5]); - SORT_CSWAP(dst[19], dst[15]); - SORT_CSWAP(dst[20], dst[16]); - SORT_CSWAP(dst[21], dst[18]); - SORT_CSWAP(dst[13], dst[1]); - SORT_CSWAP(dst[22], dst[9]); - SORT_CSWAP(dst[23], dst[12]); - SORT_CSWAP(dst[6], dst[3]); - SORT_CSWAP(dst[7], dst[5]); - SORT_CSWAP(dst[19], dst[16]); - SORT_CSWAP(dst[20], dst[18]); - SORT_CSWAP(dst[15], dst[2]); - SORT_CSWAP(dst[21], dst[8]); - SORT_CSWAP(dst[22], dst[10]); - SORT_CSWAP(dst[6], dst[4]); - SORT_CSWAP(dst[19], dst[17]); - SORT_CSWAP(dst[14], dst[2]); - SORT_CSWAP(dst[16], dst[3]); - SORT_CSWAP(dst[20], dst[7]); - SORT_CSWAP(dst[22], dst[11]); - SORT_CSWAP(dst[6], dst[5]); - SORT_CSWAP(dst[19], dst[18]); - SORT_CSWAP(dst[13], dst[2]); - SORT_CSWAP(dst[17], dst[4]); - SORT_CSWAP(dst[20], dst[8]); - SORT_CSWAP(dst[22], dst[12]); - SORT_CSWAP(dst[21], dst[11]); - SORT_CSWAP(dst[18], dst[5]); - SORT_CSWAP(dst[16], dst[4]); - SORT_CSWAP(dst[13], dst[3]); - SORT_CSWAP(dst[19], dst[6]); - SORT_CSWAP(dst[20], dst[10]); - SORT_CSWAP(dst[21], dst[12]); - SORT_CSWAP(dst[17], dst[5]); - SORT_CSWAP(dst[14], dst[4]); - SORT_CSWAP(dst[19], dst[7]); - SORT_CSWAP(dst[20], dst[12]); - SORT_CSWAP(dst[16], dst[5]); - SORT_CSWAP(dst[13], dst[4]); - SORT_CSWAP(dst[19], dst[8]); - SORT_CSWAP(dst[15], dst[5]); - SORT_CSWAP(dst[19], dst[9]); - SORT_CSWAP(dst[14], dst[5]); - SORT_CSWAP(dst[19], dst[10]); - SORT_CSWAP(dst[15], dst[8]); - SORT_CSWAP(dst[16], dst[9]); - SORT_CSWAP(dst[13], dst[5]); - SORT_CSWAP(dst[19], dst[11]); - SORT_CSWAP(dst[14], dst[7]); - SORT_CSWAP(dst[17], dst[10]); - SORT_CSWAP(dst[19], dst[12]); - SORT_CSWAP(dst[13], dst[6]); - SORT_CSWAP(dst[14], dst[8]); - SORT_CSWAP(dst[16], dst[10]); - SORT_CSWAP(dst[18], dst[11]); - SORT_CSWAP(dst[13], dst[7]); - SORT_CSWAP(dst[18], dst[12]); - SORT_CSWAP(dst[16], dst[11]); - SORT_CSWAP(dst[14], dst[10]); - SORT_CSWAP(dst[13], dst[8]); - SORT_CSWAP(dst[17], dst[12]); - SORT_CSWAP(dst[15], dst[11]); - SORT_CSWAP(dst[16], dst[12]); - SORT_CSWAP(dst[13], dst[9]); - SORT_CSWAP(dst[13], dst[10]); - SORT_CSWAP(dst[15], dst[12]); - SORT_CSWAP(dst[13], dst[11]); - SORT_CSWAP(dst[14], dst[12]); - SORT_CSWAP(dst[13], dst[12]); -} - - -#define BITONIC_SORT_REVERSE_27 SORT_MAKE_STR(bitonic_sort_reverse_27) -static __inline void BITONIC_SORT_REVERSE_27(SORT_TYPE *dst) { - SORT_CSWAP(dst[2], dst[1]); - SORT_CSWAP(dst[5], dst[4]); - SORT_CSWAP(dst[8], dst[7]); - SORT_CSWAP(dst[10], dst[9]); - SORT_CSWAP(dst[12], dst[11]); - SORT_CSWAP(dst[15], dst[14]); - SORT_CSWAP(dst[17], dst[16]); - SORT_CSWAP(dst[19], dst[18]); - SORT_CSWAP(dst[22], dst[21]); - SORT_CSWAP(dst[24], dst[23]); - SORT_CSWAP(dst[26], dst[25]); - SORT_CSWAP(dst[2], dst[0]); - SORT_CSWAP(dst[5], dst[3]); - SORT_CSWAP(dst[8], dst[6]); - SORT_CSWAP(dst[11], dst[9]); - SORT_CSWAP(dst[12], dst[10]); - SORT_CSWAP(dst[15], dst[13]); - SORT_CSWAP(dst[18], dst[16]); - SORT_CSWAP(dst[19], dst[17]); - SORT_CSWAP(dst[22], dst[20]); - SORT_CSWAP(dst[25], dst[23]); - SORT_CSWAP(dst[26], dst[24]); - SORT_CSWAP(dst[1], dst[0]); - SORT_CSWAP(dst[4], dst[3]); - SORT_CSWAP(dst[5], dst[2]); - SORT_CSWAP(dst[7], dst[6]); - SORT_CSWAP(dst[11], dst[10]); - SORT_CSWAP(dst[12], dst[8]); - SORT_CSWAP(dst[14], dst[13]); - SORT_CSWAP(dst[18], dst[17]); - SORT_CSWAP(dst[19], dst[15]); - SORT_CSWAP(dst[21], dst[20]); - SORT_CSWAP(dst[25], dst[24]); - SORT_CSWAP(dst[26], dst[22]); - SORT_CSWAP(dst[3], dst[0]); - SORT_CSWAP(dst[4], dst[1]); - SORT_CSWAP(dst[10], dst[6]); - SORT_CSWAP(dst[11], dst[7]); - SORT_CSWAP(dst[12], dst[5]); - SORT_CSWAP(dst[17], dst[13]); - SORT_CSWAP(dst[18], dst[14]); - SORT_CSWAP(dst[24], dst[20]); - SORT_CSWAP(dst[25], dst[21]); - SORT_CSWAP(dst[26], dst[19]); - SORT_CSWAP(dst[4], dst[2]); - SORT_CSWAP(dst[3], dst[1]); - SORT_CSWAP(dst[9], dst[6]); - SORT_CSWAP(dst[11], dst[8]); - SORT_CSWAP(dst[16], dst[13]); - SORT_CSWAP(dst[18], dst[15]); - SORT_CSWAP(dst[23], dst[20]); - SORT_CSWAP(dst[25], dst[22]); - SORT_CSWAP(dst[26], dst[12]); - SORT_CSWAP(dst[3], dst[2]); - SORT_CSWAP(dst[9], dst[7]); - SORT_CSWAP(dst[10], dst[8]); - SORT_CSWAP(dst[11], dst[4]); - SORT_CSWAP(dst[16], dst[14]); - SORT_CSWAP(dst[17], dst[15]); - SORT_CSWAP(dst[23], dst[21]); - SORT_CSWAP(dst[24], dst[22]); - SORT_CSWAP(dst[20], dst[13]); - SORT_CSWAP(dst[25], dst[18]); - SORT_CSWAP(dst[9], dst[8]); - SORT_CSWAP(dst[7], dst[0]); - SORT_CSWAP(dst[10], dst[3]); - SORT_CSWAP(dst[11], dst[5]); - SORT_CSWAP(dst[16], dst[15]); - SORT_CSWAP(dst[23], dst[22]); - SORT_CSWAP(dst[21], dst[14]); - SORT_CSWAP(dst[24], dst[17]); - SORT_CSWAP(dst[25], dst[19]); - SORT_CSWAP(dst[6], dst[0]); - SORT_CSWAP(dst[8], dst[1]); - SORT_CSWAP(dst[9], dst[2]); - SORT_CSWAP(dst[10], dst[4]); - SORT_CSWAP(dst[22], dst[15]); - SORT_CSWAP(dst[20], dst[14]); - SORT_CSWAP(dst[23], dst[16]); - SORT_CSWAP(dst[24], dst[19]); - SORT_CSWAP(dst[25], dst[11]); - SORT_CSWAP(dst[8], dst[2]); - SORT_CSWAP(dst[6], dst[1]); - SORT_CSWAP(dst[10], dst[5]); - SORT_CSWAP(dst[21], dst[15]); - SORT_CSWAP(dst[23], dst[17]); - SORT_CSWAP(dst[14], dst[0]); - SORT_CSWAP(dst[25], dst[12]); - SORT_CSWAP(dst[7], dst[2]); - SORT_CSWAP(dst[8], dst[4]); - SORT_CSWAP(dst[9], dst[5]); - SORT_CSWAP(dst[20], dst[15]); - SORT_CSWAP(dst[23], dst[18]); - SORT_CSWAP(dst[21], dst[17]); - SORT_CSWAP(dst[13], dst[0]); - SORT_CSWAP(dst[24], dst[10]); - SORT_CSWAP(dst[6], dst[2]); - SORT_CSWAP(dst[7], dst[3]); - SORT_CSWAP(dst[8], dst[5]); - SORT_CSWAP(dst[23], dst[19]); - SORT_CSWAP(dst[20], dst[16]); - SORT_CSWAP(dst[22], dst[18]); - SORT_CSWAP(dst[15], dst[1]); - SORT_CSWAP(dst[24], dst[12]); - SORT_CSWAP(dst[6], dst[3]); - SORT_CSWAP(dst[7], dst[5]); - SORT_CSWAP(dst[20], dst[17]); - SORT_CSWAP(dst[22], dst[19]); - SORT_CSWAP(dst[16], dst[2]); - SORT_CSWAP(dst[13], dst[1]); - SORT_CSWAP(dst[23], dst[9]); - SORT_CSWAP(dst[6], dst[4]); - SORT_CSWAP(dst[20], dst[18]); - SORT_CSWAP(dst[21], dst[19]); - SORT_CSWAP(dst[15], dst[2]); - SORT_CSWAP(dst[17], dst[3]); - SORT_CSWAP(dst[22], dst[8]); - SORT_CSWAP(dst[23], dst[10]); - SORT_CSWAP(dst[6], dst[5]); - SORT_CSWAP(dst[20], dst[19]); - SORT_CSWAP(dst[14], dst[2]); - SORT_CSWAP(dst[18], dst[4]); - SORT_CSWAP(dst[21], dst[7]); - SORT_CSWAP(dst[23], dst[11]); - SORT_CSWAP(dst[13], dst[2]); - SORT_CSWAP(dst[19], dst[5]); - SORT_CSWAP(dst[17], dst[4]); - SORT_CSWAP(dst[14], dst[3]); - SORT_CSWAP(dst[20], dst[6]); - SORT_CSWAP(dst[21], dst[8]); - SORT_CSWAP(dst[23], dst[12]); - SORT_CSWAP(dst[22], dst[11]); - SORT_CSWAP(dst[18], dst[5]); - SORT_CSWAP(dst[13], dst[3]); - SORT_CSWAP(dst[15], dst[4]); - SORT_CSWAP(dst[20], dst[7]); - SORT_CSWAP(dst[21], dst[10]); - SORT_CSWAP(dst[22], dst[12]); - SORT_CSWAP(dst[17], dst[5]); - SORT_CSWAP(dst[13], dst[4]); - SORT_CSWAP(dst[20], dst[8]); - SORT_CSWAP(dst[21], dst[12]); - SORT_CSWAP(dst[16], dst[5]); - SORT_CSWAP(dst[20], dst[9]); - SORT_CSWAP(dst[15], dst[5]); - SORT_CSWAP(dst[20], dst[10]); - SORT_CSWAP(dst[16], dst[9]); - SORT_CSWAP(dst[14], dst[5]); - SORT_CSWAP(dst[20], dst[11]); - SORT_CSWAP(dst[15], dst[8]); - SORT_CSWAP(dst[17], dst[10]); - SORT_CSWAP(dst[13], dst[5]); - SORT_CSWAP(dst[20], dst[12]); - SORT_CSWAP(dst[14], dst[7]); - SORT_CSWAP(dst[16], dst[10]); - SORT_CSWAP(dst[18], dst[11]); - SORT_CSWAP(dst[13], dst[6]); - SORT_CSWAP(dst[14], dst[8]); - SORT_CSWAP(dst[19], dst[12]); - SORT_CSWAP(dst[16], dst[11]); - SORT_CSWAP(dst[13], dst[7]); - SORT_CSWAP(dst[18], dst[12]); - SORT_CSWAP(dst[14], dst[10]); - SORT_CSWAP(dst[15], dst[11]); - SORT_CSWAP(dst[13], dst[8]); - SORT_CSWAP(dst[17], dst[12]); - SORT_CSWAP(dst[16], dst[12]); - SORT_CSWAP(dst[13], dst[9]); - SORT_CSWAP(dst[13], dst[10]); - SORT_CSWAP(dst[15], dst[12]); - SORT_CSWAP(dst[13], dst[11]); - SORT_CSWAP(dst[14], dst[12]); - SORT_CSWAP(dst[13], dst[12]); -} - - -#define BITONIC_SORT_REVERSE_28 SORT_MAKE_STR(bitonic_sort_reverse_28) -static __inline void BITONIC_SORT_REVERSE_28(SORT_TYPE *dst) { - SORT_CSWAP(dst[2], dst[1]); - SORT_CSWAP(dst[4], dst[3]); - SORT_CSWAP(dst[6], dst[5]); - SORT_CSWAP(dst[9], dst[8]); - SORT_CSWAP(dst[11], dst[10]); - SORT_CSWAP(dst[13], dst[12]); - SORT_CSWAP(dst[16], dst[15]); - SORT_CSWAP(dst[18], dst[17]); - SORT_CSWAP(dst[20], dst[19]); - SORT_CSWAP(dst[23], dst[22]); - SORT_CSWAP(dst[25], dst[24]); - SORT_CSWAP(dst[27], dst[26]); - SORT_CSWAP(dst[2], dst[0]); - SORT_CSWAP(dst[5], dst[3]); - SORT_CSWAP(dst[6], dst[4]); - SORT_CSWAP(dst[9], dst[7]); - SORT_CSWAP(dst[12], dst[10]); - SORT_CSWAP(dst[13], dst[11]); - SORT_CSWAP(dst[16], dst[14]); - SORT_CSWAP(dst[19], dst[17]); - SORT_CSWAP(dst[20], dst[18]); - SORT_CSWAP(dst[23], dst[21]); - SORT_CSWAP(dst[26], dst[24]); - SORT_CSWAP(dst[27], dst[25]); - SORT_CSWAP(dst[1], dst[0]); - SORT_CSWAP(dst[5], dst[4]); - SORT_CSWAP(dst[6], dst[2]); - SORT_CSWAP(dst[8], dst[7]); - SORT_CSWAP(dst[12], dst[11]); - SORT_CSWAP(dst[13], dst[9]); - SORT_CSWAP(dst[15], dst[14]); - SORT_CSWAP(dst[19], dst[18]); - SORT_CSWAP(dst[20], dst[16]); - SORT_CSWAP(dst[22], dst[21]); - SORT_CSWAP(dst[26], dst[25]); - SORT_CSWAP(dst[27], dst[23]); - SORT_CSWAP(dst[4], dst[0]); - SORT_CSWAP(dst[5], dst[1]); - SORT_CSWAP(dst[11], dst[7]); - SORT_CSWAP(dst[12], dst[8]); - SORT_CSWAP(dst[13], dst[6]); - SORT_CSWAP(dst[18], dst[14]); - SORT_CSWAP(dst[19], dst[15]); - SORT_CSWAP(dst[25], dst[21]); - SORT_CSWAP(dst[26], dst[22]); - SORT_CSWAP(dst[27], dst[20]); - SORT_CSWAP(dst[3], dst[0]); - SORT_CSWAP(dst[5], dst[2]); - SORT_CSWAP(dst[10], dst[7]); - SORT_CSWAP(dst[12], dst[9]); - SORT_CSWAP(dst[17], dst[14]); - SORT_CSWAP(dst[19], dst[16]); - SORT_CSWAP(dst[24], dst[21]); - SORT_CSWAP(dst[26], dst[23]); - SORT_CSWAP(dst[27], dst[13]); - SORT_CSWAP(dst[3], dst[1]); - SORT_CSWAP(dst[4], dst[2]); - SORT_CSWAP(dst[10], dst[8]); - SORT_CSWAP(dst[11], dst[9]); - SORT_CSWAP(dst[7], dst[0]); - SORT_CSWAP(dst[12], dst[5]); - SORT_CSWAP(dst[17], dst[15]); - SORT_CSWAP(dst[18], dst[16]); - SORT_CSWAP(dst[24], dst[22]); - SORT_CSWAP(dst[25], dst[23]); - SORT_CSWAP(dst[21], dst[14]); - SORT_CSWAP(dst[26], dst[19]); - SORT_CSWAP(dst[3], dst[2]); - SORT_CSWAP(dst[10], dst[9]); - SORT_CSWAP(dst[8], dst[1]); - SORT_CSWAP(dst[11], dst[4]); - SORT_CSWAP(dst[12], dst[6]); - SORT_CSWAP(dst[17], dst[16]); - SORT_CSWAP(dst[24], dst[23]); - SORT_CSWAP(dst[22], dst[15]); - SORT_CSWAP(dst[25], dst[18]); - SORT_CSWAP(dst[26], dst[20]); - SORT_CSWAP(dst[14], dst[0]); - SORT_CSWAP(dst[9], dst[2]); - SORT_CSWAP(dst[7], dst[1]); - SORT_CSWAP(dst[10], dst[3]); - SORT_CSWAP(dst[11], dst[6]); - SORT_CSWAP(dst[23], dst[16]); - SORT_CSWAP(dst[21], dst[15]); - SORT_CSWAP(dst[24], dst[17]); - SORT_CSWAP(dst[25], dst[20]); - SORT_CSWAP(dst[26], dst[12]); - SORT_CSWAP(dst[8], dst[2]); - SORT_CSWAP(dst[10], dst[4]); - SORT_CSWAP(dst[22], dst[16]); - SORT_CSWAP(dst[24], dst[18]); - SORT_CSWAP(dst[15], dst[1]); - SORT_CSWAP(dst[25], dst[11]); - SORT_CSWAP(dst[26], dst[13]); - SORT_CSWAP(dst[7], dst[2]); - SORT_CSWAP(dst[10], dst[5]); - SORT_CSWAP(dst[8], dst[4]); - SORT_CSWAP(dst[21], dst[16]); - SORT_CSWAP(dst[24], dst[19]); - SORT_CSWAP(dst[22], dst[18]); - SORT_CSWAP(dst[14], dst[1]); - SORT_CSWAP(dst[25], dst[13]); - SORT_CSWAP(dst[10], dst[6]); - SORT_CSWAP(dst[7], dst[3]); - SORT_CSWAP(dst[9], dst[5]); - SORT_CSWAP(dst[24], dst[20]); - SORT_CSWAP(dst[21], dst[17]); - SORT_CSWAP(dst[23], dst[19]); - SORT_CSWAP(dst[16], dst[2]); - SORT_CSWAP(dst[7], dst[4]); - SORT_CSWAP(dst[9], dst[6]); - SORT_CSWAP(dst[21], dst[18]); - SORT_CSWAP(dst[23], dst[20]); - SORT_CSWAP(dst[15], dst[2]); - SORT_CSWAP(dst[17], dst[3]); - SORT_CSWAP(dst[24], dst[10]); - SORT_CSWAP(dst[7], dst[5]); - SORT_CSWAP(dst[8], dst[6]); - SORT_CSWAP(dst[21], dst[19]); - SORT_CSWAP(dst[22], dst[20]); - SORT_CSWAP(dst[14], dst[2]); - SORT_CSWAP(dst[18], dst[4]); - SORT_CSWAP(dst[23], dst[9]); - SORT_CSWAP(dst[24], dst[11]); - SORT_CSWAP(dst[7], dst[6]); - SORT_CSWAP(dst[21], dst[20]); - SORT_CSWAP(dst[17], dst[4]); - SORT_CSWAP(dst[19], dst[5]); - SORT_CSWAP(dst[14], dst[3]); - SORT_CSWAP(dst[22], dst[8]); - SORT_CSWAP(dst[24], dst[12]); - SORT_CSWAP(dst[20], dst[6]); - SORT_CSWAP(dst[17], dst[5]); - SORT_CSWAP(dst[15], dst[4]); - SORT_CSWAP(dst[21], dst[7]); - SORT_CSWAP(dst[22], dst[9]); - SORT_CSWAP(dst[24], dst[13]); - SORT_CSWAP(dst[23], dst[12]); - SORT_CSWAP(dst[19], dst[6]); - SORT_CSWAP(dst[14], dst[4]); - SORT_CSWAP(dst[16], dst[5]); - SORT_CSWAP(dst[21], dst[8]); - SORT_CSWAP(dst[22], dst[11]); - SORT_CSWAP(dst[23], dst[13]); - SORT_CSWAP(dst[18], dst[6]); - SORT_CSWAP(dst[14], dst[5]); - SORT_CSWAP(dst[21], dst[9]); - SORT_CSWAP(dst[22], dst[13]); - SORT_CSWAP(dst[17], dst[6]); - SORT_CSWAP(dst[21], dst[10]); - SORT_CSWAP(dst[16], dst[6]); - SORT_CSWAP(dst[21], dst[11]); - SORT_CSWAP(dst[17], dst[10]); - SORT_CSWAP(dst[15], dst[6]); - SORT_CSWAP(dst[21], dst[12]); - SORT_CSWAP(dst[16], dst[9]); - SORT_CSWAP(dst[18], dst[11]); - SORT_CSWAP(dst[14], dst[6]); - SORT_CSWAP(dst[21], dst[13]); - SORT_CSWAP(dst[15], dst[8]); - SORT_CSWAP(dst[17], dst[11]); - SORT_CSWAP(dst[19], dst[12]); - SORT_CSWAP(dst[14], dst[7]); - SORT_CSWAP(dst[15], dst[9]); - SORT_CSWAP(dst[20], dst[13]); - SORT_CSWAP(dst[17], dst[12]); - SORT_CSWAP(dst[14], dst[8]); - SORT_CSWAP(dst[19], dst[13]); - SORT_CSWAP(dst[15], dst[11]); - SORT_CSWAP(dst[16], dst[12]); - SORT_CSWAP(dst[14], dst[9]); - SORT_CSWAP(dst[18], dst[13]); - SORT_CSWAP(dst[17], dst[13]); - SORT_CSWAP(dst[14], dst[10]); - SORT_CSWAP(dst[14], dst[11]); - SORT_CSWAP(dst[16], dst[13]); - SORT_CSWAP(dst[14], dst[12]); - SORT_CSWAP(dst[15], dst[13]); - SORT_CSWAP(dst[14], dst[13]); -} - - -#define BITONIC_SORT_REVERSE_29 SORT_MAKE_STR(bitonic_sort_reverse_29) -static __inline void BITONIC_SORT_REVERSE_29(SORT_TYPE *dst) { - SORT_CSWAP(dst[2], dst[1]); - SORT_CSWAP(dst[4], dst[3]); - SORT_CSWAP(dst[6], dst[5]); - SORT_CSWAP(dst[9], dst[8]); - SORT_CSWAP(dst[11], dst[10]); - SORT_CSWAP(dst[13], dst[12]); - SORT_CSWAP(dst[16], dst[15]); - SORT_CSWAP(dst[18], dst[17]); - SORT_CSWAP(dst[20], dst[19]); - SORT_CSWAP(dst[22], dst[21]); - SORT_CSWAP(dst[24], dst[23]); - SORT_CSWAP(dst[26], dst[25]); - SORT_CSWAP(dst[28], dst[27]); - SORT_CSWAP(dst[2], dst[0]); - SORT_CSWAP(dst[5], dst[3]); - SORT_CSWAP(dst[6], dst[4]); - SORT_CSWAP(dst[9], dst[7]); - SORT_CSWAP(dst[12], dst[10]); - SORT_CSWAP(dst[13], dst[11]); - SORT_CSWAP(dst[16], dst[14]); - SORT_CSWAP(dst[19], dst[17]); - SORT_CSWAP(dst[20], dst[18]); - SORT_CSWAP(dst[23], dst[21]); - SORT_CSWAP(dst[24], dst[22]); - SORT_CSWAP(dst[27], dst[25]); - SORT_CSWAP(dst[28], dst[26]); - SORT_CSWAP(dst[1], dst[0]); - SORT_CSWAP(dst[5], dst[4]); - SORT_CSWAP(dst[6], dst[2]); - SORT_CSWAP(dst[8], dst[7]); - SORT_CSWAP(dst[12], dst[11]); - SORT_CSWAP(dst[13], dst[9]); - SORT_CSWAP(dst[15], dst[14]); - SORT_CSWAP(dst[19], dst[18]); - SORT_CSWAP(dst[20], dst[16]); - SORT_CSWAP(dst[23], dst[22]); - SORT_CSWAP(dst[27], dst[26]); - SORT_CSWAP(dst[25], dst[21]); - SORT_CSWAP(dst[28], dst[24]); - SORT_CSWAP(dst[4], dst[0]); - SORT_CSWAP(dst[5], dst[1]); - SORT_CSWAP(dst[11], dst[7]); - SORT_CSWAP(dst[12], dst[8]); - SORT_CSWAP(dst[13], dst[6]); - SORT_CSWAP(dst[18], dst[14]); - SORT_CSWAP(dst[19], dst[15]); - SORT_CSWAP(dst[26], dst[22]); - SORT_CSWAP(dst[27], dst[23]); - SORT_CSWAP(dst[28], dst[20]); - SORT_CSWAP(dst[3], dst[0]); - SORT_CSWAP(dst[5], dst[2]); - SORT_CSWAP(dst[10], dst[7]); - SORT_CSWAP(dst[12], dst[9]); - SORT_CSWAP(dst[17], dst[14]); - SORT_CSWAP(dst[19], dst[16]); - SORT_CSWAP(dst[25], dst[22]); - SORT_CSWAP(dst[27], dst[24]); - SORT_CSWAP(dst[28], dst[13]); - SORT_CSWAP(dst[3], dst[1]); - SORT_CSWAP(dst[4], dst[2]); - SORT_CSWAP(dst[10], dst[8]); - SORT_CSWAP(dst[11], dst[9]); - SORT_CSWAP(dst[7], dst[0]); - SORT_CSWAP(dst[12], dst[5]); - SORT_CSWAP(dst[17], dst[15]); - SORT_CSWAP(dst[18], dst[16]); - SORT_CSWAP(dst[25], dst[23]); - SORT_CSWAP(dst[26], dst[24]); - SORT_CSWAP(dst[22], dst[14]); - SORT_CSWAP(dst[27], dst[19]); - SORT_CSWAP(dst[3], dst[2]); - SORT_CSWAP(dst[10], dst[9]); - SORT_CSWAP(dst[8], dst[1]); - SORT_CSWAP(dst[11], dst[4]); - SORT_CSWAP(dst[12], dst[6]); - SORT_CSWAP(dst[17], dst[16]); - SORT_CSWAP(dst[25], dst[24]); - SORT_CSWAP(dst[21], dst[14]); - SORT_CSWAP(dst[23], dst[15]); - SORT_CSWAP(dst[26], dst[18]); - SORT_CSWAP(dst[27], dst[20]); - SORT_CSWAP(dst[9], dst[2]); - SORT_CSWAP(dst[7], dst[1]); - SORT_CSWAP(dst[10], dst[3]); - SORT_CSWAP(dst[11], dst[6]); - SORT_CSWAP(dst[24], dst[16]); - SORT_CSWAP(dst[21], dst[15]); - SORT_CSWAP(dst[25], dst[17]); - SORT_CSWAP(dst[26], dst[20]); - SORT_CSWAP(dst[27], dst[12]); - SORT_CSWAP(dst[8], dst[2]); - SORT_CSWAP(dst[10], dst[4]); - SORT_CSWAP(dst[23], dst[16]); - SORT_CSWAP(dst[25], dst[18]); - SORT_CSWAP(dst[15], dst[0]); - SORT_CSWAP(dst[26], dst[11]); - SORT_CSWAP(dst[27], dst[13]); - SORT_CSWAP(dst[7], dst[2]); - SORT_CSWAP(dst[10], dst[5]); - SORT_CSWAP(dst[8], dst[4]); - SORT_CSWAP(dst[22], dst[16]); - SORT_CSWAP(dst[25], dst[19]); - SORT_CSWAP(dst[14], dst[0]); - SORT_CSWAP(dst[26], dst[13]); - SORT_CSWAP(dst[10], dst[6]); - SORT_CSWAP(dst[7], dst[3]); - SORT_CSWAP(dst[9], dst[5]); - SORT_CSWAP(dst[21], dst[16]); - SORT_CSWAP(dst[25], dst[20]); - SORT_CSWAP(dst[22], dst[18]); - SORT_CSWAP(dst[23], dst[19]); - SORT_CSWAP(dst[7], dst[4]); - SORT_CSWAP(dst[9], dst[6]); - SORT_CSWAP(dst[21], dst[17]); - SORT_CSWAP(dst[24], dst[20]); - SORT_CSWAP(dst[16], dst[1]); - SORT_CSWAP(dst[25], dst[10]); - SORT_CSWAP(dst[7], dst[5]); - SORT_CSWAP(dst[8], dst[6]); - SORT_CSWAP(dst[21], dst[18]); - SORT_CSWAP(dst[23], dst[20]); - SORT_CSWAP(dst[17], dst[2]); - SORT_CSWAP(dst[14], dst[1]); - SORT_CSWAP(dst[24], dst[9]); - SORT_CSWAP(dst[25], dst[11]); - SORT_CSWAP(dst[7], dst[6]); - SORT_CSWAP(dst[21], dst[19]); - SORT_CSWAP(dst[22], dst[20]); - SORT_CSWAP(dst[16], dst[2]); - SORT_CSWAP(dst[18], dst[3]); - SORT_CSWAP(dst[23], dst[8]); - SORT_CSWAP(dst[25], dst[12]); - SORT_CSWAP(dst[21], dst[20]); - SORT_CSWAP(dst[15], dst[2]); - SORT_CSWAP(dst[19], dst[4]); - SORT_CSWAP(dst[22], dst[7]); - SORT_CSWAP(dst[23], dst[9]); - SORT_CSWAP(dst[25], dst[13]); - SORT_CSWAP(dst[24], dst[12]); - SORT_CSWAP(dst[14], dst[2]); - SORT_CSWAP(dst[18], dst[4]); - SORT_CSWAP(dst[20], dst[5]); - SORT_CSWAP(dst[21], dst[6]); - SORT_CSWAP(dst[22], dst[8]); - SORT_CSWAP(dst[23], dst[11]); - SORT_CSWAP(dst[24], dst[13]); - SORT_CSWAP(dst[20], dst[6]); - SORT_CSWAP(dst[18], dst[5]); - SORT_CSWAP(dst[14], dst[3]); - SORT_CSWAP(dst[15], dst[4]); - SORT_CSWAP(dst[22], dst[9]); - SORT_CSWAP(dst[23], dst[13]); - SORT_CSWAP(dst[19], dst[6]); - SORT_CSWAP(dst[14], dst[4]); - SORT_CSWAP(dst[16], dst[5]); - SORT_CSWAP(dst[22], dst[10]); - SORT_CSWAP(dst[18], dst[6]); - SORT_CSWAP(dst[14], dst[5]); - SORT_CSWAP(dst[22], dst[11]); - SORT_CSWAP(dst[17], dst[6]); - SORT_CSWAP(dst[22], dst[12]); - SORT_CSWAP(dst[18], dst[10]); - SORT_CSWAP(dst[19], dst[11]); - SORT_CSWAP(dst[16], dst[6]); - SORT_CSWAP(dst[22], dst[13]); - SORT_CSWAP(dst[17], dst[9]); - SORT_CSWAP(dst[18], dst[11]); - SORT_CSWAP(dst[20], dst[12]); - SORT_CSWAP(dst[15], dst[6]); - SORT_CSWAP(dst[16], dst[8]); - SORT_CSWAP(dst[21], dst[13]); - SORT_CSWAP(dst[18], dst[12]); - SORT_CSWAP(dst[14], dst[6]); - SORT_CSWAP(dst[15], dst[7]); - SORT_CSWAP(dst[16], dst[9]); - SORT_CSWAP(dst[20], dst[13]); - SORT_CSWAP(dst[14], dst[7]); - SORT_CSWAP(dst[15], dst[9]); - SORT_CSWAP(dst[19], dst[13]); - SORT_CSWAP(dst[16], dst[12]); - SORT_CSWAP(dst[14], dst[8]); - SORT_CSWAP(dst[18], dst[13]); - SORT_CSWAP(dst[15], dst[11]); - SORT_CSWAP(dst[14], dst[9]); - SORT_CSWAP(dst[17], dst[13]); - SORT_CSWAP(dst[14], dst[10]); - SORT_CSWAP(dst[16], dst[13]); - SORT_CSWAP(dst[14], dst[11]); - SORT_CSWAP(dst[15], dst[13]); - SORT_CSWAP(dst[14], dst[12]); - SORT_CSWAP(dst[14], dst[13]); -} - - -#define BITONIC_SORT_REVERSE_30 SORT_MAKE_STR(bitonic_sort_reverse_30) -static __inline void BITONIC_SORT_REVERSE_30(SORT_TYPE *dst) { - SORT_CSWAP(dst[2], dst[1]); - SORT_CSWAP(dst[4], dst[3]); - SORT_CSWAP(dst[6], dst[5]); - SORT_CSWAP(dst[8], dst[7]); - SORT_CSWAP(dst[10], dst[9]); - SORT_CSWAP(dst[12], dst[11]); - SORT_CSWAP(dst[14], dst[13]); - SORT_CSWAP(dst[17], dst[16]); - SORT_CSWAP(dst[19], dst[18]); - SORT_CSWAP(dst[21], dst[20]); - SORT_CSWAP(dst[23], dst[22]); - SORT_CSWAP(dst[25], dst[24]); - SORT_CSWAP(dst[27], dst[26]); - SORT_CSWAP(dst[29], dst[28]); - SORT_CSWAP(dst[2], dst[0]); - SORT_CSWAP(dst[5], dst[3]); - SORT_CSWAP(dst[6], dst[4]); - SORT_CSWAP(dst[9], dst[7]); - SORT_CSWAP(dst[10], dst[8]); - SORT_CSWAP(dst[13], dst[11]); - SORT_CSWAP(dst[14], dst[12]); - SORT_CSWAP(dst[17], dst[15]); - SORT_CSWAP(dst[20], dst[18]); - SORT_CSWAP(dst[21], dst[19]); - SORT_CSWAP(dst[24], dst[22]); - SORT_CSWAP(dst[25], dst[23]); - SORT_CSWAP(dst[28], dst[26]); - SORT_CSWAP(dst[29], dst[27]); - SORT_CSWAP(dst[1], dst[0]); - SORT_CSWAP(dst[5], dst[4]); - SORT_CSWAP(dst[6], dst[2]); - SORT_CSWAP(dst[9], dst[8]); - SORT_CSWAP(dst[13], dst[12]); - SORT_CSWAP(dst[11], dst[7]); - SORT_CSWAP(dst[14], dst[10]); - SORT_CSWAP(dst[16], dst[15]); - SORT_CSWAP(dst[20], dst[19]); - SORT_CSWAP(dst[21], dst[17]); - SORT_CSWAP(dst[24], dst[23]); - SORT_CSWAP(dst[28], dst[27]); - SORT_CSWAP(dst[26], dst[22]); - SORT_CSWAP(dst[29], dst[25]); - SORT_CSWAP(dst[4], dst[0]); - SORT_CSWAP(dst[5], dst[1]); - SORT_CSWAP(dst[12], dst[8]); - SORT_CSWAP(dst[13], dst[9]); - SORT_CSWAP(dst[14], dst[6]); - SORT_CSWAP(dst[19], dst[15]); - SORT_CSWAP(dst[20], dst[16]); - SORT_CSWAP(dst[27], dst[23]); - SORT_CSWAP(dst[28], dst[24]); - SORT_CSWAP(dst[29], dst[21]); - SORT_CSWAP(dst[3], dst[0]); - SORT_CSWAP(dst[5], dst[2]); - SORT_CSWAP(dst[11], dst[8]); - SORT_CSWAP(dst[13], dst[10]); - SORT_CSWAP(dst[18], dst[15]); - SORT_CSWAP(dst[20], dst[17]); - SORT_CSWAP(dst[26], dst[23]); - SORT_CSWAP(dst[28], dst[25]); - SORT_CSWAP(dst[29], dst[14]); - SORT_CSWAP(dst[3], dst[1]); - SORT_CSWAP(dst[4], dst[2]); - SORT_CSWAP(dst[11], dst[9]); - SORT_CSWAP(dst[12], dst[10]); - SORT_CSWAP(dst[8], dst[0]); - SORT_CSWAP(dst[13], dst[5]); - SORT_CSWAP(dst[18], dst[16]); - SORT_CSWAP(dst[19], dst[17]); - SORT_CSWAP(dst[26], dst[24]); - SORT_CSWAP(dst[27], dst[25]); - SORT_CSWAP(dst[23], dst[15]); - SORT_CSWAP(dst[28], dst[20]); - SORT_CSWAP(dst[3], dst[2]); - SORT_CSWAP(dst[11], dst[10]); - SORT_CSWAP(dst[7], dst[0]); - SORT_CSWAP(dst[9], dst[1]); - SORT_CSWAP(dst[12], dst[4]); - SORT_CSWAP(dst[13], dst[6]); - SORT_CSWAP(dst[18], dst[17]); - SORT_CSWAP(dst[26], dst[25]); - SORT_CSWAP(dst[22], dst[15]); - SORT_CSWAP(dst[24], dst[16]); - SORT_CSWAP(dst[27], dst[19]); - SORT_CSWAP(dst[28], dst[21]); - SORT_CSWAP(dst[10], dst[2]); - SORT_CSWAP(dst[7], dst[1]); - SORT_CSWAP(dst[11], dst[3]); - SORT_CSWAP(dst[12], dst[6]); - SORT_CSWAP(dst[25], dst[17]); - SORT_CSWAP(dst[22], dst[16]); - SORT_CSWAP(dst[26], dst[18]); - SORT_CSWAP(dst[27], dst[21]); - SORT_CSWAP(dst[15], dst[0]); - SORT_CSWAP(dst[28], dst[13]); - SORT_CSWAP(dst[9], dst[2]); - SORT_CSWAP(dst[11], dst[4]); - SORT_CSWAP(dst[24], dst[17]); - SORT_CSWAP(dst[26], dst[19]); - SORT_CSWAP(dst[16], dst[1]); - SORT_CSWAP(dst[27], dst[12]); - SORT_CSWAP(dst[28], dst[14]); - SORT_CSWAP(dst[8], dst[2]); - SORT_CSWAP(dst[11], dst[5]); - SORT_CSWAP(dst[23], dst[17]); - SORT_CSWAP(dst[26], dst[20]); - SORT_CSWAP(dst[15], dst[1]); - SORT_CSWAP(dst[27], dst[14]); - SORT_CSWAP(dst[7], dst[2]); - SORT_CSWAP(dst[11], dst[6]); - SORT_CSWAP(dst[8], dst[4]); - SORT_CSWAP(dst[9], dst[5]); - SORT_CSWAP(dst[22], dst[17]); - SORT_CSWAP(dst[26], dst[21]); - SORT_CSWAP(dst[23], dst[19]); - SORT_CSWAP(dst[24], dst[20]); - SORT_CSWAP(dst[7], dst[3]); - SORT_CSWAP(dst[10], dst[6]); - SORT_CSWAP(dst[22], dst[18]); - SORT_CSWAP(dst[25], dst[21]); - SORT_CSWAP(dst[17], dst[2]); - SORT_CSWAP(dst[26], dst[11]); - SORT_CSWAP(dst[7], dst[4]); - SORT_CSWAP(dst[9], dst[6]); - SORT_CSWAP(dst[22], dst[19]); - SORT_CSWAP(dst[24], dst[21]); - SORT_CSWAP(dst[16], dst[2]); - SORT_CSWAP(dst[18], dst[3]); - SORT_CSWAP(dst[25], dst[10]); - SORT_CSWAP(dst[26], dst[12]); - SORT_CSWAP(dst[7], dst[5]); - SORT_CSWAP(dst[8], dst[6]); - SORT_CSWAP(dst[22], dst[20]); - SORT_CSWAP(dst[23], dst[21]); - SORT_CSWAP(dst[15], dst[2]); - SORT_CSWAP(dst[19], dst[4]); - SORT_CSWAP(dst[24], dst[9]); - SORT_CSWAP(dst[26], dst[13]); - SORT_CSWAP(dst[7], dst[6]); - SORT_CSWAP(dst[22], dst[21]); - SORT_CSWAP(dst[18], dst[4]); - SORT_CSWAP(dst[20], dst[5]); - SORT_CSWAP(dst[15], dst[3]); - SORT_CSWAP(dst[23], dst[8]); - SORT_CSWAP(dst[24], dst[10]); - SORT_CSWAP(dst[26], dst[14]); - SORT_CSWAP(dst[21], dst[6]); - SORT_CSWAP(dst[18], dst[5]); - SORT_CSWAP(dst[16], dst[4]); - SORT_CSWAP(dst[22], dst[7]); - SORT_CSWAP(dst[23], dst[10]); - SORT_CSWAP(dst[24], dst[13]); - SORT_CSWAP(dst[25], dst[14]); - SORT_CSWAP(dst[20], dst[6]); - SORT_CSWAP(dst[15], dst[4]); - SORT_CSWAP(dst[17], dst[5]); - SORT_CSWAP(dst[22], dst[8]); - SORT_CSWAP(dst[23], dst[12]); - SORT_CSWAP(dst[24], dst[14]); - SORT_CSWAP(dst[19], dst[6]); - SORT_CSWAP(dst[15], dst[5]); - SORT_CSWAP(dst[22], dst[9]); - SORT_CSWAP(dst[23], dst[14]); - SORT_CSWAP(dst[18], dst[6]); - SORT_CSWAP(dst[22], dst[10]); - SORT_CSWAP(dst[17], dst[6]); - SORT_CSWAP(dst[22], dst[11]); - SORT_CSWAP(dst[18], dst[10]); - SORT_CSWAP(dst[16], dst[6]); - SORT_CSWAP(dst[22], dst[12]); - SORT_CSWAP(dst[17], dst[9]); - SORT_CSWAP(dst[19], dst[11]); - SORT_CSWAP(dst[15], dst[6]); - SORT_CSWAP(dst[22], dst[13]); - SORT_CSWAP(dst[16], dst[8]); - SORT_CSWAP(dst[17], dst[10]); - SORT_CSWAP(dst[20], dst[12]); - SORT_CSWAP(dst[22], dst[14]); - SORT_CSWAP(dst[15], dst[7]); - SORT_CSWAP(dst[16], dst[10]); - SORT_CSWAP(dst[19], dst[12]); - SORT_CSWAP(dst[21], dst[13]); - SORT_CSWAP(dst[15], dst[8]); - SORT_CSWAP(dst[21], dst[14]); - SORT_CSWAP(dst[19], dst[13]); - SORT_CSWAP(dst[16], dst[12]); - SORT_CSWAP(dst[15], dst[9]); - SORT_CSWAP(dst[20], dst[14]); - SORT_CSWAP(dst[17], dst[13]); - SORT_CSWAP(dst[15], dst[10]); - SORT_CSWAP(dst[19], dst[14]); - SORT_CSWAP(dst[15], dst[11]); - SORT_CSWAP(dst[18], dst[14]); - SORT_CSWAP(dst[15], dst[12]); - SORT_CSWAP(dst[17], dst[14]); - SORT_CSWAP(dst[15], dst[13]); - SORT_CSWAP(dst[16], dst[14]); - SORT_CSWAP(dst[15], dst[14]); -} - - -#define BITONIC_SORT_REVERSE_31 SORT_MAKE_STR(bitonic_sort_reverse_31) -static __inline void BITONIC_SORT_REVERSE_31(SORT_TYPE *dst) { - SORT_CSWAP(dst[2], dst[1]); - SORT_CSWAP(dst[4], dst[3]); - SORT_CSWAP(dst[6], dst[5]); - SORT_CSWAP(dst[8], dst[7]); - SORT_CSWAP(dst[10], dst[9]); - SORT_CSWAP(dst[12], dst[11]); - SORT_CSWAP(dst[14], dst[13]); - SORT_CSWAP(dst[16], dst[15]); - SORT_CSWAP(dst[18], dst[17]); - SORT_CSWAP(dst[20], dst[19]); - SORT_CSWAP(dst[22], dst[21]); - SORT_CSWAP(dst[24], dst[23]); - SORT_CSWAP(dst[26], dst[25]); - SORT_CSWAP(dst[28], dst[27]); - SORT_CSWAP(dst[30], dst[29]); - SORT_CSWAP(dst[2], dst[0]); - SORT_CSWAP(dst[5], dst[3]); - SORT_CSWAP(dst[6], dst[4]); - SORT_CSWAP(dst[9], dst[7]); - SORT_CSWAP(dst[10], dst[8]); - SORT_CSWAP(dst[13], dst[11]); - SORT_CSWAP(dst[14], dst[12]); - SORT_CSWAP(dst[17], dst[15]); - SORT_CSWAP(dst[18], dst[16]); - SORT_CSWAP(dst[21], dst[19]); - SORT_CSWAP(dst[22], dst[20]); - SORT_CSWAP(dst[25], dst[23]); - SORT_CSWAP(dst[26], dst[24]); - SORT_CSWAP(dst[29], dst[27]); - SORT_CSWAP(dst[30], dst[28]); - SORT_CSWAP(dst[1], dst[0]); - SORT_CSWAP(dst[5], dst[4]); - SORT_CSWAP(dst[6], dst[2]); - SORT_CSWAP(dst[9], dst[8]); - SORT_CSWAP(dst[13], dst[12]); - SORT_CSWAP(dst[11], dst[7]); - SORT_CSWAP(dst[14], dst[10]); - SORT_CSWAP(dst[17], dst[16]); - SORT_CSWAP(dst[21], dst[20]); - SORT_CSWAP(dst[19], dst[15]); - SORT_CSWAP(dst[22], dst[18]); - SORT_CSWAP(dst[25], dst[24]); - SORT_CSWAP(dst[29], dst[28]); - SORT_CSWAP(dst[27], dst[23]); - SORT_CSWAP(dst[30], dst[26]); - SORT_CSWAP(dst[4], dst[0]); - SORT_CSWAP(dst[5], dst[1]); - SORT_CSWAP(dst[12], dst[8]); - SORT_CSWAP(dst[13], dst[9]); - SORT_CSWAP(dst[14], dst[6]); - SORT_CSWAP(dst[20], dst[16]); - SORT_CSWAP(dst[21], dst[17]); - SORT_CSWAP(dst[28], dst[24]); - SORT_CSWAP(dst[29], dst[25]); - SORT_CSWAP(dst[23], dst[15]); - SORT_CSWAP(dst[30], dst[22]); - SORT_CSWAP(dst[3], dst[0]); - SORT_CSWAP(dst[5], dst[2]); - SORT_CSWAP(dst[11], dst[8]); - SORT_CSWAP(dst[13], dst[10]); - SORT_CSWAP(dst[19], dst[16]); - SORT_CSWAP(dst[21], dst[18]); - SORT_CSWAP(dst[27], dst[24]); - SORT_CSWAP(dst[29], dst[26]); - SORT_CSWAP(dst[30], dst[14]); - SORT_CSWAP(dst[3], dst[1]); - SORT_CSWAP(dst[4], dst[2]); - SORT_CSWAP(dst[11], dst[9]); - SORT_CSWAP(dst[12], dst[10]); - SORT_CSWAP(dst[8], dst[0]); - SORT_CSWAP(dst[13], dst[5]); - SORT_CSWAP(dst[19], dst[17]); - SORT_CSWAP(dst[20], dst[18]); - SORT_CSWAP(dst[27], dst[25]); - SORT_CSWAP(dst[28], dst[26]); - SORT_CSWAP(dst[24], dst[16]); - SORT_CSWAP(dst[29], dst[21]); - SORT_CSWAP(dst[3], dst[2]); - SORT_CSWAP(dst[11], dst[10]); - SORT_CSWAP(dst[7], dst[0]); - SORT_CSWAP(dst[9], dst[1]); - SORT_CSWAP(dst[12], dst[4]); - SORT_CSWAP(dst[13], dst[6]); - SORT_CSWAP(dst[19], dst[18]); - SORT_CSWAP(dst[27], dst[26]); - SORT_CSWAP(dst[23], dst[16]); - SORT_CSWAP(dst[25], dst[17]); - SORT_CSWAP(dst[28], dst[20]); - SORT_CSWAP(dst[29], dst[22]); - SORT_CSWAP(dst[10], dst[2]); - SORT_CSWAP(dst[7], dst[1]); - SORT_CSWAP(dst[11], dst[3]); - SORT_CSWAP(dst[12], dst[6]); - SORT_CSWAP(dst[26], dst[18]); - SORT_CSWAP(dst[23], dst[17]); - SORT_CSWAP(dst[27], dst[19]); - SORT_CSWAP(dst[28], dst[22]); - SORT_CSWAP(dst[16], dst[0]); - SORT_CSWAP(dst[29], dst[13]); - SORT_CSWAP(dst[9], dst[2]); - SORT_CSWAP(dst[11], dst[4]); - SORT_CSWAP(dst[25], dst[18]); - SORT_CSWAP(dst[27], dst[20]); - SORT_CSWAP(dst[15], dst[0]); - SORT_CSWAP(dst[17], dst[1]); - SORT_CSWAP(dst[28], dst[12]); - SORT_CSWAP(dst[29], dst[14]); - SORT_CSWAP(dst[8], dst[2]); - SORT_CSWAP(dst[11], dst[5]); - SORT_CSWAP(dst[24], dst[18]); - SORT_CSWAP(dst[27], dst[21]); - SORT_CSWAP(dst[15], dst[1]); - SORT_CSWAP(dst[28], dst[14]); - SORT_CSWAP(dst[7], dst[2]); - SORT_CSWAP(dst[11], dst[6]); - SORT_CSWAP(dst[8], dst[4]); - SORT_CSWAP(dst[9], dst[5]); - SORT_CSWAP(dst[23], dst[18]); - SORT_CSWAP(dst[27], dst[22]); - SORT_CSWAP(dst[24], dst[20]); - SORT_CSWAP(dst[25], dst[21]); - SORT_CSWAP(dst[7], dst[3]); - SORT_CSWAP(dst[10], dst[6]); - SORT_CSWAP(dst[23], dst[19]); - SORT_CSWAP(dst[26], dst[22]); - SORT_CSWAP(dst[18], dst[2]); - SORT_CSWAP(dst[27], dst[11]); - SORT_CSWAP(dst[7], dst[4]); - SORT_CSWAP(dst[9], dst[6]); - SORT_CSWAP(dst[23], dst[20]); - SORT_CSWAP(dst[25], dst[22]); - SORT_CSWAP(dst[17], dst[2]); - SORT_CSWAP(dst[19], dst[3]); - SORT_CSWAP(dst[26], dst[10]); - SORT_CSWAP(dst[27], dst[12]); - SORT_CSWAP(dst[7], dst[5]); - SORT_CSWAP(dst[8], dst[6]); - SORT_CSWAP(dst[23], dst[21]); - SORT_CSWAP(dst[24], dst[22]); - SORT_CSWAP(dst[16], dst[2]); - SORT_CSWAP(dst[20], dst[4]); - SORT_CSWAP(dst[25], dst[9]); - SORT_CSWAP(dst[27], dst[13]); - SORT_CSWAP(dst[7], dst[6]); - SORT_CSWAP(dst[23], dst[22]); - SORT_CSWAP(dst[15], dst[2]); - SORT_CSWAP(dst[19], dst[4]); - SORT_CSWAP(dst[21], dst[5]); - SORT_CSWAP(dst[24], dst[8]); - SORT_CSWAP(dst[25], dst[10]); - SORT_CSWAP(dst[27], dst[14]); - SORT_CSWAP(dst[22], dst[6]); - SORT_CSWAP(dst[19], dst[5]); - SORT_CSWAP(dst[15], dst[3]); - SORT_CSWAP(dst[16], dst[4]); - SORT_CSWAP(dst[23], dst[7]); - SORT_CSWAP(dst[24], dst[10]); - SORT_CSWAP(dst[25], dst[13]); - SORT_CSWAP(dst[26], dst[14]); - SORT_CSWAP(dst[21], dst[6]); - SORT_CSWAP(dst[15], dst[4]); - SORT_CSWAP(dst[17], dst[5]); - SORT_CSWAP(dst[23], dst[8]); - SORT_CSWAP(dst[24], dst[12]); - SORT_CSWAP(dst[25], dst[14]); - SORT_CSWAP(dst[20], dst[6]); - SORT_CSWAP(dst[15], dst[5]); - SORT_CSWAP(dst[23], dst[9]); - SORT_CSWAP(dst[24], dst[14]); - SORT_CSWAP(dst[19], dst[6]); - SORT_CSWAP(dst[23], dst[10]); - SORT_CSWAP(dst[18], dst[6]); - SORT_CSWAP(dst[23], dst[11]); - SORT_CSWAP(dst[17], dst[6]); - SORT_CSWAP(dst[23], dst[12]); - SORT_CSWAP(dst[18], dst[10]); - SORT_CSWAP(dst[19], dst[11]); - SORT_CSWAP(dst[16], dst[6]); - SORT_CSWAP(dst[23], dst[13]); - SORT_CSWAP(dst[17], dst[9]); - SORT_CSWAP(dst[20], dst[12]); - SORT_CSWAP(dst[15], dst[6]); - SORT_CSWAP(dst[23], dst[14]); - SORT_CSWAP(dst[16], dst[8]); - SORT_CSWAP(dst[17], dst[10]); - SORT_CSWAP(dst[19], dst[12]); - SORT_CSWAP(dst[21], dst[13]); - SORT_CSWAP(dst[15], dst[7]); - SORT_CSWAP(dst[16], dst[10]); - SORT_CSWAP(dst[22], dst[14]); - SORT_CSWAP(dst[19], dst[13]); - SORT_CSWAP(dst[15], dst[8]); - SORT_CSWAP(dst[21], dst[14]); - SORT_CSWAP(dst[16], dst[12]); - SORT_CSWAP(dst[17], dst[13]); - SORT_CSWAP(dst[15], dst[9]); - SORT_CSWAP(dst[20], dst[14]); - SORT_CSWAP(dst[15], dst[10]); - SORT_CSWAP(dst[19], dst[14]); - SORT_CSWAP(dst[15], dst[11]); - SORT_CSWAP(dst[18], dst[14]); - SORT_CSWAP(dst[15], dst[12]); - SORT_CSWAP(dst[17], dst[14]); - SORT_CSWAP(dst[15], dst[13]); - SORT_CSWAP(dst[16], dst[14]); - SORT_CSWAP(dst[15], dst[14]); -} - - -#define BITONIC_SORT_REVERSE_32 SORT_MAKE_STR(bitonic_sort_reverse_32) -static __inline void BITONIC_SORT_REVERSE_32(SORT_TYPE *dst) { - SORT_CSWAP(dst[1], dst[0]); - SORT_CSWAP(dst[3], dst[2]); - SORT_CSWAP(dst[5], dst[4]); - SORT_CSWAP(dst[7], dst[6]); - SORT_CSWAP(dst[9], dst[8]); - SORT_CSWAP(dst[11], dst[10]); - SORT_CSWAP(dst[13], dst[12]); - SORT_CSWAP(dst[15], dst[14]); - SORT_CSWAP(dst[17], dst[16]); - SORT_CSWAP(dst[19], dst[18]); - SORT_CSWAP(dst[21], dst[20]); - SORT_CSWAP(dst[23], dst[22]); - SORT_CSWAP(dst[25], dst[24]); - SORT_CSWAP(dst[27], dst[26]); - SORT_CSWAP(dst[29], dst[28]); - SORT_CSWAP(dst[31], dst[30]); - SORT_CSWAP(dst[2], dst[0]); - SORT_CSWAP(dst[3], dst[1]); - SORT_CSWAP(dst[6], dst[4]); - SORT_CSWAP(dst[7], dst[5]); - SORT_CSWAP(dst[10], dst[8]); - SORT_CSWAP(dst[11], dst[9]); - SORT_CSWAP(dst[14], dst[12]); - SORT_CSWAP(dst[15], dst[13]); - SORT_CSWAP(dst[18], dst[16]); - SORT_CSWAP(dst[19], dst[17]); - SORT_CSWAP(dst[22], dst[20]); - SORT_CSWAP(dst[23], dst[21]); - SORT_CSWAP(dst[26], dst[24]); - SORT_CSWAP(dst[27], dst[25]); - SORT_CSWAP(dst[30], dst[28]); - SORT_CSWAP(dst[31], dst[29]); - SORT_CSWAP(dst[2], dst[1]); - SORT_CSWAP(dst[6], dst[5]); - SORT_CSWAP(dst[4], dst[0]); - SORT_CSWAP(dst[7], dst[3]); - SORT_CSWAP(dst[10], dst[9]); - SORT_CSWAP(dst[14], dst[13]); - SORT_CSWAP(dst[12], dst[8]); - SORT_CSWAP(dst[15], dst[11]); - SORT_CSWAP(dst[18], dst[17]); - SORT_CSWAP(dst[22], dst[21]); - SORT_CSWAP(dst[20], dst[16]); - SORT_CSWAP(dst[23], dst[19]); - SORT_CSWAP(dst[26], dst[25]); - SORT_CSWAP(dst[30], dst[29]); - SORT_CSWAP(dst[28], dst[24]); - SORT_CSWAP(dst[31], dst[27]); - SORT_CSWAP(dst[5], dst[1]); - SORT_CSWAP(dst[6], dst[2]); - SORT_CSWAP(dst[13], dst[9]); - SORT_CSWAP(dst[14], dst[10]); - SORT_CSWAP(dst[8], dst[0]); - SORT_CSWAP(dst[15], dst[7]); - SORT_CSWAP(dst[21], dst[17]); - SORT_CSWAP(dst[22], dst[18]); - SORT_CSWAP(dst[29], dst[25]); - SORT_CSWAP(dst[30], dst[26]); - SORT_CSWAP(dst[24], dst[16]); - SORT_CSWAP(dst[31], dst[23]); - SORT_CSWAP(dst[4], dst[1]); - SORT_CSWAP(dst[6], dst[3]); - SORT_CSWAP(dst[12], dst[9]); - SORT_CSWAP(dst[14], dst[11]); - SORT_CSWAP(dst[20], dst[17]); - SORT_CSWAP(dst[22], dst[19]); - SORT_CSWAP(dst[28], dst[25]); - SORT_CSWAP(dst[30], dst[27]); - SORT_CSWAP(dst[16], dst[0]); - SORT_CSWAP(dst[31], dst[15]); - SORT_CSWAP(dst[4], dst[2]); - SORT_CSWAP(dst[5], dst[3]); - SORT_CSWAP(dst[12], dst[10]); - SORT_CSWAP(dst[13], dst[11]); - SORT_CSWAP(dst[9], dst[1]); - SORT_CSWAP(dst[14], dst[6]); - SORT_CSWAP(dst[20], dst[18]); - SORT_CSWAP(dst[21], dst[19]); - SORT_CSWAP(dst[28], dst[26]); - SORT_CSWAP(dst[29], dst[27]); - SORT_CSWAP(dst[25], dst[17]); - SORT_CSWAP(dst[30], dst[22]); - SORT_CSWAP(dst[4], dst[3]); - SORT_CSWAP(dst[12], dst[11]); - SORT_CSWAP(dst[8], dst[1]); - SORT_CSWAP(dst[10], dst[2]); - SORT_CSWAP(dst[13], dst[5]); - SORT_CSWAP(dst[14], dst[7]); - SORT_CSWAP(dst[20], dst[19]); - SORT_CSWAP(dst[28], dst[27]); - SORT_CSWAP(dst[24], dst[17]); - SORT_CSWAP(dst[26], dst[18]); - SORT_CSWAP(dst[29], dst[21]); - SORT_CSWAP(dst[30], dst[23]); - SORT_CSWAP(dst[11], dst[3]); - SORT_CSWAP(dst[8], dst[2]); - SORT_CSWAP(dst[12], dst[4]); - SORT_CSWAP(dst[13], dst[7]); - SORT_CSWAP(dst[27], dst[19]); - SORT_CSWAP(dst[24], dst[18]); - SORT_CSWAP(dst[28], dst[20]); - SORT_CSWAP(dst[29], dst[23]); - SORT_CSWAP(dst[17], dst[1]); - SORT_CSWAP(dst[30], dst[14]); - SORT_CSWAP(dst[10], dst[3]); - SORT_CSWAP(dst[12], dst[5]); - SORT_CSWAP(dst[26], dst[19]); - SORT_CSWAP(dst[28], dst[21]); - SORT_CSWAP(dst[16], dst[1]); - SORT_CSWAP(dst[18], dst[2]); - SORT_CSWAP(dst[29], dst[13]); - SORT_CSWAP(dst[30], dst[15]); - SORT_CSWAP(dst[9], dst[3]); - SORT_CSWAP(dst[12], dst[6]); - SORT_CSWAP(dst[25], dst[19]); - SORT_CSWAP(dst[28], dst[22]); - SORT_CSWAP(dst[16], dst[2]); - SORT_CSWAP(dst[29], dst[15]); - SORT_CSWAP(dst[8], dst[3]); - SORT_CSWAP(dst[12], dst[7]); - SORT_CSWAP(dst[9], dst[5]); - SORT_CSWAP(dst[10], dst[6]); - SORT_CSWAP(dst[24], dst[19]); - SORT_CSWAP(dst[28], dst[23]); - SORT_CSWAP(dst[25], dst[21]); - SORT_CSWAP(dst[26], dst[22]); - SORT_CSWAP(dst[8], dst[4]); - SORT_CSWAP(dst[11], dst[7]); - SORT_CSWAP(dst[24], dst[20]); - SORT_CSWAP(dst[27], dst[23]); - SORT_CSWAP(dst[19], dst[3]); - SORT_CSWAP(dst[28], dst[12]); - SORT_CSWAP(dst[8], dst[5]); - SORT_CSWAP(dst[10], dst[7]); - SORT_CSWAP(dst[24], dst[21]); - SORT_CSWAP(dst[26], dst[23]); - SORT_CSWAP(dst[18], dst[3]); - SORT_CSWAP(dst[20], dst[4]); - SORT_CSWAP(dst[27], dst[11]); - SORT_CSWAP(dst[28], dst[13]); - SORT_CSWAP(dst[8], dst[6]); - SORT_CSWAP(dst[9], dst[7]); - SORT_CSWAP(dst[24], dst[22]); - SORT_CSWAP(dst[25], dst[23]); - SORT_CSWAP(dst[17], dst[3]); - SORT_CSWAP(dst[21], dst[5]); - SORT_CSWAP(dst[26], dst[10]); - SORT_CSWAP(dst[28], dst[14]); - SORT_CSWAP(dst[8], dst[7]); - SORT_CSWAP(dst[24], dst[23]); - SORT_CSWAP(dst[16], dst[3]); - SORT_CSWAP(dst[20], dst[5]); - SORT_CSWAP(dst[22], dst[6]); - SORT_CSWAP(dst[25], dst[9]); - SORT_CSWAP(dst[26], dst[11]); - SORT_CSWAP(dst[28], dst[15]); - SORT_CSWAP(dst[23], dst[7]); - SORT_CSWAP(dst[20], dst[6]); - SORT_CSWAP(dst[16], dst[4]); - SORT_CSWAP(dst[17], dst[5]); - SORT_CSWAP(dst[24], dst[8]); - SORT_CSWAP(dst[25], dst[11]); - SORT_CSWAP(dst[26], dst[14]); - SORT_CSWAP(dst[27], dst[15]); - SORT_CSWAP(dst[22], dst[7]); - SORT_CSWAP(dst[16], dst[5]); - SORT_CSWAP(dst[18], dst[6]); - SORT_CSWAP(dst[24], dst[9]); - SORT_CSWAP(dst[25], dst[13]); - SORT_CSWAP(dst[26], dst[15]); - SORT_CSWAP(dst[21], dst[7]); - SORT_CSWAP(dst[16], dst[6]); - SORT_CSWAP(dst[24], dst[10]); - SORT_CSWAP(dst[25], dst[15]); - SORT_CSWAP(dst[20], dst[7]); - SORT_CSWAP(dst[24], dst[11]); - SORT_CSWAP(dst[19], dst[7]); - SORT_CSWAP(dst[24], dst[12]); - SORT_CSWAP(dst[18], dst[7]); - SORT_CSWAP(dst[24], dst[13]); - SORT_CSWAP(dst[19], dst[11]); - SORT_CSWAP(dst[20], dst[12]); - SORT_CSWAP(dst[17], dst[7]); - SORT_CSWAP(dst[24], dst[14]); - SORT_CSWAP(dst[18], dst[10]); - SORT_CSWAP(dst[21], dst[13]); - SORT_CSWAP(dst[16], dst[7]); - SORT_CSWAP(dst[24], dst[15]); - SORT_CSWAP(dst[17], dst[9]); - SORT_CSWAP(dst[18], dst[11]); - SORT_CSWAP(dst[20], dst[13]); - SORT_CSWAP(dst[22], dst[14]); - SORT_CSWAP(dst[16], dst[8]); - SORT_CSWAP(dst[17], dst[11]); - SORT_CSWAP(dst[23], dst[15]); - SORT_CSWAP(dst[20], dst[14]); - SORT_CSWAP(dst[16], dst[9]); - SORT_CSWAP(dst[22], dst[15]); - SORT_CSWAP(dst[17], dst[13]); - SORT_CSWAP(dst[18], dst[14]); - SORT_CSWAP(dst[16], dst[10]); - SORT_CSWAP(dst[21], dst[15]); - SORT_CSWAP(dst[16], dst[11]); - SORT_CSWAP(dst[20], dst[15]); - SORT_CSWAP(dst[16], dst[12]); - SORT_CSWAP(dst[19], dst[15]); - SORT_CSWAP(dst[16], dst[13]); - SORT_CSWAP(dst[18], dst[15]); - SORT_CSWAP(dst[16], dst[14]); - SORT_CSWAP(dst[17], dst[15]); - SORT_CSWAP(dst[16], dst[15]); -} - -#define BITONIC_SORT SORT_MAKE_STR(bitonic_sort) -void BITONIC_SORT(SORT_TYPE *dst, const size_t size); -#define BITONIC_SORT_REVERSE SORT_MAKE_STR(bitonic_sort_reverse) -void BITONIC_SORT_REVERSE(SORT_TYPE *dst, const size_t size); - -#define BITONIC_MERGE SORT_MAKE_STR(bitonic_merge) -void BITONIC_MERGE(SORT_TYPE *dst, const size_t size) { - size_t m, i, j; - - if (size <= 1) { - return; - } - - m = 1 << (63 - CLZ(size - 1)); - j = m; - - for (i = 0; i < size - m; ++i, ++j) { - SORT_CSWAP(dst[i], dst[j]); - } - - BITONIC_MERGE(dst, m); - BITONIC_MERGE(dst + m, size - m); -} - -#define BITONIC_MERGE_REVERSE SORT_MAKE_STR(bitonic_merge_reverse) -void BITONIC_MERGE_REVERSE(SORT_TYPE *dst, const size_t size) { - size_t m, i, j; - - if (size <= 1) { - return; - } - - m = 1 << (63 - CLZ(size - 1)); - j = m; - - for (i = 0; i < size - m; ++i, ++j) { - SORT_CSWAP(dst[j], dst[i]); - } - - BITONIC_MERGE_REVERSE(dst, m); - BITONIC_MERGE_REVERSE(dst + m, size - m); -} - - -void BITONIC_SORT(SORT_TYPE *dst, const size_t size) { - switch (size) { - case 0: - case 1: - break; - - case 2: - BITONIC_SORT_2(dst); - break; - - case 3: - BITONIC_SORT_3(dst); - break; - - case 4: - BITONIC_SORT_4(dst); - break; - - case 5: - BITONIC_SORT_5(dst); - break; - - case 6: - BITONIC_SORT_6(dst); - break; - - case 7: - BITONIC_SORT_7(dst); - break; - - case 8: - BITONIC_SORT_8(dst); - break; - - case 9: - BITONIC_SORT_9(dst); - break; - - case 10: - BITONIC_SORT_10(dst); - break; - - case 11: - BITONIC_SORT_11(dst); - break; - - case 12: - BITONIC_SORT_12(dst); - break; - - case 13: - BITONIC_SORT_13(dst); - break; - - case 14: - BITONIC_SORT_14(dst); - break; - - case 15: - BITONIC_SORT_15(dst); - break; - - case 16: - BITONIC_SORT_16(dst); - break; - - case 17: - BITONIC_SORT_17(dst); - break; - - case 18: - BITONIC_SORT_18(dst); - break; - - case 19: - BITONIC_SORT_19(dst); - break; - - case 20: - BITONIC_SORT_20(dst); - break; - - case 21: - BITONIC_SORT_21(dst); - break; - - case 22: - BITONIC_SORT_22(dst); - break; - - case 23: - BITONIC_SORT_23(dst); - break; - - case 24: - BITONIC_SORT_24(dst); - break; - - case 25: - BITONIC_SORT_25(dst); - break; - - case 26: - BITONIC_SORT_26(dst); - break; - - case 27: - BITONIC_SORT_27(dst); - break; - - case 28: - BITONIC_SORT_28(dst); - break; - - case 29: - BITONIC_SORT_29(dst); - break; - - case 30: - BITONIC_SORT_30(dst); - break; - - case 31: - BITONIC_SORT_31(dst); - break; - - case 32: - BITONIC_SORT_32(dst); - break; - - default: - /*printf("Bitonic sort size = %ld", size);*/ - BITONIC_SORT_REVERSE(dst, (size >> 1)); - BITONIC_SORT(dst + (size >> 1), size - (size >> 1)); - BITONIC_MERGE(dst, size); - } -} - -void BITONIC_SORT_REVERSE(SORT_TYPE *dst, const size_t size) { - switch (size) { - case 0: - case 1: - break; - - case 2: - BITONIC_SORT_REVERSE_2(dst); - break; - - case 3: - BITONIC_SORT_REVERSE_3(dst); - break; - - case 4: - BITONIC_SORT_REVERSE_4(dst); - break; - - case 5: - BITONIC_SORT_REVERSE_5(dst); - break; - - case 6: - BITONIC_SORT_REVERSE_6(dst); - break; - - case 7: - BITONIC_SORT_REVERSE_7(dst); - break; - - case 8: - BITONIC_SORT_REVERSE_8(dst); - break; - - case 9: - BITONIC_SORT_REVERSE_9(dst); - break; - - case 10: - BITONIC_SORT_REVERSE_10(dst); - break; - - case 11: - BITONIC_SORT_REVERSE_11(dst); - break; - - case 12: - BITONIC_SORT_REVERSE_12(dst); - break; - - case 13: - BITONIC_SORT_REVERSE_13(dst); - break; - - case 14: - BITONIC_SORT_REVERSE_14(dst); - break; - - case 15: - BITONIC_SORT_REVERSE_15(dst); - break; - - case 16: - BITONIC_SORT_REVERSE_16(dst); - break; - - case 17: - BITONIC_SORT_REVERSE_17(dst); - break; - - case 18: - BITONIC_SORT_REVERSE_18(dst); - break; - - case 19: - BITONIC_SORT_REVERSE_19(dst); - break; - - case 20: - BITONIC_SORT_REVERSE_20(dst); - break; - - case 21: - BITONIC_SORT_REVERSE_21(dst); - break; - - case 22: - BITONIC_SORT_REVERSE_22(dst); - break; - - case 23: - BITONIC_SORT_REVERSE_23(dst); - break; - - case 24: - BITONIC_SORT_REVERSE_24(dst); - break; - - case 25: - BITONIC_SORT_REVERSE_25(dst); - break; - - case 26: - BITONIC_SORT_REVERSE_26(dst); - break; - - case 27: - BITONIC_SORT_REVERSE_27(dst); - break; - - case 28: - BITONIC_SORT_REVERSE_28(dst); - break; - - case 29: - BITONIC_SORT_REVERSE_29(dst); - break; - - case 30: - BITONIC_SORT_REVERSE_30(dst); - break; - - case 31: - BITONIC_SORT_REVERSE_31(dst); - break; - - case 32: - BITONIC_SORT_REVERSE_32(dst); - break; - - default: - /*printf("Bitonic sort reverse size = %ld", size);*/ - BITONIC_SORT(dst, (size >> 1)); - BITONIC_SORT_REVERSE(dst + (size >> 1), size - (size >> 1)); - BITONIC_MERGE_REVERSE(dst, size); - } -} diff --git a/generate_bitonic_sort.py b/generate_bitonic_sort.py index cb1d2e4..99fe1ea 100644 --- a/generate_bitonic_sort.py +++ b/generate_bitonic_sort.py @@ -1,6 +1,7 @@ import requests -max_small_sort = 32 +max_small_sort = 16 +small_sort_only = True def generate_small_sort(n, rev=False): s = "http://jgamble.ripco.net/cgi-bin/nw.cgi?inputs=%d&algorithm=best&output=svg" % n @@ -42,6 +43,26 @@ def generate_small_sort(n, rev=False): #endif """ bitonic_sort_str += "\n".join(generate_small_sort(i) for i in range(2,max_small_sort+1)) + +if small_sort_only: + bitonic_sort_case = "\n".join(" case %d:\n BITONIC_SORT_%d(dst);\n break;" % (n, n) for n in range(2, max_small_sort+1)) + bitonic_sort_str += """ +void BITONIC_SORT(SORT_TYPE *dst, const size_t size) { + switch(size) { + case 0: + case 1: + break; +%s + default: + BINARY_INSERTION_SORT(dst, size); + } +} + """ % (bitonic_sort_case) + print(bitonic_sort_str) + exit() + + + bitonic_sort_str += "\n".join(generate_small_sort(i, rev=True) for i in range(2,max_small_sort+1)) bitonic_sort_case = "\n".join(" case %d:\n BITONIC_SORT_%d(dst);\n break;" % (n, n) for n in range(2, max_small_sort+1)) @@ -61,7 +82,7 @@ def generate_small_sort(n, rev=False): if (size <= 1) { return; } - m = 1<<(63 - CLZ(size-1)); + m = 1ULL<<(63 - CLZ(size-1)); j = m; for (i = 0; i < size - m; ++i, ++j) { SORT_CSWAP(dst[i], dst[j]); @@ -76,7 +97,7 @@ def generate_small_sort(n, rev=False): if (size <= 1) { return; } - m = 1<<(63 - CLZ(size-1)); + m = 1ULL<<(63 - CLZ(size-1)); j = m; for (i = 0; i < size - m; ++i, ++j) { SORT_CSWAP(dst[j], dst[i]); diff --git a/sort.h b/sort.h index 1bf93a9..d9c199a 100644 --- a/sort.h +++ b/sort.h @@ -143,6 +143,7 @@ static __inline size_t rbnd(size_t len) { /*#define SMALL_SORT BINARY_INSERTION_SORT*/ #endif +#define BITONIC_SORT SORT_MAKE_STR(bitonic_sort) #define BINARY_INSERTION_FIND SORT_MAKE_STR(binary_insertion_find) #define BINARY_INSERTION_SORT_START SORT_MAKE_STR(binary_insertion_sort_start) #define BINARY_INSERTION_SORT SORT_MAKE_STR(binary_insertion_sort) @@ -218,6 +219,9 @@ static __inline size_t rbnd(size_t len) { #ifndef MIN #define MIN(x,y) (((x) < (y) ? (x) : (y))) #endif +#ifndef SORT_CSWAP +#define SORT_CSWAP(x, y) { if(SORT_CMP((x),(y)) > 0) {SORT_SWAP((x),(y));}} +#endif typedef struct { size_t start; @@ -234,8 +238,563 @@ void MERGE_SORT_IN_PLACE(SORT_TYPE *dst, const size_t size); void SELECTION_SORT(SORT_TYPE *dst, const size_t size); void TIM_SORT(SORT_TYPE *dst, const size_t size); void BUBBLE_SORT(SORT_TYPE *dst, const size_t size); - -#include "bitonic_sort.h" +void BITONIC_SORT(SORT_TYPE *dst, const size_t size); + +/* The full implementation of a bitonic sort is not here. Since we only want to use + sorting networks for small length lists we create optimal sorting networks for + lists of length <= 16 and call out to BINARY_INSERTION_SORT for anything larger + than 16. + Optimal sorting networks for small length lists. + Taken from https://pages.ripco.net/~jgamble/nw.html */ +#define BITONIC_SORT_2 SORT_MAKE_STR(bitonic_sort_2) +static __inline void BITONIC_SORT_2(SORT_TYPE *dst) { + SORT_CSWAP(dst[0], dst[1]); +} + + +#define BITONIC_SORT_3 SORT_MAKE_STR(bitonic_sort_3) +static __inline void BITONIC_SORT_3(SORT_TYPE *dst) { + SORT_CSWAP(dst[1], dst[2]); + SORT_CSWAP(dst[0], dst[2]); + SORT_CSWAP(dst[0], dst[1]); +} + + +#define BITONIC_SORT_4 SORT_MAKE_STR(bitonic_sort_4) +static __inline void BITONIC_SORT_4(SORT_TYPE *dst) { + SORT_CSWAP(dst[0], dst[1]); + SORT_CSWAP(dst[2], dst[3]); + SORT_CSWAP(dst[0], dst[2]); + SORT_CSWAP(dst[1], dst[3]); + SORT_CSWAP(dst[1], dst[2]); +} + + +#define BITONIC_SORT_5 SORT_MAKE_STR(bitonic_sort_5) +static __inline void BITONIC_SORT_5(SORT_TYPE *dst) { + SORT_CSWAP(dst[0], dst[1]); + SORT_CSWAP(dst[3], dst[4]); + SORT_CSWAP(dst[2], dst[4]); + SORT_CSWAP(dst[2], dst[3]); + SORT_CSWAP(dst[1], dst[4]); + SORT_CSWAP(dst[0], dst[3]); + SORT_CSWAP(dst[0], dst[2]); + SORT_CSWAP(dst[1], dst[3]); + SORT_CSWAP(dst[1], dst[2]); +} + + +#define BITONIC_SORT_6 SORT_MAKE_STR(bitonic_sort_6) +static __inline void BITONIC_SORT_6(SORT_TYPE *dst) { + SORT_CSWAP(dst[1], dst[2]); + SORT_CSWAP(dst[4], dst[5]); + SORT_CSWAP(dst[0], dst[2]); + SORT_CSWAP(dst[3], dst[5]); + SORT_CSWAP(dst[0], dst[1]); + SORT_CSWAP(dst[3], dst[4]); + SORT_CSWAP(dst[2], dst[5]); + SORT_CSWAP(dst[0], dst[3]); + SORT_CSWAP(dst[1], dst[4]); + SORT_CSWAP(dst[2], dst[4]); + SORT_CSWAP(dst[1], dst[3]); + SORT_CSWAP(dst[2], dst[3]); +} + + +#define BITONIC_SORT_7 SORT_MAKE_STR(bitonic_sort_7) +static __inline void BITONIC_SORT_7(SORT_TYPE *dst) { + SORT_CSWAP(dst[1], dst[2]); + SORT_CSWAP(dst[3], dst[4]); + SORT_CSWAP(dst[5], dst[6]); + SORT_CSWAP(dst[0], dst[2]); + SORT_CSWAP(dst[3], dst[5]); + SORT_CSWAP(dst[4], dst[6]); + SORT_CSWAP(dst[0], dst[1]); + SORT_CSWAP(dst[4], dst[5]); + SORT_CSWAP(dst[2], dst[6]); + SORT_CSWAP(dst[0], dst[4]); + SORT_CSWAP(dst[1], dst[5]); + SORT_CSWAP(dst[0], dst[3]); + SORT_CSWAP(dst[2], dst[5]); + SORT_CSWAP(dst[1], dst[3]); + SORT_CSWAP(dst[2], dst[4]); + SORT_CSWAP(dst[2], dst[3]); +} + + +#define BITONIC_SORT_8 SORT_MAKE_STR(bitonic_sort_8) +static __inline void BITONIC_SORT_8(SORT_TYPE *dst) { + SORT_CSWAP(dst[0], dst[1]); + SORT_CSWAP(dst[2], dst[3]); + SORT_CSWAP(dst[4], dst[5]); + SORT_CSWAP(dst[6], dst[7]); + SORT_CSWAP(dst[0], dst[2]); + SORT_CSWAP(dst[1], dst[3]); + SORT_CSWAP(dst[4], dst[6]); + SORT_CSWAP(dst[5], dst[7]); + SORT_CSWAP(dst[1], dst[2]); + SORT_CSWAP(dst[5], dst[6]); + SORT_CSWAP(dst[0], dst[4]); + SORT_CSWAP(dst[3], dst[7]); + SORT_CSWAP(dst[1], dst[5]); + SORT_CSWAP(dst[2], dst[6]); + SORT_CSWAP(dst[1], dst[4]); + SORT_CSWAP(dst[3], dst[6]); + SORT_CSWAP(dst[2], dst[4]); + SORT_CSWAP(dst[3], dst[5]); + SORT_CSWAP(dst[3], dst[4]); +} + + +#define BITONIC_SORT_9 SORT_MAKE_STR(bitonic_sort_9) +static __inline void BITONIC_SORT_9(SORT_TYPE *dst) { + SORT_CSWAP(dst[0], dst[1]); + SORT_CSWAP(dst[3], dst[4]); + SORT_CSWAP(dst[6], dst[7]); + SORT_CSWAP(dst[1], dst[2]); + SORT_CSWAP(dst[4], dst[5]); + SORT_CSWAP(dst[7], dst[8]); + SORT_CSWAP(dst[0], dst[1]); + SORT_CSWAP(dst[3], dst[4]); + SORT_CSWAP(dst[6], dst[7]); + SORT_CSWAP(dst[2], dst[5]); + SORT_CSWAP(dst[0], dst[3]); + SORT_CSWAP(dst[1], dst[4]); + SORT_CSWAP(dst[5], dst[8]); + SORT_CSWAP(dst[3], dst[6]); + SORT_CSWAP(dst[4], dst[7]); + SORT_CSWAP(dst[2], dst[5]); + SORT_CSWAP(dst[0], dst[3]); + SORT_CSWAP(dst[1], dst[4]); + SORT_CSWAP(dst[5], dst[7]); + SORT_CSWAP(dst[2], dst[6]); + SORT_CSWAP(dst[1], dst[3]); + SORT_CSWAP(dst[4], dst[6]); + SORT_CSWAP(dst[2], dst[4]); + SORT_CSWAP(dst[5], dst[6]); + SORT_CSWAP(dst[2], dst[3]); +} + + +#define BITONIC_SORT_10 SORT_MAKE_STR(bitonic_sort_10) +static __inline void BITONIC_SORT_10(SORT_TYPE *dst) { + SORT_CSWAP(dst[4], dst[9]); + SORT_CSWAP(dst[3], dst[8]); + SORT_CSWAP(dst[2], dst[7]); + SORT_CSWAP(dst[1], dst[6]); + SORT_CSWAP(dst[0], dst[5]); + SORT_CSWAP(dst[1], dst[4]); + SORT_CSWAP(dst[6], dst[9]); + SORT_CSWAP(dst[0], dst[3]); + SORT_CSWAP(dst[5], dst[8]); + SORT_CSWAP(dst[0], dst[2]); + SORT_CSWAP(dst[3], dst[6]); + SORT_CSWAP(dst[7], dst[9]); + SORT_CSWAP(dst[0], dst[1]); + SORT_CSWAP(dst[2], dst[4]); + SORT_CSWAP(dst[5], dst[7]); + SORT_CSWAP(dst[8], dst[9]); + SORT_CSWAP(dst[1], dst[2]); + SORT_CSWAP(dst[4], dst[6]); + SORT_CSWAP(dst[7], dst[8]); + SORT_CSWAP(dst[3], dst[5]); + SORT_CSWAP(dst[2], dst[5]); + SORT_CSWAP(dst[6], dst[8]); + SORT_CSWAP(dst[1], dst[3]); + SORT_CSWAP(dst[4], dst[7]); + SORT_CSWAP(dst[2], dst[3]); + SORT_CSWAP(dst[6], dst[7]); + SORT_CSWAP(dst[3], dst[4]); + SORT_CSWAP(dst[5], dst[6]); + SORT_CSWAP(dst[4], dst[5]); +} + + +#define BITONIC_SORT_11 SORT_MAKE_STR(bitonic_sort_11) +static __inline void BITONIC_SORT_11(SORT_TYPE *dst) { + SORT_CSWAP(dst[0], dst[1]); + SORT_CSWAP(dst[2], dst[3]); + SORT_CSWAP(dst[4], dst[5]); + SORT_CSWAP(dst[6], dst[7]); + SORT_CSWAP(dst[8], dst[9]); + SORT_CSWAP(dst[1], dst[3]); + SORT_CSWAP(dst[5], dst[7]); + SORT_CSWAP(dst[0], dst[2]); + SORT_CSWAP(dst[4], dst[6]); + SORT_CSWAP(dst[8], dst[10]); + SORT_CSWAP(dst[1], dst[2]); + SORT_CSWAP(dst[5], dst[6]); + SORT_CSWAP(dst[9], dst[10]); + SORT_CSWAP(dst[0], dst[4]); + SORT_CSWAP(dst[3], dst[7]); + SORT_CSWAP(dst[1], dst[5]); + SORT_CSWAP(dst[6], dst[10]); + SORT_CSWAP(dst[4], dst[8]); + SORT_CSWAP(dst[5], dst[9]); + SORT_CSWAP(dst[2], dst[6]); + SORT_CSWAP(dst[0], dst[4]); + SORT_CSWAP(dst[3], dst[8]); + SORT_CSWAP(dst[1], dst[5]); + SORT_CSWAP(dst[6], dst[10]); + SORT_CSWAP(dst[2], dst[3]); + SORT_CSWAP(dst[8], dst[9]); + SORT_CSWAP(dst[1], dst[4]); + SORT_CSWAP(dst[7], dst[10]); + SORT_CSWAP(dst[3], dst[5]); + SORT_CSWAP(dst[6], dst[8]); + SORT_CSWAP(dst[2], dst[4]); + SORT_CSWAP(dst[7], dst[9]); + SORT_CSWAP(dst[5], dst[6]); + SORT_CSWAP(dst[3], dst[4]); + SORT_CSWAP(dst[7], dst[8]); +} + + +#define BITONIC_SORT_12 SORT_MAKE_STR(bitonic_sort_12) +static __inline void BITONIC_SORT_12(SORT_TYPE *dst) { + SORT_CSWAP(dst[0], dst[1]); + SORT_CSWAP(dst[2], dst[3]); + SORT_CSWAP(dst[4], dst[5]); + SORT_CSWAP(dst[6], dst[7]); + SORT_CSWAP(dst[8], dst[9]); + SORT_CSWAP(dst[10], dst[11]); + SORT_CSWAP(dst[1], dst[3]); + SORT_CSWAP(dst[5], dst[7]); + SORT_CSWAP(dst[9], dst[11]); + SORT_CSWAP(dst[0], dst[2]); + SORT_CSWAP(dst[4], dst[6]); + SORT_CSWAP(dst[8], dst[10]); + SORT_CSWAP(dst[1], dst[2]); + SORT_CSWAP(dst[5], dst[6]); + SORT_CSWAP(dst[9], dst[10]); + SORT_CSWAP(dst[0], dst[4]); + SORT_CSWAP(dst[7], dst[11]); + SORT_CSWAP(dst[1], dst[5]); + SORT_CSWAP(dst[6], dst[10]); + SORT_CSWAP(dst[3], dst[7]); + SORT_CSWAP(dst[4], dst[8]); + SORT_CSWAP(dst[5], dst[9]); + SORT_CSWAP(dst[2], dst[6]); + SORT_CSWAP(dst[0], dst[4]); + SORT_CSWAP(dst[7], dst[11]); + SORT_CSWAP(dst[3], dst[8]); + SORT_CSWAP(dst[1], dst[5]); + SORT_CSWAP(dst[6], dst[10]); + SORT_CSWAP(dst[2], dst[3]); + SORT_CSWAP(dst[8], dst[9]); + SORT_CSWAP(dst[1], dst[4]); + SORT_CSWAP(dst[7], dst[10]); + SORT_CSWAP(dst[3], dst[5]); + SORT_CSWAP(dst[6], dst[8]); + SORT_CSWAP(dst[2], dst[4]); + SORT_CSWAP(dst[7], dst[9]); + SORT_CSWAP(dst[5], dst[6]); + SORT_CSWAP(dst[3], dst[4]); + SORT_CSWAP(dst[7], dst[8]); +} + + +#define BITONIC_SORT_13 SORT_MAKE_STR(bitonic_sort_13) +static __inline void BITONIC_SORT_13(SORT_TYPE *dst) { + SORT_CSWAP(dst[1], dst[7]); + SORT_CSWAP(dst[9], dst[11]); + SORT_CSWAP(dst[3], dst[4]); + SORT_CSWAP(dst[5], dst[8]); + SORT_CSWAP(dst[0], dst[12]); + SORT_CSWAP(dst[2], dst[6]); + SORT_CSWAP(dst[0], dst[1]); + SORT_CSWAP(dst[2], dst[3]); + SORT_CSWAP(dst[4], dst[6]); + SORT_CSWAP(dst[8], dst[11]); + SORT_CSWAP(dst[7], dst[12]); + SORT_CSWAP(dst[5], dst[9]); + SORT_CSWAP(dst[0], dst[2]); + SORT_CSWAP(dst[3], dst[7]); + SORT_CSWAP(dst[10], dst[11]); + SORT_CSWAP(dst[1], dst[4]); + SORT_CSWAP(dst[6], dst[12]); + SORT_CSWAP(dst[7], dst[8]); + SORT_CSWAP(dst[11], dst[12]); + SORT_CSWAP(dst[4], dst[9]); + SORT_CSWAP(dst[6], dst[10]); + SORT_CSWAP(dst[3], dst[4]); + SORT_CSWAP(dst[5], dst[6]); + SORT_CSWAP(dst[8], dst[9]); + SORT_CSWAP(dst[10], dst[11]); + SORT_CSWAP(dst[1], dst[7]); + SORT_CSWAP(dst[2], dst[6]); + SORT_CSWAP(dst[9], dst[11]); + SORT_CSWAP(dst[1], dst[3]); + SORT_CSWAP(dst[4], dst[7]); + SORT_CSWAP(dst[8], dst[10]); + SORT_CSWAP(dst[0], dst[5]); + SORT_CSWAP(dst[2], dst[5]); + SORT_CSWAP(dst[6], dst[8]); + SORT_CSWAP(dst[9], dst[10]); + SORT_CSWAP(dst[1], dst[2]); + SORT_CSWAP(dst[3], dst[5]); + SORT_CSWAP(dst[7], dst[8]); + SORT_CSWAP(dst[4], dst[6]); + SORT_CSWAP(dst[2], dst[3]); + SORT_CSWAP(dst[4], dst[5]); + SORT_CSWAP(dst[6], dst[7]); + SORT_CSWAP(dst[8], dst[9]); + SORT_CSWAP(dst[3], dst[4]); + SORT_CSWAP(dst[5], dst[6]); +} + + +#define BITONIC_SORT_14 SORT_MAKE_STR(bitonic_sort_14) +static __inline void BITONIC_SORT_14(SORT_TYPE *dst) { + SORT_CSWAP(dst[0], dst[1]); + SORT_CSWAP(dst[2], dst[3]); + SORT_CSWAP(dst[4], dst[5]); + SORT_CSWAP(dst[6], dst[7]); + SORT_CSWAP(dst[8], dst[9]); + SORT_CSWAP(dst[10], dst[11]); + SORT_CSWAP(dst[12], dst[13]); + SORT_CSWAP(dst[0], dst[2]); + SORT_CSWAP(dst[4], dst[6]); + SORT_CSWAP(dst[8], dst[10]); + SORT_CSWAP(dst[1], dst[3]); + SORT_CSWAP(dst[5], dst[7]); + SORT_CSWAP(dst[9], dst[11]); + SORT_CSWAP(dst[0], dst[4]); + SORT_CSWAP(dst[8], dst[12]); + SORT_CSWAP(dst[1], dst[5]); + SORT_CSWAP(dst[9], dst[13]); + SORT_CSWAP(dst[2], dst[6]); + SORT_CSWAP(dst[3], dst[7]); + SORT_CSWAP(dst[0], dst[8]); + SORT_CSWAP(dst[1], dst[9]); + SORT_CSWAP(dst[2], dst[10]); + SORT_CSWAP(dst[3], dst[11]); + SORT_CSWAP(dst[4], dst[12]); + SORT_CSWAP(dst[5], dst[13]); + SORT_CSWAP(dst[5], dst[10]); + SORT_CSWAP(dst[6], dst[9]); + SORT_CSWAP(dst[3], dst[12]); + SORT_CSWAP(dst[7], dst[11]); + SORT_CSWAP(dst[1], dst[2]); + SORT_CSWAP(dst[4], dst[8]); + SORT_CSWAP(dst[1], dst[4]); + SORT_CSWAP(dst[7], dst[13]); + SORT_CSWAP(dst[2], dst[8]); + SORT_CSWAP(dst[5], dst[6]); + SORT_CSWAP(dst[9], dst[10]); + SORT_CSWAP(dst[2], dst[4]); + SORT_CSWAP(dst[11], dst[13]); + SORT_CSWAP(dst[3], dst[8]); + SORT_CSWAP(dst[7], dst[12]); + SORT_CSWAP(dst[6], dst[8]); + SORT_CSWAP(dst[10], dst[12]); + SORT_CSWAP(dst[3], dst[5]); + SORT_CSWAP(dst[7], dst[9]); + SORT_CSWAP(dst[3], dst[4]); + SORT_CSWAP(dst[5], dst[6]); + SORT_CSWAP(dst[7], dst[8]); + SORT_CSWAP(dst[9], dst[10]); + SORT_CSWAP(dst[11], dst[12]); + SORT_CSWAP(dst[6], dst[7]); + SORT_CSWAP(dst[8], dst[9]); +} + + +#define BITONIC_SORT_15 SORT_MAKE_STR(bitonic_sort_15) +static __inline void BITONIC_SORT_15(SORT_TYPE *dst) { + SORT_CSWAP(dst[0], dst[1]); + SORT_CSWAP(dst[2], dst[3]); + SORT_CSWAP(dst[4], dst[5]); + SORT_CSWAP(dst[6], dst[7]); + SORT_CSWAP(dst[8], dst[9]); + SORT_CSWAP(dst[10], dst[11]); + SORT_CSWAP(dst[12], dst[13]); + SORT_CSWAP(dst[0], dst[2]); + SORT_CSWAP(dst[4], dst[6]); + SORT_CSWAP(dst[8], dst[10]); + SORT_CSWAP(dst[12], dst[14]); + SORT_CSWAP(dst[1], dst[3]); + SORT_CSWAP(dst[5], dst[7]); + SORT_CSWAP(dst[9], dst[11]); + SORT_CSWAP(dst[0], dst[4]); + SORT_CSWAP(dst[8], dst[12]); + SORT_CSWAP(dst[1], dst[5]); + SORT_CSWAP(dst[9], dst[13]); + SORT_CSWAP(dst[2], dst[6]); + SORT_CSWAP(dst[10], dst[14]); + SORT_CSWAP(dst[3], dst[7]); + SORT_CSWAP(dst[0], dst[8]); + SORT_CSWAP(dst[1], dst[9]); + SORT_CSWAP(dst[2], dst[10]); + SORT_CSWAP(dst[3], dst[11]); + SORT_CSWAP(dst[4], dst[12]); + SORT_CSWAP(dst[5], dst[13]); + SORT_CSWAP(dst[6], dst[14]); + SORT_CSWAP(dst[5], dst[10]); + SORT_CSWAP(dst[6], dst[9]); + SORT_CSWAP(dst[3], dst[12]); + SORT_CSWAP(dst[13], dst[14]); + SORT_CSWAP(dst[7], dst[11]); + SORT_CSWAP(dst[1], dst[2]); + SORT_CSWAP(dst[4], dst[8]); + SORT_CSWAP(dst[1], dst[4]); + SORT_CSWAP(dst[7], dst[13]); + SORT_CSWAP(dst[2], dst[8]); + SORT_CSWAP(dst[11], dst[14]); + SORT_CSWAP(dst[5], dst[6]); + SORT_CSWAP(dst[9], dst[10]); + SORT_CSWAP(dst[2], dst[4]); + SORT_CSWAP(dst[11], dst[13]); + SORT_CSWAP(dst[3], dst[8]); + SORT_CSWAP(dst[7], dst[12]); + SORT_CSWAP(dst[6], dst[8]); + SORT_CSWAP(dst[10], dst[12]); + SORT_CSWAP(dst[3], dst[5]); + SORT_CSWAP(dst[7], dst[9]); + SORT_CSWAP(dst[3], dst[4]); + SORT_CSWAP(dst[5], dst[6]); + SORT_CSWAP(dst[7], dst[8]); + SORT_CSWAP(dst[9], dst[10]); + SORT_CSWAP(dst[11], dst[12]); + SORT_CSWAP(dst[6], dst[7]); + SORT_CSWAP(dst[8], dst[9]); +} + + +#define BITONIC_SORT_16 SORT_MAKE_STR(bitonic_sort_16) +static __inline void BITONIC_SORT_16(SORT_TYPE *dst) { + SORT_CSWAP(dst[0], dst[1]); + SORT_CSWAP(dst[2], dst[3]); + SORT_CSWAP(dst[4], dst[5]); + SORT_CSWAP(dst[6], dst[7]); + SORT_CSWAP(dst[8], dst[9]); + SORT_CSWAP(dst[10], dst[11]); + SORT_CSWAP(dst[12], dst[13]); + SORT_CSWAP(dst[14], dst[15]); + SORT_CSWAP(dst[0], dst[2]); + SORT_CSWAP(dst[4], dst[6]); + SORT_CSWAP(dst[8], dst[10]); + SORT_CSWAP(dst[12], dst[14]); + SORT_CSWAP(dst[1], dst[3]); + SORT_CSWAP(dst[5], dst[7]); + SORT_CSWAP(dst[9], dst[11]); + SORT_CSWAP(dst[13], dst[15]); + SORT_CSWAP(dst[0], dst[4]); + SORT_CSWAP(dst[8], dst[12]); + SORT_CSWAP(dst[1], dst[5]); + SORT_CSWAP(dst[9], dst[13]); + SORT_CSWAP(dst[2], dst[6]); + SORT_CSWAP(dst[10], dst[14]); + SORT_CSWAP(dst[3], dst[7]); + SORT_CSWAP(dst[11], dst[15]); + SORT_CSWAP(dst[0], dst[8]); + SORT_CSWAP(dst[1], dst[9]); + SORT_CSWAP(dst[2], dst[10]); + SORT_CSWAP(dst[3], dst[11]); + SORT_CSWAP(dst[4], dst[12]); + SORT_CSWAP(dst[5], dst[13]); + SORT_CSWAP(dst[6], dst[14]); + SORT_CSWAP(dst[7], dst[15]); + SORT_CSWAP(dst[5], dst[10]); + SORT_CSWAP(dst[6], dst[9]); + SORT_CSWAP(dst[3], dst[12]); + SORT_CSWAP(dst[13], dst[14]); + SORT_CSWAP(dst[7], dst[11]); + SORT_CSWAP(dst[1], dst[2]); + SORT_CSWAP(dst[4], dst[8]); + SORT_CSWAP(dst[1], dst[4]); + SORT_CSWAP(dst[7], dst[13]); + SORT_CSWAP(dst[2], dst[8]); + SORT_CSWAP(dst[11], dst[14]); + SORT_CSWAP(dst[5], dst[6]); + SORT_CSWAP(dst[9], dst[10]); + SORT_CSWAP(dst[2], dst[4]); + SORT_CSWAP(dst[11], dst[13]); + SORT_CSWAP(dst[3], dst[8]); + SORT_CSWAP(dst[7], dst[12]); + SORT_CSWAP(dst[6], dst[8]); + SORT_CSWAP(dst[10], dst[12]); + SORT_CSWAP(dst[3], dst[5]); + SORT_CSWAP(dst[7], dst[9]); + SORT_CSWAP(dst[3], dst[4]); + SORT_CSWAP(dst[5], dst[6]); + SORT_CSWAP(dst[7], dst[8]); + SORT_CSWAP(dst[9], dst[10]); + SORT_CSWAP(dst[11], dst[12]); + SORT_CSWAP(dst[6], dst[7]); + SORT_CSWAP(dst[8], dst[9]); +} + +void BITONIC_SORT(SORT_TYPE *dst, const size_t size) { + switch (size) { + case 0: + case 1: + break; + + case 2: + BITONIC_SORT_2(dst); + break; + + case 3: + BITONIC_SORT_3(dst); + break; + + case 4: + BITONIC_SORT_4(dst); + break; + + case 5: + BITONIC_SORT_5(dst); + break; + + case 6: + BITONIC_SORT_6(dst); + break; + + case 7: + BITONIC_SORT_7(dst); + break; + + case 8: + BITONIC_SORT_8(dst); + break; + + case 9: + BITONIC_SORT_9(dst); + break; + + case 10: + BITONIC_SORT_10(dst); + break; + + case 11: + BITONIC_SORT_11(dst); + break; + + case 12: + BITONIC_SORT_12(dst); + break; + + case 13: + BITONIC_SORT_13(dst); + break; + + case 14: + BITONIC_SORT_14(dst); + break; + + case 15: + BITONIC_SORT_15(dst); + break; + + case 16: + BITONIC_SORT_16(dst); + break; + + default: + BINARY_INSERTION_SORT(dst, size); + } +} /* Shell sort implementation based on Wikipedia article From f8cbd55b8f31d07da5ca4618a2deaddf3d7fb7ef Mon Sep 17 00:00:00 2001 From: DrMarkS Date: Fri, 16 Aug 2019 12:08:03 +0100 Subject: [PATCH 3/3] Removed references to bitonic_sort.h --- Makefile | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index a4d2cb5..8735a36 100644 --- a/Makefile +++ b/Makefile @@ -15,16 +15,16 @@ test: stresstest benchmark clean: rm -f demo multidemo stresstest benchmark -demo: demo.c sort.h bitonic_sort.h +demo: demo.c sort.h $(CC) $(CFLAGS) demo.c -o demo -multidemo: multidemo.c sort.h bitonic_sort.h +multidemo: multidemo.c sort.h $(CC) $(CFLAGS) multidemo.c -o multidemo -stresstest: stresstest.c sort.h bitonic_sort.h +stresstest: stresstest.c sort.h $(CC) $(CFLAGS) stresstest.c -o stresstest -benchmark: benchmark.c sort.h bitonic_sort.h +benchmark: benchmark.c sort.h $(CC) $(CFLAGS) benchmark.c -o benchmark format: