#ifndef __ASSEMBLER__
# define __ASSEMBLER__ 1
#endif
#include "crypto/sparc_arch.h"

#ifdef __arch64__
.register	%g2,#scratch
.register	%g3,#scratch
#endif

.section	".text",#alloc,#execinstr

#ifdef __PIC__
SPARC_PIC_THUNK(%g1)
#endif

.globl	ossl_md5_block_asm_data_order
.align	32
ossl_md5_block_asm_data_order:
	SPARC_LOAD_ADDRESS_LEAF(OPENSSL_sparcv9cap_P,%g1,%g5)
	ld	[%g1+4],%g1		! OPENSSL_sparcv9cap_P[1]

	andcc	%g1, CFR_MD5, %g0
	be	.Lsoftware
	nop

	mov	4, %g1
	andcc	%o1, 0x7, %g0
	lda	[%o0 + %g0]0x88, %f0		! load context
	lda	[%o0 + %g1]0x88, %f1
	add	%o0, 8, %o0
	lda	[%o0 + %g0]0x88, %f2
	lda	[%o0 + %g1]0x88, %f3
	bne,pn	%icc, .Lhwunaligned
	sub	%o0, 8, %o0

.Lhw_loop:
	ldd	[%o1 + 0x00], %f8
	ldd	[%o1 + 0x08], %f10
	ldd	[%o1 + 0x10], %f12
	ldd	[%o1 + 0x18], %f14
	ldd	[%o1 + 0x20], %f16
	ldd	[%o1 + 0x28], %f18
	ldd	[%o1 + 0x30], %f20
	subcc	%o2, 1, %o2		! done yet?
	ldd	[%o1 + 0x38], %f22
	add	%o1, 0x40, %o1
	prefetch [%o1 + 63], 20

	.word	0x81b02800		! MD5

	bne,pt	SIZE_T_CC, .Lhw_loop
	nop

.Lhwfinish:
	sta	%f0, [%o0 + %g0]0x88	! store context
	sta	%f1, [%o0 + %g1]0x88
	add	%o0, 8, %o0
	sta	%f2, [%o0 + %g0]0x88
	sta	%f3, [%o0 + %g1]0x88
	retl
	nop

.align	8
.Lhwunaligned:
	.word	0x93b24300 !alignaddr	%o1,%g0,%o1

	ldd	[%o1 + 0x00], %f10
.Lhwunaligned_loop:
	ldd	[%o1 + 0x08], %f12
	ldd	[%o1 + 0x10], %f14
	ldd	[%o1 + 0x18], %f16
	ldd	[%o1 + 0x20], %f18
	ldd	[%o1 + 0x28], %f20
	ldd	[%o1 + 0x30], %f22
	ldd	[%o1 + 0x38], %f24
	subcc	%o2, 1, %o2		! done yet?
	ldd	[%o1 + 0x40], %f26
	add	%o1, 0x40, %o1
	prefetch [%o1 + 63], 20

	.word	0x91b2890c !faligndata	%f10,%f12,%f8
	.word	0x95b3090e !faligndata	%f12,%f14,%f10
	.word	0x99b38910 !faligndata	%f14,%f16,%f12
	.word	0x9db40912 !faligndata	%f16,%f18,%f14
	.word	0xa1b48914 !faligndata	%f18,%f20,%f16
	.word	0xa5b50916 !faligndata	%f20,%f22,%f18
	.word	0xa9b58918 !faligndata	%f22,%f24,%f20
	.word	0xadb6091a !faligndata	%f24,%f26,%f22

	.word	0x81b02800		! MD5

	bne,pt	SIZE_T_CC, .Lhwunaligned_loop
	.word	0x95b68f9a !for	%f26,%f26,%f10	! %f10=%f26

	ba	.Lhwfinish
	nop

.align	16
.Lsoftware:
	save	%sp,-STACK_FRAME,%sp

	rd	%asi,%l7
	wr	%g0,0x88,%asi		! ASI_PRIMARY_LITTLE
	and	%i1,7,%i3
	andn	%i1,7,%i1

	sll	%i3,3,%i3		! *=8
	mov	56,%i5
	ld	[%i0+0],%l0
	sub	%i5,%i3,%i5
	ld	[%i0+4],%l1
	and	%i5,32,%i4
	add	%i5,8,%i5
	ld	[%i0+8],%l2
	sub	%i5,%i4,%i5	! shr+shl1+shl2==64
	ld	[%i0+12],%l3
	nop

