Home | History | Annotate | Line # | Download | only in sparc64
md5-sparcv9.S revision 1.1.1.1
      1 #include "sparc_arch.h"
      2 
      3 #ifdef __arch64__
      4 .register	%g2,#scratch
      5 .register	%g3,#scratch
      6 #endif
      7 
      8 .section	".text",#alloc,#execinstr
      9 
     10 #ifdef __PIC__
     11 SPARC_PIC_THUNK(%g1)
     12 #endif
     13 
     14 .globl	md5_block_asm_data_order
     15 .align	32
     16 md5_block_asm_data_order:
     17 	SPARC_LOAD_ADDRESS_LEAF(OPENSSL_sparcv9cap_P,%g1,%g5)
     18 	ld	[%g1+4],%g1		! OPENSSL_sparcv9cap_P[1]
     19 
     20 	andcc	%g1, CFR_MD5, %g0
     21 	be	.Lsoftware
     22 	nop
     23 
     24 	mov	4, %g1
     25 	andcc	%o1, 0x7, %g0
     26 	lda	[%o0 + %g0]0x88, %f0		! load context
     27 	lda	[%o0 + %g1]0x88, %f1
     28 	add	%o0, 8, %o0
     29 	lda	[%o0 + %g0]0x88, %f2
     30 	lda	[%o0 + %g1]0x88, %f3
     31 	bne,pn	%icc, .Lhwunaligned
     32 	sub	%o0, 8, %o0
     33 
     34 .Lhw_loop:
     35 	ldd	[%o1 + 0x00], %f8
     36 	ldd	[%o1 + 0x08], %f10
     37 	ldd	[%o1 + 0x10], %f12
     38 	ldd	[%o1 + 0x18], %f14
     39 	ldd	[%o1 + 0x20], %f16
     40 	ldd	[%o1 + 0x28], %f18
     41 	ldd	[%o1 + 0x30], %f20
     42 	subcc	%o2, 1, %o2		! done yet?
     43 	ldd	[%o1 + 0x38], %f22
     44 	add	%o1, 0x40, %o1
     45 	prefetch [%o1 + 63], 20
     46 
     47 	.word	0x81b02800		! MD5
     48 
     49 	bne,pt	SIZE_T_CC, .Lhw_loop
     50 	nop
     51 
     52 .Lhwfinish:
     53 	sta	%f0, [%o0 + %g0]0x88	! store context
     54 	sta	%f1, [%o0 + %g1]0x88
     55 	add	%o0, 8, %o0
     56 	sta	%f2, [%o0 + %g0]0x88
     57 	sta	%f3, [%o0 + %g1]0x88
     58 	retl
     59 	nop
     60 
     61 .align	8
     62 .Lhwunaligned:
     63 	.word	0x93b24300 !alignaddr	%o1,%g0,%o1
     64 
     65 	ldd	[%o1 + 0x00], %f10
     66 .Lhwunaligned_loop:
     67 	ldd	[%o1 + 0x08], %f12
     68 	ldd	[%o1 + 0x10], %f14
     69 	ldd	[%o1 + 0x18], %f16
     70 	ldd	[%o1 + 0x20], %f18
     71 	ldd	[%o1 + 0x28], %f20
     72 	ldd	[%o1 + 0x30], %f22
     73 	ldd	[%o1 + 0x38], %f24
     74 	subcc	%o2, 1, %o2		! done yet?
     75 	ldd	[%o1 + 0x40], %f26
     76 	add	%o1, 0x40, %o1
     77 	prefetch [%o1 + 63], 20
     78 
     79 	.word	0x91b2890c !faligndata	%f10,%f12,%f8
     80 	.word	0x95b3090e !faligndata	%f12,%f14,%f10
     81 	.word	0x99b38910 !faligndata	%f14,%f16,%f12
     82 	.word	0x9db40912 !faligndata	%f16,%f18,%f14
     83 	.word	0xa1b48914 !faligndata	%f18,%f20,%f16
     84 	.word	0xa5b50916 !faligndata	%f20,%f22,%f18
     85 	.word	0xa9b58918 !faligndata	%f22,%f24,%f20
     86 	.word	0xadb6091a !faligndata	%f24,%f26,%f22
     87 
     88 	.word	0x81b02800		! MD5
     89 
     90 	bne,pt	SIZE_T_CC, .Lhwunaligned_loop
     91 	.word	0x95b68f9a !for	%f26,%f26,%f10	! %f10=%f26
     92 
     93 	ba	.Lhwfinish
     94 	nop
     95 
     96 .align	16
     97 .Lsoftware:
     98 	save	%sp,-STACK_FRAME,%sp
     99 
    100 	rd	%asi,%l7
    101 	wr	%g0,0x88,%asi		! ASI_PRIMARY_LITTLE
    102 	and	%i1,7,%i3
    103 	andn	%i1,7,%i1
    104 
    105 	sll	%i3,3,%i3		! *=8
    106 	mov	56,%i5
    107 	ld	[%i0+0],%l0
    108 	sub	%i5,%i3,%i5
    109 	ld	[%i0+4],%l1
    110 	and	%i5,32,%i4
    111 	add	%i5,8,%i5
    112 	ld	[%i0+8],%l2
    113 	sub	%i5,%i4,%i5	! shr+shl1+shl2==64
    114 	ld	[%i0+12],%l3
    115 	nop
    116 
    117 .Loop:
    118 	 cmp	%i3,0			! was inp aligned?
    119 	ldxa	[%i1+0]%asi,%o0	! load little-endian input
    120 	ldxa	[%i1+8]%asi,%o1
    121 	ldxa	[%i1+16]%asi,%o2
    122 	ldxa	[%i1+24]%asi,%o3
    123 	ldxa	[%i1+32]%asi,%o4
    124 	 sllx	%l0,32,%g4		! pack A,B
    125 	ldxa	[%i1+40]%asi,%o5
    126 	 sllx	%l2,32,%g5		! pack C,D
    127 	ldxa	[%i1+48]%asi,%o7
    128 	 or	%l1,%g4,%g4
    129 	ldxa	[%i1+56]%asi,%g1
    130 	 or	%l3,%g5,%g5
    131 	bnz,a,pn	%icc,.+8
    132 	ldxa	[%i1+64]%asi,%g2
    133 
    134 	srlx	%o0,%i3,%o0	! align X[0]
    135 	sllx	%o1,%i4,%g3
    136 	 sethi	%hi(3614090360),%l5
    137 	sllx	%g3,%i5,%g3
    138 	 or	%l5,%lo(3614090360),%l5
    139 	or	%g3,%o0,%o0
    140 	 xor	%l2,%l3,%l4
    141 	 add	%o0,%l5,%l5		! X[0]+K[0]
    142 	 srlx	%o0,32,%g3		! extract X[1]
    143 	and	%l1,%l4,%l4		! round 0
    144 	add	%l5,%l0,%l0
    145 	xor	%l3,%l4,%l4
    146 	 sethi	%hi(3905402710),%l5
    147 	add	%l4,%l0,%l0
    148 	 or	%l5,%lo(3905402710),%l5
    149 	sll	%l0,7,%l6
    150 	 add	%g3,%l5,%l5		! X[1]+K[1]
    151 	srl	%l0,32-7,%l0
    152 	add	%l1,%l6,%l6
    153 	 xor	 %l1,%l2,%l4
    154 	add	%l6,%l0,%l0
    155 	 srlx	%o1,%i3,%o1	! align X[2]
    156 	and	%l0,%l4,%l4		! round 1
    157 	 sllx	%o2,%i4,%g3
    158 	add	%l5,%l3,%l3
    159 	 sllx	%g3,%i5,%g3
    160 	xor	%l2,%l4,%l4
    161 	 or	%g3,%o1,%o1
    162 	 sethi	%hi(606105819),%l5
    163 	add	%l4,%l3,%l3
    164 	 or	%l5,%lo(606105819),%l5
    165 	sll	%l3,12,%l6
    166 	 add	%o1,%l5,%l5		! X[2]+K[2]
    167 	srl	%l3,32-12,%l3
    168 	add	%l0,%l6,%l6
    169 	 xor	 %l0,%l1,%l4
    170 	add	%l6,%l3,%l3
    171 	 srlx	%o1,32,%g3		! extract X[3]
    172 	and	%l3,%l4,%l4		! round 2
    173 	add	%l5,%l2,%l2
    174 	xor	%l1,%l4,%l4
    175 	 sethi	%hi(3250441966),%l5
    176 	add	%l4,%l2,%l2
    177 	 or	%l5,%lo(3250441966),%l5
    178 	sll	%l2,17,%l6
    179 	 add	%g3,%l5,%l5		! X[3]+K[3]
    180 	srl	%l2,32-17,%l2
    181 	add	%l3,%l6,%l6
    182 	 xor	 %l3,%l0,%l4
    183 	add	%l6,%l2,%l2
    184 	 srlx	%o2,%i3,%o2	! align X[4]
    185 	and	%l2,%l4,%l4		! round 3
    186 	 sllx	%o3,%i4,%g3
    187 	add	%l5,%l1,%l1
    188 	 sllx	%g3,%i5,%g3
    189 	xor	%l0,%l4,%l4
    190 	 or	%g3,%o2,%o2
    191 	 sethi	%hi(4118548399),%l5
    192 	add	%l4,%l1,%l1
    193 	 or	%l5,%lo(4118548399),%l5
    194 	sll	%l1,22,%l6
    195 	 add	%o2,%l5,%l5		! X[4]+K[4]
    196 	srl	%l1,32-22,%l1
    197 	add	%l2,%l6,%l6
    198 	 xor	 %l2,%l3,%l4
    199 	add	%l6,%l1,%l1
    200 	 srlx	%o2,32,%g3		! extract X[5]
    201 	and	%l1,%l4,%l4		! round 4
    202 	add	%l5,%l0,%l0
    203 	xor	%l3,%l4,%l4
    204 	 sethi	%hi(1200080426),%l5
    205 	add	%l4,%l0,%l0
    206 	 or	%l5,%lo(1200080426),%l5
    207 	sll	%l0,7,%l6
    208 	 add	%g3,%l5,%l5		! X[5]+K[5]
    209 	srl	%l0,32-7,%l0
    210 	add	%l1,%l6,%l6
    211 	 xor	 %l1,%l2,%l4
    212 	add	%l6,%l0,%l0
    213 	 srlx	%o3,%i3,%o3	! align X[6]
    214 	and	%l0,%l4,%l4		! round 5
    215 	 sllx	%o4,%i4,%g3
    216 	add	%l5,%l3,%l3
    217 	 sllx	%g3,%i5,%g3
    218 	xor	%l2,%l4,%l4
    219 	 or	%g3,%o3,%o3
    220 	 sethi	%hi(2821735955),%l5
    221 	add	%l4,%l3,%l3
    222 	 or	%l5,%lo(2821735955),%l5
    223 	sll	%l3,12,%l6
    224 	 add	%o3,%l5,%l5		! X[6]+K[6]
    225 	srl	%l3,32-12,%l3
    226 	add	%l0,%l6,%l6
    227 	 xor	 %l0,%l1,%l4
    228 	add	%l6,%l3,%l3
    229 	 srlx	%o3,32,%g3		! extract X[7]
    230 	and	%l3,%l4,%l4		! round 6
    231 	add	%l5,%l2,%l2
    232 	xor	%l1,%l4,%l4
    233 	 sethi	%hi(4249261313),%l5
    234 	add	%l4,%l2,%l2
    235 	 or	%l5,%lo(4249261313),%l5
    236 	sll	%l2,17,%l6
    237 	 add	%g3,%l5,%l5		! X[7]+K[7]
    238 	srl	%l2,32-17,%l2
    239 	add	%l3,%l6,%l6
    240 	 xor	 %l3,%l0,%l4
    241 	add	%l6,%l2,%l2
    242 	 srlx	%o4,%i3,%o4	! align X[8]
    243 	and	%l2,%l4,%l4		! round 7
    244 	 sllx	%o5,%i4,%g3
    245 	add	%l5,%l1,%l1
    246 	 sllx	%g3,%i5,%g3
    247 	xor	%l0,%l4,%l4
    248 	 or	%g3,%o4,%o4
    249 	 sethi	%hi(1770035416),%l5
    250 	add	%l4,%l1,%l1
    251 	 or	%l5,%lo(1770035416),%l5
    252 	sll	%l1,22,%l6
    253 	 add	%o4,%l5,%l5		! X[8]+K[8]
    254 	srl	%l1,32-22,%l1
    255 	add	%l2,%l6,%l6
    256 	 xor	 %l2,%l3,%l4
    257 	add	%l6,%l1,%l1
    258 	 srlx	%o4,32,%g3		! extract X[9]
    259 	and	%l1,%l4,%l4		! round 8
    260 	add	%l5,%l0,%l0
    261 	xor	%l3,%l4,%l4
    262 	 sethi	%hi(2336552879),%l5
    263 	add	%l4,%l0,%l0
    264 	 or	%l5,%lo(2336552879),%l5
    265 	sll	%l0,7,%l6
    266 	 add	%g3,%l5,%l5		! X[9]+K[9]
    267 	srl	%l0,32-7,%l0
    268 	add	%l1,%l6,%l6
    269 	 xor	 %l1,%l2,%l4
    270 	add	%l6,%l0,%l0
    271 	 srlx	%o5,%i3,%o5	! align X[10]
    272 	and	%l0,%l4,%l4		! round 9
    273 	 sllx	%o7,%i4,%g3
    274 	add	%l5,%l3,%l3
    275 	 sllx	%g3,%i5,%g3
    276 	xor	%l2,%l4,%l4
    277 	 or	%g3,%o5,%o5
    278 	 sethi	%hi(4294925233),%l5
    279 	add	%l4,%l3,%l3
    280 	 or	%l5,%lo(4294925233),%l5
    281 	sll	%l3,12,%l6
    282 	 add	%o5,%l5,%l5		! X[10]+K[10]
    283 	srl	%l3,32-12,%l3
    284 	add	%l0,%l6,%l6
    285 	 xor	 %l0,%l1,%l4
    286 	add	%l6,%l3,%l3
    287 	 srlx	%o5,32,%g3		! extract X[11]
    288 	and	%l3,%l4,%l4		! round 10
    289 	add	%l5,%l2,%l2
    290 	xor	%l1,%l4,%l4
    291 	 sethi	%hi(2304563134),%l5
    292 	add	%l4,%l2,%l2
    293 	 or	%l5,%lo(2304563134),%l5
    294 	sll	%l2,17,%l6
    295 	 add	%g3,%l5,%l5		! X[11]+K[11]
    296 	srl	%l2,32-17,%l2
    297 	add	%l3,%l6,%l6
    298 	 xor	 %l3,%l0,%l4
    299 	add	%l6,%l2,%l2
    300 	 srlx	%o7,%i3,%o7	! align X[12]
    301 	and	%l2,%l4,%l4		! round 11
    302 	 sllx	%g1,%i4,%g3
    303 	add	%l5,%l1,%l1
    304 	 sllx	%g3,%i5,%g3
    305 	xor	%l0,%l4,%l4
    306 	 or	%g3,%o7,%o7
    307 	 sethi	%hi(1804603682),%l5
    308 	add	%l4,%l1,%l1
    309 	 or	%l5,%lo(1804603682),%l5
    310 	sll	%l1,22,%l6
    311 	 add	%o7,%l5,%l5		! X[12]+K[12]
    312 	srl	%l1,32-22,%l1
    313 	add	%l2,%l6,%l6
    314 	 xor	 %l2,%l3,%l4
    315 	add	%l6,%l1,%l1
    316 	 srlx	%o7,32,%g3		! extract X[13]
    317 	and	%l1,%l4,%l4		! round 12
    318 	add	%l5,%l0,%l0
    319 	xor	%l3,%l4,%l4
    320 	 sethi	%hi(4254626195),%l5
    321 	add	%l4,%l0,%l0
    322 	 or	%l5,%lo(4254626195),%l5
    323 	sll	%l0,7,%l6
    324 	 add	%g3,%l5,%l5		! X[13]+K[13]
    325 	srl	%l0,32-7,%l0
    326 	add	%l1,%l6,%l6
    327 	 xor	 %l1,%l2,%l4
    328 	add	%l6,%l0,%l0
    329 	 srlx	%g1,%i3,%g1	! align X[14]
    330 	and	%l0,%l4,%l4		! round 13
    331 	 sllx	%g2,%i4,%g3
    332 	add	%l5,%l3,%l3
    333 	 sllx	%g3,%i5,%g3
    334 	xor	%l2,%l4,%l4
    335 	 or	%g3,%g1,%g1
    336 	 sethi	%hi(2792965006),%l5
    337 	add	%l4,%l3,%l3
    338 	 or	%l5,%lo(2792965006),%l5
    339 	sll	%l3,12,%l6
    340 	 add	%g1,%l5,%l5		! X[14]+K[14]
    341 	srl	%l3,32-12,%l3
    342 	add	%l0,%l6,%l6
    343 	 xor	 %l0,%l1,%l4
    344 	add	%l6,%l3,%l3
    345 	 srlx	%g1,32,%g3		! extract X[15]
    346 	and	%l3,%l4,%l4		! round 14
    347 	add	%l5,%l2,%l2
    348 	xor	%l1,%l4,%l4
    349 	 sethi	%hi(1236535329),%l5
    350 	add	%l4,%l2,%l2
    351 	 or	%l5,%lo(1236535329),%l5
    352 	sll	%l2,17,%l6
    353 	 add	%g3,%l5,%l5		! X[15]+K[15]
    354 	srl	%l2,32-17,%l2
    355 	add	%l3,%l6,%l6
    356 	 xor	 %l3,%l0,%l4
    357 	add	%l6,%l2,%l2
    358 	 srlx	%o0,32,%g3		! extract X[1]
    359 	and	%l2,%l4,%l4		! round 15
    360 	add	%l5,%l1,%l1
    361 	xor	%l0,%l4,%l4
    362 	 sethi	%hi(4129170786),%l5
    363 	add	%l4,%l1,%l1
    364 	 or	%l5,%lo(4129170786),%l5
    365 	sll	%l1,22,%l6
    366 	 add	%g3,%l5,%l5		! X[1]+K[16]
    367 	srl	%l1,32-22,%l1
    368 	add	%l2,%l6,%l6
    369 	 andn	 %l2,%l3,%l4
    370 	add	%l6,%l1,%l1
    371 	and	%l1,%l3,%l6		! round 16
    372 	add	%l5,%l0,%l0
    373 	or	%l6,%l4,%l4
    374 	 sethi	%hi(3225465664),%l5
    375 	add	%l4,%l0,%l0
    376 	 or	%l5,%lo(3225465664),%l5
    377 	sll	%l0,5,%l6
    378 	 add	%o3,%l5,%l5		! X[6]+K[17]
    379 	srl	%l0,32-5,%l0
    380 	add	%l1,%l6,%l6
    381 	 andn	 %l1,%l2,%l4
    382 	add	%l6,%l0,%l0
    383 	 srlx	%o5,32,%g3		! extract X[11]
    384 	and	%l0,%l2,%l6		! round 17
    385 	add	%l5,%l3,%l3
    386 	or	%l6,%l4,%l4
    387 	 sethi	%hi(643717713),%l5
    388 	add	%l4,%l3,%l3
    389 	 or	%l5,%lo(643717713),%l5
    390 	sll	%l3,9,%l6
    391 	 add	%g3,%l5,%l5		! X[11]+K[18]
    392 	srl	%l3,32-9,%l3
    393 	add	%l0,%l6,%l6
    394 	 andn	 %l0,%l1,%l4
    395 	add	%l6,%l3,%l3
    396 	and	%l3,%l1,%l6		! round 18
    397 	add	%l5,%l2,%l2
    398 	or	%l6,%l4,%l4
    399 	 sethi	%hi(3921069994),%l5
    400 	add	%l4,%l2,%l2
    401 	 or	%l5,%lo(3921069994),%l5
    402 	sll	%l2,14,%l6
    403 	 add	%o0,%l5,%l5		! X[0]+K[19]
    404 	srl	%l2,32-14,%l2
    405 	add	%l3,%l6,%l6
    406 	 andn	 %l3,%l0,%l4
    407 	add	%l6,%l2,%l2
    408 	 srlx	%o2,32,%g3		! extract X[5]
    409 	and	%l2,%l0,%l6		! round 19
    410 	add	%l5,%l1,%l1
    411 	or	%l6,%l4,%l4
    412 	 sethi	%hi(3593408605),%l5
    413 	add	%l4,%l1,%l1
    414 	 or	%l5,%lo(3593408605),%l5
    415 	sll	%l1,20,%l6
    416 	 add	%g3,%l5,%l5		! X[5]+K[20]
    417 	srl	%l1,32-20,%l1
    418 	add	%l2,%l6,%l6
    419 	 andn	 %l2,%l3,%l4
    420 	add	%l6,%l1,%l1
    421 	and	%l1,%l3,%l6		! round 20
    422 	add	%l5,%l0,%l0
    423 	or	%l6,%l4,%l4
    424 	 sethi	%hi(38016083),%l5
    425 	add	%l4,%l0,%l0
    426 	 or	%l5,%lo(38016083),%l5
    427 	sll	%l0,5,%l6
    428 	 add	%o5,%l5,%l5		! X[10]+K[21]
    429 	srl	%l0,32-5,%l0
    430 	add	%l1,%l6,%l6
    431 	 andn	 %l1,%l2,%l4
    432 	add	%l6,%l0,%l0
    433 	 srlx	%g1,32,%g3		! extract X[15]
    434 	and	%l0,%l2,%l6		! round 21
    435 	add	%l5,%l3,%l3
    436 	or	%l6,%l4,%l4
    437 	 sethi	%hi(3634488961),%l5
    438 	add	%l4,%l3,%l3
    439 	 or	%l5,%lo(3634488961),%l5
    440 	sll	%l3,9,%l6
    441 	 add	%g3,%l5,%l5		! X[15]+K[22]
    442 	srl	%l3,32-9,%l3
    443 	add	%l0,%l6,%l6
    444 	 andn	 %l0,%l1,%l4
    445 	add	%l6,%l3,%l3
    446 	and	%l3,%l1,%l6		! round 22
    447 	add	%l5,%l2,%l2
    448 	or	%l6,%l4,%l4
    449 	 sethi	%hi(3889429448),%l5
    450 	add	%l4,%l2,%l2
    451 	 or	%l5,%lo(3889429448),%l5
    452 	sll	%l2,14,%l6
    453 	 add	%o2,%l5,%l5		! X[4]+K[23]
    454 	srl	%l2,32-14,%l2
    455 	add	%l3,%l6,%l6
    456 	 andn	 %l3,%l0,%l4
    457 	add	%l6,%l2,%l2
    458 	 srlx	%o4,32,%g3		! extract X[9]
    459 	and	%l2,%l0,%l6		! round 23
    460 	add	%l5,%l1,%l1
    461 	or	%l6,%l4,%l4
    462 	 sethi	%hi(568446438),%l5
    463 	add	%l4,%l1,%l1
    464 	 or	%l5,%lo(568446438),%l5
    465 	sll	%l1,20,%l6
    466 	 add	%g3,%l5,%l5		! X[9]+K[24]
    467 	srl	%l1,32-20,%l1
    468 	add	%l2,%l6,%l6
    469 	 andn	 %l2,%l3,%l4
    470 	add	%l6,%l1,%l1
    471 	and	%l1,%l3,%l6		! round 24
    472 	add	%l5,%l0,%l0
    473 	or	%l6,%l4,%l4
    474 	 sethi	%hi(3275163606),%l5
    475 	add	%l4,%l0,%l0
    476 	 or	%l5,%lo(3275163606),%l5
    477 	sll	%l0,5,%l6
    478 	 add	%g1,%l5,%l5		! X[14]+K[25]
    479 	srl	%l0,32-5,%l0
    480 	add	%l1,%l6,%l6
    481 	 andn	 %l1,%l2,%l4
    482 	add	%l6,%l0,%l0
    483 	 srlx	%o1,32,%g3		! extract X[3]
    484 	and	%l0,%l2,%l6		! round 25
    485 	add	%l5,%l3,%l3
    486 	or	%l6,%l4,%l4
    487 	 sethi	%hi(4107603335),%l5
    488 	add	%l4,%l3,%l3
    489 	 or	%l5,%lo(4107603335),%l5
    490 	sll	%l3,9,%l6
    491 	 add	%g3,%l5,%l5		! X[3]+K[26]
    492 	srl	%l3,32-9,%l3
    493 	add	%l0,%l6,%l6
    494 	 andn	 %l0,%l1,%l4
    495 	add	%l6,%l3,%l3
    496 	and	%l3,%l1,%l6		! round 26
    497 	add	%l5,%l2,%l2
    498 	or	%l6,%l4,%l4
    499 	 sethi	%hi(1163531501),%l5
    500 	add	%l4,%l2,%l2
    501 	 or	%l5,%lo(1163531501),%l5
    502 	sll	%l2,14,%l6
    503 	 add	%o4,%l5,%l5		! X[8]+K[27]
    504 	srl	%l2,32-14,%l2
    505 	add	%l3,%l6,%l6
    506 	 andn	 %l3,%l0,%l4
    507 	add	%l6,%l2,%l2
    508 	 srlx	%o7,32,%g3		! extract X[13]
    509 	and	%l2,%l0,%l6		! round 27
    510 	add	%l5,%l1,%l1
    511 	or	%l6,%l4,%l4
    512 	 sethi	%hi(2850285829),%l5
    513 	add	%l4,%l1,%l1
    514 	 or	%l5,%lo(2850285829),%l5
    515 	sll	%l1,20,%l6
    516 	 add	%g3,%l5,%l5		! X[13]+K[28]
    517 	srl	%l1,32-20,%l1
    518 	add	%l2,%l6,%l6
    519 	 andn	 %l2,%l3,%l4
    520 	add	%l6,%l1,%l1
    521 	and	%l1,%l3,%l6		! round 28
    522 	add	%l5,%l0,%l0
    523 	or	%l6,%l4,%l4
    524 	 sethi	%hi(4243563512),%l5
    525 	add	%l4,%l0,%l0
    526 	 or	%l5,%lo(4243563512),%l5
    527 	sll	%l0,5,%l6
    528 	 add	%o1,%l5,%l5		! X[2]+K[29]
    529 	srl	%l0,32-5,%l0
    530 	add	%l1,%l6,%l6
    531 	 andn	 %l1,%l2,%l4
    532 	add	%l6,%l0,%l0
    533 	 srlx	%o3,32,%g3		! extract X[7]
    534 	and	%l0,%l2,%l6		! round 29
    535 	add	%l5,%l3,%l3
    536 	or	%l6,%l4,%l4
    537 	 sethi	%hi(1735328473),%l5
    538 	add	%l4,%l3,%l3
    539 	 or	%l5,%lo(1735328473),%l5
    540 	sll	%l3,9,%l6
    541 	 add	%g3,%l5,%l5		! X[7]+K[30]
    542 	srl	%l3,32-9,%l3
    543 	add	%l0,%l6,%l6
    544 	 andn	 %l0,%l1,%l4
    545 	add	%l6,%l3,%l3
    546 	and	%l3,%l1,%l6		! round 30
    547 	add	%l5,%l2,%l2
    548 	or	%l6,%l4,%l4
    549 	 sethi	%hi(2368359562),%l5
    550 	add	%l4,%l2,%l2
    551 	 or	%l5,%lo(2368359562),%l5
    552 	sll	%l2,14,%l6
    553 	 add	%o7,%l5,%l5		! X[12]+K[31]
    554 	srl	%l2,32-14,%l2
    555 	add	%l3,%l6,%l6
    556 	 andn	 %l3,%l0,%l4
    557 	add	%l6,%l2,%l2
    558 	 srlx	%o2,32,%g3		! extract X[5]
    559 	and	%l2,%l0,%l6		! round 31
    560 	add	%l5,%l1,%l1
    561 	or	%l6,%l4,%l4
    562 	 sethi	%hi(4294588738),%l5
    563 	add	%l4,%l1,%l1
    564 	 or	%l5,%lo(4294588738),%l5
    565 	sll	%l1,20,%l6
    566 	 add	%g3,%l5,%l5		! X[5]+K[32]
    567 	srl	%l1,32-20,%l1
    568 	add	%l2,%l6,%l6
    569 	 xor	 %l2,%l3,%l4
    570 	add	%l6,%l1,%l1
    571 	add	%l5,%l0,%l0		! round 32
    572 	xor	%l1,%l4,%l4
    573 	 sethi	%hi(2272392833),%l5
    574 	add	%l4,%l0,%l0
    575 	 or	%l5,%lo(2272392833),%l5
    576 	sll	%l0,4,%l6
    577 	 add	%o4,%l5,%l5		! X[8]+K[33]
    578 	srl	%l0,32-4,%l0
    579 	add	%l1,%l6,%l6
    580 	 xor	 %l1,%l2,%l4
    581 	add	%l6,%l0,%l0
    582 	 srlx	%o5,32,%g3		! extract X[11]
    583 	add	%l5,%l3,%l3		! round 33
    584 	xor	%l0,%l4,%l4
    585 	 sethi	%hi(1839030562),%l5
    586 	add	%l4,%l3,%l3
    587 	 or	%l5,%lo(1839030562),%l5
    588 	sll	%l3,11,%l6
    589 	 add	%g3,%l5,%l5		! X[11]+K[34]
    590 	srl	%l3,32-11,%l3
    591 	add	%l0,%l6,%l6
    592 	 xor	 %l0,%l1,%l4
    593 	add	%l6,%l3,%l3
    594 	add	%l5,%l2,%l2		! round 34
    595 	xor	%l3,%l4,%l4
    596 	 sethi	%hi(4259657740),%l5
    597 	add	%l4,%l2,%l2
    598 	 or	%l5,%lo(4259657740),%l5
    599 	sll	%l2,16,%l6
    600 	 add	%g1,%l5,%l5		! X[14]+K[35]
    601 	srl	%l2,32-16,%l2
    602 	add	%l3,%l6,%l6
    603 	 xor	 %l3,%l0,%l4
    604 	add	%l6,%l2,%l2
    605 	 srlx	%o0,32,%g3		! extract X[1]
    606 	add	%l5,%l1,%l1		! round 35
    607 	xor	%l2,%l4,%l4
    608 	 sethi	%hi(2763975236),%l5
    609 	add	%l4,%l1,%l1
    610 	 or	%l5,%lo(2763975236),%l5
    611 	sll	%l1,23,%l6
    612 	 add	%g3,%l5,%l5		! X[1]+K[36]
    613 	srl	%l1,32-23,%l1
    614 	add	%l2,%l6,%l6
    615 	 xor	 %l2,%l3,%l4
    616 	add	%l6,%l1,%l1
    617 	add	%l5,%l0,%l0		! round 36
    618 	xor	%l1,%l4,%l4
    619 	 sethi	%hi(1272893353),%l5
    620 	add	%l4,%l0,%l0
    621 	 or	%l5,%lo(1272893353),%l5
    622 	sll	%l0,4,%l6
    623 	 add	%o2,%l5,%l5		! X[4]+K[37]
    624 	srl	%l0,32-4,%l0
    625 	add	%l1,%l6,%l6
    626 	 xor	 %l1,%l2,%l4
    627 	add	%l6,%l0,%l0
    628 	 srlx	%o3,32,%g3		! extract X[7]
    629 	add	%l5,%l3,%l3		! round 37
    630 	xor	%l0,%l4,%l4
    631 	 sethi	%hi(4139469664),%l5
    632 	add	%l4,%l3,%l3
    633 	 or	%l5,%lo(4139469664),%l5
    634 	sll	%l3,11,%l6
    635 	 add	%g3,%l5,%l5		! X[7]+K[38]
    636 	srl	%l3,32-11,%l3
    637 	add	%l0,%l6,%l6
    638 	 xor	 %l0,%l1,%l4
    639 	add	%l6,%l3,%l3
    640 	add	%l5,%l2,%l2		! round 38
    641 	xor	%l3,%l4,%l4
    642 	 sethi	%hi(3200236656),%l5
    643 	add	%l4,%l2,%l2
    644 	 or	%l5,%lo(3200236656),%l5
    645 	sll	%l2,16,%l6
    646 	 add	%o5,%l5,%l5		! X[10]+K[39]
    647 	srl	%l2,32-16,%l2
    648 	add	%l3,%l6,%l6
    649 	 xor	 %l3,%l0,%l4
    650 	add	%l6,%l2,%l2
    651 	 srlx	%o7,32,%g3		! extract X[13]
    652 	add	%l5,%l1,%l1		! round 39
    653 	xor	%l2,%l4,%l4
    654 	 sethi	%hi(681279174),%l5
    655 	add	%l4,%l1,%l1
    656 	 or	%l5,%lo(681279174),%l5
    657 	sll	%l1,23,%l6
    658 	 add	%g3,%l5,%l5		! X[13]+K[40]
    659 	srl	%l1,32-23,%l1
    660 	add	%l2,%l6,%l6
    661 	 xor	 %l2,%l3,%l4
    662 	add	%l6,%l1,%l1
    663 	add	%l5,%l0,%l0		! round 40
    664 	xor	%l1,%l4,%l4
    665 	 sethi	%hi(3936430074),%l5
    666 	add	%l4,%l0,%l0
    667 	 or	%l5,%lo(3936430074),%l5
    668 	sll	%l0,4,%l6
    669 	 add	%o0,%l5,%l5		! X[0]+K[41]
    670 	srl	%l0,32-4,%l0
    671 	add	%l1,%l6,%l6
    672 	 xor	 %l1,%l2,%l4
    673 	add	%l6,%l0,%l0
    674 	 srlx	%o1,32,%g3		! extract X[3]
    675 	add	%l5,%l3,%l3		! round 41
    676 	xor	%l0,%l4,%l4
    677 	 sethi	%hi(3572445317),%l5
    678 	add	%l4,%l3,%l3
    679 	 or	%l5,%lo(3572445317),%l5
    680 	sll	%l3,11,%l6
    681 	 add	%g3,%l5,%l5		! X[3]+K[42]
    682 	srl	%l3,32-11,%l3
    683 	add	%l0,%l6,%l6
    684 	 xor	 %l0,%l1,%l4
    685 	add	%l6,%l3,%l3
    686 	add	%l5,%l2,%l2		! round 42
    687 	xor	%l3,%l4,%l4
    688 	 sethi	%hi(76029189),%l5
    689 	add	%l4,%l2,%l2
    690 	 or	%l5,%lo(76029189),%l5
    691 	sll	%l2,16,%l6
    692 	 add	%o3,%l5,%l5		! X[6]+K[43]
    693 	srl	%l2,32-16,%l2
    694 	add	%l3,%l6,%l6
    695 	 xor	 %l3,%l0,%l4
    696 	add	%l6,%l2,%l2
    697 	 srlx	%o4,32,%g3		! extract X[9]
    698 	add	%l5,%l1,%l1		! round 43
    699 	xor	%l2,%l4,%l4
    700 	 sethi	%hi(3654602809),%l5
    701 	add	%l4,%l1,%l1
    702 	 or	%l5,%lo(3654602809),%l5
    703 	sll	%l1,23,%l6
    704 	 add	%g3,%l5,%l5		! X[9]+K[44]
    705 	srl	%l1,32-23,%l1
    706 	add	%l2,%l6,%l6
    707 	 xor	 %l2,%l3,%l4
    708 	add	%l6,%l1,%l1
    709 	add	%l5,%l0,%l0		! round 44
    710 	xor	%l1,%l4,%l4
    711 	 sethi	%hi(3873151461),%l5
    712 	add	%l4,%l0,%l0
    713 	 or	%l5,%lo(3873151461),%l5
    714 	sll	%l0,4,%l6
    715 	 add	%o7,%l5,%l5		! X[12]+K[45]
    716 	srl	%l0,32-4,%l0
    717 	add	%l1,%l6,%l6
    718 	 xor	 %l1,%l2,%l4
    719 	add	%l6,%l0,%l0
    720 	 srlx	%g1,32,%g3		! extract X[15]
    721 	add	%l5,%l3,%l3		! round 45
    722 	xor	%l0,%l4,%l4
    723 	 sethi	%hi(530742520),%l5
    724 	add	%l4,%l3,%l3
    725 	 or	%l5,%lo(530742520),%l5
    726 	sll	%l3,11,%l6
    727 	 add	%g3,%l5,%l5		! X[15]+K[46]
    728 	srl	%l3,32-11,%l3
    729 	add	%l0,%l6,%l6
    730 	 xor	 %l0,%l1,%l4
    731 	add	%l6,%l3,%l3
    732 	add	%l5,%l2,%l2		! round 46
    733 	xor	%l3,%l4,%l4
    734 	 sethi	%hi(3299628645),%l5
    735 	add	%l4,%l2,%l2
    736 	 or	%l5,%lo(3299628645),%l5
    737 	sll	%l2,16,%l6
    738 	 add	%o1,%l5,%l5		! X[2]+K[47]
    739 	srl	%l2,32-16,%l2
    740 	add	%l3,%l6,%l6
    741 	 xor	 %l3,%l0,%l4
    742 	add	%l6,%l2,%l2
    743 	add	%l5,%l1,%l1		! round 47
    744 	xor	%l2,%l4,%l4
    745 	 sethi	%hi(4096336452),%l5
    746 	add	%l4,%l1,%l1
    747 	 or	%l5,%lo(4096336452),%l5
    748 	sll	%l1,23,%l6
    749 	 add	%o0,%l5,%l5		! X[0]+K[48]
    750 	srl	%l1,32-23,%l1
    751 	add	%l2,%l6,%l6
    752 	 xor	 %l2,%l3,%l4
    753 	add	%l6,%l1,%l1
    754 	add	%l5,%l0,%l0		! round 48
    755 	 srlx	%o3,32,%g3		! extract X[7]
    756 	orn	%l1,%l3,%l4
    757 	 sethi	%hi(1126891415),%l5
    758 	xor	%l2,%l4,%l4
    759 	 or	%l5,%lo(1126891415),%l5
    760 	add	%l4,%l0,%l0
    761 	sll	%l0,6,%l6
    762 	 add	%g3,%l5,%l5		! X[7]+K[49]
    763 	srl	%l0,32-6,%l0
    764 	add	%l1,%l6,%l6
    765 	add	%l6,%l0,%l0
    766 	add	%l5,%l3,%l3		! round 49
    767 	orn	%l0,%l2,%l4
    768 	 sethi	%hi(2878612391),%l5
    769 	xor	%l1,%l4,%l4
    770 	 or	%l5,%lo(2878612391),%l5
    771 	add	%l4,%l3,%l3
    772 	sll	%l3,10,%l6
    773 	 add	%g1,%l5,%l5		! X[14]+K[50]
    774 	srl	%l3,32-10,%l3
    775 	add	%l0,%l6,%l6
    776 	add	%l6,%l3,%l3
    777 	add	%l5,%l2,%l2		! round 50
    778 	 srlx	%o2,32,%g3		! extract X[5]
    779 	orn	%l3,%l1,%l4
    780 	 sethi	%hi(4237533241),%l5
    781 	xor	%l0,%l4,%l4
    782 	 or	%l5,%lo(4237533241),%l5
    783 	add	%l4,%l2,%l2
    784 	sll	%l2,15,%l6
    785 	 add	%g3,%l5,%l5		! X[5]+K[51]
    786 	srl	%l2,32-15,%l2
    787 	add	%l3,%l6,%l6
    788 	add	%l6,%l2,%l2
    789 	add	%l5,%l1,%l1		! round 51
    790 	orn	%l2,%l0,%l4
    791 	 sethi	%hi(1700485571),%l5
    792 	xor	%l3,%l4,%l4
    793 	 or	%l5,%lo(1700485571),%l5
    794 	add	%l4,%l1,%l1
    795 	sll	%l1,21,%l6
    796 	 add	%o7,%l5,%l5		! X[12]+K[52]
    797 	srl	%l1,32-21,%l1
    798 	add	%l2,%l6,%l6
    799 	add	%l6,%l1,%l1
    800 	add	%l5,%l0,%l0		! round 52
    801 	 srlx	%o1,32,%g3		! extract X[3]
    802 	orn	%l1,%l3,%l4
    803 	 sethi	%hi(2399980690),%l5
    804 	xor	%l2,%l4,%l4
    805 	 or	%l5,%lo(2399980690),%l5
    806 	add	%l4,%l0,%l0
    807 	sll	%l0,6,%l6
    808 	 add	%g3,%l5,%l5		! X[3]+K[53]
    809 	srl	%l0,32-6,%l0
    810 	add	%l1,%l6,%l6
    811 	add	%l6,%l0,%l0
    812 	add	%l5,%l3,%l3		! round 53
    813 	orn	%l0,%l2,%l4
    814 	 sethi	%hi(4293915773),%l5
    815 	xor	%l1,%l4,%l4
    816 	 or	%l5,%lo(4293915773),%l5
    817 	add	%l4,%l3,%l3
    818 	sll	%l3,10,%l6
    819 	 add	%o5,%l5,%l5		! X[10]+K[54]
    820 	srl	%l3,32-10,%l3
    821 	add	%l0,%l6,%l6
    822 	add	%l6,%l3,%l3
    823 	add	%l5,%l2,%l2		! round 54
    824 	 srlx	%o0,32,%g3		! extract X[1]
    825 	orn	%l3,%l1,%l4
    826 	 sethi	%hi(2240044497),%l5
    827 	xor	%l0,%l4,%l4
    828 	 or	%l5,%lo(2240044497),%l5
    829 	add	%l4,%l2,%l2
    830 	sll	%l2,15,%l6
    831 	 add	%g3,%l5,%l5		! X[1]+K[55]
    832 	srl	%l2,32-15,%l2
    833 	add	%l3,%l6,%l6
    834 	add	%l6,%l2,%l2
    835 	add	%l5,%l1,%l1		! round 55
    836 	orn	%l2,%l0,%l4
    837 	 sethi	%hi(1873313359),%l5
    838 	xor	%l3,%l4,%l4
    839 	 or	%l5,%lo(1873313359),%l5
    840 	add	%l4,%l1,%l1
    841 	sll	%l1,21,%l6
    842 	 add	%o4,%l5,%l5		! X[8]+K[56]
    843 	srl	%l1,32-21,%l1
    844 	add	%l2,%l6,%l6
    845 	add	%l6,%l1,%l1
    846 	add	%l5,%l0,%l0		! round 56
    847 	 srlx	%g1,32,%g3		! extract X[15]
    848 	orn	%l1,%l3,%l4
    849 	 sethi	%hi(4264355552),%l5
    850 	xor	%l2,%l4,%l4
    851 	 or	%l5,%lo(4264355552),%l5
    852 	add	%l4,%l0,%l0
    853 	sll	%l0,6,%l6
    854 	 add	%g3,%l5,%l5		! X[15]+K[57]
    855 	srl	%l0,32-6,%l0
    856 	add	%l1,%l6,%l6
    857 	add	%l6,%l0,%l0
    858 	add	%l5,%l3,%l3		! round 57
    859 	orn	%l0,%l2,%l4
    860 	 sethi	%hi(2734768916),%l5
    861 	xor	%l1,%l4,%l4
    862 	 or	%l5,%lo(2734768916),%l5
    863 	add	%l4,%l3,%l3
    864 	sll	%l3,10,%l6
    865 	 add	%o3,%l5,%l5		! X[6]+K[58]
    866 	srl	%l3,32-10,%l3
    867 	add	%l0,%l6,%l6
    868 	add	%l6,%l3,%l3
    869 	add	%l5,%l2,%l2		! round 58
    870 	 srlx	%o7,32,%g3		! extract X[13]
    871 	orn	%l3,%l1,%l4
    872 	 sethi	%hi(1309151649),%l5
    873 	xor	%l0,%l4,%l4
    874 	 or	%l5,%lo(1309151649),%l5
    875 	add	%l4,%l2,%l2
    876 	sll	%l2,15,%l6
    877 	 add	%g3,%l5,%l5		! X[13]+K[59]
    878 	srl	%l2,32-15,%l2
    879 	add	%l3,%l6,%l6
    880 	add	%l6,%l2,%l2
    881 	add	%l5,%l1,%l1		! round 59
    882 	orn	%l2,%l0,%l4
    883 	 sethi	%hi(4149444226),%l5
    884 	xor	%l3,%l4,%l4
    885 	 or	%l5,%lo(4149444226),%l5
    886 	add	%l4,%l1,%l1
    887 	sll	%l1,21,%l6
    888 	 add	%o2,%l5,%l5		! X[4]+K[60]
    889 	srl	%l1,32-21,%l1
    890 	add	%l2,%l6,%l6
    891 	add	%l6,%l1,%l1
    892 	add	%l5,%l0,%l0		! round 60
    893 	 srlx	%o5,32,%g3		! extract X[11]
    894 	orn	%l1,%l3,%l4
    895 	 sethi	%hi(3174756917),%l5
    896 	xor	%l2,%l4,%l4
    897 	 or	%l5,%lo(3174756917),%l5
    898 	add	%l4,%l0,%l0
    899 	sll	%l0,6,%l6
    900 	 add	%g3,%l5,%l5		! X[11]+K[61]
    901 	srl	%l0,32-6,%l0
    902 	add	%l1,%l6,%l6
    903 	add	%l6,%l0,%l0
    904 	add	%l5,%l3,%l3		! round 61
    905 	orn	%l0,%l2,%l4
    906 	 sethi	%hi(718787259),%l5
    907 	xor	%l1,%l4,%l4
    908 	 or	%l5,%lo(718787259),%l5
    909 	add	%l4,%l3,%l3
    910 	sll	%l3,10,%l6
    911 	 add	%o1,%l5,%l5		! X[2]+K[62]
    912 	srl	%l3,32-10,%l3
    913 	add	%l0,%l6,%l6
    914 	add	%l6,%l3,%l3
    915 	add	%l5,%l2,%l2		! round 62
    916 	 srlx	%o4,32,%g3		! extract X[9]
    917 	orn	%l3,%l1,%l4
    918 	 sethi	%hi(3951481745),%l5
    919 	xor	%l0,%l4,%l4
    920 	 or	%l5,%lo(3951481745),%l5
    921 	add	%l4,%l2,%l2
    922 	sll	%l2,15,%l6
    923 	 add	%g3,%l5,%l5		! X[9]+K[63]
    924 	srl	%l2,32-15,%l2
    925 	add	%l3,%l6,%l6
    926 	add	%l6,%l2,%l2
    927 	add	%l5,%l1,%l1		! round 63
    928 	orn	%l2,%l0,%l4
    929 	 sethi	%hi(0),%l5
    930 	xor	%l3,%l4,%l4
    931 	 or	%l5,%lo(0),%l5
    932 	add	%l4,%l1,%l1
    933 	sll	%l1,21,%l6
    934 	 add	%o0,%l5,%l5		! X[0]+K[64]
    935 	srl	%l1,32-21,%l1
    936 	add	%l2,%l6,%l6
    937 	add	%l6,%l1,%l1
    938 	srlx	%g4,32,%l4		! unpack A,B,C,D and accumulate
    939 	add	%i1,64,%i1		! advance inp
    940 	srlx	%g5,32,%l5
    941 	add	%l4,%l0,%l0
    942 	subcc	%i2,1,%i2		! done yet?
    943 	add	%g4,%l1,%l1
    944 	add	%l5,%l2,%l2
    945 	add	%g5,%l3,%l3
    946 	srl	%l1,0,%l1			! clruw	%l1
    947 	bne	SIZE_T_CC,.Loop
    948 	srl	%l3,0,%l3			! clruw	%l3
    949 
    950 	st	%l0,[%i0+0]		! write out ctx
    951 	st	%l1,[%i0+4]
    952 	st	%l2,[%i0+8]
    953 	st	%l3,[%i0+12]
    954 
    955 	wr	%g0,%l7,%asi
    956 	ret
    957 	restore
    958 .type	md5_block_asm_data_order,#function
    959 .size	md5_block_asm_data_order,(.-md5_block_asm_data_order)
    960 
    961 .asciz	"MD5 block transform for SPARCv9, CRYPTOGAMS by <appro (at) openssl.org>"
    962 .align	4
    963