aboutsummaryrefslogtreecommitdiff
path: root/src/libmp/386/mpvecsub.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/mpvecsub.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/mpvecsub.s')
-rw-r--r--src/libmp/386/mpvecsub.s35
1 files changed, 18 insertions, 17 deletions
diff --git a/src/libmp/386/mpvecsub.s b/src/libmp/386/mpvecsub.s
index e94dae16..06726668 100644
--- a/src/libmp/386/mpvecsub.s
+++ b/src/libmp/386/mpvecsub.s
@@ -10,16 +10,18 @@
.type mpvecsub, @function
mpvecsub:
/* Prelude */
- pushl %ebp
- movl %ebx, -4(%esp) /* save on stack */
- movl %esi, -8(%esp)
- movl %edi, -12(%esp)
-
- movl 8(%esp), %esi /* a */
- movl 16(%esp), %ebx /* b */
- movl 12(%esp), %edx /* alen */
- movl 20(%esp), %ecx /* blen */
- movl 24(%esp), %edi /* diff */
+ pushl %ebp /* save on stack */
+ pushl %ebx
+ pushl %esi
+ pushl %edi
+
+ leal 20(%esp), %ebp /* %ebp = FP for now */
+ movl 0(%ebp), %esi /* a */
+ movl 8(%ebp), %ebx /* b */
+ movl 4(%ebp), %edx /* alen */
+ movl 12(%ebp), %ecx /* blen */
+ movl 16(%ebp), %edi /* diff */
+
subl %ecx,%edx
xorl %ebp,%ebp /* this also sets carry to 0 */
@@ -46,15 +48,14 @@ _subloop2:
movl (%esi, %ebp, 4), %eax
sbbl $0, %eax
movl %eax, (%edi, %ebp, 4)
- INCL %ebp
- LOOP _subloop2
+ incl %ebp
+ loop _subloop2
done:
/* Postlude */
- movl -4(%esp), %ebx /* restore from stack */
- movl -8(%esp), %esi
- movl -12(%esp), %edi
- movl %esp, %ebp
- leave
+ popl %edi
+ popl %esi
+ popl %ebx
+ popl %ebp
ret