xref: /freebsd/sys/crypto/openssl/aarch64/md5-aarch64.S (revision 4757b351ea9d59d71d4a38b82506d2d16fcd560d)
1/* Do not modify. This file is auto-generated from md5-aarch64.pl. */
2#include "arm_arch.h"
3
4.text
5.globl	ossl_md5_block_asm_data_order
6.type	ossl_md5_block_asm_data_order,@function
7ossl_md5_block_asm_data_order:
8	AARCH64_VALID_CALL_TARGET
9        // Save all callee-saved registers
10	stp	x19,x20,[sp,#-80]!
11	stp	x21,x22,[sp,#16]
12	stp	x23,x24,[sp,#32]
13	stp	x25,x26,[sp,#48]
14	stp	x27,x28,[sp,#64]
15
16	ldp	w10, w11, [x0, #0]        // .Load MD5 state->A and state->B
17	ldp	w12, w13, [x0, #8]        // .Load MD5 state->C and state->D
18.align	5
19ossl_md5_blocks_loop:
20	eor	x17, x12, x13             // Begin aux function round 1 F(x,y,z)=(((y^z)&x)^z)
21	and	x16, x17, x11             // Continue aux function round 1 F(x,y,z)=(((y^z)&x)^z)
22	ldp	w15, w20, [x1]            // .Load 2 words of input data0 M[0],M[1]
23	ldp	w3, w21, [x1, #8]        // .Load 2 words of input data0 M[2],M[3]
24#ifdef __AARCH64EB__
25	rev	w15, w15
26	rev	w20, w20
27	rev	w3, w3
28	rev	w21, w21
29#endif
30	eor	x14, x16, x13             // End aux function round 1 F(x,y,z)=(((y^z)&x)^z)
31	movz	x9, #0xa478              // .Load lower half of constant 0xd76aa478
32	movk	x9, #0xd76a, lsl #16     // .Load upper half of constant 0xd76aa478
33	add	w8, w10, w15              // Add dest value
34	add	w7, w8, w9                // Add constant 0xd76aa478
35	add	w6, w7, w14               // Add aux function result
36	ror	w6, w6, #25               // Rotate left s=7 bits
37	eor	x5, x11, x12              // Begin aux function round 1 F(x,y,z)=(((y^z)&x)^z)
38	add	w4, w11, w6               // Add X parameter round 1 A=FF(A, B, C, D, 0xd76aa478, s=7, M[0])
39	and	x8, x5, x4                // Continue aux function round 1 F(x,y,z)=(((y^z)&x)^z)
40	eor	x17, x8, x12              // End aux function round 1 F(x,y,z)=(((y^z)&x)^z)
41	movz	x16, #0xb756             // .Load lower half of constant 0xe8c7b756
42	movk	x16, #0xe8c7, lsl #16    // .Load upper half of constant 0xe8c7b756
43	add	w9, w13, w20              // Add dest value
44	add	w7, w9, w16               // Add constant 0xe8c7b756
45	add	w14, w7, w17              // Add aux function result
46	ror	w14, w14, #20             // Rotate left s=12 bits
47	eor	x6, x4, x11               // Begin aux function round 1 F(x,y,z)=(((y^z)&x)^z)
48	add	w5, w4, w14               // Add X parameter round 1 D=FF(D, A, B, C, 0xe8c7b756, s=12, M[1])
49	and	x8, x6, x5                // Continue aux function round 1 F(x,y,z)=(((y^z)&x)^z)
50	eor	x9, x8, x11               // End aux function round 1 F(x,y,z)=(((y^z)&x)^z)
51	movz	x16, #0x70db             // .Load lower half of constant 0x242070db
52	movk	x16, #0x2420, lsl #16    // .Load upper half of constant 0x242070db
53	add	w7, w12, w3               // Add dest value
54	add	w17, w7, w16              // Add constant 0x242070db
55	add	w14, w17, w9              // Add aux function result
56	ror	w14, w14, #15             // Rotate left s=17 bits
57	eor	x6, x5, x4                // Begin aux function round 1 F(x,y,z)=(((y^z)&x)^z)
58	add	w8, w5, w14               // Add X parameter round 1 C=FF(C, D, A, B, 0x242070db, s=17, M[2])
59	and	x7, x6, x8                // Continue aux function round 1 F(x,y,z)=(((y^z)&x)^z)
60	eor	x16, x7, x4               // End aux function round 1 F(x,y,z)=(((y^z)&x)^z)
61	movz	x9, #0xceee              // .Load lower half of constant 0xc1bdceee
62	movk	x9, #0xc1bd, lsl #16     // .Load upper half of constant 0xc1bdceee
63	add	w14, w11, w21             // Add dest value
64	add	w6, w14, w9               // Add constant 0xc1bdceee
65	add	w7, w6, w16               // Add aux function result
66	ror	w7, w7, #10               // Rotate left s=22 bits
67	eor	x17, x8, x5               // Begin aux function round 1 F(x,y,z)=(((y^z)&x)^z)
68	add	w9, w8, w7                // Add X parameter round 1 B=FF(B, C, D, A, 0xc1bdceee, s=22, M[3])
69	ldp	w14, w22, [x1, #16]       // .Load 2 words of input data0 M[4],M[5]
70	ldp	w7, w23, [x1, #24]        // .Load 2 words of input data0 M[6],M[7]
71#ifdef __AARCH64EB__
72	rev	w14, w14
73	rev	w22, w22
74	rev	w7, w7
75	rev	w23, w23
76#endif
77	and	x16, x17, x9              // Continue aux function round 1 F(x,y,z)=(((y^z)&x)^z)
78	eor	x6, x16, x5               // End aux function round 1 F(x,y,z)=(((y^z)&x)^z)
79	movz	x16, #0xfaf              // .Load lower half of constant 0xf57c0faf
80	movk	x16, #0xf57c, lsl #16    // .Load upper half of constant 0xf57c0faf
81	add	w17, w4, w14              // Add dest value
82	add	w16, w17, w16             // Add constant 0xf57c0faf
83	add	w4, w16, w6               // Add aux function result
84	ror	w4, w4, #25               // Rotate left s=7 bits
85	eor	x16, x9, x8               // Begin aux function round 1 F(x,y,z)=(((y^z)&x)^z)
86	add	w17, w9, w4               // Add X parameter round 1 A=FF(A, B, C, D, 0xf57c0faf, s=7, M[4])
87	and	x16, x16, x17             // Continue aux function round 1 F(x,y,z)=(((y^z)&x)^z)
88	eor	x6, x16, x8               // End aux function round 1 F(x,y,z)=(((y^z)&x)^z)
89	movz	x4, #0xc62a              // .Load lower half of constant 0x4787c62a
90	movk	x4, #0x4787, lsl #16     // .Load upper half of constant 0x4787c62a
91	add	w16, w5, w22              // Add dest value
92	add	w16, w16, w4              // Add constant 0x4787c62a
93	add	w5, w16, w6               // Add aux function result
94	ror	w5, w5, #20               // Rotate left s=12 bits
95	eor	x4, x17, x9               // Begin aux function round 1 F(x,y,z)=(((y^z)&x)^z)
96	add	w19, w17, w5              // Add X parameter round 1 D=FF(D, A, B, C, 0x4787c62a, s=12, M[5])
97	and	x6, x4, x19               // Continue aux function round 1 F(x,y,z)=(((y^z)&x)^z)
98	eor	x5, x6, x9                // End aux function round 1 F(x,y,z)=(((y^z)&x)^z)
99	movz	x4, #0x4613              // .Load lower half of constant 0xa8304613
100	movk	x4, #0xa830, lsl #16     // .Load upper half of constant 0xa8304613
101	add	w6, w8, w7                // Add dest value
102	add	w8, w6, w4                // Add constant 0xa8304613
103	add	w4, w8, w5                // Add aux function result
104	ror	w4, w4, #15               // Rotate left s=17 bits
105	eor	x6, x19, x17              // Begin aux function round 1 F(x,y,z)=(((y^z)&x)^z)
106	add	w8, w19, w4               // Add X parameter round 1 C=FF(C, D, A, B, 0xa8304613, s=17, M[6])
107	and	x5, x6, x8                // Continue aux function round 1 F(x,y,z)=(((y^z)&x)^z)
108	eor	x4, x5, x17               // End aux function round 1 F(x,y,z)=(((y^z)&x)^z)
109	movz	x6, #0x9501              // .Load lower half of constant 0xfd469501
110	movk	x6, #0xfd46, lsl #16     // .Load upper half of constant 0xfd469501
111	add	w9, w9, w23               // Add dest value
112	add	w5, w9, w6                // Add constant 0xfd469501
113	add	w9, w5, w4                // Add aux function result
114	ror	w9, w9, #10               // Rotate left s=22 bits
115	eor	x6, x8, x19               // Begin aux function round 1 F(x,y,z)=(((y^z)&x)^z)
116	add	w4, w8, w9                // Add X parameter round 1 B=FF(B, C, D, A, 0xfd469501, s=22, M[7])
117	ldp	w5, w24, [x1, #32]        // .Load 2 words of input data0 M[8],M[9]
118	ldp	w16, w25, [x1, #40]        // .Load 2 words of input data0 M[10],M[11]
119#ifdef __AARCH64EB__
120	rev	w5, w5
121	rev	w24, w24
122	rev	w16, w16
123	rev	w25, w25
124#endif
125	and	x9, x6, x4                // Continue aux function round 1 F(x,y,z)=(((y^z)&x)^z)
126	eor	x6, x9, x19               // End aux function round 1 F(x,y,z)=(((y^z)&x)^z)
127	movz	x9, #0x98d8              // .Load lower half of constant 0x698098d8
128	movk	x9, #0x6980, lsl #16     // .Load upper half of constant 0x698098d8
129	add	w17, w17, w5              // Add dest value
130	add	w9, w17, w9               // Add constant 0x698098d8
131	add	w17, w9, w6               // Add aux function result
132	ror	w17, w17, #25             // Rotate left s=7 bits
133	eor	x9, x4, x8                // Begin aux function round 1 F(x,y,z)=(((y^z)&x)^z)
134	add	w6, w4, w17               // Add X parameter round 1 A=FF(A, B, C, D, 0x698098d8, s=7, M[8])
135	and	x17, x9, x6               // Continue aux function round 1 F(x,y,z)=(((y^z)&x)^z)
136	eor	x9, x17, x8               // End aux function round 1 F(x,y,z)=(((y^z)&x)^z)
137	movz	x17, #0xf7af             // .Load lower half of constant 0x8b44f7af
138	movk	x17, #0x8b44, lsl #16    // .Load upper half of constant 0x8b44f7af
139	add	w19, w19, w24             // Add dest value
140	add	w17, w19, w17             // Add constant 0x8b44f7af
141	add	w19, w17, w9              // Add aux function result
142	ror	w19, w19, #20             // Rotate left s=12 bits
143	eor	x9, x6, x4                // Begin aux function round 1 F(x,y,z)=(((y^z)&x)^z)
144	add	w17, w6, w19              // Add X parameter round 1 D=FF(D, A, B, C, 0x8b44f7af, s=12, M[9])
145	and	x9, x9, x17               // Continue aux function round 1 F(x,y,z)=(((y^z)&x)^z)
146	eor	x9, x9, x4                // End aux function round 1 F(x,y,z)=(((y^z)&x)^z)
147	movz	x11, #0x5bb1             // .Load lower half of constant 0xffff5bb1
148	movk	x11, #0xffff, lsl #16    // .Load upper half of constant 0xffff5bb1
149	add	w8, w8, w16               // Add dest value
150	add	w8, w8, w11               // Add constant 0xffff5bb1
151	add	w8, w8, w9                // Add aux function result
152	ror	w8, w8, #15               // Rotate left s=17 bits
153	eor	x9, x17, x6               // Begin aux function round 1 F(x,y,z)=(((y^z)&x)^z)
154	add	w8, w17, w8               // Add X parameter round 1 C=FF(C, D, A, B, 0xffff5bb1, s=17, M[10])
155	and	x9, x9, x8                // Continue aux function round 1 F(x,y,z)=(((y^z)&x)^z)
156	eor	x9, x9, x6                // End aux function round 1 F(x,y,z)=(((y^z)&x)^z)
157	movz	x11, #0xd7be             // .Load lower half of constant 0x895cd7be
158	movk	x11, #0x895c, lsl #16    // .Load upper half of constant 0x895cd7be
159	add	w4, w4, w25               // Add dest value
160	add	w4, w4, w11               // Add constant 0x895cd7be
161	add	w9, w4, w9                // Add aux function result
162	ror	w9, w9, #10               // Rotate left s=22 bits
163	eor	x4, x8, x17               // Begin aux function round 1 F(x,y,z)=(((y^z)&x)^z)
164	add	w9, w8, w9                // Add X parameter round 1 B=FF(B, C, D, A, 0x895cd7be, s=22, M[11])
165	ldp	w11, w26, [x1, #48]       // .Load 2 words of input data0 M[12],M[13]
166	ldp	w12, w27, [x1, #56]       // .Load 2 words of input data0 M[14],M[15]
167#ifdef __AARCH64EB__
168	rev	w11, w11
169	rev	w26, w26
170	rev	w12, w12
171	rev	w27, w27
172#endif
173	and	x4, x4, x9                // Continue aux function round 1 F(x,y,z)=(((y^z)&x)^z)
174	eor	x4, x4, x17               // End aux function round 1 F(x,y,z)=(((y^z)&x)^z)
175	movz	x19, #0x1122             // .Load lower half of constant 0x6b901122
176	movk	x19, #0x6b90, lsl #16    // .Load upper half of constant 0x6b901122
177	add	w6, w6, w11               // Add dest value
178	add	w6, w6, w19               // Add constant 0x6b901122
179	add	w4, w6, w4                // Add aux function result
180	ror	w4, w4, #25               // Rotate left s=7 bits
181	eor	x6, x9, x8                // Begin aux function round 1 F(x,y,z)=(((y^z)&x)^z)
182	add	w4, w9, w4                // Add X parameter round 1 A=FF(A, B, C, D, 0x6b901122, s=7, M[12])
183	and	x6, x6, x4                // Continue aux function round 1 F(x,y,z)=(((y^z)&x)^z)
184	eor	x6, x6, x8                // End aux function round 1 F(x,y,z)=(((y^z)&x)^z)
185	movz	x19, #0x7193             // .Load lower half of constant 0xfd987193
186	movk	x19, #0xfd98, lsl #16    // .Load upper half of constant 0xfd987193
187	add	w17, w17, w26             // Add dest value
188	add	w17, w17, w19             // Add constant 0xfd987193
189	add	w17, w17, w6              // Add aux function result
190	ror	w17, w17, #20             // Rotate left s=12 bits
191	eor	x6, x4, x9                // Begin aux function round 1 F(x,y,z)=(((y^z)&x)^z)
192	add	w17, w4, w17              // Add X parameter round 1 D=FF(D, A, B, C, 0xfd987193, s=12, M[13])
193	and	x6, x6, x17               // Continue aux function round 1 F(x,y,z)=(((y^z)&x)^z)
194	eor	x6, x6, x9                // End aux function round 1 F(x,y,z)=(((y^z)&x)^z)
195	movz	x13, #0x438e             // .Load lower half of constant 0xa679438e
196	movk	x13, #0xa679, lsl #16    // .Load upper half of constant 0xa679438e
197	add	w8, w8, w12               // Add dest value
198	add	w8, w8, w13               // Add constant 0xa679438e
199	add	w8, w8, w6                // Add aux function result
200	ror	w8, w8, #15               // Rotate left s=17 bits
201	eor	x6, x17, x4               // Begin aux function round 1 F(x,y,z)=(((y^z)&x)^z)
202	add	w8, w17, w8               // Add X parameter round 1 C=FF(C, D, A, B, 0xa679438e, s=17, M[14])
203	and	x6, x6, x8                // Continue aux function round 1 F(x,y,z)=(((y^z)&x)^z)
204	eor	x6, x6, x4                // End aux function round 1 F(x,y,z)=(((y^z)&x)^z)
205	movz	x13, #0x821              // .Load lower half of constant 0x49b40821
206	movk	x13, #0x49b4, lsl #16    // .Load upper half of constant 0x49b40821
207	add	w9, w9, w27               // Add dest value
208	add	w9, w9, w13               // Add constant 0x49b40821
209	add	w9, w9, w6                // Add aux function result
210	ror	w9, w9, #10               // Rotate left s=22 bits
211	bic	x6, x8, x17               // Aux function round 2 (~z & y)
212	add	w9, w8, w9                // Add X parameter round 1 B=FF(B, C, D, A, 0x49b40821, s=22, M[15])
213	movz	x13, #0x2562             // .Load lower half of constant 0xf61e2562
214	movk	x13, #0xf61e, lsl #16    // .Load upper half of constant 0xf61e2562
215	add	w4, w4, w20               // Add dest value
216	add	w4, w4, w13               // Add constant 0xf61e2562
217	and	x13, x9, x17              // Aux function round 2 (x & z)
218	add	w4, w4, w6                // Add (~z & y)
219	add	w4, w4, w13               // Add (x & z)
220	ror	w4, w4, #27               // Rotate left s=5 bits
221	bic	x6, x9, x8                // Aux function round 2 (~z & y)
222	add	w4, w9, w4                // Add X parameter round 2 A=GG(A, B, C, D, 0xf61e2562, s=5, M[1])
223	movz	x13, #0xb340             // .Load lower half of constant 0xc040b340
224	movk	x13, #0xc040, lsl #16    // .Load upper half of constant 0xc040b340
225	add	w17, w17, w7              // Add dest value
226	add	w17, w17, w13             // Add constant 0xc040b340
227	and	x13, x4, x8               // Aux function round 2 (x & z)
228	add	w17, w17, w6              // Add (~z & y)
229	add	w17, w17, w13             // Add (x & z)
230	ror	w17, w17, #23             // Rotate left s=9 bits
231	bic	x6, x4, x9                // Aux function round 2 (~z & y)
232	add	w17, w4, w17              // Add X parameter round 2 D=GG(D, A, B, C, 0xc040b340, s=9, M[6])
233	movz	x13, #0x5a51             // .Load lower half of constant 0x265e5a51
234	movk	x13, #0x265e, lsl #16    // .Load upper half of constant 0x265e5a51
235	add	w8, w8, w25               // Add dest value
236	add	w8, w8, w13               // Add constant 0x265e5a51
237	and	x13, x17, x9              // Aux function round 2 (x & z)
238	add	w8, w8, w6                // Add (~z & y)
239	add	w8, w8, w13               // Add (x & z)
240	ror	w8, w8, #18               // Rotate left s=14 bits
241	bic	x6, x17, x4               // Aux function round 2 (~z & y)
242	add	w8, w17, w8               // Add X parameter round 2 C=GG(C, D, A, B, 0x265e5a51, s=14, M[11])
243	movz	x13, #0xc7aa             // .Load lower half of constant 0xe9b6c7aa
244	movk	x13, #0xe9b6, lsl #16    // .Load upper half of constant 0xe9b6c7aa
245	add	w9, w9, w15               // Add dest value
246	add	w9, w9, w13               // Add constant 0xe9b6c7aa
247	and	x13, x8, x4               // Aux function round 2 (x & z)
248	add	w9, w9, w6                // Add (~z & y)
249	add	w9, w9, w13               // Add (x & z)
250	ror	w9, w9, #12               // Rotate left s=20 bits
251	bic	x6, x8, x17               // Aux function round 2 (~z & y)
252	add	w9, w8, w9                // Add X parameter round 2 B=GG(B, C, D, A, 0xe9b6c7aa, s=20, M[0])
253	movz	x13, #0x105d             // .Load lower half of constant 0xd62f105d
254	movk	x13, #0xd62f, lsl #16    // .Load upper half of constant 0xd62f105d
255	add	w4, w4, w22               // Add dest value
256	add	w4, w4, w13               // Add constant 0xd62f105d
257	and	x13, x9, x17              // Aux function round 2 (x & z)
258	add	w4, w4, w6                // Add (~z & y)
259	add	w4, w4, w13               // Add (x & z)
260	ror	w4, w4, #27               // Rotate left s=5 bits
261	bic	x6, x9, x8                // Aux function round 2 (~z & y)
262	add	w4, w9, w4                // Add X parameter round 2 A=GG(A, B, C, D, 0xd62f105d, s=5, M[5])
263	movz	x13, #0x1453             // .Load lower half of constant 0x2441453
264	movk	x13, #0x244, lsl #16     // .Load upper half of constant 0x2441453
265	add	w17, w17, w16             // Add dest value
266	add	w17, w17, w13             // Add constant 0x2441453
267	and	x13, x4, x8               // Aux function round 2 (x & z)
268	add	w17, w17, w6              // Add (~z & y)
269	add	w17, w17, w13             // Add (x & z)
270	ror	w17, w17, #23             // Rotate left s=9 bits
271	bic	x6, x4, x9                // Aux function round 2 (~z & y)
272	add	w17, w4, w17              // Add X parameter round 2 D=GG(D, A, B, C, 0x2441453, s=9, M[10])
273	movz	x13, #0xe681             // .Load lower half of constant 0xd8a1e681
274	movk	x13, #0xd8a1, lsl #16    // .Load upper half of constant 0xd8a1e681
275	add	w8, w8, w27               // Add dest value
276	add	w8, w8, w13               // Add constant 0xd8a1e681
277	and	x13, x17, x9              // Aux function round 2 (x & z)
278	add	w8, w8, w6                // Add (~z & y)
279	add	w8, w8, w13               // Add (x & z)
280	ror	w8, w8, #18               // Rotate left s=14 bits
281	bic	x6, x17, x4               // Aux function round 2 (~z & y)
282	add	w8, w17, w8               // Add X parameter round 2 C=GG(C, D, A, B, 0xd8a1e681, s=14, M[15])
283	movz	x13, #0xfbc8             // .Load lower half of constant 0xe7d3fbc8
284	movk	x13, #0xe7d3, lsl #16    // .Load upper half of constant 0xe7d3fbc8
285	add	w9, w9, w14               // Add dest value
286	add	w9, w9, w13               // Add constant 0xe7d3fbc8
287	and	x13, x8, x4               // Aux function round 2 (x & z)
288	add	w9, w9, w6                // Add (~z & y)
289	add	w9, w9, w13               // Add (x & z)
290	ror	w9, w9, #12               // Rotate left s=20 bits
291	bic	x6, x8, x17               // Aux function round 2 (~z & y)
292	add	w9, w8, w9                // Add X parameter round 2 B=GG(B, C, D, A, 0xe7d3fbc8, s=20, M[4])
293	movz	x13, #0xcde6             // .Load lower half of constant 0x21e1cde6
294	movk	x13, #0x21e1, lsl #16    // .Load upper half of constant 0x21e1cde6
295	add	w4, w4, w24               // Add dest value
296	add	w4, w4, w13               // Add constant 0x21e1cde6
297	and	x13, x9, x17              // Aux function round 2 (x & z)
298	add	w4, w4, w6                // Add (~z & y)
299	add	w4, w4, w13               // Add (x & z)
300	ror	w4, w4, #27               // Rotate left s=5 bits
301	bic	x6, x9, x8                // Aux function round 2 (~z & y)
302	add	w4, w9, w4                // Add X parameter round 2 A=GG(A, B, C, D, 0x21e1cde6, s=5, M[9])
303	movz	x13, #0x7d6              // .Load lower half of constant 0xc33707d6
304	movk	x13, #0xc337, lsl #16    // .Load upper half of constant 0xc33707d6
305	add	w17, w17, w12             // Add dest value
306	add	w17, w17, w13             // Add constant 0xc33707d6
307	and	x13, x4, x8               // Aux function round 2 (x & z)
308	add	w17, w17, w6              // Add (~z & y)
309	add	w17, w17, w13             // Add (x & z)
310	ror	w17, w17, #23             // Rotate left s=9 bits
311	bic	x6, x4, x9                // Aux function round 2 (~z & y)
312	add	w17, w4, w17              // Add X parameter round 2 D=GG(D, A, B, C, 0xc33707d6, s=9, M[14])
313	movz	x13, #0xd87              // .Load lower half of constant 0xf4d50d87
314	movk	x13, #0xf4d5, lsl #16    // .Load upper half of constant 0xf4d50d87
315	add	w8, w8, w21               // Add dest value
316	add	w8, w8, w13               // Add constant 0xf4d50d87
317	and	x13, x17, x9              // Aux function round 2 (x & z)
318	add	w8, w8, w6                // Add (~z & y)
319	add	w8, w8, w13               // Add (x & z)
320	ror	w8, w8, #18               // Rotate left s=14 bits
321	bic	x6, x17, x4               // Aux function round 2 (~z & y)
322	add	w8, w17, w8               // Add X parameter round 2 C=GG(C, D, A, B, 0xf4d50d87, s=14, M[3])
323	movz	x13, #0x14ed             // .Load lower half of constant 0x455a14ed
324	movk	x13, #0x455a, lsl #16    // .Load upper half of constant 0x455a14ed
325	add	w9, w9, w5                // Add dest value
326	add	w9, w9, w13               // Add constant 0x455a14ed
327	and	x13, x8, x4               // Aux function round 2 (x & z)
328	add	w9, w9, w6                // Add (~z & y)
329	add	w9, w9, w13               // Add (x & z)
330	ror	w9, w9, #12               // Rotate left s=20 bits
331	bic	x6, x8, x17               // Aux function round 2 (~z & y)
332	add	w9, w8, w9                // Add X parameter round 2 B=GG(B, C, D, A, 0x455a14ed, s=20, M[8])
333	movz	x13, #0xe905             // .Load lower half of constant 0xa9e3e905
334	movk	x13, #0xa9e3, lsl #16    // .Load upper half of constant 0xa9e3e905
335	add	w4, w4, w26               // Add dest value
336	add	w4, w4, w13               // Add constant 0xa9e3e905
337	and	x13, x9, x17              // Aux function round 2 (x & z)
338	add	w4, w4, w6                // Add (~z & y)
339	add	w4, w4, w13               // Add (x & z)
340	ror	w4, w4, #27               // Rotate left s=5 bits
341	bic	x6, x9, x8                // Aux function round 2 (~z & y)
342	add	w4, w9, w4                // Add X parameter round 2 A=GG(A, B, C, D, 0xa9e3e905, s=5, M[13])
343	movz	x13, #0xa3f8             // .Load lower half of constant 0xfcefa3f8
344	movk	x13, #0xfcef, lsl #16    // .Load upper half of constant 0xfcefa3f8
345	add	w17, w17, w3              // Add dest value
346	add	w17, w17, w13             // Add constant 0xfcefa3f8
347	and	x13, x4, x8               // Aux function round 2 (x & z)
348	add	w17, w17, w6              // Add (~z & y)
349	add	w17, w17, w13             // Add (x & z)
350	ror	w17, w17, #23             // Rotate left s=9 bits
351	bic	x6, x4, x9                // Aux function round 2 (~z & y)
352	add	w17, w4, w17              // Add X parameter round 2 D=GG(D, A, B, C, 0xfcefa3f8, s=9, M[2])
353	movz	x13, #0x2d9              // .Load lower half of constant 0x676f02d9
354	movk	x13, #0x676f, lsl #16    // .Load upper half of constant 0x676f02d9
355	add	w8, w8, w23               // Add dest value
356	add	w8, w8, w13               // Add constant 0x676f02d9
357	and	x13, x17, x9              // Aux function round 2 (x & z)
358	add	w8, w8, w6                // Add (~z & y)
359	add	w8, w8, w13               // Add (x & z)
360	ror	w8, w8, #18               // Rotate left s=14 bits
361	bic	x6, x17, x4               // Aux function round 2 (~z & y)
362	add	w8, w17, w8               // Add X parameter round 2 C=GG(C, D, A, B, 0x676f02d9, s=14, M[7])
363	movz	x13, #0x4c8a             // .Load lower half of constant 0x8d2a4c8a
364	movk	x13, #0x8d2a, lsl #16    // .Load upper half of constant 0x8d2a4c8a
365	add	w9, w9, w11               // Add dest value
366	add	w9, w9, w13               // Add constant 0x8d2a4c8a
367	and	x13, x8, x4               // Aux function round 2 (x & z)
368	add	w9, w9, w6                // Add (~z & y)
369	add	w9, w9, w13               // Add (x & z)
370	eor	x6, x8, x17               // Begin aux function round 3 H(x,y,z)=(x^y^z)
371	ror	w9, w9, #12               // Rotate left s=20 bits
372	movz	x10, #0x3942             // .Load lower half of constant 0xfffa3942
373	add	w9, w8, w9                // Add X parameter round 2 B=GG(B, C, D, A, 0x8d2a4c8a, s=20, M[12])
374	movk	x10, #0xfffa, lsl #16    // .Load upper half of constant 0xfffa3942
375	add	w4, w4, w22               // Add dest value
376	eor	x6, x6, x9                // End aux function round 3 H(x,y,z)=(x^y^z)
377	add	w4, w4, w10               // Add constant 0xfffa3942
378	add	w4, w4, w6                // Add aux function result
379	ror	w4, w4, #28               // Rotate left s=4 bits
380	eor	x6, x9, x8                // Begin aux function round 3 H(x,y,z)=(x^y^z)
381	movz	x10, #0xf681             // .Load lower half of constant 0x8771f681
382	add	w4, w9, w4                // Add X parameter round 3 A=HH(A, B, C, D, 0xfffa3942, s=4, M[5])
383	movk	x10, #0x8771, lsl #16    // .Load upper half of constant 0x8771f681
384	add	w17, w17, w5              // Add dest value
385	eor	x6, x6, x4                // End aux function round 3 H(x,y,z)=(x^y^z)
386	add	w17, w17, w10             // Add constant 0x8771f681
387	add	w17, w17, w6              // Add aux function result
388	eor	x6, x4, x9                // Begin aux function round 3 H(x,y,z)=(x^y^z)
389	ror	w17, w17, #21             // Rotate left s=11 bits
390	movz	x13, #0x6122             // .Load lower half of constant 0x6d9d6122
391	add	w17, w4, w17              // Add X parameter round 3 D=HH(D, A, B, C, 0x8771f681, s=11, M[8])
392	movk	x13, #0x6d9d, lsl #16    // .Load upper half of constant 0x6d9d6122
393	add	w8, w8, w25               // Add dest value
394	eor	x6, x6, x17               // End aux function round 3 H(x,y,z)=(x^y^z)
395	add	w8, w8, w13               // Add constant 0x6d9d6122
396	add	w8, w8, w6                // Add aux function result
397	ror	w8, w8, #16               // Rotate left s=16 bits
398	eor	x6, x17, x4               // Begin aux function round 3 H(x,y,z)=(x^y^z)
399	movz	x13, #0x380c             // .Load lower half of constant 0xfde5380c
400	add	w8, w17, w8               // Add X parameter round 3 C=HH(C, D, A, B, 0x6d9d6122, s=16, M[11])
401	movk	x13, #0xfde5, lsl #16    // .Load upper half of constant 0xfde5380c
402	add	w9, w9, w12               // Add dest value
403	eor	x6, x6, x8                // End aux function round 3 H(x,y,z)=(x^y^z)
404	add	w9, w9, w13               // Add constant 0xfde5380c
405	add	w9, w9, w6                // Add aux function result
406	eor	x6, x8, x17               // Begin aux function round 3 H(x,y,z)=(x^y^z)
407	ror	w9, w9, #9                // Rotate left s=23 bits
408	movz	x10, #0xea44             // .Load lower half of constant 0xa4beea44
409	add	w9, w8, w9                // Add X parameter round 3 B=HH(B, C, D, A, 0xfde5380c, s=23, M[14])
410	movk	x10, #0xa4be, lsl #16    // .Load upper half of constant 0xa4beea44
411	add	w4, w4, w20               // Add dest value
412	eor	x6, x6, x9                // End aux function round 3 H(x,y,z)=(x^y^z)
413	add	w4, w4, w10               // Add constant 0xa4beea44
414	add	w4, w4, w6                // Add aux function result
415	ror	w4, w4, #28               // Rotate left s=4 bits
416	eor	x6, x9, x8                // Begin aux function round 3 H(x,y,z)=(x^y^z)
417	movz	x10, #0xcfa9             // .Load lower half of constant 0x4bdecfa9
418	add	w4, w9, w4                // Add X parameter round 3 A=HH(A, B, C, D, 0xa4beea44, s=4, M[1])
419	movk	x10, #0x4bde, lsl #16    // .Load upper half of constant 0x4bdecfa9
420	add	w17, w17, w14             // Add dest value
421	eor	x6, x6, x4                // End aux function round 3 H(x,y,z)=(x^y^z)
422	add	w17, w17, w10             // Add constant 0x4bdecfa9
423	add	w17, w17, w6              // Add aux function result
424	eor	x6, x4, x9                // Begin aux function round 3 H(x,y,z)=(x^y^z)
425	ror	w17, w17, #21             // Rotate left s=11 bits
426	movz	x13, #0x4b60             // .Load lower half of constant 0xf6bb4b60
427	add	w17, w4, w17              // Add X parameter round 3 D=HH(D, A, B, C, 0x4bdecfa9, s=11, M[4])
428	movk	x13, #0xf6bb, lsl #16    // .Load upper half of constant 0xf6bb4b60
429	add	w8, w8, w23               // Add dest value
430	eor	x6, x6, x17               // End aux function round 3 H(x,y,z)=(x^y^z)
431	add	w8, w8, w13               // Add constant 0xf6bb4b60
432	add	w8, w8, w6                // Add aux function result
433	ror	w8, w8, #16               // Rotate left s=16 bits
434	eor	x6, x17, x4               // Begin aux function round 3 H(x,y,z)=(x^y^z)
435	movz	x13, #0xbc70             // .Load lower half of constant 0xbebfbc70
436	add	w8, w17, w8               // Add X parameter round 3 C=HH(C, D, A, B, 0xf6bb4b60, s=16, M[7])
437	movk	x13, #0xbebf, lsl #16    // .Load upper half of constant 0xbebfbc70
438	add	w9, w9, w16               // Add dest value
439	eor	x6, x6, x8                // End aux function round 3 H(x,y,z)=(x^y^z)
440	add	w9, w9, w13               // Add constant 0xbebfbc70
441	add	w9, w9, w6                // Add aux function result
442	eor	x6, x8, x17               // Begin aux function round 3 H(x,y,z)=(x^y^z)
443	ror	w9, w9, #9                // Rotate left s=23 bits
444	movz	x10, #0x7ec6             // .Load lower half of constant 0x289b7ec6
445	add	w9, w8, w9                // Add X parameter round 3 B=HH(B, C, D, A, 0xbebfbc70, s=23, M[10])
446	movk	x10, #0x289b, lsl #16    // .Load upper half of constant 0x289b7ec6
447	add	w4, w4, w26               // Add dest value
448	eor	x6, x6, x9                // End aux function round 3 H(x,y,z)=(x^y^z)
449	add	w4, w4, w10               // Add constant 0x289b7ec6
450	add	w4, w4, w6                // Add aux function result
451	ror	w4, w4, #28               // Rotate left s=4 bits
452	eor	x6, x9, x8                // Begin aux function round 3 H(x,y,z)=(x^y^z)
453	movz	x10, #0x27fa             // .Load lower half of constant 0xeaa127fa
454	add	w4, w9, w4                // Add X parameter round 3 A=HH(A, B, C, D, 0x289b7ec6, s=4, M[13])
455	movk	x10, #0xeaa1, lsl #16    // .Load upper half of constant 0xeaa127fa
456	add	w17, w17, w15             // Add dest value
457	eor	x6, x6, x4                // End aux function round 3 H(x,y,z)=(x^y^z)
458	add	w17, w17, w10             // Add constant 0xeaa127fa
459	add	w17, w17, w6              // Add aux function result
460	eor	x6, x4, x9                // Begin aux function round 3 H(x,y,z)=(x^y^z)
461	ror	w17, w17, #21             // Rotate left s=11 bits
462	movz	x13, #0x3085             // .Load lower half of constant 0xd4ef3085
463	add	w17, w4, w17              // Add X parameter round 3 D=HH(D, A, B, C, 0xeaa127fa, s=11, M[0])
464	movk	x13, #0xd4ef, lsl #16    // .Load upper half of constant 0xd4ef3085
465	add	w8, w8, w21               // Add dest value
466	eor	x6, x6, x17               // End aux function round 3 H(x,y,z)=(x^y^z)
467	add	w8, w8, w13               // Add constant 0xd4ef3085
468	add	w8, w8, w6                // Add aux function result
469	ror	w8, w8, #16               // Rotate left s=16 bits
470	eor	x6, x17, x4               // Begin aux function round 3 H(x,y,z)=(x^y^z)
471	movz	x13, #0x1d05             // .Load lower half of constant 0x4881d05
472	add	w8, w17, w8               // Add X parameter round 3 C=HH(C, D, A, B, 0xd4ef3085, s=16, M[3])
473	movk	x13, #0x488, lsl #16     // .Load upper half of constant 0x4881d05
474	add	w9, w9, w7                // Add dest value
475	eor	x6, x6, x8                // End aux function round 3 H(x,y,z)=(x^y^z)
476	add	w9, w9, w13               // Add constant 0x4881d05
477	add	w9, w9, w6                // Add aux function result
478	eor	x6, x8, x17               // Begin aux function round 3 H(x,y,z)=(x^y^z)
479	ror	w9, w9, #9                // Rotate left s=23 bits
480	movz	x10, #0xd039             // .Load lower half of constant 0xd9d4d039
481	add	w9, w8, w9                // Add X parameter round 3 B=HH(B, C, D, A, 0x4881d05, s=23, M[6])
482	movk	x10, #0xd9d4, lsl #16    // .Load upper half of constant 0xd9d4d039
483	add	w4, w4, w24               // Add dest value
484	eor	x6, x6, x9                // End aux function round 3 H(x,y,z)=(x^y^z)
485	add	w4, w4, w10               // Add constant 0xd9d4d039
486	add	w4, w4, w6                // Add aux function result
487	ror	w4, w4, #28               // Rotate left s=4 bits
488	eor	x6, x9, x8                // Begin aux function round 3 H(x,y,z)=(x^y^z)
489	movz	x10, #0x99e5             // .Load lower half of constant 0xe6db99e5
490	add	w4, w9, w4                // Add X parameter round 3 A=HH(A, B, C, D, 0xd9d4d039, s=4, M[9])
491	movk	x10, #0xe6db, lsl #16    // .Load upper half of constant 0xe6db99e5
492	add	w17, w17, w11             // Add dest value
493	eor	x6, x6, x4                // End aux function round 3 H(x,y,z)=(x^y^z)
494	add	w17, w17, w10             // Add constant 0xe6db99e5
495	add	w17, w17, w6              // Add aux function result
496	eor	x6, x4, x9                // Begin aux function round 3 H(x,y,z)=(x^y^z)
497	ror	w17, w17, #21             // Rotate left s=11 bits
498	movz	x13, #0x7cf8             // .Load lower half of constant 0x1fa27cf8
499	add	w17, w4, w17              // Add X parameter round 3 D=HH(D, A, B, C, 0xe6db99e5, s=11, M[12])
500	movk	x13, #0x1fa2, lsl #16    // .Load upper half of constant 0x1fa27cf8
501	add	w8, w8, w27               // Add dest value
502	eor	x6, x6, x17               // End aux function round 3 H(x,y,z)=(x^y^z)
503	add	w8, w8, w13               // Add constant 0x1fa27cf8
504	add	w8, w8, w6                // Add aux function result
505	ror	w8, w8, #16               // Rotate left s=16 bits
506	eor	x6, x17, x4               // Begin aux function round 3 H(x,y,z)=(x^y^z)
507	movz	x13, #0x5665             // .Load lower half of constant 0xc4ac5665
508	add	w8, w17, w8               // Add X parameter round 3 C=HH(C, D, A, B, 0x1fa27cf8, s=16, M[15])
509	movk	x13, #0xc4ac, lsl #16    // .Load upper half of constant 0xc4ac5665
510	add	w9, w9, w3                // Add dest value
511	eor	x6, x6, x8                // End aux function round 3 H(x,y,z)=(x^y^z)
512	add	w9, w9, w13               // Add constant 0xc4ac5665
513	add	w9, w9, w6                // Add aux function result
514	ror	w9, w9, #9                // Rotate left s=23 bits
515	movz	x6, #0x2244              // .Load lower half of constant 0xf4292244
516	movk	x6, #0xf429, lsl #16     // .Load upper half of constant 0xf4292244
517	add	w9, w8, w9                // Add X parameter round 3 B=HH(B, C, D, A, 0xc4ac5665, s=23, M[2])
518	add	w4, w4, w15               // Add dest value
519	orn	x13, x9, x17              // Begin aux function round 4 I(x,y,z)=((~z|x)^y)
520	add	w4, w4, w6                // Add constant 0xf4292244
521	eor	x6, x8, x13               // End aux function round 4 I(x,y,z)=((~z|x)^y)
522	add	w4, w4, w6                // Add aux function result
523	ror	w4, w4, #26               // Rotate left s=6 bits
524	movz	x6, #0xff97              // .Load lower half of constant 0x432aff97
525	movk	x6, #0x432a, lsl #16     // .Load upper half of constant 0x432aff97
526	add	w4, w9, w4                // Add X parameter round 4 A=II(A, B, C, D, 0xf4292244, s=6, M[0])
527	orn	x10, x4, x8               // Begin aux function round 4 I(x,y,z)=((~z|x)^y)
528	add	w17, w17, w23             // Add dest value
529	eor	x10, x9, x10              // End aux function round 4 I(x,y,z)=((~z|x)^y)
530	add	w17, w17, w6              // Add constant 0x432aff97
531	add	w6, w17, w10              // Add aux function result
532	ror	w6, w6, #22               // Rotate left s=10 bits
533	movz	x17, #0x23a7             // .Load lower half of constant 0xab9423a7
534	movk	x17, #0xab94, lsl #16    // .Load upper half of constant 0xab9423a7
535	add	w6, w4, w6                // Add X parameter round 4 D=II(D, A, B, C, 0x432aff97, s=10, M[7])
536	add	w8, w8, w12               // Add dest value
537	orn	x10, x6, x9               // Begin aux function round 4 I(x,y,z)=((~z|x)^y)
538	add	w8, w8, w17               // Add constant 0xab9423a7
539	eor	x17, x4, x10              // End aux function round 4 I(x,y,z)=((~z|x)^y)
540	add	w8, w8, w17               // Add aux function result
541	ror	w8, w8, #17               // Rotate left s=15 bits
542	movz	x17, #0xa039             // .Load lower half of constant 0xfc93a039
543	movk	x17, #0xfc93, lsl #16    // .Load upper half of constant 0xfc93a039
544	add	w8, w6, w8                // Add X parameter round 4 C=II(C, D, A, B, 0xab9423a7, s=15, M[14])
545	orn	x13, x8, x4               // Begin aux function round 4 I(x,y,z)=((~z|x)^y)
546	add	w9, w9, w22               // Add dest value
547	eor	x13, x6, x13              // End aux function round 4 I(x,y,z)=((~z|x)^y)
548	add	w9, w9, w17               // Add constant 0xfc93a039
549	add	w17, w9, w13              // Add aux function result
550	ror	w17, w17, #11             // Rotate left s=21 bits
551	movz	x9, #0x59c3              // .Load lower half of constant 0x655b59c3
552	movk	x9, #0x655b, lsl #16     // .Load upper half of constant 0x655b59c3
553	add	w17, w8, w17              // Add X parameter round 4 B=II(B, C, D, A, 0xfc93a039, s=21, M[5])
554	add	w4, w4, w11               // Add dest value
555	orn	x13, x17, x6              // Begin aux function round 4 I(x,y,z)=((~z|x)^y)
556	add	w9, w4, w9                // Add constant 0x655b59c3
557	eor	x4, x8, x13               // End aux function round 4 I(x,y,z)=((~z|x)^y)
558	add	w9, w9, w4                // Add aux function result
559	ror	w9, w9, #26               // Rotate left s=6 bits
560	movz	x4, #0xcc92              // .Load lower half of constant 0x8f0ccc92
561	movk	x4, #0x8f0c, lsl #16     // .Load upper half of constant 0x8f0ccc92
562	add	w9, w17, w9               // Add X parameter round 4 A=II(A, B, C, D, 0x655b59c3, s=6, M[12])
563	orn	x10, x9, x8               // Begin aux function round 4 I(x,y,z)=((~z|x)^y)
564	add	w6, w6, w21               // Add dest value
565	eor	x10, x17, x10             // End aux function round 4 I(x,y,z)=((~z|x)^y)
566	add	w4, w6, w4                // Add constant 0x8f0ccc92
567	add	w6, w4, w10               // Add aux function result
568	ror	w6, w6, #22               // Rotate left s=10 bits
569	movz	x4, #0xf47d              // .Load lower half of constant 0xffeff47d
570	movk	x4, #0xffef, lsl #16     // .Load upper half of constant 0xffeff47d
571	add	w6, w9, w6                // Add X parameter round 4 D=II(D, A, B, C, 0x8f0ccc92, s=10, M[3])
572	add	w8, w8, w16               // Add dest value
573	orn	x10, x6, x17              // Begin aux function round 4 I(x,y,z)=((~z|x)^y)
574	add	w8, w8, w4                // Add constant 0xffeff47d
575	eor	x4, x9, x10               // End aux function round 4 I(x,y,z)=((~z|x)^y)
576	add	w8, w8, w4                // Add aux function result
577	ror	w8, w8, #17               // Rotate left s=15 bits
578	movz	x4, #0x5dd1              // .Load lower half of constant 0x85845dd1
579	movk	x4, #0x8584, lsl #16     // .Load upper half of constant 0x85845dd1
580	add	w8, w6, w8                // Add X parameter round 4 C=II(C, D, A, B, 0xffeff47d, s=15, M[10])
581	orn	x10, x8, x9               // Begin aux function round 4 I(x,y,z)=((~z|x)^y)
582	add	w15, w17, w20             // Add dest value
583	eor	x17, x6, x10              // End aux function round 4 I(x,y,z)=((~z|x)^y)
584	add	w15, w15, w4              // Add constant 0x85845dd1
585	add	w4, w15, w17              // Add aux function result
586	ror	w4, w4, #11               // Rotate left s=21 bits
587	movz	x15, #0x7e4f             // .Load lower half of constant 0x6fa87e4f
588	movk	x15, #0x6fa8, lsl #16    // .Load upper half of constant 0x6fa87e4f
589	add	w17, w8, w4               // Add X parameter round 4 B=II(B, C, D, A, 0x85845dd1, s=21, M[1])
590	add	w4, w9, w5                // Add dest value
591	orn	x9, x17, x6               // Begin aux function round 4 I(x,y,z)=((~z|x)^y)
592	add	w15, w4, w15              // Add constant 0x6fa87e4f
593	eor	x4, x8, x9                // End aux function round 4 I(x,y,z)=((~z|x)^y)
594	add	w9, w15, w4               // Add aux function result
595	ror	w9, w9, #26               // Rotate left s=6 bits
596	movz	x15, #0xe6e0             // .Load lower half of constant 0xfe2ce6e0
597	movk	x15, #0xfe2c, lsl #16    // .Load upper half of constant 0xfe2ce6e0
598	add	w4, w17, w9               // Add X parameter round 4 A=II(A, B, C, D, 0x6fa87e4f, s=6, M[8])
599	orn	x9, x4, x8                // Begin aux function round 4 I(x,y,z)=((~z|x)^y)
600	add	w6, w6, w27               // Add dest value
601	eor	x9, x17, x9               // End aux function round 4 I(x,y,z)=((~z|x)^y)
602	add	w15, w6, w15              // Add constant 0xfe2ce6e0
603	add	w6, w15, w9               // Add aux function result
604	ror	w6, w6, #22               // Rotate left s=10 bits
605	movz	x9, #0x4314              // .Load lower half of constant 0xa3014314
606	movk	x9, #0xa301, lsl #16     // .Load upper half of constant 0xa3014314
607	add	w15, w4, w6               // Add X parameter round 4 D=II(D, A, B, C, 0xfe2ce6e0, s=10, M[15])
608	add	w6, w8, w7                // Add dest value
609	orn	x7, x15, x17              // Begin aux function round 4 I(x,y,z)=((~z|x)^y)
610	add	w8, w6, w9                // Add constant 0xa3014314
611	eor	x9, x4, x7                // End aux function round 4 I(x,y,z)=((~z|x)^y)
612	add	w6, w8, w9                // Add aux function result
613	ror	w6, w6, #17               // Rotate left s=15 bits
614	movz	x7, #0x11a1              // .Load lower half of constant 0x4e0811a1
615	movk	x7, #0x4e08, lsl #16     // .Load upper half of constant 0x4e0811a1
616	add	w8, w15, w6               // Add X parameter round 4 C=II(C, D, A, B, 0xa3014314, s=15, M[6])
617	orn	x9, x8, x4                // Begin aux function round 4 I(x,y,z)=((~z|x)^y)
618	add	w6, w17, w26              // Add dest value
619	eor	x17, x15, x9              // End aux function round 4 I(x,y,z)=((~z|x)^y)
620	add	w9, w6, w7                // Add constant 0x4e0811a1
621	add	w7, w9, w17               // Add aux function result
622	ror	w7, w7, #11               // Rotate left s=21 bits
623	movz	x6, #0x7e82              // .Load lower half of constant 0xf7537e82
624	movk	x6, #0xf753, lsl #16     // .Load upper half of constant 0xf7537e82
625	add	w9, w8, w7                // Add X parameter round 4 B=II(B, C, D, A, 0x4e0811a1, s=21, M[13])
626	add	w17, w4, w14              // Add dest value
627	orn	x7, x9, x15               // Begin aux function round 4 I(x,y,z)=((~z|x)^y)
628	add	w14, w17, w6              // Add constant 0xf7537e82
629	eor	x4, x8, x7                // End aux function round 4 I(x,y,z)=((~z|x)^y)
630	add	w17, w14, w4              // Add aux function result
631	ror	w17, w17, #26             // Rotate left s=6 bits
632	movz	x6, #0xf235              // .Load lower half of constant 0xbd3af235
633	movk	x6, #0xbd3a, lsl #16     // .Load upper half of constant 0xbd3af235
634	add	w7, w9, w17               // Add X parameter round 4 A=II(A, B, C, D, 0xf7537e82, s=6, M[4])
635	orn	x14, x7, x8               // Begin aux function round 4 I(x,y,z)=((~z|x)^y)
636	add	w4, w15, w25              // Add dest value
637	eor	x17, x9, x14              // End aux function round 4 I(x,y,z)=((~z|x)^y)
638	add	w15, w4, w6               // Add constant 0xbd3af235
639	add	w16, w15, w17             // Add aux function result
640	ror	w16, w16, #22             // Rotate left s=10 bits
641	movz	x14, #0xd2bb             // .Load lower half of constant 0x2ad7d2bb
642	movk	x14, #0x2ad7, lsl #16    // .Load upper half of constant 0x2ad7d2bb
643	add	w4, w7, w16               // Add X parameter round 4 D=II(D, A, B, C, 0xbd3af235, s=10, M[11])
644	add	w6, w8, w3                // Add dest value
645	orn	x15, x4, x9               // Begin aux function round 4 I(x,y,z)=((~z|x)^y)
646	add	w17, w6, w14              // Add constant 0x2ad7d2bb
647	eor	x16, x7, x15              // End aux function round 4 I(x,y,z)=((~z|x)^y)
648	add	w8, w17, w16              // Add aux function result
649	ror	w8, w8, #17               // Rotate left s=15 bits
650	movz	x3, #0xd391              // .Load lower half of constant 0xeb86d391
651	movk	x3, #0xeb86, lsl #16     // .Load upper half of constant 0xeb86d391
652	add	w14, w4, w8               // Add X parameter round 4 C=II(C, D, A, B, 0x2ad7d2bb, s=15, M[2])
653	orn	x6, x14, x7               // Begin aux function round 4 I(x,y,z)=((~z|x)^y)
654	add	w15, w9, w24              // Add dest value
655	eor	x17, x4, x6               // End aux function round 4 I(x,y,z)=((~z|x)^y)
656	add	w16, w15, w3              // Add constant 0xeb86d391
657	add	w8, w16, w17              // Add aux function result
658	ror	w8, w8, #11               // Rotate left s=21 bits
659	ldp	w6, w15, [x0]             // Reload MD5 state->A and state->B
660	ldp	w5, w9, [x0, #8]          // Reload MD5 state->C and state->D
661	add	w3, w14, w8               // Add X parameter round 4 B=II(B, C, D, A, 0xeb86d391, s=21, M[9])
662	add	w13, w4, w9               // Add result of MD5 rounds to state->D
663	add	w12, w14, w5              // Add result of MD5 rounds to state->C
664	add	w10, w7, w6               // Add result of MD5 rounds to state->A
665	add	w11, w3, w15              // Add result of MD5 rounds to state->B
666	stp	w12, w13, [x0, #8]        // Store MD5 states C,D
667	stp	w10, w11, [x0]            // Store MD5 states A,B
668	add	x1, x1, #64               // Increment data pointer
669	subs	w2, w2, #1               // Decrement block counter
670	b.ne	ossl_md5_blocks_loop
671
672	ldp	x21,x22,[sp,#16]
673	ldp	x23,x24,[sp,#32]
674	ldp	x25,x26,[sp,#48]
675	ldp	x27,x28,[sp,#64]
676	ldp	x19,x20,[sp],#80
677	ret
678
679