Upload Tizen:Base source
[external/gmp.git] / mpn / ia64 / submul_1.asm
1 dnl  IA-64 mpn_submul_1 -- Multiply a limb vector with a limb and subtract the
2 dnl  result from a second limb vector.
3
4 dnl  Copyright 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
5
6 dnl  This file is part of the GNU MP Library.
7
8 dnl  The GNU MP Library is free software; you can redistribute it and/or modify
9 dnl  it under the terms of the GNU Lesser General Public License as published
10 dnl  by the Free Software Foundation; either version 3 of the License, or (at
11 dnl  your option) any later version.
12
13 dnl  The GNU MP Library is distributed in the hope that it will be useful, but
14 dnl  WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15 dnl  or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
16 dnl  License for more details.
17
18 dnl  You should have received a copy of the GNU Lesser General Public License
19 dnl  along with the GNU MP Library.  If not, see http://www.gnu.org/licenses/.
20
21 include(`../config.m4')
22
23 C         cycles/limb
24 C Itanium:    4.0
25 C Itanium 2:  2.25 (alignment dependent, sometimes it seems to need 3 c/l)
26
27 C TODO
28 C  * Optimize feed-in and wind-down code, both for speed and code size.
29 C  * Handle low limb input and results specially, using a common stf8 in the
30 C    epilogue.
31 C  * Delay r8, r10 initialization, put cmp-p6 in 1st bundle and br .Ldone in
32 C    2nd bundle.  This will allow the bbb bundle to be one cycle earlier and
33 C    save a cycle.
34
35 C INPUT PARAMETERS
36 define(`rp', `r32')
37 define(`up', `r33')
38 define(`n',  `r34')
39 define(`vl', `r35')
40
41 ASM_START()
42 PROLOGUE(mpn_submul_1)
43         .prologue
44         .save   ar.lc, r2
45         .body
46
47 ifdef(`HAVE_ABI_32',
48 `       addp4           rp = 0, rp              C M I
49         addp4           up = 0, up              C M I
50         zxt4            n = n                   C I
51         ;;
52 ')
53 {.mmi
54         mov             r10 = rp                C M I
55         mov             r9 = up                 C M I
56         sub             vl = r0, vl             C M I   negate vl
57 }
58 {.mmi
59         ldf8            f8 = [rp], 8            C M
60         ldf8            f7 = [up], 8            C M
61         add             r19 = -1, n             C M I   n - 1
62         ;;
63 }
64 {.mmi
65         cmp.eq          p6, p0 = 0, vl          C M I
66         mov             r8 = 0                  C M I   zero cylimb
67         mov             r2 = ar.lc              C I0
68 }
69 {.mmi
70         setf.sig        f6 = vl                 C M2 M3
71         and             r14 = 3, n              C M I
72         shr.u           r19 = r19, 2            C I0
73         ;;
74 }
75 {.mmb
76         nop             0
77         cmp.eq          p10, p0 = 0, r14        C M I
78    (p6) br.spnt         .Ldone                  C B     vl == 0
79 }
80 {.mmi
81         cmp.eq          p11, p0 = 2, r14        C M I
82         cmp.eq          p12, p0 = 3, r14        C M I
83         mov             ar.lc = r19             C I0
84 }
85 {.bbb
86   (p10) br.dptk         .Lb00                   C B
87   (p11) br.dptk         .Lb10                   C B
88   (p12) br.dptk         .Lb11                   C B
89         ;;
90 }
91
92 .Lb01:  br.cloop.dptk   .grt1
93
94         xma.l           f39 = f7, f6, f8
95         xma.hu          f43 = f7, f6, f8
96         ;;
97         getf.sig        r27 = f39                       C lo
98         getf.sig        r31 = f43                       C hi
99         ld8             r20 = [r9], 8
100         br              .Lcj1
101
102 .grt1:  ldf8            f44 = [rp], 8
103         ldf8            f32 = [up], 8
104         ;;
105         ldf8            f45 = [rp], 8
106         ldf8            f33 = [up], 8
107         ;;
108         ldf8            f46 = [rp], 8
109         xma.l           f39 = f7, f6, f8
110         ldf8            f34 = [up], 8
111         xma.hu          f43 = f7, f6, f8
112         ;;
113         ldf8            f47 = [rp], 8
114         xma.l           f36 = f32, f6, f44
115         ldf8            f35 = [up], 8
116         xma.hu          f40 = f32, f6, f44
117         br.cloop.dptk   .grt5
118         ;;
119
120         getf.sig        r27 = f39                       C lo
121         xma.l           f37 = f33, f6, f45
122         ld8             r20 = [r9], 8
123         xma.hu          f41 = f33, f6, f45
124         ;;
125         getf.sig        r31 = f43                       C hi
126         getf.sig        r24 = f36                       C lo
127         xma.l           f38 = f34, f6, f46
128         ld8             r21 = [r9], 8
129         xma.hu          f42 = f34, f6, f46
130         ;;
131         getf.sig        r28 = f40                       C hi
132         getf.sig        r25 = f37                       C lo
133         xma.l           f39 = f35, f6, f47
134         ld8             r22 = [r9], 8
135         xma.hu          f43 = f35, f6, f47
136         ;;
137         getf.sig        r29 = f41                       C hi
138         getf.sig        r26 = f38                       C lo
139         ld8             r23 = [r9], 8
140         br              .Lcj5
141
142 .grt5:  ldf8            f44 = [rp], 8
143         ldf8            f32 = [up], 8
144         ;;
145         getf.sig        r27 = f39                       C lo
146         xma.l           f37 = f33, f6, f45
147         ld8             r20 = [r9], 8
148         xma.hu          f41 = f33, f6, f45
149         ;;
150         ldf8            f45 = [rp], 8
151         getf.sig        r31 = f43                       C hi
152         ldf8            f33 = [up], 8
153         ;;
154         getf.sig        r24 = f36                       C lo
155         xma.l           f38 = f34, f6, f46
156         ld8             r21 = [r9], 8
157         xma.hu          f42 = f34, f6, f46
158         ;;
159         ldf8            f46 = [rp], 8
160         getf.sig        r28 = f40                       C hi
161         ldf8            f34 = [up], 8
162         ;;
163         getf.sig        r25 = f37                       C lo
164         xma.l           f39 = f35, f6, f47
165         ld8             r22 = [r9], 8
166         xma.hu          f43 = f35, f6, f47
167         ;;
168         ldf8            f47 = [rp], 8
169         getf.sig        r29 = f41                       C hi
170         ldf8            f35 = [up], 8
171         ;;
172         getf.sig        r26 = f38                       C lo
173         xma.l           f36 = f32, f6, f44
174         ld8             r23 = [r9], 8
175         xma.hu          f40 = f32, f6, f44
176         br.cloop.dptk   .Loop
177         br              .Lend
178
179
180 .Lb10:  ldf8            f47 = [rp], 8
181         ldf8            f35 = [up], 8
182         br.cloop.dptk   .grt2
183
184         xma.l           f38 = f7, f6, f8
185         xma.hu          f42 = f7, f6, f8
186         ;;
187         xma.l           f39 = f35, f6, f47
188         xma.hu          f43 = f35, f6, f47
189         ;;
190         getf.sig        r26 = f38                       C lo
191         getf.sig        r30 = f42                       C hi
192         ld8             r23 = [r9], 8
193         ;;
194         getf.sig        r27 = f39                       C lo
195         getf.sig        r31 = f43                       C hi
196         ld8             r20 = [r9], 8
197         br              .Lcj2
198
199 .grt2:  ldf8            f44 = [rp], 8
200         ldf8            f32 = [up], 8
201         ;;
202         ldf8            f45 = [rp], 8
203         ldf8            f33 = [up], 8
204         xma.l           f38 = f7, f6, f8
205         xma.hu          f42 = f7, f6, f8
206         ;;
207         ldf8            f46 = [rp], 8
208         ldf8            f34 = [up], 8
209         xma.l           f39 = f35, f6, f47
210         xma.hu          f43 = f35, f6, f47
211         ;;
212         ldf8            f47 = [rp], 8
213         ldf8            f35 = [up], 8
214         ;;
215         getf.sig        r26 = f38                       C lo
216         xma.l           f36 = f32, f6, f44
217         ld8             r23 = [r9], 8
218         xma.hu          f40 = f32, f6, f44
219         br.cloop.dptk   .grt6
220
221         getf.sig        r30 = f42                       C hi
222         ;;
223         getf.sig        r27 = f39                       C lo
224         xma.l           f37 = f33, f6, f45
225         ld8             r20 = [r9], 8
226         xma.hu          f41 = f33, f6, f45
227         ;;
228         getf.sig        r31 = f43                       C hi
229         getf.sig        r24 = f36                       C lo
230         xma.l           f38 = f34, f6, f46
231         ld8             r21 = [r9], 8
232         xma.hu          f42 = f34, f6, f46
233         ;;
234         getf.sig        r28 = f40                       C hi
235         getf.sig        r25 = f37                       C lo
236         xma.l           f39 = f35, f6, f47
237         ld8             r22 = [r9], 8
238         xma.hu          f43 = f35, f6, f47
239         br              .Lcj6
240
241 .grt6:  ldf8            f44 = [rp], 8
242         getf.sig        r30 = f42                       C hi
243         ldf8            f32 = [up], 8
244         ;;
245         getf.sig        r27 = f39                       C lo
246         xma.l           f37 = f33, f6, f45
247         ld8             r20 = [r9], 8
248         xma.hu          f41 = f33, f6, f45
249         ;;
250         ldf8            f45 = [rp], 8
251         getf.sig        r31 = f43                       C hi
252         ldf8            f33 = [up], 8
253         ;;
254         getf.sig        r24 = f36                       C lo
255         xma.l           f38 = f34, f6, f46
256         ld8             r21 = [r9], 8
257         xma.hu          f42 = f34, f6, f46
258         ;;
259         ldf8            f46 = [rp], 8
260         getf.sig        r28 = f40                       C hi
261         ldf8            f34 = [up], 8
262         ;;
263         getf.sig        r25 = f37                       C lo
264         xma.l           f39 = f35, f6, f47
265         ld8             r22 = [r9], 8
266         xma.hu          f43 = f35, f6, f47
267         br              .LL10
268
269
270 .Lb11:  ldf8            f46 = [rp], 8
271         ldf8            f34 = [up], 8
272         ;;
273         ldf8            f47 = [rp], 8
274         ldf8            f35 = [up], 8
275         br.cloop.dptk   .grt3
276
277         xma.l           f37 = f7, f6, f8
278         xma.hu          f41 = f7, f6, f8
279         ;;
280         xma.l           f38 = f34, f6, f46
281         xma.hu          f42 = f34, f6, f46
282         ;;
283         getf.sig        r25 = f37                       C lo
284         xma.l           f39 = f35, f6, f47
285         xma.hu          f43 = f35, f6, f47
286         ;;
287         getf.sig        r29 = f41                       C hi
288         ld8             r22 = [r9], 8
289         ;;
290         getf.sig        r26 = f38                       C lo
291         getf.sig        r30 = f42                       C hi
292         ld8             r23 = [r9], 8
293         ;;
294         getf.sig        r27 = f39                       C lo
295         getf.sig        r31 = f43                       C hi
296         ld8             r20 = [r9], 8
297         br              .Lcj3
298
299 .grt3:  ldf8            f44 = [rp], 8
300         xma.l           f37 = f7, f6, f8
301         ldf8            f32 = [up], 8
302         xma.hu          f41 = f7, f6, f8
303         ;;
304         ldf8            f45 = [rp], 8
305         xma.l           f38 = f34, f6, f46
306         ldf8            f33 = [up], 8
307         xma.hu          f42 = f34, f6, f46
308         ;;
309         ldf8            f46 = [rp], 8
310         ldf8            f34 = [up], 8
311         ;;
312         getf.sig        r25 = f37                       C lo
313         xma.l           f39 = f35, f6, f47
314         ld8             r22 = [r9], 8
315         xma.hu          f43 = f35, f6, f47
316         ;;
317         ldf8            f47 = [rp], 8
318         getf.sig        r29 = f41                       C hi
319         ldf8            f35 = [up], 8
320         ;;
321         getf.sig        r26 = f38                       C lo
322         xma.l           f36 = f32, f6, f44
323         ld8             r23 = [r9], 8
324         xma.hu          f40 = f32, f6, f44
325         br.cloop.dptk   .grt7
326         ;;
327
328         getf.sig        r30 = f42                       C hi
329         getf.sig        r27 = f39                       C lo
330         xma.l           f37 = f33, f6, f45
331         ld8             r20 = [r9], 8
332         xma.hu          f41 = f33, f6, f45
333         ;;
334         getf.sig        r31 = f43                       C hi
335         getf.sig        r24 = f36                       C lo
336         xma.l           f38 = f34, f6, f46
337         ld8             r21 = [r9], 8
338         xma.hu          f42 = f34, f6, f46
339         br              .Lcj7
340
341 .grt7:  ldf8            f44 = [rp], 8
342         getf.sig        r30 = f42                       C hi
343         ldf8            f32 = [up], 8
344         ;;
345         getf.sig        r27 = f39                       C lo
346         xma.l           f37 = f33, f6, f45
347         ld8             r20 = [r9], 8
348         xma.hu          f41 = f33, f6, f45
349         ;;
350         ldf8            f45 = [rp], 8
351         getf.sig        r31 = f43                       C hi
352         ldf8            f33 = [up], 8
353         ;;
354         getf.sig        r24 = f36                       C lo
355         xma.l           f38 = f34, f6, f46
356         ld8             r21 = [r9], 8
357         xma.hu          f42 = f34, f6, f46
358         br              .LL11
359
360
361 .Lb00:  ldf8            f45 = [rp], 8
362         ldf8            f33 = [up], 8
363         ;;
364         ldf8            f46 = [rp], 8
365         ldf8            f34 = [up], 8
366         ;;
367         ldf8            f47 = [rp], 8
368         xma.l           f36 = f7, f6, f8
369         ldf8            f35 = [up], 8
370         xma.hu          f40 = f7, f6, f8
371         br.cloop.dptk   .grt4
372
373         xma.l           f37 = f33, f6, f45
374         xma.hu          f41 = f33, f6, f45
375         ;;
376         getf.sig        r24 = f36                       C lo
377         xma.l           f38 = f34, f6, f46
378         ld8             r21 = [r9], 8
379         xma.hu          f42 = f34, f6, f46
380         ;;
381         getf.sig        r28 = f40                       C hi
382         xma.l           f39 = f35, f6, f47
383         getf.sig        r25 = f37                       C lo
384         ld8             r22 = [r9], 8
385         xma.hu          f43 = f35, f6, f47
386         ;;
387         getf.sig        r29 = f41                       C hi
388         getf.sig        r26 = f38                       C lo
389         ld8             r23 = [r9], 8
390         ;;
391         getf.sig        r30 = f42                       C hi
392         getf.sig        r27 = f39                       C lo
393         ld8             r20 = [r9], 8
394         br              .Lcj4
395
396 .grt4:  ldf8            f44 = [rp], 8
397         xma.l           f37 = f33, f6, f45
398         ldf8            f32 = [up], 8
399         xma.hu          f41 = f33, f6, f45
400         ;;
401         ldf8            f45 = [rp], 8
402         ldf8            f33 = [up], 8
403         xma.l           f38 = f34, f6, f46
404         getf.sig        r24 = f36                       C lo
405         ld8             r21 = [r9], 8
406         xma.hu          f42 = f34, f6, f46
407         ;;
408         ldf8            f46 = [rp], 8
409         getf.sig        r28 = f40                       C hi
410         ldf8            f34 = [up], 8
411         xma.l           f39 = f35, f6, f47
412         getf.sig        r25 = f37                       C lo
413         ld8             r22 = [r9], 8
414         xma.hu          f43 = f35, f6, f47
415         ;;
416         ldf8            f47 = [rp], 8
417         getf.sig        r29 = f41                       C hi
418         ldf8            f35 = [up], 8
419         ;;
420         getf.sig        r26 = f38                       C lo
421         xma.l           f36 = f32, f6, f44
422         ld8             r23 = [r9], 8
423         xma.hu          f40 = f32, f6, f44
424         br.cloop.dptk   .grt8
425         ;;
426
427         getf.sig        r30 = f42                       C hi
428         getf.sig        r27 = f39                       C lo
429         xma.l           f37 = f33, f6, f45
430         ld8             r20 = [r9], 8
431         xma.hu          f41 = f33, f6, f45
432         br              .Lcj8
433
434 .grt8:  ldf8            f44 = [rp], 8
435         getf.sig        r30 = f42                       C hi
436         ldf8            f32 = [up], 8
437         ;;
438         getf.sig        r27 = f39                       C lo
439         xma.l           f37 = f33, f6, f45
440         ld8             r20 = [r9], 8
441         xma.hu          f41 = f33, f6, f45
442         br              .LL00
443
444         ALIGN(32)
445 .Loop:
446 {.mmi
447         ldf8            f44 = [rp], 8
448         cmp.ltu         p6, p0 = r27, r8        C lo cmp
449         sub             r14 = r27, r8           C lo sub
450 }
451 {.mmi
452         getf.sig        r30 = f42                       C hi
453         ldf8            f32 = [up], 8
454         sub             r8 = r20, r31           C hi sub
455         ;;                              C 01
456 }
457 {.mmf
458         getf.sig        r27 = f39                       C lo
459         st8             [r10] = r14, 8
460         xma.l           f37 = f33, f6, f45
461 }
462 {.mfi
463         ld8             r20 = [r9], 8
464         xma.hu          f41 = f33, f6, f45
465    (p6) add             r8 = 1, r8
466         ;;                              C 02
467 }
468 {.mmi
469 .LL00:  ldf8            f45 = [rp], 8
470         cmp.ltu         p6, p0 = r24, r8
471         sub             r14 = r24, r8
472 }
473 {.mmi
474         getf.sig        r31 = f43                       C hi
475         ldf8            f33 = [up], 8
476         sub             r8 = r21, r28
477         ;;                              C 03
478 }
479 {.mmf
480         getf.sig        r24 = f36                       C lo
481         st8             [r10] = r14, 8
482         xma.l           f38 = f34, f6, f46
483 }
484 {.mfi
485         ld8             r21 = [r9], 8
486         xma.hu          f42 = f34, f6, f46
487    (p6) add             r8 = 1, r8
488         ;;                              C 04
489 }
490 {.mmi
491 .LL11:  ldf8            f46 = [rp], 8
492         cmp.ltu         p6, p0 = r25, r8
493         sub             r14 = r25, r8
494 }
495 {.mmi
496         getf.sig        r28 = f40                       C hi
497         ldf8            f34 = [up], 8
498         sub             r8 = r22, r29
499         ;;                              C 05
500 }
501 {.mmf
502         getf.sig        r25 = f37                       C lo
503         st8             [r10] = r14, 8
504         xma.l           f39 = f35, f6, f47
505 }
506 {.mfi
507         ld8             r22 = [r9], 8
508         xma.hu          f43 = f35, f6, f47
509    (p6) add             r8 = 1, r8
510         ;;                              C 06
511 }
512 {.mmi
513 .LL10:  ldf8            f47 = [rp], 8
514         cmp.ltu         p6, p0 = r26, r8
515         sub             r14 = r26, r8
516 }
517 {.mmi
518         getf.sig        r29 = f41                       C hi
519         ldf8            f35 = [up], 8
520         sub             r8 = r23, r30
521         ;;                              C 07
522 }
523 {.mmf
524         getf.sig        r26 = f38                       C lo
525         st8             [r10] = r14, 8
526         xma.l           f36 = f32, f6, f44
527 }
528 {.mfi
529         ld8             r23 = [r9], 8
530         xma.hu          f40 = f32, f6, f44
531    (p6) add             r8 = 1, r8
532 }
533         br.cloop.dptk   .Loop
534         ;;
535
536 .Lend:
537         cmp.ltu         p6, p0 = r27, r8
538         sub             r14 = r27, r8
539         getf.sig        r30 = f42
540         sub             r8 = r20, r31
541         ;;
542         getf.sig        r27 = f39
543         st8             [r10] = r14, 8
544         xma.l           f37 = f33, f6, f45
545         ld8             r20 = [r9], 8
546         xma.hu          f41 = f33, f6, f45
547    (p6) add             r8 = 1, r8
548         ;;
549 .Lcj8:
550         cmp.ltu         p6, p0 = r24, r8
551         sub             r14 = r24, r8
552         getf.sig        r31 = f43
553         sub             r8 = r21, r28
554         ;;
555         getf.sig        r24 = f36
556         st8             [r10] = r14, 8
557         xma.l           f38 = f34, f6, f46
558         ld8             r21 = [r9], 8
559         xma.hu          f42 = f34, f6, f46
560    (p6) add             r8 = 1, r8
561         ;;
562 .Lcj7:
563         cmp.ltu         p6, p0 = r25, r8
564         sub             r14 = r25, r8
565         getf.sig        r28 = f40
566         sub             r8 = r22, r29
567         ;;
568         getf.sig        r25 = f37
569         st8             [r10] = r14, 8
570         xma.l           f39 = f35, f6, f47
571         ld8             r22 = [r9], 8
572         xma.hu          f43 = f35, f6, f47
573    (p6) add             r8 = 1, r8
574         ;;
575 .Lcj6:
576         cmp.ltu         p6, p0 = r26, r8
577         sub             r14 = r26, r8
578         getf.sig        r29 = f41
579         sub             r8 = r23, r30
580         ;;
581         getf.sig        r26 = f38
582         st8             [r10] = r14, 8
583         ld8             r23 = [r9], 8
584    (p6) add             r8 = 1, r8
585         ;;
586 .Lcj5:
587         cmp.ltu         p6, p0 = r27, r8
588         sub             r14 = r27, r8
589         getf.sig        r30 = f42
590         sub             r8 = r20, r31
591         ;;
592         getf.sig        r27 = f39
593         st8             [r10] = r14, 8
594         ld8             r20 = [r9], 8
595    (p6) add             r8 = 1, r8
596         ;;
597 .Lcj4:
598         cmp.ltu         p6, p0 = r24, r8
599         sub             r14 = r24, r8
600         getf.sig        r31 = f43
601         sub             r8 = r21, r28
602         ;;
603         st8             [r10] = r14, 8
604    (p6) add             r8 = 1, r8
605         ;;
606 .Lcj3:
607         cmp.ltu         p6, p0 = r25, r8
608         sub             r14 = r25, r8
609         sub             r8 = r22, r29
610         ;;
611         st8             [r10] = r14, 8
612    (p6) add             r8 = 1, r8
613         ;;
614 .Lcj2:
615         cmp.ltu         p6, p0 = r26, r8
616         sub             r14 = r26, r8
617         sub             r8 = r23, r30
618         ;;
619         st8             [r10] = r14, 8
620    (p6) add             r8 = 1, r8
621         ;;
622 .Lcj1:
623         cmp.ltu         p6, p0 = r27, r8
624         sub             r14 = r27, r8
625         sub             r8 = r20, r31
626         ;;
627         st8             [r10] = r14, 8
628         mov             ar.lc = r2
629    (p6) add             r8 = 1, r8
630         br.ret.sptk.many b0
631 .Ldone: mov             ar.lc = r2
632         br.ret.sptk.many b0
633 EPILOGUE()
634 ASM_END()