.Loop:
	 cmp	%i3,0			! was inp aligned?
	ldxa	[%i1+0]%asi,%o0	! load little-endian input
	ldxa	[%i1+8]%asi,%o1
	ldxa	[%i1+16]%asi,%o2
	ldxa	[%i1+24]%asi,%o3
	ldxa	[%i1+32]%asi,%o4
	 sllx	%l0,32,%g4		! pack A,B
	ldxa	[%i1+40]%asi,%o5
	 sllx	%l2,32,%g5		! pack C,D
	ldxa	[%i1+48]%asi,%o7
	 or	%l1,%g4,%g4
	ldxa	[%i1+56]%asi,%g1
	 or	%l3,%g5,%g5
	bnz,a,pn	%icc,.+8
	ldxa	[%i1+64]%asi,%g2

	srlx	%o0,%i3,%o0	! align X[0]
	sllx	%o1,%i4,%g3
	 sethi	%hi(3614090360),%l5
	sllx	%g3,%i5,%g3
	 or	%l5,%lo(3614090360),%l5
	or	%g3,%o0,%o0
	 xor	%l2,%l3,%l4
	 add	%o0,%l5,%l5		! X[0]+K[0]
	 srlx	%o0,32,%g3		! extract X[1]
	and	%l1,%l4,%l4		! round 0
	add	%l5,%l0,%l0
	xor	%l3,%l4,%l4
	 sethi	%hi(3905402710),%l5
	add	%l4,%l0,%l0
	 or	%l5,%lo(3905402710),%l5
	sll	%l0,7,%l6
	 add	%g3,%l5,%l5		! X[1]+K[1]
	srl	%l0,32-7,%l0
	add	%l1,%l6,%l6
	 xor	 %l1,%l2,%l4
	add	%l6,%l0,%l0
	 srlx	%o1,%i3,%o1	! align X[2]
	and	%l0,%l4,%l4		! round 1
	 sllx	%o2,%i4,%g3
	add	%l5,%l3,%l3
	 sllx	%g3,%i5,%g3
	xor	%l2,%l4,%l4
	 or	%g3,%o1,%o1
	 sethi	%hi(606105819),%l5
	add	%l4,%l3,%l3
	 or	%l5,%lo(606105819),%l5
	sll	%l3,12,%l6
	 add	%o1,%l5,%l5		! X[2]+K[2]
	srl	%l3,32-12,%l3
	add	%l0,%l6,%l6
	 xor	 %l0,%l1,%l4
	add	%l6,%l3,%l3
	 srlx	%o1,32,%g3		! extract X[3]
	and	%l3,%l4,%l4		! round 2
	add	%l5,%l2,%l2
	xor	%l1,%l4,%l4
	 sethi	%hi(3250441966),%l5
	add	%l4,%l2,%l2
	 or	%l5,%lo(3250441966),%l5
	sll	%l2,17,%l6
	 add	%g3,%l5,%l5		! X[3]+K[3]
	srl	%l2,32-17,%l2
	add	%l3,%l6,%l6
	 xor	 %l3,%l0,%l4
	add	%l6,%l2,%l2
	 srlx	%o2,%i3,%o2	! align X[4]
	and	%l2,%l4,%l4		! round 3
	 sllx	%o3,%i4,%g3
	add	%l5,%l1,%l1
	 sllx	%g3,%i5,%g3
	xor	%l0,%l4,%l4
	 or	%g3,%o2,%o2
	 sethi	%hi(4118548399),%l5
	add	%l4,%l1,%l1
	 or	%l5,%lo(4118548399),%l5
	sll	%l1,22,%l6
	 add	%o2,%l5,%l5		! X[4]+K[4]
	srl	%l1,32-22,%l1
	add	%l2,%l6,%l6
	 xor	 %l2,%l3,%l4
	add	%l6,%l1,%l1
	 srlx	%o2,32,%g3		! extract X[5]
	and	%l1,%l4,%l4		! round 4
	add	%l5,%l0,%l0
	xor	%l3,%l4,%l4
	 sethi	%hi(1200080426),%l5
	add	%l4,%l0,%l0
	 or	%l5,%lo(1200080426),%l5
	sll	%l0,7,%l6
	 add	%g3,%l5,%l5		! X[5]+K[5]
	srl	%l0,32-7,%l0
	add	%l1,%l6,%l6
	 xor	 %l1,%l2,%l4
	add	%l6,%l0,%l0
	 srlx	%o3,%i3,%o3	! align X[6]
	and	%l0,%l4,%l4		! round 5
	 sllx	%o4,%i4,%g3
	add	%l5,%l3,%l3
	 sllx	%g3,%i5,%g3
	xor	%l2,%l4,%l4
	 or	%g3,%o3,%o3
	 sethi	%hi(2821735955),%l5
	add	%l4,%l3,%l3
	 or	%l5,%lo(2821735955),%l5
	sll	%l3,12,%l6
	 add	%o3,%l5,%l5		! X[6]+K[6]
	srl	%l3,32-12,%l3
	add	%l0,%l6,%l6
	 xor	 %l0,%l1,%l4
	add	%l6,%l3,%l3
	 srlx	%o3,32,%g3		! extract X[7]
	and	%l3,%l4,%l4		! round 6
	add	%l5,%l2,%l2
	xor	%l1,%l4,%l4
	 sethi	%hi(4249261313),%l5
	add	%l4,%l2,%l2
	 or	%l5,%lo(4249261313),%l5
	sll	%l2,17,%l6
	 add	%g3,%l5,%l5		! X[7]+K[7]
	srl	%l2,32-17,%l2
	add	%l3,%l6,%l6
	 xor	 %l3,%l0,%l4
	add	%l6,%l2,%l2
	 srlx	%o4,%i3,%o4	! align X[8]
	and	%l2,%l4,%l4		! round 7
	 sllx	%o5,%i4,%g3
	add	%l5,%l1,%l1
	 sllx	%g3,%i5,%g3
	xor	%l0,%l4,%l4
	 or	%g3,%o4,%o4
	 sethi	%hi(1770035416),%l5
	add	%l4,%l1,%l1
	 or	%l5,%lo(1770035416),%l5
	sll	%l1,22,%l6
	 add	%o4,%l5,%l5		! X[8]+K[8]
	srl	%l1,32-22,%l1
	add	%l2,%l6,%l6
	 xor	 %l2,%l3,%l4
	add	%l6,%l1,%l1
	 srlx	%o4,32,%g3		! extract X[9]
	and	%l1,%l4,%l4		! round 8
	add	%l5,%l0,%l0
	xor	%l3,%l4,%l4
	 sethi	%hi(2336552879),%l5
	add	%l4,%l0,%l0
	 or	%l5,%lo(2336552879),%l5
	sll	%l0,7,%l6
	 add	%g3,%l5,%l5		! X[9]+K[9]
	srl	%l0,32-7,%l0
	add	%l1,%l6,%l6
	 xor	 %l1,%l2,%l4
	add	%l6,%l0,%l0
	 srlx	%o5,%i3,%o5	! align X[10]
	and	%l0,%l4,%l4		! round 9
	 sllx	%o7,%i4,%g3
	add	%l5,%l3,%l3
	 sllx	%g3,%i5,%g3
	xor	%l2,%l4,%l4
	 or	%g3,%o5,%o5
	 sethi	%hi(4294925233),%l5
	add	%l4,%l3,%l3
	 or	%l5,%lo(4294925233),%l5
	sll	%l3,12,%l6
	 add	%o5,%l5,%l5		! X[10]+K[10]
	srl	%l3,32-12,%l3
	add	%l0,%l6,%l6
	 xor	 %l0,%l1,%l4
	add	%l6,%l3,%l3
	 srlx	%o5,32,%g3		! extract X[11]
	and	%l3,%l4,%l4		! round 10
	add	%l5,%l2,%l2
	xor	%l1,%l4,%l4
	 sethi	%hi(2304563134),%l5
	add	%l4,%l2,%l2
	 or	%l5,%lo(2304563134),%l5
	sll	%l2,17,%l6
	 add	%g3,%l5,%l5		! X[11]+K[11]
	srl	%l2,32-17,%l2
	add	%l3,%l6,%l6
	 xor	 %l3,%l0,%l4
	add	%l6,%l2,%l2
	 srlx	%o7,%i3,%o7	! align X[12]
	and	%l2,%l4,%l4		! round 11
	 sllx	%g1,%i4,%g3
	add	%l5,%l1,%l1
	 sllx	%g3,%i5,%g3
	xor	%l0,%l4,%l4
	 or	%g3,%o7,%o7
	 sethi	%hi(1804603682),%l5
	add	%l4,%l1,%l1
	 or	%l5,%lo(1804603682),%l5
	sll	%l1,22,%l6
	 add	%o7,%l5,%l5		! X[12]+K[12]
	srl	%l1,32-22,%l1
	add	%l2,%l6,%l6
	 xor	 %l2,%l3,%l4
	add	%l6,%l1,%l1
	 srlx	%o7,32,%g3		! extract X[13]
	and	%l1,%l4,%l4		! round 12
	add	%l5,%l0,%l0
	xor	%l3,%l4,%l4
	 sethi	%hi(4254626195),%l5
	add	%l4,%l0,%l0
	 or	%l5,%lo(4254626195),%l5
	sll	%l0,7,%l6
	 add	%g3,%l5,%l5		! X[13]+K[13]
	srl	%l0,32-7,%l0
	add	%l1,%l6,%l6
	 xor	 %l1,%l2,%l4
	add	%l6,%l0,%l0
	 srlx	%g1,%i3,%g1	! align X[14]
	and	%l0,%l4,%l4		! round 13
	 sllx	%g2,%i4,%g3
	add	%l5,%l3,%l3
	 sllx	%g3,%i5,%g3
	xor	%l2,%l4,%l4
	 or	%g3,%g1,%g1
	 sethi	%hi(2792965006),%l5
	add	%l4,%l3,%l3
	 or	%l5,%lo(2792965006),%l5
	sll	%l3,12,%l6
	 add	%g1,%l5,%l5		! X[14]+K[14]
	srl	%l3,32-12,%l3
	add	%l0,%l6,%l6
	 xor	 %l0,%l1,%l4
	add	%l6,%l3,%l3
	 srlx	%g1,32,%g3		! extract X[15]
	and	%l3,%l4,%l4		! round 14
	add	%l5,%l2,%l2
	xor	%l1,%l4,%l4
	 sethi	%hi(1236535329),%l5
	add	%l4,%l2,%l2
	 or	%l5,%lo(1236535329),%l5
	sll	%l2,17,%l6
	 add	%g3,%l5,%l5		! X[15]+K[15]
	srl	%l2,32-17,%l2
	add	%l3,%l6,%l6
	 xor	 %l3,%l0,%l4
	add	%l6,%l2,%l2
	 srlx	%o0,32,%g3		! extract X[1]
	and	%l2,%l4,%l4		! round 15
	add	%l5,%l1,%l1
	xor	%l0,%l4,%l4
	 sethi	%hi(4129170786),%l5
	add	%l4,%l1,%l1
	 or	%l5,%lo(4129170786),%l5
	sll	%l1,22,%l6
	 add	%g3,%l5,%l5		! X[1]+K[16]
	srl	%l1,32-22,%l1
	add	%l2,%l6,%l6
	 andn	 %l2,%l3,%l4
	add	%l6,%l1,%l1
	and	%l1,%l3,%l6		! round 16
	add	%l5,%l0,%l0
	or	%l6,%l4,%l4
	 sethi	%hi(3225465664),%l5
	add	%l4,%l0,%l0
	 or	%l5,%lo(3225465664),%l5
	sll	%l0,5,%l6
	 add	%o3,%l5,%l5		! X[6]+K[17]
	srl	%l0,32-5,%l0
	add	%l1,%l6,%l6
	 andn	 %l1,%l2,%l4
	add	%l6,%l0,%l0
	 srlx	%o5,32,%g3		! extract X[11]
	and	%l0,%l2,%l6		! round 17
	add	%l5,%l3,%l3
	or	%l6,%l4,%l4
	 sethi	%hi(643717713),%l5
	add	%l4,%l3,%l3
	 or	%l5,%lo(643717713),%l5
	sll	%l3,9,%l6
	 add	%g3,%l5,%l5		! X[11]+K[18]
	srl	%l3,32-9,%l3
	add	%l0,%l6,%l6
	 andn	 %l0,%l1,%l4
	add	%l6,%l3,%l3
	and	%l3,%l1,%l6		! round 18
	add	%l5,%l2,%l2
	or	%l6,%l4,%l4
	 sethi	%hi(3921069994),%l5
	add	%l4,%l2,%l2
	 or	%l5,%lo(3921069994),%l5
	sll	%l2,14,%l6
	 add	%o0,%l5,%l5		! X[0]+K[19]
	srl	%l2,32-14,%l2
	add	%l3,%l6,%l6
	 andn	 %l3,%l0,%l4
	add	%l6,%l2,%l2
	 srlx	%o2,32,%g3		! extract X[5]
	and	%l2,%l0,%l6		! round 19
	add	%l5,%l1,%l1
	or	%l6,%l4,%l4
	 sethi	%hi(3593408605),%l5
	add	%l4,%l1,%l1
	 or	%l5,%lo(3593408605),%l5
	sll	%l1,20,%l6
	 add	%g3,%l5,%l5		! X[5]+K[20]
	srl	%l1,32-20,%l1
	add	%l2,%l6,%l6
	 andn	 %l2,%l3,%l4
	add	%l6,%l1,%l1
	and	%l1,%l3,%l6		! round 20
	add	%l5,%l0,%l0
	or	%l6,%l4,%l4
	 sethi	%hi(38016083),%l5
	add	%l4,%l0,%l0
	 or	%l5,%lo(38016083),%l5
	sll	%l0,5,%l6
	 add	%o5,%l5,%l5		! X[10]+K[21]
	srl	%l0,32-5,%l0
	add	%l1,%l6,%l6
	 andn	 %l1,%l2,%l4
	add	%l6,%l0,%l0
	 srlx	%g1,32,%g3		! extract X[15]
	and	%l0,%l2,%l6		! round 21
	add	%l5,%l3,%l3
	or	%l6,%l4,%l4
	 sethi	%hi(3634488961),%l5
	add	%l4,%l3,%l3
	 or	%l5,%lo(3634488961),%l5
	sll	%l3,9,%l6
	 add	%g3,%l5,%l5		! X[15]+K[22]
	srl	%l3,32-9,%l3
	add	%l0,%l6,%l6
	 andn	 %l0,%l1,%l4
	add	%l6,%l3,%l3
	and	%l3,%l1,%l6		! round 22
	add	%l5,%l2,%l2
	or	%l6,%l4,%l4
	 sethi	%hi(3889429448),%l5
	add	%l4,%l2,%l2
	 or	%l5,%lo(3889429448),%l5
	sll	%l2,14,%l6
	 add	%o2,%l5,%l5		! X[4]+K[23]
	srl	%l2,32-14,%l2
	add	%l3,%l6,%l6
	 andn	 %l3,%l0,%l4
	add	%l6,%l2,%l2
	 srlx	%o4,32,%g3		! extract X[9]
	and	%l2,%l0,%l6		! round 23
	add	%l5,%l1,%l1
	or	%l6,%l4,%l4
	 sethi	%hi(568446438),%l5
	add	%l4,%l1,%l1
	 or	%l5,%lo(568446438),%l5
	sll	%l1,20,%l6
	 add	%g3,%l5,%l5		! X[9]+K[24]
	srl	%l1,32-20,%l1
	add	%l2,%l6,%l6
	 andn	 %l2,%l3,%l4
	add	%l6,%l1,%l1
	and	%l1,%l3,%l6		! round 24
	add	%l5,%l0,%l0
	or	%l6,%l4,%l4
	 sethi	%hi(3275163606),%l5
	add	%l4,%l0,%l0
	 or	%l5,%lo(3275163606),%l5
	sll	%l0,5,%l6
	 add	%g1,%l5,%l5		! X[14]+K[25]
	srl	%l0,32-5,%l0
	add	%l1,%l6,%l6
	 andn	 %l1,%l2,%l4
	add	%l6,%l0,%l0
	 srlx	%o1,32,%g3		! extract X[3]
	and	%l0,%l2,%l6		! round 25
	add	%l5,%l3,%l3
	or	%l6,%l4,%l4
	 sethi	%hi(4107603335),%l5
	add	%l4,%l3,%l3
	 or	%l5,%lo(4107603335),%l5
	sll	%l3,9,%l6
	 add	%g3,%l5,%l5		! X[3]+K[26]
	srl	%l3,32-9,%l3
	add	%l0,%l6,%l6
	 andn	 %l0,%l1,%l4
	add	%l6,%l3,%l3
	and	%l3,%l1,%l6		! round 26
	add	%l5,%l2,%l2
	or	%l6,%l4,%l4
	 sethi	%hi(1163531501),%l5
	add	%l4,%l2,%l2
	 or	%l5,%lo(1163531501),%l5
	sll	%l2,14,%l6
	 add	%o4,%l5,%l5		! X[8]+K[27]
	srl	%l2,32-14,%l2
	add	%l3,%l6,%l6
	 andn	 %l3,%l0,%l4
	add	%l6,%l2,%l2
	 srlx	%o7,32,%g3		! extract X[13]
	and	%l2,%l0,%l6		! round 27
	add	%l5,%l1,%l1
	or	%l6,%l4,%l4
	 sethi	%hi(2850285829),%l5
	add	%l4,%l1,%l1
	 or	%l5,%lo(2850285829),%l5
	sll	%l1,20,%l6
	 add	%g3,%l5,%l5		! X[13]+K[28]
	srl	%l1,32-20,%l1
	add	%l2,%l6,%l6
	 andn	 %l2,%l3,%l4
	add	%l6,%l1,%l1
	and	%l1,%l3,%l6		! round 28
	add	%l5,%l0,%l0
	or	%l6,%l4,%l4
	 sethi	%hi(4243563512),%l5
	add	%l4,%l0,%l0
	 or	%l5,%lo(4243563512),%l5
	sll	%l0,5,%l6
	 add	%o1,%l5,%l5		! X[2]+K[29]
	srl	%l0,32-5,%l0
	add	%l1,%l6,%l6
	 andn	 %l1,%l2,%l4
	add	%l6,%l0,%l0
	 srlx	%o3,32,%g3		! extract X[7]
	and	%l0,%l2,%l6		! round 29
	add	%l5,%l3,%l3
	or	%l6,%l4,%l4
	 sethi	%hi(1735328473),%l5
	add	%l4,%l3,%l3
	 or	%l5,%lo(1735328473),%l5
	sll	%l3,9,%l6
	 add	%g3,%l5,%l5		! X[7]+K[30]
	srl	%l3,32-9,%l3
	add	%l0,%l6,%l6
	 andn	 %l0,%l1,%l4
	add	%l6,%l3,%l3
	and	%l3,%l1,%l6		! round 30
	add	%l5,%l2,%l2
	or	%l6,%l4,%l4
	 sethi	%hi(2368359562),%l5
	add	%l4,%l2,%l2
	 or	%l5,%lo(2368359562),%l5
	sll	%l2,14,%l6
	 add	%o7,%l5,%l5		! X[12]+K[31]
	srl	%l2,32-14,%l2
	add	%l3,%l6,%l6
	 andn	 %l3,%l0,%l4
	add	%l6,%l2,%l2
	 srlx	%o2,32,%g3		! extract X[5]
	and	%l2,%l0,%l6		! round 31
	add	%l5,%l1,%l1
	or	%l6,%l4,%l4
	 sethi	%hi(4294588738),%l5
	add	%l4,%l1,%l1
	 or	%l5,%lo(4294588738),%l5
	sll	%l1,20,%l6
	 add	%g3,%l5,%l5		! X[5]+K[32]
	srl	%l1,32-20,%l1
	add	%l2,%l6,%l6
	 xor	 %l2,%l3,%l4
	add	%l6,%l1,%l1
	add	%l5,%l0,%l0		! round 32
	xor	%l1,%l4,%l4
	 sethi	%hi(2272392833),%l5
	add	%l4,%l0,%l0
	 or	%l5,%lo(2272392833),%l5
	sll	%l0,4,%l6
	 add	%o4,%l5,%l5		! X[8]+K[33]
	srl	%l0,32-4,%l0
	add	%l1,%l6,%l6
	 xor	 %l1,%l2,%l4
	add	%l6,%l0,%l0
	 srlx	%o5,32,%g3		! extract X[11]
	add	%l5,%l3,%l3		! round 33
	xor	%l0,%l4,%l4
	 sethi	%hi(1839030562),%l5
	add	%l4,%l3,%l3
	 or	%l5,%lo(1839030562),%l5
	sll	%l3,11,%l6
	 add	%g3,%l5,%l5		! X[11]+K[34]
	srl	%l3,32-11,%l3
	add	%l0,%l6,%l6
	 xor	 %l0,%l1,%l4
	add	%l6,%l3,%l3
	add	%l5,%l2,%l2		! round 34
	xor	%l3,%l4,%l4
	 sethi	%hi(4259657740),%l5
	add	%l4,%l2,%l2
	 or	%l5,%lo(4259657740),%l5
	sll	%l2,16,%l6
	 add	%g1,%l5,%l5		! X[14]+K[35]
	srl	%l2,32-16,%l2
	add	%l3,%l6,%l6
	 xor	 %l3,%l0,%l4
	add	%l6,%l2,%l2
	 srlx	%o0,32,%g3		! extract X[1]
	add	%l5,%l1,%l1		! round 35
	xor	%l2,%l4,%l4
	 sethi	%hi(2763975236),%l5
	add	%l4,%l1,%l1
	 or	%l5,%lo(2763975236),%l5
	sll	%l1,23,%l6
	 add	%g3,%l5,%l5		! X[1]+K[36]
	srl	%l1,32-23,%l1
	add	%l2,%l6,%l6
	 xor	 %l2,%l3,%l4
	add	%l6,%l1,%l1
	add	%l5,%l0,%l0		! round 36
	xor	%l1,%l4,%l4
	 sethi	%hi(1272893353),%l5
	add	%l4,%l0,%l0
	 or	%l5,%lo(1272893353),%l5
	sll	%l0,4,%l6
	 add	%o2,%l5,%l5		! X[4]+K[37]
	srl	%l0,32-4,%l0
	add	%l1,%l6,%l6
	 xor	 %l1,%l2,%l4
	add	%l6,%l0,%l0
	 srlx	%o3,32,%g3		! extract X[7]
	add	%l5,%l3,%l3		! round 37
	xor	%l0,%l4,%l4
	 sethi	%hi(4139469664),%l5
	add	%l4,%l3,%l3
	 or	%l5,%lo(4139469664),%l5
	sll	%l3,11,%l6
	 add	%g3,%l5,%l5		! X[7]+K[38]
	srl	%l3,32-11,%l3
	add	%l0,%l6,%l6
	 xor	 %l0,%l1,%l4
	add	%l6,%l3,%l3
	add	%l5,%l2,%l2		! round 38
	xor	%l3,%l4,%l4
	 sethi	%hi(3200236656),%l5
	add	%l4,%l2,%l2
	 or	%l5,%lo(3200236656),%l5
	sll	%l2,16,%l6
	 add	%o5,%l5,%l5		! X[10]+K[39]
	srl	%l2,32-16,%l2
	add	%l3,%l6,%l6
	 xor	 %l3,%l0,%l4
	add	%l6,%l2,%l2
	 srlx	%o7,32,%g3		! extract X[13]
	add	%l5,%l1,%l1		! round 39
	xor	%l2,%l4,%l4
	 sethi	%hi(681279174),%l5
	add	%l4,%l1,%l1
	 or	%l5,%lo(681279174),%l5
	sll	%l1,23,%l6
	 add	%g3,%l5,%l5		! X[13]+K[40]
	srl	%l1,32-23,%l1
	add	%l2,%l6,%l6
	 xor	 %l2,%l3,%l4
	add	%l6,%l1,%l1
	add	%l5,%l0,%l0		! round 40
	xor	%l1,%l4,%l4
	 sethi	%hi(3936430074),%l5
	add	%l4,%l0,%l0
	 or	%l5,%lo(3936430074),%l5
	sll	%l0,4,%l6
	 add	%o0,%l5,%l5		! X[0]+K[41]
	srl	%l0,32-4,%l0
	add	%l1,%l6,%l6
	 xor	 %l1,%l2,%l4
	add	%l6,%l0,%l0
	 srlx	%o1,32,%g3		! extract X[3]
	add	%l5,%l3,%l3		! round 41
	xor	%l0,%l4,%l4
	 sethi	%hi(3572445317),%l5
	add	%l4,%l3,%l3
	 or	%l5,%lo(3572445317),%l5
	sll	%l3,11,%l6
	 add	%g3,%l5,%l5		! X[3]+K[42]
	srl	%l3,32-11,%l3
	add	%l0,%l6,%l6
	 xor	 %l0,%l1,%l4
	add	%l6,%l3,%l3
	add	%l5,%l2,%l2		! round 42
	xor	%l3,%l4,%l4
	 sethi	%hi(76029189),%l5
	add	%l4,%l2,%l2
	 or	%l5,%lo(76029189),%l5
	sll	%l2,16,%l6
	 add	%o3,%l5,%l5		! X[6]+K[43]
	srl	%l2,32-16,%l2
	add	%l3,%l6,%l6
	 xor	 %l3,%l0,%l4
	add	%l6,%l2,%l2
	 srlx	%o4,32,%g3		! extract X[9]
	add	%l5,%l1,%l1		! round 43
	xor	%l2,%l4,%l4
	 sethi	%hi(3654602809),%l5
	add	%l4,%l1,%l1
	 or	%l5,%lo(3654602809),%l5
	sll	%l1,23,%l6
	 add	%g3,%l5,%l5		! X[9]+K[44]
	srl	%l1,32-23,%l1
	add	%l2,%l6,%l6
	 xor	 %l2,%l3,%l4
	add	%l6,%l1,%l1
	add	%l5,%l0,%l0		! round 44
	xor	%l1,%l4,%l4
	 sethi	%hi(3873151461),%l5
	add	%l4,%l0,%l0
	 or	%l5,%lo(3873151461),%l5
	sll	%l0,4,%l6
	 add	%o7,%l5,%l5		! X[12]+K[45]
	srl	%l0,32-4,%l0
	add	%l1,%l6,%l6
	 xor	 %l1,%l2,%l4
	add	%l6,%l0,%l0
	 srlx	%g1,32,%g3		! extract X[15]
	add	%l5,%l3,%l3		! round 45
	xor	%l0,%l4,%l4
	 sethi	%hi(530742520),%l5
	add	%l4,%l3,%l3
	 or	%l5,%lo(530742520),%l5
	sll	%l3,11,%l6
	 add	%g3,%l5,%l5		! X[15]+K[46]
	srl	%l3,32-11,%l3
	add	%l0,%l6,%l6
	 xor	 %l0,%l1,%l4
	add	%l6,%l3,%l3
	add	%l5,%l2,%l2		! round 46
	xor	%l3,%l4,%l4
	 sethi	%hi(3299628645),%l5
	add	%l4,%l2,%l2
	 or	%l5,%lo(3299628645),%l5
	sll	%l2,16,%l6
	 add	%o1,%l5,%l5		! X[2]+K[47]
	srl	%l2,32-16,%l2
	add	%l3,%l6,%l6
	 xor	 %l3,%l0,%l4
	add	%l6,%l2,%l2
	add	%l5,%l1,%l1		! round 47
	xor	%l2,%l4,%l4
	 sethi	%hi(4096336452),%l5
	add	%l4,%l1,%l1
	 or	%l5,%lo(4096336452),%l5
	sll	%l1,23,%l6
	 add	%o0,%l5,%l5		! X[0]+K[48]
	srl	%l1,32-23,%l1
	add	%l2,%l6,%l6
	 xor	 %l2,%l3,%l4
	add	%l6,%l1,%l1
	add	%l5,%l0,%l0		! round 48
	 srlx	%o3,32,%g3		! extract X[7]
	orn	%l1,%l3,%l4
	 sethi	%hi(1126891415),%l5
	xor	%l2,%l4,%l4
	 or	%l5,%lo(1126891415),%l5
	add	%l4,%l0,%l0
	sll	%l0,6,%l6
	 add	%g3,%l5,%l5		! X[7]+K[49]
	srl	%l0,32-6,%l0
	add	%l1,%l6,%l6
	add	%l6,%l0,%l0
	add	%l5,%l3,%l3		! round 49
	orn	%l0,%l2,%l4
	 sethi	%hi(2878612391),%l5
	xor	%l1,%l4,%l4
	 or	%l5,%lo(2878612391),%l5
	add	%l4,%l3,%l3
	sll	%l3,10,%l6
	 add	%g1,%l5,%l5		! X[14]+K[50]
	srl	%l3,32-10,%l3
	add	%l0,%l6,%l6
	add	%l6,%l3,%l3
	add	%l5,%l2,%l2		! round 50
	 srlx	%o2,32,%g3		! extract X[5]
	orn	%l3,%l1,%l4
	 sethi	%hi(4237533241),%l5
	xor	%l0,%l4,%l4
	 or	%l5,%lo(4237533241),%l5
	add	%l4,%l2,%l2
	sll	%l2,15,%l6
	 add	%g3,%l5,%l5		! X[5]+K[51]
	srl	%l2,32-15,%l2
	add	%l3,%l6,%l6
	add	%l6,%l2,%l2
	add	%l5,%l1,%l1		! round 51
	orn	%l2,%l0,%l4
	 sethi	%hi(1700485571),%l5
	xor	%l3,%l4,%l4
	 or	%l5,%lo(1700485571),%l5
	add	%l4,%l1,%l1
	sll	%l1,21,%l6
	 add	%o7,%l5,%l5		! X[12]+K[52]
	srl	%l1,32-21,%l1
	add	%l2,%l6,%l6
	add	%l6,%l1,%l1
	add	%l5,%l0,%l0		! round 52
	 srlx	%o1,32,%g3		! extract X[3]
	orn	%l1,%l3,%l4
	 sethi	%hi(2399980690),%l5
	xor	%l2,%l4,%l4
	 or	%l5,%lo(2399980690),%l5
	add	%l4,%l0,%l0
	sll	%l0,6,%l6
	 add	%g3,%l5,%l5		! X[3]+K[53]
	srl	%l0,32-6,%l0
	add	%l1,%l6,%l6
	add	%l6,%l0,%l0
	add	%l5,%l3,%l3		! round 53
	orn	%l0,%l2,%l4
	 sethi	%hi(4293915773),%l5
	xor	%l1,%l4,%l4
	 or	%l5,%lo(4293915773),%l5
	add	%l4,%l3,%l3
	sll	%l3,10,%l6
	 add	%o5,%l5,%l5		! X[10]+K[54]
	srl	%l3,32-10,%l3
	add	%l0,%l6,%l6
	add	%l6,%l3,%l3
	add	%l5,%l2,%l2		! round 54
	 srlx	%o0,32,%g3		! extract X[1]
	orn	%l3,%l1,%l4
	 sethi	%hi(2240044497),%l5
	xor	%l0,%l4,%l4
	 or	%l5,%lo(2240044497),%l5
	add	%l4,%l2,%l2
	sll	%l2,15,%l6
	 add	%g3,%l5,%l5		! X[1]+K[55]
	srl	%l2,32-15,%l2
	add	%l3,%l6,%l6
	add	%l6,%l2,%l2
	add	%l5,%l1,%l1		! round 55
	orn	%l2,%l0,%l4
	 sethi	%hi(1873313359),%l5
	xor	%l3,%l4,%l4
	 or	%l5,%lo(1873313359),%l5
	add	%l4,%l1,%l1
	sll	%l1,21,%l6
	 add	%o4,%l5,%l5		! X[8]+K[56]
	srl	%l1,32-21,%l1
	add	%l2,%l6,%l6
	add	%l6,%l1,%l1
	add	%l5,%l0,%l0		! round 56
	 srlx	%g1,32,%g3		! extract X[15]
	orn	%l1,%l3,%l4
	 sethi	%hi(4264355552),%l5
	xor	%l2,%l4,%l4
	 or	%l5,%lo(4264355552),%l5
	add	%l4,%l0,%l0
	sll	%l0,6,%l6
	 add	%g3,%l5,%l5		! X[15]+K[57]
	srl	%l0,32-6,%l0
	add	%l1,%l6,%l6
	add	%l6,%l0,%l0
	add	%l5,%l3,%l3		! round 57
	orn	%l0,%l2,%l4
	 sethi	%hi(2734768916),%l5
	xor	%l1,%l4,%l4
	 or	%l5,%lo(2734768916),%l5
	add	%l4,%l3,%l3
	sll	%l3,10,%l6
	 add	%o3,%l5,%l5		! X[6]+K[58]
	srl	%l3,32-10,%l3
	add	%l0,%l6,%l6
	add	%l6,%l3,%l3
	add	%l5,%l2,%l2		! round 58
	 srlx	%o7,32,%g3		! extract X[13]
	orn	%l3,%l1,%l4
	 sethi	%hi(1309151649),%l5
	xor	%l0,%l4,%l4
	 or	%l5,%lo(1309151649),%l5
	add	%l4,%l2,%l2
	sll	%l2,15,%l6
	 add	%g3,%l5,%l5		! X[13]+K[59]
	srl	%l2,32-15,%l2
	add	%l3,%l6,%l6
	add	%l6,%l2,%l2
	add	%l5,%l1,%l1		! round 59
	orn	%l2,%l0,%l4
	 sethi	%hi(4149444226),%l5
	xor	%l3,%l4,%l4
	 or	%l5,%lo(4149444226),%l5
	add	%l4,%l1,%l1
	sll	%l1,21,%l6
	 add	%o2,%l5,%l5		! X[4]+K[60]
	srl	%l1,32-21,%l1
	add	%l2,%l6,%l6
	add	%l6,%l1,%l1
	add	%l5,%l0,%l0		! round 60
	 srlx	%o5,32,%g3		! extract X[11]
	orn	%l1,%l3,%l4
	 sethi	%hi(3174756917),%l5
	xor	%l2,%l4,%l4
	 or	%l5,%lo(3174756917),%l5
	add	%l4,%l0,%l0
	sll	%l0,6,%l6
	 add	%g3,%l5,%l5		! X[11]+K[61]
	srl	%l0,32-6,%l0
	add	%l1,%l6,%l6
	add	%l6,%l0,%l0
	add	%l5,%l3,%l3		! round 61
	orn	%l0,%l2,%l4
	 sethi	%hi(718787259),%l5
	xor	%l1,%l4,%l4
	 or	%l5,%lo(718787259),%l5
	add	%l4,%l3,%l3
	sll	%l3,10,%l6
	 add	%o1,%l5,%l5		! X[2]+K[62]
	srl	%l3,32-10,%l3
	add	%l0,%l6,%l6
	add	%l6,%l3,%l3
	add	%l5,%l2,%l2		! round 62
	 srlx	%o4,32,%g3		! extract X[9]
	orn	%l3,%l1,%l4
	 sethi	%hi(3951481745),%l5
	xor	%l0,%l4,%l4
	 or	%l5,%lo(3951481745),%l5
	add	%l4,%l2,%l2
	sll	%l2,15,%l6
	 add	%g3,%l5,%l5		! X[9]+K[63]
	srl	%l2,32-15,%l2
	add	%l3,%l6,%l6
	add	%l6,%l2,%l2
	add	%l5,%l1,%l1		! round 63
	orn	%l2,%l0,%l4
	 sethi	%hi(0),%l5
	xor	%l3,%l4,%l4
	 or	%l5,%lo(0),%l5
	add	%l4,%l1,%l1
	sll	%l1,21,%l6
	 add	%o0,%l5,%l5		! X[0]+K[64]
	srl	%l1,32-21,%l1
	add	%l2,%l6,%l6
	add	%l6,%l1,%l1
	srlx	%g4,32,%l4		! unpack A,B,C,D and accumulate
	add	%i1,64,%i1		! advance inp
	srlx	%g5,32,%l5
	add	%l4,%l0,%l0
	subcc	%i2,1,%i2		! done yet?
	add	%g4,%l1,%l1
	add	%l5,%l2,%l2
	add	%g5,%l3,%l3
	srl	%l1,0,%l1			! clruw	%l1
	bne	SIZE_T_CC,.Loop
	srl	%l3,0,%l3			! clruw	%l3

	st	%l0,[%i0+0]		! write out ctx
	st	%l1,[%i0+4]
	st	%l2,[%i0+8]
	st	%l3,[%i0+12]

	wr	%g0,%l7,%asi
	ret
	restore
.type	ossl_md5_block_asm_data_order,#function
.size	ossl_md5_block_asm_data_order,(.-ossl_md5_block_asm_data_order)

.asciz	"MD5 block transform for SPARCv9, CRYPTOGAMS by <appro@openssl.org>"
.align	4