Upload Tizen:Base source
[external/gmp.git] / mpn / alpha / ev6 / nails / aors_n.asm
1 dnl  Alpha ev6 nails mpn_add_n and mpn_sub_n.
2
3 dnl  Copyright 2002, 2006 Free Software Foundation, Inc.
4 dnl
5 dnl  This file is part of the GNU MP Library.
6 dnl
7 dnl  The GNU MP Library is free software; you can redistribute it and/or
8 dnl  modify it under the terms of the GNU Lesser General Public License as
9 dnl  published by the Free Software Foundation; either version 3 of the
10 dnl  License, or (at your option) any later version.
11 dnl
12 dnl  The GNU MP Library is distributed in the hope that it will be useful,
13 dnl  but WITHOUT ANY WARRANTY; without even the implied warranty of
14 dnl  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15 dnl  Lesser General Public License for more details.
16 dnl
17 dnl  You should have received a copy of the GNU Lesser General Public License
18 dnl  along with the GNU MP Library.  If not, see http://www.gnu.org/licenses/.
19
20
21 dnl  Runs at 2.5 cycles/limb.  It would be possible to reach 2.0 cycles/limb
22 dnl  with 8-way unrolling.
23
24 include(`../config.m4')
25
26 dnl  INPUT PARAMETERS
27 define(`rp',`r16')
28 define(`up',`r17')
29 define(`vp',`r18')
30 define(`n',`r19')
31
32 define(`rl0',`r0')
33 define(`rl1',`r1')
34 define(`rl2',`r2')
35 define(`rl3',`r3')
36
37 define(`ul0',`r4')
38 define(`ul1',`r5')
39 define(`ul2',`r6')
40 define(`ul3',`r7')
41
42 define(`vl0',`r22')
43 define(`vl1',`r23')
44 define(`vl2',`r24')
45 define(`vl3',`r25')
46
47 define(`numb_mask',`r21')
48
49 define(`NAIL_BITS',`GMP_NAIL_BITS')
50 define(`CYSH',`GMP_NUMB_BITS')
51
52 dnl  This declaration is munged by configure
53 NAILS_SUPPORT(1-63)
54
55 ifdef(`OPERATION_add_n', `
56         define(`OP',        addq)
57         define(`CYSH',`GMP_NUMB_BITS')
58         define(`func',  mpn_add_n)')
59 ifdef(`OPERATION_sub_n', `
60         define(`OP',        subq)
61         define(`CYSH',63)
62         define(`func',  mpn_sub_n)')
63
64 MULFUNC_PROLOGUE(mpn_add_n mpn_sub_n)
65
66 ASM_START()
67 PROLOGUE(func)
68         lda     numb_mask, -1(r31)
69         srl     numb_mask, NAIL_BITS, numb_mask
70         bis     r31,    r31,    r20
71
72         and     n,      3,      r25
73         lda     n,      -4(n)
74         beq     r25,    L(ge4)
75
76 L(lp0): ldq     ul0,    0(up)
77         lda     up,     8(up)
78         ldq     vl0,    0(vp)
79         lda     vp,     8(vp)
80         lda     rp,     8(rp)
81         lda     r25,    -1(r25)
82         OP      ul0,    vl0,    rl0
83         OP      rl0,    r20,    rl0
84         and     rl0, numb_mask, r28
85         stq     r28,    -8(rp)
86         srl     rl0,    CYSH,   r20
87         bne     r25,    L(lp0)
88
89         blt     n,      L(ret)
90
91 L(ge4): ldq     ul0,    0(up)
92         ldq     vl0,    0(vp)
93         ldq     ul1,    8(up)
94         ldq     vl1,    8(vp)
95         ldq     ul2,    16(up)
96         ldq     vl2,    16(vp)
97         ldq     ul3,    24(up)
98         ldq     vl3,    24(vp)
99         lda     up,     32(up)
100         lda     vp,     32(vp)
101         lda     n,      -4(n)
102         bge     n,      L(ge8)
103
104         OP      ul0,    vl0,    rl0     C               main-add 0
105         OP      rl0,    r20,    rl0     C               cy-add 0
106         OP      ul1,    vl1,    rl1     C               main-add 1
107         srl     rl0,    CYSH,   r20     C               gen cy 0
108         OP      rl1,    r20,    rl1     C               cy-add 1
109         and     rl0,numb_mask,  r27
110         br      r31,    L(cj0)
111
112 L(ge8): OP      ul0,    vl0,    rl0     C               main-add 0
113         ldq     ul0,    0(up)
114         ldq     vl0,    0(vp)
115         OP      rl0,    r20,    rl0     C               cy-add 0
116         OP      ul1,    vl1,    rl1     C               main-add 1
117         srl     rl0,    CYSH,   r20     C               gen cy 0
118         ldq     ul1,    8(up)
119         ldq     vl1,    8(vp)
120         OP      rl1,    r20,    rl1     C               cy-add 1
121         and     rl0,numb_mask,  r27
122         OP      ul2,    vl2,    rl2     C               main-add 2
123         srl     rl1,    CYSH,   r20     C               gen cy 1
124         ldq     ul2,    16(up)
125         ldq     vl2,    16(vp)
126         OP      rl2,    r20,    rl2     C               cy-add 2
127         and     rl1,numb_mask,  r28
128         stq     r27,    0(rp)
129         OP      ul3,    vl3,    rl3     C               main-add 3
130         srl     rl2,    CYSH,   r20     C               gen cy 2
131         ldq     ul3,    24(up)
132         ldq     vl3,    24(vp)
133         OP      rl3,    r20,    rl3     C               cy-add 3
134         and     rl2,numb_mask,  r27
135         stq     r28,    8(rp)
136         lda     rp,     32(rp)
137         lda     up,     32(up)
138         lda     vp,     32(vp)
139         lda     n,      -4(n)
140         blt     n,      L(end)
141
142         ALIGN(32)
143 L(top): OP      ul0,    vl0,    rl0     C               main-add 0
144         srl     rl3,    CYSH,   r20     C               gen cy 3
145         ldq     ul0,    0(up)
146         ldq     vl0,    0(vp)
147
148         OP      rl0,    r20,    rl0     C               cy-add 0
149         and     rl3,numb_mask,  r28
150         stq     r27,    -16(rp)
151         bis     r31,    r31,    r31
152
153         OP      ul1,    vl1,    rl1     C               main-add 1
154         srl     rl0,    CYSH,   r20     C               gen cy 0
155         ldq     ul1,    8(up)
156         ldq     vl1,    8(vp)
157
158         OP      rl1,    r20,    rl1     C               cy-add 1
159         and     rl0,numb_mask,  r27
160         stq     r28,    -8(rp)
161         bis     r31,    r31,    r31
162
163         OP      ul2,    vl2,    rl2     C               main-add 2
164         srl     rl1,    CYSH,   r20     C               gen cy 1
165         ldq     ul2,    16(up)
166         ldq     vl2,    16(vp)
167
168         OP      rl2,    r20,    rl2     C               cy-add 2
169         and     rl1,numb_mask,  r28
170         stq     r27,    0(rp)
171         bis     r31,    r31,    r31
172
173         OP      ul3,    vl3,    rl3     C               main-add 3
174         srl     rl2,    CYSH,   r20     C               gen cy 2
175         ldq     ul3,    24(up)
176         ldq     vl3,    24(vp)
177
178         OP      rl3,    r20,    rl3     C               cy-add 3
179         and     rl2,numb_mask,  r27
180         stq     r28,    8(rp)
181         bis     r31,    r31,    r31
182
183         bis     r31,    r31,    r31
184         lda     n,      -4(n)
185         lda     up,     32(up)
186         lda     vp,     32(vp)
187
188         bis     r31,    r31,    r31
189         bis     r31,    r31,    r31
190         lda     rp,     32(rp)
191         bge     n,      L(top)
192
193 L(end): OP      ul0,    vl0,    rl0     C               main-add 0
194         srl     rl3,    CYSH,   r20     C               gen cy 3
195         OP      rl0,    r20,    rl0     C               cy-add 0
196         and     rl3,numb_mask,  r28
197         stq     r27,    -16(rp)
198         OP      ul1,    vl1,    rl1     C               main-add 1
199         srl     rl0,    CYSH,   r20     C               gen cy 0
200         OP      rl1,    r20,    rl1     C               cy-add 1
201         and     rl0,numb_mask,  r27
202         stq     r28,    -8(rp)
203 L(cj0): OP      ul2,    vl2,    rl2     C               main-add 2
204         srl     rl1,    CYSH,   r20     C               gen cy 1
205         OP      rl2,    r20,    rl2     C               cy-add 2
206         and     rl1,numb_mask,  r28
207         stq     r27,    0(rp)
208         OP      ul3,    vl3,    rl3     C               main-add 3
209         srl     rl2,    CYSH,   r20     C               gen cy 2
210         OP      rl3,    r20,    rl3     C               cy-add 3
211         and     rl2,numb_mask,  r27
212         stq     r28,    8(rp)
213
214         srl     rl3,    CYSH,   r20     C               gen cy 3
215         and     rl3,numb_mask,  r28
216         stq     r27,    16(rp)
217         stq     r28,    24(rp)
218
219 L(ret): and     r20,    1,      r0
220         ret     r31,    (r26),  1
221 EPILOGUE()
222 ASM_END()