cipher/Makefile.am: add '-fcoverage-*' to instrumentation munging
[libgcrypt.git] / mpi / i386 / mpih-sub1.S
1 /* i80386 sub_n -- Sub two limb vectors of the same length > 0 and store
2  *                 sum in a third limb vector.
3  *
4  *      Copyright (C) 1992, 1994, 1995, 1998, 
5  *                    2001, 2002 Free Software Foundation, Inc.
6  *
7  * This file is part of Libgcrypt.
8  *
9  * Libgcrypt is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU Lesser General Public License as
11  * published by the Free Software Foundation; either version 2.1 of
12  * the License, or (at your option) any later version.
13  *
14  * Libgcrypt is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU Lesser General Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public
20  * License along with this program; if not, write to the Free Software
21  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
22  *
23  * Note: This code is heavily based on the GNU MP Library.
24  *       Actually it's the same code with only minor changes in the
25  *       way the data is stored; this is to support the abstraction
26  *       of an optional secure memory allocation which may be used
27  *       to avoid revealing of sensitive data due to paging etc.
28  */
29
30
31 #include "sysdep.h"
32 #include "asm-syntax.h"
33
34
35 /*******************
36  *  mpi_limb_t
37  *  _gcry_mpih_sub_n( mpi_ptr_t res_ptr,        (sp + 4)
38  *                 mpi_ptr_t s1_ptr,    (sp + 8)
39  *                 mpi_ptr_t s2_ptr,    (sp + 12)
40  *                 mpi_size_t size)     (sp + 16)
41  */
42
43
44 .text
45         ALIGN (3)
46         .globl C_SYMBOL_NAME(_gcry_mpih_sub_n)
47 C_SYMBOL_NAME(_gcry_mpih_sub_n:)
48         CFI_STARTPROC()
49         pushl %edi
50         CFI_PUSH(%edi)
51         pushl %esi
52         CFI_PUSH(%esi)
53
54         movl 12(%esp),%edi              /* res_ptr */
55         movl 16(%esp),%esi              /* s1_ptr */
56         movl 20(%esp),%edx              /* s2_ptr */
57         movl 24(%esp),%ecx              /* size */
58
59         movl    %ecx,%eax
60         shrl    $3,%ecx                 /* compute count for unrolled loop */
61         negl    %eax
62         andl    $7,%eax                 /* get index where to start loop */
63         jz      Loop                    /* necessary special case for 0 */
64         incl    %ecx                    /* adjust loop count */
65         shll    $2,%eax                 /* adjustment for pointers... */
66         subl    %eax,%edi               /* ... since they are offset ... */
67         subl    %eax,%esi               /* ... by a constant when we ... */
68         subl    %eax,%edx               /* ... enter the loop */
69         shrl    $2,%eax                 /* restore previous value */
70 #ifdef PIC
71 /* Calculate start address in loop for PIC.  Due to limitations in some
72    assemblers, Loop-L0-3 cannot be put into the leal */
73         call    L0
74 L0:     leal    (%eax,%eax,8),%eax
75         addl    (%esp),%eax
76         addl    $(Loop-L0-3),%eax
77         addl    $4,%esp
78 #else
79 /* Calculate start address in loop for non-PIC.  */
80         leal    (Loop - 3)(%eax,%eax,8),%eax
81 #endif
82         jmp     *%eax                   /* jump into loop */
83         ALIGN (3)
84 Loop:   movl    (%esi),%eax
85         sbbl    (%edx),%eax
86         movl    %eax,(%edi)
87         movl    4(%esi),%eax
88         sbbl    4(%edx),%eax
89         movl    %eax,4(%edi)
90         movl    8(%esi),%eax
91         sbbl    8(%edx),%eax
92         movl    %eax,8(%edi)
93         movl    12(%esi),%eax
94         sbbl    12(%edx),%eax
95         movl    %eax,12(%edi)
96         movl    16(%esi),%eax
97         sbbl    16(%edx),%eax
98         movl    %eax,16(%edi)
99         movl    20(%esi),%eax
100         sbbl    20(%edx),%eax
101         movl    %eax,20(%edi)
102         movl    24(%esi),%eax
103         sbbl    24(%edx),%eax
104         movl    %eax,24(%edi)
105         movl    28(%esi),%eax
106         sbbl    28(%edx),%eax
107         movl    %eax,28(%edi)
108         leal    32(%edi),%edi
109         leal    32(%esi),%esi
110         leal    32(%edx),%edx
111         decl    %ecx
112         jnz     Loop
113
114         sbbl    %eax,%eax
115         negl    %eax
116
117         popl %esi
118         CFI_POP(%esi)
119         popl %edi
120         CFI_POP(%edi)
121         ret
122         CFI_ENDPROC()
123