Tizen 2.1 base
[external/gmp.git] / mpn / x86 / pentium4 / sse2 / mod_1_4.asm
1 dnl  mpn_mod_1_4 for Pentium 4 and P6 models with SSE2 (i.e., 9,D,E,F).
2
3 dnl  Contributed to the GNU project by Torbjorn Granlund.
4
5 dnl  Copyright 2009 Free Software Foundation, Inc.
6 dnl
7 dnl  This file is part of the GNU MP Library.
8 dnl
9 dnl  The GNU MP Library is free software; you can redistribute it and/or modify
10 dnl  it under the terms of the GNU Lesser General Public License as published
11 dnl  by the Free Software Foundation; either version 3 of the License, or (at
12 dnl  your option) any later version.
13 dnl
14 dnl  The GNU MP Library is distributed in the hope that it will be useful, but
15 dnl  WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
16 dnl  or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
17 dnl  License for more details.
18 dnl
19 dnl  You should have received a copy of the GNU Lesser General Public License
20 dnl  along with the GNU MP Library.  If not, see http://www.gnu.org/licenses/.
21
22 include(`../config.m4')
23
24 C TODO:
25 C  * Optimize.  The present code was written quite straightforwardly.
26 C  * Optimize post-loop reduction code.
27
28 C                           cycles/limb
29 C P6 model 0-8,10-12)           -
30 C P6 model 9   (Banias)         ?
31 C P6 model 13  (Dothan)         3.4
32 C P4 model 0-1 (Willamette):    ?
33 C P4 model 2   (Northwood):     4
34 C P4 model 3-4 (Prescott):      ?
35
36 C INPUT PARAMETERS
37 C ap            sp + 4
38 C n             sp + 8
39 C b             sp + 12
40 C cps           sp + 16
41
42 define(`B1modb', `%mm1')
43 define(`B2modb', `%mm2')
44 define(`B3modb', `%mm3')
45 define(`B4modb', `%mm4')
46 define(`B5modb', `%mm5')
47 define(`ap', `%edx')
48 define(`n', `%eax')
49
50         TEXT
51         ALIGN(16)
52 PROLOGUE(mpn_mod_1s_4p)
53         push    %ebx
54         mov     8(%esp), ap
55         mov     12(%esp), n
56         mov     20(%esp), %ecx
57
58         movd    8(%ecx), B1modb
59         movd    12(%ecx), B2modb
60         movd    16(%ecx), B3modb
61         movd    20(%ecx), B4modb
62         movd    24(%ecx), B5modb
63
64         mov     n, %ebx
65         lea     -4(ap,n,4), ap
66         and     $3, %ebx
67         je      L(b0)
68         cmp     $2, %ebx
69         jc      L(b1)
70         je      L(b2)
71
72 L(b3):  movd    -4(ap), %mm7
73         pmuludq B1modb, %mm7
74         movd    -8(ap), %mm6
75         paddq   %mm6, %mm7
76         movd    (ap), %mm6
77         pmuludq B2modb, %mm6
78         paddq   %mm6, %mm7
79         lea     -24(ap), ap
80         add     $-3, n
81         jz      L(end)
82         jmp     L(top)
83
84 L(b0):  movd    -8(ap), %mm7
85         pmuludq B1modb, %mm7
86         movd    -12(ap), %mm6
87         paddq   %mm6, %mm7
88         movd    -4(ap), %mm6
89         pmuludq B2modb, %mm6
90         paddq   %mm6, %mm7
91         movd    (ap), %mm6
92         pmuludq B3modb, %mm6
93         paddq   %mm6, %mm7
94         lea     -28(ap), ap
95         add     $-4, n
96         jz      L(end)
97         jmp     L(top)
98
99 L(b1):  movd    (ap), %mm7
100         lea     -16(ap), ap
101         dec     n
102         jz      L(x)
103         jmp     L(top)
104
105 L(b2):  movd    (ap), %mm7
106         pmuludq B1modb, %mm7
107         movd    -4(ap), %mm6
108         paddq   %mm6, %mm7
109         lea     -20(ap), ap
110         add     $-2, n
111         jz      L(end)
112
113         ALIGN(8)
114 L(top): movd    4(ap), %mm0
115         pmuludq B1modb, %mm0
116         movd    0(ap), %mm6
117         paddq   %mm6, %mm0
118
119         movd    8(ap), %mm6
120         pmuludq B2modb, %mm6
121         paddq   %mm6, %mm0
122
123         movd    12(ap), %mm6
124         pmuludq B3modb, %mm6
125         paddq   %mm6, %mm0
126
127         movq    %mm7, %mm6
128         psrlq   $32, %mm7               C rh
129         pmuludq B5modb, %mm7
130         pmuludq B4modb, %mm6
131
132         paddq   %mm0, %mm7
133         paddq   %mm6, %mm7
134
135         add     $-16, ap
136         add     $-4, n
137         jnz     L(top)
138 L(end):
139
140         pcmpeqd %mm4, %mm4
141         psrlq   $32, %mm4               C 0x00000000FFFFFFFF
142         pand    %mm7, %mm4              C rl
143         psrlq   $32, %mm7               C rh
144         pmuludq B1modb, %mm7            C rh,cl
145         paddq   %mm4, %mm7              C rh,rl
146
147 L(x):   movd    4(%ecx), %mm4           C cnt
148         psllq   %mm4, %mm7              C rh,rl normalized
149         movq    %mm7, %mm2              C rl in low half
150         psrlq   $32, %mm7               C rh
151         movd    (%ecx), %mm1            C bi
152         pmuludq %mm7, %mm1              C qh,ql
153         paddq   %mm2, %mm1              C qh-1,ql
154         movd    %mm1, %ecx              C ql
155         psrlq   $32, %mm1               C qh-1
156         movd    16(%esp), %mm3          C b
157         pmuludq %mm1, %mm3              C (qh-1) * b
158         psubq   %mm3, %mm2              C r in low half (could use psubd)
159         movd    %mm2, %eax              C r
160         mov     16(%esp), %ebx
161         sub     %ebx, %eax              C r
162         cmp     %eax, %ecx
163         lea     (%eax,%ebx), %edx
164         cmovc(  %edx, %eax)
165         movd    %mm4, %ecx              C cnt
166         cmp     %ebx, %eax
167         jae     L(fix)
168         emms
169         pop     %ebx
170         shr     %cl, %eax
171         ret
172
173 L(fix): sub     %ebx, %eax
174         emms
175         pop     %ebx
176         shr     %cl, %eax
177         ret
178 EPILOGUE()
179
180 PROLOGUE(mpn_mod_1s_4p_cps)
181         push    %ebp
182         push    %edi
183         push    %esi
184         push    %ebx
185         sub     $12, %esp
186         mov     36(%esp), %ebx
187         bsr     %ebx, %ecx
188         xor     $31, %ecx
189         mov     %ecx, 4(%esp)
190         sal     %cl, %ebx
191         mov     %ebx, %edx
192         not     %edx
193         mov     $-1, %eax
194         div     %ebx
195         mov     %eax, %esi
196         mov     $1, %ebp
197         sal     %cl, %ebp
198         neg     %ecx
199         shr     %cl, %eax
200         or      %eax, %ebp
201         mov     %ebx, %eax
202         neg     %eax
203         imul    %ebp, %eax
204         mov     %esi, %ecx
205         mov     %eax, 8(%esp)
206         mul     %ecx
207         mov     %edx, %esi
208         not     %esi
209         sub     8(%esp), %esi
210         imul    %ebx, %esi
211         lea     (%esi,%ebx), %edx
212         cmp     %esi, %eax
213         cmovb(  %edx, %esi)
214         mov     %esi, %eax
215         mul     %ecx
216         lea     (%esi,%edx), %edi
217         not     %edi
218         imul    %ebx, %edi
219         lea     (%edi,%ebx), %edx
220         cmp     %edi, %eax
221         cmovb(  %edx, %edi)
222         mov     %edi, %eax
223         mul     %ecx
224         lea     (%edi,%edx), %ebp
225         not     %ebp
226         imul    %ebx, %ebp
227         lea     (%ebp,%ebx), %edx
228         cmp     %ebp, %eax
229         cmovb(  %edx, %ebp)
230         mov     %ebp, %eax
231         mul     %ecx
232         add     %ebp, %edx
233         not     %edx
234         imul    %ebx, %edx
235         add     %edx, %ebx
236         cmp     %edx, %eax
237         cmovb(  %ebx, %edx)
238         mov     32(%esp), %eax
239         mov     %ecx, (%eax)
240         mov     4(%esp), %ecx
241         mov     %ecx, 4(%eax)
242         mov     8(%esp), %ebx
243         shr     %cl, %ebx
244         mov     %ebx, 8(%eax)
245         shr     %cl, %esi
246         mov     %esi, 12(%eax)
247         shr     %cl, %edi
248         mov     %edi, 16(%eax)
249         shr     %cl, %ebp
250         mov     %ebp, 20(%eax)
251         shr     %cl, %edx
252         mov     %edx, 24(%eax)
253         add     $12, %esp
254         pop     %ebx
255         pop     %esi
256         pop     %edi
257         pop     %ebp
258         ret
259 EPILOGUE()