Changeset 902


Ignore:
Timestamp:
Sep 4, 2011, 3:46:16 PM (8 years ago)
Author:
sam
Message:

core: fix PS3 compilation; the lol_fdiv implementation was missing.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/trig.cpp

    r901 r902  
    9696static inline double lol_fcfid(double x) INLINEATTR;
    9797static inline double lol_frsqrte(double x) INLINEATTR;
    98 #endif
    9998static inline double lol_fsel(double c, double gte, double lt) INLINEATTR;
     99static inline double lol_fres(double x) INLINEATTR;
     100static inline double lol_fdiv(double a, double b) INLINEATTR;
     101#endif
    100102static inline double lol_fabs(double x) INLINEATTR;
    101103static inline double lol_round(double x) INLINEATTR;
    102104static inline double lol_trunc(double x) INLINEATTR;
    103 static inline double lol_round(double x) INLINEATTR;
    104 static inline double lol_trunc(double x) INLINEATTR;
    105105
    106106#if defined __CELLOS_LV2__
     
    112112#else
    113113    __asm__ ("fctid %0, %1"
    114              : "=f"(r) : "f"(x));
     114             : "=f" (r) : "f" (x));
    115115#endif
    116116    return r;
     
    124124#else
    125125    __asm__ ("fctidz %0, %1"
    126              : "=f"(r) : "f"(x));
     126             : "=f" (r) : "f" (x));
    127127#endif
    128128    return r;
     
    136136#else
    137137    __asm__ ("fcfid %0, %1"
    138              : "=f"(r) : "f"(x));
     138             : "=f" (r) : "f" (x));
    139139#endif
    140140    return r;
     
    148148    double r;
    149149    __asm__ ("frsqrte %0, %1"
    150              : "=f"(r) : "f"(x));
     150             : "=f" (r) : "f" (x));
    151151    return r;
    152152#endif
    153153}
    154 #endif /* __CELLOS_LV2__ */
    155154
    156155static inline double lol_fsel(double c, double gte, double lt)
     
    161160    double r;
    162161    __asm__ ("fsel %0, %1, %2, %3"
    163              : "=f"(r) : "f"(c), "f"(gte), "f"(lt));
     162             : "=f" (r) : "f" (c), "f" (gte), "f" (lt));
    164163    return r;
    165164#else
     
    167166#endif
    168167}
     168
     169static inline double lol_fres(double x)
     170{
     171    double ret;
     172#if defined __SNC__
     173    ret = __builtin_fre(x);
     174#else
     175    __asm__ ("fres %0, %1"
     176             : "=f" (ret) : "f" (x));
     177#endif
     178    return ret;
     179}
     180
     181static inline double lol_fdiv(double a, double b)
     182{
     183    /* Estimate */
     184    double x0 = lol_fres(b);
     185
     186    /* Two steps of Newton-Raphson */
     187    x0 = (b * x0 - ONE) * -x0 + x0;
     188    x0 = (b * x0 - ONE) * -x0 + x0;
     189
     190    return a * x0;
     191}
     192#endif /* __CELLOS_LV2__ */
    169193
    170194static inline double lol_fabs(double x)
     
    175199    double r;
    176200    __asm__ ("fabs %0, %1"
    177              : "=f"(r) : "f"(x));
     201             : "=f" (r) : "f" (x));
    178202    return r;
    179203#else
     
    471495    double is_cos_not_zero = absc - VERY_SMALL_NUMBER;
    472496    cosx = lol_fsel(is_cos_not_zero, cosx, VERY_SMALL_NUMBER);
    473     return __fdiv(sinx, cosx);
     497    return lol_fdiv(sinx, cosx);
    474498#else
    475499    if (__unlikely(absc < VERY_SMALL_NUMBER))
Note: See TracChangeset for help on using the changeset viewer.