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