diff --git a/src/core.c b/src/core.c index b2acb378..5077cabc 100644 --- a/src/core.c +++ b/src/core.c @@ -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; \