diff options
| author | Tharo <17233964+Thar0@users.noreply.github.com> | 2025-08-09 06:02:03 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-08-08 22:02:03 -0700 |
| commit | 1ca6ca804df58d56352bb5007ab048cb0dad6757 (patch) | |
| tree | 044a156c3b4234744164586ba8752597155ffd74 /src/boot | |
| parent | 9612575930717c78c1bfed17231e364eea8a28da (diff) | |
Handwritten asm: fp (#1818)
Diffstat (limited to 'src/boot')
| -rw-r--r-- | src/boot/libc64/fp.s | 162 |
1 files changed, 162 insertions, 0 deletions
diff --git a/src/boot/libc64/fp.s b/src/boot/libc64/fp.s new file mode 100644 index 000000000..d1eae030c --- /dev/null +++ b/src/boot/libc64/fp.s @@ -0,0 +1,162 @@ +#include "PR/asm.h" +#include "PR/regdef.h" + +.data + +DATA(gPositiveInfinity) + .word 0x7F800000 +ENDDATA(gPositiveInfinity) + +DATA(gNegativeInfinity) + .word 0xFF800000 +ENDDATA(gNegativeInfinity) + +DATA(gPositiveZero) + .word 0x00000000 +ENDDATA(gPositiveZero) + +DATA(gNegativeZero) + .word 0x80000000 +ENDDATA(gNegativeZero) + +DATA(qNaN0x3FFFFF) + .word 0x7FBFFFFF +ENDDATA(qNaN0x3FFFFF) + +DATA(qNaN0x10000) + .word 0x7F810000 +ENDDATA(qNaN0x10000) + +DATA(sNaN0x3FFFFF) + .word 0x7FFFFFFF +ENDDATA(sNaN0x3FFFFF) + +.text + +LEAF(floorf) + floor.w.s fa0, fa0 + cvt.s.w fv0, fa0 + jr ra +END(floorf) + +LEAF(floor) + floor.w.d fa0, fa0 + cvt.d.w fv0, fa0 + jr ra +END(floor) + +LEAF(lfloorf) + floor.w.s ft0, fa0 + mfc1 v0, ft0 + jr ra +END(lfloorf) + +LEAF(lfloor) + floor.w.d ft0, fa0 + mfc1 v0, ft0 + jr ra +END(lfloor) + +LEAF(ceilf) + ceil.w.s fa0, fa0 + cvt.s.w fv0, fa0 + jr ra +END(ceilf) + +LEAF(ceil) + ceil.w.d fa0, fa0 + cvt.d.w fv0, fa0 + jr ra +END(ceil) + +LEAF(lceilf) + ceil.w.s ft0, fa0 + mfc1 v0, ft0 + jr ra +END(lceilf) + +LEAF(lceil) + ceil.w.d ft0, fa0 + mfc1 v0, ft0 + jr ra +END(lceil) + +LEAF(truncf) + trunc.w.s fa0, fa0 + cvt.s.w fv0, fa0 + jr ra +END(truncf) + +LEAF(trunc) + trunc.w.d fa0, fa0 + cvt.d.w fv0, fa0 + jr ra +END(trunc) + +LEAF(ltruncf) + trunc.w.s ft0, fa0 + mfc1 v0, ft0 + jr ra +END(ltruncf) + +LEAF(ltrunc) + trunc.w.d ft0, fa0 + mfc1 v0, ft0 + jr ra +END(ltrunc) + +LEAF(nearbyintf) + round.w.s fa0, fa0 + cvt.s.w fv0, fa0 + jr ra +END(nearbyintf) + +LEAF(nearbyint) + round.w.d fa0, fa0 + cvt.d.w fv0, fa0 + jr ra +END(nearbyint) + +LEAF(lnearbyintf) + round.w.s ft0, fa0 + mfc1 v0, ft0 + jr ra +END(lnearbyintf) + +LEAF(lnearbyint) + round.w.d ft0, fa0 + mfc1 v0, ft0 + jr ra +END(lnearbyint) + +LEAF(roundf) + li.s ft0, 0.5 + add.s fv0, fa0, ft0 + floor.w.s fv0, fv0 + cvt.s.w fv0, fv0 + jr ra +END(roundf) + +LEAF(round) + li.d ft0, 0.5 + add.d fv0, fa0, ft0 + floor.w.d fv0, fv0 + cvt.d.w fv0, fv0 + jr ra +END(round) + +LEAF(lroundf) + li.s ft0, 0.5 + add.s fv0, fa0, ft0 + floor.w.s fv0, fv0 + mfc1 v0, fv0 + jr ra +END(lroundf) + +LEAF(lround) + li.d ft0, 0.5 + add.d fv0, fa0, ft0 + floor.w.d fv0, fv0 + mfc1 v0, fv0 + jr ra +END(lround) |
