1 /*
2  * Copyright 2020, Data61, CSIRO (ABN 41 687 119 230)
3  *
4  * SPDX-License-Identifier: GPL-2.0-only
5  */
6 
7 #pragma once
8 
9 #include <config.h>
10 #include <types.h>
11 #include <arch/model/statedata.h>
12 
div64(uint64_t numerator,uint32_t denominator)13 static inline CONST uint64_t div64(uint64_t numerator, uint32_t denominator)
14 {
15     uint64_t quotient = 0llu;
16     uint64_t long_denom = (uint64_t) denominator;
17 
18     if (unlikely(denominator > numerator)) {
19         return 0;
20     }
21 
22     assert(numerator > 0);
23     assert(denominator > 0);
24 
25     /* align denominator to numerator */
26     uint64_t c = ((uint64_t) 32u + clzl(denominator)) - clzll(numerator);
27     long_denom = long_denom << c;
28 
29     /* perform binary long division */
30     while (c < UINT64_MAX) {
31         if (numerator >= long_denom) {
32             numerator -= long_denom;
33             quotient |= (1llu << c);
34         }
35         c--;
36         long_denom = long_denom >> 1llu;
37     }
38 
39     return quotient;
40 }
41 
42