Copyright consolidation: perl files
[oweals/openssl.git] / crypto / bn / asm / alpha-mont.pl
1 #!/usr/bin/env perl
2 #
3 # ====================================================================
4 # Written by Andy Polyakov <appro@fy.chalmers.se> for the OpenSSL
5 # project. The module is, however, dual licensed under OpenSSL and
6 # CRYPTOGAMS licenses depending on where you obtain it. For further
7 # details see http://www.openssl.org/~appro/cryptogams/.
8 # ====================================================================
9 #
10 # On 21264 RSA sign performance improves by 70/35/20/15 percent for
11 # 512/1024/2048/4096 bit key lengths. This is against vendor compiler
12 # instructed to '-tune host' code with in-line assembler. Other
13 # benchmarks improve by 15-20%. To anchor it to something else, the
14 # code provides approximately the same performance per GHz as AMD64.
15 # I.e. if you compare 1GHz 21264 and 2GHz Opteron, you'll observe ~2x
16 # difference.
17
18 $output=pop;
19 open STDOUT,">$output";
20
21 # int bn_mul_mont(
22 $rp="a0";       # BN_ULONG *rp,
23 $ap="a1";       # const BN_ULONG *ap,
24 $bp="a2";       # const BN_ULONG *bp,
25 $np="a3";       # const BN_ULONG *np,
26 $n0="a4";       # const BN_ULONG *n0,
27 $num="a5";      # int num);
28
29 $lo0="t0";
30 $hi0="t1";
31 $lo1="t2";
32 $hi1="t3";
33 $aj="t4";
34 $bi="t5";
35 $nj="t6";
36 $tp="t7";
37 $alo="t8";
38 $ahi="t9";
39 $nlo="t10";
40 $nhi="t11";
41 $tj="t12";
42 $i="s3";
43 $j="s4";
44 $m1="s5";
45
46 $code=<<___;
47 #ifdef __linux__
48 #include <asm/regdef.h>
49 #else
50 #include <asm.h>
51 #include <regdef.h>
52 #endif
53
54 .text
55
56 .set    noat
57 .set    noreorder
58
59 .globl  bn_mul_mont
60 .align  5
61 .ent    bn_mul_mont
62 bn_mul_mont:
63         lda     sp,-48(sp)
64         stq     ra,0(sp)
65         stq     s3,8(sp)
66         stq     s4,16(sp)
67         stq     s5,24(sp)
68         stq     fp,32(sp)
69         mov     sp,fp
70         .mask   0x0400f000,-48
71         .frame  fp,48,ra
72         .prologue 0
73
74         .align  4
75         .set    reorder
76         sextl   $num,$num
77         mov     0,v0
78         cmplt   $num,4,AT
79         bne     AT,.Lexit
80
81         ldq     $hi0,0($ap)     # ap[0]
82         s8addq  $num,16,AT
83         ldq     $aj,8($ap)
84         subq    sp,AT,sp
85         ldq     $bi,0($bp)      # bp[0]
86         lda     AT,-4096(zero)  # mov   -4096,AT
87         ldq     $n0,0($n0)
88         and     sp,AT,sp
89
90         mulq    $hi0,$bi,$lo0
91         ldq     $hi1,0($np)     # np[0]
92         umulh   $hi0,$bi,$hi0
93         ldq     $nj,8($np)
94
95         mulq    $lo0,$n0,$m1
96
97         mulq    $hi1,$m1,$lo1
98         umulh   $hi1,$m1,$hi1
99
100         addq    $lo1,$lo0,$lo1
101         cmpult  $lo1,$lo0,AT
102         addq    $hi1,AT,$hi1
103
104         mulq    $aj,$bi,$alo
105         mov     2,$j
106         umulh   $aj,$bi,$ahi
107         mov     sp,$tp
108
109         mulq    $nj,$m1,$nlo
110         s8addq  $j,$ap,$aj
111         umulh   $nj,$m1,$nhi
112         s8addq  $j,$np,$nj
113 .align  4
114 .L1st:
115         .set    noreorder
116         ldq     $aj,0($aj)
117         addl    $j,1,$j
118         ldq     $nj,0($nj)
119         lda     $tp,8($tp)
120
121         addq    $alo,$hi0,$lo0
122         mulq    $aj,$bi,$alo
123         cmpult  $lo0,$hi0,AT
124         addq    $nlo,$hi1,$lo1
125
126         mulq    $nj,$m1,$nlo
127         addq    $ahi,AT,$hi0
128         cmpult  $lo1,$hi1,v0
129         cmplt   $j,$num,$tj
130
131         umulh   $aj,$bi,$ahi
132         addq    $nhi,v0,$hi1
133         addq    $lo1,$lo0,$lo1
134         s8addq  $j,$ap,$aj
135
136         umulh   $nj,$m1,$nhi
137         cmpult  $lo1,$lo0,v0
138         addq    $hi1,v0,$hi1
139         s8addq  $j,$np,$nj
140
141         stq     $lo1,-8($tp)
142         nop
143         unop
144         bne     $tj,.L1st
145         .set    reorder
146
147         addq    $alo,$hi0,$lo0
148         addq    $nlo,$hi1,$lo1
149         cmpult  $lo0,$hi0,AT
150         cmpult  $lo1,$hi1,v0
151         addq    $ahi,AT,$hi0
152         addq    $nhi,v0,$hi1
153
154         addq    $lo1,$lo0,$lo1
155         cmpult  $lo1,$lo0,v0
156         addq    $hi1,v0,$hi1
157
158         stq     $lo1,0($tp)
159
160         addq    $hi1,$hi0,$hi1
161         cmpult  $hi1,$hi0,AT
162         stq     $hi1,8($tp)
163         stq     AT,16($tp)
164
165         mov     1,$i
166 .align  4
167 .Louter:
168         s8addq  $i,$bp,$bi
169         ldq     $hi0,0($ap)
170         ldq     $aj,8($ap)
171         ldq     $bi,0($bi)
172         ldq     $hi1,0($np)
173         ldq     $nj,8($np)
174         ldq     $tj,0(sp)
175
176         mulq    $hi0,$bi,$lo0
177         umulh   $hi0,$bi,$hi0
178
179         addq    $lo0,$tj,$lo0
180         cmpult  $lo0,$tj,AT
181         addq    $hi0,AT,$hi0
182
183         mulq    $lo0,$n0,$m1
184
185         mulq    $hi1,$m1,$lo1
186         umulh   $hi1,$m1,$hi1
187
188         addq    $lo1,$lo0,$lo1
189         cmpult  $lo1,$lo0,AT
190         mov     2,$j
191         addq    $hi1,AT,$hi1
192
193         mulq    $aj,$bi,$alo
194         mov     sp,$tp
195         umulh   $aj,$bi,$ahi
196
197         mulq    $nj,$m1,$nlo
198         s8addq  $j,$ap,$aj
199         umulh   $nj,$m1,$nhi
200 .align  4
201 .Linner:
202         .set    noreorder
203         ldq     $tj,8($tp)      #L0
204         nop                     #U1
205         ldq     $aj,0($aj)      #L1
206         s8addq  $j,$np,$nj      #U0
207
208         ldq     $nj,0($nj)      #L0
209         nop                     #U1
210         addq    $alo,$hi0,$lo0  #L1
211         lda     $tp,8($tp)
212
213         mulq    $aj,$bi,$alo    #U1
214         cmpult  $lo0,$hi0,AT    #L0
215         addq    $nlo,$hi1,$lo1  #L1
216         addl    $j,1,$j
217
218         mulq    $nj,$m1,$nlo    #U1
219         addq    $ahi,AT,$hi0    #L0
220         addq    $lo0,$tj,$lo0   #L1
221         cmpult  $lo1,$hi1,v0    #U0
222
223         umulh   $aj,$bi,$ahi    #U1
224         cmpult  $lo0,$tj,AT     #L0
225         addq    $lo1,$lo0,$lo1  #L1
226         addq    $nhi,v0,$hi1    #U0
227
228         umulh   $nj,$m1,$nhi    #U1
229         s8addq  $j,$ap,$aj      #L0
230         cmpult  $lo1,$lo0,v0    #L1
231         cmplt   $j,$num,$tj     #U0     # borrow $tj
232
233         addq    $hi0,AT,$hi0    #L0
234         addq    $hi1,v0,$hi1    #U1
235         stq     $lo1,-8($tp)    #L1
236         bne     $tj,.Linner     #U0
237         .set    reorder
238
239         ldq     $tj,8($tp)
240         addq    $alo,$hi0,$lo0
241         addq    $nlo,$hi1,$lo1
242         cmpult  $lo0,$hi0,AT
243         cmpult  $lo1,$hi1,v0
244         addq    $ahi,AT,$hi0
245         addq    $nhi,v0,$hi1
246
247         addq    $lo0,$tj,$lo0
248         cmpult  $lo0,$tj,AT
249         addq    $hi0,AT,$hi0
250
251         ldq     $tj,16($tp)
252         addq    $lo1,$lo0,$j
253         cmpult  $j,$lo0,v0
254         addq    $hi1,v0,$hi1
255
256         addq    $hi1,$hi0,$lo1
257         stq     $j,0($tp)
258         cmpult  $lo1,$hi0,$hi1
259         addq    $lo1,$tj,$lo1
260         cmpult  $lo1,$tj,AT
261         addl    $i,1,$i
262         addq    $hi1,AT,$hi1
263         stq     $lo1,8($tp)
264         cmplt   $i,$num,$tj     # borrow $tj
265         stq     $hi1,16($tp)
266         bne     $tj,.Louter
267 \f
268         s8addq  $num,sp,$tj     # &tp[num]
269         mov     $rp,$bp         # put rp aside
270         mov     sp,$tp
271         mov     sp,$ap
272         mov     0,$hi0          # clear borrow bit
273
274 .align  4
275 .Lsub:  ldq     $lo0,0($tp)
276         ldq     $lo1,0($np)
277         lda     $tp,8($tp)
278         lda     $np,8($np)
279         subq    $lo0,$lo1,$lo1  # tp[i]-np[i]
280         cmpult  $lo0,$lo1,AT
281         subq    $lo1,$hi0,$lo0
282         cmpult  $lo1,$lo0,$hi0
283         or      $hi0,AT,$hi0
284         stq     $lo0,0($rp)
285         cmpult  $tp,$tj,v0
286         lda     $rp,8($rp)
287         bne     v0,.Lsub
288
289         subq    $hi1,$hi0,$hi0  # handle upmost overflow bit
290         mov     sp,$tp
291         mov     $bp,$rp         # restore rp
292
293         and     sp,$hi0,$ap
294         bic     $bp,$hi0,$bp
295         bis     $bp,$ap,$ap     # ap=borrow?tp:rp
296
297 .align  4
298 .Lcopy: ldq     $aj,0($ap)      # copy or in-place refresh
299         lda     $tp,8($tp)
300         lda     $rp,8($rp)
301         lda     $ap,8($ap)
302         stq     zero,-8($tp)    # zap tp
303         cmpult  $tp,$tj,AT
304         stq     $aj,-8($rp)
305         bne     AT,.Lcopy
306         mov     1,v0
307
308 .Lexit:
309         .set    noreorder
310         mov     fp,sp
311         /*ldq   ra,0(sp)*/
312         ldq     s3,8(sp)
313         ldq     s4,16(sp)
314         ldq     s5,24(sp)
315         ldq     fp,32(sp)
316         lda     sp,48(sp)
317         ret     (ra)
318 .end    bn_mul_mont
319 .ascii  "Montgomery Multiplication for Alpha, CRYPTOGAMS by <appro\@openssl.org>"
320 .align  2
321 ___
322
323 print $code;
324 close STDOUT;