aboutsummaryrefslogtreecommitdiff
path: root/src/libmp/386/mpdigdiv.s
diff options
context:
space:
mode:
authorwkj <devnull@localhost>2004-04-21 04:45:31 +0000
committerwkj <devnull@localhost>2004-04-21 04:45:31 +0000
commitac0e2db600593d5b30550453b78874bfa0611751 (patch)
treeb5532ae46d9dae89a4ba22e30fb7ff15e4aa173b /src/libmp/386/mpdigdiv.s
parentf2a700e22af3cf792837935f8e8ed42d533d552e (diff)
downloadplan9port-ac0e2db600593d5b30550453b78874bfa0611751.tar.gz
plan9port-ac0e2db600593d5b30550453b78874bfa0611751.tar.bz2
plan9port-ac0e2db600593d5b30550453b78874bfa0611751.zip
Add basic libmp support for the x86.
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