@@ -37,7 +37,7 @@ inline int select64(uint64_t k, uint64_t x) {
3737*/
3838// #if defined(__BMI2__)
3939// use a macro, to ensure it is inlined
40- #define select64 (A, B ) _tzcnt_u64(_pdep_u64(1ULL << (B), (A)))
40+ // #define select64(A, B) _tzcnt_u64(_pdep_u64(1ULL << (B), (A)))
4141/*
4242#else
4343inline int select64(uint64_t x, int n) {
@@ -73,6 +73,138 @@ inline int select64(uint64_t x, int n) {
7373*/
7474// #endif
7575
76+ #define ONES_STEP_4 0x1111111111111111ULL
77+ #define ONES_STEP_8 0x0101010101010101ULL
78+ #define MSBS_STEP_8 (0x80L * ONES_STEP_8)
79+
80+ static int8_t SELECT_IN_BYTE[] = {
81+ -1 , 0 , 1 , 0 , 2 , 0 , 1 , 0 , 3 ,
82+ 0 , 1 , 0 , 2 , 0 , 1 , 0 , 4 , 0 , 1 , 0 , 2 , 0 , 1 , 0 , 3 , 0 , 1 , 0 , 2 , 0 , 1 ,
83+ 0 , 5 , 0 , 1 , 0 , 2 , 0 , 1 , 0 , 3 , 0 , 1 , 0 , 2 , 0 , 1 , 0 , 4 , 0 , 1 , 0 , 2 ,
84+ 0 , 1 , 0 , 3 , 0 , 1 , 0 , 2 , 0 , 1 , 0 , 6 , 0 , 1 , 0 , 2 , 0 , 1 , 0 , 3 , 0 , 1 ,
85+ 0 , 2 , 0 , 1 , 0 , 4 , 0 , 1 , 0 , 2 , 0 , 1 , 0 , 3 , 0 , 1 , 0 , 2 , 0 , 1 , 0 , 5 ,
86+ 0 , 1 , 0 , 2 , 0 , 1 , 0 , 3 , 0 , 1 , 0 , 2 , 0 , 1 , 0 , 4 , 0 , 1 , 0 , 2 , 0 , 1 ,
87+ 0 , 3 , 0 , 1 , 0 , 2 , 0 , 1 , 0 , 7 , 0 , 1 , 0 , 2 , 0 , 1 , 0 , 3 , 0 , 1 , 0 , 2 ,
88+ 0 , 1 , 0 , 4 , 0 , 1 , 0 , 2 , 0 , 1 , 0 , 3 , 0 , 1 , 0 , 2 , 0 , 1 , 0 , 5 , 0 , 1 ,
89+ 0 , 2 , 0 , 1 , 0 , 3 , 0 , 1 , 0 , 2 , 0 , 1 , 0 , 4 , 0 , 1 , 0 , 2 , 0 , 1 , 0 , 3 ,
90+ 0 , 1 , 0 , 2 , 0 , 1 , 0 , 6 , 0 , 1 , 0 , 2 , 0 , 1 , 0 , 3 , 0 , 1 , 0 , 2 , 0 , 1 ,
91+ 0 , 4 , 0 , 1 , 0 , 2 , 0 , 1 , 0 , 3 , 0 , 1 , 0 , 2 , 0 , 1 , 0 , 5 , 0 , 1 , 0 , 2 ,
92+ 0 , 1 , 0 , 3 , 0 , 1 , 0 , 2 , 0 , 1 , 0 , 4 , 0 , 1 , 0 , 2 , 0 , 1 , 0 , 3 , 0 , 1 ,
93+ 0 , 2 , 0 , 1 , 0 , -1 , -1 , -1 , 1 , -1 , 2 , 2 , 1 , -1 , 3 , 3 , 1 , 3 , 2 , 2 , 1 ,
94+ -1 , 4 , 4 , 1 , 4 , 2 , 2 , 1 , 4 , 3 , 3 , 1 , 3 , 2 , 2 , 1 , -1 , 5 , 5 , 1 , 5 , 2 ,
95+ 2 , 1 , 5 , 3 , 3 , 1 , 3 , 2 , 2 , 1 , 5 , 4 , 4 , 1 , 4 , 2 , 2 , 1 , 4 , 3 , 3 , 1 ,
96+ 3 , 2 , 2 , 1 , -1 , 6 , 6 , 1 , 6 , 2 , 2 , 1 , 6 , 3 , 3 , 1 , 3 , 2 , 2 , 1 , 6 , 4 ,
97+ 4 , 1 , 4 , 2 , 2 , 1 , 4 , 3 , 3 , 1 , 3 , 2 , 2 , 1 , 6 , 5 , 5 , 1 , 5 , 2 , 2 , 1 ,
98+ 5 , 3 , 3 , 1 , 3 , 2 , 2 , 1 , 5 , 4 , 4 , 1 , 4 , 2 , 2 , 1 , 4 , 3 , 3 , 1 , 3 , 2 ,
99+ 2 , 1 , -1 , 7 , 7 , 1 , 7 , 2 , 2 , 1 , 7 , 3 , 3 , 1 , 3 , 2 , 2 , 1 , 7 , 4 , 4 , 1 ,
100+ 4 , 2 , 2 , 1 , 4 , 3 , 3 , 1 , 3 , 2 , 2 , 1 , 7 , 5 , 5 , 1 , 5 , 2 , 2 , 1 , 5 , 3 ,
101+ 3 , 1 , 3 , 2 , 2 , 1 , 5 , 4 , 4 , 1 , 4 , 2 , 2 , 1 , 4 , 3 , 3 , 1 , 3 , 2 , 2 , 1 ,
102+ 7 , 6 , 6 , 1 , 6 , 2 , 2 , 1 , 6 , 3 , 3 , 1 , 3 , 2 , 2 , 1 , 6 , 4 , 4 , 1 , 4 , 2 ,
103+ 2 , 1 , 4 , 3 , 3 , 1 , 3 , 2 , 2 , 1 , 6 , 5 , 5 , 1 , 5 , 2 , 2 , 1 , 5 , 3 , 3 , 1 ,
104+ 3 , 2 , 2 , 1 , 5 , 4 , 4 , 1 , 4 , 2 , 2 , 1 , 4 , 3 , 3 , 1 , 3 , 2 , 2 , 1 , -1 , -1 ,
105+ -1 , -1 , -1 , -1 , -1 , 2 , -1 , -1 , -1 , 3 , -1 , 3 , 3 , 2 , -1 , -1 , -1 , 4 ,
106+ -1 , 4 , 4 , 2 , -1 , 4 , 4 , 3 , 4 , 3 , 3 , 2 , -1 , -1 , -1 , 5 , -1 , 5 , 5 , 2 ,
107+ -1 , 5 , 5 , 3 , 5 , 3 , 3 , 2 , -1 , 5 , 5 , 4 , 5 , 4 , 4 , 2 , 5 , 4 , 4 , 3 , 4 , 3 ,
108+ 3 , 2 , -1 , -1 , -1 , 6 , -1 , 6 , 6 , 2 , -1 , 6 , 6 , 3 , 6 , 3 , 3 , 2 , -1 , 6 ,
109+ 6 , 4 , 6 , 4 , 4 , 2 , 6 , 4 , 4 , 3 , 4 , 3 , 3 , 2 , -1 , 6 , 6 , 5 , 6 , 5 , 5 , 2 ,
110+ 6 , 5 , 5 , 3 , 5 , 3 , 3 , 2 , 6 , 5 , 5 , 4 , 5 , 4 , 4 , 2 , 5 , 4 , 4 , 3 , 4 , 3 ,
111+ 3 , 2 , -1 , -1 , -1 , 7 , -1 , 7 , 7 , 2 , -1 , 7 , 7 , 3 , 7 , 3 , 3 , 2 , -1 , 7 ,
112+ 7 , 4 , 7 , 4 , 4 , 2 , 7 , 4 , 4 , 3 , 4 , 3 , 3 , 2 , -1 , 7 , 7 , 5 , 7 , 5 , 5 , 2 ,
113+ 7 , 5 , 5 , 3 , 5 , 3 , 3 , 2 , 7 , 5 , 5 , 4 , 5 , 4 , 4 , 2 , 5 , 4 , 4 , 3 , 4 , 3 ,
114+ 3 , 2 , -1 , 7 , 7 , 6 , 7 , 6 , 6 , 2 , 7 , 6 , 6 , 3 , 6 , 3 , 3 , 2 , 7 , 6 , 6 , 4 ,
115+ 6 , 4 , 4 , 2 , 6 , 4 , 4 , 3 , 4 , 3 , 3 , 2 , 7 , 6 , 6 , 5 , 6 , 5 , 5 , 2 , 6 , 5 ,
116+ 5 , 3 , 5 , 3 , 3 , 2 , 6 , 5 , 5 , 4 , 5 , 4 , 4 , 2 , 5 , 4 , 4 , 3 , 4 , 3 , 3 , 2 ,
117+ -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , 3 , -1 ,
118+ -1 , -1 , -1 , -1 , -1 , -1 , 4 , -1 , -1 , -1 , 4 , -1 , 4 , 4 , 3 , -1 , -1 , -1 ,
119+ -1 , -1 , -1 , -1 , 5 , -1 , -1 , -1 , 5 , -1 , 5 , 5 , 3 , -1 , -1 , -1 , 5 , -1 ,
120+ 5 , 5 , 4 , -1 , 5 , 5 , 4 , 5 , 4 , 4 , 3 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , 6 ,
121+ -1 , -1 , -1 , 6 , -1 , 6 , 6 , 3 , -1 , -1 , -1 , 6 , -1 , 6 , 6 , 4 , -1 , 6 , 6 ,
122+ 4 , 6 , 4 , 4 , 3 , -1 , -1 , -1 , 6 , -1 , 6 , 6 , 5 , -1 , 6 , 6 , 5 , 6 , 5 , 5 , 3 ,
123+ -1 , 6 , 6 , 5 , 6 , 5 , 5 , 4 , 6 , 5 , 5 , 4 , 5 , 4 , 4 , 3 , -1 , -1 , -1 , -1 ,
124+ -1 , -1 , -1 , 7 , -1 , -1 , -1 , 7 , -1 , 7 , 7 , 3 , -1 , -1 , -1 , 7 , -1 , 7 , 7 ,
125+ 4 , -1 , 7 , 7 , 4 , 7 , 4 , 4 , 3 , -1 , -1 , -1 , 7 , -1 , 7 , 7 , 5 , -1 , 7 , 7 ,
126+ 5 , 7 , 5 , 5 , 3 , -1 , 7 , 7 , 5 , 7 , 5 , 5 , 4 , 7 , 5 , 5 , 4 , 5 , 4 , 4 , 3 , -1 ,
127+ -1 , -1 , 7 , -1 , 7 , 7 , 6 , -1 , 7 , 7 , 6 , 7 , 6 , 6 , 3 , -1 , 7 , 7 , 6 , 7 , 6 ,
128+ 6 , 4 , 7 , 6 , 6 , 4 , 6 , 4 , 4 , 3 , -1 , 7 , 7 , 6 , 7 , 6 , 6 , 5 , 7 , 6 , 6 , 5 ,
129+ 6 , 5 , 5 , 3 , 7 , 6 , 6 , 5 , 6 , 5 , 5 , 4 , 6 , 5 , 5 , 4 , 5 , 4 , 4 , 3 , -1 , -1 ,
130+ -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 ,
131+ -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , 4 , -1 , -1 , -1 , -1 ,
132+ -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , 5 , -1 , -1 , -1 , -1 , -1 ,
133+ -1 , -1 , 5 , -1 , -1 , -1 , 5 , -1 , 5 , 5 , 4 , -1 , -1 , -1 , -1 , -1 , -1 , -1 ,
134+ -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , 6 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , 6 ,
135+ -1 , -1 , -1 , 6 , -1 , 6 , 6 , 4 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , 6 , -1 , -1 ,
136+ -1 , 6 , -1 , 6 , 6 , 5 , -1 , -1 , -1 , 6 , -1 , 6 , 6 , 5 , -1 , 6 , 6 , 5 , 6 , 5 ,
137+ 5 , 4 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 ,
138+ 7 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , 7 , -1 , -1 , -1 , 7 , -1 , 7 , 7 , 4 , -1 ,
139+ -1 , -1 , -1 , -1 , -1 , -1 , 7 , -1 , -1 , -1 , 7 , -1 , 7 , 7 , 5 , -1 , -1 , -1 ,
140+ 7 , -1 , 7 , 7 , 5 , -1 , 7 , 7 , 5 , 7 , 5 , 5 , 4 , -1 , -1 , -1 , -1 , -1 , -1 ,
141+ -1 , 7 , -1 , -1 , -1 , 7 , -1 , 7 , 7 , 6 , -1 , -1 , -1 , 7 , -1 , 7 , 7 , 6 , -1 ,
142+ 7 , 7 , 6 , 7 , 6 , 6 , 4 , -1 , -1 , -1 , 7 , -1 , 7 , 7 , 6 , -1 , 7 , 7 , 6 , 7 , 6 ,
143+ 6 , 5 , -1 , 7 , 7 , 6 , 7 , 6 , 6 , 5 , 7 , 6 , 6 , 5 , 6 , 5 , 5 , 4 , -1 , -1 , -1 ,
144+ -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 ,
145+ -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 ,
146+ -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 ,
147+ -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , 5 , -1 , -1 , -1 , -1 , -1 , -1 , -1 ,
148+ -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 ,
149+ -1 , -1 , -1 , -1 , -1 , -1 , -1 , 6 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 ,
150+ -1 , -1 , -1 , -1 , -1 , -1 , 6 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , 6 , -1 , -1 ,
151+ -1 , 6 , -1 , 6 , 6 , 5 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 ,
152+ -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 ,
153+ -1 , -1 , 7 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 ,
154+ -1 , 7 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , 7 , -1 , -1 , -1 , 7 , -1 , 7 , 7 , 5 ,
155+ -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , 7 , -1 ,
156+ -1 , -1 , -1 , -1 , -1 , -1 , 7 , -1 , -1 , -1 , 7 , -1 , 7 , 7 , 6 , -1 , -1 , -1 ,
157+ -1 , -1 , -1 , -1 , 7 , -1 , -1 , -1 , 7 , -1 , 7 , 7 , 6 , -1 , -1 , -1 , 7 , -1 ,
158+ 7 , 7 , 6 , -1 , 7 , 7 , 6 , 7 , 6 , 6 , 5 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 ,
159+ -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 ,
160+ -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 ,
161+ -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 ,
162+ -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 ,
163+ -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 ,
164+ -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 ,
165+ -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 ,
166+ 6 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 ,
167+ -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 ,
168+ -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 ,
169+ -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , 7 , -1 , -1 , -1 ,
170+ -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 ,
171+ -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , 7 , -1 , -1 , -1 , -1 , -1 ,
172+ -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , 7 , -1 , -1 , -1 , -1 , -1 , -1 ,
173+ -1 , 7 , -1 , -1 , -1 , 7 , -1 , 7 , 7 , 6 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 ,
174+ -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 ,
175+ -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 ,
176+ -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 ,
177+ -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 ,
178+ -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 ,
179+ -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 ,
180+ -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 ,
181+ -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 ,
182+ -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 ,
183+ -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 ,
184+ -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 ,
185+ -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 ,
186+ -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 ,
187+ -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 ,
188+ -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , 7
189+ };
190+
191+ inline int select64 (uint64_t x, int n) {
192+ uint64_t byteSums = x - ((x & 0xa * ONES_STEP_4) >> 1 );
193+ byteSums = (byteSums & 3 * ONES_STEP_4) +
194+ ((byteSums >> 2 ) & 3 * ONES_STEP_4);
195+ byteSums = (byteSums + (byteSums >> 4 )) & 0x0f * ONES_STEP_8;
196+ byteSums *= ONES_STEP_8;
197+ // Phase 2: compare each byte sum with rank to obtain the relevant byte
198+ uint64_t rankStep8 = n * ONES_STEP_8;
199+ int byteOffset = (int ) (((((rankStep8 | MSBS_STEP_8) - byteSums) & MSBS_STEP_8) >> 7 ) *
200+ ONES_STEP_8 >> 53 ) &
201+ ~0x7 ;
202+ int byteRank = (int ) (n - (((byteSums << 8 ) >> byteOffset) & 0xFF ));
203+ return byteOffset +
204+ SELECT_IN_BYTE[(int ) ((x >> byteOffset) & 0xFF ) | byteRank << 8 ];
205+ }
206+
207+
76208inline int numberOfLeadingZeros64 (uint64_t x) {
77209 // If x is 0, the result is undefined.
78210 return __builtin_clzl (x);
0 commit comments