aboutsummaryrefslogtreecommitdiff
path: root/src/libmp/386/mpdigdiv.s
diff options
context:
space:
mode:
authorrsc <devnull@localhost>2006-03-22 16:30:50 +0000
committerrsc <devnull@localhost>2006-03-22 16:30:50 +0000
commit39ce0d5862cd5fab8c93d60b195610b2ac77a094 (patch)
tree0b19fb4f9ea03b3b044f0c7b72ad000f7d02354a /src/libmp/386/mpdigdiv.s
parentaff51ee51f0bab35fca95569c639042de8acf777 (diff)
downloadplan9port-39ce0d5862cd5fab8c93d60b195610b2ac77a094.tar.gz
plan9port-39ce0d5862cd5fab8c93d60b195610b2ac77a094.tar.bz2
plan9port-39ce0d5862cd5fab8c93d60b195610b2ac77a094.zip
Avoid storing precious data below the stack pointer.
Diffstat (limited to 'src/libmp/386/mpdigdiv.s')
-rw-r--r--src/libmp/386/mpdigdiv.s35
1 files changed, 15 insertions, 20 deletions
diff --git a/src/libmp/386/mpdigdiv.s b/src/libmp/386/mpdigdiv.s
index f02e1616..143bba9b 100644
--- a/src/libmp/386/mpdigdiv.s
+++ b/src/libmp/386/mpdigdiv.s
@@ -1,19 +1,19 @@
.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
+ 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 */
- movl 12(%esp), %ebx
- movl 16(%esp), %ebp
xorl %ecx, %ecx
cmpl %ebx, %edx /* dividend >= 2^32 * divisor */
jae divovfl
@@ -21,19 +21,14 @@ mpdigdiv:
je divovfl
divl %ebx /* AX = DX:AX/BX */
movl %eax, (%ebp)
- jmp done
+done:
+ /* Postlude */
+ popl %ebx
+ popl %ebp
+ ret
/* 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
+ jmp done