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