~ubuntu-branches/ubuntu/intrepid/ecl/intrepid

« back to all changes in this revision

Viewing changes to src/gmp/mpn/pa64/submul_1.asm

  • Committer: Bazaar Package Importer
  • Author(s): Peter Van Eynde
  • Date: 2007-04-09 11:51:51 UTC
  • mfrom: (1.1.3 upstream)
  • Revision ID: james.westby@ubuntu.com-20070409115151-ql8cr0kalzx1jmla
Tags: 0.9i-20070324-2
Upload to unstable. 

Show diffs side-by-side

added added

removed removed

Lines of Context:
16
16
dnl  License for more details.
17
17
 
18
18
dnl  You should have received a copy of the GNU Lesser General Public License
19
 
dnl  along with the GNU MP Library; see the file COPYING.LIB.  If not, write to
20
 
dnl  the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
21
 
dnl  MA 02111-1307, USA.
22
 
 
23
 
 
24
 
dnl  This approaches ?? cycles/limb on PA8000 and 6.75 cycles/limb on PA8500
25
 
dnl  for huge operands.
26
 
 
27
 
dnl  The feed-in and wind-down code has not yet been scheduled.  Many cycles
28
 
dnl  could be saved there per call.
29
 
 
30
 
dnl  DESCRIPTION:
31
 
dnl  The main loop "BIG" is 4-way unrolled, mainly to allow
32
 
dnl  effective use of ADD,DC.  Delays in moving data via the cache from the FP
33
 
dnl  registers to the IU registers, have demaned a deep software pipeline, and
34
 
dnl  a lot of stack slots for partial products in flight.
35
 
dnl
36
 
dnl  CODE STRUCTURE:
37
 
dnl  save-some-registers
38
 
dnl  do 0, 1, 2, or 3 limbs
39
 
dnl  if done, restore-some-regs and return
40
 
dnl  save-many-regs
41
 
dnl  do 4, 8, ... limb
42
 
dnl  restore-all-regs
43
 
 
44
 
dnl  STACK LAYOUT:
45
 
dnl  HP-PA stack grows upwards.  We could allocate 8 fewer slots by using the
46
 
dnl  slots marked FREE, as well as some slots in the caller's "frame marker".
47
 
dnl
48
 
dnl -00 <- r30
49
 
dnl -08  FREE
50
 
dnl -10  tmp
51
 
dnl -18  tmp
52
 
dnl -20  tmp
53
 
dnl -28  tmp
54
 
dnl -30  tmp
55
 
dnl -38  tmp
56
 
dnl -40  tmp
57
 
dnl -48  tmp
58
 
dnl -50  tmp
59
 
dnl -58  tmp
60
 
dnl -60  tmp
61
 
dnl -68  tmp
62
 
dnl -70  tmp
63
 
dnl -78  tmp
64
 
dnl -80  tmp
65
 
dnl -88  tmp
66
 
dnl -90  FREE
67
 
dnl -98  FREE
68
 
dnl -a0  FREE
69
 
dnl -a8  FREE
70
 
dnl -b0  r13
71
 
dnl -b8  r12
72
 
dnl -c0  r11
73
 
dnl -c8  r10
74
 
dnl -d0  r8
75
 
dnl -d8  r8
76
 
dnl -e0  r7
77
 
dnl -e8  r6
78
 
dnl -f0  r5
79
 
dnl -f8  r4
80
 
dnl -100 r3
81
 
dnl  Previous frame:
82
 
dnl  [unused area]
83
 
dnl -38/-138 vlimb home slot.  For 2.0N, the vlimb arg will arrive here.
84
 
 
85
 
 
86
 
include(`../config.m4')
87
 
 
88
 
dnl INPUT PARAMETERS:
89
 
define(`rp',`%r26')     dnl
90
 
