1#if defined(lint) || defined(__lint)
2#include <sys/md5.h>
3
4/* ARGSUSED */
5void md5_block_asm_host_order(MD5_CTX *ctx, const void *inpp,
6    unsigned int input_length_in_blocks)
7{
8}
9
10#else
11#include <sys/asm_linkage.h>
12
13	ENTRY_NP(md5_block_asm_host_order)
14	push	%rbp
15	push	%rbx
16	push	%r12
17	push	%r13
18	push	%r14
19	push	%r15
20
21	/ rdi = arg #1 (ctx, MD5_CTX pointer)
22	/ rsi = arg #2 (ptr, data pointer)
23	/ rdx = arg #3 (nbr, number of 64-byte blocks to process)
24	mov	%rdi,		%rbp	/ rbp = ctx
25	shl	$6,		%rdx	/ rdx = nbr in bytes
26	lea	(%rsi,%rdx),	%rdi	/ rdi = end
27	mov	0*4(%rbp),	%eax	/ eax = ctx->A
28	mov	1*4(%rbp),	%ebx	/ ebx = ctx->B
29	mov	2*4(%rbp),	%ecx	/ ecx = ctx->C
30	mov	3*4(%rbp),	%edx	/ edx = ctx->D
31	push	%rbp			/ save ctx
32	/ end is 'rdi'
33	/ ptr is 'rsi'
34	/ A is 'eax'
35	/ B is 'ebx'
36	/ C is 'ecx'
37	/ D is 'edx'
38
39	cmp	%rdi,		%rsi		/ cmp end with ptr
40	je	1f				/ jmp if ptr == end
41
42	/ BEGIN of loop over 64-byte blocks
432:	/ save old values of A, B, C, D
44	mov	%eax,		%r8d
45	mov	%ebx,		%r9d
46	mov	%ecx,		%r14d
47	mov	%edx,		%r15d
48	mov	0*4(%rsi),	%r10d		/* (NEXT STEP) X[0] */
49	mov	%edx,		%r11d		/* (NEXT STEP) z' = %edx */
50	xor	%ecx,		%r11d		/* y ^ ... */
51	lea	-0x28955b88(%eax,%r10d),%eax		/* Const + dst + ... r1 */
52	and	%ebx,		%r11d		/* x & ... */
53	xor	%edx,		%r11d		/* z ^ ... */
54	mov	1*4(%rsi),%r10d		/* (NEXT STEP) X[1] */
55	add	%r11d,		%eax		/* dst += ... */
56	rol	$7,		%eax		/* dst <<< s */
57	mov	%ecx,		%r11d		/* (NEXT STEP) z' = %ecx */
58	add	%ebx,		%eax		/* dst += x */
59	xor	%ebx,		%r11d		/* y ^ ... */
60	lea	-0x173848aa(%edx,%r10d),%edx		/* Const + dst + ... r1 */
61	and	%eax,		%r11d		/* x & ... */
62	xor	%ecx,		%r11d		/* z ^ ... */
63	mov	2*4(%rsi),%r10d		/* (NEXT STEP) X[2] */
64	add	%r11d,		%edx		/* dst += ... */
65	rol	$12,		%edx		/* dst <<< s */
66	mov	%ebx,		%r11d		/* (NEXT STEP) z' = %ebx */
67	add	%eax,		%edx		/* dst += x */
68	xor	%eax,		%r11d		/* y ^ ... */
69	lea	0x242070db(%ecx,%r10d),%ecx		/* Const + dst + ... r1 */
70	and	%edx,		%r11d		/* x & ... */
71	xor	%ebx,		%r11d		/* z ^ ... */
72	mov	3*4(%rsi),%r10d		/* (NEXT STEP) X[3] */
73	add	%r11d,		%ecx		/* dst += ... */
74	rol	$17,		%ecx		/* dst <<< s */
75	mov	%eax,		%r11d		/* (NEXT STEP) z' = %eax */
76	add	%edx,		%ecx		/* dst += x */
77	xor	%edx,		%r11d		/* y ^ ... */
78	lea	-0x3e423112(%ebx,%r10d),%ebx		/* Const + dst + ... r1 */
79	and	%ecx,		%r11d		/* x & ... */
80	xor	%eax,		%r11d		/* z ^ ... */
81	mov	4*4(%rsi),%r10d		/* (NEXT STEP) X[4] */
82	add	%r11d,		%ebx		/* dst += ... */
83	rol	$22,		%ebx		/* dst <<< s */
84	mov	%edx,		%r11d		/* (NEXT STEP) z' = %edx */
85	add	%ecx,		%ebx		/* dst += x */
86	xor	%ecx,		%r11d		/* y ^ ... */
87	lea	-0x0a83f051(%eax,%r10d),%eax		/* Const + dst + ... r1 */
88	and	%ebx,		%r11d		/* x & ... */
89	xor	%edx,		%r11d		/* z ^ ... */
90	mov	5*4(%rsi),%r10d		/* (NEXT STEP) X[5] */
91	add	%r11d,		%eax		/* dst += ... */
92	rol	$7,		%eax		/* dst <<< s */
93	mov	%ecx,		%r11d		/* (NEXT STEP) z' = %ecx */
94	add	%ebx,		%eax		/* dst += x */
95	xor	%ebx,		%r11d		/* y ^ ... */
96	lea	0x4787c62a(%edx,%r10d),%edx		/* Const + dst + ... r1 */
97	and	%eax,		%r11d		/* x & ... */
98	xor	%ecx,		%r11d		/* z ^ ... */
99	mov	6*4(%rsi),%r10d		/* (NEXT STEP) X[6] */
100	add	%r11d,		%edx		/* dst += ... */
101	rol	$12,		%edx		/* dst <<< s */
102	mov	%ebx,		%r11d		/* (NEXT STEP) z' = %ebx */
103	add	%eax,		%edx		/* dst += x */
104	xor	%eax,		%r11d		/* y ^ ... */
105	lea	-0x57cfb9ed(%ecx,%r10d),%ecx		/* Const + dst + ... r1 */
106	and	%edx,		%r11d		/* x & ... */
107	xor	%ebx,		%r11d		/* z ^ ... */
108	mov	7*4(%rsi),%r10d		/* (NEXT STEP) X[7] */
109	add	%r11d,		%ecx		/* dst += ... */
110	rol	$17,		%ecx		/* dst <<< s */
111	mov	%eax,		%r11d		/* (NEXT STEP) z' = %eax */
112	add	%edx,		%ecx		/* dst += x */
113	xor	%edx,		%r11d		/* y ^ ... */
114	lea	-0x02b96aff(%ebx,%r10d),%ebx		/* Const + dst + ... r1 */
115	and	%ecx,		%r11d		/* x & ... */
116	xor	%eax,		%r11d		/* z ^ ... */
117	mov	8*4(%rsi),%r10d		/* (NEXT STEP) X[8] */
118	add	%r11d,		%ebx		/* dst += ... */
119	rol	$22,		%ebx		/* dst <<< s */
120	mov	%edx,		%r11d		/* (NEXT STEP) z' = %edx */
121	add	%ecx,		%ebx		/* dst += x */
122	xor	%ecx,		%r11d		/* y ^ ... */
123	lea	0x698098d8(%eax,%r10d),%eax		/* Const + dst + ... r1 */
124	and	%ebx,		%r11d		/* x & ... */
125	xor	%edx,		%r11d		/* z ^ ... */
126	mov	9*4(%rsi),%r10d		/* (NEXT STEP) X[9] */
127	add	%r11d,		%eax		/* dst += ... */
128	rol	$7,		%eax		/* dst <<< s */
129	mov	%ecx,		%r11d		/* (NEXT STEP) z' = %ecx */
130	add	%ebx,		%eax		/* dst += x */
131	xor	%ebx,		%r11d		/* y ^ ... */
132	lea	-0x74bb0851(%edx,%r10d),%edx		/* Const + dst + ... r1 */
133	and	%eax,		%r11d		/* x & ... */
134	xor	%ecx,		%r11d		/* z ^ ... */
135	mov	10*4(%rsi),%r10d		/* (NEXT STEP) X[10] */
136	add	%r11d,		%edx		/* dst += ... */
137	rol	$12,		%edx		/* dst <<< s */
138	mov	%ebx,		%r11d		/* (NEXT STEP) z' = %ebx */
139	add	%eax,		%edx		/* dst += x */
140	xor	%eax,		%r11d		/* y ^ ... */
141	lea	-0x0000a44f(%ecx,%r10d),%ecx		/* Const + dst + ... r1 */
142	and	%edx,		%r11d		/* x & ... */
143	xor	%ebx,		%r11d		/* z ^ ... */
144	mov	11*4(%rsi),%r10d		/* (NEXT STEP) X[11] */
145	add	%r11d,		%ecx		/* dst += ... */
146	rol	$17,		%ecx		/* dst <<< s */
147	mov	%eax,		%r11d		/* (NEXT STEP) z' = %eax */
148	add	%edx,		%ecx		/* dst += x */
149	xor	%edx,		%r11d		/* y ^ ... */
150	lea	-0x76a32842(%ebx,%r10d),%ebx		/* Const + dst + ... r1 */
151	and	%ecx,		%r11d		/* x & ... */
152	xor	%eax,		%r11d		/* z ^ ... */
153	mov	12*4(%rsi),%r10d		/* (NEXT STEP) X[12] */
154	add	%r11d,		%ebx		/* dst += ... */
155	rol	$22,		%ebx		/* dst <<< s */
156	mov	%edx,		%r11d		/* (NEXT STEP) z' = %edx */
157	add	%ecx,		%ebx		/* dst += x */
158	xor	%ecx,		%r11d		/* y ^ ... */
159	lea	0x6b901122(%eax,%r10d),%eax		/* Const + dst + ... r1 */
160	and	%ebx,		%r11d		/* x & ... */
161	xor	%edx,		%r11d		/* z ^ ... */
162	mov	13*4(%rsi),%r10d		/* (NEXT STEP) X[13] */
163	add	%r11d,		%eax		/* dst += ... */
164	rol	$7,		%eax		/* dst <<< s */
165	mov	%ecx,		%r11d		/* (NEXT STEP) z' = %ecx */
166	add	%ebx,		%eax		/* dst += x */
167	xor	%ebx,		%r11d		/* y ^ ... */
168	lea	-0x02678e6d(%edx,%r10d),%edx		/* Const + dst + ... r1 */
169	and	%eax,		%r11d		/* x & ... */
170	xor	%ecx,		%r11d		/* z ^ ... */
171	mov	14*4(%rsi),%r10d		/* (NEXT STEP) X[14] */
172	add	%r11d,		%edx		/* dst += ... */
173	rol	$12,		%edx		/* dst <<< s */
174	mov	%ebx,		%r11d		/* (NEXT STEP) z' = %ebx */
175	add	%eax,		%edx		/* dst += x */
176	xor	%eax,		%r11d		/* y ^ ... */
177	lea	-0x5986bc72(%ecx,%r10d),%ecx		/* Const + dst + ... r1 */
178	and	%edx,		%r11d		/* x & ... */
179	xor	%ebx,		%r11d		/* z ^ ... */
180	mov	15*4(%rsi),%r10d		/* (NEXT STEP) X[15] */
181	add	%r11d,		%ecx		/* dst += ... */
182	rol	$17,		%ecx		/* dst <<< s */
183	mov	%eax,		%r11d		/* (NEXT STEP) z' = %eax */
184	add	%edx,		%ecx		/* dst += x */
185	xor	%edx,		%r11d		/* y ^ ... */
186	lea	0x49b40821(%ebx,%r10d),%ebx		/* Const + dst + ... r1 */
187	and	%ecx,		%r11d		/* x & ... */
188	xor	%eax,		%r11d		/* z ^ ... */
189	mov	0*4(%rsi),%r10d		/* (NEXT STEP) X[0] */
190	add	%r11d,		%ebx		/* dst += ... */
191	rol	$22,		%ebx		/* dst <<< s */
192	mov	%edx,		%r11d		/* (NEXT STEP) z' = %edx */
193	add	%ecx,		%ebx		/* dst += x */
194	mov	1*4(%rsi),	%r10d		/* (NEXT STEP) X[1] */
195	mov	%edx,		%r11d		/* (NEXT STEP) z' = %edx */
196	mov	%edx,		%r12d		/* (NEXT STEP) z' = %edx */
197	not	%r11d				/* not z */
198	lea	-0x09e1da9e(%eax,%r10d),%eax		/* Const + dst + ... r2 */
199	and	%ebx,		%r12d		/* x & z */
200	and	%ecx,		%r11d		/* y & (not z) */
201	mov	6*4(%rsi),%r10d		/* (NEXT STEP) X[6] */
202	or	%r11d,		%r12d		/* (y & (not z)) | (x & z) */
203	mov	%ecx,		%r11d		/* (NEXT STEP) z' = %ecx */
204	add	%r12d,		%eax		/* dst += ... */
205	mov	%ecx,		%r12d		/* (NEXT STEP) z' = %ecx */
206	rol	$5,		%eax		/* dst <<< s */
207	add	%ebx,		%eax		/* dst += x */
208	not	%r11d				/* not z */
209	lea	-0x3fbf4cc0(%edx,%r10d),%edx		/* Const + dst + ... r2 */
210	and	%eax,		%r12d		/* x & z */
211	and	%ebx,		%r11d		/* y & (not z) */
212	mov	11*4(%rsi),%r10d		/* (NEXT STEP) X[11] */
213	or	%r11d,		%r12d		/* (y & (not z)) | (x & z) */
214	mov	%ebx,		%r11d		/* (NEXT STEP) z' = %ebx */
215	add	%r12d,		%edx		/* dst += ... */
216	mov	%ebx,		%r12d		/* (NEXT STEP) z' = %ebx */
217	rol	$9,		%edx		/* dst <<< s */
218	add	%eax,		%edx		/* dst += x */
219	not	%r11d				/* not z */
220	lea	0x265e5a51(%ecx,%r10d),%ecx		/* Const + dst + ... r2 */
221	and	%edx,		%r12d		/* x & z */
222	and	%eax,		%r11d		/* y & (not z) */
223	mov	0*4(%rsi),%r10d		/* (NEXT STEP) X[0] */
224	or	%r11d,		%r12d		/* (y & (not z)) | (x & z) */
225	mov	%eax,		%r11d		/* (NEXT STEP) z' = %eax */
226	add	%r12d,		%ecx		/* dst += ... */
227	mov	%eax,		%r12d		/* (NEXT STEP) z' = %eax */
228	rol	$14,		%ecx		/* dst <<< s */
229	add	%edx,		%ecx		/* dst += x */
230	not	%r11d				/* not z */
231	lea	-0x16493856(%ebx,%r10d),%ebx		/* Const + dst + ... r2 */
232	and	%ecx,		%r12d		/* x & z */
233	and	%edx,		%r11d		/* y & (not z) */
234	mov	5*4(%rsi),%r10d		/* (NEXT STEP) X[5] */
235	or	%r11d,		%r12d		/* (y & (not z)) | (x & z) */
236	mov	%edx,		%r11d		/* (NEXT STEP) z' = %edx */
237	add	%r12d,		%ebx		/* dst += ... */
238	mov	%edx,		%r12d		/* (NEXT STEP) z' = %edx */
239	rol	$20,		%ebx		/* dst <<< s */
240	add	%ecx,		%ebx		/* dst += x */
241	not	%r11d				/* not z */
242	lea	-0x29d0efa3(%eax,%r10d),%eax		/* Const + dst + ... r2 */
243	and	%ebx,		%r12d		/* x & z */
244	and	%ecx,		%r11d		/* y & (not z) */
245	mov	10*4(%rsi),%r10d		/* (NEXT STEP) X[10] */
246	or	%r11d,		%r12d		/* (y & (not z)) | (x & z) */
247	mov	%ecx,		%r11d		/* (NEXT STEP) z' = %ecx */
248	add	%r12d,		%eax		/* dst += ... */
249	mov	%ecx,		%r12d		/* (NEXT STEP) z' = %ecx */
250	rol	$5,		%eax		/* dst <<< s */
251	add	%ebx,		%eax		/* dst += x */
252	not	%r11d				/* not z */
253	lea	0x2441453(%edx,%r10d),%edx		/* Const + dst + ... r2 */
254	and	%eax,		%r12d		/* x & z */
255	and	%ebx,		%r11d		/* y & (not z) */
256	mov	15*4(%rsi),%r10d		/* (NEXT STEP) X[15] */
257	or	%r11d,		%r12d		/* (y & (not z)) | (x & z) */
258	mov	%ebx,		%r11d		/* (NEXT STEP) z' = %ebx */
259	add	%r12d,		%edx		/* dst += ... */
260	mov	%ebx,		%r12d		/* (NEXT STEP) z' = %ebx */
261	rol	$9,		%edx		/* dst <<< s */
262	add	%eax,		%edx		/* dst += x */
263	not	%r11d				/* not z */
264	lea	-0x275e197f(%ecx,%r10d),%ecx		/* Const + dst + ... r2 */
265	and	%edx,		%r12d		/* x & z */
266	and	%eax,		%r11d		/* y & (not z) */
267	mov	4*4(%rsi),%r10d		/* (NEXT STEP) X[4] */
268	or	%r11d,		%r12d		/* (y & (not z)) | (x & z) */
269	mov	%eax,		%r11d		/* (NEXT STEP) z' = %eax */
270	add	%r12d,		%ecx		/* dst += ... */
271	mov	%eax,		%r12d		/* (NEXT STEP) z' = %eax */
272	rol	$14,		%ecx		/* dst <<< s */
273	add	%edx,		%ecx		/* dst += x */
274	not	%r11d				/* not z */
275	lea	-0x182c0438(%ebx,%r10d),%ebx		/* Const + dst + ... r2 */
276	and	%ecx,		%r12d		/* x & z */
277	and	%edx,		%r11d		/* y & (not z) */
278	mov	9*4(%rsi),%r10d		/* (NEXT STEP) X[9] */
279	or	%r11d,		%r12d		/* (y & (not z)) | (x & z) */
280	mov	%edx,		%r11d		/* (NEXT STEP) z' = %edx */
281	add	%r12d,		%ebx		/* dst += ... */
282	mov	%edx,		%r12d		/* (NEXT STEP) z' = %edx */
283	rol	$20,		%ebx		/* dst <<< s */
284	add	%ecx,		%ebx		/* dst += x */
285	not	%r11d				/* not z */
286	lea	0x21e1cde6(%eax,%r10d),%eax		/* Const + dst + ... r2 */
287	and	%ebx,		%r12d		/* x & z */
288	and	%ecx,		%r11d		/* y & (not z) */
289	mov	14*4(%rsi),%r10d		/* (NEXT STEP) X[14] */
290	or	%r11d,		%r12d		/* (y & (not z)) | (x & z) */
291	mov	%ecx,		%r11d		/* (NEXT STEP) z' = %ecx */
292	add	%r12d,		%eax		/* dst += ... */
293	mov	%ecx,		%r12d		/* (NEXT STEP) z' = %ecx */
294	rol	$5,		%eax		/* dst <<< s */
295	add	%ebx,		%eax		/* dst += x */
296	not	%r11d				/* not z */
297	lea	-0x3cc8f82a(%edx,%r10d),%edx		/* Const + dst + ... r2 */
298	and	%eax,		%r12d		/* x & z */
299	and	%ebx,		%r11d		/* y & (not z) */
300	mov	3*4(%rsi),%r10d		/* (NEXT STEP) X[3] */
301	or	%r11d,		%r12d		/* (y & (not z)) | (x & z) */
302	mov	%ebx,		%r11d		/* (NEXT STEP) z' = %ebx */
303	add	%r12d,		%edx		/* dst += ... */
304	mov	%ebx,		%r12d		/* (NEXT STEP) z' = %ebx */
305	rol	$9,		%edx		/* dst <<< s */
306	add	%eax,		%edx		/* dst += x */
307	not	%r11d				/* not z */
308	lea	-0x0b2af279(%ecx,%r10d),%ecx		/* Const + dst + ... r2 */
309	and	%edx,		%r12d		/* x & z */
310	and	%eax,		%r11d		/* y & (not z) */
311	mov	8*4(%rsi),%r10d		/* (NEXT STEP) X[8] */
312	or	%r11d,		%r12d		/* (y & (not z)) | (x & z) */
313	mov	%eax,		%r11d		/* (NEXT STEP) z' = %eax */
314	add	%r12d,		%ecx		/* dst += ... */
315	mov	%eax,		%r12d		/* (NEXT STEP) z' = %eax */
316	rol	$14,		%ecx		/* dst <<< s */
317	add	%edx,		%ecx		/* dst += x */
318	not	%r11d				/* not z */
319	lea	0x455a14ed(%ebx,%r10d),%ebx		/* Const + dst + ... r2 */
320	and	%ecx,		%r12d		/* x & z */
321	and	%edx,		%r11d		/* y & (not z) */
322	mov	13*4(%rsi),%r10d		/* (NEXT STEP) X[13] */
323	or	%r11d,		%r12d		/* (y & (not z)) | (x & z) */
324	mov	%edx,		%r11d		/* (NEXT STEP) z' = %edx */
325	add	%r12d,		%ebx		/* dst += ... */
326	mov	%edx,		%r12d		/* (NEXT STEP) z' = %edx */
327	rol	$20,		%ebx		/* dst <<< s */
328	add	%ecx,		%ebx		/* dst += x */
329	not	%r11d				/* not z */
330	lea	-0x561c16fb(%eax,%r10d),%eax		/* Const + dst + ... r2 */
331	and	%ebx,		%r12d		/* x & z */
332	and	%ecx,		%r11d		/* y & (not z) */
333	mov	2*4(%rsi),%r10d		/* (NEXT STEP) X[2] */
334	or	%r11d,		%r12d		/* (y & (not z)) | (x & z) */
335	mov	%ecx,		%r11d		/* (NEXT STEP) z' = %ecx */
336	add	%r12d,		%eax		/* dst += ... */
337	mov	%ecx,		%r12d		/* (NEXT STEP) z' = %ecx */
338	rol	$5,		%eax		/* dst <<< s */
339	add	%ebx,		%eax		/* dst += x */
340	not	%r11d				/* not z */
341	lea	-0x03105c08(%edx,%r10d),%edx		/* Const + dst + ... r2 */
342	and	%eax,		%r12d		/* x & z */
343	and	%ebx,		%r11d		/* y & (not z) */
344	mov	7*4(%rsi),%r10d		/* (NEXT STEP) X[7] */
345	or	%r11d,		%r12d		/* (y & (not z)) | (x & z) */
346	mov	%ebx,		%r11d		/* (NEXT STEP) z' = %ebx */
347	add	%r12d,		%edx		/* dst += ... */
348	mov	%ebx,		%r12d		/* (NEXT STEP) z' = %ebx */
349	rol	$9,		%edx		/* dst <<< s */
350	add	%eax,		%edx		/* dst += x */
351	not	%r11d				/* not z */
352	lea	0x676f02d9(%ecx,%r10d),%ecx		/* Const + dst + ... r2 */
353	and	%edx,		%r12d		/* x & z */
354	and	%eax,		%r11d		/* y & (not z) */
355	mov	12*4(%rsi),%r10d		/* (NEXT STEP) X[12] */
356	or	%r11d,		%r12d		/* (y & (not z)) | (x & z) */
357	mov	%eax,		%r11d		/* (NEXT STEP) z' = %eax */
358	add	%r12d,		%ecx		/* dst += ... */
359	mov	%eax,		%r12d		/* (NEXT STEP) z' = %eax */
360	rol	$14,		%ecx		/* dst <<< s */
361	add	%edx,		%ecx		/* dst += x */
362	not	%r11d				/* not z */
363	lea	-0x72d5b376(%ebx,%r10d),%ebx		/* Const + dst + ... r2 */
364	and	%ecx,		%r12d		/* x & z */
365	and	%edx,		%r11d		/* y & (not z) */
366	mov	0*4(%rsi),%r10d		/* (NEXT STEP) X[0] */
367	or	%r11d,		%r12d		/* (y & (not z)) | (x & z) */
368	mov	%edx,		%r11d		/* (NEXT STEP) z' = %edx */
369	add	%r12d,		%ebx		/* dst += ... */
370	mov	%edx,		%r12d		/* (NEXT STEP) z' = %edx */
371	rol	$20,		%ebx		/* dst <<< s */
372	add	%ecx,		%ebx		/* dst += x */
373	mov	5*4(%rsi),	%r10d		/* (NEXT STEP) X[5] */
374	mov	%ecx,		%r11d		/* (NEXT STEP) y' = %ecx */
375	lea	-0x0005c6be(%eax,%r10d),%eax		/* Const + dst + ... r3 */
376	mov	8*4(%rsi),%r10d		/* (NEXT STEP) X[8] */
377	xor	%edx,		%r11d		/* z ^ ... */
378	xor	%ebx,		%r11d		/* x ^ ... */
379	add	%r11d,		%eax		/* dst += ... */
380	rol	$4,		%eax		/* dst <<< s */
381	mov	%ebx,		%r11d		/* (NEXT STEP) y' = %ebx */
382	add	%ebx,		%eax		/* dst += x */
383	lea	-0x788e097f(%edx,%r10d),%edx		/* Const + dst + ... r3 */
384	mov	11*4(%rsi),%r10d		/* (NEXT STEP) X[11] */
385	xor	%ecx,		%r11d		/* z ^ ... */
386	xor	%eax,		%r11d		/* x ^ ... */
387	add	%r11d,		%edx		/* dst += ... */
388	rol	$11,		%edx		/* dst <<< s */
389	mov	%eax,		%r11d		/* (NEXT STEP) y' = %eax */
390	add	%eax,		%edx		/* dst += x */
391	lea	0x6d9d6122(%ecx,%r10d),%ecx		/* Const + dst + ... r3 */
392	mov	14*4(%rsi),%r10d		/* (NEXT STEP) X[14] */
393	xor	%ebx,		%r11d		/* z ^ ... */
394	xor	%edx,		%r11d		/* x ^ ... */
395	add	%r11d,		%ecx		/* dst += ... */
396	rol	$16,		%ecx		/* dst <<< s */
397	mov	%edx,		%r11d		/* (NEXT STEP) y' = %edx */
398	add	%edx,		%ecx		/* dst += x */
399	lea	-0x021ac7f4(%ebx,%r10d),%ebx		/* Const + dst + ... r3 */
400	mov	1*4(%rsi),%r10d		/* (NEXT STEP) X[1] */
401	xor	%eax,		%r11d		/* z ^ ... */
402	xor	%ecx,		%r11d		/* x ^ ... */
403	add	%r11d,		%ebx		/* dst += ... */
404	rol	$23,		%ebx		/* dst <<< s */
405	mov	%ecx,		%r11d		/* (NEXT STEP) y' = %ecx */
406	add	%ecx,		%ebx		/* dst += x */
407	lea	-0x5b4115bc(%eax,%r10d),%eax		/* Const + dst + ... r3 */
408	mov	4*4(%rsi),%r10d		/* (NEXT STEP) X[4] */
409	xor	%edx,		%r11d		/* z ^ ... */
410	xor	%ebx,		%r11d		/* x ^ ... */
411	add	%r11d,		%eax		/* dst += ... */
412	rol	$4,		%eax		/* dst <<< s */
413	mov	%ebx,		%r11d		/* (NEXT STEP) y' = %ebx */
414	add	%ebx,		%eax		/* dst += x */
415	lea	0x4bdecfa9(%edx,%r10d),%edx		/* Const + dst + ... r3 */
416	mov	7*4(%rsi),%r10d		/* (NEXT STEP) X[7] */
417	xor	%ecx,		%r11d		/* z ^ ... */
418	xor	%eax,		%r11d		/* x ^ ... */
419	add	%r11d,		%edx		/* dst += ... */
420	rol	$11,		%edx		/* dst <<< s */
421	mov	%eax,		%r11d		/* (NEXT STEP) y' = %eax */
422	add	%eax,		%edx		/* dst += x */
423	lea	-0x0944b4a0(%ecx,%r10d),%ecx		/* Const + dst + ... r3 */
424	mov	10*4(%rsi),%r10d		/* (NEXT STEP) X[10] */
425	xor	%ebx,		%r11d		/* z ^ ... */
426	xor	%edx,		%r11d		/* x ^ ... */
427	add	%r11d,		%ecx		/* dst += ... */
428	rol	$16,		%ecx		/* dst <<< s */
429	mov	%edx,		%r11d		/* (NEXT STEP) y' = %edx */
430	add	%edx,		%ecx		/* dst += x */
431	lea	-0x41404390(%ebx,%r10d),%ebx		/* Const + dst + ... r3 */
432	mov	13*4(%rsi),%r10d		/* (NEXT STEP) X[13] */
433	xor	%eax,		%r11d		/* z ^ ... */
434	xor	%ecx,		%r11d		/* x ^ ... */
435	add	%r11d,		%ebx		/* dst += ... */
436	rol	$23,		%ebx		/* dst <<< s */
437	mov	%ecx,		%r11d		/* (NEXT STEP) y' = %ecx */
438	add	%ecx,		%ebx		/* dst += x */
439	lea	0x289b7ec6(%eax,%r10d),%eax		/* Const + dst + ... r3 */
440	mov	0*4(%rsi),%r10d		/* (NEXT STEP) X[0] */
441	xor	%edx,		%r11d		/* z ^ ... */
442	xor	%ebx,		%r11d		/* x ^ ... */
443	add	%r11d,		%eax		/* dst += ... */
444	rol	$4,		%eax		/* dst <<< s */
445	mov	%ebx,		%r11d		/* (NEXT STEP) y' = %ebx */
446	add	%ebx,		%eax		/* dst += x */
447	lea	-0x155ed806(%edx,%r10d),%edx		/* Const + dst + ... r3 */
448	mov	3*4(%rsi),%r10d		/* (NEXT STEP) X[3] */
449	xor	%ecx,		%r11d		/* z ^ ... */
450	xor	%eax,		%r11d		/* x ^ ... */
451	add	%r11d,		%edx		/* dst += ... */
452	rol	$11,		%edx		/* dst <<< s */
453	mov	%eax,		%r11d		/* (NEXT STEP) y' = %eax */
454	add	%eax,		%edx		/* dst += x */
455	lea	-0x2b10cf7b(%ecx,%r10d),%ecx		/* Const + dst + ... r3 */
456	mov	6*4(%rsi),%r10d		/* (NEXT STEP) X[6] */
457	xor	%ebx,		%r11d		/* z ^ ... */
458	xor	%edx,		%r11d		/* x ^ ... */
459	add	%r11d,		%ecx		/* dst += ... */
460	rol	$16,		%ecx		/* dst <<< s */
461	mov	%edx,		%r11d		/* (NEXT STEP) y' = %edx */
462	add	%edx,		%ecx		/* dst += x */
463	lea	0x4881d05(%ebx,%r10d),%ebx		/* Const + dst + ... r3 */
464	mov	9*4(%rsi),%r10d		/* (NEXT STEP) X[9] */
465	xor	%eax,		%r11d		/* z ^ ... */
466	xor	%ecx,		%r11d		/* x ^ ... */
467	add	%r11d,		%ebx		/* dst += ... */
468	rol	$23,		%ebx		/* dst <<< s */
469	mov	%ecx,		%r11d		/* (NEXT STEP) y' = %ecx */
470	add	%ecx,		%ebx		/* dst += x */
471	lea	-0x262b2fc7(%eax,%r10d),%eax		/* Const + dst + ... r3 */
472	mov	12*4(%rsi),%r10d		/* (NEXT STEP) X[12] */
473	xor	%edx,		%r11d		/* z ^ ... */
474	xor	%ebx,		%r11d		/* x ^ ... */
475	add	%r11d,		%eax		/* dst += ... */
476	rol	$4,		%eax		/* dst <<< s */
477	mov	%ebx,		%r11d		/* (NEXT STEP) y' = %ebx */
478	add	%ebx,		%eax		/* dst += x */
479	lea	-0x1924661b(%edx,%r10d),%edx		/* Const + dst + ... r3 */
480	mov	15*4(%rsi),%r10d		/* (NEXT STEP) X[15] */
481	xor	%ecx,		%r11d		/* z ^ ... */
482	xor	%eax,		%r11d		/* x ^ ... */
483	add	%r11d,		%edx		/* dst += ... */
484	rol	$11,		%edx		/* dst <<< s */
485	mov	%eax,		%r11d		/* (NEXT STEP) y' = %eax */
486	add	%eax,		%edx		/* dst += x */
487	lea	0x1fa27cf8(%ecx,%r10d),%ecx		/* Const + dst + ... r3 */
488	mov	2*4(%rsi),%r10d		/* (NEXT STEP) X[2] */
489	xor	%ebx,		%r11d		/* z ^ ... */
490	xor	%edx,		%r11d		/* x ^ ... */
491	add	%r11d,		%ecx		/* dst += ... */
492	rol	$16,		%ecx		/* dst <<< s */
493	mov	%edx,		%r11d		/* (NEXT STEP) y' = %edx */
494	add	%edx,		%ecx		/* dst += x */
495	lea	-0x3b53a99b(%ebx,%r10d),%ebx		/* Const + dst + ... r3 */
496	mov	0*4(%rsi),%r10d		/* (NEXT STEP) X[0] */
497	xor	%eax,		%r11d		/* z ^ ... */
498	xor	%ecx,		%r11d		/* x ^ ... */
499	add	%r11d,		%ebx		/* dst += ... */
500	rol	$23,		%ebx		/* dst <<< s */
501	mov	%ecx,		%r11d		/* (NEXT STEP) y' = %ecx */
502	add	%ecx,		%ebx		/* dst += x */
503	mov	0*4(%rsi),	%r10d		/* (NEXT STEP) X[0] */
504	mov	$0xffffffff,	%r11d
505	xor	%edx,		%r11d		/* (NEXT STEP) not z' = not %edx*/
506	lea	-0x0bd6ddbc(%eax,%r10d),%eax		/* Const + dst + ... r4 */
507	or	%ebx,		%r11d		/* x | ... */
508	xor	%ecx,		%r11d		/* y ^ ... */
509	add	%r11d,		%eax		/* dst += ... */
510	mov	7*4(%rsi),%r10d		/* (NEXT STEP) X[7] */
511	mov	$0xffffffff,	%r11d
512	rol	$6,		%eax		/* dst <<< s */
513	xor	%ecx,		%r11d		/* (NEXT STEP) not z' = not %ecx */
514	add	%ebx,		%eax		/* dst += x */
515	lea	0x432aff97(%edx,%r10d),%edx		/* Const + dst + ... r4 */
516	or	%eax,		%r11d		/* x | ... */
517	xor	%ebx,		%r11d		/* y ^ ... */
518	add	%r11d,		%edx		/* dst += ... */
519	mov	14*4(%rsi),%r10d		/* (NEXT STEP) X[14] */
520	mov	$0xffffffff,	%r11d
521	rol	$10,		%edx		/* dst <<< s */
522	xor	%ebx,		%r11d		/* (NEXT STEP) not z' = not %ebx */
523	add	%eax,		%edx		/* dst += x */
524	lea	-0x546bdc59(%ecx,%r10d),%ecx		/* Const + dst + ... r4 */
525	or	%edx,		%r11d		/* x | ... */
526	xor	%eax,		%r11d		/* y ^ ... */
527	add	%r11d,		%ecx		/* dst += ... */
528	mov	5*4(%rsi),%r10d		/* (NEXT STEP) X[5] */
529	mov	$0xffffffff,	%r11d
530	rol	$15,		%ecx		/* dst <<< s */
531	xor	%eax,		%r11d		/* (NEXT STEP) not z' = not %eax */
532	add	%edx,		%ecx		/* dst += x */
533	lea	-0x036c5fc7(%ebx,%r10d),%ebx		/* Const + dst + ... r4 */
534	or	%ecx,		%r11d		/* x | ... */
535	xor	%edx,		%r11d		/* y ^ ... */
536	add	%r11d,		%ebx		/* dst += ... */
537	mov	12*4(%rsi),%r10d		/* (NEXT STEP) X[12] */
538	mov	$0xffffffff,	%r11d
539	rol	$21,		%ebx		/* dst <<< s */
540	xor	%edx,		%r11d		/* (NEXT STEP) not z' = not %edx */
541	add	%ecx,		%ebx		/* dst += x */
542	lea	0x655b59c3(%eax,%r10d),%eax		/* Const + dst + ... r4 */
543	or	%ebx,		%r11d		/* x | ... */
544	xor	%ecx,		%r11d		/* y ^ ... */
545	add	%r11d,		%eax		/* dst += ... */
546	mov	3*4(%rsi),%r10d		/* (NEXT STEP) X[3] */
547	mov	$0xffffffff,	%r11d
548	rol	$6,		%eax		/* dst <<< s */
549	xor	%ecx,		%r11d		/* (NEXT STEP) not z' = not %ecx */
550	add	%ebx,		%eax		/* dst += x */
551	lea	-0x70f3336e(%edx,%r10d),%edx		/* Const + dst + ... r4 */
552	or	%eax,		%r11d		/* x | ... */
553	xor	%ebx,		%r11d		/* y ^ ... */
554	add	%r11d,		%edx		/* dst += ... */
555	mov	10*4(%rsi),%r10d		/* (NEXT STEP) X[10] */
556	mov	$0xffffffff,	%r11d
557	rol	$10,		%edx		/* dst <<< s */
558	xor	%ebx,		%r11d		/* (NEXT STEP) not z' = not %ebx */
559	add	%eax,		%edx		/* dst += x */
560	lea	-0x00100b83(%ecx,%r10d),%ecx		/* Const + dst + ... r4 */
561	or	%edx,		%r11d		/* x | ... */
562	xor	%eax,		%r11d		/* y ^ ... */
563	add	%r11d,		%ecx		/* dst += ... */
564	mov	1*4(%rsi),%r10d		/* (NEXT STEP) X[1] */
565	mov	$0xffffffff,	%r11d
566	rol	$15,		%ecx		/* dst <<< s */
567	xor	%eax,		%r11d		/* (NEXT STEP) not z' = not %eax */
568	add	%edx,		%ecx		/* dst += x */
569	lea	-0x7a7ba22f(%ebx,%r10d),%ebx		/* Const + dst + ... r4 */
570	or	%ecx,		%r11d		/* x | ... */
571	xor	%edx,		%r11d		/* y ^ ... */
572	add	%r11d,		%ebx		/* dst += ... */
573	mov	8*4(%rsi),%r10d		/* (NEXT STEP) X[8] */
574	mov	$0xffffffff,	%r11d
575	rol	$21,		%ebx		/* dst <<< s */
576	xor	%edx,		%r11d		/* (NEXT STEP) not z' = not %edx */
577	add	%ecx,		%ebx		/* dst += x */
578	lea	0x6fa87e4f(%eax,%r10d),%eax		/* Const + dst + ... r4 */
579	or	%ebx,		%r11d		/* x | ... */
580	xor	%ecx,		%r11d		/* y ^ ... */
581	add	%r11d,		%eax		/* dst += ... */
582	mov	15*4(%rsi),%r10d		/* (NEXT STEP) X[15] */
583	mov	$0xffffffff,	%r11d
584	rol	$6,		%eax		/* dst <<< s */
585	xor	%ecx,		%r11d		/* (NEXT STEP) not z' = not %ecx */
586	add	%ebx,		%eax		/* dst += x */
587	lea	-0x01d31920(%edx,%r10d),%edx		/* Const + dst + ... r4 */
588	or	%eax,		%r11d		/* x | ... */
589	xor	%ebx,		%r11d		/* y ^ ... */
590	add	%r11d,		%edx		/* dst += ... */
591	mov	6*4(%rsi),%r10d		/* (NEXT STEP) X[6] */
592	mov	$0xffffffff,	%r11d
593	rol	$10,		%edx		/* dst <<< s */
594	xor	%ebx,		%r11d		/* (NEXT STEP) not z' = not %ebx */
595	add	%eax,		%edx		/* dst += x */
596	lea	-0x5cfebcec(%ecx,%r10d),%ecx		/* Const + dst + ... r4 */
597	or	%edx,		%r11d		/* x | ... */
598	xor	%eax,		%r11d		/* y ^ ... */
599	add	%r11d,		%ecx		/* dst += ... */
600	mov	13*4(%rsi),%r10d		/* (NEXT STEP) X[13] */
601	mov	$0xffffffff,	%r11d
602	rol	$15,		%ecx		/* dst <<< s */
603	xor	%eax,		%r11d		/* (NEXT STEP) not z' = not %eax */
604	add	%edx,		%ecx		/* dst += x */
605	lea	0x4e0811a1(%ebx,%r10d),%ebx		/* Const + dst + ... r4 */
606	or	%ecx,		%r11d		/* x | ... */
607	xor	%edx,		%r11d		/* y ^ ... */
608	add	%r11d,		%ebx		/* dst += ... */
609	mov	4*4(%rsi),%r10d		/* (NEXT STEP) X[4] */
610	mov	$0xffffffff,	%r11d
611	rol	$21,		%ebx		/* dst <<< s */
612	xor	%edx,		%r11d		/* (NEXT STEP) not z' = not %edx */
613	add	%ecx,		%ebx		/* dst += x */
614	lea	-0x08ac817e(%eax,%r10d),%eax		/* Const + dst + ... r4 */
615	or	%ebx,		%r11d		/* x | ... */
616	xor	%ecx,		%r11d		/* y ^ ... */
617	add	%r11d,		%eax		/* dst += ... */
618	mov	11*4(%rsi),%r10d		/* (NEXT STEP) X[11] */
619	mov	$0xffffffff,	%r11d
620	rol	$6,		%eax		/* dst <<< s */
621	xor	%ecx,		%r11d		/* (NEXT STEP) not z' = not %ecx */
622	add	%ebx,		%eax		/* dst += x */
623	lea	-0x42c50dcb(%edx,%r10d),%edx		/* Const + dst + ... r4 */
624	or	%eax,		%r11d		/* x | ... */
625	xor	%ebx,		%r11d		/* y ^ ... */
626	add	%r11d,		%edx		/* dst += ... */
627	mov	2*4(%rsi),%r10d		/* (NEXT STEP) X[2] */
628	mov	$0xffffffff,	%r11d
629	rol	$10,		%edx		/* dst <<< s */
630	xor	%ebx,		%r11d		/* (NEXT STEP) not z' = not %ebx */
631	add	%eax,		%edx		/* dst += x */
632	lea	0x2ad7d2bb(%ecx,%r10d),%ecx		/* Const + dst + ... r4 */
633	or	%edx,		%r11d		/* x | ... */
634	xor	%eax,		%r11d		/* y ^ ... */
635	add	%r11d,		%ecx		/* dst += ... */
636	mov	9*4(%rsi),%r10d		/* (NEXT STEP) X[9] */
637	mov	$0xffffffff,	%r11d
638	rol	$15,		%ecx		/* dst <<< s */
639	xor	%eax,		%r11d		/* (NEXT STEP) not z' = not %eax */
640	add	%edx,		%ecx		/* dst += x */
641	lea	-0x14792c6f(%ebx,%r10d),%ebx		/* Const + dst + ... r4 */
642	or	%ecx,		%r11d		/* x | ... */
643	xor	%edx,		%r11d		/* y ^ ... */
644	add	%r11d,		%ebx		/* dst += ... */
645	mov	0*4(%rsi),%r10d		/* (NEXT STEP) X[0] */
646	mov	$0xffffffff,	%r11d
647	rol	$21,		%ebx		/* dst <<< s */
648	xor	%edx,		%r11d		/* (NEXT STEP) not z' = not %edx */
649	add	%ecx,		%ebx		/* dst += x */
650	/ add old values of A, B, C, D
651	add	%r8d,	%eax
652	add	%r9d,	%ebx
653	add	%r14d,	%ecx
654	add	%r15d,	%edx
655
656	/ loop control
657	add	$64,		%rsi		/ ptr += 64
658	cmp	%rdi,		%rsi		/ cmp end with ptr
659	jb	2b				/ jmp if ptr < end
660	/ END of loop over 64-byte blocks
661
6621:	pop	%rbp				/ restore ctx
663	mov	%eax,		0*4(%rbp)	/ ctx->A = A
664	mov	%ebx,		1*4(%rbp)	/ ctx->B = B
665	mov	%ecx,		2*4(%rbp)	/ ctx->C = C
666	mov	%edx,		3*4(%rbp)	/ ctx->D = D
667
668	pop	%r15
669	pop	%r14
670	pop	%r13
671	pop	%r12
672	pop	%rbx
673	pop	%rbp
674	ret
675	SET_SIZE(md5_block_asm_host_order)
676
677#endif /* lint || __lint */
678