1dnl  IA-64 mpn_add_n_sub_n -- mpn parallel addition and subtraction.
2
3dnl  Contributed to the GNU project by Torbjorn Granlund.
4
5dnl  Copyright 2010 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 Itanium:      ?
37C Itanium 2:    2.25
38
39C INPUT PARAMETERS
40define(`sp', `r32')
41define(`dp', `r33')
42define(`up', `r34')
43define(`vp', `r35')
44define(`n',  `r36')
45
46C Some useful aliases for registers we use
47define(`u0',`r16') define(`u1',`r17') define(`u2',`r18') define(`u3',`r19')
48define(`v0',`r20') define(`v1',`r21') define(`v2',`r22') define(`v3',`r23')
49define(`s0',`r24') define(`s1',`r25') define(`s2',`r26') define(`s3',`r27')
50define(`d0',`r28') define(`d1',`r29') define(`d2',`r30') define(`d3',`r31')
51define(`up0',`up')
52define(`up1',`r14')
53define(`vp0',`vp')
54define(`vp1',`r15')
55
56
57ASM_START()
58PROLOGUE(mpn_add_n_sub_n)
59          .prologue
60          .save     ar.lc, r2
61          .body
62ifdef(`HAVE_ABI_32',`
63          addp4     sp = 0, sp                    C                                       M I
64          addp4     dp = 0, dp                    C                                       M I
65          nop.i     0
66          addp4     up = 0, up                    C                                       M I
67          addp4     vp = 0, vp                    C                                       M I
68          zxt4      n = n                         C                                       I
69          ;;
70')
71
72          and       r9 = 3, n           C                                       M I
73          mov.i     r2 = ar.lc                    C                                       I0
74          add       up1 = 8, up0                  C                                       M I
75          add       vp1 = 8, vp0                  C                                       M I
76          add       r8 = -2, n                    C                                       M I
77          add       r10 = 256, up                 C                                       M I
78          ;;
79          shr.u     r8 = r8, 2                    C                                       I0
80          cmp.eq    p10, p0 = 0, r9               C                                       M I
81          cmp.eq    p11, p0 = 2, r9               C                                       M I
82          cmp.eq    p12, p0 = 3, r9               C                                       M I
83          add       r11 = 256, vp                 C                                       M I
84          ;;
85          mov.i     ar.lc = r8                    C                                       I0
86  (p10)   br        L(b0)                         C                                       B
87  (p11)   br        L(b2)                         C                                       B
88  (p12)   br        L(b3)                         C                                       B
89
90L(b1):    ld8       u3 = [up0], 8                 C                                       M01
91          add       up1 = 8, up1                  C                                       M I
92          cmpltu    p14, p15 = 4, n               C                                       M I
93          ld8       v3 = [vp0], 8                 C                                       M01
94          add       vp1 = 8, vp1                  C                                       M I
95          ;;
96          add       s3 = u3, v3                   C                                       M I
97          sub       d3 = u3, v3                   C                                       M I
98          mov       r8 = 0                        C                                       M I
99          ;;
100          cmpltu    p9, p0 = s3, v3               C  carry from add3            M I
101          cmpltu    p13, p0 = u3, v3    C borrow from sub3            M I
102  (p15)   br        L(cj1)                        C                                       B
103          st8       [sp] = s3, 8                  C                                       M23
104          st8       [dp] = d3, 8                  C                                       M23
105          br        L(c0)                         C                                       B
106
107L(b0):    cmp.ne    p9, p0 = r0, r0               C                                       M I
108          cmp.ne    p13, p0 = r0, r0    C                                       M I
109L(c0):    ld8       u0 = [up0], 16                C                                       M01
110          ld8       u1 = [up1], 16                C                                       M01
111          ;;
112          ld8       v0 = [vp0], 16                C                                       M01
113          ld8       v1 = [vp1], 16                C                                       M01
114          ;;
115          ld8       u2 = [up0], 16                C                                       M01
116          ld8       u3 = [up1], 16                C                                       M01
117          ;;
118          ld8       v2 = [vp0], 16                C                                       M01
119          ld8       v3 = [vp1], 16                C                                       M01
120          ;;
121          add       s0 = u0, v0                   C                                       M I
122          add       s1 = u1, v1                   C                                       M I
123          sub       d0 = u0, v0                   C                                       M I
124          sub       d1 = u1, v1                   C                                       M I
125          ;;
126          cmpltu    p6, p0 = s0, v0               C  carry from add0            M I
127          cmpltu    p7, p0 = s1, v1               C  carry from add1            M I
128          cmpltu    p10, p0 = u0, v0    C borrow from sub0            M I
129          cmpltu    p11, p0 = u1, v1    C borrow from sub1            M I
130          ;;
131          nop       0                             C
132          br.cloop.dptk       L(top)              C                                       B
133          br        L(end)                        C                                       B
134
135L(b3):    ld8       u1 = [up0], 8                 C                                       M01
136          add       up1 = 8, up1                  C                                       M I
137          ld8       v1 = [vp0], 8                 C                                       M01
138          ;;
139          add       vp1 = 8, vp1                  C                                       M I
140          add       s1 = u1, v1                   C                                       M I
141          sub       d1 = u1, v1                   C                                       M I
142          ;;
143          cmpltu    p7, p0 = s1, v1               C  carry from add1            M I
144          cmpltu    p11, p0 = u1, v1    C borrow from sub1            M I
145          ;;
146          st8       [sp] = s1, 8                  C                                       M23
147          st8       [dp] = d1, 8                  C                                       M23
148          br        L(c2)                         C                                       B
149
150          ALIGN(32)
151L(b2):    cmp.ne    p7, p0 = r0, r0               C                                       M I
152          cmp.ne    p11, p0 = r0, r0    C                                       M I
153          nop       0
154L(c2):    ld8       u2 = [up0], 16                C                                       M01
155          ld8       u3 = [up1], 16                C                                       M01
156          cmpltu    p14, p0 = 4, n                C                                       M I
157          ;;
158          ld8       v2 = [vp0], 16                C                                       M01
159          ld8       v3 = [vp1], 16                C                                       M01
160  (p14)   br        L(gt4)                        C                                       B
161          ;;
162          add       s2 = u2, v2                   C                                       M I
163          add       s3 = u3, v3                   C                                       M I
164          sub       d2 = u2, v2                   C                                       M I
165          sub       d3 = u3, v3                   C                                       M I
166          ;;
167          cmpltu    p8, p0 = s2, v2               C  carry from add0            M I
168          cmpltu    p9, p0 = s3, v3               C  carry from add3            M I
169          cmpltu    p12, p0 = u2, v2    C borrow from sub2            M I
170          cmpltu    p13, p0 = u3, v3    C borrow from sub3            M I
171          br        L(cj2)                        C                                       B
172          ;;
173L(gt4):   ld8       u0 = [up0], 16                C                                       M01
174          ld8       u1 = [up1], 16                C                                       M01
175          ;;
176          ld8       v0 = [vp0], 16                C                                       M01
177          ld8       v1 = [vp1], 16                C                                       M01
178          ;;
179          add       s2 = u2, v2                   C                                       M I
180          add       s3 = u3, v3                   C                                       M I
181          sub       d2 = u2, v2                   C                                       M I
182          sub       d3 = u3, v3                   C                                       M I
183          ;;
184          cmpltu    p8, p0 = s2, v2               C  carry from add0            M I
185          cmpltu    p9, p0 = s3, v3               C  carry from add1            M I
186          cmpltu    p12, p0 = u2, v2    C borrow from sub0            M I
187          cmpltu    p13, p0 = u3, v3    C borrow from sub1            M I
188          br.cloop.dptk       L(mid)              C                                       B
189
190          ALIGN(32)
191L(top):
192          ld8       u0 = [up0], 16                C                                       M01
193          ld8       u1 = [up1], 16                C                                       M01
194   (p9)   cmpeqor   p6, p0 = -1, s0               C                                       M I
195   (p9)   add       s0 = 1, s0                    C                                       M I
196  (p13)   cmpeqor   p10, p0 = 0, d0               C                                       M I
197  (p13)   add       d0 = -1, d0                   C                                       M I
198          ;;
199          ld8       v0 = [vp0], 16                C                                       M01
200          ld8       v1 = [vp1], 16                C                                       M01
201   (p6)   cmpeqor   p7, p0 = -1, s1               C                                       M I
202   (p6)   add       s1 = 1, s1                    C                                       M I
203  (p10)   cmpeqor   p11, p0 = 0, d1               C                                       M I
204  (p10)   add       d1 = -1, d1                   C                                       M I
205          ;;
206          st8       [sp] = s0, 8                  C                                       M23
207          st8       [dp] = d0, 8                  C                                       M23
208          add       s2 = u2, v2                   C                                       M I
209          add       s3 = u3, v3                   C                                       M I
210          sub       d2 = u2, v2                   C                                       M I
211          sub       d3 = u3, v3                   C                                       M I
212          ;;
213          st8       [sp] = s1, 8                  C                                       M23
214          st8       [dp] = d1, 8                  C                                       M23
215          cmpltu    p8, p0 = s2, v2               C  carry from add2            M I
216          cmpltu    p9, p0 = s3, v3               C  carry from add3            M I
217          cmpltu    p12, p0 = u2, v2    C borrow from sub2            M I
218          cmpltu    p13, p0 = u3, v3    C borrow from sub3            M I
219          ;;
220L(mid):
221          ld8       u2 = [up0], 16                C                                       M01
222          ld8       u3 = [up1], 16                C                                       M01
223   (p7)   cmpeqor   p8, p0 = -1, s2               C                                       M I
224   (p7)   add       s2 = 1, s2                    C                                       M I
225  (p11)   cmpeqor   p12, p0 = 0, d2               C                                       M I
226  (p11)   add       d2 = -1, d2                   C                                       M I
227          ;;
228          ld8       v2 = [vp0], 16                C                                       M01
229          ld8       v3 = [vp1], 16                C                                       M01
230   (p8)   cmpeqor   p9, p0 = -1, s3               C                                       M I
231   (p8)   add       s3 = 1, s3                    C                                       M I
232  (p12)   cmpeqor   p13, p0 = 0, d3               C                                       M I
233  (p12)   add       d3 = -1, d3                   C                                       M I
234          ;;
235          st8       [sp] = s2, 8                  C                                       M23
236          st8       [dp] = d2, 8                  C                                       M23
237          add       s0 = u0, v0                   C                                       M I
238          add       s1 = u1, v1                   C                                       M I
239          sub       d0 = u0, v0                   C                                       M I
240          sub       d1 = u1, v1                   C                                       M I
241          ;;
242          st8       [sp] = s3, 8                  C                                       M23
243          st8       [dp] = d3, 8                  C                                       M23
244          cmpltu    p6, p0 = s0, v0               C  carry from add0            M I
245          cmpltu    p7, p0 = s1, v1               C  carry from add1            M I
246          cmpltu    p10, p0 = u0, v0    C borrow from sub0            M I
247          cmpltu    p11, p0 = u1, v1    C borrow from sub1            M I
248          ;;
249          lfetch    [r10], 32           C                                       M?
250          lfetch    [r11], 32           C                                       M?
251          br.cloop.dptk       L(top)              C                                       B
252          ;;
253
254L(end):
255          nop       0
256          nop       0
257   (p9)   cmpeqor   p6, p0 = -1, s0               C                                       M I
258   (p9)   add       s0 = 1, s0                    C                                       M I
259  (p13)   cmpeqor   p10, p0 = 0, d0               C                                       M I
260  (p13)   add       d0 = -1, d0                   C                                       M I
261          ;;
262          nop       0
263          nop       0
264   (p6)   cmpeqor   p7, p0 = -1, s1               C                                       M I
265   (p6)   add       s1 = 1, s1                    C                                       M I
266  (p10)   cmpeqor   p11, p0 = 0, d1               C                                       M I
267  (p10)   add       d1 = -1, d1                   C                                       M I
268          ;;
269          st8       [sp] = s0, 8                  C                                       M23
270          st8       [dp] = d0, 8                  C                                       M23
271          add       s2 = u2, v2                   C                                       M I
272          add       s3 = u3, v3                   C                                       M I
273          sub       d2 = u2, v2                   C                                       M I
274          sub       d3 = u3, v3                   C                                       M I
275          ;;
276          st8       [sp] = s1, 8                  C                                       M23
277          st8       [dp] = d1, 8                  C                                       M23
278          cmpltu    p8, p0 = s2, v2               C  carry from add2            M I
279          cmpltu    p9, p0 = s3, v3               C  carry from add3            M I
280          cmpltu    p12, p0 = u2, v2    C borrow from sub2            M I
281          cmpltu    p13, p0 = u3, v3    C borrow from sub3            M I
282          ;;
283L(cj2):
284   (p7)   cmpeqor   p8, p0 = -1, s2               C                                       M I
285   (p7)   add       s2 = 1, s2                    C                                       M I
286  (p11)   cmpeqor   p12, p0 = 0, d2               C                                       M I
287  (p11)   add       d2 = -1, d2                   C                                       M I
288          mov       r8 = 0                        C                                       M I
289          nop       0
290          ;;
291          st8       [sp] = s2, 8                  C                                       M23
292          st8       [dp] = d2, 8                  C                                       M23
293   (p8)   cmpeqor   p9, p0 = -1, s3               C                                       M I
294   (p8)   add       s3 = 1, s3                    C                                       M I
295  (p12)   cmpeqor   p13, p0 = 0, d3               C                                       M I
296  (p12)   add       d3 = -1, d3                   C                                       M I
297          ;;
298L(cj1):
299   (p9)   mov       r8 = 2                        C                                       M I
300          ;;
301          mov.i     ar.lc = r2                    C                                       I0
302  (p13)   add       r8 = 1, r8                    C                                       M I
303          st8       [sp] = s3           C                                       M23
304          st8       [dp] = d3           C                                       M23
305          br.ret.sptk.many b0           C                                       B
306EPILOGUE()
307ASM_END()
308