Sparc v8plus assembler.
[openssl.git] / crypto / bn / asm / sparcv8.S
1 .ident  "sparcv8.s, Version 1.2"
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  * 1.2  - made gas friendly;
29  *
30  * (*)  see bn_asm.sparc.v8plus.S for details
31  */
32
33 .section        ".text",#alloc,#execinstr
34 .file           "bn_asm.sparc.v8.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 t_1     %o0
555 #define t_2     %o1
556 #define c_1     %o2
557 #define c_2     %o3
558 #define c_3     %o4
559
560 #define a(I)    [%i1+4*I]
561 #define b(I)    [%i2+4*I]
562 #define r(I)    [%i0+4*I]
563
564 #define a_0     %l0
565 #define a_1     %l1
566 #define a_2     %l2
567 #define a_3     %l3
568 #define a_4     %l4
569 #define a_5     %l5
570 #define a_6     %l6
571 #define a_7     %l7
572
573 #define b_0     %i3
574 #define b_1     %i4
575 #define b_2     %i5
576 #define b_3     %o5
577 #define b_4     %g1
578 #define b_5     %g2
579 #define b_6     %g3
580 #define b_7     %g4
581
582 .align  32
583 .global bn_mul_comba8
584 /*
585  * void bn_mul_comba8(r,a,b)
586  * BN_ULONG *r,*a,*b;
587  */
588 bn_mul_comba8:
589         save    %sp,FRAME_SIZE,%sp
590         ld      a(0),a_0
591         ld      b(0),b_0
592         umul    a_0,b_0,c_1     !=!mul_add_c(a[0],b[0],c1,c2,c3);
593         ld      b(1),b_1
594         rd      %y,c_2
595         st      c_1,r(0)        !r[0]=c1;
596
597         umul    a_0,b_1,t_1     !=!mul_add_c(a[0],b[1],c2,c3,c1);
598         ld      a(1),a_1
599         addcc   c_2,t_1,c_2
600         rd      %y,t_2
601         addxcc  %g0,t_2,c_3     !=
602         addx    %g0,%g0,c_1
603         ld      a(2),a_2
604         umul    a_1,b_0,t_1     !mul_add_c(a[1],b[0],c2,c3,c1);
605         addcc   c_2,t_1,c_2     !=
606         rd      %y,t_2
607         addxcc  c_3,t_2,c_3
608         st      c_2,r(1)        !r[1]=c2;
609         addx    c_1,%g0,c_1     !=
610
611         umul    a_2,b_0,t_1     !mul_add_c(a[2],b[0],c3,c1,c2);
612         addcc   c_3,t_1,c_3
613         rd      %y,t_2
614         addxcc  c_1,t_2,c_1     !=
615         addx    %g0,%g0,c_2
616         ld      b(2),b_2
617         umul    a_1,b_1,t_1     !mul_add_c(a[1],b[1],c3,c1,c2);
618         addcc   c_3,t_1,c_3     !=
619         rd      %y,t_2
620         addxcc  c_1,t_2,c_1
621         ld      b(3),b_3
622         addx    c_2,%g0,c_2     !=
623         umul    a_0,b_2,t_1     !mul_add_c(a[0],b[2],c3,c1,c2);
624         addcc   c_3,t_1,c_3
625         rd      %y,t_2
626         addxcc  c_1,t_2,c_1     !=
627         addx    c_2,%g0,c_2
628         st      c_3,r(2)        !r[2]=c3;
629
630         umul    a_0,b_3,t_1     !mul_add_c(a[0],b[3],c1,c2,c3);
631         addcc   c_1,t_1,c_1     !=
632         rd      %y,t_2
633         addxcc  c_2,t_2,c_2
634         addx    %g0,%g0,c_3
635         umul    a_1,b_2,t_1     !=!mul_add_c(a[1],b[2],c1,c2,c3);
636         addcc   c_1,t_1,c_1
637         rd      %y,t_2
638         addxcc  c_2,t_2,c_2
639         addx    c_3,%g0,c_3     !=
640         ld      a(3),a_3
641         umul    a_2,b_1,t_1     !mul_add_c(a[2],b[1],c1,c2,c3);
642         addcc   c_1,t_1,c_1
643         rd      %y,t_2          !=
644         addxcc  c_2,t_2,c_2
645         addx    c_3,%g0,c_3
646         ld      a(4),a_4
647         umul    a_3,b_0,t_1     !mul_add_c(a[3],b[0],c1,c2,c3);!=
648         addcc   c_1,t_1,c_1
649         rd      %y,t_2
650         addxcc  c_2,t_2,c_2
651         addx    c_3,%g0,c_3     !=
652         st      c_1,r(3)        !r[3]=c1;
653
654         umul    a_4,b_0,t_1     !mul_add_c(a[4],b[0],c2,c3,c1);
655         addcc   c_2,t_1,c_2
656         rd      %y,t_2          !=
657         addxcc  c_3,t_2,c_3
658         addx    %g0,%g0,c_1
659         umul    a_3,b_1,t_1     !mul_add_c(a[3],b[1],c2,c3,c1);
660         addcc   c_2,t_1,c_2     !=
661         rd      %y,t_2
662         addxcc  c_3,t_2,c_3
663         addx    c_1,%g0,c_1
664         umul    a_2,b_2,t_1     !=!mul_add_c(a[2],b[2],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    c_1,%g0,c_1     !=
669         ld      b(4),b_4
670         umul    a_1,b_3,t_1     !mul_add_c(a[1],b[3],c2,c3,c1);
671         addcc   c_2,t_1,c_2
672         rd      %y,t_2          !=
673         addxcc  c_3,t_2,c_3
674         addx    c_1,%g0,c_1
675         ld      b(5),b_5
676         umul    a_0,b_4,t_1     !=!mul_add_c(a[0],b[4],c2,c3,c1);
677         addcc   c_2,t_1,c_2
678         rd      %y,t_2
679         addxcc  c_3,t_2,c_3
680         addx    c_1,%g0,c_1     !=
681         st      c_2,r(4)        !r[4]=c2;
682
683         umul    a_0,b_5,t_1     !mul_add_c(a[0],b[5],c3,c1,c2);
684         addcc   c_3,t_1,c_3
685         rd      %y,t_2          !=
686         addxcc  c_1,t_2,c_1
687         addx    %g0,%g0,c_2
688         umul    a_1,b_4,t_1     !mul_add_c(a[1],b[4],c3,c1,c2);
689         addcc   c_3,t_1,c_3     !=
690         rd      %y,t_2
691         addxcc  c_1,t_2,c_1
692         addx    c_2,%g0,c_2
693         umul    a_2,b_3,t_1     !=!mul_add_c(a[2],b[3],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    c_2,%g0,c_2     !=
698         umul    a_3,b_2,t_1     !mul_add_c(a[3],b[2],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         ld      a(5),a_5
704         umul    a_4,b_1,t_1     !mul_add_c(a[4],b[1],c3,c1,c2);
705         addcc   c_3,t_1,c_3     !=
706         rd      %y,t_2
707         addxcc  c_1,t_2,c_1
708         ld      a(6),a_6
709         addx    c_2,%g0,c_2     !=
710         umul    a_5,b_0,t_1     !mul_add_c(a[5],b[0],c3,c1,c2);
711         addcc   c_3,t_1,c_3
712         rd      %y,t_2
713         addxcc  c_1,t_2,c_1     !=
714         addx    c_2,%g0,c_2
715         st      c_3,r(5)        !r[5]=c3;
716
717         umul    a_6,b_0,t_1     !mul_add_c(a[6],b[0],c1,c2,c3);
718         addcc   c_1,t_1,c_1     !=
719         rd      %y,t_2
720         addxcc  c_2,t_2,c_2
721         addx    %g0,%g0,c_3
722         umul    a_5,b_1,t_1     !=!mul_add_c(a[5],b[1],c1,c2,c3);
723         addcc   c_1,t_1,c_1
724         rd      %y,t_2
725         addxcc  c_2,t_2,c_2
726         addx    c_3,%g0,c_3     !=
727         umul    a_4,b_2,t_1     !mul_add_c(a[4],b[2],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    c_3,%g0,c_3
732         umul    a_3,b_3,t_1     !mul_add_c(a[3],b[3],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_2,b_4,t_1     !mul_add_c(a[2],b[4],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         ld      b(6),b_6
742         addx    c_3,%g0,c_3     !=
743         umul    a_1,b_5,t_1     !mul_add_c(a[1],b[5],c1,c2,c3);
744         addcc   c_1,t_1,c_1
745         rd      %y,t_2
746         addxcc  c_2,t_2,c_2     !=
747         addx    c_3,%g0,c_3
748         ld      b(7),b_7
749         umul    a_0,b_6,t_1     !mul_add_c(a[0],b[6],c1,c2,c3);
750         addcc   c_1,t_1,c_1     !=
751         rd      %y,t_2
752         addxcc  c_2,t_2,c_2
753         st      c_1,r(6)        !r[6]=c1;
754         addx    c_3,%g0,c_3     !=
755
756         umul    a_0,b_7,t_1     !mul_add_c(a[0],b[7],c2,c3,c1);
757         addcc   c_2,t_1,c_2
758         rd      %y,t_2
759         addxcc  c_3,t_2,c_3     !=
760         addx    %g0,%g0,c_1
761         umul    a_1,b_6,t_1     !mul_add_c(a[1],b[6],c2,c3,c1);
762         addcc   c_2,t_1,c_2
763         rd      %y,t_2          !=
764         addxcc  c_3,t_2,c_3
765         addx    c_1,%g0,c_1
766         umul    a_2,b_5,t_1     !mul_add_c(a[2],b[5],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    c_1,%g0,c_1
771         umul    a_3,b_4,t_1     !=!mul_add_c(a[3],b[4],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_4,b_3,t_1     !mul_add_c(a[4],b[3],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_5,b_2,t_1     !mul_add_c(a[5],b[2],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         ld      a(7),a_7
787         umul    a_6,b_1,t_1     !=!mul_add_c(a[6],b[1],c2,c3,c1);
788         addcc   c_2,t_1,c_2
789         rd      %y,t_2
790         addxcc  c_3,t_2,c_3
791         addx    c_1,%g0,c_1     !=
792         umul    a_7,b_0,t_1     !mul_add_c(a[7],b[0],c2,c3,c1);
793         addcc   c_2,t_1,c_2
794         rd      %y,t_2
795         addxcc  c_3,t_2,c_3     !=
796         addx    c_1,%g0,c_1
797         st      c_2,r(7)        !r[7]=c2;
798
799         umul    a_7,b_1,t_1     !mul_add_c(a[7],b[1],c3,c1,c2);
800         addcc   c_3,t_1,c_3     !=
801         rd      %y,t_2
802         addxcc  c_1,t_2,c_1
803         addx    %g0,%g0,c_2
804         umul    a_6,b_2,t_1     !=!mul_add_c(a[6],b[2],c3,c1,c2);
805         addcc   c_3,t_1,c_3
806         rd      %y,t_2
807         addxcc  c_1,t_2,c_1
808         addx    c_2,%g0,c_2     !=
809         umul    a_5,b_3,t_1     !mul_add_c(a[5],b[3],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    c_2,%g0,c_2
814         umul    a_4,b_4,t_1     !mul_add_c(a[4],b[4],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_3,b_5,t_1     !mul_add_c(a[3],b[5],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_2,b_6,t_1     !=!mul_add_c(a[2],b[6],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_1,b_7,t_1     !mul_add_c(a[1],b[7],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         st      c_3,r(8)        !r[8]=c3;
835
836         umul    a_2,b_7,t_1     !mul_add_c(a[2],b[7],c1,c2,c3);
837         addcc   c_1,t_1,c_1     !=
838         rd      %y,t_2
839         addxcc  c_2,t_2,c_2
840         addx    %g0,%g0,c_3
841         umul    a_3,b_6,t_1     !=!mul_add_c(a[3],b[6],c1,c2,c3);
842         addcc   c_1,t_1,c_1
843         rd      %y,t_2
844         addxcc  c_2,t_2,c_2
845         addx    c_3,%g0,c_3     !=
846         umul    a_4,b_5,t_1     !mul_add_c(a[4],b[5],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    c_3,%g0,c_3
851         umul    a_5,b_4,t_1     !mul_add_c(a[5],b[4],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_6,b_3,t_1     !mul_add_c(a[6],b[3],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_7,b_2,t_1     !=!mul_add_c(a[7],b[2],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         st      c_1,r(9)        !r[9]=c1;
867
868         umul    a_7,b_3,t_1     !mul_add_c(a[7],b[3],c2,c3,c1);
869         addcc   c_2,t_1,c_2
870         rd      %y,t_2          !=
871         addxcc  c_3,t_2,c_3
872         addx    %g0,%g0,c_1
873         umul    a_6,b_4,t_1     !mul_add_c(a[6],b[4],c2,c3,c1);
874         addcc   c_2,t_1,c_2     !=
875         rd      %y,t_2
876         addxcc  c_3,t_2,c_3
877         addx    c_1,%g0,c_1
878         umul    a_5,b_5,t_1     !=!mul_add_c(a[5],b[5],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    c_1,%g0,c_1     !=
883         umul    a_4,b_6,t_1     !mul_add_c(a[4],b[6],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_3,b_7,t_1     !mul_add_c(a[3],b[7],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         st      c_2,r(10)       !r[10]=c2;
894
895         umul    a_4,b_7,t_1     !=!mul_add_c(a[4],b[7],c3,c1,c2);
896         addcc   c_3,t_1,c_3
897         rd      %y,t_2
898         addxcc  c_1,t_2,c_1
899         addx    %g0,%g0,c_2     !=
900         umul    a_5,b_6,t_1     !mul_add_c(a[5],b[6],c3,c1,c2);
901         addcc   c_3,t_1,c_3
902         rd      %y,t_2
903         addxcc  c_1,t_2,c_1     !=
904         addx    c_2,%g0,c_2
905         umul    a_6,b_5,t_1     !mul_add_c(a[6],b[5],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    c_2,%g0,c_2
910         umul    a_7,b_4,t_1     !mul_add_c(a[7],b[4],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         st      c_3,r(11)       !r[11]=c3;
915         addx    c_2,%g0,c_2     !=
916
917         umul    a_7,b_5,t_1     !mul_add_c(a[7],b[5],c1,c2,c3);
918         addcc   c_1,t_1,c_1
919         rd      %y,t_2
920         addxcc  c_2,t_2,c_2     !=
921         addx    %g0,%g0,c_3
922         umul    a_6,b_6,t_1     !mul_add_c(a[6],b[6],c1,c2,c3);
923         addcc   c_1,t_1,c_1
924         rd      %y,t_2          !=
925         addxcc  c_2,t_2,c_2
926         addx    c_3,%g0,c_3
927         umul    a_5,b_7,t_1     !mul_add_c(a[5],b[7],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         st      c_1,r(12)       !r[12]=c1;
932         addx    c_3,%g0,c_3     !=
933
934         umul    a_6,b_7,t_1     !mul_add_c(a[6],b[7],c2,c3,c1);
935         addcc   c_2,t_1,c_2
936         rd      %y,t_2
937         addxcc  c_3,t_2,c_3     !=
938         addx    %g0,%g0,c_1
939         umul    a_7,b_6,t_1     !mul_add_c(a[7],b[6],c2,c3,c1);
940         addcc   c_2,t_1,c_2
941         rd      %y,t_2          !=
942         addxcc  c_3,t_2,c_3
943         addx    c_1,%g0,c_1
944         st      c_2,r(13)       !r[13]=c2;
945
946         umul    a_7,b_7,t_1     !=!mul_add_c(a[7],b[7],c3,c1,c2);
947         addcc   c_3,t_1,c_3
948         rd      %y,t_2
949         addxcc  c_1,t_2,c_1
950         nop                     !=
951         st      c_3,r(14)       !r[14]=c3;
952         st      c_1,r(15)       !r[15]=c1;
953
954         ret
955         restore %g0,%g0,%o0
956
957 .type   bn_mul_comba8,#function
958 .size   bn_mul_comba8,(.-bn_mul_comba8)
959
960 .align  32
961
962 .global bn_mul_comba4
963 /*
964  * void bn_mul_comba4(r,a,b)
965  * BN_ULONG *r,*a,*b;
966  */
967 bn_mul_comba4:
968         save    %sp,FRAME_SIZE,%sp
969         ld      a(0),a_0
970         ld      b(0),b_0
971         umul    a_0,b_0,c_1     !=!mul_add_c(a[0],b[0],c1,c2,c3);
972         ld      b(1),b_1
973         rd      %y,c_2
974         st      c_1,r(0)        !r[0]=c1;
975
976         umul    a_0,b_1,t_1     !=!mul_add_c(a[0],b[1],c2,c3,c1);
977         ld      a(1),a_1
978         addcc   c_2,t_1,c_2
979         rd      %y,t_2          !=
980         addxcc  %g0,t_2,c_3
981         addx    %g0,%g0,c_1
982         ld      a(2),a_2
983         umul    a_1,b_0,t_1     !=!mul_add_c(a[1],b[0],c2,c3,c1);
984         addcc   c_2,t_1,c_2
985         rd      %y,t_2
986         addxcc  c_3,t_2,c_3
987         addx    c_1,%g0,c_1     !=
988         st      c_2,r(1)        !r[1]=c2;
989
990         umul    a_2,b_0,t_1     !mul_add_c(a[2],b[0],c3,c1,c2);
991         addcc   c_3,t_1,c_3
992         rd      %y,t_2          !=
993         addxcc  c_1,t_2,c_1
994         addx    %g0,%g0,c_2
995         ld      b(2),b_2
996         umul    a_1,b_1,t_1     !=!mul_add_c(a[1],b[1],c3,c1,c2);
997         addcc   c_3,t_1,c_3
998         rd      %y,t_2
999         addxcc  c_1,t_2,c_1
1000         addx    c_2,%g0,c_2     !=
1001         ld      b(3),b_3
1002         umul    a_0,b_2,t_1     !mul_add_c(a[0],b[2],c3,c1,c2);
1003         addcc   c_3,t_1,c_3
1004         rd      %y,t_2          !=
1005         addxcc  c_1,t_2,c_1
1006         addx    c_2,%g0,c_2
1007         st      c_3,r(2)        !r[2]=c3;
1008
1009         umul    a_0,b_3,t_1     !=!mul_add_c(a[0],b[3],c1,c2,c3);
1010         addcc   c_1,t_1,c_1
1011         rd      %y,t_2
1012         addxcc  c_2,t_2,c_2
1013         addx    %g0,%g0,c_3     !=
1014         umul    a_1,b_2,t_1     !mul_add_c(a[1],b[2],c1,c2,c3);
1015         addcc   c_1,t_1,c_1
1016         rd      %y,t_2
1017         addxcc  c_2,t_2,c_2     !=
1018         addx    c_3,%g0,c_3
1019         ld      a(3),a_3
1020         umul    a_2,b_1,t_1     !mul_add_c(a[2],b[1],c1,c2,c3);
1021         addcc   c_1,t_1,c_1     !=
1022         rd      %y,t_2
1023         addxcc  c_2,t_2,c_2
1024         addx    c_3,%g0,c_3
1025         umul    a_3,b_0,t_1     !=!mul_add_c(a[3],b[0],c1,c2,c3);
1026         addcc   c_1,t_1,c_1
1027         rd      %y,t_2
1028         addxcc  c_2,t_2,c_2
1029         addx    c_3,%g0,c_3     !=
1030         st      c_1,r(3)        !r[3]=c1;
1031
1032         umul    a_3,b_1,t_1     !mul_add_c(a[3],b[1],c2,c3,c1);
1033         addcc   c_2,t_1,c_2
1034         rd      %y,t_2          !=
1035         addxcc  c_3,t_2,c_3
1036         addx    %g0,%g0,c_1
1037         umul    a_2,b_2,t_1     !mul_add_c(a[2],b[2],c2,c3,c1);
1038         addcc   c_2,t_1,c_2     !=
1039         rd      %y,t_2
1040         addxcc  c_3,t_2,c_3
1041         addx    c_1,%g0,c_1
1042         umul    a_1,b_3,t_1     !=!mul_add_c(a[1],b[3],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    c_1,%g0,c_1     !=
1047         st      c_2,r(4)        !r[4]=c2;
1048
1049         umul    a_2,b_3,t_1     !mul_add_c(a[2],b[3],c3,c1,c2);
1050         addcc   c_3,t_1,c_3
1051         rd      %y,t_2          !=
1052         addxcc  c_1,t_2,c_1
1053         addx    %g0,%g0,c_2
1054         umul    a_3,b_2,t_1     !mul_add_c(a[3],b[2],c3,c1,c2);
1055         addcc   c_3,t_1,c_3     !=
1056         rd      %y,t_2
1057         addxcc  c_1,t_2,c_1
1058         st      c_3,r(5)        !r[5]=c3;
1059         addx    c_2,%g0,c_2     !=
1060
1061         umul    a_3,b_3,t_1     !mul_add_c(a[3],b[3],c1,c2,c3);
1062         addcc   c_1,t_1,c_1
1063         rd      %y,t_2
1064         addxcc  c_2,t_2,c_2     !=
1065         st      c_1,r(6)        !r[6]=c1;
1066         st      c_2,r(7)        !r[7]=c2;
1067         
1068         ret
1069         restore %g0,%g0,%o0
1070
1071 .type   bn_mul_comba4,#function
1072 .size   bn_mul_comba4,(.-bn_mul_comba4)
1073
1074 .align  32
1075
1076 .global bn_sqr_comba8
1077 bn_sqr_comba8:
1078         save    %sp,FRAME_SIZE,%sp
1079         ld      a(0),a_0
1080         ld      a(1),a_1
1081         umul    a_0,a_0,c_1     !=!sqr_add_c(a,0,c1,c2,c3);
1082         rd      %y,c_2
1083         st      c_1,r(0)        !r[0]=c1;
1084
1085         ld      a(2),a_2
1086         umul    a_0,a_1,t_1     !=!sqr_add_c2(a,1,0,c2,c3,c1);
1087         addcc   c_2,t_1,c_2
1088         rd      %y,t_2
1089         addxcc  %g0,t_2,c_3
1090         addx    %g0,%g0,c_1     !=
1091         addcc   c_2,t_1,c_2
1092         addxcc  c_3,t_2,c_3
1093         st      c_2,r(1)        !r[1]=c2;
1094         addx    c_1,%g0,c_1     !=
1095
1096         umul    a_2,a_0,t_1     !sqr_add_c2(a,2,0,c3,c1,c2);
1097         addcc   c_3,t_1,c_3
1098         rd      %y,t_2
1099         addxcc  c_1,t_2,c_1     !=
1100         addx    %g0,%g0,c_2
1101         addcc   c_3,t_1,c_3
1102         addxcc  c_1,t_2,c_1
1103         addx    c_2,%g0,c_2     !=
1104         ld      a(3),a_3
1105         umul    a_1,a_1,t_1     !sqr_add_c(a,1,c3,c1,c2);
1106         addcc   c_3,t_1,c_3
1107         rd      %y,t_2          !=
1108         addxcc  c_1,t_2,c_1
1109         addx    c_2,%g0,c_2
1110         st      c_3,r(2)        !r[2]=c3;
1111
1112         umul    a_0,a_3,t_1     !=!sqr_add_c2(a,3,0,c1,c2,c3);
1113         addcc   c_1,t_1,c_1
1114         rd      %y,t_2
1115         addxcc  c_2,t_2,c_2
1116         addx    %g0,%g0,c_3     !=
1117         addcc   c_1,t_1,c_1
1118         addxcc  c_2,t_2,c_2
1119         ld      a(4),a_4
1120         addx    c_3,%g0,c_3     !=
1121         umul    a_1,a_2,t_1     !sqr_add_c2(a,2,1,c1,c2,c3);
1122         addcc   c_1,t_1,c_1
1123         rd      %y,t_2
1124         addxcc  c_2,t_2,c_2     !=
1125         addx    c_3,%g0,c_3
1126         addcc   c_1,t_1,c_1
1127         addxcc  c_2,t_2,c_2
1128         addx    c_3,%g0,c_3     !=
1129         st      c_1,r(3)        !r[3]=c1;
1130
1131         umul    a_4,a_0,t_1     !sqr_add_c2(a,4,0,c2,c3,c1);
1132         addcc   c_2,t_1,c_2
1133         rd      %y,t_2          !=
1134         addxcc  c_3,t_2,c_3
1135         addx    %g0,%g0,c_1
1136         addcc   c_2,t_1,c_2
1137         addxcc  c_3,t_2,c_3     !=
1138         addx    c_1,%g0,c_1
1139         umul    a_3,a_1,t_1     !sqr_add_c2(a,3,1,c2,c3,c1);
1140         addcc   c_2,t_1,c_2
1141         rd      %y,t_2          !=
1142         addxcc  c_3,t_2,c_3
1143         addx    c_1,%g0,c_1
1144         addcc   c_2,t_1,c_2
1145         addxcc  c_3,t_2,c_3     !=
1146         addx    c_1,%g0,c_1
1147         ld      a(5),a_5
1148         umul    a_2,a_2,t_1     !sqr_add_c(a,2,c2,c3,c1);
1149         addcc   c_2,t_1,c_2     !=
1150         rd      %y,t_2
1151         addxcc  c_3,t_2,c_3
1152         st      c_2,r(4)        !r[4]=c2;
1153         addx    c_1,%g0,c_1     !=
1154
1155         umul    a_0,a_5,t_1     !sqr_add_c2(a,5,0,c3,c1,c2);
1156         addcc   c_3,t_1,c_3
1157         rd      %y,t_2
1158         addxcc  c_1,t_2,c_1     !=
1159         addx    %g0,%g0,c_2
1160         addcc   c_3,t_1,c_3
1161         addxcc  c_1,t_2,c_1
1162         addx    c_2,%g0,c_2     !=
1163         umul    a_1,a_4,t_1     !sqr_add_c2(a,4,1,c3,c1,c2);
1164         addcc   c_3,t_1,c_3
1165         rd      %y,t_2
1166         addxcc  c_1,t_2,c_1     !=
1167         addx    c_2,%g0,c_2
1168         addcc   c_3,t_1,c_3
1169         addxcc  c_1,t_2,c_1
1170         addx    c_2,%g0,c_2     !=
1171         ld      a(6),a_6
1172         umul    a_2,a_3,t_1     !sqr_add_c2(a,3,2,c3,c1,c2);
1173         addcc   c_3,t_1,c_3
1174         rd      %y,t_2          !=
1175         addxcc  c_1,t_2,c_1
1176         addx    c_2,%g0,c_2
1177         addcc   c_3,t_1,c_3
1178         addxcc  c_1,t_2,c_1     !=
1179         addx    c_2,%g0,c_2
1180         st      c_3,r(5)        !r[5]=c3;
1181
1182         umul    a_6,a_0,t_1     !sqr_add_c2(a,6,0,c1,c2,c3);
1183         addcc   c_1,t_1,c_1     !=
1184         rd      %y,t_2
1185         addxcc  c_2,t_2,c_2
1186         addx    %g0,%g0,c_3
1187         addcc   c_1,t_1,c_1     !=
1188         addxcc  c_2,t_2,c_2
1189         addx    c_3,%g0,c_3
1190         umul    a_5,a_1,t_1     !sqr_add_c2(a,5,1,c1,c2,c3);
1191         addcc   c_1,t_1,c_1     !=
1192         rd      %y,t_2
1193         addxcc  c_2,t_2,c_2
1194         addx    c_3,%g0,c_3
1195         addcc   c_1,t_1,c_1     !=
1196         addxcc  c_2,t_2,c_2
1197         addx    c_3,%g0,c_3
1198         umul    a_4,a_2,t_1     !sqr_add_c2(a,4,2,c1,c2,c3);
1199         addcc   c_1,t_1,c_1     !=
1200         rd      %y,t_2
1201         addxcc  c_2,t_2,c_2
1202         addx    c_3,%g0,c_3
1203         addcc   c_1,t_1,c_1     !=
1204         addxcc  c_2,t_2,c_2
1205         addx    c_3,%g0,c_3
1206         ld      a(7),a_7
1207         umul    a_3,a_3,t_1     !=!sqr_add_c(a,3,c1,c2,c3);
1208         addcc   c_1,t_1,c_1
1209         rd      %y,t_2
1210         addxcc  c_2,t_2,c_2
1211         addx    c_3,%g0,c_3     !=
1212         st      c_1,r(6)        !r[6]=c1;
1213
1214         umul    a_0,a_7,t_1     !sqr_add_c2(a,7,0,c2,c3,c1);
1215         addcc   c_2,t_1,c_2
1216         rd      %y,t_2          !=
1217         addxcc  c_3,t_2,c_3
1218         addx    %g0,%g0,c_1
1219         addcc   c_2,t_1,c_2
1220         addxcc  c_3,t_2,c_3     !=
1221         addx    c_1,%g0,c_1
1222         umul    a_1,a_6,t_1     !sqr_add_c2(a,6,1,c2,c3,c1);
1223         addcc   c_2,t_1,c_2
1224         rd      %y,t_2          !=
1225         addxcc  c_3,t_2,c_3
1226         addx    c_1,%g0,c_1
1227         addcc   c_2,t_1,c_2
1228         addxcc  c_3,t_2,c_3     !=
1229         addx    c_1,%g0,c_1
1230         umul    a_2,a_5,t_1     !sqr_add_c2(a,5,2,c2,c3,c1);
1231         addcc   c_2,t_1,c_2
1232         rd      %y,t_2          !=
1233         addxcc  c_3,t_2,c_3
1234         addx    c_1,%g0,c_1
1235         addcc   c_2,t_1,c_2
1236         addxcc  c_3,t_2,c_3     !=
1237         addx    c_1,%g0,c_1
1238         umul    a_3,a_4,t_1     !sqr_add_c2(a,4,3,c2,c3,c1);
1239         addcc   c_2,t_1,c_2
1240         rd      %y,t_2          !=
1241         addxcc  c_3,t_2,c_3
1242         addx    c_1,%g0,c_1
1243         addcc   c_2,t_1,c_2
1244         addxcc  c_3,t_2,c_3     !=
1245         addx    c_1,%g0,c_1
1246         st      c_2,r(7)        !r[7]=c2;
1247
1248         umul    a_7,a_1,t_1     !sqr_add_c2(a,7,1,c3,c1,c2);
1249         addcc   c_3,t_1,c_3     !=
1250         rd      %y,t_2
1251         addxcc  c_1,t_2,c_1
1252         addx    %g0,%g0,c_2
1253         addcc   c_3,t_1,c_3     !=
1254         addxcc  c_1,t_2,c_1
1255         addx    c_2,%g0,c_2
1256         umul    a_6,a_2,t_1     !sqr_add_c2(a,6,2,c3,c1,c2);
1257         addcc   c_3,t_1,c_3     !=
1258         rd      %y,t_2
1259         addxcc  c_1,t_2,c_1
1260         addx    c_2,%g0,c_2
1261         addcc   c_3,t_1,c_3     !=
1262         addxcc  c_1,t_2,c_1
1263         addx    c_2,%g0,c_2
1264         umul    a_5,a_3,t_1     !sqr_add_c2(a,5,3,c3,c1,c2);
1265         addcc   c_3,t_1,c_3     !=
1266         rd      %y,t_2
1267         addxcc  c_1,t_2,c_1
1268         addx    c_2,%g0,c_2
1269         addcc   c_3,t_1,c_3     !=
1270         addxcc  c_1,t_2,c_1
1271         addx    c_2,%g0,c_2
1272         umul    a_4,a_4,t_1     !sqr_add_c(a,4,c3,c1,c2);
1273         addcc   c_3,t_1,c_3     !=
1274         rd      %y,t_2
1275         addxcc  c_1,t_2,c_1
1276         st      c_3,r(8)        !r[8]=c3;
1277         addx    c_2,%g0,c_2     !=
1278
1279         umul    a_2,a_7,t_1     !sqr_add_c2(a,7,2,c1,c2,c3);
1280         addcc   c_1,t_1,c_1
1281         rd      %y,t_2
1282         addxcc  c_2,t_2,c_2     !=
1283         addx    %g0,%g0,c_3
1284         addcc   c_1,t_1,c_1
1285         addxcc  c_2,t_2,c_2
1286         addx    c_3,%g0,c_3     !=
1287         umul    a_3,a_6,t_1     !sqr_add_c2(a,6,3,c1,c2,c3);
1288         addcc   c_1,t_1,c_1
1289         rd      %y,t_2
1290         addxcc  c_2,t_2,c_2     !=
1291         addx    c_3,%g0,c_3
1292         addcc   c_1,t_1,c_1
1293         addxcc  c_2,t_2,c_2
1294         addx    c_3,%g0,c_3     !=
1295         umul    a_4,a_5,t_1     !sqr_add_c2(a,5,4,c1,c2,c3);
1296         addcc   c_1,t_1,c_1
1297         rd      %y,t_2
1298         addxcc  c_2,t_2,c_2     !=
1299         addx    c_3,%g0,c_3
1300         addcc   c_1,t_1,c_1
1301         addxcc  c_2,t_2,c_2
1302         addx    c_3,%g0,c_3     !=
1303         st      c_1,r(9)        !r[9]=c1;
1304
1305         umul    a_7,a_3,t_1     !sqr_add_c2(a,7,3,c2,c3,c1);
1306         addcc   c_2,t_1,c_2
1307         rd      %y,t_2          !=
1308         addxcc  c_3,t_2,c_3
1309         addx    %g0,%g0,c_1
1310         addcc   c_2,t_1,c_2
1311         addxcc  c_3,t_2,c_3     !=
1312         addx    c_1,%g0,c_1
1313         umul    a_6,a_4,t_1     !sqr_add_c2(a,6,4,c2,c3,c1);
1314         addcc   c_2,t_1,c_2
1315         rd      %y,t_2          !=
1316         addxcc  c_3,t_2,c_3
1317         addx    c_1,%g0,c_1
1318         addcc   c_2,t_1,c_2
1319         addxcc  c_3,t_2,c_3     !=
1320         addx    c_1,%g0,c_1
1321         umul    a_5,a_5,t_1     !sqr_add_c(a,5,c2,c3,c1);
1322         addcc   c_2,t_1,c_2
1323         rd      %y,t_2          !=
1324         addxcc  c_3,t_2,c_3
1325         addx    c_1,%g0,c_1
1326         st      c_2,r(10)       !r[10]=c2;
1327
1328         umul    a_4,a_7,t_1     !=!sqr_add_c2(a,7,4,c3,c1,c2);
1329         addcc   c_3,t_1,c_3
1330         rd      %y,t_2
1331         addxcc  c_1,t_2,c_1
1332         addx    %g0,%g0,c_2     !=
1333         addcc   c_3,t_1,c_3
1334         addxcc  c_1,t_2,c_1
1335         addx    c_2,%g0,c_2
1336         umul    a_5,a_6,t_1     !=!sqr_add_c2(a,6,5,c3,c1,c2);
1337         addcc   c_3,t_1,c_3
1338         rd      %y,t_2
1339         addxcc  c_1,t_2,c_1
1340         addx    c_2,%g0,c_2     !=
1341         addcc   c_3,t_1,c_3
1342         addxcc  c_1,t_2,c_1
1343         st      c_3,r(11)       !r[11]=c3;
1344         addx    c_2,%g0,c_2     !=
1345
1346         umul    a_7,a_5,t_1     !sqr_add_c2(a,7,5,c1,c2,c3);
1347         addcc   c_1,t_1,c_1
1348         rd      %y,t_2
1349         addxcc  c_2,t_2,c_2     !=
1350         addx    %g0,%g0,c_3
1351         addcc   c_1,t_1,c_1
1352         addxcc  c_2,t_2,c_2
1353         addx    c_3,%g0,c_3     !=
1354         umul    a_6,a_6,t_1     !sqr_add_c(a,6,c1,c2,c3);
1355         addcc   c_1,t_1,c_1
1356         rd      %y,t_2
1357         addxcc  c_2,t_2,c_2     !=
1358         addx    c_3,%g0,c_3
1359         st      c_1,r(12)       !r[12]=c1;
1360
1361         umul    a_6,a_7,t_1     !sqr_add_c2(a,7,6,c2,c3,c1);
1362         addcc   c_2,t_1,c_2     !=
1363         rd      %y,t_2
1364         addxcc  c_3,t_2,c_3
1365         addx    %g0,%g0,c_1
1366         addcc   c_2,t_1,c_2     !=
1367         rd      %y,t_2
1368         addxcc  c_3,t_2,c_3
1369         st      c_2,r(13)       !r[13]=c2;
1370         addx    c_1,%g0,c_1     !=
1371
1372         umul    a_7,a_7,t_1     !sqr_add_c(a,7,c3,c1,c2);
1373         addcc   c_3,t_1,c_3
1374         rd      %y,t_2
1375         addxcc  c_1,t_2,c_1     !=
1376         st      c_3,r(14)       !r[14]=c3;
1377         st      c_1,r(15)       !r[15]=c1;
1378
1379         ret
1380         restore %g0,%g0,%o0
1381
1382 .type   bn_sqr_comba8,#function
1383 .size   bn_sqr_comba8,(.-bn_sqr_comba8)
1384
1385 .align  32
1386
1387 .global bn_sqr_comba4
1388 /*
1389  * void bn_sqr_comba4(r,a)
1390  * BN_ULONG *r,*a;
1391  */
1392 bn_sqr_comba4:
1393         save    %sp,FRAME_SIZE,%sp
1394         ld      a(0),a_0
1395         umul    a_0,a_0,c_1     !sqr_add_c(a,0,c1,c2,c3);
1396         ld      a(1),a_1        !=
1397         rd      %y,c_2
1398         st      c_1,r(0)        !r[0]=c1;
1399
1400         ld      a(1),a_1
1401         umul    a_0,a_1,t_1     !=!sqr_add_c2(a,1,0,c2,c3,c1);
1402         addcc   c_2,t_1,c_2
1403         rd      %y,t_2
1404         addxcc  %g0,t_2,c_3
1405         addx    %g0,%g0,c_1     !=
1406         ld      a(2),a_2
1407         addcc   c_2,t_1,c_2
1408         addxcc  c_3,t_2,c_3
1409         addx    c_1,%g0,c_1     !=
1410         st      c_2,r(1)        !r[1]=c2;
1411
1412         umul    a_2,a_0,t_1     !sqr_add_c2(a,2,0,c3,c1,c2);
1413         addcc   c_3,t_1,c_3
1414         rd      %y,t_2          !=
1415         addxcc  c_1,t_2,c_1
1416         addx    %g0,%g0,c_2
1417         addcc   c_3,t_1,c_3
1418         addxcc  c_1,t_2,c_1     !=
1419         addx    c_2,%g0,c_2
1420         ld      a(3),a_3
1421         umul    a_1,a_1,t_1     !sqr_add_c(a,1,c3,c1,c2);
1422         addcc   c_3,t_1,c_3     !=
1423         rd      %y,t_2
1424         addxcc  c_1,t_2,c_1
1425         st      c_3,r(2)        !r[2]=c3;
1426         addx    c_2,%g0,c_2     !=
1427
1428         umul    a_0,a_3,t_1     !sqr_add_c2(a,3,0,c1,c2,c3);
1429         addcc   c_1,t_1,c_1
1430         rd      %y,t_2
1431         addxcc  c_2,t_2,c_2     !=
1432         addx    %g0,%g0,c_3
1433         addcc   c_1,t_1,c_1
1434         addxcc  c_2,t_2,c_2
1435         addx    c_3,%g0,c_3     !=
1436         umul    a_1,a_2,t_1     !sqr_add_c2(a,2,1,c1,c2,c3);
1437         addcc   c_1,t_1,c_1
1438         rd      %y,t_2
1439         addxcc  c_2,t_2,c_2     !=
1440         addx    c_3,%g0,c_3
1441         addcc   c_1,t_1,c_1
1442         addxcc  c_2,t_2,c_2
1443         addx    c_3,%g0,c_3     !=
1444         st      c_1,r(3)        !r[3]=c1;
1445
1446         umul    a_3,a_1,t_1     !sqr_add_c2(a,3,1,c2,c3,c1);
1447         addcc   c_2,t_1,c_2
1448         rd      %y,t_2          !=
1449         addxcc  c_3,t_2,c_3
1450         addx    %g0,%g0,c_1
1451         addcc   c_2,t_1,c_2
1452         addxcc  c_3,t_2,c_3     !=
1453         addx    c_1,%g0,c_1
1454         umul    a_2,a_2,t_1     !sqr_add_c(a,2,c2,c3,c1);
1455         addcc   c_2,t_1,c_2
1456         rd      %y,t_2          !=
1457         addxcc  c_3,t_2,c_3
1458         addx    c_1,%g0,c_1
1459         st      c_2,r(4)        !r[4]=c2;
1460
1461         umul    a_2,a_3,t_1     !=!sqr_add_c2(a,3,2,c3,c1,c2);
1462         addcc   c_3,t_1,c_3
1463         rd      %y,t_2
1464         addxcc  c_1,t_2,c_1
1465         addx    %g0,%g0,c_2     !=
1466         addcc   c_3,t_1,c_3
1467         addxcc  c_1,t_2,c_1
1468         st      c_3,r(5)        !r[5]=c3;
1469         addx    c_2,%g0,c_2     !=
1470
1471         umul    a_3,a_3,t_1     !sqr_add_c(a,3,c1,c2,c3);
1472         addcc   c_1,t_1,c_1
1473         rd      %y,t_2
1474         addxcc  c_2,t_2,c_2     !=
1475         st      c_1,r(6)        !r[6]=c1;
1476         st      c_2,r(7)        !r[7]=c2;
1477         
1478         ret
1479         restore %g0,%g0,%o0
1480
1481 .type   bn_sqr_comba4,#function
1482 .size   bn_sqr_comba4,(.-bn_sqr_comba4)
1483
1484 .align  32