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