remove empty dir
[ghc-hetmet.git] / ghc / rts / gmp / mpn / x86 / pentium / aors_n.asm
1 dnl  Intel Pentium mpn_add_n/mpn_sub_n -- mpn addition and subtraction.
2 dnl
3 dnl  P5: 2.375 cycles/limb
4
5
6 dnl  Copyright (C) 1992, 1994, 1995, 1996, 1999, 2000 Free Software
7 dnl  Foundation, Inc.
8 dnl 
9 dnl  This file is part of the GNU MP Library.
10 dnl 
11 dnl  The GNU MP Library is free software; you can redistribute it and/or
12 dnl  modify it under the terms of the GNU Lesser General Public License as
13 dnl  published by the Free Software Foundation; either version 2.1 of the
14 dnl  License, or (at your option) any later version.
15 dnl 
16 dnl  The GNU MP Library is distributed in the hope that it will be useful,
17 dnl  but WITHOUT ANY WARRANTY; without even the implied warranty of
18 dnl  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
19 dnl  Lesser General Public License for more details.
20 dnl 
21 dnl  You should have received a copy of the GNU Lesser General Public
22 dnl  License along with the GNU MP Library; see the file COPYING.LIB.  If
23 dnl  not, write to the Free Software Foundation, Inc., 59 Temple Place -
24 dnl  Suite 330, Boston, MA 02111-1307, USA.
25
26
27 include(`../config.m4')
28
29
30 ifdef(`OPERATION_add_n',`
31         define(M4_inst,        adcl)
32         define(M4_function_n,  mpn_add_n)
33         define(M4_function_nc, mpn_add_nc)
34
35 ',`ifdef(`OPERATION_sub_n',`
36         define(M4_inst,        sbbl)
37         define(M4_function_n,  mpn_sub_n)
38         define(M4_function_nc, mpn_sub_nc)
39
40 ',`m4_error(`Need OPERATION_add_n or OPERATION_sub_n
41 ')')')
42
43 MULFUNC_PROLOGUE(mpn_add_n mpn_add_nc mpn_sub_n mpn_sub_nc)
44
45
46 C mp_limb_t M4_function_n (mp_ptr dst, mp_srcptr src1, mp_srcptr src2,
47 C                          mp_size_t size);
48 C mp_limb_t M4_function_nc (mp_ptr dst, mp_srcptr src1, mp_srcptr src2,
49 C                           mp_size_t size, mp_limb_t carry);
50
51 defframe(PARAM_CARRY,20)
52 defframe(PARAM_SIZE, 16)
53 defframe(PARAM_SRC2, 12)
54 defframe(PARAM_SRC1, 8)
55 defframe(PARAM_DST,  4)
56
57         .text
58         ALIGN(8)
59 PROLOGUE(M4_function_nc)
60
61         pushl   %edi
62         pushl   %esi
63         pushl   %ebx
64         pushl   %ebp
65 deflit(`FRAME',16)
66
67         movl    PARAM_DST,%edi
68         movl    PARAM_SRC1,%esi
69         movl    PARAM_SRC2,%ebp
70         movl    PARAM_SIZE,%ecx
71
72         movl    (%ebp),%ebx
73
74         decl    %ecx
75         movl    %ecx,%edx
76         shrl    $3,%ecx
77         andl    $7,%edx
78         testl   %ecx,%ecx               C zero carry flag
79         jz      L(endgo)
80
81         pushl   %edx
82 FRAME_pushl()
83         movl    PARAM_CARRY,%eax
84         shrl    $1,%eax                 C shift bit 0 into carry
85         jmp     LF(M4_function_n,oop)
86
87 L(endgo):
88 deflit(`FRAME',16)
89         movl    PARAM_CARRY,%eax
90         shrl    $1,%eax                 C shift bit 0 into carry
91         jmp     LF(M4_function_n,end)
92
93 EPILOGUE()
94
95
96         ALIGN(8)
97 PROLOGUE(M4_function_n)
98
99         pushl   %edi
100         pushl   %esi
101         pushl   %ebx
102         pushl   %ebp
103 deflit(`FRAME',16)
104
105         movl    PARAM_DST,%edi
106         movl    PARAM_SRC1,%esi
107         movl    PARAM_SRC2,%ebp
108         movl    PARAM_SIZE,%ecx
109
110         movl    (%ebp),%ebx
111
112         decl    %ecx
113         movl    %ecx,%edx
114         shrl    $3,%ecx
115         andl    $7,%edx
116         testl   %ecx,%ecx               C zero carry flag
117         jz      L(end)
118         pushl   %edx
119 FRAME_pushl()
120
121         ALIGN(8)
122 L(oop): movl    28(%edi),%eax           C fetch destination cache line
123         leal    32(%edi),%edi
124
125 L(1):   movl    (%esi),%eax
126         movl    4(%esi),%edx
127         M4_inst %ebx,%eax
128         movl    4(%ebp),%ebx
129         M4_inst %ebx,%edx
130         movl    8(%ebp),%ebx
131         movl    %eax,-32(%edi)
132         movl    %edx,-28(%edi)
133
134 L(2):   movl    8(%esi),%eax
135         movl    12(%esi),%edx
136         M4_inst %ebx,%eax
137         movl    12(%ebp),%ebx
138         M4_inst %ebx,%edx
139         movl    16(%ebp),%ebx
140         movl    %eax,-24(%edi)
141         movl    %edx,-20(%edi)
142
143 L(3):   movl    16(%esi),%eax
144         movl    20(%esi),%edx
145         M4_inst %ebx,%eax
146         movl    20(%ebp),%ebx
147         M4_inst %ebx,%edx
148         movl    24(%ebp),%ebx
149         movl    %eax,-16(%edi)
150         movl    %edx,-12(%edi)
151
152 L(4):   movl    24(%esi),%eax
153         movl    28(%esi),%edx
154         M4_inst %ebx,%eax
155         movl    28(%ebp),%ebx
156         M4_inst %ebx,%edx
157         movl    32(%ebp),%ebx
158         movl    %eax,-8(%edi)
159         movl    %edx,-4(%edi)
160
161         leal    32(%esi),%esi
162         leal    32(%ebp),%ebp
163         decl    %ecx
164         jnz     L(oop)
165
166         popl    %edx
167 FRAME_popl()
168 L(end):
169         decl    %edx                    C test %edx w/o clobbering carry
170         js      L(end2)
171         incl    %edx
172 L(oop2):
173         leal    4(%edi),%edi
174         movl    (%esi),%eax
175         M4_inst %ebx,%eax
176         movl    4(%ebp),%ebx
177         movl    %eax,-4(%edi)
178         leal    4(%esi),%esi
179         leal    4(%ebp),%ebp
180         decl    %edx
181         jnz     L(oop2)
182 L(end2):
183         movl    (%esi),%eax
184         M4_inst %ebx,%eax
185         movl    %eax,(%edi)
186
187         sbbl    %eax,%eax
188         negl    %eax
189
190         popl    %ebp
191         popl    %ebx
192         popl    %esi
193         popl    %edi
194         ret
195
196 EPILOGUE()