beta-0.89.2
[luatex.git] / source / libs / gmp / gmp-src / mpn / alpha / aorslsh1_n.asm
blob9525e669db2a39a6bea39188fbd388a9271f8bda
1 dnl Alpha mpn_addlsh1_n/mpn_sublsh1_n -- rp[] = up[] +- (vp[] << 1).
3 dnl Copyright 2003, 2013 Free Software Foundation, Inc.
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 modify
8 dnl it under the terms of either:
9 dnl
10 dnl * the GNU Lesser General Public License as published by the Free
11 dnl Software Foundation; either version 3 of the License, or (at your
12 dnl option) any later version.
13 dnl
14 dnl or
15 dnl
16 dnl * the GNU General Public License as published by the Free Software
17 dnl Foundation; either version 2 of the License, or (at your option) any
18 dnl later version.
19 dnl
20 dnl or both in parallel, as here.
21 dnl
22 dnl The GNU MP Library is distributed in the hope that it will be useful, but
23 dnl WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
24 dnl or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
25 dnl for more details.
26 dnl
27 dnl You should have received copies of the GNU General Public License and the
28 dnl GNU Lesser General Public License along with the GNU MP Library. If not,
29 dnl see https://www.gnu.org/licenses/.
31 include(`../config.m4')
33 C cycles/limb
34 C EV4: ?
35 C EV5: 6.25
36 C EV6: 4.5
38 define(`rp',`r16')
39 define(`up',`r17')
40 define(`vp',`r18')
41 define(`n', `r19')
43 define(`u0', `r8')
44 define(`u1', `r1')
45 define(`v0', `r4')
46 define(`v1', `r5')
48 define(`cy0', `r0')
49 define(`cy1', `r20')
50 define(`cy', `r22')
51 define(`rr', `r24')
52 define(`ps', `r25')
53 define(`sl', `r28')
55 ifdef(`OPERATION_addlsh1_n',`
56 define(ADDSUB, addq)
57 define(CARRY, `cmpult $1,$2,$3')
58 define(func, mpn_addlsh1_n)
60 ifdef(`OPERATION_sublsh1_n',`
61 define(ADDSUB, subq)
62 define(CARRY, `cmpult $2,$1,$3')
63 define(func, mpn_sublsh1_n)
66 MULFUNC_PROLOGUE(mpn_addlsh1_n mpn_sublsh1_n)
68 ASM_START()
69 PROLOGUE(func)
70 and n, 2, cy0
71 blbs n, L(bx1)
72 L(bx0): ldq v1, 0(vp)
73 ldq u1, 0(up)
74 nop
75 bne cy0, L(b10)
77 L(b00): lda vp, 48(vp)
78 lda up, -16(up)
79 lda rp, -8(rp)
80 br r31, L(lo0)
82 L(b10): lda vp, 32(vp)
83 lda rp, 8(rp)
84 lda cy0, 0(r31)
85 br r31, L(lo2)
87 L(bx1): ldq v0, 0(vp)
88 ldq u0, 0(up)
89 lda cy1, 0(r31)
90 beq cy0, L(b01)
92 L(b11): lda vp, 40(vp)
93 lda up, -24(up)
94 lda rp, 16(rp)
95 br r31, L(lo3)
97 L(b01): lda n, -4(n)
98 ble n, L(end)
99 lda vp, 24(vp)
100 lda up, -8(up)
102 ALIGN(16)
103 L(top): addq v0, v0, sl C left shift vlimb
104 ldq v1, -16(vp)
105 ADDSUB u0, sl, ps C ulimb + (vlimb << 1)
106 cmplt v0, r31, cy0 C carry out #1
107 ldq u1, 16(up)
108 ADDSUB ps, cy1, rr C consume carry from previous operation
109 CARRY( ps, u0, cy) C carry out #2
110 stq rr, 0(rp)
111 addq cy, cy0, cy0 C combine carry out #1 and #2
112 CARRY( rr, ps, cy) C carry out #3
113 addq cy, cy0, cy0 C final carry out
114 lda vp, 32(vp) C bookkeeping
115 L(lo0): addq v1, v1, sl
116 ldq v0, -40(vp)
117 ADDSUB u1, sl, ps
118 cmplt v1, r31, cy1
119 ldq u0, 24(up)
120 ADDSUB ps, cy0, rr
121 CARRY( ps, u1, cy)
122 stq rr, 8(rp)
123 addq cy, cy1, cy1
124 CARRY( rr, ps, cy)
125 addq cy, cy1, cy1
126 lda rp, 32(rp) C bookkeeping
127 L(lo3): addq v0, v0, sl
128 ldq v1, -32(vp)
129 ADDSUB u0, sl, ps
130 cmplt v0, r31, cy0
131 ldq u1, 32(up)
132 ADDSUB ps, cy1, rr
133 CARRY( ps, u0, cy)
134 stq rr, -16(rp)
135 addq cy, cy0, cy0
136 CARRY( rr, ps, cy)
137 addq cy, cy0, cy0
138 lda up, 32(up) C bookkeeping
139 L(lo2): addq v1, v1, sl
140 ldq v0, -24(vp)
141 ADDSUB u1, sl, ps
142 cmplt v1, r31, cy1
143 ldq u0, 8(up)
144 ADDSUB ps, cy0, rr
145 CARRY( ps, u1, cy)
146 stq rr, -8(rp)
147 addq cy, cy1, cy1
148 CARRY( rr, ps, cy)
149 addq cy, cy1, cy1
150 lda n, -4(n) C bookkeeping
151 bgt n, L(top)
153 L(end): addq v0, v0, sl
154 ADDSUB u0, sl, ps
155 ADDSUB ps, cy1, rr
156 cmplt v0, r31, cy0
157 CARRY( ps, u0, cy)
158 stq rr, 0(rp)
159 addq cy, cy0, cy0
160 CARRY( rr, ps, cy)
161 addq cy, cy0, r0
162 ret r31,(r26),1
163 EPILOGUE()
164 ASM_END()