1 | # Alpha 21064 __mpn_rshift -- |
2 | |
3 | # Copyright (C) 1994-2022 Free Software Foundation, Inc. |
4 | |
5 | # This file is part of the GNU MP Library. |
6 | |
7 | # The GNU MP Library is free software; you can redistribute it and/or modify |
8 | # it under the terms of the GNU Lesser General Public License as published by |
9 | # the Free Software Foundation; either version 2.1 of the License, or (at your |
10 | # option) any later version. |
11 | |
12 | # The GNU MP Library is distributed in the hope that it will be useful, but |
13 | # WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY |
14 | # or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public |
15 | # License for more details. |
16 | |
17 | # You should have received a copy of the GNU Lesser General Public License |
18 | # along with the GNU MP Library. If not, see <https://www.gnu.org/licenses/>. |
19 | |
20 | |
21 | # INPUT PARAMETERS |
22 | # res_ptr r16 |
23 | # s1_ptr r17 |
24 | # size r18 |
25 | # cnt r19 |
26 | |
27 | # This code runs at 4.8 cycles/limb on the 21064. With infinite unrolling, |
28 | # it would take 4 cycles/limb. It should be possible to get down to 3 |
29 | # cycles/limb since both ldq and stq can be paired with the other used |
30 | # instructions. But there are many restrictions in the 21064 pipeline that |
31 | # makes it hard, if not impossible, to get down to 3 cycles/limb: |
32 | |
33 | # 1. ldq has a 3 cycle delay, srl and sll have a 2 cycle delay. |
34 | # 2. Only aligned instruction pairs can be paired. |
35 | # 3. The store buffer or silo might not be able to deal with the bandwidth. |
36 | |
37 | .set noreorder |
38 | .set noat |
39 | .text |
40 | .align 3 |
41 | .globl __mpn_rshift |
42 | .ent __mpn_rshift |
43 | __mpn_rshift: |
44 | .frame $30,0,$26,0 |
45 | |
46 | ldq $4,0($17) # load first limb |
47 | addq $17,8,$17 |
48 | subq $31,$19,$7 |
49 | subq $18,1,$18 |
50 | and $18,4-1,$20 # number of limbs in first loop |
51 | sll $4,$7,$0 # compute function result |
52 | |
53 | beq $20,.L0 |
54 | subq $18,$20,$18 |
55 | |
56 | .align 3 |
57 | .Loop0: |
58 | ldq $3,0($17) |
59 | addq $16,8,$16 |
60 | addq $17,8,$17 |
61 | subq $20,1,$20 |
62 | srl $4,$19,$5 |
63 | sll $3,$7,$6 |
64 | bis $3,$3,$4 |
65 | bis $5,$6,$8 |
66 | stq $8,-8($16) |
67 | bne $20,.Loop0 |
68 | |
69 | .L0: beq $18,.Lend |
70 | |
71 | .align 3 |
72 | .Loop: ldq $3,0($17) |
73 | addq $16,32,$16 |
74 | subq $18,4,$18 |
75 | srl $4,$19,$5 |
76 | sll $3,$7,$6 |
77 | |
78 | ldq $4,8($17) |
79 | srl $3,$19,$1 |
80 | bis $5,$6,$8 |
81 | stq $8,-32($16) |
82 | sll $4,$7,$2 |
83 | |
84 | ldq $3,16($17) |
85 | srl $4,$19,$5 |
86 | bis $1,$2,$8 |
87 | stq $8,-24($16) |
88 | sll $3,$7,$6 |
89 | |
90 | ldq $4,24($17) |
91 | srl $3,$19,$1 |
92 | bis $5,$6,$8 |
93 | stq $8,-16($16) |
94 | sll $4,$7,$2 |
95 | |
96 | addq $17,32,$17 |
97 | bis $1,$2,$8 |
98 | stq $8,-8($16) |
99 | |
100 | bgt $18,.Loop |
101 | |
102 | .Lend: srl $4,$19,$8 |
103 | stq $8,0($16) |
104 | ret $31,($26),1 |
105 | .end __mpn_rshift |
106 | |