| @@ -95,13 +95,13 @@ static inline double lol_fctid(double x) INLINEATTR; | |||||
| static inline double lol_fctidz(double x) INLINEATTR; | static inline double lol_fctidz(double x) INLINEATTR; | ||||
| static inline double lol_fcfid(double x) INLINEATTR; | static inline double lol_fcfid(double x) INLINEATTR; | ||||
| static inline double lol_frsqrte(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_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_fabs(double x) INLINEATTR; | ||||
| static inline double lol_round(double x) INLINEATTR; | static inline double lol_round(double x) INLINEATTR; | ||||
| static inline double lol_trunc(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__ | #if defined __CELLOS_LV2__ | ||||
| static inline double lol_fctid(double x) | static inline double lol_fctid(double x) | ||||
| @@ -111,7 +111,7 @@ static inline double lol_fctid(double x) | |||||
| r = __builtin_fctid(x); | r = __builtin_fctid(x); | ||||
| #else | #else | ||||
| __asm__ ("fctid %0, %1" | __asm__ ("fctid %0, %1" | ||||
| : "=f"(r) : "f"(x)); | |||||
| : "=f" (r) : "f" (x)); | |||||
| #endif | #endif | ||||
| return r; | return r; | ||||
| } | } | ||||
| @@ -123,7 +123,7 @@ static double lol_fctidz(double x) | |||||
| r = __builtin_fctidz(x); | r = __builtin_fctidz(x); | ||||
| #else | #else | ||||
| __asm__ ("fctidz %0, %1" | __asm__ ("fctidz %0, %1" | ||||
| : "=f"(r) : "f"(x)); | |||||
| : "=f" (r) : "f" (x)); | |||||
| #endif | #endif | ||||
| return r; | return r; | ||||
| } | } | ||||
| @@ -135,7 +135,7 @@ static double lol_fcfid(double x) | |||||
| r = __builtin_fcfid(x); | r = __builtin_fcfid(x); | ||||
| #else | #else | ||||
| __asm__ ("fcfid %0, %1" | __asm__ ("fcfid %0, %1" | ||||
| : "=f"(r) : "f"(x)); | |||||
| : "=f" (r) : "f" (x)); | |||||
| #endif | #endif | ||||
| return r; | return r; | ||||
| } | } | ||||
| @@ -147,11 +147,10 @@ static double lol_frsqrte(double x) | |||||
| #else | #else | ||||
| double r; | double r; | ||||
| __asm__ ("frsqrte %0, %1" | __asm__ ("frsqrte %0, %1" | ||||
| : "=f"(r) : "f"(x)); | |||||
| : "=f" (r) : "f" (x)); | |||||
| return r; | return r; | ||||
| #endif | #endif | ||||
| } | } | ||||
| #endif /* __CELLOS_LV2__ */ | |||||
| static inline double lol_fsel(double c, double gte, double lt) | 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__ | #elif defined __CELLOS_LV2__ | ||||
| double r; | double r; | ||||
| __asm__ ("fsel %0, %1, %2, %3" | __asm__ ("fsel %0, %1, %2, %3" | ||||
| : "=f"(r) : "f"(c), "f"(gte), "f"(lt)); | |||||
| : "=f" (r) : "f" (c), "f" (gte), "f" (lt)); | |||||
| return r; | return r; | ||||
| #else | #else | ||||
| return (c >= 0) ? gte : lt; | return (c >= 0) ? gte : lt; | ||||
| #endif | #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) | static inline double lol_fabs(double x) | ||||
| { | { | ||||
| #if defined __CELLOS_LV2__ && defined __SNC__ | #if defined __CELLOS_LV2__ && defined __SNC__ | ||||
| @@ -174,7 +198,7 @@ static inline double lol_fabs(double x) | |||||
| #elif defined __CELLOS_LV2__ | #elif defined __CELLOS_LV2__ | ||||
| double r; | double r; | ||||
| __asm__ ("fabs %0, %1" | __asm__ ("fabs %0, %1" | ||||
| : "=f"(r) : "f"(x)); | |||||
| : "=f" (r) : "f" (x)); | |||||
| return r; | return r; | ||||
| #else | #else | ||||
| return __builtin_fabs(x); | return __builtin_fabs(x); | ||||
| @@ -470,7 +494,7 @@ double lol_tan(double x) | |||||
| #if defined __CELLOS_LV2__ | #if defined __CELLOS_LV2__ | ||||
| double is_cos_not_zero = absc - VERY_SMALL_NUMBER; | double is_cos_not_zero = absc - VERY_SMALL_NUMBER; | ||||
| cosx = lol_fsel(is_cos_not_zero, cosx, VERY_SMALL_NUMBER); | cosx = lol_fsel(is_cos_not_zero, cosx, VERY_SMALL_NUMBER); | ||||
| return __fdiv(sinx, cosx); | |||||
| return lol_fdiv(sinx, cosx); | |||||
| #else | #else | ||||
| if (__unlikely(absc < VERY_SMALL_NUMBER)) | if (__unlikely(absc < VERY_SMALL_NUMBER)) | ||||
| cosx = VERY_SMALL_NUMBER; | cosx = VERY_SMALL_NUMBER; | ||||