From 5feadd8b6ab6470f1904dbf389f5dd4260064130 Mon Sep 17 00:00:00 2001 From: Sam Hocevar Date: Sun, 4 Sep 2011 13:46:16 +0000 Subject: [PATCH] core: fix PS3 compilation; the lol_fdiv implementation was missing. --- src/trig.cpp | 46 +++++++++++++++++++++++++++++++++++----------- 1 file changed, 35 insertions(+), 11 deletions(-) diff --git a/src/trig.cpp b/src/trig.cpp index ac9ea31d..a2b7d958 100644 --- a/src/trig.cpp +++ b/src/trig.cpp @@ -95,13 +95,13 @@ static inline double lol_fctid(double x) INLINEATTR; static inline double lol_fctidz(double x) INLINEATTR; static inline double lol_fcfid(double x) INLINEATTR; static inline double lol_frsqrte(double x) INLINEATTR; -#endif static inline double lol_fsel(double c, double gte, double lt) INLINEATTR; +static inline double lol_fres(double x) INLINEATTR; +static inline double lol_fdiv(double a, double b) INLINEATTR; +#endif static inline double lol_fabs(double x) INLINEATTR; static inline double lol_round(double x) INLINEATTR; static inline double lol_trunc(double x) INLINEATTR; -static inline double lol_round(double x) INLINEATTR; -static inline double lol_trunc(double x) INLINEATTR; #if defined __CELLOS_LV2__ static inline double lol_fctid(double x) @@ -111,7 +111,7 @@ static inline double lol_fctid(double x) r = __builtin_fctid(x); #else __asm__ ("fctid %0, %1" - : "=f"(r) : "f"(x)); + : "=f" (r) : "f" (x)); #endif return r; } @@ -123,7 +123,7 @@ static double lol_fctidz(double x) r = __builtin_fctidz(x); #else __asm__ ("fctidz %0, %1" - : "=f"(r) : "f"(x)); + : "=f" (r) : "f" (x)); #endif return r; } @@ -135,7 +135,7 @@ static double lol_fcfid(double x) r = __builtin_fcfid(x); #else __asm__ ("fcfid %0, %1" - : "=f"(r) : "f"(x)); + : "=f" (r) : "f" (x)); #endif return r; } @@ -147,11 +147,10 @@ static double lol_frsqrte(double x) #else double r; __asm__ ("frsqrte %0, %1" - : "=f"(r) : "f"(x)); + : "=f" (r) : "f" (x)); return r; #endif } -#endif /* __CELLOS_LV2__ */ static inline double lol_fsel(double c, double gte, double lt) { @@ -160,13 +159,38 @@ static inline double lol_fsel(double c, double gte, double lt) #elif defined __CELLOS_LV2__ double r; __asm__ ("fsel %0, %1, %2, %3" - : "=f"(r) : "f"(c), "f"(gte), "f"(lt)); + : "=f" (r) : "f" (c), "f" (gte), "f" (lt)); return r; #else return (c >= 0) ? gte : lt; #endif } +static inline double lol_fres(double x) +{ + double ret; +#if defined __SNC__ + ret = __builtin_fre(x); +#else + __asm__ ("fres %0, %1" + : "=f" (ret) : "f" (x)); +#endif + return ret; +} + +static inline double lol_fdiv(double a, double b) +{ + /* Estimate */ + double x0 = lol_fres(b); + + /* Two steps of Newton-Raphson */ + x0 = (b * x0 - ONE) * -x0 + x0; + x0 = (b * x0 - ONE) * -x0 + x0; + + return a * x0; +} +#endif /* __CELLOS_LV2__ */ + static inline double lol_fabs(double x) { #if defined __CELLOS_LV2__ && defined __SNC__ @@ -174,7 +198,7 @@ static inline double lol_fabs(double x) #elif defined __CELLOS_LV2__ double r; __asm__ ("fabs %0, %1" - : "=f"(r) : "f"(x)); + : "=f" (r) : "f" (x)); return r; #else return __builtin_fabs(x); @@ -470,7 +494,7 @@ double lol_tan(double x) #if defined __CELLOS_LV2__ double is_cos_not_zero = absc - VERY_SMALL_NUMBER; cosx = lol_fsel(is_cos_not_zero, cosx, VERY_SMALL_NUMBER); - return __fdiv(sinx, cosx); + return lol_fdiv(sinx, cosx); #else if (__unlikely(absc < VERY_SMALL_NUMBER)) cosx = VERY_SMALL_NUMBER;