aboutsummaryrefslogtreecommitdiff
path: root/src/libmp/386/mpdigdiv-Darwin.s
diff options
context:
space:
mode:
Diffstat (limited to 'src/libmp/386/mpdigdiv-Darwin.s')
-rw-r--r--src/libmp/386/mpdigdiv-Darwin.s33
1 files changed, 33 insertions, 0 deletions
diff --git a/src/libmp/386/mpdigdiv-Darwin.s b/src/libmp/386/mpdigdiv-Darwin.s
new file mode 100644
index 00000000..be96bf38
--- /dev/null
+++ b/src/libmp/386/mpdigdiv-Darwin.s
@@ -0,0 +1,33 @@
+.text
+.p2align 2,0x90
+.globl _mpdigdiv
+_mpdigdiv:
+ /* Prelude */
+ pushl %ebp /* save on stack */
+ pushl %ebx
+
+ leal 12(%esp), %ebp /* %ebp = FP for now */
+ movl 0(%ebp), %ebx /* dividend */
+ movl 0(%ebx), %eax
+ movl 4(%ebx), %edx
+ movl 4(%ebp), %ebx /* divisor */
+ movl 8(%ebp), %ebp /* quotient */
+
+ xorl %ecx, %ecx
+ cmpl %ebx, %edx /* dividend >= 2^32 * divisor */
+ jae divovfl
+ cmpl %ecx, %ebx /* divisor == 1 */
+ je divovfl
+ divl %ebx /* AX = DX:AX/BX */
+ movl %eax, (%ebp)
+done:
+ /* Postlude */
+ popl %ebx
+ popl %ebp
+ ret
+
+ /* return all 1's */
+divovfl:
+ notl %ecx
+ movl %ecx, (%ebp)
+ jmp done