Coverage Report

Created: 2025-12-31 06:27

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/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 */