mdbx: reduce sorting-network to 8.

This commit is contained in:
Леонид Юрьев (Leonid Yuriev) 2022-07-27 21:19:48 +03:00
parent 654b020bc7
commit 8404cc1fd7

View File

@ -2082,686 +2082,10 @@ static int lcklist_detach_locked(MDBX_env *env) {
SORT_CMP_SWAP(TYPE, CMP, begin[5], begin[6]); \
} while (0)
// 25 comparators, 9 parallel operations
// o--^-----^--^-----^-----------------------------------o
// | | | |
// o--v--^--v--|-----|--^-----^-----------^--------------o
// | | | | | |
// o-----v-----|-----|--|-----|--^-----^--|--^-----^--^--o
// | | | | | | | | | |
// o--^-----^--v--^--v--|-----|--|-----|--v--|-----|--v--o
// | | | | | | | | |
// o--v--^--v-----|-----v--^--v--|-----|-----|--^--v-----o
// | | | | | | |
// o-----v--------|--------|-----v--^--v--^--|--|--^-----o
// | | | | | | |
// o--^-----^-----v--------|--------|-----|--v--v--v-----o
// | | | | |
// o--v--^--v--------------v--------|-----v--------------o
// | |
// o-----v--------------------------v--------------------o
//
// [[0,1],[3,4],[6,7]]
// [[1,2],[4,5],[7,8]]
// [[0,1],[3,4],[6,7],[2,5]]
// [[0,3],[1,4],[5,8]]
// [[3,6],[4,7],[2,5]]
// [[0,3],[1,4],[5,7],[2,6]]
// [[1,3],[4,6]]
// [[2,4],[5,6]]
// [[2,3]]
#define SORT_NETWORK_9(TYPE, CMP, begin) \
do { \
SORT_CMP_SWAP(TYPE, CMP, begin[0], begin[1]); \
SORT_CMP_SWAP(TYPE, CMP, begin[3], begin[4]); \
SORT_CMP_SWAP(TYPE, CMP, begin[6], begin[7]); \
SORT_CMP_SWAP(TYPE, CMP, begin[1], begin[2]); \
SORT_CMP_SWAP(TYPE, CMP, begin[4], begin[5]); \
SORT_CMP_SWAP(TYPE, CMP, begin[7], begin[8]); \
SORT_CMP_SWAP(TYPE, CMP, begin[0], begin[1]); \
SORT_CMP_SWAP(TYPE, CMP, begin[3], begin[4]); \
SORT_CMP_SWAP(TYPE, CMP, begin[6], begin[7]); \
SORT_CMP_SWAP(TYPE, CMP, begin[2], begin[5]); \
SORT_CMP_SWAP(TYPE, CMP, begin[0], begin[3]); \
SORT_CMP_SWAP(TYPE, CMP, begin[1], begin[4]); \
SORT_CMP_SWAP(TYPE, CMP, begin[5], begin[8]); \
SORT_CMP_SWAP(TYPE, CMP, begin[3], begin[6]); \
SORT_CMP_SWAP(TYPE, CMP, begin[4], begin[7]); \
SORT_CMP_SWAP(TYPE, CMP, begin[2], begin[5]); \
SORT_CMP_SWAP(TYPE, CMP, begin[0], begin[3]); \
SORT_CMP_SWAP(TYPE, CMP, begin[1], begin[4]); \
SORT_CMP_SWAP(TYPE, CMP, begin[5], begin[7]); \
SORT_CMP_SWAP(TYPE, CMP, begin[2], begin[6]); \
SORT_CMP_SWAP(TYPE, CMP, begin[1], begin[3]); \
SORT_CMP_SWAP(TYPE, CMP, begin[4], begin[6]); \
SORT_CMP_SWAP(TYPE, CMP, begin[2], begin[4]); \
SORT_CMP_SWAP(TYPE, CMP, begin[5], begin[6]); \
SORT_CMP_SWAP(TYPE, CMP, begin[2], begin[3]); \
} while (0)
// 29 comparators, 9 parallel operations
// o--------------^-----^--^--^-----------------------o
// | | | |
// o-----------^--|--^--|--|--v--^--------^-----------o
// | | | | | | |
// o--------^--|--|--|--|--v--^--v-----^--|--^--------o
// | | | | | | | | |
// o-----^--|--|--|--|--v--^--|-----^--|--v--v--^-----o
// | | | | | | | | | |
// o--^--|--|--|--|--v-----|--v--^--|--|--^-----v--^--o
// | | | | | | | | | | |
// o--|--|--|--|--v--^-----|--^--|--v--v--|-----^--v--o
// | | | | | | | | | |
// o--|--|--|--v--^--|-----v--|--v--^-----|--^--v-----o
// | | | | | | | | |
// o--|--|--v-----|--|--^-----v--^--|-----v--v--------o
// | | | | | | |
// o--|--v--------|--v--|--^-----v--v-----------------o
// | | | |
// o--v-----------v-----v--v--------------------------o
//
// [[4,9],[3,8],[2,7],[1,6],[0,5]]
// [[1,4],[6,9],[0,3],[5,8]]
// [[0,2],[3,6],[7,9]]
// [[0,1],[2,4],[5,7],[8,9]]
// [[1,2],[4,6],[7,8],[3,5]]
// [[2,5],[6,8],[1,3],[4,7]]
// [[2,3],[6,7]]
// [[3,4],[5,6]]
// [[4,5]]
#define SORT_NETWORK_10(TYPE, CMP, begin) \
do { \
SORT_CMP_SWAP(TYPE, CMP, begin[4], begin[9]); \
SORT_CMP_SWAP(TYPE, CMP, begin[3], begin[8]); \
SORT_CMP_SWAP(TYPE, CMP, begin[2], begin[7]); \
SORT_CMP_SWAP(TYPE, CMP, begin[1], begin[6]); \
SORT_CMP_SWAP(TYPE, CMP, begin[0], begin[5]); \
SORT_CMP_SWAP(TYPE, CMP, begin[1], begin[4]); \
SORT_CMP_SWAP(TYPE, CMP, begin[6], begin[9]); \
SORT_CMP_SWAP(TYPE, CMP, begin[0], begin[3]); \
SORT_CMP_SWAP(TYPE, CMP, begin[5], begin[8]); \
SORT_CMP_SWAP(TYPE, CMP, begin[0], begin[2]); \
SORT_CMP_SWAP(TYPE, CMP, begin[3], begin[6]); \
SORT_CMP_SWAP(TYPE, CMP, begin[7], begin[9]); \
SORT_CMP_SWAP(TYPE, CMP, begin[0], begin[1]); \
SORT_CMP_SWAP(TYPE, CMP, begin[2], begin[4]); \
SORT_CMP_SWAP(TYPE, CMP, begin[5], begin[7]); \
SORT_CMP_SWAP(TYPE, CMP, begin[8], begin[9]); \
SORT_CMP_SWAP(TYPE, CMP, begin[1], begin[2]); \
SORT_CMP_SWAP(TYPE, CMP, begin[4], begin[6]); \
SORT_CMP_SWAP(TYPE, CMP, begin[7], begin[8]); \
SORT_CMP_SWAP(TYPE, CMP, begin[3], begin[5]); \
SORT_CMP_SWAP(TYPE, CMP, begin[2], begin[5]); \
SORT_CMP_SWAP(TYPE, CMP, begin[6], begin[8]); \
SORT_CMP_SWAP(TYPE, CMP, begin[1], begin[3]); \
SORT_CMP_SWAP(TYPE, CMP, begin[4], begin[7]); \
SORT_CMP_SWAP(TYPE, CMP, begin[2], begin[3]); \
SORT_CMP_SWAP(TYPE, CMP, begin[6], begin[7]); \
SORT_CMP_SWAP(TYPE, CMP, begin[3], begin[4]); \
SORT_CMP_SWAP(TYPE, CMP, begin[5], begin[6]); \
SORT_CMP_SWAP(TYPE, CMP, begin[4], begin[5]); \
} while (0)
// 35 comparators, 9 parallel operations
// o--^-----^-----------------^--------^--------------------o
// | | | |
// o--v--^--|--^--^--------^--|--------|--^-----------------o
// | | | | | | | |
// o--^--|--v--v--|-----^--|--|--------|--|-----^--^--------o
// | | | | | | | | | |
// o--v--v--------|-----|--|--|--^-----|--|--^--v--|--^--^--o
// | | | | | | | | | | |
// o--^-----^-----|-----|--|--v--|--^--v--v--|-----v--|--v--o
// | | | | | | | | |
// o--v--^--|--^--v--^--|--v-----|--|--------|--------v--^--o
// | | | | | | | | |
// o--^--|--v--v--^--|--v--^-----|--|--------|--------^--v--o
// | | | | | | | | |
// o--v--v--------|--|-----|-----v--|--^-----|-----^--|--^--o
// | | | | | | | | |
// o--^--^--------|--|-----|--------v--|-----v--^--|--v--v--o
// | | | | | | | |
// o--v--|--^-----|--v-----|-----------|--------v--v--------o
// | | | | |
// o-----v--v-----v--------v-----------v--------------------o
//
// [[0,1],[2,3],[4,5],[6,7],[8,9]]
// [[1,3],[5,7],[0,2],[4,6],[8,10]]
// [[1,2],[5,6],[9,10],[0,4],[3,7]]
// [[1,5],[6,10],[4,8]]
// [[5,9],[2,6],[0,4],[3,8]]
// [[1,5],[6,10],[2,3],[8,9]]
// [[1,4],[7,10],[3,5],[6,8]]
// [[2,4],[7,9],[5,6]]
// [[3,4],[7,8]]
#define SORT_NETWORK_11(TYPE, CMP, begin) \
do { \
SORT_CMP_SWAP(TYPE, CMP, begin[0], begin[1]); \
SORT_CMP_SWAP(TYPE, CMP, begin[2], begin[3]); \
SORT_CMP_SWAP(TYPE, CMP, begin[4], begin[5]); \
SORT_CMP_SWAP(TYPE, CMP, begin[6], begin[7]); \
SORT_CMP_SWAP(TYPE, CMP, begin[8], begin[9]); \
SORT_CMP_SWAP(TYPE, CMP, begin[1], begin[3]); \
SORT_CMP_SWAP(TYPE, CMP, begin[5], begin[7]); \
SORT_CMP_SWAP(TYPE, CMP, begin[0], begin[2]); \
SORT_CMP_SWAP(TYPE, CMP, begin[4], begin[6]); \
SORT_CMP_SWAP(TYPE, CMP, begin[8], begin[10]); \
SORT_CMP_SWAP(TYPE, CMP, begin[1], begin[2]); \
SORT_CMP_SWAP(TYPE, CMP, begin[5], begin[6]); \
SORT_CMP_SWAP(TYPE, CMP, begin[9], begin[10]); \
SORT_CMP_SWAP(TYPE, CMP, begin[0], begin[4]); \
SORT_CMP_SWAP(TYPE, CMP, begin[3], begin[7]); \
SORT_CMP_SWAP(TYPE, CMP, begin[1], begin[5]); \
SORT_CMP_SWAP(TYPE, CMP, begin[6], begin[10]); \
SORT_CMP_SWAP(TYPE, CMP, begin[4], begin[8]); \
SORT_CMP_SWAP(TYPE, CMP, begin[5], begin[9]); \
SORT_CMP_SWAP(TYPE, CMP, begin[2], begin[6]); \
SORT_CMP_SWAP(TYPE, CMP, begin[0], begin[4]); \
SORT_CMP_SWAP(TYPE, CMP, begin[3], begin[8]); \
SORT_CMP_SWAP(TYPE, CMP, begin[1], begin[5]); \
SORT_CMP_SWAP(TYPE, CMP, begin[6], begin[10]); \
SORT_CMP_SWAP(TYPE, CMP, begin[2], begin[3]); \
SORT_CMP_SWAP(TYPE, CMP, begin[8], begin[9]); \
SORT_CMP_SWAP(TYPE, CMP, begin[1], begin[4]); \
SORT_CMP_SWAP(TYPE, CMP, begin[7], begin[10]); \
SORT_CMP_SWAP(TYPE, CMP, begin[3], begin[5]); \
SORT_CMP_SWAP(TYPE, CMP, begin[6], begin[8]); \
SORT_CMP_SWAP(TYPE, CMP, begin[2], begin[4]); \
SORT_CMP_SWAP(TYPE, CMP, begin[7], begin[9]); \
SORT_CMP_SWAP(TYPE, CMP, begin[5], begin[6]); \
SORT_CMP_SWAP(TYPE, CMP, begin[3], begin[4]); \
SORT_CMP_SWAP(TYPE, CMP, begin[7], begin[8]); \
} while (0)
// 39 comparators, parallel operations
// o--^-----^-----------------^--------^--------------------o
// | | | |
// o--v--^--|--^--^--------^--|--------|--^-----------------o
// | | | | | | | |
// o--^--|--v--v--|-----^--|--|--------|--|-----^--^--------o
// | | | | | | | | | |
// o--v--v--------|-----|--|--|--^-----|--|--^--v--|--^--^--o
// | | | | | | | | | | |
// o--^-----^-----|-----|--|--v--|--^--v--v--|-----v--|--v--o
// | | | | | | | | |
// o--v--^--|--^--v--^--|--v-----|--|--------|--------v--^--o
// | | | | | | | | |
// o--^--|--v--v--^--|--v--^-----|--|--------|--------^--v--o
// | | | | | | | | |
// o--v--v--------|--|-----|--^--v--|--^--^--|-----^--|--^--o
// | | | | | | | | | | |
// o--^-----^-----|--|-----|--|-----v--|--|--v--^--|--v--v--o
// | | | | | | | | | |
// o--v--^--|--^--|--v-----|--|--------|--|-----v--v--------o
// | | | | | | | |
// o--^--|--v--v--v--------v--|--------|--v-----------------o
// | | | |
// o--v--v--------------------v--------v--------------------o
//
// [[0,1],[2,3],[4,5],[6,7],[8,9],[10,11]]
// [[1,3],[5,7],[9,11],[0,2],[4,6],[8,10]]
// [[1,2],[5,6],[9,10],[0,4],[7,11]]
// [[1,5],[6,10],[3,7],[4,8]]
// [[5,9],[2,6],[0,4],[7,11],[3,8]]
// [[1,5],[6,10],[2,3],[8,9]]
// [[1,4],[7,10],[3,5],[6,8]]
// [[2,4],[7,9],[5,6]]
// [[3,4],[7,8]]
#define SORT_NETWORK_12(TYPE, CMP, begin) \
do { \
SORT_CMP_SWAP(TYPE, CMP, begin[0], begin[1]); \
SORT_CMP_SWAP(TYPE, CMP, begin[2], begin[3]); \
SORT_CMP_SWAP(TYPE, CMP, begin[4], begin[5]); \
SORT_CMP_SWAP(TYPE, CMP, begin[6], begin[7]); \
SORT_CMP_SWAP(TYPE, CMP, begin[8], begin[9]); \
SORT_CMP_SWAP(TYPE, CMP, begin[10], begin[11]); \
SORT_CMP_SWAP(TYPE, CMP, begin[1], begin[3]); \
SORT_CMP_SWAP(TYPE, CMP, begin[5], begin[7]); \
SORT_CMP_SWAP(TYPE, CMP, begin[9], begin[11]); \
SORT_CMP_SWAP(TYPE, CMP, begin[0], begin[2]); \
SORT_CMP_SWAP(TYPE, CMP, begin[4], begin[6]); \
SORT_CMP_SWAP(TYPE, CMP, begin[8], begin[10]); \
SORT_CMP_SWAP(TYPE, CMP, begin[1], begin[2]); \
SORT_CMP_SWAP(TYPE, CMP, begin[5], begin[6]); \
SORT_CMP_SWAP(TYPE, CMP, begin[9], begin[10]); \
SORT_CMP_SWAP(TYPE, CMP, begin[0], begin[4]); \
SORT_CMP_SWAP(TYPE, CMP, begin[7], begin[11]); \
SORT_CMP_SWAP(TYPE, CMP, begin[1], begin[5]); \
SORT_CMP_SWAP(TYPE, CMP, begin[6], begin[10]); \
SORT_CMP_SWAP(TYPE, CMP, begin[3], begin[7]); \
SORT_CMP_SWAP(TYPE, CMP, begin[4], begin[8]); \
SORT_CMP_SWAP(TYPE, CMP, begin[5], begin[9]); \
SORT_CMP_SWAP(TYPE, CMP, begin[2], begin[6]); \
SORT_CMP_SWAP(TYPE, CMP, begin[0], begin[4]); \
SORT_CMP_SWAP(TYPE, CMP, begin[7], begin[11]); \
SORT_CMP_SWAP(TYPE, CMP, begin[3], begin[8]); \
SORT_CMP_SWAP(TYPE, CMP, begin[1], begin[5]); \
SORT_CMP_SWAP(TYPE, CMP, begin[6], begin[10]); \
SORT_CMP_SWAP(TYPE, CMP, begin[2], begin[3]); \
SORT_CMP_SWAP(TYPE, CMP, begin[8], begin[9]); \
SORT_CMP_SWAP(TYPE, CMP, begin[1], begin[4]); \
SORT_CMP_SWAP(TYPE, CMP, begin[7], begin[10]); \
SORT_CMP_SWAP(TYPE, CMP, begin[3], begin[5]); \
SORT_CMP_SWAP(TYPE, CMP, begin[6], begin[8]); \
SORT_CMP_SWAP(TYPE, CMP, begin[2], begin[4]); \
SORT_CMP_SWAP(TYPE, CMP, begin[7], begin[9]); \
SORT_CMP_SWAP(TYPE, CMP, begin[5], begin[6]); \
SORT_CMP_SWAP(TYPE, CMP, begin[3], begin[4]); \
SORT_CMP_SWAP(TYPE, CMP, begin[7], begin[8]); \
} while (0)
// 45 comparators, 10 parallel operations
// o--------^--^-----^-----------------------------^-----------------o
// | | | |
// o--^-----|--v-----|-----^--------------^-----^--|-----^-----------o
// | | | | | | | |
// o--|-----|--^--^--v-----|--------------|--^--|--|--^--v--^--------o
// | | | | | | | | | | |
// o--|--^--|--|--v-----^--|--------^-----|--|--v--|--|--^--v-----^--o
// | | | | | | | | | | | | |
// o--|--v--|--|--^-----|--v-----^--v-----|--|--^--|--|--|--^--^--v--o
// | | | | | | | | | | | | | |
// o--|--^--|--|--|--^--|--------|-----^--|--|--|--v--v--v--|--v--^--o
// | | | | | | | | | | | | | |
// o--|--|--|--v--v--|--|--^-----|--^--v--|--v--|--^--------v--^--v--o
// | | | | | | | | | | | |
// o--v--|--|-----^--|--v--|--^--|--|-----v-----v--|--^--------v-----o
// | | | | | | | | | |
// o-----v--|--^--|--|-----|--v--|--|--^-----^-----v--v--^-----------o
// | | | | | | | | | |
// o--^-----|--|--|--v-----|-----v--|--v--^--|--^--------v-----------o
// | | | | | | | | |
// o--|-----|--|--|--^-----|--------v--^--|--v--v--------------------o
// | | | | | | | |
// o--v-----|--v--|--v-----|--^--------v--v--------------------------o
// | | | |
// o--------v-----v--------v--v--------------------------------------o
//
// [[1,7],[9,11],[3,4],[5,8],[0,12],[2,6]]
// [[0,1],[2,3],[4,6],[8,11],[7,12],[5,9]]
// [[0,2],[3,7],[10,11],[1,4],[6,12]]
// [[7,8],[11,12],[4,9],[6,10]]
// [[3,4],[5,6],[8,9],[10,11],[1,7]]
// [[2,6],[9,11],[1,3],[4,7],[8,10],[0,5]]
// [[2,5],[6,8],[9,10]]
// [[1,2],[3,5],[7,8],[4,6]]
// [[2,3],[4,5],[6,7],[8,9]]
// [[3,4],[5,6]]
#define SORT_NETWORK_13(TYPE, CMP, begin) \
do { \
SORT_CMP_SWAP(TYPE, CMP, begin[1], begin[7]); \
SORT_CMP_SWAP(TYPE, CMP, begin[9], begin[11]); \
SORT_CMP_SWAP(TYPE, CMP, begin[3], begin[4]); \
SORT_CMP_SWAP(TYPE, CMP, begin[5], begin[8]); \
SORT_CMP_SWAP(TYPE, CMP, begin[0], begin[12]); \
SORT_CMP_SWAP(TYPE, CMP, begin[2], begin[6]); \
SORT_CMP_SWAP(TYPE, CMP, begin[0], begin[1]); \
SORT_CMP_SWAP(TYPE, CMP, begin[2], begin[3]); \
SORT_CMP_SWAP(TYPE, CMP, begin[4], begin[6]); \
SORT_CMP_SWAP(TYPE, CMP, begin[8], begin[11]); \
SORT_CMP_SWAP(TYPE, CMP, begin[7], begin[12]); \
SORT_CMP_SWAP(TYPE, CMP, begin[5], begin[9]); \
SORT_CMP_SWAP(TYPE, CMP, begin[0], begin[2]); \
SORT_CMP_SWAP(TYPE, CMP, begin[3], begin[7]); \
SORT_CMP_SWAP(TYPE, CMP, begin[10], begin[11]); \
SORT_CMP_SWAP(TYPE, CMP, begin[1], begin[4]); \
SORT_CMP_SWAP(TYPE, CMP, begin[6], begin[12]); \
SORT_CMP_SWAP(TYPE, CMP, begin[7], begin[8]); \
SORT_CMP_SWAP(TYPE, CMP, begin[11], begin[12]); \
SORT_CMP_SWAP(TYPE, CMP, begin[4], begin[9]); \
SORT_CMP_SWAP(TYPE, CMP, begin[6], begin[10]); \
SORT_CMP_SWAP(TYPE, CMP, begin[3], begin[4]); \
SORT_CMP_SWAP(TYPE, CMP, begin[5], begin[6]); \
SORT_CMP_SWAP(TYPE, CMP, begin[8], begin[9]); \
SORT_CMP_SWAP(TYPE, CMP, begin[10], begin[11]); \
SORT_CMP_SWAP(TYPE, CMP, begin[1], begin[7]); \
SORT_CMP_SWAP(TYPE, CMP, begin[2], begin[6]); \
SORT_CMP_SWAP(TYPE, CMP, begin[9], begin[11]); \
SORT_CMP_SWAP(TYPE, CMP, begin[1], begin[3]); \
SORT_CMP_SWAP(TYPE, CMP, begin[4], begin[7]); \
SORT_CMP_SWAP(TYPE, CMP, begin[8], begin[10]); \
SORT_CMP_SWAP(TYPE, CMP, begin[0], begin[5]); \
SORT_CMP_SWAP(TYPE, CMP, begin[2], begin[5]); \
SORT_CMP_SWAP(TYPE, CMP, begin[6], begin[8]); \
SORT_CMP_SWAP(TYPE, CMP, begin[9], begin[10]); \
SORT_CMP_SWAP(TYPE, CMP, begin[1], begin[2]); \
SORT_CMP_SWAP(TYPE, CMP, begin[3], begin[5]); \
SORT_CMP_SWAP(TYPE, CMP, begin[7], begin[8]); \
SORT_CMP_SWAP(TYPE, CMP, begin[4], begin[6]); \
SORT_CMP_SWAP(TYPE, CMP, begin[2], begin[3]); \
SORT_CMP_SWAP(TYPE, CMP, begin[4], begin[5]); \
SORT_CMP_SWAP(TYPE, CMP, begin[6], begin[7]); \
SORT_CMP_SWAP(TYPE, CMP, begin[8], begin[9]); \
SORT_CMP_SWAP(TYPE, CMP, begin[3], begin[4]); \
SORT_CMP_SWAP(TYPE, CMP, begin[5], begin[6]); \
} while (0)
/* *INDENT-OFF* */
/* clang-format off */
// 51 comparators, 10 parallel operations
// o--^--^-----^-----------^-----------------------------------------------------------o
// | | | |
// o--v--|--^--|--^--------|--^-----^-----------------------^--------------------------o
// | | | | | | | |
// o--^--v--|--|--|--^-----|--|--^--v-----------------------|--^--^--------------------o
// | | | | | | | | | | |
// o--v-----v--|--|--|--^--|--|--|--^--------------^--------|--|--|--^--^--^-----------o
// | | | | | | | | | | | | | | |
// o--^--^-----v--|--|--|--|--|--|--|--^-----------|-----^--v--|--v--|--|--v-----------o
// | | | | | | | | | | | | | | |
// o--v--|--^-----v--|--|--|--|--|--|--|--^--^-----|-----|-----|--^--|--v-----^--------o
// | | | | | | | | | | | | | | | | |
// o--^--v--|--------v--|--|--|--|--|--|--|--|--^--|-----|-----|--v--|-----^--v-----^--o
// | | | | | | | | | | | | | | | | |
// o--v-----v-----------v--|--|--|--|--|--|--|--|--|--^--|--^--|-----|--^--|--^--^--v--o
// | | | | | | | | | | | | | | | | | |
// o--^--^-----^-----------v--|--|--|--|--|--|--|--|--|--v--|--v-----v--|--v--|--v--^--o
// | | | | | | | | | | | | | | | |
// o--v--|--^--|--^-----------v--|--|--|--|--|--v--|--|-----|--^--------|-----v--^--v--o
// | | | | | | | | | | | | | | |
// o--^--v--|--|--|--------------v--|--|--|--v-----|--|-----|--v--------|--^-----v-----o
// | | | | | | | | | | | |
// o--v-----v--|--|-----------------v--|--|--------|--v-----|--^--------|--|--^--------o
// | | | | | | | | | |
// o--^--------v--|--------------------v--|--------v--------|--|--------v--v--v--------o
// | | | | |
// o--v-----------v-----------------------v-----------------v--v-----------------------o
//
// [[0,1],[2,3],[4,5],[6,7],[8,9],[10,11],[12,13]]
// [[0,2],[4,6],[8,10],[1,3],[5,7],[9,11]]
// [[0,4],[8,12],[1,5],[9,13],[2,6],[3,7]]
// [[0,8],[1,9],[2,10],[3,11],[4,12],[5,13]]
// [[5,10],[6,9],[3,12],[7,11],[1,2],[4,8]]
// [[1,4],[7,13],[2,8],[5,6],[9,10]]
// [[2,4],[11,13],[3,8],[7,12]]
// [[6,8],[10,12],[3,5],[7,9]]
// [[3,4],[5,6],[7,8],[9,10],[11,12]]
// [[6,7],[8,9]]
/* *INDENT-ON* */
/* clang-format on */
#define SORT_NETWORK_14(TYPE, CMP, begin) \
do { \
SORT_CMP_SWAP(TYPE, CMP, begin[0], begin[1]); \
SORT_CMP_SWAP(TYPE, CMP, begin[2], begin[3]); \
SORT_CMP_SWAP(TYPE, CMP, begin[4], begin[5]); \
SORT_CMP_SWAP(TYPE, CMP, begin[6], begin[7]); \
SORT_CMP_SWAP(TYPE, CMP, begin[8], begin[9]); \
SORT_CMP_SWAP(TYPE, CMP, begin[10], begin[11]); \
SORT_CMP_SWAP(TYPE, CMP, begin[12], begin[13]); \
SORT_CMP_SWAP(TYPE, CMP, begin[0], begin[2]); \
SORT_CMP_SWAP(TYPE, CMP, begin[4], begin[6]); \
SORT_CMP_SWAP(TYPE, CMP, begin[8], begin[10]); \
SORT_CMP_SWAP(TYPE, CMP, begin[1], begin[3]); \
SORT_CMP_SWAP(TYPE, CMP, begin[5], begin[7]); \
SORT_CMP_SWAP(TYPE, CMP, begin[9], begin[11]); \
SORT_CMP_SWAP(TYPE, CMP, begin[0], begin[4]); \
SORT_CMP_SWAP(TYPE, CMP, begin[8], begin[12]); \
SORT_CMP_SWAP(TYPE, CMP, begin[1], begin[5]); \
SORT_CMP_SWAP(TYPE, CMP, begin[9], begin[13]); \
SORT_CMP_SWAP(TYPE, CMP, begin[2], begin[6]); \
SORT_CMP_SWAP(TYPE, CMP, begin[3], begin[7]); \
SORT_CMP_SWAP(TYPE, CMP, begin[0], begin[8]); \
SORT_CMP_SWAP(TYPE, CMP, begin[1], begin[9]); \
SORT_CMP_SWAP(TYPE, CMP, begin[2], begin[10]); \
SORT_CMP_SWAP(TYPE, CMP, begin[3], begin[11]); \
SORT_CMP_SWAP(TYPE, CMP, begin[4], begin[12]); \
SORT_CMP_SWAP(TYPE, CMP, begin[5], begin[13]); \
SORT_CMP_SWAP(TYPE, CMP, begin[5], begin[10]); \
SORT_CMP_SWAP(TYPE, CMP, begin[6], begin[9]); \
SORT_CMP_SWAP(TYPE, CMP, begin[3], begin[12]); \
SORT_CMP_SWAP(TYPE, CMP, begin[7], begin[11]); \
SORT_CMP_SWAP(TYPE, CMP, begin[1], begin[2]); \
SORT_CMP_SWAP(TYPE, CMP, begin[4], begin[8]); \
SORT_CMP_SWAP(TYPE, CMP, begin[1], begin[4]); \
SORT_CMP_SWAP(TYPE, CMP, begin[7], begin[13]); \
SORT_CMP_SWAP(TYPE, CMP, begin[2], begin[8]); \
SORT_CMP_SWAP(TYPE, CMP, begin[5], begin[6]); \
SORT_CMP_SWAP(TYPE, CMP, begin[9], begin[10]); \
SORT_CMP_SWAP(TYPE, CMP, begin[2], begin[4]); \
SORT_CMP_SWAP(TYPE, CMP, begin[11], begin[13]); \
SORT_CMP_SWAP(TYPE, CMP, begin[3], begin[8]); \
SORT_CMP_SWAP(TYPE, CMP, begin[7], begin[12]); \
SORT_CMP_SWAP(TYPE, CMP, begin[6], begin[8]); \
SORT_CMP_SWAP(TYPE, CMP, begin[10], begin[12]); \
SORT_CMP_SWAP(TYPE, CMP, begin[3], begin[5]); \
SORT_CMP_SWAP(TYPE, CMP, begin[7], begin[9]); \
SORT_CMP_SWAP(TYPE, CMP, begin[3], begin[4]); \
SORT_CMP_SWAP(TYPE, CMP, begin[5], begin[6]); \
SORT_CMP_SWAP(TYPE, CMP, begin[7], begin[8]); \
SORT_CMP_SWAP(TYPE, CMP, begin[9], begin[10]); \
SORT_CMP_SWAP(TYPE, CMP, begin[11], begin[12]); \
SORT_CMP_SWAP(TYPE, CMP, begin[6], begin[7]); \
SORT_CMP_SWAP(TYPE, CMP, begin[8], begin[9]); \
} while (0)
/* *INDENT-OFF* */
/* clang-format off */
// 56 comparators, 10 parallel operations
// o--^--^-----^-----------^--------------------------------------------------------------o
// | | | |
// o--v--|--^--|--^--------|--^-----^--------------------------^--------------------------o
// | | | | | | | |
// o--^--v--|--|--|--^-----|--|--^--v--------------------------|--^--^--------------------o
// | | | | | | | | | | |
// o--v-----v--|--|--|--^--|--|--|--^-----------------^--------|--|--|--^--^--^-----------o
// | | | | | | | | | | | | | | |
// o--^--^-----v--|--|--|--|--|--|--|--^--------------|-----^--v--|--v--|--|--v-----------o
// | | | | | | | | | | | | | | |
// o--v--|--^-----v--|--|--|--|--|--|--|--^-----^-----|-----|-----|--^--|--v-----^--------o
// | | | | | | | | | | | | | | | | |
// o--^--v--|--------v--|--|--|--|--|--|--|--^--|--^--|-----|-----|--v--|-----^--v-----^--o
// | | | | | | | | | | | | | | | | | |
// o--v-----v-----------v--|--|--|--|--|--|--|--|--|--|--^--|--^--|-----|--^--|--^--^--v--o
// | | | | | | | | | | | | | | | | | | |
// o--^--^-----^-----------v--|--|--|--|--|--|--|--|--|--|--v--|--v-----v--|--v--|--v--^--o
// | | | | | | | | | | | | | | | | |
// o--v--|--^--|--^-----------v--|--|--|--|--|--|--v--|--|-----|--^--------|-----v--^--v--o
// | | | | | | | | | | | | | | | |
// o--^--v--|--|--|--^-----------v--|--|--|--|--v-----|--|-----|--v--------|--^-----v-----o
// | | | | | | | | | | | | | |
// o--v-----v--|--|--|--------------v--|--|--|--------|--v-----|--^--^-----|--|--^--------o
// | | | | | | | | | | | | |
// o--^--^-----v--|--|-----------------v--|--|--------v--------|--|--|-----v--v--v--------o
// | | | | | | | | |
// o--v--|--------v--|--------------------v--|--^--------------v--|--v--------------------o
// | | | | |
// o-----v-----------v-----------------------v--v-----------------v-----------------------o
//
// [[0,1],[2,3],[4,5],[6,7],[8,9],[10,11],[12,13]]
// [[0,2],[4,6],[8,10],[12,14],[1,3],[5,7],[9,11]]
// [[0,4],[8,12],[1,5],[9,13],[2,6],[10,14],[3,7]]
// [[0,8],[1,9],[2,10],[3,11],[4,12],[5,13],[6,14]]
// [[5,10],[6,9],[3,12],[13,14],[7,11],[1,2],[4,8]]
// [[1,4],[7,13],[2,8],[11,14],[5,6],[9,10]]
// [[2,4],[11,13],[3,8],[7,12]]
// [[6,8],[10,12],[3,5],[7,9]]
// [[3,4],[5,6],[7,8],[9,10],[11,12]]
// [[6,7],[8,9]]
/* *INDENT-ON* */
/* clang-format on */
#define SORT_NETWORK_15(TYPE, CMP, begin) \
do { \
SORT_CMP_SWAP(TYPE, CMP, begin[0], begin[1]); \
SORT_CMP_SWAP(TYPE, CMP, begin[2], begin[3]); \
SORT_CMP_SWAP(TYPE, CMP, begin[4], begin[5]); \
SORT_CMP_SWAP(TYPE, CMP, begin[6], begin[7]); \
SORT_CMP_SWAP(TYPE, CMP, begin[8], begin[9]); \
SORT_CMP_SWAP(TYPE, CMP, begin[10], begin[11]); \
SORT_CMP_SWAP(TYPE, CMP, begin[12], begin[13]); \
SORT_CMP_SWAP(TYPE, CMP, begin[0], begin[2]); \
SORT_CMP_SWAP(TYPE, CMP, begin[4], begin[6]); \
SORT_CMP_SWAP(TYPE, CMP, begin[8], begin[10]); \
SORT_CMP_SWAP(TYPE, CMP, begin[12], begin[14]); \
SORT_CMP_SWAP(TYPE, CMP, begin[1], begin[3]); \
SORT_CMP_SWAP(TYPE, CMP, begin[5], begin[7]); \
SORT_CMP_SWAP(TYPE, CMP, begin[9], begin[11]); \
SORT_CMP_SWAP(TYPE, CMP, begin[0], begin[4]); \
SORT_CMP_SWAP(TYPE, CMP, begin[8], begin[12]); \
SORT_CMP_SWAP(TYPE, CMP, begin[1], begin[5]); \
SORT_CMP_SWAP(TYPE, CMP, begin[9], begin[13]); \
SORT_CMP_SWAP(TYPE, CMP, begin[2], begin[6]); \
SORT_CMP_SWAP(TYPE, CMP, begin[10], begin[14]); \
SORT_CMP_SWAP(TYPE, CMP, begin[3], begin[7]); \
SORT_CMP_SWAP(TYPE, CMP, begin[0], begin[8]); \
SORT_CMP_SWAP(TYPE, CMP, begin[1], begin[9]); \
SORT_CMP_SWAP(TYPE, CMP, begin[2], begin[10]); \
SORT_CMP_SWAP(TYPE, CMP, begin[3], begin[11]); \
SORT_CMP_SWAP(TYPE, CMP, begin[4], begin[12]); \
SORT_CMP_SWAP(TYPE, CMP, begin[5], begin[13]); \
SORT_CMP_SWAP(TYPE, CMP, begin[6], begin[14]); \
SORT_CMP_SWAP(TYPE, CMP, begin[5], begin[10]); \
SORT_CMP_SWAP(TYPE, CMP, begin[6], begin[9]); \
SORT_CMP_SWAP(TYPE, CMP, begin[3], begin[12]); \
SORT_CMP_SWAP(TYPE, CMP, begin[13], begin[14]); \
SORT_CMP_SWAP(TYPE, CMP, begin[7], begin[11]); \
SORT_CMP_SWAP(TYPE, CMP, begin[1], begin[2]); \
SORT_CMP_SWAP(TYPE, CMP, begin[4], begin[8]); \
SORT_CMP_SWAP(TYPE, CMP, begin[1], begin[4]); \
SORT_CMP_SWAP(TYPE, CMP, begin[7], begin[13]); \
SORT_CMP_SWAP(TYPE, CMP, begin[2], begin[8]); \
SORT_CMP_SWAP(TYPE, CMP, begin[11], begin[14]); \
SORT_CMP_SWAP(TYPE, CMP, begin[5], begin[6]); \
SORT_CMP_SWAP(TYPE, CMP, begin[9], begin[10]); \
SORT_CMP_SWAP(TYPE, CMP, begin[2], begin[4]); \
SORT_CMP_SWAP(TYPE, CMP, begin[11], begin[13]); \
SORT_CMP_SWAP(TYPE, CMP, begin[3], begin[8]); \
SORT_CMP_SWAP(TYPE, CMP, begin[7], begin[12]); \
SORT_CMP_SWAP(TYPE, CMP, begin[6], begin[8]); \
SORT_CMP_SWAP(TYPE, CMP, begin[10], begin[12]); \
SORT_CMP_SWAP(TYPE, CMP, begin[3], begin[5]); \
SORT_CMP_SWAP(TYPE, CMP, begin[7], begin[9]); \
SORT_CMP_SWAP(TYPE, CMP, begin[3], begin[4]); \
SORT_CMP_SWAP(TYPE, CMP, begin[5], begin[6]); \
SORT_CMP_SWAP(TYPE, CMP, begin[7], begin[8]); \
SORT_CMP_SWAP(TYPE, CMP, begin[9], begin[10]); \
SORT_CMP_SWAP(TYPE, CMP, begin[11], begin[12]); \
SORT_CMP_SWAP(TYPE, CMP, begin[6], begin[7]); \
SORT_CMP_SWAP(TYPE, CMP, begin[8], begin[9]); \
} while (0)
/* *INDENT-OFF* */
/* clang-format off */
// 60 comparators, 10 parallel operations
// o--^--^-----^-----------^-----------------------------------------------------------------o
// | | | |
// o--v--|--^--|--^--------|--^-----^-----------------------------^--------------------------o
// | | | | | | | |
// o--^--v--|--|--|--^-----|--|--^--v-----------------------------|--^--^--------------------o
// | | | | | | | | | | |
// o--v-----v--|--|--|--^--|--|--|--^--------------------^--------|--|--|--^--^--^-----------o
// | | | | | | | | | | | | | | |
// o--^--^-----v--|--|--|--|--|--|--|--^-----------------|-----^--v--|--v--|--|--v-----------o
// | | | | | | | | | | | | | | |
// o--v--|--^-----v--|--|--|--|--|--|--|--^--------^-----|-----|-----|--^--|--v-----^--------o
// | | | | | | | | | | | | | | | | |
// o--^--v--|--------v--|--|--|--|--|--|--|--^-----|--^--|-----|-----|--v--|-----^--v-----^--o
// | | | | | | | | | | | | | | | | | |
// o--v-----v-----------v--|--|--|--|--|--|--|--^--|--|--|--^--|--^--|-----|--^--|--^--^--v--o
// | | | | | | | | | | | | | | | | | | | |
// o--^--^-----^-----------v--|--|--|--|--|--|--|--|--|--|--|--v--|--v-----v--|--v--|--v--^--o
// | | | | | | | | | | | | | | | | | |
// o--v--|--^--|--^-----------v--|--|--|--|--|--|--|--v--|--|-----|--^--------|-----v--^--v--o
// | | | | | | | | | | | | | | | | |
// o--^--v--|--|--|--^-----------v--|--|--|--|--|--v-----|--|-----|--v--------|--^-----v-----o
// | | | | | | | | | | | | | | |
// o--v-----v--|--|--|--^-----------v--|--|--|--|--------|--v-----|--^--^-----|--|--^--------o
// | | | | | | | | | | | | | | |
// o--^--^-----v--|--|--|--------------v--|--|--|--------v--------|--|--|-----v--v--v--------o
// | | | | | | | | | | |
// o--v--|--^-----v--|--|-----------------v--|--|--^--------------v--|--v--------------------o
// | | | | | | | |
// o--^--v--|--------v--|--------------------v--|--v-----------------v-----------------------o
// | | | |
// o--v-----v-----------v-----------------------v--------------------------------------------o
//
// [[0,1],[2,3],[4,5],[6,7],[8,9],[10,11],[12,13],[14,15]]
// [[0,2],[4,6],[8,10],[12,14],[1,3],[5,7],[9,11],[13,15]]
// [[0,4],[8,12],[1,5],[9,13],[2,6],[10,14],[3,7],[11,15]]
// [[0,8],[1,9],[2,10],[3,11],[4,12],[5,13],[6,14],[7,15]]
// [[5,10],[6,9],[3,12],[13,14],[7,11],[1,2],[4,8]]
// [[1,4],[7,13],[2,8],[11,14],[5,6],[9,10]]
// [[2,4],[11,13],[3,8],[7,12]]
// [[6,8],[10,12],[3,5],[7,9]]
// [[3,4],[5,6],[7,8],[9,10],[11,12]]
// [[6,7],[8,9]]
/* *INDENT-ON* */
/* clang-format on */
#define SORT_NETWORK_16(TYPE, CMP, begin) \
do { \
SORT_CMP_SWAP(TYPE, CMP, begin[0], begin[1]); \
SORT_CMP_SWAP(TYPE, CMP, begin[2], begin[3]); \
SORT_CMP_SWAP(TYPE, CMP, begin[4], begin[5]); \
SORT_CMP_SWAP(TYPE, CMP, begin[6], begin[7]); \
SORT_CMP_SWAP(TYPE, CMP, begin[8], begin[9]); \
SORT_CMP_SWAP(TYPE, CMP, begin[10], begin[11]); \
SORT_CMP_SWAP(TYPE, CMP, begin[12], begin[13]); \
SORT_CMP_SWAP(TYPE, CMP, begin[14], begin[15]); \
SORT_CMP_SWAP(TYPE, CMP, begin[0], begin[2]); \
SORT_CMP_SWAP(TYPE, CMP, begin[4], begin[6]); \
SORT_CMP_SWAP(TYPE, CMP, begin[8], begin[10]); \
SORT_CMP_SWAP(TYPE, CMP, begin[12], begin[14]); \
SORT_CMP_SWAP(TYPE, CMP, begin[1], begin[3]); \
SORT_CMP_SWAP(TYPE, CMP, begin[5], begin[7]); \
SORT_CMP_SWAP(TYPE, CMP, begin[9], begin[11]); \
SORT_CMP_SWAP(TYPE, CMP, begin[13], begin[15]); \
SORT_CMP_SWAP(TYPE, CMP, begin[0], begin[4]); \
SORT_CMP_SWAP(TYPE, CMP, begin[8], begin[12]); \
SORT_CMP_SWAP(TYPE, CMP, begin[1], begin[5]); \
SORT_CMP_SWAP(TYPE, CMP, begin[9], begin[13]); \
SORT_CMP_SWAP(TYPE, CMP, begin[2], begin[6]); \
SORT_CMP_SWAP(TYPE, CMP, begin[10], begin[14]); \
SORT_CMP_SWAP(TYPE, CMP, begin[3], begin[7]); \
SORT_CMP_SWAP(TYPE, CMP, begin[11], begin[15]); \
SORT_CMP_SWAP(TYPE, CMP, begin[0], begin[8]); \
SORT_CMP_SWAP(TYPE, CMP, begin[1], begin[9]); \
SORT_CMP_SWAP(TYPE, CMP, begin[2], begin[10]); \
SORT_CMP_SWAP(TYPE, CMP, begin[3], begin[11]); \
SORT_CMP_SWAP(TYPE, CMP, begin[4], begin[12]); \
SORT_CMP_SWAP(TYPE, CMP, begin[5], begin[13]); \
SORT_CMP_SWAP(TYPE, CMP, begin[6], begin[14]); \
SORT_CMP_SWAP(TYPE, CMP, begin[7], begin[15]); \
SORT_CMP_SWAP(TYPE, CMP, begin[5], begin[10]); \
SORT_CMP_SWAP(TYPE, CMP, begin[6], begin[9]); \
SORT_CMP_SWAP(TYPE, CMP, begin[3], begin[12]); \
SORT_CMP_SWAP(TYPE, CMP, begin[13], begin[14]); \
SORT_CMP_SWAP(TYPE, CMP, begin[7], begin[11]); \
SORT_CMP_SWAP(TYPE, CMP, begin[1], begin[2]); \
SORT_CMP_SWAP(TYPE, CMP, begin[4], begin[8]); \
SORT_CMP_SWAP(TYPE, CMP, begin[1], begin[4]); \
SORT_CMP_SWAP(TYPE, CMP, begin[7], begin[13]); \
SORT_CMP_SWAP(TYPE, CMP, begin[2], begin[8]); \
SORT_CMP_SWAP(TYPE, CMP, begin[11], begin[14]); \
SORT_CMP_SWAP(TYPE, CMP, begin[5], begin[6]); \
SORT_CMP_SWAP(TYPE, CMP, begin[9], begin[10]); \
SORT_CMP_SWAP(TYPE, CMP, begin[2], begin[4]); \
SORT_CMP_SWAP(TYPE, CMP, begin[11], begin[13]); \
SORT_CMP_SWAP(TYPE, CMP, begin[3], begin[8]); \
SORT_CMP_SWAP(TYPE, CMP, begin[7], begin[12]); \
SORT_CMP_SWAP(TYPE, CMP, begin[6], begin[8]); \
SORT_CMP_SWAP(TYPE, CMP, begin[10], begin[12]); \
SORT_CMP_SWAP(TYPE, CMP, begin[3], begin[5]); \
SORT_CMP_SWAP(TYPE, CMP, begin[7], begin[9]); \
SORT_CMP_SWAP(TYPE, CMP, begin[3], begin[4]); \
SORT_CMP_SWAP(TYPE, CMP, begin[5], begin[6]); \
SORT_CMP_SWAP(TYPE, CMP, begin[7], begin[8]); \
SORT_CMP_SWAP(TYPE, CMP, begin[9], begin[10]); \
SORT_CMP_SWAP(TYPE, CMP, begin[11], begin[12]); \
SORT_CMP_SWAP(TYPE, CMP, begin[6], begin[7]); \
SORT_CMP_SWAP(TYPE, CMP, begin[8], begin[9]); \
} while (0)
#define SORT_INNER(TYPE, CMP, begin, end, len) \
switch (len) { \
default: \
assert(false); \
__unreachable(); \
case 0: \
case 1: \
@ -2787,30 +2111,6 @@ static int lcklist_detach_locked(MDBX_env *env) {
case 8: \
SORT_NETWORK_8(TYPE, CMP, begin); \
break; \
case 9: \
SORT_NETWORK_9(TYPE, CMP, begin); \
break; \
case 10: \
SORT_NETWORK_10(TYPE, CMP, begin); \
break; \
case 11: \
SORT_NETWORK_11(TYPE, CMP, begin); \
break; \
case 12: \
SORT_NETWORK_12(TYPE, CMP, begin); \
break; \
case 13: \
SORT_NETWORK_13(TYPE, CMP, begin); \
break; \
case 14: \
SORT_NETWORK_14(TYPE, CMP, begin); \
break; \
case 15: \
SORT_NETWORK_15(TYPE, CMP, begin); \
break; \
case 16: \
SORT_NETWORK_16(TYPE, CMP, begin); \
break; \
}
#define SORT_SWAP(TYPE, a, b) \
@ -2855,7 +2155,7 @@ static int lcklist_detach_locked(MDBX_env *env) {
TYPE *__restrict lo = begin; \
while (true) { \
const ptrdiff_t len = hi - lo; \
if (len < 16) { \
if (len < 8) { \
SORT_INNER(TYPE, CMP, lo, hi + 1, len + 1); \
if (unlikely(top == stack)) \
break; \