define(`up',`%r25')     dnl
91
 
define(`n',`%r24')      dnl
92
 
define(`vlimb',`%r23')  dnl
93
 
 
94
 
define(`climb',`%r23')  dnl
 
19
dnl  along with the GNU MP Library; see the file COPYING.LIB.  If not, write
 
20
dnl  to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 
21
dnl  Boston, MA 02110-1301, USA.
 
22
 
 
23
include(`../config.m4')
 
24
 
 
25
C                   cycles/limb
 
26
C 8000,8200:            7
 
27
C 8500,8600,8700:       6.5
 
28
 
 
29
C  The feed-in and wind-down code has not yet been scheduled.  Many cycles
 
30
C  could be saved there per call.
 
31
 
 
32
C  DESCRIPTION:
 
33
C  The main loop "BIG" is 4-way unrolled, mainly to allow
 
34
C  effective use of ADD,DC.  Delays in moving data via the cache from the FP
 
35
C  registers to the IU registers, have demanded a deep software pipeline, and
 
36
C  a lot of stack slots for partial products in flight.
 
37
C
 
38
C  CODE STRUCTURE:
 
39
C  save-some-registers
 
40
C  do 0, 1, 2, or 3 limbs
 
41
C  if done, restore-some-regs and return
 
42
C  save-many-regs
 
43
C  do 4, 8, ... limb
 
44
C  restore-all-regs
 
45
 
 
46
C  STACK LAYOUT:
 
47
C  HP-PA stack grows upwards.  We could allocate 8 fewer slots by using the
 
48
C  slots marked FREE, as well as some slots in the caller's "frame marker".
 
49
C
 
50
C -00 <- r30
 
51
C -08  FREE
 
52
C -10  tmp
 
53
C -18  tmp
 
54
C -20  tmp
 
55
C -28  tmp
 
56
C -30  tmp
 
57
C -38  tmp
 
58
C -40  tmp
 
59
C -48  tmp
 
60
C -50  tmp
 
61
C -58  tmp
 
62
C -60  tmp
 
63
C -68  tmp
 
64
C -70  tmp
 
65
C -78  tmp
 
66
C -80  tmp
 
67
C -88  tmp
 
68
C -90  FREE
 
69
C -98  FREE
 
70
C -a0  FREE
 
71
C -a8  FREE
 
72
C -b0  r13
 
73
C -b8  r12
 
74
C -c0  r11
 
75
C -c8  r10
 
76
C -d0  r8
 
77
C -d8  r8
 
78
C -e0  r7
 
79
C -e8  r6
 
80
C -f0  r5
 
81
C -f8  r4
 
82
C -100 r3
 
83
C  Previous frame:
 
84
C  [unused area]
 
85
C -38/-138 vlimb home slot.  For 2.0N, the vlimb arg will arrive here.
 
86
 
 
87
 
 
88
include(`../config.m4')
 
89
 
 
90
C INPUT PARAMETERS:
 
91
define(`rp',`%r26')     C
 
92
define(`up',`%r25')     C
 
93
define(`n',`%r24')      C
 
94
define(`vlimb',`%r23')  C
 
95
 
 
96
define(`climb',`%r23')  C
95
97
 
96
98
ifdef(`HAVE_ABI_2_0w',
97
99
`       .level  2.0w
108
110
        ldo             0(%r0), climb           C clear climb
109
111
        fldd            -0x138(%r30), %fr8      C put vlimb in fp register
110
112
 
111
 
define(`p032a1',`%r1')  dnl
112
 
define(`p032a2',`%r19') dnl
113
 
 
114
 
define(`m032',`%r20')   dnl
115
 
define(`m096',`%r21')   dnl
116
 
 
117
 
define(`p000a',`%r22')  dnl
118
 
define(`p064a',`%r29')  dnl
119
 
 
120
 
define(`s000',`%r31')   dnl
121
 
 
122
 
define(`ma000',`%r4')   dnl
123
 
define(`ma064',`%r20')  dnl
124
 
 
125
 
define(`r000',`%r3')    dnl
 
113
define(`p032a1',`%r1')  C
 
114
define(`p032a2',`%r19') C
 
115
 
 
116
define(`m032',`%r20')   C
 
117
define(`m096',`%r21')   C
 
118
 
 
119
define(`p000a',`%r22')  C
 
120
define(`p064a',`%r29')  C
 
121
 
 
122
define(`s000',`%r31')   C
 
123
 
 
124
define(`ma000',`%r4')   C
 
125
define(`ma064',`%r20')  C
 
126
 
 
127
define(`r000',`%r3')    C
126
128
 
127
129
        extrd,u         n, 63, 2, %r5
128
130
        cmpb,=          %r5, %r0, L(BIG)
139
141
        fstd            %fr24, -0x80(%r30)      C low product to  -0x80..-0x79
140
142
        addib,<>        -1, %r5, L(two_or_more)
141
143
        fstd            %fr25, -0x68(%r30)      C high product to -0x68..-0x61
142
 
L(one)
 
144
LDEF(one)
143
145
        ldd             -0x78(%r30), p032a1
144
146
        ldd             -0x70(%r30), p032a2
145
147
        ldd             -0x80(%r30), p000a
146
148
        b               L(0_one_out)
147
149
        ldd             -0x68(%r30), p064a
148
150
 
149
 
L(two_or_more)
 
151
LDEF(two_or_more)
150
152
        fldd            0(up), %fr4
151
153
        ldo             8(up), up
152
154
        xmpyu           %fr8R, %fr4L, %fr22
162
164
        ldd             -0x68(%r30), p064a
163
165
        addib,<>        -1, %r5, L(three_or_more)
164
166
        fstd            %fr25, -0x68(%r30)      C high product to -0x68..-0x61
165
 
L(two)
 
167
LDEF(two)
166
168
        add             p032a1, p032a2, m032
167
169
        add,dc          %r0, %r0, m096
168
170
        depd,z          m032, 31, 32, ma000
171
173
        b               L(0_two_out)
172
174
        depd            m096, 31, 32, ma064
173
175
 
174
 
L(three_or_more)
 
176
LDEF(three_or_more)
175
177
        fldd            0(up), %fr4
176
178
        add             p032a1, p032a2, m032
177
179
        add,dc          %r0, %r0, m096
178
180
        depd,z          m032, 31, 32, ma000
179
181
        extrd,u         m032, 31, 32, ma064
180
182
        ldd             0(rp), r000
181
 
dnl     addib,=         -1, %r5, L(0_out)
 
183
C       addib,=         -1, %r5, L(0_out)
182
184
        depd            m096, 31, 32, ma064
183
 
L(oop0)
184
 
dnl     xmpyu           %fr8R, %fr4L, %fr22
185
 
dnl     xmpyu           %fr8L, %fr4R, %fr23
186
 
dnl     ldd             -0x78(%r30), p032a1
187
 
dnl     fstd            %fr22, -0x78(%r30)      C mid product to  -0x78..-0x71
188
 
dnl
189
 
dnl     xmpyu           %fr8R, %fr4R, %fr24
190
 
dnl     xmpyu           %fr8L, %fr4L, %fr25
191
 
dnl     ldd             -0x70(%r30), p032a2
192
 
dnl     fstd            %fr23, -0x70(%r30)      C mid product to  -0x70..-0x69
193
 
dnl
194
 
dnl     ldo             8(rp), rp
195
 
dnl     add             climb, p000a, s000
196
 
dnl     ldd             -0x80(%r30), p000a
197
 
dnl     fstd            %fr24, -0x80(%r30)      C low product to  -0x80..-0x79
198
 
dnl
199
 
dnl     add,dc          p064a, %r0, climb
200
 
dnl     ldo             8(up), up
201
 
dnl     ldd             -0x68(%r30), p064a
202
 
dnl     fstd            %fr25, -0x68(%r30)      C high product to -0x68..-0x61
203
 
dnl
204
 
dnl     add             ma000, s000, s000
205
 
dnl     add,dc          ma064, climb, climb
206
 
dnl     fldd            0(up), %fr4
207
 
dnl
208
 
dnl     sub             r000, s000, s000
209
 
dnl     sub,db          %r0, climb, climb
210
 
dnl     sub             %r0, climb, climb
211
 
dnl     std             s000, -8(rp)
212
 
dnl
213
 
dnl     add             p032a1, p032a2, m032
214
 
dnl     add,dc          %r0, %r0, m096
215
 
dnl
216
 
dnl     depd,z          m032, 31, 32, ma000
217
 
dnl     extrd,u         m032, 31, 32, ma064
218
 
dnl     ldd             0(rp), r000
219
 
dnl     addib,<>        -1, %r5, L(oop0)
220
 
dnl     depd            m096, 31, 32, ma064
221
 
L(0_out)
 
185
LDEF(loop0)
 
186
C       xmpyu           %fr8R, %fr4L, %fr22
 
187
C       xmpyu           %fr8L, %fr4R, %fr23
 
188
C       ldd             -0x78(%r30), p032a1
 
189
C       fstd            %fr22, -0x78(%r30)      C mid product to  -0x78..-0x71
 
190
C
 
191
C       xmpyu           %fr8R, %fr4R, %fr24
 
192
C       xmpyu           %fr8L, %fr4L, %fr25
 
193
C       ldd             -0x70(%r30), p032a2
 
194
C       fstd            %fr23, -0x70(%r30)      C mid product to  -0x70..-0x69
 
195
C
 
196
C       ldo             8(rp), rp
 
197
C       add             climb, p000a, s000
 
198
C       ldd             -0x80(%r30), p000a
 
199
C       fstd            %fr24, -0x80(%r30)      C low product to  -0x80..-0x79
 
200
C
 
201
C       add,dc          p064a, %r0, climb
 
202
C       ldo             8(up), up
 
203
C       ldd             -0x68(%r30), p064a
 
204
C       fstd            %fr25, -0x68(%r30)      C high product to -0x68..-0x61
 
205
C
 
206
C       add             ma000, s000, s000
 
207
C       add,dc          ma064, climb, climb
 
208
C       fldd            0(up), %fr4
 
209
C
 
210
C       sub             r000, s000, s000
 
211
C       sub,db          %r0, climb, climb
 
212
C       sub             %r0, climb, climb
 
213
C       std             s000, -8(rp)
 
214
C
 
215
C       add             p032a1, p032a2, m032
 
216
C       add,dc          %r0, %r0, m096
 
217
C
 
218
C       depd,z          m032, 31, 32, ma000
 
219
C       extrd,u         m032, 31, 32, ma064
 
220
C       ldd             0(rp), r000
 
221
C       addib,<>        -1, %r5, L(loop0)
 
222
C       depd            m096, 31, 32, ma064
 
223
LDEF(0_out)
222
224
        ldo             8(up), up
223
225
        xmpyu           %fr8R, %fr4L, %fr22
224
226
        xmpyu           %fr8L, %fr4R, %fr23
247
249
        extrd,u         m032, 31, 32, ma064
248
250
        ldd             0(rp), r000
249
251
        depd            m096, 31, 32, ma064
250
 
L(0_two_out)
 
252
LDEF(0_two_out)
251
253
        ldd             -0x78(%r30), p032a1
252
254
        ldd             -0x70(%r30), p032a2
253
255
        ldo             8(rp), rp
261
263
        sub,db          %r0, climb, climb
262
264
        sub             %r0, climb, climb
263
265
        std             s000, -8(rp)
264
 
L(0_one_out)
 
266
LDEF(0_one_out)
265
267
        add             p032a1, p032a2, m032
266
268
        add,dc          %r0, %r0, m096
267
269
        depd,z          m032, 31, 32, ma000
281
283
        cmpib,>=        4, n, L(done)
282
284
        ldo             8(rp), rp
283
285
 
284
 
dnl 4-way unrolled code.
285
 
 
286
 
L(BIG)
287
 
 
288
 
define(`p032a1',`%r1')  dnl
289
 
define(`p032a2',`%r19') dnl
290
 
define(`p096b1',`%r20') dnl
291
 
define(`p096b2',`%r21') dnl
292
 
define(`p160c1',`%r22') dnl
293
 
define(`p160c2',`%r29') dnl
294
 
define(`p224d1',`%r31') dnl
295
 
define(`p224d2',`%r3')  dnl
296
 
                        dnl
297
 
define(`m032',`%r4')    dnl
298
 
define(`m096',`%r5')    dnl
299
 
define(`m160',`%r6')    dnl
300
 
define(`m224',`%r7')    dnl
301
 
define(`m288',`%r8')    dnl
302
 
                        dnl
303
 
define(`p000a',`%r1')   dnl
304
 
define(`p064a',`%r19')  dnl
305
 
define(`p064b',`%r20')  dnl
306
 
define(`p128b',`%r21')  dnl
307
 
define(`p128c',`%r22')  dnl
308
 
define(`p192c',`%r29')  dnl
309
 
define(`p192d',`%r31')  dnl
310
 
define(`p256d',`%r3')   dnl
311
 
                        dnl
312
 
define(`s000',`%r10')   dnl
313
 
define(`s064',`%r11')   dnl
314
 
define(`s128',`%r12')   dnl
315
 
define(`s192',`%r13')   dnl
316
 
                        dnl
317
 
define(`ma000',`%r9')   dnl
318
 
define(`ma064',`%r4')   dnl
319
 
define(`ma128',`%r5')   dnl
320
 
define(`ma192',`%r6')   dnl
321
 
define(`ma256',`%r7')   dnl
322
 
                        dnl
323
 
define(`r000',`%r1')    dnl
324
 
define(`r064',`%r19')   dnl
325
 
define(`r128',`%r20')   dnl
326
 
define(`r192',`%r21')   dnl
 
286
C 4-way unrolled code.
 
287
 
 
288
LDEF(BIG)
 
289
 
 
290
define(`p032a1',`%r1')  C
 
291
define(`p032a2',`%r19') C
 
292
define(`p096b1',`%r20') C
 
293
define(`p096b2',`%r21') C
 
294
define(`p160c1',`%r22') C
 
295
define(`p160c2',`%r29') C
 
296
define(`p224d1',`%r31') C
 
297
define(`p224d2',`%r3')  C
 
298
                        C
 
299
define(`m032',`%r4')    C
 
300
define(`m096',`%r5')    C
 
301
define(`m160',`%r6')    C
 
302
define(`m224',`%r7')    C
 
303
define(`m288',`%r8')    C
 
304
                        C
 
305
define(`p000a',`%r1')   C
 
306
define(`p064a',`%r19')  C
 
307
define(`p064b',`%r20')  C
 
308
define(`p128b',`%r21')  C
 
309
define(`p128c',`%r22')  C
 
310
define(`p192c',`%r29')  C
 
311
define(`p192d',`%r31')  C
 
312
define(`p256d',`%r3')   C
 
313
                        C
 
314
define(`s000',`%r10')   C
 
315
define(`s064',`%r11')   C
 
316
define(`s128',`%r12')   C
 
317
define(`s192',`%r13')   C
 
318
                        C
 
319
define(`ma000',`%r9')   C
 
320
define(`ma064',`%r4')   C
 
321
define(`ma128',`%r5')   C
 
322
define(`ma192',`%r6')   C
 
323
define(`ma256',`%r7')   C
 
324
                        C
 
325
define(`r000',`%r1')    C
 
326
define(`r064',`%r19')   C
 
327
define(`r128',`%r20')   C
 
328
define(`r192',`%r21')   C
327
329
 
328
330
        std             %r6, -0xe8(%r30)
329
331
        std             %r7, -0xe0(%r30)
339
341
',`     extrd,u         n, 61, 30, n            C right shift 2, zero extend
340
342
')
341
343
 
342
 
L(4_or_more)
 
344
LDEF(4_or_more)
343
345
        fldd            0(up), %fr4
344
346
        fldd            8(up), %fr5
345
347
        fldd            16(up), %fr6
388
390
        b               L(end1)
389
391
        nop
390
392
 
391
 
L(8_or_more)
 
393
LDEF(8_or_more)
392
394
        fstd            %fr28, -0x18(%r30)      C mid product to  -0x18..-0x11
393
395
        fstd            %fr29, -0x10(%r30)      C mid product to  -0x10..-0x09
394
396
        ldo             32(up), up
435
437
        fstd            %fr27, -0x50(%r30)      C mid product to  -0x50..-0x49
436
438
        addib,=         -1, n, L(end2)
437
439
        xmpyu           %fr8L, %fr7L, %fr27
438
 
L(oop)
 
440
LDEF(loop)
439
441
        add             p032a1, p032a2, m032
440
442
        ldd             -0x80(%r30), p000a
441
443
        add,dc          p096b1, p096b2, m096
550
552
        fstd            %fr27, -0x50(%r30)      C mid product to  -0x50..-0x49
551
553
        xmpyu           %fr8L, %fr7L, %fr27
552
554
 
553
 
        addib,<>        -1, n, L(oop)
 
555
        addib,<>        -1, n, L(loop)
554
556
        ldo             32(rp), rp
555
557
 
556
 
L(end2)
 
558
LDEF(end2)
557
559
        add             p032a1, p032a2, m032
558
560
        ldd             -0x80(%r30), p000a
559
561
        add,dc          p096b1, p096b2, m096
620
622
        ldd             -0x10(%r30), p224d2
621
623
        ldo             32(rp), rp
622
624
 
623
 
L(end1)
 
625
LDEF(end1)
624
626
        add             p032a1, p032a2, m032
625
627
        ldd             -0x80(%r30), p000a
626
628
        add,dc          p096b1, p096b2, m096
676
678
        ldd             -0xd8(%r30), %r8
677
679
        ldd             -0xe0(%r30), %r7
678
680
        ldd             -0xe8(%r30), %r6
679
 
L(done)
 
681
LDEF(done)
680
682
ifdef(`HAVE_ABI_2_0w',
681
683
`       copy            climb, %r28
682
684
',`     extrd,u         climb, 63, 32, %r29