| 16 | #define CBM_NSEC_PER_SEC 1000000000ULL |
| 17 | |
| 18 | static uint64_t cbm_platform_scale_fraction(uint64_t remainder, uint64_t multiplier, |
| 19 | uint64_t divisor) { |
| 20 | uint64_t quotient = 0; |
| 21 | uint64_t reduced = 0; |
| 22 | uint64_t mask = 1; |
| 23 | while (mask <= multiplier / 2) { |
| 24 | mask <<= 1U; |
| 25 | } |
| 26 | for (; mask != 0; mask >>= 1U) { |
| 27 | quotient *= 2; |
| 28 | if (reduced >= divisor - reduced) { |
| 29 | reduced -= divisor - reduced; |
| 30 | quotient++; |
| 31 | } else { |
| 32 | reduced += reduced; |
| 33 | } |
| 34 | if ((multiplier & mask) != 0) { |
| 35 | if (reduced >= divisor - remainder) { |
| 36 | reduced -= divisor - remainder; |
| 37 | quotient++; |
| 38 | } else { |
| 39 | reduced += remainder; |
| 40 | } |
| 41 | } |
| 42 | } |
| 43 | return quotient; |
| 44 | } |
| 45 | |
| 46 | uint64_t cbm_platform_scale_counter_ns(uint64_t counter, uint64_t frequency) { |
| 47 | if (frequency == 0) { |
no outgoing calls
no test coverage detected