Added NzMultiplyAdd

Use hardware FMA (or at least faster FMA) when possible


Former-commit-id: fd5134d2aebe924fb8c9148224101dd7d340bb5f
This commit is contained in:
Lynix 2013-12-09 14:13:37 +01:00
parent 23da4ce420
commit b05f813e70
2 changed files with 31 additions and 0 deletions

View File

@ -24,6 +24,7 @@ template<typename T> T NzApproach(T value, T objective, T increment);
template<typename T> T NzClamp(T value, T min, T max);
template<typename T> T NzDegrees(T degrees);
template<typename T> T NzDegreeToRadian(T degrees);
template<typename T> T NzMultiplyAdd(T x, T y, T z);
unsigned int NzIntegralPow(unsigned int base, unsigned int exponent);
unsigned int NzGetNearestPowerOfTwo(unsigned int number);
unsigned int NzGetNumberLength(signed char number);

View File

@ -50,6 +50,36 @@ T NzDegreeToRadian(T degrees)
return degrees * F(M_PI/180.0);
}
template<typename T>
T NzMultiplyAdd(T x, T y, T z)
{
return x*y + z;
}
#ifdef FP_FAST_FMAF
template<>
inline float NzMultiplyAdd(float x, float y, float z)
{
return std::fmaf(x, y, z);
}
#endif
#ifdef FP_FAST_FMA
template<>
inline double NzMultiplyAdd(double x, double y, double z)
{
return std::fma(x, y, z);
}
#endif
#ifdef FP_FAST_FMAL
template<>
inline long double NzMultiplyAdd(long double x, long double y, long double z)
{
return std::fmal(x, y, z);
}
#endif
inline unsigned int NzIntegralPow(unsigned int base, unsigned int exponent)
{
unsigned int r = 1;