xref: /netbsd-src/crypto/external/bsd/openssl.old/lib/libcrypto/arch/sparc64/md5-sparcv9.S (revision 4724848cf0da353df257f730694b7882798e5daf)
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__
11SPARC_PIC_THUNK(%g1)
12#endif
13
14.globl	md5_block_asm_data_order
15.align	32
16md5_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@openssl.org>"
962.align	4
963