| // 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_ |