/src/xnnpack/build/FXdiv-source/include/fxdiv.h
Line | Count | Source |
1 | | #pragma once |
2 | | #ifndef FXDIV_H |
3 | | #define FXDIV_H |
4 | | |
5 | | #if defined(__cplusplus) && (__cplusplus >= 201103L) |
6 | | #include <cstddef> |
7 | | #include <cstdint> |
8 | | #include <climits> |
9 | | #elif !defined(__OPENCL_VERSION__) |
10 | | #include <stddef.h> |
11 | | #include <stdint.h> |
12 | | #include <limits.h> |
13 | | #endif |
14 | | |
15 | | #if defined(_MSC_VER) |
16 | | #include <intrin.h> |
17 | | #if defined(_M_IX86) || defined(_M_X64) |
18 | | #include <immintrin.h> |
19 | | #endif |
20 | | #endif |
21 | | |
22 | | #ifndef FXDIV_USE_INLINE_ASSEMBLY |
23 | | #define FXDIV_USE_INLINE_ASSEMBLY 0 |
24 | | #endif |
25 | | |
26 | 0 | static inline uint64_t fxdiv_mulext_uint32_t(uint32_t a, uint32_t b) { |
27 | | #if defined(_MSC_VER) && defined(_M_IX86) |
28 | | return (uint64_t) __emulu((unsigned int) a, (unsigned int) b); |
29 | | #else |
30 | 0 | return (uint64_t) a * (uint64_t) b; |
31 | 0 | #endif |
32 | 0 | } Unexecuted instantiation: indirection.c:fxdiv_mulext_uint32_t Unexecuted instantiation: portable-api.c:fxdiv_mulext_uint32_t Unexecuted instantiation: pthreads.c:fxdiv_mulext_uint32_t Unexecuted instantiation: fastpath.c:fxdiv_mulext_uint32_t Unexecuted instantiation: memory.c:fxdiv_mulext_uint32_t |
33 | | |
34 | 0 | static inline uint32_t fxdiv_mulhi_uint32_t(uint32_t a, uint32_t b) { |
35 | 0 | #if defined(__OPENCL_VERSION__) |
36 | 0 | return mul_hi(a, b); |
37 | 0 | #elif defined(__CUDA_ARCH__) |
38 | 0 | return (uint32_t) __umulhi((unsigned int) a, (unsigned int) b); |
39 | 0 | #elif defined(_MSC_VER) && defined(_M_IX86) |
40 | 0 | return (uint32_t) (__emulu((unsigned int) a, (unsigned int) b) >> 32); |
41 | 0 | #elif defined(_MSC_VER) && defined(_M_ARM) |
42 | 0 | return (uint32_t) _MulUnsignedHigh((unsigned long) a, (unsigned long) b); |
43 | 0 | #else |
44 | 0 | return (uint32_t) (((uint64_t) a * (uint64_t) b) >> 32); |
45 | 0 | #endif |
46 | 0 | } Unexecuted instantiation: indirection.c:fxdiv_mulhi_uint32_t Unexecuted instantiation: portable-api.c:fxdiv_mulhi_uint32_t Unexecuted instantiation: pthreads.c:fxdiv_mulhi_uint32_t Unexecuted instantiation: fastpath.c:fxdiv_mulhi_uint32_t Unexecuted instantiation: memory.c:fxdiv_mulhi_uint32_t |
47 | | |
48 | 0 | static inline uint64_t fxdiv_mulhi_uint64_t(uint64_t a, uint64_t b) { |
49 | | #if defined(__OPENCL_VERSION__) |
50 | | return mul_hi(a, b); |
51 | | #elif defined(__CUDA_ARCH__) |
52 | | return (uint64_t) __umul64hi((unsigned long long) a, (unsigned long long) b); |
53 | | #elif defined(_MSC_VER) && defined(_M_X64) |
54 | | return (uint64_t) __umulh((unsigned __int64) a, (unsigned __int64) b); |
55 | | #elif defined(__GNUC__) && defined(__SIZEOF_INT128__) |
56 | | return (uint64_t) (((((unsigned __int128) a) * ((unsigned __int128) b))) >> 64); |
57 | | #else |
58 | | const uint32_t a_lo = (uint32_t) a; |
59 | | const uint32_t a_hi = (uint32_t) (a >> 32); |
60 | | const uint32_t b_lo = (uint32_t) b; |
61 | | const uint32_t b_hi = (uint32_t) (b >> 32); |
62 | | |
63 | | const uint64_t t = fxdiv_mulext_uint32_t(a_hi, b_lo) + |
64 | | (uint64_t) fxdiv_mulhi_uint32_t(a_lo, b_lo); |
65 | | return fxdiv_mulext_uint32_t(a_hi, b_hi) + (t >> 32) + |
66 | | ((fxdiv_mulext_uint32_t(a_lo, b_hi) + (uint64_t) (uint32_t) t) >> 32); |
67 | | #endif |
68 | 0 | } Unexecuted instantiation: indirection.c:fxdiv_mulhi_uint64_t Unexecuted instantiation: portable-api.c:fxdiv_mulhi_uint64_t Unexecuted instantiation: pthreads.c:fxdiv_mulhi_uint64_t Unexecuted instantiation: fastpath.c:fxdiv_mulhi_uint64_t Unexecuted instantiation: memory.c:fxdiv_mulhi_uint64_t |
69 | | |
70 | 0 | static inline size_t fxdiv_mulhi_size_t(size_t a, size_t b) { |
71 | 0 | #if SIZE_MAX == UINT32_MAX |
72 | 0 | return (size_t) fxdiv_mulhi_uint32_t((uint32_t) a, (uint32_t) b); |
73 | 0 | #elif SIZE_MAX == UINT64_MAX |
74 | 0 | return (size_t) fxdiv_mulhi_uint64_t((uint64_t) a, (uint64_t) b); |
75 | 0 | #else |
76 | 0 | #error Unsupported platform |
77 | 0 | #endif |
78 | 0 | } Unexecuted instantiation: indirection.c:fxdiv_mulhi_size_t Unexecuted instantiation: portable-api.c:fxdiv_mulhi_size_t Unexecuted instantiation: pthreads.c:fxdiv_mulhi_size_t Unexecuted instantiation: fastpath.c:fxdiv_mulhi_size_t Unexecuted instantiation: memory.c:fxdiv_mulhi_size_t |
79 | | |
80 | | struct fxdiv_divisor_uint32_t { |
81 | | uint32_t value; |
82 | | uint32_t m; |
83 | | uint8_t s1; |
84 | | uint8_t s2; |
85 | | }; |
86 | | |
87 | | struct fxdiv_result_uint32_t { |
88 | | uint32_t quotient; |
89 | | uint32_t remainder; |
90 | | }; |
91 | | |
92 | | struct fxdiv_divisor_uint64_t { |
93 | | uint64_t value; |
94 | | uint64_t m; |
95 | | uint8_t s1; |
96 | | uint8_t s2; |
97 | | }; |
98 | | |
99 | | struct fxdiv_result_uint64_t { |
100 | | uint64_t quotient; |
101 | | uint64_t remainder; |
102 | | }; |
103 | | |
104 | | struct fxdiv_divisor_size_t { |
105 | | size_t value; |
106 | | size_t m; |
107 | | uint8_t s1; |
108 | | uint8_t s2; |
109 | | }; |
110 | | |
111 | | struct fxdiv_result_size_t { |
112 | | size_t quotient; |
113 | | size_t remainder; |
114 | | }; |
115 | | |
116 | 0 | static inline struct fxdiv_divisor_uint32_t fxdiv_init_uint32_t(uint32_t d) { |
117 | 0 | struct fxdiv_divisor_uint32_t result = { d }; |
118 | 0 | if (d == 1) { |
119 | 0 | result.m = UINT32_C(1); |
120 | 0 | result.s1 = 0; |
121 | 0 | result.s2 = 0; |
122 | 0 | } else { |
123 | 0 | #if defined(__OPENCL_VERSION__) |
124 | 0 | const uint32_t l_minus_1 = 31 - clz(d - 1); |
125 | 0 | #elif defined(__CUDA_ARCH__) |
126 | 0 | const uint32_t l_minus_1 = 31 - __clz((int) (d - 1)); |
127 | 0 | #elif defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_X64) || defined(_M_ARM) || defined(_M_ARM64)) |
128 | 0 | unsigned long l_minus_1; |
129 | 0 | _BitScanReverse(&l_minus_1, (unsigned long) (d - 1)); |
130 | 0 | #elif defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) && FXDIV_USE_INLINE_ASSEMBLY |
131 | 0 | uint32_t l_minus_1; |
132 | 0 | __asm__("BSRL %[d_minus_1], %[l_minus_1]" |
133 | 0 | : [l_minus_1] "=r" (l_minus_1) |
134 | 0 | : [d_minus_1] "r" (d - 1) |
135 | 0 | : "cc"); |
136 | 0 | #elif defined(__GNUC__) |
137 | 0 | const uint32_t l_minus_1 = 31 - __builtin_clz(d - 1); |
138 | 0 | #else |
139 | 0 | /* Based on Algorithm 2 from Hacker's delight */ |
140 | 0 |
|
141 | 0 | uint32_t l_minus_1 = 0; |
142 | 0 | uint32_t x = d - 1; |
143 | 0 | uint32_t y = x >> 16; |
144 | 0 | if (y != 0) { |
145 | 0 | l_minus_1 += 16; |
146 | 0 | x = y; |
147 | 0 | } |
148 | 0 | y = x >> 8; |
149 | 0 | if (y != 0) { |
150 | 0 | l_minus_1 += 8; |
151 | 0 | x = y; |
152 | 0 | } |
153 | 0 | y = x >> 4; |
154 | 0 | if (y != 0) { |
155 | 0 | l_minus_1 += 4; |
156 | 0 | x = y; |
157 | 0 | } |
158 | 0 | y = x >> 2; |
159 | 0 | if (y != 0) { |
160 | 0 | l_minus_1 += 2; |
161 | 0 | x = y; |
162 | 0 | } |
163 | 0 | if ((x & 2) != 0) { |
164 | 0 | l_minus_1 += 1; |
165 | 0 | } |
166 | 0 | #endif |
167 | 0 | uint32_t u_hi = (UINT32_C(2) << (uint32_t) l_minus_1) - d; |
168 | 0 |
|
169 | 0 | /* Division of 64-bit number u_hi:UINT32_C(0) by 32-bit number d, 32-bit quotient output q */ |
170 | 0 | #if defined(__GNUC__) && defined(__i386__) && FXDIV_USE_INLINE_ASSEMBLY |
171 | 0 | uint32_t q; |
172 | 0 | __asm__("DIVL %[d]" |
173 | 0 | : "=a" (q), "+d" (u_hi) |
174 | 0 | : [d] "r" (d), "a" (0) |
175 | 0 | : "cc"); |
176 | 0 | #elif (defined(_MSC_VER) && _MSC_VER >= 1920) && !defined(__clang__) && !defined(__INTEL_COMPILER) && (defined(_M_IX86) || defined(_M_X64)) |
177 | 0 | unsigned int remainder; |
178 | 0 | const uint32_t q = (uint32_t) _udiv64((unsigned __int64) ((uint64_t) u_hi << 32), (unsigned int) d, &remainder); |
179 | 0 | #else |
180 | 0 | const uint32_t q = ((uint64_t) u_hi << 32) / d; |
181 | 0 | #endif |
182 | 0 |
|
183 | 0 | result.m = q + UINT32_C(1); |
184 | 0 | result.s1 = 1; |
185 | 0 | result.s2 = (uint8_t) l_minus_1; |
186 | 0 | } |
187 | 0 | return result; |
188 | 0 | } Unexecuted instantiation: indirection.c:fxdiv_init_uint32_t Unexecuted instantiation: portable-api.c:fxdiv_init_uint32_t Unexecuted instantiation: pthreads.c:fxdiv_init_uint32_t Unexecuted instantiation: fastpath.c:fxdiv_init_uint32_t Unexecuted instantiation: memory.c:fxdiv_init_uint32_t |
189 | | |
190 | 0 | static inline struct fxdiv_divisor_uint64_t fxdiv_init_uint64_t(uint64_t d) { |
191 | 0 | struct fxdiv_divisor_uint64_t result = { d }; |
192 | 0 | if (d == 1) { |
193 | 0 | result.m = UINT64_C(1); |
194 | 0 | result.s1 = 0; |
195 | 0 | result.s2 = 0; |
196 | 0 | } else { |
197 | | #if defined(__OPENCL_VERSION__) |
198 | | const uint32_t nlz_d = clz(d); |
199 | | const uint32_t l_minus_1 = 63 - clz(d - 1); |
200 | | #elif defined(__CUDA_ARCH__) |
201 | | const uint32_t nlz_d = __clzll((long long) d); |
202 | | const uint32_t l_minus_1 = 63 - __clzll((long long) (d - 1)); |
203 | | #elif defined(_MSC_VER) && (defined(_M_X64) || defined(_M_ARM64)) |
204 | | unsigned long l_minus_1; |
205 | | _BitScanReverse64(&l_minus_1, (unsigned __int64) (d - 1)); |
206 | | unsigned long bsr_d; |
207 | | _BitScanReverse64(&bsr_d, (unsigned __int64) d); |
208 | | const uint32_t nlz_d = bsr_d ^ 0x3F; |
209 | | #elif defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_ARM)) |
210 | | const uint64_t d_minus_1 = d - 1; |
211 | | const uint8_t d_is_power_of_2 = (d & d_minus_1) == 0; |
212 | | unsigned long l_minus_1; |
213 | | if ((uint32_t) (d_minus_1 >> 32) == 0) { |
214 | | _BitScanReverse(&l_minus_1, (unsigned long) d_minus_1); |
215 | | } else { |
216 | | _BitScanReverse(&l_minus_1, (unsigned long) (uint32_t) (d_minus_1 >> 32)); |
217 | | l_minus_1 += 32; |
218 | | } |
219 | | const uint32_t nlz_d = ((uint8_t) l_minus_1 ^ UINT8_C(0x3F)) - d_is_power_of_2; |
220 | | #elif defined(__GNUC__) && defined(__x86_64__) && FXDIV_USE_INLINE_ASSEMBLY |
221 | | uint64_t l_minus_1; |
222 | | __asm__("BSRQ %[d_minus_1], %[l_minus_1]" |
223 | | : [l_minus_1] "=r" (l_minus_1) |
224 | | : [d_minus_1] "r" (d - 1) |
225 | | : "cc"); |
226 | | #elif defined(__GNUC__) |
227 | | const uint32_t l_minus_1 = 63 - __builtin_clzll(d - 1); |
228 | 0 | const uint32_t nlz_d = __builtin_clzll(d); |
229 | | #else |
230 | | /* Based on Algorithm 2 from Hacker's delight */ |
231 | | const uint64_t d_minus_1 = d - 1; |
232 | | const uint32_t d_is_power_of_2 = (d & d_minus_1) == 0; |
233 | | uint32_t l_minus_1 = 0; |
234 | | uint32_t x = (uint32_t) d_minus_1; |
235 | | uint32_t y = d_minus_1 >> 32; |
236 | | if (y != 0) { |
237 | | l_minus_1 += 32; |
238 | | x = y; |
239 | | } |
240 | | y = x >> 16; |
241 | | if (y != 0) { |
242 | | l_minus_1 += 16; |
243 | | x = y; |
244 | | } |
245 | | y = x >> 8; |
246 | | if (y != 0) { |
247 | | l_minus_1 += 8; |
248 | | x = y; |
249 | | } |
250 | | y = x >> 4; |
251 | | if (y != 0) { |
252 | | l_minus_1 += 4; |
253 | | x = y; |
254 | | } |
255 | | y = x >> 2; |
256 | | if (y != 0) { |
257 | | l_minus_1 += 2; |
258 | | x = y; |
259 | | } |
260 | | if ((x & 2) != 0) { |
261 | | l_minus_1 += 1; |
262 | | } |
263 | | const uint32_t nlz_d = (l_minus_1 ^ UINT32_C(0x3F)) - d_is_power_of_2; |
264 | | #endif |
265 | 0 | uint64_t u_hi = (UINT64_C(2) << (uint32_t) l_minus_1) - d; |
266 | | |
267 | | /* Division of 128-bit number u_hi:UINT64_C(0) by 64-bit number d, 64-bit quotient output q */ |
268 | | #if defined(__GNUC__) && defined(__x86_64__) && FXDIV_USE_INLINE_ASSEMBLY |
269 | | uint64_t q; |
270 | | __asm__("DIVQ %[d]" |
271 | | : "=a" (q), "+d" (u_hi) |
272 | | : [d] "r" (d), "a" (UINT64_C(0)) |
273 | | : "cc"); |
274 | | #elif 0 && defined(__GNUC__) && defined(__SIZEOF_INT128__) |
275 | | /* GCC, Clang, and Intel Compiler fail to inline optimized implementation and call into support library for 128-bit division */ |
276 | | const uint64_t q = (uint64_t) (((unsigned __int128) u_hi << 64) / ((unsigned __int128) d)); |
277 | | #elif (defined(_MSC_VER) && _MSC_VER >= 1920) && !defined(__clang__) && !defined(__INTEL_COMPILER) && defined(_M_X64) |
278 | | unsigned __int64 remainder; |
279 | | const uint64_t q = (uint64_t) _udiv128((unsigned __int64) u_hi, 0, (unsigned __int64) d, &remainder); |
280 | | #else |
281 | | /* Implementation based on code from Hacker's delight */ |
282 | | |
283 | | /* Normalize divisor and shift divident left */ |
284 | 0 | d <<= nlz_d; |
285 | 0 | u_hi <<= nlz_d; |
286 | | /* Break divisor up into two 32-bit digits */ |
287 | 0 | const uint64_t d_hi = (uint32_t) (d >> 32); |
288 | 0 | const uint32_t d_lo = (uint32_t) d; |
289 | | |
290 | | /* Compute the first quotient digit, q1 */ |
291 | 0 | uint64_t q1 = u_hi / d_hi; |
292 | 0 | uint64_t r1 = u_hi - q1 * d_hi; |
293 | |
|
294 | 0 | while ((q1 >> 32) != 0 || fxdiv_mulext_uint32_t((uint32_t) q1, d_lo) > (r1 << 32)) { |
295 | 0 | q1 -= 1; |
296 | 0 | r1 += d_hi; |
297 | 0 | if ((r1 >> 32) != 0) { |
298 | 0 | break; |
299 | 0 | } |
300 | 0 | } |
301 | | |
302 | | /* Multiply and subtract. */ |
303 | 0 | u_hi = (u_hi << 32) - q1 * d; |
304 | | |
305 | | /* Compute the second quotient digit, q0 */ |
306 | 0 | uint64_t q0 = u_hi / d_hi; |
307 | 0 | uint64_t r0 = u_hi - q0 * d_hi; |
308 | |
|
309 | 0 | while ((q0 >> 32) != 0 || fxdiv_mulext_uint32_t((uint32_t) q0, d_lo) > (r0 << 32)) { |
310 | 0 | q0 -= 1; |
311 | 0 | r0 += d_hi; |
312 | 0 | if ((r0 >> 32) != 0) { |
313 | 0 | break; |
314 | 0 | } |
315 | 0 | } |
316 | 0 | const uint64_t q = (q1 << 32) | (uint32_t) q0; |
317 | 0 | #endif |
318 | 0 | result.m = q + UINT64_C(1); |
319 | 0 | result.s1 = 1; |
320 | 0 | result.s2 = (uint8_t) l_minus_1; |
321 | 0 | } |
322 | 0 | return result; |
323 | 0 | } Unexecuted instantiation: indirection.c:fxdiv_init_uint64_t Unexecuted instantiation: portable-api.c:fxdiv_init_uint64_t Unexecuted instantiation: pthreads.c:fxdiv_init_uint64_t Unexecuted instantiation: fastpath.c:fxdiv_init_uint64_t Unexecuted instantiation: memory.c:fxdiv_init_uint64_t |
324 | | |
325 | 0 | static inline struct fxdiv_divisor_size_t fxdiv_init_size_t(size_t d) { |
326 | | #if SIZE_MAX == UINT32_MAX |
327 | | const struct fxdiv_divisor_uint32_t uint_result = fxdiv_init_uint32_t((uint32_t) d); |
328 | | #elif SIZE_MAX == UINT64_MAX |
329 | | const struct fxdiv_divisor_uint64_t uint_result = fxdiv_init_uint64_t((uint64_t) d); |
330 | | #else |
331 | | #error Unsupported platform |
332 | | #endif |
333 | 0 | struct fxdiv_divisor_size_t size_result = { |
334 | 0 | (size_t) uint_result.value, |
335 | 0 | (size_t) uint_result.m, |
336 | 0 | uint_result.s1, |
337 | 0 | uint_result.s2 |
338 | 0 | }; |
339 | 0 | return size_result; |
340 | 0 | } Unexecuted instantiation: indirection.c:fxdiv_init_size_t Unexecuted instantiation: portable-api.c:fxdiv_init_size_t Unexecuted instantiation: pthreads.c:fxdiv_init_size_t Unexecuted instantiation: fastpath.c:fxdiv_init_size_t Unexecuted instantiation: memory.c:fxdiv_init_size_t |
341 | | |
342 | 0 | static inline uint32_t fxdiv_quotient_uint32_t(uint32_t n, const struct fxdiv_divisor_uint32_t divisor) { |
343 | 0 | const uint32_t t = fxdiv_mulhi_uint32_t(n, divisor.m); |
344 | 0 | return (t + ((n - t) >> divisor.s1)) >> divisor.s2; |
345 | 0 | } Unexecuted instantiation: indirection.c:fxdiv_quotient_uint32_t Unexecuted instantiation: portable-api.c:fxdiv_quotient_uint32_t Unexecuted instantiation: pthreads.c:fxdiv_quotient_uint32_t Unexecuted instantiation: fastpath.c:fxdiv_quotient_uint32_t Unexecuted instantiation: memory.c:fxdiv_quotient_uint32_t |
346 | | |
347 | 0 | static inline uint64_t fxdiv_quotient_uint64_t(uint64_t n, const struct fxdiv_divisor_uint64_t divisor) { |
348 | 0 | const uint64_t t = fxdiv_mulhi_uint64_t(n, divisor.m); |
349 | 0 | return (t + ((n - t) >> divisor.s1)) >> divisor.s2; |
350 | 0 | } Unexecuted instantiation: indirection.c:fxdiv_quotient_uint64_t Unexecuted instantiation: portable-api.c:fxdiv_quotient_uint64_t Unexecuted instantiation: pthreads.c:fxdiv_quotient_uint64_t Unexecuted instantiation: fastpath.c:fxdiv_quotient_uint64_t Unexecuted instantiation: memory.c:fxdiv_quotient_uint64_t |
351 | | |
352 | 0 | static inline size_t fxdiv_quotient_size_t(size_t n, const struct fxdiv_divisor_size_t divisor) { |
353 | | #if SIZE_MAX == UINT32_MAX |
354 | | const struct fxdiv_divisor_uint32_t uint32_divisor = { |
355 | | (uint32_t) divisor.value, |
356 | | (uint32_t) divisor.m, |
357 | | divisor.s1, |
358 | | divisor.s2 |
359 | | }; |
360 | | return fxdiv_quotient_uint32_t((uint32_t) n, uint32_divisor); |
361 | | #elif SIZE_MAX == UINT64_MAX |
362 | | const struct fxdiv_divisor_uint64_t uint64_divisor = { |
363 | 0 | (uint64_t) divisor.value, |
364 | 0 | (uint64_t) divisor.m, |
365 | 0 | divisor.s1, |
366 | 0 | divisor.s2 |
367 | 0 | }; |
368 | 0 | return fxdiv_quotient_uint64_t((uint64_t) n, uint64_divisor); |
369 | | #else |
370 | | #error Unsupported platform |
371 | | #endif |
372 | 0 | } Unexecuted instantiation: indirection.c:fxdiv_quotient_size_t Unexecuted instantiation: portable-api.c:fxdiv_quotient_size_t Unexecuted instantiation: pthreads.c:fxdiv_quotient_size_t Unexecuted instantiation: fastpath.c:fxdiv_quotient_size_t Unexecuted instantiation: memory.c:fxdiv_quotient_size_t |
373 | | |
374 | 0 | static inline uint32_t fxdiv_remainder_uint32_t(uint32_t n, const struct fxdiv_divisor_uint32_t divisor) { |
375 | 0 | const uint32_t quotient = fxdiv_quotient_uint32_t(n, divisor); |
376 | 0 | return n - quotient * divisor.value; |
377 | 0 | } Unexecuted instantiation: indirection.c:fxdiv_remainder_uint32_t Unexecuted instantiation: portable-api.c:fxdiv_remainder_uint32_t Unexecuted instantiation: pthreads.c:fxdiv_remainder_uint32_t Unexecuted instantiation: fastpath.c:fxdiv_remainder_uint32_t Unexecuted instantiation: memory.c:fxdiv_remainder_uint32_t |
378 | | |
379 | 0 | static inline uint64_t fxdiv_remainder_uint64_t(uint64_t n, const struct fxdiv_divisor_uint64_t divisor) { |
380 | 0 | const uint64_t quotient = fxdiv_quotient_uint64_t(n, divisor); |
381 | 0 | return n - quotient * divisor.value; |
382 | 0 | } Unexecuted instantiation: indirection.c:fxdiv_remainder_uint64_t Unexecuted instantiation: portable-api.c:fxdiv_remainder_uint64_t Unexecuted instantiation: pthreads.c:fxdiv_remainder_uint64_t Unexecuted instantiation: fastpath.c:fxdiv_remainder_uint64_t Unexecuted instantiation: memory.c:fxdiv_remainder_uint64_t |
383 | | |
384 | 0 | static inline size_t fxdiv_remainder_size_t(size_t n, const struct fxdiv_divisor_size_t divisor) { |
385 | 0 | const size_t quotient = fxdiv_quotient_size_t(n, divisor); |
386 | 0 | return n - quotient * divisor.value; |
387 | 0 | } Unexecuted instantiation: indirection.c:fxdiv_remainder_size_t Unexecuted instantiation: portable-api.c:fxdiv_remainder_size_t Unexecuted instantiation: pthreads.c:fxdiv_remainder_size_t Unexecuted instantiation: fastpath.c:fxdiv_remainder_size_t Unexecuted instantiation: memory.c:fxdiv_remainder_size_t |
388 | | |
389 | 0 | static inline uint32_t fxdiv_round_down_uint32_t(uint32_t n, const struct fxdiv_divisor_uint32_t granularity) { |
390 | 0 | const uint32_t quotient = fxdiv_quotient_uint32_t(n, granularity); |
391 | 0 | return quotient * granularity.value; |
392 | 0 | } Unexecuted instantiation: indirection.c:fxdiv_round_down_uint32_t Unexecuted instantiation: portable-api.c:fxdiv_round_down_uint32_t Unexecuted instantiation: pthreads.c:fxdiv_round_down_uint32_t Unexecuted instantiation: fastpath.c:fxdiv_round_down_uint32_t Unexecuted instantiation: memory.c:fxdiv_round_down_uint32_t |
393 | | |
394 | 0 | static inline uint64_t fxdiv_round_down_uint64_t(uint64_t n, const struct fxdiv_divisor_uint64_t granularity) { |
395 | 0 | const uint64_t quotient = fxdiv_quotient_uint64_t(n, granularity); |
396 | 0 | return quotient * granularity.value; |
397 | 0 | } Unexecuted instantiation: indirection.c:fxdiv_round_down_uint64_t Unexecuted instantiation: portable-api.c:fxdiv_round_down_uint64_t Unexecuted instantiation: pthreads.c:fxdiv_round_down_uint64_t Unexecuted instantiation: fastpath.c:fxdiv_round_down_uint64_t Unexecuted instantiation: memory.c:fxdiv_round_down_uint64_t |
398 | | |
399 | 0 | static inline size_t fxdiv_round_down_size_t(size_t n, const struct fxdiv_divisor_size_t granularity) { |
400 | 0 | const size_t quotient = fxdiv_quotient_size_t(n, granularity); |
401 | 0 | return quotient * granularity.value; |
402 | 0 | } Unexecuted instantiation: indirection.c:fxdiv_round_down_size_t Unexecuted instantiation: portable-api.c:fxdiv_round_down_size_t Unexecuted instantiation: pthreads.c:fxdiv_round_down_size_t Unexecuted instantiation: fastpath.c:fxdiv_round_down_size_t Unexecuted instantiation: memory.c:fxdiv_round_down_size_t |
403 | | |
404 | 0 | static inline struct fxdiv_result_uint32_t fxdiv_divide_uint32_t(uint32_t n, const struct fxdiv_divisor_uint32_t divisor) { |
405 | 0 | const uint32_t quotient = fxdiv_quotient_uint32_t(n, divisor); |
406 | 0 | const uint32_t remainder = n - quotient * divisor.value; |
407 | 0 | struct fxdiv_result_uint32_t result = { quotient, remainder }; |
408 | 0 | return result; |
409 | 0 | } Unexecuted instantiation: indirection.c:fxdiv_divide_uint32_t Unexecuted instantiation: portable-api.c:fxdiv_divide_uint32_t Unexecuted instantiation: pthreads.c:fxdiv_divide_uint32_t Unexecuted instantiation: fastpath.c:fxdiv_divide_uint32_t Unexecuted instantiation: memory.c:fxdiv_divide_uint32_t |
410 | | |
411 | 0 | static inline struct fxdiv_result_uint64_t fxdiv_divide_uint64_t(uint64_t n, const struct fxdiv_divisor_uint64_t divisor) { |
412 | 0 | const uint64_t quotient = fxdiv_quotient_uint64_t(n, divisor); |
413 | 0 | const uint64_t remainder = n - quotient * divisor.value; |
414 | 0 | struct fxdiv_result_uint64_t result = { quotient, remainder }; |
415 | 0 | return result; |
416 | 0 | } Unexecuted instantiation: indirection.c:fxdiv_divide_uint64_t Unexecuted instantiation: portable-api.c:fxdiv_divide_uint64_t Unexecuted instantiation: pthreads.c:fxdiv_divide_uint64_t Unexecuted instantiation: fastpath.c:fxdiv_divide_uint64_t Unexecuted instantiation: memory.c:fxdiv_divide_uint64_t |
417 | | |
418 | 0 | static inline struct fxdiv_result_size_t fxdiv_divide_size_t(size_t n, const struct fxdiv_divisor_size_t divisor) { |
419 | 0 | const size_t quotient = fxdiv_quotient_size_t(n, divisor); |
420 | 0 | const size_t remainder = n - quotient * divisor.value; |
421 | 0 | struct fxdiv_result_size_t result = { quotient, remainder }; |
422 | 0 | return result; |
423 | 0 | } Unexecuted instantiation: indirection.c:fxdiv_divide_size_t Unexecuted instantiation: portable-api.c:fxdiv_divide_size_t Unexecuted instantiation: pthreads.c:fxdiv_divide_size_t Unexecuted instantiation: fastpath.c:fxdiv_divide_size_t Unexecuted instantiation: memory.c:fxdiv_divide_size_t |
424 | | |
425 | | #endif /* FXDIV_H */ |