summaryrefslogtreecommitdiff
path: root/libmp/Inferno-mips/mpdigdiv.s
diff options
context:
space:
mode:
Diffstat (limited to 'libmp/Inferno-mips/mpdigdiv.s')
-rw-r--r--libmp/Inferno-mips/mpdigdiv.s41
1 files changed, 41 insertions, 0 deletions
diff --git a/libmp/Inferno-mips/mpdigdiv.s b/libmp/Inferno-mips/mpdigdiv.s
new file mode 100644
index 00000000..b7fd330e
--- /dev/null
+++ b/libmp/Inferno-mips/mpdigdiv.s
@@ -0,0 +1,41 @@
+/*
+ * This only works on R[45]000 chips that allow 64 bit
+ * integer arithmetic even when uding 32 bit addresses
+ *
+ * R1 = dividend*
+ * R2 = dividend[low]
+ * R3 = dividend[high]
+ * R4 = 32 bit divisor
+ * R5 = quotient*
+ */
+TEXT mpdigdiv(SB),$0
+
+ MOVW 0(R1),R2
+ MOVW 4(R1),R3
+ MOVW divisor+4(FP),R4
+ MOVW quotient+8(FP),R5
+
+ /* divisor == 0 */
+ BEQ R4,_digovfl
+
+ /* dividend >= 2^32 * divisor */
+ SGTU R4,R3,R7
+ BEQ R7,_digovfl
+
+_digdiv1:
+ SLLV $32,R2
+ SLLV $32,R3
+ SRLV $32,R2
+ ADDVU R2,R3
+ SLLV $32,R4
+ SRLV $32,R4
+ DIVVU R4,R3
+ MOVW LO,R1
+ MOVW R1,0(R5)
+ RET
+
+_digovfl:
+ MOVW $-1,R1
+ MOVW R1,0(R5)
+ RET
+