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