bfe869dd0fc5c288272e59a6eda051f2041b7fe6
[openssl.git] / crypto / bn / asm / sparcv8.S
1 .ident  "sparcv8.s, Version 1.1"
2 .ident  "SPARC v8 ISA artwork by Andy Polyakov <appro@fy.chalmers.se>"
3
4 /*
5  * ====================================================================
6  * Written by Andy Polyakov <appro@fy.chalmers.se> for the OpenSSL
7  * project.
8  *
9  * Rights for redistribution and usage in source and binary forms are
10  * granted according to the OpenSSL license. Warranty of any kind is
11  * disclaimed.
12  * ====================================================================
13  */
14
15 /*
16  * This is my modest contributon to OpenSSL project (see
17  * http://www.openssl.org/ for more information about it) and is
18  * a drop-in SuperSPARC ISA replacement for crypto/bn/bn_asm.c
19  * module. For updates see http://fy.chalmers.se/~appro/hpe/.
20  *
21  * See bn_asm.sparc.v8plus.S for more details.
22  */
23
24 /*
25  * Revision history.
26  *
27  * 1.1  - new loop unrolling model(*)
28  *      - 10% performance boost(*)
29  *
30  * (*)  see bn_asm.sparc.v8plus.S for details
31  */
32
33 .section        ".text",#alloc,#execinstr
34 .file           "sparcv8.s"
35
36 .align  32
37
38 .global bn_mul_add_words
39 /*
40  * BN_ULONG bn_mul_add_words(rp,ap,num,w)
41  * BN_ULONG *rp,*ap;
42  * int num;
43  * BN_ULONG w;
44  */
45 bn_mul_add_words:
46         cmp     %o2,0
47         bg,a    .L_bn_mul_add_words_proceed
48         ld      [%o1],%g2
49         retl
50         clr     %o0
51
52 .L_bn_mul_add_words_proceed:
53         andcc   %o2,-4,%g0
54         bz      .L_bn_mul_add_words_tail
55         clr     %o5
56
57         umul    %o3,%g2,%g2
58         ld      [%o0],%o4
59         rd      %y,%g1
60         addcc   %o4,%g2,%o4
61         ld      [%o1+4],%g3
62         addx    %g1,0,%o5
63         ba      .L_bn_mul_add_words_warm_loop
64         st      %o4,[%o0]
65
66 .L_bn_mul_add_words_loop:
67         ld      [%o0],%o4
68         umul    %o3,%g2,%g2
69         rd      %y,%g1
70         addcc   %o4,%o5,%o4
71         ld      [%o1+4],%g3
72         addx    %g1,0,%g1
73         addcc   %o4,%g2,%o4
74         nop
75         addx    %g1,0,%o5
76         st      %o4,[%o0]
77
78 .L_bn_mul_add_words_warm_loop:
79         ld      [%o0+4],%o4
80         umul    %o3,%g3,%g3
81         dec     4,%o2
82         rd      %y,%g1
83         addcc   %o4,%o5,%o4
84         ld      [%o1+8],%g2
85         addx    %g1,0,%g1
86         addcc   %o4,%g3,%o4
87         addx    %g1,0,%o5
88         st      %o4,[%o0+4]
89
90         ld      [%o0+8],%o4
91         umul    %o3,%g2,%g2
92         inc     16,%o1
93         rd      %y,%g1
94         addcc   %o4,%o5,%o4
95         ld      [%o1-4],%g3
96         addx    %g1,0,%g1
97         addcc   %o4,%g2,%o4
98         addx    %g1,0,%o5
99         st      %o4,[%o0+8]
100
101         ld      [%o0+12],%o4
102         umul    %o3,%g3,%g3
103         inc     16,%o0
104         rd      %y,%g1
105         addcc   %o4,%o5,%o4
106         addx    %g1,0,%g1
107         addcc   %o4,%g3,%o4
108         addx    %g1,0,%o5
109         st      %o4,[%o0-4]
110         andcc   %o2,-4,%g0
111         bnz,a   .L_bn_mul_add_words_loop
112         ld      [%o1],%g2
113
114         tst     %o2
115         bnz,a   .L_bn_mul_add_words_tail
116         ld      [%o1],%g2
117 .L_bn_mul_add_words_return:
118         retl
119         mov     %o5,%o0
120         nop
121
122 .L_bn_mul_add_words_tail:
123         ld      [%o0],%o4
124         umul    %o3,%g2,%g2
125         addcc   %o4,%o5,%o4
126         rd      %y,%g1
127         addx    %g1,0,%g1
128         addcc   %o4,%g2,%o4
129         addx    %g1,0,%o5
130         deccc   %o2
131         bz      .L_bn_mul_add_words_return
132         st      %o4,[%o0]
133
134         ld      [%o1+4],%g2
135         umul    %o3,%g2,%g2
136         ld      [%o0+4],%o4
137         rd      %y,%g1
138         addcc   %o4,%o5,%o4
139         nop
140         addx    %g1,0,%g1
141         addcc   %o4,%g2,%o4
142         addx    %g1,0,%o5
143         deccc   %o2
144         bz      .L_bn_mul_add_words_return
145         st      %o4,[%o0+4]
146
147         ld      [%o1+8],%g2
148         umul    %o3,%g2,%g2
149         ld      [%o0+8],%o4
150         rd      %y,%g1
151         addcc   %o4,%o5,%o4
152         addx    %g1,0,%g1
153         addcc   %o4,%g2,%o4
154         st      %o4,[%o0+8]
155         retl
156         addx    %g1,0,%o0
157
158 .type   bn_mul_add_words,#function
159 .size   bn_mul_add_words,(.-bn_mul_add_words)
160
161 .align  32
162
163 .global bn_mul_words
164 /*
165  * BN_ULONG bn_mul_words(rp,ap,num,w)
166  * BN_ULONG *rp,*ap;
167  * int num;
168  * BN_ULONG w;
169  */
170 bn_mul_words:
171         cmp     %o2,0
172         bg,a    .L_bn_mul_words_proceeed
173         ld      [%o1],%g2
174         retl
175         clr     %o0
176
177 .L_bn_mul_words_proceeed:
178         andcc   %o2,-4,%g0
179         bz      .L_bn_mul_words_tail
180         clr     %o5
181
182 .L_bn_mul_words_loop:
183         ld      [%o1+4],%g3
184         umul    %o3,%g2,%g2
185         addcc   %g2,%o5,%g2
186         rd      %y,%g1
187         addx    %g1,0,%o5
188         st      %g2,[%o0]
189
190         ld      [%o1+8],%g2
191         umul    %o3,%g3,%g3
192         addcc   %g3,%o5,%g3
193         rd      %y,%g1
194         dec     4,%o2
195         addx    %g1,0,%o5
196         st      %g3,[%o0+4]
197
198         ld      [%o1+12],%g3
199         umul    %o3,%g2,%g2
200         addcc   %g2,%o5,%g2
201         rd      %y,%g1
202         inc     16,%o1
203         st      %g2,[%o0+8]
204         addx    %g1,0,%o5
205
206         umul    %o3,%g3,%g3
207         addcc   %g3,%o5,%g3
208         rd      %y,%g1
209         inc     16,%o0
210         addx    %g1,0,%o5
211         st      %g3,[%o0-4]
212         andcc   %o2,-4,%g0
213         nop
214         bnz,a   .L_bn_mul_words_loop
215         ld      [%o1],%g2
216
217         tst     %o2
218         bnz,a   .L_bn_mul_words_tail
219         ld      [%o1],%g2
220 .L_bn_mul_words_return:
221         retl
222         mov     %o5,%o0
223         nop
224
225 .L_bn_mul_words_tail:
226         umul    %o3,%g2,%g2
227         addcc   %g2,%o5,%g2
228         rd      %y,%g1
229         addx    %g1,0,%o5
230         deccc   %o2
231         bz      .L_bn_mul_words_return
232         st      %g2,[%o0]
233         nop
234
235         ld      [%o1+4],%g2
236         umul    %o3,%g2,%g2
237         addcc   %g2,%o5,%g2
238         rd      %y,%g1
239         addx    %g1,0,%o5
240         deccc   %o2
241         bz      .L_bn_mul_words_return
242         st      %g2,[%o0+4]
243
244         ld      [%o1+8],%g2
245         umul    %o3,%g2,%g2
246         addcc   %g2,%o5,%g2
247         rd      %y,%g1
248         st      %g2,[%o0+8]
249         retl
250         addx    %g1,0,%o0
251
252 .type   bn_mul_words,#function
253 .size   bn_mul_words,(.-bn_mul_words)
254
255 .align  32
256 .global bn_sqr_words
257 /*
258  * void bn_sqr_words(r,a,n)
259  * BN_ULONG *r,*a;
260  * int n;
261  */
262 bn_sqr_words:
263         cmp     %o2,0
264         bg,a    .L_bn_sqr_words_proceeed
265         ld      [%o1],%g2
266         retl
267         clr     %o0
268
269 .L_bn_sqr_words_proceeed:
270         andcc   %o2,-4,%g0
271         bz      .L_bn_sqr_words_tail
272         clr     %o5
273
274 .L_bn_sqr_words_loop:
275         ld      [%o1+4],%g3
276         umul    %g2,%g2,%o4
277         st      %o4,[%o0]
278         rd      %y,%o5
279         st      %o5,[%o0+4]
280
281         ld      [%o1+8],%g2
282         umul    %g3,%g3,%o4
283         dec     4,%o2
284         st      %o4,[%o0+8]
285         rd      %y,%o5
286         st      %o5,[%o0+12]
287         nop
288
289         ld      [%o1+12],%g3
290         umul    %g2,%g2,%o4
291         st      %o4,[%o0+16]
292         rd      %y,%o5
293         inc     16,%o1
294         st      %o5,[%o0+20]
295
296         umul    %g3,%g3,%o4
297         inc     32,%o0
298         st      %o4,[%o0-8]
299         rd      %y,%o5
300         st      %o5,[%o0-4]
301         andcc   %o2,-4,%g2
302         bnz,a   .L_bn_sqr_words_loop
303         ld      [%o1],%g2
304
305         tst     %o2
306         nop
307         bnz,a   .L_bn_sqr_words_tail
308         ld      [%o1],%g2
309 .L_bn_sqr_words_return:
310         retl
311         clr     %o0
312
313 .L_bn_sqr_words_tail:
314         umul    %g2,%g2,%o4
315         st      %o4,[%o0]
316         deccc   %o2
317         rd      %y,%o5
318         bz      .L_bn_sqr_words_return
319         st      %o5,[%o0+4]
320
321         ld      [%o1+4],%g2
322         umul    %g2,%g2,%o4
323         st      %o4,[%o0+8]
324         deccc   %o2
325         rd      %y,%o5
326         nop
327         bz      .L_bn_sqr_words_return
328         st      %o5,[%o0+12]
329
330         ld      [%o1+8],%g2
331         umul    %g2,%g2,%o4
332         st      %o4,[%o0+16]
333         rd      %y,%o5
334         st      %o5,[%o0+20]
335         retl
336         clr     %o0
337
338 .type   bn_sqr_words,#function
339 .size   bn_sqr_words,(.-bn_sqr_words)
340
341 .align  32
342
343 .global bn_div_words
344 /*
345  * BN_ULONG bn_div_words(h,l,d)
346  * BN_ULONG h,l,d;
347  */
348 bn_div_words:
349         wr      %o0,%y
350         udiv    %o1,%o2,%o0
351         retl
352         nop
353
354 .type   bn_div_words,#function
355 .size   bn_div_words,(.-bn_div_words)
356
357 .align  32
358
359 .global bn_add_words
360 /*
361  * BN_ULONG bn_add_words(rp,ap,bp,n)
362  * BN_ULONG *rp,*ap,*bp;
363  * int n;
364  */
365 bn_add_words:
366         cmp     %o3,0
367         bg,a    .L_bn_add_words_proceed
368         ld      [%o1],%o4
369         retl
370         clr     %o0
371
372 .L_bn_add_words_proceed:
373         andcc   %o3,-4,%g0
374         bz      .L_bn_add_words_tail
375         clr     %g1
376         ld      [%o2],%o5
377         dec     4,%o3
378         addcc   %o5,%o4,%o5
379         nop
380         st      %o5,[%o0]
381         ba      .L_bn_add_words_warm_loop
382         ld      [%o1+4],%o4
383         nop
384
385 .L_bn_add_words_loop:
386         ld      [%o1],%o4
387         dec     4,%o3
388         ld      [%o2],%o5
389         addxcc  %o5,%o4,%o5
390         st      %o5,[%o0]
391
392         ld      [%o1+4],%o4
393 .L_bn_add_words_warm_loop:
394         inc     16,%o1
395         ld      [%o2+4],%o5
396         addxcc  %o5,%o4,%o5
397         st      %o5,[%o0+4]
398         
399         ld      [%o1-8],%o4
400         inc     16,%o2
401         ld      [%o2-8],%o5
402         addxcc  %o5,%o4,%o5
403         st      %o5,[%o0+8]
404
405         ld      [%o1-4],%o4
406         inc     16,%o0
407         ld      [%o2-4],%o5
408         addxcc  %o5,%o4,%o5
409         st      %o5,[%o0-4]
410         addx    %g0,0,%g1
411         andcc   %o3,-4,%g0
412         bnz,a   .L_bn_add_words_loop
413         addcc   %g1,-1,%g0
414
415         tst     %o3
416         nop
417         bnz,a   .L_bn_add_words_tail
418         ld      [%o1],%o4
419 .L_bn_add_words_return:
420         retl
421         mov     %g1,%o0
422
423 .L_bn_add_words_tail:
424         addcc   %g1,-1,%g0
425         ld      [%o2],%o5
426         addxcc  %o5,%o4,%o5
427         addx    %g0,0,%g1
428         deccc   %o3
429         bz      .L_bn_add_words_return
430         st      %o5,[%o0]
431         nop
432
433         ld      [%o1+4],%o4
434         addcc   %g1,-1,%g0
435         ld      [%o2+4],%o5
436         addxcc  %o5,%o4,%o5
437         addx    %g0,0,%g1
438         deccc   %o3
439         bz      .L_bn_add_words_return
440         st      %o5,[%o0+4]
441
442         ld      [%o1+8],%o4
443         addcc   %g1,-1,%g0
444         ld      [%o2+8],%o5
445         addxcc  %o5,%o4,%o5
446         st      %o5,[%o0+8]
447         retl
448         addx    %g0,0,%o0
449
450 .type   bn_add_words,#function
451 .size   bn_add_words,(.-bn_add_words)
452
453 .align  32
454
455 .global bn_sub_words
456 /*
457  * BN_ULONG bn_sub_words(rp,ap,bp,n)
458  * BN_ULONG *rp,*ap,*bp;
459  * int n;
460  */
461 bn_sub_words:
462         cmp     %o3,0
463         bg,a    .L_bn_sub_words_proceed
464         ld      [%o1],%o4
465         retl
466         clr     %o0
467
468 .L_bn_sub_words_proceed:
469         andcc   %o3,-4,%g0
470         bz      .L_bn_sub_words_tail
471         clr     %g1
472         ld      [%o2],%o5
473         dec     4,%o3
474         subcc   %o4,%o5,%o5
475         nop
476         st      %o5,[%o0]
477         ba      .L_bn_sub_words_warm_loop
478         ld      [%o1+4],%o4
479         nop
480
481 .L_bn_sub_words_loop:
482         ld      [%o1],%o4
483         dec     4,%o3
484         ld      [%o2],%o5
485         subxcc  %o4,%o5,%o5
486         st      %o5,[%o0]
487
488         ld      [%o1+4],%o4
489 .L_bn_sub_words_warm_loop:
490         inc     16,%o1
491         ld      [%o2+4],%o5
492         subxcc  %o4,%o5,%o5
493         st      %o5,[%o0+4]
494         
495         ld      [%o1-8],%o4
496         inc     16,%o2
497         ld      [%o2-8],%o5
498         subxcc  %o4,%o5,%o5
499         st      %o5,[%o0+8]
500
501         ld      [%o1-4],%o4
502         inc     16,%o0
503         ld      [%o2-4],%o5
504         subxcc  %o4,%o5,%o5
505         st      %o5,[%o0-4]
506         addx    %g0,0,%g1
507         andcc   %o3,-4,%g0
508         bnz,a   .L_bn_sub_words_loop
509         addcc   %g1,-1,%g0
510
511         tst     %o3
512         nop
513         bnz,a   .L_bn_sub_words_tail
514         ld      [%o1],%o4
515 .L_bn_sub_words_return:
516         retl
517         mov     %g1,%o0
518
519 .L_bn_sub_words_tail:
520         addcc   %g1,-1,%g0
521         ld      [%o2],%o5
522         subxcc  %o4,%o5,%o5
523         addx    %g0,0,%g1
524         deccc   %o3
525         bz      .L_bn_sub_words_return
526         st      %o5,[%o0]
527         nop
528
529         ld      [%o1+4],%o4
530         addcc   %g1,-1,%g0
531         ld      [%o2+4],%o5
532         subxcc  %o4,%o5,%o5
533         addx    %g0,0,%g1
534         deccc   %o3
535         bz      .L_bn_sub_words_return
536         st      %o5,[%o0+4]
537
538         ld      [%o1+8],%o4
539         addcc   %g1,-1,%g0
540         ld      [%o2+8],%o5
541         subxcc  %o4,%o5,%o5
542         st      %o5,[%o0+8]
543         retl
544         addx    %g0,0,%o0
545
546 .type   bn_sub_words,#function
547 .size   bn_sub_words,(.-bn_sub_words)
548
549 #define FRAME_SIZE -96
550
551 /*
552  * Here is register usage map for *all* routines below.
553  */
554 #define a_0     %l0
555 #define a_0_    [%i1]
556 #define a_1     %l1
557 #define a_1_    [%i1+4]
558 #define a_2     %l2
559 #define a_2_    [%i1+8]
560 #define a_3     %l3
561 #define a_3_    [%i1+12]
562 #define a_4     %l4
563 #define a_4_    [%i1+16]
564 #define a_5     %l5
565 #define a_5_    [%i1+20]
566 #define a_6     %l6
567 #define a_6_    [%i1+24]
568 #define a_7     %l7
569 #define a_7_    [%i1+28]
570 #define b_0     %g1
571 #define b_0_    [%i2]
572 #define b_1     %g2
573 #define b_1_    [%i2+4]
574 #define b_2     %g3
575 #define b_2_    [%i2+8]
576 #define b_3     %g4
577 #define b_3_    [%i2+12]
578 #define b_4     %i3
579 #define b_4_    [%i2+16]
580 #define b_5     %i4
581 #define b_5_    [%i2+20]
582 #define b_6     %i5
583 #define b_6_    [%i2+24]
584 #define b_7     %o5
585 #define b_7_    [%i2+28]
586 #define c_1     %o2
587 #define c_2     %o3
588 #define c_3     %o4
589 #define t_1     %o0
590 #define t_2     %o1
591
592 .align  32
593 .global bn_mul_comba8
594 /*
595  * void bn_mul_comba8(r,a,b)
596  * BN_ULONG *r,*a,*b;
597  */
598 bn_mul_comba8:
599         save    %sp,FRAME_SIZE,%sp
600         ld      a_0_,a_0
601         ld      b_0_,b_0
602         umul    a_0,b_0,c_1     !=!mul_add_c(a[0],b[0],c1,c2,c3);
603         ld      b_1_,b_1
604         rd      %y,c_2
605         st      c_1,[%i0]       !r[0]=c1;
606
607         umul    a_0,b_1,t_1     !=!mul_add_c(a[0],b[1],c2,c3,c1);
608         ld      a_1_,a_1
609         addcc   c_2,t_1,c_2
610         rd      %y,t_2
611         addxcc  %g0,t_2,c_3     !=
612         addx    %g0,%g0,c_1
613         ld      a_2_,a_2
614         umul    a_1,b_0,t_1     !mul_add_c(a[1],b[0],c2,c3,c1);
615         addcc   c_2,t_1,c_2     !=
616         rd      %y,t_2
617         addxcc  c_3,t_2,c_3
618         st      c_2,[%i0+4]     !r[1]=c2;
619         addx    c_1,%g0,c_1     !=
620
621         umul    a_2,b_0,t_1     !mul_add_c(a[2],b[0],c3,c1,c2);
622         addcc   c_3,t_1,c_3
623         rd      %y,t_2
624         addxcc  c_1,t_2,c_1     !=
625         addx    %g0,%g0,c_2
626         ld      b_2_,b_2
627         umul    a_1,b_1,t_1     !mul_add_c(a[1],b[1],c3,c1,c2);
628         addcc   c_3,t_1,c_3     !=
629         rd      %y,t_2
630         addxcc  c_1,t_2,c_1
631         ld      b_3_,b_3
632         addx    c_2,%g0,c_2     !=
633         umul    a_0,b_2,t_1     !mul_add_c(a[0],b[2],c3,c1,c2);
634         addcc   c_3,t_1,c_3
635         rd      %y,t_2
636         addxcc  c_1,t_2,c_1     !=
637         addx    c_2,%g0,c_2
638         st      c_3,[%i0+8]     !r[2]=c3;
639
640         umul    a_0,b_3,t_1     !mul_add_c(a[0],b[3],c1,c2,c3);
641         addcc   c_1,t_1,c_1     !=
642         rd      %y,t_2
643         addxcc  c_2,t_2,c_2
644         addx    %g0,%g0,c_3
645         umul    a_1,b_2,t_1     !=!mul_add_c(a[1],b[2],c1,c2,c3);
646         addcc   c_1,t_1,c_1
647         rd      %y,t_2
648         addxcc  c_2,t_2,c_2
649         addx    c_3,%g0,c_3     !=
650         ld      a_3_,a_3
651         umul    a_2,b_1,t_1     !mul_add_c(a[2],b[1],c1,c2,c3);
652         addcc   c_1,t_1,c_1
653         rd      %y,t_2          !=
654         addxcc  c_2,t_2,c_2
655         addx    c_3,%g0,c_3
656         ld      a_4_,a_4
657         umul    a_3,b_0,t_1     !mul_add_c(a[3],b[0],c1,c2,c3);!=
658         addcc   c_1,t_1,c_1
659         rd      %y,t_2
660         addxcc  c_2,t_2,c_2
661         addx    c_3,%g0,c_3     !=
662         st      c_1,[%i0+12]    !r[3]=c1;
663
664         umul    a_4,b_0,t_1     !mul_add_c(a[4],b[0],c2,c3,c1);
665         addcc   c_2,t_1,c_2
666         rd      %y,t_2          !=
667         addxcc  c_3,t_2,c_3
668         addx    %g0,%g0,c_1
669         umul    a_3,b_1,t_1     !mul_add_c(a[3],b[1],c2,c3,c1);
670         addcc   c_2,t_1,c_2     !=
671         rd      %y,t_2
672         addxcc  c_3,t_2,c_3
673         addx    c_1,%g0,c_1
674         umul    a_2,b_2,t_1     !=!mul_add_c(a[2],b[2],c2,c3,c1);
675         addcc   c_2,t_1,c_2
676         rd      %y,t_2
677         addxcc  c_3,t_2,c_3
678         addx    c_1,%g0,c_1     !=
679         ld      b_4_,b_4
680         umul    a_1,b_3,t_1     !mul_add_c(a[1],b[3],c2,c3,c1);
681         addcc   c_2,t_1,c_2
682         rd      %y,t_2          !=
683         addxcc  c_3,t_2,c_3
684         addx    c_1,%g0,c_1
685         ld      b_5_,b_5
686         umul    a_0,b_4,t_1     !=!mul_add_c(a[0],b[4],c2,c3,c1);
687         addcc   c_2,t_1,c_2
688         rd      %y,t_2
689         addxcc  c_3,t_2,c_3
690         addx    c_1,%g0,c_1     !=
691         st      c_2,[%i0+16]    !r[4]=c2;
692
693         umul    a_0,b_5,t_1     !mul_add_c(a[0],b[5],c3,c1,c2);
694         addcc   c_3,t_1,c_3
695         rd      %y,t_2          !=
696         addxcc  c_1,t_2,c_1
697         addx    %g0,%g0,c_2
698         umul    a_1,b_4,t_1     !mul_add_c(a[1],b[4],c3,c1,c2);
699         addcc   c_3,t_1,c_3     !=
700         rd      %y,t_2
701         addxcc  c_1,t_2,c_1
702         addx    c_2,%g0,c_2
703         umul    a_2,b_3,t_1     !=!mul_add_c(a[2],b[3],c3,c1,c2);
704         addcc   c_3,t_1,c_3
705         rd      %y,t_2
706         addxcc  c_1,t_2,c_1
707         addx    c_2,%g0,c_2     !=
708         umul    a_3,b_2,t_1     !mul_add_c(a[3],b[2],c3,c1,c2);
709         addcc   c_3,t_1,c_3
710         rd      %y,t_2
711         addxcc  c_1,t_2,c_1     !=
712         addx    c_2,%g0,c_2
713         ld      a_5_,a_5
714         umul    a_4,b_1,t_1     !mul_add_c(a[4],b[1],c3,c1,c2);
715         addcc   c_3,t_1,c_3     !=
716         rd      %y,t_2
717         addxcc  c_1,t_2,c_1
718         ld      a_6_,a_6
719         addx    c_2,%g0,c_2     !=
720         umul    a_5,b_0,t_1     !mul_add_c(a[5],b[0],c3,c1,c2);
721         addcc   c_3,t_1,c_3
722         rd      %y,t_2
723         addxcc  c_1,t_2,c_1     !=
724         addx    c_2,%g0,c_2
725         st      c_3,[%i0+20]    !r[5]=c3;
726
727         umul    a_6,b_0,t_1     !mul_add_c(a[6],b[0],c1,c2,c3);
728         addcc   c_1,t_1,c_1     !=
729         rd      %y,t_2
730         addxcc  c_2,t_2,c_2
731         addx    %g0,%g0,c_3
732         umul    a_5,b_1,t_1     !=!mul_add_c(a[5],b[1],c1,c2,c3);
733         addcc   c_1,t_1,c_1
734         rd      %y,t_2
735         addxcc  c_2,t_2,c_2
736         addx    c_3,%g0,c_3     !=
737         umul    a_4,b_2,t_1     !mul_add_c(a[4],b[2],c1,c2,c3);
738         addcc   c_1,t_1,c_1
739         rd      %y,t_2
740         addxcc  c_2,t_2,c_2     !=
741         addx    c_3,%g0,c_3
742         umul    a_3,b_3,t_1     !mul_add_c(a[3],b[3],c1,c2,c3);
743         addcc   c_1,t_1,c_1
744         rd      %y,t_2          !=
745         addxcc  c_2,t_2,c_2
746         addx    c_3,%g0,c_3
747         umul    a_2,b_4,t_1     !mul_add_c(a[2],b[4],c1,c2,c3);
748         addcc   c_1,t_1,c_1     !=
749         rd      %y,t_2
750         addxcc  c_2,t_2,c_2
751         ld      b_6_,b_6
752         addx    c_3,%g0,c_3     !=
753         umul    a_1,b_5,t_1     !mul_add_c(a[1],b[5],c1,c2,c3);
754         addcc   c_1,t_1,c_1
755         rd      %y,t_2
756         addxcc  c_2,t_2,c_2     !=
757         addx    c_3,%g0,c_3
758         ld      b_7_,b_7
759         umul    a_0,b_6,t_1     !mul_add_c(a[0],b[6],c1,c2,c3);
760         addcc   c_1,t_1,c_1     !=
761         rd      %y,t_2
762         addxcc  c_2,t_2,c_2
763         st      c_1,[%i0+24]    !r[6]=c1;
764         addx    c_3,%g0,c_3     !=
765
766         umul    a_0,b_7,t_1     !mul_add_c(a[0],b[7],c2,c3,c1);
767         addcc   c_2,t_1,c_2
768         rd      %y,t_2
769         addxcc  c_3,t_2,c_3     !=
770         addx    %g0,%g0,c_1
771         umul    a_1,b_6,t_1     !mul_add_c(a[1],b[6],c2,c3,c1);
772         addcc   c_2,t_1,c_2
773         rd      %y,t_2          !=
774         addxcc  c_3,t_2,c_3
775         addx    c_1,%g0,c_1
776         umul    a_2,b_5,t_1     !mul_add_c(a[2],b[5],c2,c3,c1);
777         addcc   c_2,t_1,c_2     !=
778         rd      %y,t_2
779         addxcc  c_3,t_2,c_3
780         addx    c_1,%g0,c_1
781         umul    a_3,b_4,t_1     !=!mul_add_c(a[3],b[4],c2,c3,c1);
782         addcc   c_2,t_1,c_2
783         rd      %y,t_2
784         addxcc  c_3,t_2,c_3
785         addx    c_1,%g0,c_1     !=
786         umul    a_4,b_3,t_1     !mul_add_c(a[4],b[3],c2,c3,c1);
787         addcc   c_2,t_1,c_2
788         rd      %y,t_2
789         addxcc  c_3,t_2,c_3     !=
790         addx    c_1,%g0,c_1
791         umul    a_5,b_2,t_1     !mul_add_c(a[5],b[2],c2,c3,c1);
792         addcc   c_2,t_1,c_2
793         rd      %y,t_2          !=
794         addxcc  c_3,t_2,c_3
795         addx    c_1,%g0,c_1
796         ld      a_7_,a_7
797         umul    a_6,b_1,t_1     !=!mul_add_c(a[6],b[1],c2,c3,c1);
798         addcc   c_2,t_1,c_2
799         rd      %y,t_2
800         addxcc  c_3,t_2,c_3
801         addx    c_1,%g0,c_1     !=
802         umul    a_7,b_0,t_1     !mul_add_c(a[7],b[0],c2,c3,c1);
803         addcc   c_2,t_1,c_2
804         rd      %y,t_2
805         addxcc  c_3,t_2,c_3     !=
806         addx    c_1,%g0,c_1
807         st      c_2,[%i0+28]    !r[7]=c2;
808
809         umul    a_7,b_1,t_1     !mul_add_c(a[7],b[1],c3,c1,c2);
810         addcc   c_3,t_1,c_3     !=
811         rd      %y,t_2
812         addxcc  c_1,t_2,c_1
813         addx    %g0,%g0,c_2
814         umul    a_6,b_2,t_1     !=!mul_add_c(a[6],b[2],c3,c1,c2);
815         addcc   c_3,t_1,c_3
816         rd      %y,t_2
817         addxcc  c_1,t_2,c_1
818         addx    c_2,%g0,c_2     !=
819         umul    a_5,b_3,t_1     !mul_add_c(a[5],b[3],c3,c1,c2);
820         addcc   c_3,t_1,c_3
821         rd      %y,t_2
822         addxcc  c_1,t_2,c_1     !=
823         addx    c_2,%g0,c_2
824         umul    a_4,b_4,t_1     !mul_add_c(a[4],b[4],c3,c1,c2);
825         addcc   c_3,t_1,c_3
826         rd      %y,t_2          !=
827         addxcc  c_1,t_2,c_1
828         addx    c_2,%g0,c_2
829         umul    a_3,b_5,t_1     !mul_add_c(a[3],b[5],c3,c1,c2);
830         addcc   c_3,t_1,c_3     !=
831         rd      %y,t_2
832         addxcc  c_1,t_2,c_1
833         addx    c_2,%g0,c_2
834         umul    a_2,b_6,t_1     !=!mul_add_c(a[2],b[6],c3,c1,c2);
835         addcc   c_3,t_1,c_3
836         rd      %y,t_2
837         addxcc  c_1,t_2,c_1
838         addx    c_2,%g0,c_2     !=
839         umul    a_1,b_7,t_1     !mul_add_c(a[1],b[7],c3,c1,c2);
840         addcc   c_3,t_1,c_3
841         rd      %y,t_2
842         addxcc  c_1,t_2,c_1     !
843         addx    c_2,%g0,c_2
844         st      c_3,[%i0+32]    !r[8]=c3;
845
846         umul    a_2,b_7,t_1     !mul_add_c(a[2],b[7],c1,c2,c3);
847         addcc   c_1,t_1,c_1     !=
848         rd      %y,t_2
849         addxcc  c_2,t_2,c_2
850         addx    %g0,%g0,c_3
851         umul    a_3,b_6,t_1     !=!mul_add_c(a[3],b[6],c1,c2,c3);
852         addcc   c_1,t_1,c_1
853         rd      %y,t_2
854         addxcc  c_2,t_2,c_2
855         addx    c_3,%g0,c_3     !=
856         umul    a_4,b_5,t_1     !mul_add_c(a[4],b[5],c1,c2,c3);
857         addcc   c_1,t_1,c_1
858         rd      %y,t_2
859         addxcc  c_2,t_2,c_2     !=
860         addx    c_3,%g0,c_3
861         umul    a_5,b_4,t_1     !mul_add_c(a[5],b[4],c1,c2,c3);
862         addcc   c_1,t_1,c_1
863         rd      %y,t_2          !=
864         addxcc  c_2,t_2,c_2
865         addx    c_3,%g0,c_3
866         umul    a_6,b_3,t_1     !mul_add_c(a[6],b[3],c1,c2,c3);
867         addcc   c_1,t_1,c_1     !=
868         rd      %y,t_2
869         addxcc  c_2,t_2,c_2
870         addx    c_3,%g0,c_3
871         umul    a_7,b_2,t_1     !=!mul_add_c(a[7],b[2],c1,c2,c3);
872         addcc   c_1,t_1,c_1
873         rd      %y,t_2
874         addxcc  c_2,t_2,c_2
875         addx    c_3,%g0,c_3     !=
876         st      c_1,[%i0+36]    !r[9]=c1;
877
878         umul    a_7,b_3,t_1     !mul_add_c(a[7],b[3],c2,c3,c1);
879         addcc   c_2,t_1,c_2
880         rd      %y,t_2          !=
881         addxcc  c_3,t_2,c_3
882         addx    %g0,%g0,c_1
883         umul    a_6,b_4,t_1     !mul_add_c(a[6],b[4],c2,c3,c1);
884         addcc   c_2,t_1,c_2     !=
885         rd      %y,t_2
886         addxcc  c_3,t_2,c_3
887         addx    c_1,%g0,c_1
888         umul    a_5,b_5,t_1     !=!mul_add_c(a[5],b[5],c2,c3,c1);
889         addcc   c_2,t_1,c_2
890         rd      %y,t_2
891         addxcc  c_3,t_2,c_3
892         addx    c_1,%g0,c_1     !=
893         umul    a_4,b_6,t_1     !mul_add_c(a[4],b[6],c2,c3,c1);
894         addcc   c_2,t_1,c_2
895         rd      %y,t_2
896         addxcc  c_3,t_2,c_3     !=
897         addx    c_1,%g0,c_1
898         umul    a_3,b_7,t_1     !mul_add_c(a[3],b[7],c2,c3,c1);
899         addcc   c_2,t_1,c_2
900         rd      %y,t_2          !=
901         addxcc  c_3,t_2,c_3
902         addx    c_1,%g0,c_1
903         st      c_2,[%i0+40]    !r[10]=c2;
904
905         umul    a_4,b_7,t_1     !=!mul_add_c(a[4],b[7],c3,c1,c2);
906         addcc   c_3,t_1,c_3
907         rd      %y,t_2
908         addxcc  c_1,t_2,c_1
909         addx    %g0,%g0,c_2     !=
910         umul    a_5,b_6,t_1     !mul_add_c(a[5],b[6],c3,c1,c2);
911         addcc   c_3,t_1,c_3
912         rd      %y,t_2
913         addxcc  c_1,t_2,c_1     !=
914         addx    c_2,%g0,c_2
915         umul    a_6,b_5,t_1     !mul_add_c(a[6],b[5],c3,c1,c2);
916         addcc   c_3,t_1,c_3
917         rd      %y,t_2          !=
918         addxcc  c_1,t_2,c_1
919         addx    c_2,%g0,c_2
920         umul    a_7,b_4,t_1     !mul_add_c(a[7],b[4],c3,c1,c2);
921         addcc   c_3,t_1,c_3     !=
922         rd      %y,t_2
923         addxcc  c_1,t_2,c_1
924         st      c_3,[%i0+44]    !r[11]=c3;
925         addx    c_2,%g0,c_2     !=
926
927         umul    a_7,b_5,t_1     !mul_add_c(a[7],b[5],c1,c2,c3);
928         addcc   c_1,t_1,c_1
929         rd      %y,t_2
930         addxcc  c_2,t_2,c_2     !=
931         addx    %g0,%g0,c_3
932         umul    a_6,b_6,t_1     !mul_add_c(a[6],b[6],c1,c2,c3);
933         addcc   c_1,t_1,c_1
934         rd      %y,t_2          !=
935         addxcc  c_2,t_2,c_2
936         addx    c_3,%g0,c_3
937         umul    a_5,b_7,t_1     !mul_add_c(a[5],b[7],c1,c2,c3);
938         addcc   c_1,t_1,c_1     !=
939         rd      %y,t_2
940         addxcc  c_2,t_2,c_2
941         st      c_1,[%i0+48]    !r[12]=c1;
942         addx    c_3,%g0,c_3     !=
943
944         umul    a_6,b_7,t_1     !mul_add_c(a[6],b[7],c2,c3,c1);
945         addcc   c_2,t_1,c_2
946         rd      %y,t_2
947         addxcc  c_3,t_2,c_3     !=
948         addx    %g0,%g0,c_1
949         umul    a_7,b_6,t_1     !mul_add_c(a[7],b[6],c2,c3,c1);
950         addcc   c_2,t_1,c_2
951         rd      %y,t_2          !=
952         addxcc  c_3,t_2,c_3
953         addx    c_1,%g0,c_1
954         st      c_2,[%i0+52]    !r[13]=c2;
955
956         umul    a_7,b_7,t_1     !=!mul_add_c(a[7],b[7],c3,c1,c2);
957         addcc   c_3,t_1,c_3
958         rd      %y,t_2
959         addxcc  c_1,t_2,c_1
960         nop                     !=
961         st      c_3,[%i0+56]    !r[14]=c3;
962         st      c_1,[%i0+60]    !r[15]=c1;
963
964         ret
965         restore %g0,%g0,%o0
966
967 .type   bn_mul_comba8,#function
968 .size   bn_mul_comba8,(.-bn_mul_comba8)
969
970 .align  32
971
972 .global bn_mul_comba4
973 /*
974  * void bn_mul_comba4(r,a,b)
975  * BN_ULONG *r,*a,*b;
976  */
977 bn_mul_comba4:
978         save    %sp,FRAME_SIZE,%sp
979         ld      a_0_,a_0
980         ld      b_0_,b_0
981         umul    a_0,b_0,c_1     !=!mul_add_c(a[0],b[0],c1,c2,c3);
982         ld      b_1_,b_1
983         rd      %y,c_2
984         st      c_1,[%i0]       !r[0]=c1;
985
986         umul    a_0,b_1,t_1     !=!mul_add_c(a[0],b[1],c2,c3,c1);
987         ld      a_1_,a_1
988         addcc   c_2,t_1,c_2
989         rd      %y,t_2          !=
990         addxcc  %g0,t_2,c_3
991         addx    %g0,%g0,c_1
992         ld      a_2_,a_2
993         umul    a_1,b_0,t_1     !=!mul_add_c(a[1],b[0],c2,c3,c1);
994         addcc   c_2,t_1,c_2
995         rd      %y,t_2
996         addxcc  c_3,t_2,c_3
997         addx    c_1,%g0,c_1     !=
998         st      c_2,[%i0+4]     !r[1]=c2;
999
1000         umul    a_2,b_0,t_1     !mul_add_c(a[2],b[0],c3,c1,c2);
1001         addcc   c_3,t_1,c_3
1002         rd      %y,t_2          !=
1003         addxcc  c_1,t_2,c_1
1004         addx    %g0,%g0,c_2
1005         ld      b_2_,b_2
1006         umul    a_1,b_1,t_1     !=!mul_add_c(a[1],b[1],c3,c1,c2);
1007         addcc   c_3,t_1,c_3
1008         rd      %y,t_2
1009         addxcc  c_1,t_2,c_1
1010         addx    c_2,%g0,c_2     !=
1011         ld      b_3_,b_3
1012         umul    a_0,b_2,t_1     !mul_add_c(a[0],b[2],c3,c1,c2);
1013         addcc   c_3,t_1,c_3
1014         rd      %y,t_2          !=
1015         addxcc  c_1,t_2,c_1
1016         addx    c_2,%g0,c_2
1017         st      c_3,[%i0+8]     !r[2]=c3;
1018
1019         umul    a_0,b_3,t_1     !=!mul_add_c(a[0],b[3],c1,c2,c3);
1020         addcc   c_1,t_1,c_1
1021         rd      %y,t_2
1022         addxcc  c_2,t_2,c_2
1023         addx    %g0,%g0,c_3     !=
1024         umul    a_1,b_2,t_1     !mul_add_c(a[1],b[2],c1,c2,c3);
1025         addcc   c_1,t_1,c_1
1026         rd      %y,t_2
1027         addxcc  c_2,t_2,c_2     !=
1028         addx    c_3,%g0,c_3
1029         ld      a_3_,a_3
1030         umul    a_2,b_1,t_1     !mul_add_c(a[2],b[1],c1,c2,c3);
1031         addcc   c_1,t_1,c_1     !=
1032         rd      %y,t_2
1033         addxcc  c_2,t_2,c_2
1034         addx    c_3,%g0,c_3
1035         umul    a_3,b_0,t_1     !=!mul_add_c(a[3],b[0],c1,c2,c3);
1036         addcc   c_1,t_1,c_1
1037         rd      %y,t_2
1038         addxcc  c_2,t_2,c_2
1039         addx    c_3,%g0,c_3     !=
1040         st      c_1,[%i0+12]    !r[3]=c1;
1041
1042         umul    a_3,b_1,t_1     !mul_add_c(a[3],b[1],c2,c3,c1);
1043         addcc   c_2,t_1,c_2
1044         rd      %y,t_2          !=
1045         addxcc  c_3,t_2,c_3
1046         addx    %g0,%g0,c_1
1047         umul    a_2,b_2,t_1     !mul_add_c(a[2],b[2],c2,c3,c1);
1048         addcc   c_2,t_1,c_2     !=
1049         rd      %y,t_2
1050         addxcc  c_3,t_2,c_3
1051         addx    c_1,%g0,c_1
1052         umul    a_1,b_3,t_1     !=!mul_add_c(a[1],b[3],c2,c3,c1);
1053         addcc   c_2,t_1,c_2
1054         rd      %y,t_2
1055         addxcc  c_3,t_2,c_3
1056         addx    c_1,%g0,c_1     !=
1057         st      c_2,[%i0+16]    !r[4]=c2;
1058
1059         umul    a_2,b_3,t_1     !mul_add_c(a[2],b[3],c3,c1,c2);
1060         addcc   c_3,t_1,c_3
1061         rd      %y,t_2          !=
1062         addxcc  c_1,t_2,c_1
1063         addx    %g0,%g0,c_2
1064         umul    a_3,b_2,t_1     !mul_add_c(a[3],b[2],c3,c1,c2);
1065         addcc   c_3,t_1,c_3     !=
1066         rd      %y,t_2
1067         addxcc  c_1,t_2,c_1
1068         st      c_3,[%i0+20]    !r[5]=c3;
1069         addx    c_2,%g0,c_2     !=
1070
1071         umul    a_3,b_3,t_1     !mul_add_c(a[3],b[3],c1,c2,c3);
1072         addcc   c_1,t_1,c_1
1073         rd      %y,t_2
1074         addxcc  c_2,t_2,c_2     !=
1075         st      c_1,[%i0+24]    !r[6]=c1;
1076         st      c_2,[%i0+28]    !r[7]=c2;
1077         
1078         ret
1079         restore %g0,%g0,%o0
1080
1081 .type   bn_mul_comba4,#function
1082 .size   bn_mul_comba4,(.-bn_mul_comba4)
1083
1084 .align  32
1085
1086 .global bn_sqr_comba8
1087 bn_sqr_comba8:
1088         save    %sp,FRAME_SIZE,%sp
1089         ld      a_0_,a_0
1090         ld      a_1_,a_1
1091         umul    a_0,a_0,c_1     !=!sqr_add_c(a,0,c1,c2,c3);
1092         rd      %y,c_2
1093         st      c_1,[%i0]       !r[0]=c1;
1094
1095         ld      a_2_,a_2
1096         umul    a_0,a_1,t_1     !=!sqr_add_c2(a,1,0,c2,c3,c1);
1097         addcc   c_2,t_1,c_2
1098         rd      %y,t_2
1099         addxcc  %g0,t_2,c_3
1100         addx    %g0,%g0,c_1     !=
1101         addcc   c_2,t_1,c_2
1102         addxcc  c_3,t_2,c_3
1103         st      c_2,[%i0+4]     !r[1]=c2;
1104         addx    c_1,%g0,c_1     !=
1105
1106         umul    a_2,a_0,t_1     !sqr_add_c2(a,2,0,c3,c1,c2);
1107         addcc   c_3,t_1,c_3
1108         rd      %y,t_2
1109         addxcc  c_1,t_2,c_1     !=
1110         addx    %g0,%g0,c_2
1111         addcc   c_3,t_1,c_3
1112         addxcc  c_1,t_2,c_1
1113         addx    c_2,%g0,c_2     !=
1114         ld      a_3_,a_3
1115         umul    a_1,a_1,t_1     !sqr_add_c(a,1,c3,c1,c2);
1116         addcc   c_3,t_1,c_3
1117         rd      %y,t_2          !=
1118         addxcc  c_1,t_2,c_1
1119         addx    c_2,%g0,c_2
1120         st      c_3,[%i0+8]     !r[2]=c3;
1121
1122         umul    a_0,a_3,t_1     !=!sqr_add_c2(a,3,0,c1,c2,c3);
1123         addcc   c_1,t_1,c_1
1124         rd      %y,t_2
1125         addxcc  c_2,t_2,c_2
1126         addx    %g0,%g0,c_3     !=
1127         addcc   c_1,t_1,c_1
1128         addxcc  c_2,t_2,c_2
1129         ld      a_4_,a_4
1130         addx    c_3,%g0,c_3     !=
1131         umul    a_1,a_2,t_1     !sqr_add_c2(a,2,1,c1,c2,c3);
1132         addcc   c_1,t_1,c_1
1133         rd      %y,t_2
1134         addxcc  c_2,t_2,c_2     !=
1135         addx    c_3,%g0,c_3
1136         addcc   c_1,t_1,c_1
1137         addxcc  c_2,t_2,c_2
1138         addx    c_3,%g0,c_3     !=
1139         st      c_1,[%i0+12]    !r[3]=c1;
1140
1141         umul    a_4,a_0,t_1     !sqr_add_c2(a,4,0,c2,c3,c1);
1142         addcc   c_2,t_1,c_2
1143         rd      %y,t_2          !=
1144         addxcc  c_3,t_2,c_3
1145         addx    %g0,%g0,c_1
1146         addcc   c_2,t_1,c_2
1147         addxcc  c_3,t_2,c_3     !=
1148         addx    c_1,%g0,c_1
1149         umul    a_3,a_1,t_1     !sqr_add_c2(a,3,1,c2,c3,c1);
1150         addcc   c_2,t_1,c_2
1151         rd      %y,t_2          !=
1152         addxcc  c_3,t_2,c_3
1153         addx    c_1,%g0,c_1
1154         addcc   c_2,t_1,c_2
1155         addxcc  c_3,t_2,c_3     !=
1156         addx    c_1,%g0,c_1
1157         ld      a_5_,a_5
1158         umul    a_2,a_2,t_1     !sqr_add_c(a,2,c2,c3,c1);
1159         addcc   c_2,t_1,c_2     !=
1160         rd      %y,t_2
1161         addxcc  c_3,t_2,c_3
1162         st      c_2,[%i0+16]    !r[4]=c2;
1163         addx    c_1,%g0,c_1     !=
1164
1165         umul    a_0,a_5,t_1     !sqr_add_c2(a,5,0,c3,c1,c2);
1166         addcc   c_3,t_1,c_3
1167         rd      %y,t_2
1168         addxcc  c_1,t_2,c_1     !=
1169         addx    %g0,%g0,c_2
1170         addcc   c_3,t_1,c_3
1171         addxcc  c_1,t_2,c_1
1172         addx    c_2,%g0,c_2     !=
1173         umul    a_1,a_4,t_1     !sqr_add_c2(a,4,1,c3,c1,c2);
1174         addcc   c_3,t_1,c_3
1175         rd      %y,t_2
1176         addxcc  c_1,t_2,c_1     !=
1177         addx    c_2,%g0,c_2
1178         addcc   c_3,t_1,c_3
1179         addxcc  c_1,t_2,c_1
1180         addx    c_2,%g0,c_2     !=
1181         ld      a_6_,a_6
1182         umul    a_2,a_3,t_1     !sqr_add_c2(a,3,2,c3,c1,c2);
1183         addcc   c_3,t_1,c_3
1184         rd      %y,t_2          !=
1185         addxcc  c_1,t_2,c_1
1186         addx    c_2,%g0,c_2
1187         addcc   c_3,t_1,c_3
1188         addxcc  c_1,t_2,c_1     !=
1189         addx    c_2,%g0,c_2
1190         st      c_3,[%i0+20]    !r[5]=c3;
1191
1192         umul    a_6,a_0,t_1     !sqr_add_c2(a,6,0,c1,c2,c3);
1193         addcc   c_1,t_1,c_1     !=
1194         rd      %y,t_2
1195         addxcc  c_2,t_2,c_2
1196         addx    %g0,%g0,c_3
1197         addcc   c_1,t_1,c_1     !=
1198         addxcc  c_2,t_2,c_2
1199         addx    c_3,%g0,c_3
1200         umul    a_5,a_1,t_1     !sqr_add_c2(a,5,1,c1,c2,c3);
1201         addcc   c_1,t_1,c_1     !=
1202         rd      %y,t_2
1203         addxcc  c_2,t_2,c_2
1204         addx    c_3,%g0,c_3
1205         addcc   c_1,t_1,c_1     !=
1206         addxcc  c_2,t_2,c_2
1207         addx    c_3,%g0,c_3
1208         umul    a_4,a_2,t_1     !sqr_add_c2(a,4,2,c1,c2,c3);
1209         addcc   c_1,t_1,c_1     !=
1210         rd      %y,t_2
1211         addxcc  c_2,t_2,c_2
1212         addx    c_3,%g0,c_3
1213         addcc   c_1,t_1,c_1     !=
1214         addxcc  c_2,t_2,c_2
1215         addx    c_3,%g0,c_3
1216         ld      a_7_,a_7
1217         umul    a_3,a_3,t_1     !=!sqr_add_c(a,3,c1,c2,c3);
1218         addcc   c_1,t_1,c_1
1219         rd      %y,t_2
1220         addxcc  c_2,t_2,c_2
1221         addx    c_3,%g0,c_3     !=
1222         st      c_1,[%i0+24]    !r[6]=c1;
1223
1224         umul    a_0,a_7,t_1     !sqr_add_c2(a,7,0,c2,c3,c1);
1225         addcc   c_2,t_1,c_2
1226         rd      %y,t_2          !=
1227         addxcc  c_3,t_2,c_3
1228         addx    %g0,%g0,c_1
1229         addcc   c_2,t_1,c_2
1230         addxcc  c_3,t_2,c_3     !=
1231         addx    c_1,%g0,c_1
1232         umul    a_1,a_6,t_1     !sqr_add_c2(a,6,1,c2,c3,c1);
1233         addcc   c_2,t_1,c_2
1234         rd      %y,t_2          !=
1235         addxcc  c_3,t_2,c_3
1236         addx    c_1,%g0,c_1
1237         addcc   c_2,t_1,c_2
1238         addxcc  c_3,t_2,c_3     !=
1239         addx    c_1,%g0,c_1
1240         umul    a_2,a_5,t_1     !sqr_add_c2(a,5,2,c2,c3,c1);
1241         addcc   c_2,t_1,c_2
1242         rd      %y,t_2          !=
1243         addxcc  c_3,t_2,c_3
1244         addx    c_1,%g0,c_1
1245         addcc   c_2,t_1,c_2
1246         addxcc  c_3,t_2,c_3     !=
1247         addx    c_1,%g0,c_1
1248         umul    a_3,a_4,t_1     !sqr_add_c2(a,4,3,c2,c3,c1);
1249         addcc   c_2,t_1,c_2
1250         rd      %y,t_2          !=
1251         addxcc  c_3,t_2,c_3
1252         addx    c_1,%g0,c_1
1253         addcc   c_2,t_1,c_2
1254         addxcc  c_3,t_2,c_3     !=
1255         addx    c_1,%g0,c_1
1256         st      c_2,[%i0+28]    !r[7]=c2;
1257
1258         umul    a_7,a_1,t_1     !sqr_add_c2(a,7,1,c3,c1,c2);
1259         addcc   c_3,t_1,c_3     !=
1260         rd      %y,t_2
1261         addxcc  c_1,t_2,c_1
1262         addx    %g0,%g0,c_2
1263         addcc   c_3,t_1,c_3     !=
1264         addxcc  c_1,t_2,c_1
1265         addx    c_2,%g0,c_2
1266         umul    a_6,a_2,t_1     !sqr_add_c2(a,6,2,c3,c1,c2);
1267         addcc   c_3,t_1,c_3     !=
1268         rd      %y,t_2
1269         addxcc  c_1,t_2,c_1
1270         addx    c_2,%g0,c_2
1271         addcc   c_3,t_1,c_3     !=
1272         addxcc  c_1,t_2,c_1
1273         addx    c_2,%g0,c_2
1274         umul    a_5,a_3,t_1     !sqr_add_c2(a,5,3,c3,c1,c2);
1275         addcc   c_3,t_1,c_3     !=
1276         rd      %y,t_2
1277         addxcc  c_1,t_2,c_1
1278         addx    c_2,%g0,c_2
1279         addcc   c_3,t_1,c_3     !=
1280         addxcc  c_1,t_2,c_1
1281         addx    c_2,%g0,c_2
1282         umul    a_4,a_4,t_1     !sqr_add_c(a,4,c3,c1,c2);
1283         addcc   c_3,t_1,c_3     !=
1284         rd      %y,t_2
1285         addxcc  c_1,t_2,c_1
1286         st      c_3,[%i0+32]    !r[8]=c3;
1287         addx    c_2,%g0,c_2     !=
1288
1289         umul    a_2,a_7,t_1     !sqr_add_c2(a,7,2,c1,c2,c3);
1290         addcc   c_1,t_1,c_1
1291         rd      %y,t_2
1292         addxcc  c_2,t_2,c_2     !=
1293         addx    %g0,%g0,c_3
1294         addcc   c_1,t_1,c_1
1295         addxcc  c_2,t_2,c_2
1296         addx    c_3,%g0,c_3     !=
1297         umul    a_3,a_6,t_1     !sqr_add_c2(a,6,3,c1,c2,c3);
1298         addcc   c_1,t_1,c_1
1299         rd      %y,t_2
1300         addxcc  c_2,t_2,c_2     !=
1301         addx    c_3,%g0,c_3
1302         addcc   c_1,t_1,c_1
1303         addxcc  c_2,t_2,c_2
1304         addx    c_3,%g0,c_3     !=
1305         umul    a_4,a_5,t_1     !sqr_add_c2(a,5,4,c1,c2,c3);
1306         addcc   c_1,t_1,c_1
1307         rd      %y,t_2
1308         addxcc  c_2,t_2,c_2     !=
1309         addx    c_3,%g0,c_3
1310         addcc   c_1,t_1,c_1
1311         addxcc  c_2,t_2,c_2
1312         addx    c_3,%g0,c_3     !=
1313         st      c_1,[%i0+36]    !r[9]=c1;
1314
1315         umul    a_7,a_3,t_1     !sqr_add_c2(a,7,3,c2,c3,c1);
1316         addcc   c_2,t_1,c_2
1317         rd      %y,t_2          !=
1318         addxcc  c_3,t_2,c_3
1319         addx    %g0,%g0,c_1
1320         addcc   c_2,t_1,c_2
1321         addxcc  c_3,t_2,c_3     !=
1322         addx    c_1,%g0,c_1
1323         umul    a_6,a_4,t_1     !sqr_add_c2(a,6,4,c2,c3,c1);
1324         addcc   c_2,t_1,c_2
1325         rd      %y,t_2          !=
1326         addxcc  c_3,t_2,c_3
1327         addx    c_1,%g0,c_1
1328         addcc   c_2,t_1,c_2
1329         addxcc  c_3,t_2,c_3     !=
1330         addx    c_1,%g0,c_1
1331         umul    a_5,a_5,t_1     !sqr_add_c(a,5,c2,c3,c1);
1332         addcc   c_2,t_1,c_2
1333         rd      %y,t_2          !=
1334         addxcc  c_3,t_2,c_3
1335         addx    c_1,%g0,c_1
1336         st      c_2,[%i0+40]    !r[10]=c2;
1337
1338         umul    a_4,a_7,t_1     !=!sqr_add_c2(a,7,4,c3,c1,c2);
1339         addcc   c_3,t_1,c_3
1340         rd      %y,t_2
1341         addxcc  c_1,t_2,c_1
1342         addx    %g0,%g0,c_2     !=
1343         addcc   c_3,t_1,c_3
1344         addxcc  c_1,t_2,c_1
1345         addx    c_2,%g0,c_2
1346         umul    a_5,a_6,t_1     !=!sqr_add_c2(a,6,5,c3,c1,c2);
1347         addcc   c_3,t_1,c_3
1348         rd      %y,t_2
1349         addxcc  c_1,t_2,c_1
1350         addx    c_2,%g0,c_2     !=
1351         addcc   c_3,t_1,c_3
1352         addxcc  c_1,t_2,c_1
1353         st      c_3,[%i0+44]    !r[11]=c3;
1354         addx    c_2,%g0,c_2     !=
1355
1356         umul    a_7,a_5,t_1     !sqr_add_c2(a,7,5,c1,c2,c3);
1357         addcc   c_1,t_1,c_1
1358         rd      %y,t_2
1359         addxcc  c_2,t_2,c_2     !=
1360         addx    %g0,%g0,c_3
1361         addcc   c_1,t_1,c_1
1362         addxcc  c_2,t_2,c_2
1363         addx    c_3,%g0,c_3     !=
1364         umul    a_6,a_6,t_1     !sqr_add_c(a,6,c1,c2,c3);
1365         addcc   c_1,t_1,c_1
1366         rd      %y,t_2
1367         addxcc  c_2,t_2,c_2     !=
1368         addx    c_3,%g0,c_3
1369         st      c_1,[%i0+48]    !r[12]=c1;
1370
1371         umul    a_6,a_7,t_1     !sqr_add_c2(a,7,6,c2,c3,c1);
1372         addcc   c_2,t_1,c_2     !=
1373         rd      %y,t_2
1374         addxcc  c_3,t_2,c_3
1375         addx    %g0,%g0,c_1
1376         addcc   c_2,t_1,c_2     !=
1377         rd      %y,t_2
1378         addxcc  c_3,t_2,c_3
1379         st      c_2,[%i0+52]    !r[13]=c2;
1380         addx    c_1,%g0,c_1     !=
1381
1382         umul    a_7,a_7,t_1     !sqr_add_c(a,7,c3,c1,c2);
1383         addcc   c_3,t_1,c_3
1384         rd      %y,t_2
1385         addxcc  c_1,t_2,c_1     !=
1386         st      c_3,[%i0+56]    !r[14]=c3;
1387         st      c_1,[%i0+60]    !r[15]=c1;
1388
1389         ret
1390         restore %g0,%g0,%o0
1391
1392 .type   bn_sqr_comba8,#function
1393 .size   bn_sqr_comba8,(.-bn_sqr_comba8)
1394
1395 .align  32
1396
1397 .global bn_sqr_comba4
1398 /*
1399  * void bn_sqr_comba4(r,a)
1400  * BN_ULONG *r,*a;
1401  */
1402 bn_sqr_comba4:
1403         save    %sp,FRAME_SIZE,%sp
1404         ld      a_0_,a_0
1405         umul    a_0,a_0,c_1     !sqr_add_c(a,0,c1,c2,c3);
1406         ld      a_1_,a_1        !=
1407         rd      %y,c_2
1408         st      c_1,[%i0]       !r[0]=c1;
1409
1410         ld      a_1_,a_1
1411         umul    a_0,a_1,t_1     !=!sqr_add_c2(a,1,0,c2,c3,c1);
1412         addcc   c_2,t_1,c_2
1413         rd      %y,t_2
1414         addxcc  %g0,t_2,c_3
1415         addx    %g0,%g0,c_1     !=
1416         ld      a_2_,a_2
1417         addcc   c_2,t_1,c_2
1418         addxcc  c_3,t_2,c_3
1419         addx    c_1,%g0,c_1     !=
1420         st      c_2,[%i0+4]     !r[1]=c2;
1421
1422         umul    a_2,a_0,t_1     !sqr_add_c2(a,2,0,c3,c1,c2);
1423         addcc   c_3,t_1,c_3
1424         rd      %y,t_2          !=
1425         addxcc  c_1,t_2,c_1
1426         addx    %g0,%g0,c_2
1427         addcc   c_3,t_1,c_3
1428         addxcc  c_1,t_2,c_1     !=
1429         addx    c_2,%g0,c_2
1430         ld      a_3_,a_3
1431         umul    a_1,a_1,t_1     !sqr_add_c(a,1,c3,c1,c2);
1432         addcc   c_3,t_1,c_3     !=
1433         rd      %y,t_2
1434         addxcc  c_1,t_2,c_1
1435         st      c_3,[%i0+8]     !r[2]=c3;
1436         addx    c_2,%g0,c_2     !=
1437
1438         umul    a_0,a_3,t_1     !sqr_add_c2(a,3,0,c1,c2,c3);
1439         addcc   c_1,t_1,c_1
1440         rd      %y,t_2
1441         addxcc  c_2,t_2,c_2     !=
1442         addx    %g0,%g0,c_3
1443         addcc   c_1,t_1,c_1
1444         addxcc  c_2,t_2,c_2
1445         addx    c_3,%g0,c_3     !=
1446         umul    a_1,a_2,t_1     !sqr_add_c2(a,2,1,c1,c2,c3);
1447         addcc   c_1,t_1,c_1
1448         rd      %y,t_2
1449         addxcc  c_2,t_2,c_2     !=
1450         addx    c_3,%g0,c_3
1451         addcc   c_1,t_1,c_1
1452         addxcc  c_2,t_2,c_2
1453         addx    c_3,%g0,c_3     !=
1454         st      c_1,[%i0+12]    !r[3]=c1;
1455
1456         umul    a_3,a_1,t_1     !sqr_add_c2(a,3,1,c2,c3,c1);
1457         addcc   c_2,t_1,c_2
1458         rd      %y,t_2          !=
1459         addxcc  c_3,t_2,c_3
1460         addx    %g0,%g0,c_1
1461         addcc   c_2,t_1,c_2
1462         addxcc  c_3,t_2,c_3     !=
1463         addx    c_1,%g0,c_1
1464         umul    a_2,a_2,t_1     !sqr_add_c(a,2,c2,c3,c1);
1465         addcc   c_2,t_1,c_2
1466         rd      %y,t_2          !=
1467         addxcc  c_3,t_2,c_3
1468         addx    c_1,%g0,c_1
1469         st      c_2,[%i0+16]    !r[4]=c2;
1470
1471         umul    a_2,a_3,t_1     !=!sqr_add_c2(a,3,2,c3,c1,c2);
1472         addcc   c_3,t_1,c_3
1473         rd      %y,t_2
1474         addxcc  c_1,t_2,c_1
1475         addx    %g0,%g0,c_2     !=
1476         addcc   c_3,t_1,c_3
1477         addxcc  c_1,t_2,c_1
1478         st      c_3,[%i0+20]    !r[5]=c3;
1479         addx    c_2,%g0,c_2     !=
1480
1481         umul    a_3,a_3,t_1     !sqr_add_c(a,3,c1,c2,c3);
1482         addcc   c_1,t_1,c_1
1483         rd      %y,t_2
1484         addxcc  c_2,t_2,c_2     !=
1485         st      c_1,[%i0+24]    !r[6]=c1;
1486         st      c_2,[%i0+28]    !r[7]=c2;
1487         
1488         ret
1489         restore %g0,%g0,%o0
1490
1491 .type   bn_sqr_comba4,#function
1492 .size   bn_sqr_comba4,(.-bn_sqr_comba4)
1493 .align  32
1494