Avoid storing precious data below the stack pointer.

This commit is contained in:
rsc 2006-03-22 16:30:50 +00:00
parent aff51ee51f
commit 39ce0d5862
4 changed files with 61 additions and 63 deletions

View file

@ -1,19 +1,19 @@
.text .text
.p2align 2,0x90 .p2align 2,0x90
.globl mpdigdiv .globl mpdigdiv
.type mpdigdiv, @function .type mpdigdiv, @function
mpdigdiv: mpdigdiv:
/* Prelude */ /* Prelude */
pushl %ebp pushl %ebp /* save on stack */
movl %ebx, -4(%esp) /* 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 8(%esp), %ebx
movl (%ebx), %eax
movl 4(%ebx), %edx
movl 12(%esp), %ebx
movl 16(%esp), %ebp
xorl %ecx, %ecx xorl %ecx, %ecx
cmpl %ebx, %edx /* dividend >= 2^32 * divisor */ cmpl %ebx, %edx /* dividend >= 2^32 * divisor */
jae divovfl jae divovfl
@ -21,19 +21,14 @@ mpdigdiv:
je divovfl je divovfl
divl %ebx /* AX = DX:AX/BX */ divl %ebx /* AX = DX:AX/BX */
movl %eax, (%ebp) movl %eax, (%ebp)
jmp done done:
/* Postlude */
popl %ebx
popl %ebp
ret
/* return all 1's */ /* return all 1's */
divovfl: divovfl:
notl %ecx notl %ecx
movl %ecx, (%ebp) movl %ecx, (%ebp)
jmp done
done:
/* Postlude */
movl -4(%esp), %ebx /* restore from stack */
movl %esp, %ebp
leave
ret
.endmpdigdiv:
.size mpdigdiv,.endmpdigdiv-mpdigdiv

View file

@ -10,17 +10,19 @@
.type mpvecadd, @function .type mpvecadd, @function
mpvecadd: mpvecadd:
/* Prelude */ /* Prelude */
pushl %ebp pushl %ebp /* save on stack */
movl %ebx, -4(%esp) /* save on stack */ pushl %ebx
movl %esi, -8(%esp) pushl %esi
movl %edi, -12(%esp) pushl %edi
movl 12(%esp), %edx /* alen */ leal 20(%esp), %ebp /* %ebp = FP for now */
movl 20(%esp), %ecx /* blen */
movl 8(%esp), %esi /* a */ movl 4(%ebp), %edx /* alen */
movl 16(%esp), %ebx /* b */ movl 12(%ebp), %ecx /* blen */
movl 0(%ebp), %esi /* a */
movl 8(%ebp), %ebx /* b */
subl %ecx, %edx subl %ecx, %edx
movl 24(%esp), %edi /* sum */ movl 16(%ebp), %edi /* sum */
xorl %ebp, %ebp /* this also sets carry to 0 */ xorl %ebp, %ebp /* this also sets carry to 0 */
/* skip addition if b is zero */ /* skip addition if b is zero */
@ -62,9 +64,8 @@ _addloop2:
done: done:
/* Postlude */ /* Postlude */
movl -4(%esp), %ebx /* restore from stack */ popl %edi
movl -8(%esp), %esi popl %esi
movl -12(%esp), %edi popl %ebx
movl %esp, %ebp popl %ebp
leave
ret ret

View file

@ -27,15 +27,16 @@
.type mpvecdigmuladd, @function .type mpvecdigmuladd, @function
mpvecdigmuladd: mpvecdigmuladd:
/* Prelude */ /* Prelude */
pushl %ebp pushl %ebp /* save on stack */
movl %ebx, -4(%esp) /* save on stack */ pushl %ebx
movl %esi, -8(%esp) pushl %esi
movl %edi, -12(%esp) pushl %edi
movl 8(%esp), %esi /* b */ leal 20(%esp), %ebp /* %ebp = FP for now */
movl 12(%esp), %ecx /* n */ movl 0(%ebp), %esi /* b */
movl 16(%esp), %ebx /* m */ movl 4(%ebp), %ecx /* n */
movl 20(%esp), %edi /* p */ movl 8(%ebp), %ebx /* m */
movl 12(%ebp), %edi /* p */
movl %ecx, %ebp movl %ecx, %ebp
negl %ebp /* BP = -n */ negl %ebp /* BP = -n */
shll $2, %ecx shll $2, %ecx
@ -61,9 +62,9 @@ _muladdnocarry2:
adcl %eax, %eax /* return carry out of p[n] */ adcl %eax, %eax /* return carry out of p[n] */
/* Postlude */ /* Postlude */
movl -4(%esp), %ebx /* restore from stack */ popl %edi
movl -8(%esp), %esi popl %esi
movl -12(%esp), %edi popl %ebx
movl %esp, %ebp popl %ebp
leave
ret ret

View file

@ -10,16 +10,18 @@
.type mpvecsub, @function .type mpvecsub, @function
mpvecsub: mpvecsub:
/* Prelude */ /* Prelude */
pushl %ebp pushl %ebp /* save on stack */
movl %ebx, -4(%esp) /* save on stack */ pushl %ebx
movl %esi, -8(%esp) pushl %esi
movl %edi, -12(%esp) 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 */
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 */
subl %ecx,%edx subl %ecx,%edx
xorl %ebp,%ebp /* this also sets carry to 0 */ xorl %ebp,%ebp /* this also sets carry to 0 */
@ -46,15 +48,14 @@ _subloop2:
movl (%esi, %ebp, 4), %eax movl (%esi, %ebp, 4), %eax
sbbl $0, %eax sbbl $0, %eax
movl %eax, (%edi, %ebp, 4) movl %eax, (%edi, %ebp, 4)
INCL %ebp incl %ebp
LOOP _subloop2 loop _subloop2
done: done:
/* Postlude */ /* Postlude */
movl -4(%esp), %ebx /* restore from stack */ popl %edi
movl -8(%esp), %esi popl %esi
movl -12(%esp), %edi popl %ebx
movl %esp, %ebp popl %ebp
leave
ret ret