| // Copyright lowRISC contributors. | 
 | // Licensed under the Apache License, Version 2.0, see LICENSE for details. | 
 | // SPDX-License-Identifier: Apache-2.0 | 
 |  | 
 | #ifndef OPENTITAN_SW_DEVICE_LIB_BASE_MATH_H_ | 
 | #define OPENTITAN_SW_DEVICE_LIB_BASE_MATH_H_ | 
 |  | 
 | #include <stdint.h> | 
 |  | 
 | #ifdef __cplusplus | 
 | extern "C" { | 
 | #endif  // __cplusplus | 
 |  | 
 | /** | 
 |  * @file | 
 |  * @brief  Math helper functions. | 
 |  */ | 
 |  | 
 | /** | 
 |  * Computes the 64-bit quotient `a / b` by way of schoolbook long division. | 
 |  * | 
 |  * This function is intentionally very slow: 64-bit divisions should not be | 
 |  * a frequent occurence, and faster algorithms result in unreasonable code-size | 
 |  * expenditure. | 
 |  * | 
 |  * Performing division with the / operator in C code that runs on a 32-bit | 
 |  * device can emit a polyfill like `__udivdi3`; normally, this would | 
 |  * be provided by a compiler runtime like libgcc_s, but we intentionally do not | 
 |  * link that into on-device binaries. This function should be use to resolve | 
 |  * link errors involving `__udiv` symbols. We do not provide a libgcc-style | 
 |  * linker alias for this function, because this operation should be explicit and | 
 |  * not over-used. | 
 |  * | 
 |  * If passed a non-null pointer, this function will also provide the remainder | 
 |  * as a side-product. | 
 |  * | 
 |  * If `b == 0`, this function produces undefined behavior (in practice, a | 
 |  * garbage result or a loop without forward progress). | 
 |  * | 
 |  * @param a The dividend. | 
 |  * @param b The divisor. | 
 |  * @param[out] rem_out An optional out-parameter for the remainder. | 
 |  * @return The quotient. | 
 |  */ | 
 | uint64_t udiv64_slow(uint64_t a, uint64_t b, uint64_t *rem_out); | 
 |  | 
 | #ifdef __cplusplus | 
 | }  // extern "C" | 
 | #endif  // __cplusplus | 
 |  | 
 | #endif  // OPENTITAN_SW_DEVICE_LIB_BASE_MATH_H_ |