summaryrefslogtreecommitdiff
path: root/src/boot
diff options
context:
space:
mode:
authorTharo <17233964+Thar0@users.noreply.github.com>2025-08-09 06:02:03 +0100
committerGitHub <noreply@github.com>2025-08-08 22:02:03 -0700
commit1ca6ca804df58d56352bb5007ab048cb0dad6757 (patch)
tree044a156c3b4234744164586ba8752597155ffd74 /src/boot
parent9612575930717c78c1bfed17231e364eea8a28da (diff)
Handwritten asm: fp (#1818)
Diffstat (limited to 'src/boot')
-rw-r--r--src/boot/libc64/fp.s162
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)