From bdc14ad47876a3bbdbb0df6101c36589855329f1 Mon Sep 17 00:00:00 2001 From: rsc Date: Wed, 22 Mar 2006 16:38:29 +0000 Subject: Avoid saving precious data under stack pointer. --- src/libmp/386/mpvecdigmulsub.s | 43 ++++++++++++++++++------------------------ 1 file changed, 18 insertions(+), 25 deletions(-) diff --git a/src/libmp/386/mpvecdigmulsub.s b/src/libmp/386/mpvecdigmulsub.s index 47089c87..f2a3a898 100644 --- a/src/libmp/386/mpvecdigmulsub.s +++ b/src/libmp/386/mpvecdigmulsub.s @@ -23,32 +23,27 @@ */ .text -/* XXX: had to use "-4(%esp)" kludge to get around inability to - * push/pop without first adjusting %esp. This may not be - * as fast as using push/pop (and accessing pushed element - * with "(%esp)".) - */ - .p2align 2,0x90 .globl mpvecdigmulsub .type mpvecdigmulsub, @function mpvecdigmulsub: /* Prelude */ - pushl %ebp - movl %ebx, -8(%esp) /* save on stack */ - movl %esi, -12(%esp) - movl %edi, -16(%esp) + pushl %ebp /* save on stack */ + pushl %ebx + pushl %esi + pushl %edi - movl 8(%esp), %esi /* b */ - movl 12(%esp), %ecx /* n */ - movl 16(%esp), %ebx /* m */ - movl 20(%esp), %edi /* p */ + leal 20(%esp), %ebp /* %ebp = FP for now */ + movl 0(%ebp), %esi /* b */ + movl 4(%ebp), %ecx /* n */ + movl 8(%ebp), %ebx /* m */ + movl 12(%ebp), %edi /* p */ xorl %ebp, %ebp - movl %ebp, -4(%esp) + pushl %ebp _mulsubloop: movl (%esi, %ebp, 4),%eax /* lo = b[i] */ mull %ebx /* hi, lo = b[i] * m */ - addl -4(%esp), %eax /* lo += oldhi */ + addl 0(%esp), %eax /* lo += oldhi */ jae _mulsubnocarry1 incl %edx /* hi += carry */ _mulsubnocarry1: @@ -56,23 +51,21 @@ _mulsubnocarry1: jae _mulsubnocarry2 incl %edx /* hi += carry */ _mulsubnocarry2: - movl %edx, -4(%esp) + movl %edx, 0(%esp) incl %ebp loop _mulsubloop - movl -4(%esp), %eax + popl %eax subl %eax, (%edi, %ebp, 4) jae _mulsubnocarry3 movl $-1, %eax jmp done - _mulsubnocarry3: movl $1, %eax - done: /* Postlude */ - movl -8(%esp), %ebx /* restore from stack */ - movl -12(%esp), %esi - movl -16(%esp), %edi - movl %esp, %ebp - leave + popl %edi + popl %esi + popl %ebx + popl %ebp ret + -- cgit v1.2.3