aboutsummaryrefslogtreecommitdiff
path: root/src/libmp/386/mpdigdiv.s
diff options
context:
space:
mode:
Diffstat (limited to 'src/libmp/386/mpdigdiv.s')
-rw-r--r--src/libmp/386/mpdigdiv.s39
1 files changed, 39 insertions, 0 deletions
diff --git a/src/libmp/386/mpdigdiv.s b/src/libmp/386/mpdigdiv.s
new file mode 100644
index 00000000..f02e1616
--- /dev/null
+++ b/src/libmp/386/mpdigdiv.s
@@ -0,0 +1,39 @@
+.text
+
+.p2align 2,0x90
+.globl mpdigdiv
+ .type mpdigdiv, @function
+mpdigdiv:
+ /* Prelude */
+ pushl %ebp
+ movl %ebx, -4(%esp) /* save on stack */
+
+ movl 8(%esp), %ebx
+ movl (%ebx), %eax
+ movl 4(%ebx), %edx
+
+ movl 12(%esp), %ebx
+ movl 16(%esp), %ebp
+ 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)
+ jmp done
+
+ /* return all 1's */
+divovfl:
+ notl %ecx
+ movl %ecx, (%ebp)
+
+done:
+ /* Postlude */
+ movl -4(%esp), %ebx /* restore from stack */
+ movl %esp, %ebp
+ leave
+ ret
+
+.endmpdigdiv:
+ .size mpdigdiv,.endmpdigdiv-mpdigdiv