summaryrefslogtreecommitdiff
path: root/src/code/fp.s
diff options
context:
space:
mode:
Diffstat (limited to 'src/code/fp.s')
-rw-r--r--src/code/fp.s165
1 files changed, 165 insertions, 0 deletions
diff --git a/src/code/fp.s b/src/code/fp.s
new file mode 100644
index 000000000..431348d89
--- /dev/null
+++ b/src/code/fp.s
@@ -0,0 +1,165 @@
+#include "ultra64/asm.h"
+
+.set noreorder
+
+.section .data
+
+.balign 16
+
+DATA(qNaN0x3FFFFF)
+ .word 0x7FBFFFFF
+ENDDATA(qNaN0x3FFFFF)
+
+DATA(qNaN0x10000)
+ .word 0x7F810000
+ENDDATA(qNaN0x10000)
+
+DATA(sNaN0x3FFFFF)
+ .word 0x7FFFFFFF
+ENDDATA(sNaN0x3FFFFF)
+
+.section .text
+
+.balign 16
+
+LEAF(floorf)
+ floor.w.s $f12, $f12
+ jr $ra
+ cvt.s.w $f0, $f12
+END(floorf)
+
+LEAF(floor)
+ floor.w.d $f12, $f12
+ jr $ra
+ cvt.d.w $f0, $f12
+END(floor)
+
+LEAF(lfloorf)
+ floor.w.s $f4, $f12
+ mfc1 $v0, $f4
+ jr $ra
+ nop
+END(lfloorf)
+
+LEAF(lfloor)
+ floor.w.d $f4, $f12
+ mfc1 $v0, $f4
+ jr $ra
+ nop
+END(lfloor)
+
+LEAF(ceilf)
+ ceil.w.s $f12, $f12
+ jr $ra
+ cvt.s.w $f0, $f12
+END(ceilf)
+
+LEAF(ceil)
+ ceil.w.d $f12, $f12
+ jr $ra
+ cvt.d.w $f0, $f12
+END(ceil)
+
+LEAF(lceilf)
+ ceil.w.s $f4, $f12
+ mfc1 $v0, $f4
+ jr $ra
+ nop
+END(lceilf)
+
+LEAF(lceil)
+ ceil.w.d $f4, $f12
+ mfc1 $v0, $f4
+ jr $ra
+ nop
+END(lceil)
+
+LEAF(truncf)
+ trunc.w.s $f12, $f12
+ jr $ra
+ cvt.s.w $f0, $f12
+END(truncf)
+
+LEAF(trunc)
+ trunc.w.d $f12, $f12
+ jr $ra
+ cvt.d.w $f0, $f12
+END(trunc)
+
+LEAF(ltruncf)
+ trunc.w.s $f4, $f12
+ mfc1 $v0, $f4
+ jr $ra
+ nop
+END(ltruncf)
+
+LEAF(ltrunc)
+ trunc.w.d $f4, $f12
+ mfc1 $v0, $f4
+ jr $ra
+ nop
+END(ltrunc)
+
+LEAF(nearbyintf)
+ round.w.s $f12, $f12
+ jr $ra
+ cvt.s.w $f0, $f12
+END(nearbyintf)
+
+LEAF(nearbyint)
+ round.w.d $f12, $f12
+ jr $ra
+ cvt.d.w $f0, $f12
+END(nearbyint)
+
+LEAF(lnearbyintf)
+ round.w.s $f4, $f12
+ mfc1 $v0, $f4
+ jr $ra
+ nop
+END(lnearbyintf)
+
+LEAF(lnearbyint)
+ round.w.d $f4, $f12
+ mfc1 $v0, $f4
+ jr $ra
+ nop
+END(lnearbyint)
+
+LEAF(roundf)
+ li.s $f4, 0.5
+ nop
+ add.s $f0, $f12, $f4
+ floor.w.s $f0, $f0
+ jr $ra
+ cvt.s.w $f0, $f0
+END(roundf)
+
+LEAF(round)
+ li.d $f4, 0.5
+ nop
+ add.d $f0, $f12, $f4
+ floor.w.d $f0, $f0
+ jr $ra
+ cvt.d.w $f0, $f0
+END(round)
+
+LEAF(lroundf)
+ li.s $f4, 0.5
+ nop
+ add.s $f0, $f12, $f4
+ floor.w.s $f0, $f0
+ mfc1 $v0, $f0
+ jr $ra
+ nop
+END(lroundf)
+
+LEAF(lround)
+ li.d $f4, 0.5
+ nop
+ add.d $f0, $f12, $f4
+ floor.w.d $f0, $f0
+ mfc1 $v0, $f0
+ jr $ra
+ nop
+END(lround)