diff options
| author | Random <28494085+Random06457@users.noreply.github.com> | 2020-10-03 17:22:44 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-10-03 11:22:44 -0400 |
| commit | 174af7384d1cfcbf15da02d9069bf02bdc433c20 (patch) | |
| tree | e4fb18346f71047c123ec4d34a80ae7e4d8ab9ea /src/libultra_code_O2/cosf.c | |
| parent | 6136ee6debd570a63fc695a6f4664553303f2324 (diff) | |
libultra cleanup (#215)
* cleanup libultra
* fixes
- use quotes instead of <> for includes
- add macros for zelda specific thread priorities
- fix Makefile
- properly format the remaining pfs structs
* fix button macros + add CHECK_BTN_ANY/CHECK_BTN_ALL
* remove ULTRA_ABS
* fix includes
* update z_player.c/z_lib.c + run format.sh
* merge upstream/master
* fix include in En_Goroiwa
* fix includes
Diffstat (limited to 'src/libultra_code_O2/cosf.c')
| -rw-r--r-- | src/libultra_code_O2/cosf.c | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/src/libultra_code_O2/cosf.c b/src/libultra_code_O2/cosf.c new file mode 100644 index 000000000..56ef995c7 --- /dev/null +++ b/src/libultra_code_O2/cosf.c @@ -0,0 +1,64 @@ +#include "ultra64.h" +#include "global.h" + +static const du P[] = { + { 0x3FF00000, 0x00000000 }, { 0xBFC55554, 0xBC83656D }, { 0x3F8110ED, 0x3804C2A0 }, + { 0xBF29f6FF, 0xEEA56814 }, { 0x3EC5DBDF, 0x0E314BFE }, +}; + +static const du rpi = { 0x3FD45F30, 0x6DC9C883 }; + +static const du pihi = { 0x400921FB, 0x50000000 }; + +static const du pilo = { 0x3E6110B4, 0x611A6263 }; + +static const fu zero = { 0x00000000 }; + +f32 cosf(f32 x) { + f32 absx; + f64 dx; + f64 xSq; + f64 polyApprox; + f64 dn; + s32 n; + f64 result; + s32 ix, xpt; + + ix = *(s32*)&x; + xpt = (ix >> 22); + xpt &= 0x1FF; + + if (xpt < 0x136) { + + absx = (x > 0) ? x : -x; + + dx = absx; + + dn = dx * rpi.d + 0.5; + n = ROUND(dn); + dn = n; + + dn -= 0.5; + + dx -= dn * pihi.d; + dx -= dn * pilo.d; + + xSq = SQ(dx); + + polyApprox = ((P[4].d * xSq + P[3].d) * xSq + P[2].d) * xSq + P[1].d; + + result = dx + (dx * xSq) * polyApprox; + + if (!(n & 1)) { + return (f32)result; + } + + return -(f32)result; + } + + if (x != x) { + return __libm_qnan_f; + } + + return zero.f; +} |
