1dnl  AMD64 mpn_mod_1s_4p
2
3dnl  Contributed to the GNU project by Torbjorn Granlund.
4
5dnl  Copyright 2009-2012, 2014 Free Software Foundation, Inc.
6
7dnl  This file is part of the GNU MP Library.
8dnl
9dnl  The GNU MP Library is free software; you can redistribute it and/or modify
10dnl  it under the terms of either:
11dnl
12dnl    * the GNU Lesser General Public License as published by the Free
13dnl      Software Foundation; either version 3 of the License, or (at your
14dnl      option) any later version.
15dnl
16dnl  or
17dnl
18dnl    * the GNU General Public License as published by the Free Software
19dnl      Foundation; either version 2 of the License, or (at your option) any
20dnl      later version.
21dnl
22dnl  or both in parallel, as here.
23dnl
24dnl  The GNU MP Library is distributed in the hope that it will be useful, but
25dnl  WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
26dnl  or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
27dnl  for more details.
28dnl
29dnl  You should have received copies of the GNU General Public License and the
30dnl  GNU Lesser General Public License along with the GNU MP Library.  If not,
31dnl  see https://www.gnu.org/licenses/.
32
33include(`../config.m4')
34
35C              cycles/limb
36C AMD K8,K9          3
37C AMD K10  3
38C Intel P4          15.5
39C Intel core2        5
40C Intel corei        4
41C Intel atom        23
42C VIA nano           4.75
43
44ABI_SUPPORT(DOS64)
45ABI_SUPPORT(STD64)
46
47ASM_START()
48          TEXT
49          ALIGN(16)
50PROLOGUE(mpn_mod_1s_4p)
51          FUNC_ENTRY(4)
52          push      %r15
53          push      %r14
54          push      %r13
55          push      %r12
56          push      %rbp
57          push      %rbx
58
59          mov       %rdx, %r15
60          mov       %rcx, %r14
61          mov       16(%rcx), %r11                C B1modb
62          mov       24(%rcx), %rbx                C B2modb
63          mov       32(%rcx), %rbp                C B3modb
64          mov       40(%rcx), %r13                C B4modb
65          mov       48(%rcx), %r12                C B5modb
66          xor       R32(%r8), R32(%r8)
67          mov       R32(%rsi), R32(%rdx)
68          and       $3, R32(%rdx)
69          je        L(b0)
70          cmp       $2, R32(%rdx)
71          jc        L(b1)
72          je        L(b2)
73
74L(b3):    lea       -24(%rdi,%rsi,8), %rdi
75          mov       8(%rdi), %rax
76          mul       %r11
77          mov       (%rdi), %r9
78          add       %rax, %r9
79          adc       %rdx, %r8
80          mov       16(%rdi), %rax
81          mul       %rbx
82          jmp       L(m0)
83
84          ALIGN(8)
85L(b0):    lea       -32(%rdi,%rsi,8), %rdi
86          mov       8(%rdi), %rax
87          mul       %r11
88          mov       (%rdi), %r9
89          add       %rax, %r9
90          adc       %rdx, %r8
91          mov       16(%rdi), %rax
92          mul       %rbx
93          add       %rax, %r9
94          adc       %rdx, %r8
95          mov       24(%rdi), %rax
96          mul       %rbp
97          jmp       L(m0)
98
99          ALIGN(8)
100L(b1):    lea       -8(%rdi,%rsi,8), %rdi
101          mov       (%rdi), %r9
102          jmp       L(m1)
103
104          ALIGN(8)
105L(b2):    lea       -16(%rdi,%rsi,8), %rdi
106          mov       8(%rdi), %r8
107          mov       (%rdi), %r9
108          jmp       L(m1)
109
110          ALIGN(16)
111L(top):   mov       -24(%rdi), %rax
112          mov       -32(%rdi), %r10
113          mul       %r11                          C up[1] * B1modb
114          add       %rax, %r10
115          mov       -16(%rdi), %rax
116          mov       $0, R32(%rcx)
117          adc       %rdx, %rcx
118          mul       %rbx                          C up[2] * B2modb
119          add       %rax, %r10
120          mov       -8(%rdi), %rax
121          adc       %rdx, %rcx
122          sub       $32, %rdi
123          mul       %rbp                          C up[3] * B3modb
124          add       %rax, %r10
125          mov       %r13, %rax
126          adc       %rdx, %rcx
127          mul       %r9                           C rl * B4modb
128          add       %rax, %r10
129          mov       %r12, %rax
130          adc       %rdx, %rcx
131          mul       %r8                           C rh * B5modb
132          mov       %r10, %r9
133          mov       %rcx, %r8
134L(m0):    add       %rax, %r9
135          adc       %rdx, %r8
136L(m1):    sub       $4, %rsi
137          ja        L(top)
138
139L(end):   mov       8(%r14), R32(%rsi)
140          mov       %r8, %rax
141          mul       %r11
142          mov       %rax, %r8
143          add       %r9, %r8
144          adc       $0, %rdx
145          xor       R32(%rcx), R32(%rcx)
146          sub       R32(%rsi), R32(%rcx)
147          mov       %r8, %rdi
148          shr       R8(%rcx), %rdi
149          mov       R32(%rsi), R32(%rcx)
150          sal       R8(%rcx), %rdx
151          or        %rdx, %rdi
152          mov       %rdi, %rax
153          mulq      (%r14)
154          mov       %r15, %rbx
155          mov       %rax, %r9
156          sal       R8(%rcx), %r8
157          inc       %rdi
158          add       %r8, %r9
159          adc       %rdi, %rdx
160          imul      %rbx, %rdx
161          sub       %rdx, %r8
162          lea       (%r8,%rbx), %rax
163          cmp       %r8, %r9
164          cmovc     %rax, %r8
165          mov       %r8, %rax
166          sub       %rbx, %rax
167          cmovc     %r8, %rax
168          shr       R8(%rcx), %rax
169          pop       %rbx
170          pop       %rbp
171          pop       %r12
172          pop       %r13
173          pop       %r14
174          pop       %r15
175          FUNC_EXIT()
176          ret
177EPILOGUE()
178
179          ALIGN(16)
180PROLOGUE(mpn_mod_1s_4p_cps)
181          FUNC_ENTRY(2)
182          push      %rbp
183          bsr       %rsi, %rcx
184          push      %rbx
185          mov       %rdi, %rbx
186          push      %r12
187          xor       $63, R32(%rcx)
188          mov       %rsi, %r12
189          mov       R32(%rcx), R32(%rbp)          C preserve cnt over call
190          sal       R8(%rcx), %r12                C b << cnt
191IFSTD(`   mov       %r12, %rdi          ')        C pass parameter
192IFDOS(`   mov       %r12, %rcx          ')        C pass parameter
193IFDOS(`   sub       $32, %rsp ')
194          ASSERT(nz, `test $15, %rsp')
195          CALL(     mpn_invert_limb)
196IFDOS(`   add       $32, %rsp ')
197          mov       %r12, %r8
198          mov       %rax, %r11
199          mov       %rax, (%rbx)                  C store bi
200          mov       %rbp, 8(%rbx)                 C store cnt
201          neg       %r8
202          mov       R32(%rbp), R32(%rcx)
203          mov       $1, R32(%rsi)
204ifdef(`SHLD_SLOW',`
205          shl       R8(%rcx), %rsi
206          neg       R32(%rcx)
207          mov       %rax, %rbp
208          shr       R8(%rcx), %rax
209          or        %rax, %rsi
210          mov       %rbp, %rax
211          neg       R32(%rcx)
212',`
213          shld      R8(%rcx), %rax, %rsi          C FIXME: Slow on Atom and Nano
214')
215          imul      %r8, %rsi
216          mul       %rsi
217
218          add       %rsi, %rdx
219          shr       R8(%rcx), %rsi
220          mov       %rsi, 16(%rbx)                C store B1modb
221
222          not       %rdx
223          imul      %r12, %rdx
224          lea       (%rdx,%r12), %rsi
225          cmp       %rdx, %rax
226          cmovnc    %rdx, %rsi
227          mov       %r11, %rax
228          mul       %rsi
229
230          add       %rsi, %rdx
231          shr       R8(%rcx), %rsi
232          mov       %rsi, 24(%rbx)                C store B2modb
233
234          not       %rdx
235          imul      %r12, %rdx
236          lea       (%rdx,%r12), %rsi
237          cmp       %rdx, %rax
238          cmovnc    %rdx, %rsi
239          mov       %r11, %rax
240          mul       %rsi
241
242          add       %rsi, %rdx
243          shr       R8(%rcx), %rsi
244          mov       %rsi, 32(%rbx)                C store B3modb
245
246          not       %rdx
247          imul      %r12, %rdx
248          lea       (%rdx,%r12), %rsi
249          cmp       %rdx, %rax
250          cmovnc    %rdx, %rsi
251          mov       %r11, %rax
252          mul       %rsi
253
254          add       %rsi, %rdx
255          shr       R8(%rcx), %rsi
256          mov       %rsi, 40(%rbx)                C store B4modb
257
258          not       %rdx
259          imul      %r12, %rdx
260          add       %rdx, %r12
261          cmp       %rdx, %rax
262          cmovnc    %rdx, %r12
263
264          shr       R8(%rcx), %r12
265          mov       %r12, 48(%rbx)                C store B5modb
266
267          pop       %r12
268          pop       %rbx
269          pop       %rbp
270          FUNC_EXIT()
271          ret
272EPILOGUE()
273