f04519d809
Exported header files for use by applications should be self sufficient and allow out of order inclusion. Moreover, they must include all the system headers they need for types and macros. This commit prevents the following errors: error: `RTE_MAX_LCORE' undeclared here (not in a function) error: `RTE_LPM_VALID_EXT_ENTRY_BITMASK' undeclared (first use in this function) error: #error "Unsupported cache line size" error: `asm' undeclared (first use in this function) error: implicit declaration of function `[...]' error: unknown type name `[...]' error: field `mac_addr' has incomplete type error: `CHAR_BIT' undeclared here (not in a function) error: `struct [...]' declared inside parameter list error: unknown type name `uint8_t' Signed-off-by: Adrien Mazarguil <adrien.mazarguil@6wind.com>
42 lines
1.1 KiB
C
42 lines
1.1 KiB
C
/*
|
|
* Reciprocal divide
|
|
*
|
|
* Used with permission from original authors
|
|
* Hannes Frederic Sowa and Daniel Borkmann
|
|
*
|
|
* This algorithm is based on the paper "Division by Invariant
|
|
* Integers Using Multiplication" by Torbjörn Granlund and Peter
|
|
* L. Montgomery.
|
|
*
|
|
* The assembler implementation from Agner Fog, which this code is
|
|
* based on, can be found here:
|
|
* http://www.agner.org/optimize/asmlib.zip
|
|
*
|
|
* This optimization for A/B is helpful if the divisor B is mostly
|
|
* runtime invariant. The reciprocal of B is calculated in the
|
|
* slow-path with reciprocal_value(). The fast-path can then just use
|
|
* a much faster multiplication operation with a variable dividend A
|
|
* to calculate the division A/B.
|
|
*/
|
|
|
|
#ifndef _RTE_RECIPROCAL_H_
|
|
#define _RTE_RECIPROCAL_H_
|
|
|
|
#include <stdint.h>
|
|
|
|
struct rte_reciprocal {
|
|
uint32_t m;
|
|
uint8_t sh1, sh2;
|
|
};
|
|
|
|
static inline uint32_t rte_reciprocal_divide(uint32_t a, struct rte_reciprocal R)
|
|
{
|
|
uint32_t t = (uint32_t)(((uint64_t)a * R.m) >> 32);
|
|
|
|
return (t + ((a - t) >> R.sh1)) >> R.sh2;
|
|
}
|
|
|
|
struct rte_reciprocal rte_reciprocal_value(uint32_t d);
|
|
|
|
#endif /* _RTE_RECIPROCAL_H_ */
|