Home | History | Annotate | Line # | Download | only in sparc
sparcv9-mont.S revision 1.1.10.2
      1 .section	".text",#alloc,#execinstr
      2 
      3 .global	bn_mul_mont_int
      4 .align	32
      5 bn_mul_mont_int:
      6 	cmp	%o5,4			! 128 bits minimum
      7 	bge,pt	%icc,.Lenter
      8 	sethi	%hi(0xffffffff),%g1
      9 	retl
     10 	clr	%o0
     11 .align	32
     12 .Lenter:
     13 	save	%sp,-128,%sp
     14 	sll	%i5,2,%i5		! num*=4
     15 	or	%g1,%lo(0xffffffff),%g1
     16 	ld	[%i4],%i4
     17 	cmp	%i1,%i2
     18 	and	%i5,%g1,%i5
     19 	ld	[%i2],%l2		! bp[0]
     20 	nop
     21 
     22 	add	%sp,0,%o7		! real top of stack
     23 	ld	[%i1],%o0		! ap[0] ! redundant in squaring context
     24 	sub	%o7,%i5,%o7
     25 	ld	[%i1+4],%l5		! ap[1]
     26 	and	%o7,-1024,%o7
     27 	ld	[%i3],%o1		! np[0]
     28 	sub	%o7,0,%sp		! alloca
     29 	ld	[%i3+4],%l6		! np[1]
     30 	be,pt	%icc,.Lbn_sqr_mont
     31 	mov	12,%l1
     32 
     33 	mulx	%o0,%l2,%o0	! ap[0]*bp[0]
     34 	mulx	%l5,%l2,%g4	!prologue! ap[1]*bp[0]
     35 	and	%o0,%g1,%o3
     36 	add	%sp,0+128,%l4
     37 	ld	[%i1+8],%l5		!prologue!
     38 
     39 	mulx	%i4,%o3,%l3		! "t[0]"*n0
     40 	and	%l3,%g1,%l3
     41 
     42 	mulx	%o1,%l3,%o1	! np[0]*"t[0]"*n0
     43 	mulx	%l6,%l3,%o4	!prologue! np[1]*"t[0]"*n0
     44 	srlx	%o0,32,%o0
     45 	add	%o3,%o1,%o1
     46 	ld	[%i3+8],%l6		!prologue!
     47 	srlx	%o1,32,%o1
     48 	mov	%g4,%o3		!prologue!
     49 
     50 .L1st:
     51 	mulx	%l5,%l2,%g4
     52 	mulx	%l6,%l3,%g5
     53 	add	%o3,%o0,%o0
     54 	ld	[%i1+%l1],%l5		! ap[j]
     55 	and	%o0,%g1,%o3
     56 	add	%o4,%o1,%o1
     57 	ld	[%i3+%l1],%l6		! np[j]
     58 	srlx	%o0,32,%o0
     59 	add	%o3,%o1,%o1
     60 	add	%l1,4,%l1			! j++
     61 	mov	%g4,%o3
     62 	st	%o1,[%l4]
     63 	cmp	%l1,%i5
     64 	mov	%g5,%o4
     65 	srlx	%o1,32,%o1
     66 	bl	%icc,.L1st
     67 	add	%l4,4,%l4		! tp++
     68 !.L1st
     69 
     70 	mulx	%l5,%l2,%g4	!epilogue!
     71 	mulx	%l6,%l3,%g5
     72 	add	%o3,%o0,%o0
     73 	and	%o0,%g1,%o3
     74 	add	%o4,%o1,%o1
     75 	srlx	%o0,32,%o0
     76 	add	%o3,%o1,%o1
     77 	st	%o1,[%l4]
     78 	srlx	%o1,32,%o1
     79 
     80 	add	%g4,%o0,%o0
     81 	and	%o0,%g1,%o3
     82 	add	%g5,%o1,%o1
     83 	srlx	%o0,32,%o0
     84 	add	%o3,%o1,%o1
     85 	st	%o1,[%l4+4]
     86 	srlx	%o1,32,%o1
     87 
     88 	add	%o0,%o1,%o1
     89 	st	%o1,[%l4+8]
     90 	srlx	%o1,32,%o2
     91 
     92 	mov	4,%l0			! i++
     94 	ld	[%i2+4],%l2		! bp[1]
     95 .Louter:
     96 	add	%sp,0+128,%l4
     97 	ld	[%i1],%o0		! ap[0]
     98 	ld	[%i1+4],%l5		! ap[1]
     99 	ld	[%i3],%o1		! np[0]
    100 	ld	[%i3+4],%l6		! np[1]
    101 	ld	[%l4],%g5		! tp[0]
    102 	ld	[%l4+4],%l7		! tp[1]
    103 	mov	12,%l1
    104 
    105 	mulx	%o0,%l2,%o0
    106 	mulx	%l5,%l2,%g4	!prologue!
    107 	add	%g5,%o0,%o0
    108 	ld	[%i1+8],%l5		!prologue!
    109 	and	%o0,%g1,%o3
    110 
    111 	mulx	%i4,%o3,%l3
    112 	and	%l3,%g1,%l3
    113 
    114 	mulx	%o1,%l3,%o1
    115 	mulx	%l6,%l3,%o4	!prologue!
    116 	srlx	%o0,32,%o0
    117 	add	%o3,%o1,%o1
    118 	ld	[%i3+8],%l6		!prologue!
    119 	srlx	%o1,32,%o1
    120 	mov	%g4,%o3		!prologue!
    121 
    122 .Linner:
    123 	mulx	%l5,%l2,%g4
    124 	mulx	%l6,%l3,%g5
    125 	add	%l7,%o0,%o0
    126 	ld	[%i1+%l1],%l5		! ap[j]
    127 	add	%o3,%o0,%o0
    128 	add	%o4,%o1,%o1
    129 	ld	[%i3+%l1],%l6		! np[j]
    130 	and	%o0,%g1,%o3
    131 	ld	[%l4+8],%l7		! tp[j]
    132 	srlx	%o0,32,%o0
    133 	add	%o3,%o1,%o1
    134 	add	%l1,4,%l1			! j++
    135 	mov	%g4,%o3
    136 	st	%o1,[%l4]		! tp[j-1]
    137 	srlx	%o1,32,%o1
    138 	mov	%g5,%o4
    139 	cmp	%l1,%i5
    140 	bl	%icc,.Linner
    141 	add	%l4,4,%l4		! tp++
    142 !.Linner
    143 
    144 	mulx	%l5,%l2,%g4	!epilogue!
    145 	mulx	%l6,%l3,%g5
    146 	add	%l7,%o0,%o0
    147 	add	%o3,%o0,%o0
    148 	ld	[%l4+8],%l7		! tp[j]
    149 	and	%o0,%g1,%o3
    150 	add	%o4,%o1,%o1
    151 	srlx	%o0,32,%o0
    152 	add	%o3,%o1,%o1
    153 	st	%o1,[%l4]		! tp[j-1]
    154 	srlx	%o1,32,%o1
    155 
    156 	add	%l7,%o0,%o0
    157 	add	%g4,%o0,%o0
    158 	and	%o0,%g1,%o3
    159 	add	%g5,%o1,%o1
    160 	add	%o3,%o1,%o1
    161 	st	%o1,[%l4+4]		! tp[j-1]
    162 	srlx	%o0,32,%o0
    163 	add	%l0,4,%l0			! i++
    164 	srlx	%o1,32,%o1
    165 
    166 	add	%o0,%o1,%o1
    167 	cmp	%l0,%i5
    168 	add	%o2,%o1,%o1
    169 	st	%o1,[%l4+8]
    170 
    171 	srlx	%o1,32,%o2
    172 	bl,a	%icc,.Louter
    173 	ld	[%i2+%l0],%l2		! bp[i]
    174 !.Louter
    175 
    176 	add	%l4,12,%l4
    177 
    178 .Ltail:
    180 	add	%i3,%i5,%i3
    181 	add	%i0,%i5,%i0
    182 	mov	%l4,%i1
    183 	sub	%g0,%i5,%o7		! k=-num
    184 	ba	.Lsub
    185 	subcc	%g0,%g0,%g0		! clear %icc.c
    186 .align	16
    187 .Lsub:
    188 	ld	[%l4+%o7],%o0
    189 	ld	[%i3+%o7],%o1
    190 	subccc	%o0,%o1,%o1		! tp[j]-np[j]
    191 	add	%i0,%o7,%l0
    192 	add	%o7,4,%o7
    193 	brnz	%o7,.Lsub
    194 	st	%o1,[%l0]
    195 	subc	%o2,0,%o2		! handle upmost overflow bit
    196 	and	%l4,%o2,%i1
    197 	andn	%i0,%o2,%i3
    198 	or	%i1,%i3,%i1
    199 	sub	%g0,%i5,%o7
    200 
    201 .Lcopy:
    202 	ld	[%i1+%o7],%o0		! copy or in-place refresh
    203 	st	%g0,[%l4+%o7]		! zap tp
    204 	st	%o0,[%i0+%o7]
    205 	add	%o7,4,%o7
    206 	brnz	%o7,.Lcopy
    207 	nop
    208 	mov	1,%i0
    209 	ret
    210 	restore
    211 .align	32
    212 .Lbn_sqr_mont:
    213 	mulx	%l2,%l2,%o0		! ap[0]*ap[0]
    214 	mulx	%l5,%l2,%g4		!prologue!
    215 	and	%o0,%g1,%o3
    216 	add	%sp,0+128,%l4
    217 	ld	[%i1+8],%l5			!prologue!
    218 
    219 	mulx	%i4,%o3,%l3			! "t[0]"*n0
    220 	srlx	%o0,32,%o0
    221 	and	%l3,%g1,%l3
    222 
    223 	mulx	%o1,%l3,%o1		! np[0]*"t[0]"*n0
    224 	mulx	%l6,%l3,%o4		!prologue!
    225 	and	%o0,1,%i2
    226 	ld	[%i3+8],%l6			!prologue!
    227 	srlx	%o0,1,%o0
    228 	add	%o3,%o1,%o1
    229 	srlx	%o1,32,%o1
    230 	mov	%g4,%o3			!prologue!
    231 
    232 .Lsqr_1st:
    233 	mulx	%l5,%l2,%g4
    234 	mulx	%l6,%l3,%g5
    235 	add	%o3,%o0,%o0		! ap[j]*a0+c0
    236 	add	%o4,%o1,%o1
    237 	ld	[%i1+%l1],%l5			! ap[j]
    238 	and	%o0,%g1,%o3
    239 	ld	[%i3+%l1],%l6			! np[j]
    240 	srlx	%o0,32,%o0
    241 	add	%o3,%o3,%o3
    242 	or	%i2,%o3,%o3
    243 	mov	%g5,%o4
    244 	srlx	%o3,32,%i2
    245 	add	%l1,4,%l1				! j++
    246 	and	%o3,%g1,%o3
    247 	cmp	%l1,%i5
    248 	add	%o3,%o1,%o1
    249 	st	%o1,[%l4]
    250 	mov	%g4,%o3
    251 	srlx	%o1,32,%o1
    252 	bl	%icc,.Lsqr_1st
    253 	add	%l4,4,%l4			! tp++
    254 !.Lsqr_1st
    255 
    256 	mulx	%l5,%l2,%g4		! epilogue
    257 	mulx	%l6,%l3,%g5
    258 	add	%o3,%o0,%o0		! ap[j]*a0+c0
    259 	add	%o4,%o1,%o1
    260 	and	%o0,%g1,%o3
    261 	srlx	%o0,32,%o0
    262 	add	%o3,%o3,%o3
    263 	or	%i2,%o3,%o3
    264 	srlx	%o3,32,%i2
    265 	and	%o3,%g1,%o3
    266 	add	%o3,%o1,%o1
    267 	st	%o1,[%l4]
    268 	srlx	%o1,32,%o1
    269 
    270 	add	%g4,%o0,%o0		! ap[j]*a0+c0
    271 	add	%g5,%o1,%o1
    272 	and	%o0,%g1,%o3
    273 	srlx	%o0,32,%o0
    274 	add	%o3,%o3,%o3
    275 	or	%i2,%o3,%o3
    276 	srlx	%o3,32,%i2
    277 	and	%o3,%g1,%o3
    278 	add	%o3,%o1,%o1
    279 	st	%o1,[%l4+4]
    280 	srlx	%o1,32,%o1
    281 
    282 	add	%o0,%o0,%o0
    283 	or	%i2,%o0,%o0
    284 	add	%o0,%o1,%o1
    285 	st	%o1,[%l4+8]
    286 	srlx	%o1,32,%o2
    287 
    288 	ld	[%sp+0+128],%g4	! tp[0]
    290 	ld	[%sp+0+128+4],%g5	! tp[1]
    291 	ld	[%sp+0+128+8],%l7	! tp[2]
    292 	ld	[%i1+4],%l2			! ap[1]
    293 	ld	[%i1+8],%l5			! ap[2]
    294 	ld	[%i3],%o1			! np[0]
    295 	ld	[%i3+4],%l6			! np[1]
    296 	mulx	%i4,%g4,%l3
    297 
    298 	mulx	%l2,%l2,%o0
    299 	and	%l3,%g1,%l3
    300 
    301 	mulx	%o1,%l3,%o1
    302 	mulx	%l6,%l3,%o4
    303 	add	%g4,%o1,%o1
    304 	and	%o0,%g1,%o3
    305 	ld	[%i3+8],%l6			! np[2]
    306 	srlx	%o1,32,%o1
    307 	add	%g5,%o1,%o1
    308 	srlx	%o0,32,%o0
    309 	add	%o3,%o1,%o1
    310 	and	%o0,1,%i2
    311 	add	%o4,%o1,%o1
    312 	srlx	%o0,1,%o0
    313 	mov	12,%l1
    314 	st	%o1,[%sp+0+128]	! tp[0]=
    315 	srlx	%o1,32,%o1
    316 	add	%sp,0+128+4,%l4
    317 
    318 .Lsqr_2nd:
    319 	mulx	%l5,%l2,%o3
    320 	mulx	%l6,%l3,%o4
    321 	add	%o3,%o0,%o0
    322 	add	%l7,%o1,%o1
    323 	ld	[%i1+%l1],%l5			! ap[j]
    324 	and	%o0,%g1,%o3
    325 	ld	[%i3+%l1],%l6			! np[j]
    326 	srlx	%o0,32,%o0
    327 	add	%o4,%o1,%o1
    328 	ld	[%l4+8],%l7			! tp[j]
    329 	add	%o3,%o3,%o3
    330 	add	%l1,4,%l1				! j++
    331 	or	%i2,%o3,%o3
    332 	srlx	%o3,32,%i2
    333 	and	%o3,%g1,%o3
    334 	cmp	%l1,%i5
    335 	add	%o3,%o1,%o1
    336 	st	%o1,[%l4]			! tp[j-1]
    337 	srlx	%o1,32,%o1
    338 	bl	%icc,.Lsqr_2nd
    339 	add	%l4,4,%l4			! tp++
    340 !.Lsqr_2nd
    341 
    342 	mulx	%l5,%l2,%o3
    343 	mulx	%l6,%l3,%o4
    344 	add	%o3,%o0,%o0
    345 	add	%l7,%o1,%o1
    346 	and	%o0,%g1,%o3
    347 	srlx	%o0,32,%o0
    348 	add	%o4,%o1,%o1
    349 	add	%o3,%o3,%o3
    350 	or	%i2,%o3,%o3
    351 	srlx	%o3,32,%i2
    352 	and	%o3,%g1,%o3
    353 	add	%o3,%o1,%o1
    354 	st	%o1,[%l4]			! tp[j-1]
    355 	srlx	%o1,32,%o1
    356 
    357 	add	%o0,%o0,%o0
    358 	or	%i2,%o0,%o0
    359 	add	%o0,%o1,%o1
    360 	add	%o2,%o1,%o1
    361 	st	%o1,[%l4+4]
    362 	srlx	%o1,32,%o2
    363 
    364 	ld	[%sp+0+128],%g5	! tp[0]
    366 	ld	[%sp+0+128+4],%l7	! tp[1]
    367 	ld	[%i1+8],%l2			! ap[2]
    368 	ld	[%i3],%o1			! np[0]
    369 	ld	[%i3+4],%l6			! np[1]
    370 	mulx	%i4,%g5,%l3
    371 	and	%l3,%g1,%l3
    372 	mov	8,%l0
    373 
    374 	mulx	%l2,%l2,%o0
    375 	mulx	%o1,%l3,%o1
    376 	and	%o0,%g1,%o3
    377 	add	%g5,%o1,%o1
    378 	srlx	%o0,32,%o0
    379 	add	%sp,0+128,%l4
    380 	srlx	%o1,32,%o1
    381 	and	%o0,1,%i2
    382 	srlx	%o0,1,%o0
    383 	mov	4,%l1
    384 
    385 .Lsqr_outer:
    386 .Lsqr_inner1:
    387 	mulx	%l6,%l3,%o4
    388 	add	%l7,%o1,%o1
    389 	add	%l1,4,%l1
    390 	ld	[%l4+8],%l7
    391 	cmp	%l1,%l0
    392 	add	%o4,%o1,%o1
    393 	ld	[%i3+%l1],%l6
    394 	st	%o1,[%l4]
    395 	srlx	%o1,32,%o1
    396 	bl	%icc,.Lsqr_inner1
    397 	add	%l4,4,%l4
    398 !.Lsqr_inner1
    399 
    400 	add	%l1,4,%l1
    401 	ld	[%i1+%l1],%l5			! ap[j]
    402 	mulx	%l6,%l3,%o4
    403 	add	%l7,%o1,%o1
    404 	ld	[%i3+%l1],%l6			! np[j]
    405 	add	%o3,%o1,%o1
    406 	ld	[%l4+8],%l7			! tp[j]
    407 	add	%o4,%o1,%o1
    408 	st	%o1,[%l4]
    409 	srlx	%o1,32,%o1
    410 
    411 	add	%l1,4,%l1
    412 	cmp	%l1,%i5
    413 	be,pn	%icc,.Lsqr_no_inner2
    414 	add	%l4,4,%l4
    415 
    416 .Lsqr_inner2:
    417 	mulx	%l5,%l2,%o3
    418 	mulx	%l6,%l3,%o4
    419 	add	%l7,%o1,%o1
    420 	add	%o3,%o0,%o0
    421 	ld	[%i1+%l1],%l5			! ap[j]
    422 	and	%o0,%g1,%o3
    423 	ld	[%i3+%l1],%l6			! np[j]
    424 	srlx	%o0,32,%o0
    425 	add	%o3,%o3,%o3
    426 	ld	[%l4+8],%l7			! tp[j]
    427 	or	%i2,%o3,%o3
    428 	add	%l1,4,%l1				! j++
    429 	srlx	%o3,32,%i2
    430 	and	%o3,%g1,%o3
    431 	cmp	%l1,%i5
    432 	add	%o3,%o1,%o1
    433 	add	%o4,%o1,%o1
    434 	st	%o1,[%l4]			! tp[j-1]
    435 	srlx	%o1,32,%o1
    436 	bl	%icc,.Lsqr_inner2
    437 	add	%l4,4,%l4			! tp++
    438 
    439 .Lsqr_no_inner2:
    440 	mulx	%l5,%l2,%o3
    441 	mulx	%l6,%l3,%o4
    442 	add	%l7,%o1,%o1
    443 	add	%o3,%o0,%o0
    444 	and	%o0,%g1,%o3
    445 	srlx	%o0,32,%o0
    446 	add	%o3,%o3,%o3
    447 	or	%i2,%o3,%o3
    448 	srlx	%o3,32,%i2
    449 	and	%o3,%g1,%o3
    450 	add	%o3,%o1,%o1
    451 	add	%o4,%o1,%o1
    452 	st	%o1,[%l4]			! tp[j-1]
    453 	srlx	%o1,32,%o1
    454 
    455 	add	%o0,%o0,%o0
    456 	or	%i2,%o0,%o0
    457 	add	%o0,%o1,%o1
    458 	add	%o2,%o1,%o1
    459 	st	%o1,[%l4+4]
    460 	srlx	%o1,32,%o2
    461 
    462 	add	%l0,4,%l0				! i++
    464 	ld	[%sp+0+128],%g5	! tp[0]
    465 	ld	[%sp+0+128+4],%l7	! tp[1]
    466 	ld	[%i1+%l0],%l2			! ap[j]
    467 	ld	[%i3],%o1			! np[0]
    468 	ld	[%i3+4],%l6			! np[1]
    469 	mulx	%i4,%g5,%l3
    470 	and	%l3,%g1,%l3
    471 	add	%l0,4,%g4
    472 
    473 	mulx	%l2,%l2,%o0
    474 	mulx	%o1,%l3,%o1
    475 	and	%o0,%g1,%o3
    476 	add	%g5,%o1,%o1
    477 	srlx	%o0,32,%o0
    478 	add	%sp,0+128,%l4
    479 	srlx	%o1,32,%o1
    480 	and	%o0,1,%i2
    481 	srlx	%o0,1,%o0
    482 
    483 	cmp	%g4,%i5			! i<num-1
    484 	bl	%icc,.Lsqr_outer
    485 	mov	4,%l1
    486 
    487 .Lsqr_last:
    489 	mulx	%l6,%l3,%o4
    490 	add	%l7,%o1,%o1
    491 	add	%l1,4,%l1
    492 	ld	[%l4+8],%l7
    493 	cmp	%l1,%l0
    494 	add	%o4,%o1,%o1
    495 	ld	[%i3+%l1],%l6
    496 	st	%o1,[%l4]
    497 	srlx	%o1,32,%o1
    498 	bl	%icc,.Lsqr_last
    499 	add	%l4,4,%l4
    500 !.Lsqr_last
    501 
    502 	mulx	%l6,%l3,%o4
    503 	add	%l7,%o1,%o1
    504 	add	%o3,%o1,%o1
    505 	add	%o4,%o1,%o1
    506 	st	%o1,[%l4]
    507 	srlx	%o1,32,%o1
    508 
    509 	add	%o0,%o0,%o0		! recover %o0
    510 	or	%i2,%o0,%o0
    511 	add	%o0,%o1,%o1
    512 	add	%o2,%o1,%o1
    513 	st	%o1,[%l4+4]
    514 	srlx	%o1,32,%o2
    515 
    516 	ba	.Ltail
    517 	add	%l4,8,%l4
    518 .type	bn_mul_mont_int,#function
    519 .size	bn_mul_mont_int,(.-bn_mul_mont_int)
    520 .asciz	"Montgomery Multipltication for SPARCv9, CRYPTOGAMS by <appro (at) openssl.org>"
    521 .align	32
    522