1 #include "arm_arch.h"
2 
3 #if defined(__thumb2__)
4 .syntax	unified
5 .thumb
6 #else
7 .code	32
8 #endif
9 
10 .text
11 
12 .globl	sha1_block_data_order
13 .type	sha1_block_data_order,%function
14 
15 .align	5
16 sha1_block_data_order:
17 #if __ARM_MAX_ARCH__>=7
18 .Lsha1_block:
19 	ldr	r12,.LOPENSSL_armcap
20 # if !defined(_WIN32)
21 	adr	r3,.Lsha1_block
22 	ldr	r12,[r3,r12]		@ OPENSSL_armcap_P
23 # endif
24 # if defined(__APPLE__) || defined(_WIN32)
25 	ldr	r12,[r12]
26 # endif
27 	tst	r12,#ARMV8_SHA1
28 	bne	.LARMv8
29 	tst	r12,#ARMV7_NEON
30 	bne	.LNEON
31 #endif
32 	stmdb	sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr}
33 	add	r2,r1,r2,lsl#6	@ r2 to point at the end of r1
34 	ldmia	r0,{r3,r4,r5,r6,r7}
35 .Lloop:
36 	ldr	r8,.LK_00_19
37 	mov	r14,sp
38 	sub	sp,sp,#15*4
39 	mov	r5,r5,ror#30
40 	mov	r6,r6,ror#30
41 	mov	r7,r7,ror#30		@ [6]
42 .L_00_15:
43 #if __ARM_ARCH__<7
44 	ldrb	r10,[r1,#2]
45 	ldrb	r9,[r1,#3]
46 	ldrb	r11,[r1,#1]
47 	add	r7,r8,r7,ror#2			@ E+=K_00_19
48 	ldrb	r12,[r1],#4
49 	orr	r9,r9,r10,lsl#8
50 	eor	r10,r5,r6			@ F_xx_xx
51 	orr	r9,r9,r11,lsl#16
52 	add	r7,r7,r3,ror#27			@ E+=ROR(A,27)
53 	orr	r9,r9,r12,lsl#24
54 #else
55 	ldr	r9,[r1],#4			@ handles unaligned
56 	add	r7,r8,r7,ror#2			@ E+=K_00_19
57 	eor	r10,r5,r6			@ F_xx_xx
58 	add	r7,r7,r3,ror#27			@ E+=ROR(A,27)
59 #ifdef __ARMEL__
60 	rev	r9,r9				@ byte swap
61 #endif
62 #endif
63 	and	r10,r4,r10,ror#2
64 	add	r7,r7,r9			@ E+=X[i]
65 	eor	r10,r10,r6,ror#2		@ F_00_19(B,C,D)
66 	str	r9,[r14,#-4]!
67 	add	r7,r7,r10			@ E+=F_00_19(B,C,D)
68 #if __ARM_ARCH__<7
69 	ldrb	r10,[r1,#2]
70 	ldrb	r9,[r1,#3]
71 	ldrb	r11,[r1,#1]
72 	add	r6,r8,r6,ror#2			@ E+=K_00_19
73 	ldrb	r12,[r1],#4
74 	orr	r9,r9,r10,lsl#8
75 	eor	r10,r4,r5			@ F_xx_xx
76 	orr	r9,r9,r11,lsl#16
77 	add	r6,r6,r7,ror#27			@ E+=ROR(A,27)
78 	orr	r9,r9,r12,lsl#24
79 #else
80 	ldr	r9,[r1],#4			@ handles unaligned
81 	add	r6,r8,r6,ror#2			@ E+=K_00_19
82 	eor	r10,r4,r5			@ F_xx_xx
83 	add	r6,r6,r7,ror#27			@ E+=ROR(A,27)
84 #ifdef __ARMEL__
85 	rev	r9,r9				@ byte swap
86 #endif
87 #endif
88 	and	r10,r3,r10,ror#2
89 	add	r6,r6,r9			@ E+=X[i]
90 	eor	r10,r10,r5,ror#2		@ F_00_19(B,C,D)
91 	str	r9,[r14,#-4]!
92 	add	r6,r6,r10			@ E+=F_00_19(B,C,D)
93 #if __ARM_ARCH__<7
94 	ldrb	r10,[r1,#2]
95 	ldrb	r9,[r1,#3]
96 	ldrb	r11,[r1,#1]
97 	add	r5,r8,r5,ror#2			@ E+=K_00_19
98 	ldrb	r12,[r1],#4
99 	orr	r9,r9,r10,lsl#8
100 	eor	r10,r3,r4			@ F_xx_xx
101 	orr	r9,r9,r11,lsl#16
102 	add	r5,r5,r6,ror#27			@ E+=ROR(A,27)
103 	orr	r9,r9,r12,lsl#24
104 #else
105 	ldr	r9,[r1],#4			@ handles unaligned
106 	add	r5,r8,r5,ror#2			@ E+=K_00_19
107 	eor	r10,r3,r4			@ F_xx_xx
108 	add	r5,r5,r6,ror#27			@ E+=ROR(A,27)
109 #ifdef __ARMEL__
110 	rev	r9,r9				@ byte swap
111 #endif
112 #endif
113 	and	r10,r7,r10,ror#2
114 	add	r5,r5,r9			@ E+=X[i]
115 	eor	r10,r10,r4,ror#2		@ F_00_19(B,C,D)
116 	str	r9,[r14,#-4]!
117 	add	r5,r5,r10			@ E+=F_00_19(B,C,D)
118 #if __ARM_ARCH__<7
119 	ldrb	r10,[r1,#2]
120 	ldrb	r9,[r1,#3]
121 	ldrb	r11,[r1,#1]
122 	add	r4,r8,r4,ror#2			@ E+=K_00_19
123 	ldrb	r12,[r1],#4
124 	orr	r9,r9,r10,lsl#8
125 	eor	r10,r7,r3			@ F_xx_xx
126 	orr	r9,r9,r11,lsl#16
127 	add	r4,r4,r5,ror#27			@ E+=ROR(A,27)
128 	orr	r9,r9,r12,lsl#24
129 #else
130 	ldr	r9,[r1],#4			@ handles unaligned
131 	add	r4,r8,r4,ror#2			@ E+=K_00_19
132 	eor	r10,r7,r3			@ F_xx_xx
133 	add	r4,r4,r5,ror#27			@ E+=ROR(A,27)
134 #ifdef __ARMEL__
135 	rev	r9,r9				@ byte swap
136 #endif
137 #endif
138 	and	r10,r6,r10,ror#2
139 	add	r4,r4,r9			@ E+=X[i]
140 	eor	r10,r10,r3,ror#2		@ F_00_19(B,C,D)
141 	str	r9,[r14,#-4]!
142 	add	r4,r4,r10			@ E+=F_00_19(B,C,D)
143 #if __ARM_ARCH__<7
144 	ldrb	r10,[r1,#2]
145 	ldrb	r9,[r1,#3]
146 	ldrb	r11,[r1,#1]
147 	add	r3,r8,r3,ror#2			@ E+=K_00_19
148 	ldrb	r12,[r1],#4
149 	orr	r9,r9,r10,lsl#8
150 	eor	r10,r6,r7			@ F_xx_xx
151 	orr	r9,r9,r11,lsl#16
152 	add	r3,r3,r4,ror#27			@ E+=ROR(A,27)
153 	orr	r9,r9,r12,lsl#24
154 #else
155 	ldr	r9,[r1],#4			@ handles unaligned
156 	add	r3,r8,r3,ror#2			@ E+=K_00_19
157 	eor	r10,r6,r7			@ F_xx_xx
158 	add	r3,r3,r4,ror#27			@ E+=ROR(A,27)
159 #ifdef __ARMEL__
160 	rev	r9,r9				@ byte swap
161 #endif
162 #endif
163 	and	r10,r5,r10,ror#2
164 	add	r3,r3,r9			@ E+=X[i]
165 	eor	r10,r10,r7,ror#2		@ F_00_19(B,C,D)
166 	str	r9,[r14,#-4]!
167 	add	r3,r3,r10			@ E+=F_00_19(B,C,D)
168 #if defined(__thumb2__)
169 	mov	r12,sp
170 	teq	r14,r12
171 #else
172 	teq	r14,sp
173 #endif
174 	bne	.L_00_15		@ [((11+4)*5+2)*3]
175 	sub	sp,sp,#25*4
176 #if __ARM_ARCH__<7
177 	ldrb	r10,[r1,#2]
178 	ldrb	r9,[r1,#3]
179 	ldrb	r11,[r1,#1]
180 	add	r7,r8,r7,ror#2			@ E+=K_00_19
181 	ldrb	r12,[r1],#4
182 	orr	r9,r9,r10,lsl#8
183 	eor	r10,r5,r6			@ F_xx_xx
184 	orr	r9,r9,r11,lsl#16
185 	add	r7,r7,r3,ror#27			@ E+=ROR(A,27)
186 	orr	r9,r9,r12,lsl#24
187 #else
188 	ldr	r9,[r1],#4			@ handles unaligned
189 	add	r7,r8,r7,ror#2			@ E+=K_00_19
190 	eor	r10,r5,r6			@ F_xx_xx
191 	add	r7,r7,r3,ror#27			@ E+=ROR(A,27)
192 #ifdef __ARMEL__
193 	rev	r9,r9				@ byte swap
194 #endif
195 #endif
196 	and	r10,r4,r10,ror#2
197 	add	r7,r7,r9			@ E+=X[i]
198 	eor	r10,r10,r6,ror#2		@ F_00_19(B,C,D)
199 	str	r9,[r14,#-4]!
200 	add	r7,r7,r10			@ E+=F_00_19(B,C,D)
201 	ldr	r9,[r14,#15*4]
202 	ldr	r10,[r14,#13*4]
203 	ldr	r11,[r14,#7*4]
204 	add	r6,r8,r6,ror#2			@ E+=K_xx_xx
205 	ldr	r12,[r14,#2*4]
206 	eor	r9,r9,r10
207 	eor	r11,r11,r12			@ 1 cycle stall
208 	eor	r10,r4,r5			@ F_xx_xx
209 	mov	r9,r9,ror#31
210 	add	r6,r6,r7,ror#27			@ E+=ROR(A,27)
211 	eor	r9,r9,r11,ror#31
212 	str	r9,[r14,#-4]!
213 	and	r10,r3,r10,ror#2					@ F_xx_xx
214 						@ F_xx_xx
215 	add	r6,r6,r9			@ E+=X[i]
216 	eor	r10,r10,r5,ror#2		@ F_00_19(B,C,D)
217 	add	r6,r6,r10			@ E+=F_00_19(B,C,D)
218 	ldr	r9,[r14,#15*4]
219 	ldr	r10,[r14,#13*4]
220 	ldr	r11,[r14,#7*4]
221 	add	r5,r8,r5,ror#2			@ E+=K_xx_xx
222 	ldr	r12,[r14,#2*4]
223 	eor	r9,r9,r10
224 	eor	r11,r11,r12			@ 1 cycle stall
225 	eor	r10,r3,r4			@ F_xx_xx
226 	mov	r9,r9,ror#31
227 	add	r5,r5,r6,ror#27			@ E+=ROR(A,27)
228 	eor	r9,r9,r11,ror#31
229 	str	r9,[r14,#-4]!
230 	and	r10,r7,r10,ror#2					@ F_xx_xx
231 						@ F_xx_xx
232 	add	r5,r5,r9			@ E+=X[i]
233 	eor	r10,r10,r4,ror#2		@ F_00_19(B,C,D)
234 	add	r5,r5,r10			@ E+=F_00_19(B,C,D)
235 	ldr	r9,[r14,#15*4]
236 	ldr	r10,[r14,#13*4]
237 	ldr	r11,[r14,#7*4]
238 	add	r4,r8,r4,ror#2			@ E+=K_xx_xx
239 	ldr	r12,[r14,#2*4]
240 	eor	r9,r9,r10
241 	eor	r11,r11,r12			@ 1 cycle stall
242 	eor	r10,r7,r3			@ F_xx_xx
243 	mov	r9,r9,ror#31
244 	add	r4,r4,r5,ror#27			@ E+=ROR(A,27)
245 	eor	r9,r9,r11,ror#31
246 	str	r9,[r14,#-4]!
247 	and	r10,r6,r10,ror#2					@ F_xx_xx
248 						@ F_xx_xx
249 	add	r4,r4,r9			@ E+=X[i]
250 	eor	r10,r10,r3,ror#2		@ F_00_19(B,C,D)
251 	add	r4,r4,r10			@ E+=F_00_19(B,C,D)
252 	ldr	r9,[r14,#15*4]
253 	ldr	r10,[r14,#13*4]
254 	ldr	r11,[r14,#7*4]
255 	add	r3,r8,r3,ror#2			@ E+=K_xx_xx
256 	ldr	r12,[r14,#2*4]
257 	eor	r9,r9,r10
258 	eor	r11,r11,r12			@ 1 cycle stall
259 	eor	r10,r6,r7			@ F_xx_xx
260 	mov	r9,r9,ror#31
261 	add	r3,r3,r4,ror#27			@ E+=ROR(A,27)
262 	eor	r9,r9,r11,ror#31
263 	str	r9,[r14,#-4]!
264 	and	r10,r5,r10,ror#2					@ F_xx_xx
265 						@ F_xx_xx
266 	add	r3,r3,r9			@ E+=X[i]
267 	eor	r10,r10,r7,ror#2		@ F_00_19(B,C,D)
268 	add	r3,r3,r10			@ E+=F_00_19(B,C,D)
269 
270 	ldr	r8,.LK_20_39		@ [+15+16*4]
271 	cmn	sp,#0			@ [+3], clear carry to denote 20_39
272 .L_20_39_or_60_79:
273 	ldr	r9,[r14,#15*4]
274 	ldr	r10,[r14,#13*4]
275 	ldr	r11,[r14,#7*4]
276 	add	r7,r8,r7,ror#2			@ E+=K_xx_xx
277 	ldr	r12,[r14,#2*4]
278 	eor	r9,r9,r10
279 	eor	r11,r11,r12			@ 1 cycle stall
280 	eor	r10,r5,r6			@ F_xx_xx
281 	mov	r9,r9,ror#31
282 	add	r7,r7,r3,ror#27			@ E+=ROR(A,27)
283 	eor	r9,r9,r11,ror#31
284 	str	r9,[r14,#-4]!
285 	eor	r10,r4,r10,ror#2					@ F_xx_xx
286 						@ F_xx_xx
287 	add	r7,r7,r9			@ E+=X[i]
288 	add	r7,r7,r10			@ E+=F_20_39(B,C,D)
289 	ldr	r9,[r14,#15*4]
290 	ldr	r10,[r14,#13*4]
291 	ldr	r11,[r14,#7*4]
292 	add	r6,r8,r6,ror#2			@ E+=K_xx_xx
293 	ldr	r12,[r14,#2*4]
294 	eor	r9,r9,r10
295 	eor	r11,r11,r12			@ 1 cycle stall
296 	eor	r10,r4,r5			@ F_xx_xx
297 	mov	r9,r9,ror#31
298 	add	r6,r6,r7,ror#27			@ E+=ROR(A,27)
299 	eor	r9,r9,r11,ror#31
300 	str	r9,[r14,#-4]!
301 	eor	r10,r3,r10,ror#2					@ F_xx_xx
302 						@ F_xx_xx
303 	add	r6,r6,r9			@ E+=X[i]
304 	add	r6,r6,r10			@ E+=F_20_39(B,C,D)
305 	ldr	r9,[r14,#15*4]
306 	ldr	r10,[r14,#13*4]
307 	ldr	r11,[r14,#7*4]
308 	add	r5,r8,r5,ror#2			@ E+=K_xx_xx
309 	ldr	r12,[r14,#2*4]
310 	eor	r9,r9,r10
311 	eor	r11,r11,r12			@ 1 cycle stall
312 	eor	r10,r3,r4			@ F_xx_xx
313 	mov	r9,r9,ror#31
314 	add	r5,r5,r6,ror#27			@ E+=ROR(A,27)
315 	eor	r9,r9,r11,ror#31
316 	str	r9,[r14,#-4]!
317 	eor	r10,r7,r10,ror#2					@ F_xx_xx
318 						@ F_xx_xx
319 	add	r5,r5,r9			@ E+=X[i]
320 	add	r5,r5,r10			@ E+=F_20_39(B,C,D)
321 	ldr	r9,[r14,#15*4]
322 	ldr	r10,[r14,#13*4]
323 	ldr	r11,[r14,#7*4]
324 	add	r4,r8,r4,ror#2			@ E+=K_xx_xx
325 	ldr	r12,[r14,#2*4]
326 	eor	r9,r9,r10
327 	eor	r11,r11,r12			@ 1 cycle stall
328 	eor	r10,r7,r3			@ F_xx_xx
329 	mov	r9,r9,ror#31
330 	add	r4,r4,r5,ror#27			@ E+=ROR(A,27)
331 	eor	r9,r9,r11,ror#31
332 	str	r9,[r14,#-4]!
333 	eor	r10,r6,r10,ror#2					@ F_xx_xx
334 						@ F_xx_xx
335 	add	r4,r4,r9			@ E+=X[i]
336 	add	r4,r4,r10			@ E+=F_20_39(B,C,D)
337 	ldr	r9,[r14,#15*4]
338 	ldr	r10,[r14,#13*4]
339 	ldr	r11,[r14,#7*4]
340 	add	r3,r8,r3,ror#2			@ E+=K_xx_xx
341 	ldr	r12,[r14,#2*4]
342 	eor	r9,r9,r10
343 	eor	r11,r11,r12			@ 1 cycle stall
344 	eor	r10,r6,r7			@ F_xx_xx
345 	mov	r9,r9,ror#31
346 	add	r3,r3,r4,ror#27			@ E+=ROR(A,27)
347 	eor	r9,r9,r11,ror#31
348 	str	r9,[r14,#-4]!
349 	eor	r10,r5,r10,ror#2					@ F_xx_xx
350 						@ F_xx_xx
351 	add	r3,r3,r9			@ E+=X[i]
352 	add	r3,r3,r10			@ E+=F_20_39(B,C,D)
353 #if defined(__thumb2__)
354 	mov	r12,sp
355 	teq	r14,r12
356 #else
357 	teq	r14,sp			@ preserve carry
358 #endif
359 	bne	.L_20_39_or_60_79	@ [+((12+3)*5+2)*4]
360 	bcs	.L_done			@ [+((12+3)*5+2)*4], spare 300 bytes
361 
362 	ldr	r8,.LK_40_59
363 	sub	sp,sp,#20*4		@ [+2]
364 .L_40_59:
365 	ldr	r9,[r14,#15*4]
366 	ldr	r10,[r14,#13*4]
367 	ldr	r11,[r14,#7*4]
368 	add	r7,r8,r7,ror#2			@ E+=K_xx_xx
369 	ldr	r12,[r14,#2*4]
370 	eor	r9,r9,r10
371 	eor	r11,r11,r12			@ 1 cycle stall
372 	eor	r10,r5,r6			@ F_xx_xx
373 	mov	r9,r9,ror#31
374 	add	r7,r7,r3,ror#27			@ E+=ROR(A,27)
375 	eor	r9,r9,r11,ror#31
376 	str	r9,[r14,#-4]!
377 	and	r10,r4,r10,ror#2					@ F_xx_xx
378 	and	r11,r5,r6					@ F_xx_xx
379 	add	r7,r7,r9			@ E+=X[i]
380 	add	r7,r7,r10			@ E+=F_40_59(B,C,D)
381 	add	r7,r7,r11,ror#2
382 	ldr	r9,[r14,#15*4]
383 	ldr	r10,[r14,#13*4]
384 	ldr	r11,[r14,#7*4]
385 	add	r6,r8,r6,ror#2			@ E+=K_xx_xx
386 	ldr	r12,[r14,#2*4]
387 	eor	r9,r9,r10
388 	eor	r11,r11,r12			@ 1 cycle stall
389 	eor	r10,r4,r5			@ F_xx_xx
390 	mov	r9,r9,ror#31
391 	add	r6,r6,r7,ror#27			@ E+=ROR(A,27)
392 	eor	r9,r9,r11,ror#31
393 	str	r9,[r14,#-4]!
394 	and	r10,r3,r10,ror#2					@ F_xx_xx
395 	and	r11,r4,r5					@ F_xx_xx
396 	add	r6,r6,r9			@ E+=X[i]
397 	add	r6,r6,r10			@ E+=F_40_59(B,C,D)
398 	add	r6,r6,r11,ror#2
399 	ldr	r9,[r14,#15*4]
400 	ldr	r10,[r14,#13*4]
401 	ldr	r11,[r14,#7*4]
402 	add	r5,r8,r5,ror#2			@ E+=K_xx_xx
403 	ldr	r12,[r14,#2*4]
404 	eor	r9,r9,r10
405 	eor	r11,r11,r12			@ 1 cycle stall
406 	eor	r10,r3,r4			@ F_xx_xx
407 	mov	r9,r9,ror#31
408 	add	r5,r5,r6,ror#27			@ E+=ROR(A,27)
409 	eor	r9,r9,r11,ror#31
410 	str	r9,[r14,#-4]!
411 	and	r10,r7,r10,ror#2					@ F_xx_xx
412 	and	r11,r3,r4					@ F_xx_xx
413 	add	r5,r5,r9			@ E+=X[i]
414 	add	r5,r5,r10			@ E+=F_40_59(B,C,D)
415 	add	r5,r5,r11,ror#2
416 	ldr	r9,[r14,#15*4]
417 	ldr	r10,[r14,#13*4]
418 	ldr	r11,[r14,#7*4]
419 	add	r4,r8,r4,ror#2			@ E+=K_xx_xx
420 	ldr	r12,[r14,#2*4]
421 	eor	r9,r9,r10
422 	eor	r11,r11,r12			@ 1 cycle stall
423 	eor	r10,r7,r3			@ F_xx_xx
424 	mov	r9,r9,ror#31
425 	add	r4,r4,r5,ror#27			@ E+=ROR(A,27)
426 	eor	r9,r9,r11,ror#31
427 	str	r9,[r14,#-4]!
428 	and	r10,r6,r10,ror#2					@ F_xx_xx
429 	and	r11,r7,r3					@ F_xx_xx
430 	add	r4,r4,r9			@ E+=X[i]
431 	add	r4,r4,r10			@ E+=F_40_59(B,C,D)
432 	add	r4,r4,r11,ror#2
433 	ldr	r9,[r14,#15*4]
434 	ldr	r10,[r14,#13*4]
435 	ldr	r11,[r14,#7*4]
436 	add	r3,r8,r3,ror#2			@ E+=K_xx_xx
437 	ldr	r12,[r14,#2*4]
438 	eor	r9,r9,r10
439 	eor	r11,r11,r12			@ 1 cycle stall
440 	eor	r10,r6,r7			@ F_xx_xx
441 	mov	r9,r9,ror#31
442 	add	r3,r3,r4,ror#27			@ E+=ROR(A,27)
443 	eor	r9,r9,r11,ror#31
444 	str	r9,[r14,#-4]!
445 	and	r10,r5,r10,ror#2					@ F_xx_xx
446 	and	r11,r6,r7					@ F_xx_xx
447 	add	r3,r3,r9			@ E+=X[i]
448 	add	r3,r3,r10			@ E+=F_40_59(B,C,D)
449 	add	r3,r3,r11,ror#2
450 #if defined(__thumb2__)
451 	mov	r12,sp
452 	teq	r14,r12
453 #else
454 	teq	r14,sp
455 #endif
456 	bne	.L_40_59		@ [+((12+5)*5+2)*4]
457 
458 	ldr	r8,.LK_60_79
459 	sub	sp,sp,#20*4
460 	cmp	sp,#0			@ set carry to denote 60_79
461 	b	.L_20_39_or_60_79	@ [+4], spare 300 bytes
462 .L_done:
463 	add	sp,sp,#80*4		@ "deallocate" stack frame
464 	ldmia	r0,{r8,r9,r10,r11,r12}
465 	add	r3,r8,r3
466 	add	r4,r9,r4
467 	add	r5,r10,r5,ror#2
468 	add	r6,r11,r6,ror#2
469 	add	r7,r12,r7,ror#2
470 	stmia	r0,{r3,r4,r5,r6,r7}
471 	teq	r1,r2
472 	bne	.Lloop			@ [+18], total 1307
473 
474 #if __ARM_ARCH__>=5
475 	ldmia	sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,pc}
476 #else
477 	ldmia	sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr}
478 	tst	lr,#1
479 	moveq	pc,lr			@ be binary compatible with V4, yet
480 .word	0xe12fff1e			@ interoperable with Thumb ISA:-)
481 #endif
482 .size	sha1_block_data_order,.-sha1_block_data_order
483 
484 .align	5
485 .LK_00_19:.word	0x5a827999
486 .LK_20_39:.word	0x6ed9eba1
487 .LK_40_59:.word	0x8f1bbcdc
488 .LK_60_79:.word	0xca62c1d6
489 #if __ARM_MAX_ARCH__>=7
490 .LOPENSSL_armcap:
491 # ifdef	_WIN32
492 .word	OPENSSL_armcap_P
493 # else
494 .word	OPENSSL_armcap_P-.Lsha1_block
495 # endif
496 #endif
497 .byte	83,72,65,49,32,98,108,111,99,107,32,116,114,97,110,115,102,111,114,109,32,102,111,114,32,65,82,77,118,52,47,78,69,79,78,47,65,82,77,118,56,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0
498 .align	2
499 .align	5
500 #if __ARM_MAX_ARCH__>=7
501 .arch	armv7-a
502 .fpu	neon
503 
504 .type	sha1_block_data_order_neon,%function
505 .align	4
506 sha1_block_data_order_neon:
507 .LNEON:
508 	stmdb	sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr}
509 	add	r2,r1,r2,lsl#6	@ r2 to point at the end of r1
510 	@ dmb				@ errata #451034 on early Cortex A8
511 	@ vstmdb	sp!,{d8-d15}	@ ABI specification says so
512 	mov	r14,sp
513 	sub	r12,sp,#64
514 	adr	r8,.LK_00_19
515 	bic	r12,r12,#15		@ align for 128-bit stores
516 
517 	ldmia	r0,{r3,r4,r5,r6,r7}	@ load context
518 	mov	sp,r12		@ alloca
519 
520 	vld1.8	{q0,q1},[r1]!	@ handles unaligned
521 	veor	q15,q15,q15
522 	vld1.8	{q2,q3},[r1]!
523 	vld1.32	{d28[],d29[]},[r8,:32]!	@ load K_00_19
524 	vrev32.8	q0,q0		@ yes, even on
525 	vrev32.8	q1,q1		@ big-endian...
526 	vrev32.8	q2,q2
527 	vadd.i32	q8,q0,q14
528 	vrev32.8	q3,q3
529 	vadd.i32	q9,q1,q14
530 	vst1.32	{q8},[r12,:128]!
531 	vadd.i32	q10,q2,q14
532 	vst1.32	{q9},[r12,:128]!
533 	vst1.32	{q10},[r12,:128]!
534 	ldr	r9,[sp]			@ big RAW stall
535 
536 .Loop_neon:
537 	vext.8	q8,q0,q1,#8
538 	bic	r10,r6,r4
539 	add	r7,r7,r9
540 	and	r11,r5,r4
541 	vadd.i32	q13,q3,q14
542 	ldr	r9,[sp,#4]
543 	add	r7,r7,r3,ror#27
544 	vext.8	q12,q3,q15,#4
545 	eor	r11,r11,r10
546 	mov	r4,r4,ror#2
547 	add	r7,r7,r11
548 	veor	q8,q8,q0
549 	bic	r10,r5,r3
550 	add	r6,r6,r9
551 	veor	q12,q12,q2
552 	and	r11,r4,r3
553 	ldr	r9,[sp,#8]
554 	veor	q12,q12,q8
555 	add	r6,r6,r7,ror#27
556 	eor	r11,r11,r10
557 	vst1.32	{q13},[r12,:128]!
558 	sub	r12,r12,#64
559 	mov	r3,r3,ror#2
560 	add	r6,r6,r11
561 	vext.8	q13,q15,q12,#4
562 	bic	r10,r4,r7
563 	add	r5,r5,r9
564 	vadd.i32	q8,q12,q12
565 	and	r11,r3,r7
566 	ldr	r9,[sp,#12]
567 	vsri.32	q8,q12,#31
568 	add	r5,r5,r6,ror#27
569 	eor	r11,r11,r10
570 	mov	r7,r7,ror#2
571 	vshr.u32	q12,q13,#30
572 	add	r5,r5,r11
573 	bic	r10,r3,r6
574 	vshl.u32	q13,q13,#2
575 	add	r4,r4,r9
576 	and	r11,r7,r6
577 	veor	q8,q8,q12
578 	ldr	r9,[sp,#16]
579 	add	r4,r4,r5,ror#27
580 	veor	q8,q8,q13
581 	eor	r11,r11,r10
582 	mov	r6,r6,ror#2
583 	add	r4,r4,r11
584 	vext.8	q9,q1,q2,#8
585 	bic	r10,r7,r5
586 	add	r3,r3,r9
587 	and	r11,r6,r5
588 	vadd.i32	q13,q8,q14
589 	ldr	r9,[sp,#20]
590 	vld1.32	{d28[],d29[]},[r8,:32]!
591 	add	r3,r3,r4,ror#27
592 	vext.8	q12,q8,q15,#4
593 	eor	r11,r11,r10
594 	mov	r5,r5,ror#2
595 	add	r3,r3,r11
596 	veor	q9,q9,q1
597 	bic	r10,r6,r4
598 	add	r7,r7,r9
599 	veor	q12,q12,q3
600 	and	r11,r5,r4
601 	ldr	r9,[sp,#24]
602 	veor	q12,q12,q9
603 	add	r7,r7,r3,ror#27
604 	eor	r11,r11,r10
605 	vst1.32	{q13},[r12,:128]!
606 	mov	r4,r4,ror#2
607 	add	r7,r7,r11
608 	vext.8	q13,q15,q12,#4
609 	bic	r10,r5,r3
610 	add	r6,r6,r9
611 	vadd.i32	q9,q12,q12
612 	and	r11,r4,r3
613 	ldr	r9,[sp,#28]
614 	vsri.32	q9,q12,#31
615 	add	r6,r6,r7,ror#27
616 	eor	r11,r11,r10
617 	mov	r3,r3,ror#2
618 	vshr.u32	q12,q13,#30
619 	add	r6,r6,r11
620 	bic	r10,r4,r7
621 	vshl.u32	q13,q13,#2
622 	add	r5,r5,r9
623 	and	r11,r3,r7
624 	veor	q9,q9,q12
625 	ldr	r9,[sp,#32]
626 	add	r5,r5,r6,ror#27
627 	veor	q9,q9,q13
628 	eor	r11,r11,r10
629 	mov	r7,r7,ror#2
630 	add	r5,r5,r11
631 	vext.8	q10,q2,q3,#8
632 	bic	r10,r3,r6
633 	add	r4,r4,r9
634 	and	r11,r7,r6
635 	vadd.i32	q13,q9,q14
636 	ldr	r9,[sp,#36]
637 	add	r4,r4,r5,ror#27
638 	vext.8	q12,q9,q15,#4
639 	eor	r11,r11,r10
640 	mov	r6,r6,ror#2
641 	add	r4,r4,r11
642 	veor	q10,q10,q2
643 	bic	r10,r7,r5
644 	add	r3,r3,r9
645 	veor	q12,q12,q8
646 	and	r11,r6,r5
647 	ldr	r9,[sp,#40]
648 	veor	q12,q12,q10
649 	add	r3,r3,r4,ror#27
650 	eor	r11,r11,r10
651 	vst1.32	{q13},[r12,:128]!
652 	mov	r5,r5,ror#2
653 	add	r3,r3,r11
654 	vext.8	q13,q15,q12,#4
655 	bic	r10,r6,r4
656 	add	r7,r7,r9
657 	vadd.i32	q10,q12,q12
658 	and	r11,r5,r4
659 	ldr	r9,[sp,#44]
660 	vsri.32	q10,q12,#31
661 	add	r7,r7,r3,ror#27
662 	eor	r11,r11,r10
663 	mov	r4,r4,ror#2
664 	vshr.u32	q12,q13,#30
665 	add	r7,r7,r11
666 	bic	r10,r5,r3
667 	vshl.u32	q13,q13,#2
668 	add	r6,r6,r9
669 	and	r11,r4,r3
670 	veor	q10,q10,q12
671 	ldr	r9,[sp,#48]
672 	add	r6,r6,r7,ror#27
673 	veor	q10,q10,q13
674 	eor	r11,r11,r10
675 	mov	r3,r3,ror#2
676 	add	r6,r6,r11
677 	vext.8	q11,q3,q8,#8
678 	bic	r10,r4,r7
679 	add	r5,r5,r9
680 	and	r11,r3,r7
681 	vadd.i32	q13,q10,q14
682 	ldr	r9,[sp,#52]
683 	add	r5,r5,r6,ror#27
684 	vext.8	q12,q10,q15,#4
685 	eor	r11,r11,r10
686 	mov	r7,r7,ror#2
687 	add	r5,r5,r11
688 	veor	q11,q11,q3
689 	bic	r10,r3,r6
690 	add	r4,r4,r9
691 	veor	q12,q12,q9
692 	and	r11,r7,r6
693 	ldr	r9,[sp,#56]
694 	veor	q12,q12,q11
695 	add	r4,r4,r5,ror#27
696 	eor	r11,r11,r10
697 	vst1.32	{q13},[r12,:128]!
698 	mov	r6,r6,ror#2
699 	add	r4,r4,r11
700 	vext.8	q13,q15,q12,#4
701 	bic	r10,r7,r5
702 	add	r3,r3,r9
703 	vadd.i32	q11,q12,q12
704 	and	r11,r6,r5
705 	ldr	r9,[sp,#60]
706 	vsri.32	q11,q12,#31
707 	add	r3,r3,r4,ror#27
708 	eor	r11,r11,r10
709 	mov	r5,r5,ror#2
710 	vshr.u32	q12,q13,#30
711 	add	r3,r3,r11
712 	bic	r10,r6,r4
713 	vshl.u32	q13,q13,#2
714 	add	r7,r7,r9
715 	and	r11,r5,r4
716 	veor	q11,q11,q12
717 	ldr	r9,[sp,#0]
718 	add	r7,r7,r3,ror#27
719 	veor	q11,q11,q13
720 	eor	r11,r11,r10
721 	mov	r4,r4,ror#2
722 	add	r7,r7,r11
723 	vext.8	q12,q10,q11,#8
724 	bic	r10,r5,r3
725 	add	r6,r6,r9
726 	and	r11,r4,r3
727 	veor	q0,q0,q8
728 	ldr	r9,[sp,#4]
729 	add	r6,r6,r7,ror#27
730 	veor	q0,q0,q1
731 	eor	r11,r11,r10
732 	mov	r3,r3,ror#2
733 	vadd.i32	q13,q11,q14
734 	add	r6,r6,r11
735 	bic	r10,r4,r7
736 	veor	q12,q12,q0
737 	add	r5,r5,r9
738 	and	r11,r3,r7
739 	vshr.u32	q0,q12,#30
740 	ldr	r9,[sp,#8]
741 	add	r5,r5,r6,ror#27
742 	vst1.32	{q13},[r12,:128]!
743 	sub	r12,r12,#64
744 	eor	r11,r11,r10
745 	mov	r7,r7,ror#2
746 	vsli.32	q0,q12,#2
747 	add	r5,r5,r11
748 	bic	r10,r3,r6
749 	add	r4,r4,r9
750 	and	r11,r7,r6
751 	ldr	r9,[sp,#12]
752 	add	r4,r4,r5,ror#27
753 	eor	r11,r11,r10
754 	mov	r6,r6,ror#2
755 	add	r4,r4,r11
756 	bic	r10,r7,r5
757 	add	r3,r3,r9
758 	and	r11,r6,r5
759 	ldr	r9,[sp,#16]
760 	add	r3,r3,r4,ror#27
761 	eor	r11,r11,r10
762 	mov	r5,r5,ror#2
763 	add	r3,r3,r11
764 	vext.8	q12,q11,q0,#8
765 	eor	r10,r4,r6
766 	add	r7,r7,r9
767 	ldr	r9,[sp,#20]
768 	veor	q1,q1,q9
769 	eor	r11,r10,r5
770 	add	r7,r7,r3,ror#27
771 	veor	q1,q1,q2
772 	mov	r4,r4,ror#2
773 	add	r7,r7,r11
774 	vadd.i32	q13,q0,q14
775 	eor	r10,r3,r5
776 	add	r6,r6,r9
777 	veor	q12,q12,q1
778 	ldr	r9,[sp,#24]
779 	eor	r11,r10,r4
780 	vshr.u32	q1,q12,#30
781 	add	r6,r6,r7,ror#27
782 	mov	r3,r3,ror#2
783 	vst1.32	{q13},[r12,:128]!
784 	add	r6,r6,r11
785 	eor	r10,r7,r4
786 	vsli.32	q1,q12,#2
787 	add	r5,r5,r9
788 	ldr	r9,[sp,#28]
789 	eor	r11,r10,r3
790 	add	r5,r5,r6,ror#27
791 	mov	r7,r7,ror#2
792 	add	r5,r5,r11
793 	eor	r10,r6,r3
794 	add	r4,r4,r9
795 	ldr	r9,[sp,#32]
796 	eor	r11,r10,r7
797 	add	r4,r4,r5,ror#27
798 	mov	r6,r6,ror#2
799 	add	r4,r4,r11
800 	vext.8	q12,q0,q1,#8
801 	eor	r10,r5,r7
802 	add	r3,r3,r9
803 	ldr	r9,[sp,#36]
804 	veor	q2,q2,q10
805 	eor	r11,r10,r6
806 	add	r3,r3,r4,ror#27
807 	veor	q2,q2,q3
808 	mov	r5,r5,ror#2
809 	add	r3,r3,r11
810 	vadd.i32	q13,q1,q14
811 	eor	r10,r4,r6
812 	vld1.32	{d28[],d29[]},[r8,:32]!
813 	add	r7,r7,r9
814 	veor	q12,q12,q2
815 	ldr	r9,[sp,#40]
816 	eor	r11,r10,r5
817 	vshr.u32	q2,q12,#30
818 	add	r7,r7,r3,ror#27
819 	mov	r4,r4,ror#2
820 	vst1.32	{q13},[r12,:128]!
821 	add	r7,r7,r11
822 	eor	r10,r3,r5
823 	vsli.32	q2,q12,#2
824 	add	r6,r6,r9
825 	ldr	r9,[sp,#44]
826 	eor	r11,r10,r4
827 	add	r6,r6,r7,ror#27
828 	mov	r3,r3,ror#2
829 	add	r6,r6,r11
830 	eor	r10,r7,r4
831 	add	r5,r5,r9
832 	ldr	r9,[sp,#48]
833 	eor	r11,r10,r3
834 	add	r5,r5,r6,ror#27
835 	mov	r7,r7,ror#2
836 	add	r5,r5,r11
837 	vext.8	q12,q1,q2,#8
838 	eor	r10,r6,r3
839 	add	r4,r4,r9
840 	ldr	r9,[sp,#52]
841 	veor	q3,q3,q11
842 	eor	r11,r10,r7
843 	add	r4,r4,r5,ror#27
844 	veor	q3,q3,q8
845 	mov	r6,r6,ror#2
846 	add	r4,r4,r11
847 	vadd.i32	q13,q2,q14
848 	eor	r10,r5,r7
849 	add	r3,r3,r9
850 	veor	q12,q12,q3
851 	ldr	r9,[sp,#56]
852 	eor	r11,r10,r6
853 	vshr.u32	q3,q12,#30
854 	add	r3,r3,r4,ror#27
855 	mov	r5,r5,ror#2
856 	vst1.32	{q13},[r12,:128]!
857 	add	r3,r3,r11
858 	eor	r10,r4,r6
859 	vsli.32	q3,q12,#2
860 	add	r7,r7,r9
861 	ldr	r9,[sp,#60]
862 	eor	r11,r10,r5
863 	add	r7,r7,r3,ror#27
864 	mov	r4,r4,ror#2
865 	add	r7,r7,r11
866 	eor	r10,r3,r5
867 	add	r6,r6,r9
868 	ldr	r9,[sp,#0]
869 	eor	r11,r10,r4
870 	add	r6,r6,r7,ror#27
871 	mov	r3,r3,ror#2
872 	add	r6,r6,r11
873 	vext.8	q12,q2,q3,#8
874 	eor	r10,r7,r4
875 	add	r5,r5,r9
876 	ldr	r9,[sp,#4]
877 	veor	q8,q8,q0
878 	eor	r11,r10,r3
879 	add	r5,r5,r6,ror#27
880 	veor	q8,q8,q9
881 	mov	r7,r7,ror#2
882 	add	r5,r5,r11
883 	vadd.i32	q13,q3,q14
884 	eor	r10,r6,r3
885 	add	r4,r4,r9
886 	veor	q12,q12,q8
887 	ldr	r9,[sp,#8]
888 	eor	r11,r10,r7
889 	vshr.u32	q8,q12,#30
890 	add	r4,r4,r5,ror#27
891 	mov	r6,r6,ror#2
892 	vst1.32	{q13},[r12,:128]!
893 	sub	r12,r12,#64
894 	add	r4,r4,r11
895 	eor	r10,r5,r7
896 	vsli.32	q8,q12,#2
897 	add	r3,r3,r9
898 	ldr	r9,[sp,#12]
899 	eor	r11,r10,r6
900 	add	r3,r3,r4,ror#27
901 	mov	r5,r5,ror#2
902 	add	r3,r3,r11
903 	eor	r10,r4,r6
904 	add	r7,r7,r9
905 	ldr	r9,[sp,#16]
906 	eor	r11,r10,r5
907 	add	r7,r7,r3,ror#27
908 	mov	r4,r4,ror#2
909 	add	r7,r7,r11
910 	vext.8	q12,q3,q8,#8
911 	eor	r10,r3,r5
912 	add	r6,r6,r9
913 	ldr	r9,[sp,#20]
914 	veor	q9,q9,q1
915 	eor	r11,r10,r4
916 	add	r6,r6,r7,ror#27
917 	veor	q9,q9,q10
918 	mov	r3,r3,ror#2
919 	add	r6,r6,r11
920 	vadd.i32	q13,q8,q14
921 	eor	r10,r7,r4
922 	add	r5,r5,r9
923 	veor	q12,q12,q9
924 	ldr	r9,[sp,#24]
925 	eor	r11,r10,r3
926 	vshr.u32	q9,q12,#30
927 	add	r5,r5,r6,ror#27
928 	mov	r7,r7,ror#2
929 	vst1.32	{q13},[r12,:128]!
930 	add	r5,r5,r11
931 	eor	r10,r6,r3
932 	vsli.32	q9,q12,#2
933 	add	r4,r4,r9
934 	ldr	r9,[sp,#28]
935 	eor	r11,r10,r7
936 	add	r4,r4,r5,ror#27
937 	mov	r6,r6,ror#2
938 	add	r4,r4,r11
939 	eor	r10,r5,r7
940 	add	r3,r3,r9
941 	ldr	r9,[sp,#32]
942 	eor	r11,r10,r6
943 	add	r3,r3,r4,ror#27
944 	mov	r5,r5,ror#2
945 	add	r3,r3,r11
946 	vext.8	q12,q8,q9,#8
947 	add	r7,r7,r9
948 	and	r10,r5,r6
949 	ldr	r9,[sp,#36]
950 	veor	q10,q10,q2
951 	add	r7,r7,r3,ror#27
952 	eor	r11,r5,r6
953 	veor	q10,q10,q11
954 	add	r7,r7,r10
955 	and	r11,r11,r4
956 	vadd.i32	q13,q9,q14
957 	mov	r4,r4,ror#2
958 	add	r7,r7,r11
959 	veor	q12,q12,q10
960 	add	r6,r6,r9
961 	and	r10,r4,r5
962 	vshr.u32	q10,q12,#30
963 	ldr	r9,[sp,#40]
964 	add	r6,r6,r7,ror#27
965 	vst1.32	{q13},[r12,:128]!
966 	eor	r11,r4,r5
967 	add	r6,r6,r10
968 	vsli.32	q10,q12,#2
969 	and	r11,r11,r3
970 	mov	r3,r3,ror#2
971 	add	r6,r6,r11
972 	add	r5,r5,r9
973 	and	r10,r3,r4
974 	ldr	r9,[sp,#44]
975 	add	r5,r5,r6,ror#27
976 	eor	r11,r3,r4
977 	add	r5,r5,r10
978 	and	r11,r11,r7
979 	mov	r7,r7,ror#2
980 	add	r5,r5,r11
981 	add	r4,r4,r9
982 	and	r10,r7,r3
983 	ldr	r9,[sp,#48]
984 	add	r4,r4,r5,ror#27
985 	eor	r11,r7,r3
986 	add	r4,r4,r10
987 	and	r11,r11,r6
988 	mov	r6,r6,ror#2
989 	add	r4,r4,r11
990 	vext.8	q12,q9,q10,#8
991 	add	r3,r3,r9
992 	and	r10,r6,r7
993 	ldr	r9,[sp,#52]
994 	veor	q11,q11,q3
995 	add	r3,r3,r4,ror#27
996 	eor	r11,r6,r7
997 	veor	q11,q11,q0
998 	add	r3,r3,r10
999 	and	r11,r11,r5
1000 	vadd.i32	q13,q10,q14
1001 	mov	r5,r5,ror#2
1002 	vld1.32	{d28[],d29[]},[r8,:32]!
1003 	add	r3,r3,r11
1004 	veor	q12,q12,q11
1005 	add	r7,r7,r9
1006 	and	r10,r5,r6
1007 	vshr.u32	q11,q12,#30
1008 	ldr	r9,[sp,#56]
1009 	add	r7,r7,r3,ror#27
1010 	vst1.32	{q13},[r12,:128]!
1011 	eor	r11,r5,r6
1012 	add	r7,r7,r10
1013 	vsli.32	q11,q12,#2
1014 	and	r11,r11,r4
1015 	mov	r4,r4,ror#2
1016 	add	r7,r7,r11
1017 	add	r6,r6,r9
1018 	and	r10,r4,r5
1019 	ldr	r9,[sp,#60]
1020 	add	r6,r6,r7,ror#27
1021 	eor	r11,r4,r5
1022 	add	r6,r6,r10
1023 	and	r11,r11,r3
1024 	mov	r3,r3,ror#2
1025 	add	r6,r6,r11
1026 	add	r5,r5,r9
1027 	and	r10,r3,r4
1028 	ldr	r9,[sp,#0]
1029 	add	r5,r5,r6,ror#27
1030 	eor	r11,r3,r4
1031 	add	r5,r5,r10
1032 	and	r11,r11,r7
1033 	mov	r7,r7,ror#2
1034 	add	r5,r5,r11
1035 	vext.8	q12,q10,q11,#8
1036 	add	r4,r4,r9
1037 	and	r10,r7,r3
1038 	ldr	r9,[sp,#4]
1039 	veor	q0,q0,q8
1040 	add	r4,r4,r5,ror#27
1041 	eor	r11,r7,r3
1042 	veor	q0,q0,q1
1043 	add	r4,r4,r10
1044 	and	r11,r11,r6
1045 	vadd.i32	q13,q11,q14
1046 	mov	r6,r6,ror#2
1047 	add	r4,r4,r11
1048 	veor	q12,q12,q0
1049 	add	r3,r3,r9
1050 	and	r10,r6,r7
1051 	vshr.u32	q0,q12,#30
1052 	ldr	r9,[sp,#8]
1053 	add	r3,r3,r4,ror#27
1054 	vst1.32	{q13},[r12,:128]!
1055 	sub	r12,r12,#64
1056 	eor	r11,r6,r7
1057 	add	r3,r3,r10
1058 	vsli.32	q0,q12,#2
1059 	and	r11,r11,r5
1060 	mov	r5,r5,ror#2
1061 	add	r3,r3,r11
1062 	add	r7,r7,r9
1063 	and	r10,r5,r6
1064 	ldr	r9,[sp,#12]
1065 	add	r7,r7,r3,ror#27
1066 	eor	r11,r5,r6
1067 	add	r7,r7,r10
1068 	and	r11,r11,r4
1069 	mov	r4,r4,ror#2
1070 	add	r7,r7,r11
1071 	add	r6,r6,r9
1072 	and	r10,r4,r5
1073 	ldr	r9,[sp,#16]
1074 	add	r6,r6,r7,ror#27
1075 	eor	r11,r4,r5
1076 	add	r6,r6,r10
1077 	and	r11,r11,r3
1078 	mov	r3,r3,ror#2
1079 	add	r6,r6,r11
1080 	vext.8	q12,q11,q0,#8
1081 	add	r5,r5,r9
1082 	and	r10,r3,r4
1083 	ldr	r9,[sp,#20]
1084 	veor	q1,q1,q9
1085 	add	r5,r5,r6,ror#27
1086 	eor	r11,r3,r4
1087 	veor	q1,q1,q2
1088 	add	r5,r5,r10
1089 	and	r11,r11,r7
1090 	vadd.i32	q13,q0,q14
1091 	mov	r7,r7,ror#2
1092 	add	r5,r5,r11
1093 	veor	q12,q12,q1
1094 	add	r4,r4,r9
1095 	and	r10,r7,r3
1096 	vshr.u32	q1,q12,#30
1097 	ldr	r9,[sp,#24]
1098 	add	r4,r4,r5,ror#27
1099 	vst1.32	{q13},[r12,:128]!
1100 	eor	r11,r7,r3
1101 	add	r4,r4,r10
1102 	vsli.32	q1,q12,#2
1103 	and	r11,r11,r6
1104 	mov	r6,r6,ror#2
1105 	add	r4,r4,r11
1106 	add	r3,r3,r9
1107 	and	r10,r6,r7
1108 	ldr	r9,[sp,#28]
1109 	add	r3,r3,r4,ror#27
1110 	eor	r11,r6,r7
1111 	add	r3,r3,r10
1112 	and	r11,r11,r5
1113 	mov	r5,r5,ror#2
1114 	add	r3,r3,r11
1115 	add	r7,r7,r9
1116 	and	r10,r5,r6
1117 	ldr	r9,[sp,#32]
1118 	add	r7,r7,r3,ror#27
1119 	eor	r11,r5,r6
1120 	add	r7,r7,r10
1121 	and	r11,r11,r4
1122 	mov	r4,r4,ror#2
1123 	add	r7,r7,r11
1124 	vext.8	q12,q0,q1,#8
1125 	add	r6,r6,r9
1126 	and	r10,r4,r5
1127 	ldr	r9,[sp,#36]
1128 	veor	q2,q2,q10
1129 	add	r6,r6,r7,ror#27
1130 	eor	r11,r4,r5
1131 	veor	q2,q2,q3
1132 	add	r6,r6,r10
1133 	and	r11,r11,r3
1134 	vadd.i32	q13,q1,q14
1135 	mov	r3,r3,ror#2
1136 	add	r6,r6,r11
1137 	veor	q12,q12,q2
1138 	add	r5,r5,r9
1139 	and	r10,r3,r4
1140 	vshr.u32	q2,q12,#30
1141 	ldr	r9,[sp,#40]
1142 	add	r5,r5,r6,ror#27
1143 	vst1.32	{q13},[r12,:128]!
1144 	eor	r11,r3,r4
1145 	add	r5,r5,r10
1146 	vsli.32	q2,q12,#2
1147 	and	r11,r11,r7
1148 	mov	r7,r7,ror#2
1149 	add	r5,r5,r11
1150 	add	r4,r4,r9
1151 	and	r10,r7,r3
1152 	ldr	r9,[sp,#44]
1153 	add	r4,r4,r5,ror#27
1154 	eor	r11,r7,r3
1155 	add	r4,r4,r10
1156 	and	r11,r11,r6
1157 	mov	r6,r6,ror#2
1158 	add	r4,r4,r11
1159 	add	r3,r3,r9
1160 	and	r10,r6,r7
1161 	ldr	r9,[sp,#48]
1162 	add	r3,r3,r4,ror#27
1163 	eor	r11,r6,r7
1164 	add	r3,r3,r10
1165 	and	r11,r11,r5
1166 	mov	r5,r5,ror#2
1167 	add	r3,r3,r11
1168 	vext.8	q12,q1,q2,#8
1169 	eor	r10,r4,r6
1170 	add	r7,r7,r9
1171 	ldr	r9,[sp,#52]
1172 	veor	q3,q3,q11
1173 	eor	r11,r10,r5
1174 	add	r7,r7,r3,ror#27
1175 	veor	q3,q3,q8
1176 	mov	r4,r4,ror#2
1177 	add	r7,r7,r11
1178 	vadd.i32	q13,q2,q14
1179 	eor	r10,r3,r5
1180 	add	r6,r6,r9
1181 	veor	q12,q12,q3
1182 	ldr	r9,[sp,#56]
1183 	eor	r11,r10,r4
1184 	vshr.u32	q3,q12,#30
1185 	add	r6,r6,r7,ror#27
1186 	mov	r3,r3,ror#2
1187 	vst1.32	{q13},[r12,:128]!
1188 	add	r6,r6,r11
1189 	eor	r10,r7,r4
1190 	vsli.32	q3,q12,#2
1191 	add	r5,r5,r9
1192 	ldr	r9,[sp,#60]
1193 	eor	r11,r10,r3
1194 	add	r5,r5,r6,ror#27
1195 	mov	r7,r7,ror#2
1196 	add	r5,r5,r11
1197 	eor	r10,r6,r3
1198 	add	r4,r4,r9
1199 	ldr	r9,[sp,#0]
1200 	eor	r11,r10,r7
1201 	add	r4,r4,r5,ror#27
1202 	mov	r6,r6,ror#2
1203 	add	r4,r4,r11
1204 	vadd.i32	q13,q3,q14
1205 	eor	r10,r5,r7
1206 	add	r3,r3,r9
1207 	vst1.32	{q13},[r12,:128]!
1208 	sub	r12,r12,#64
1209 	teq	r1,r2
1210 	sub	r8,r8,#16
1211 	it	eq
1212 	subeq	r1,r1,#64
1213 	vld1.8	{q0,q1},[r1]!
1214 	ldr	r9,[sp,#4]
1215 	eor	r11,r10,r6
1216 	vld1.8	{q2,q3},[r1]!
1217 	add	r3,r3,r4,ror#27
1218 	mov	r5,r5,ror#2
1219 	vld1.32	{d28[],d29[]},[r8,:32]!
1220 	add	r3,r3,r11
1221 	eor	r10,r4,r6
1222 	vrev32.8	q0,q0
1223 	add	r7,r7,r9
1224 	ldr	r9,[sp,#8]
1225 	eor	r11,r10,r5
1226 	add	r7,r7,r3,ror#27
1227 	mov	r4,r4,ror#2
1228 	add	r7,r7,r11
1229 	eor	r10,r3,r5
1230 	add	r6,r6,r9
1231 	ldr	r9,[sp,#12]
1232 	eor	r11,r10,r4
1233 	add	r6,r6,r7,ror#27
1234 	mov	r3,r3,ror#2
1235 	add	r6,r6,r11
1236 	eor	r10,r7,r4
1237 	add	r5,r5,r9
1238 	ldr	r9,[sp,#16]
1239 	eor	r11,r10,r3
1240 	add	r5,r5,r6,ror#27
1241 	mov	r7,r7,ror#2
1242 	add	r5,r5,r11
1243 	vrev32.8	q1,q1
1244 	eor	r10,r6,r3
1245 	add	r4,r4,r9
1246 	vadd.i32	q8,q0,q14
1247 	ldr	r9,[sp,#20]
1248 	eor	r11,r10,r7
1249 	vst1.32	{q8},[r12,:128]!
1250 	add	r4,r4,r5,ror#27
1251 	mov	r6,r6,ror#2
1252 	add	r4,r4,r11
1253 	eor	r10,r5,r7
1254 	add	r3,r3,r9
1255 	ldr	r9,[sp,#24]
1256 	eor	r11,r10,r6
1257 	add	r3,r3,r4,ror#27
1258 	mov	r5,r5,ror#2
1259 	add	r3,r3,r11
1260 	eor	r10,r4,r6
1261 	add	r7,r7,r9
1262 	ldr	r9,[sp,#28]
1263 	eor	r11,r10,r5
1264 	add	r7,r7,r3,ror#27
1265 	mov	r4,r4,ror#2
1266 	add	r7,r7,r11
1267 	eor	r10,r3,r5
1268 	add	r6,r6,r9
1269 	ldr	r9,[sp,#32]
1270 	eor	r11,r10,r4
1271 	add	r6,r6,r7,ror#27
1272 	mov	r3,r3,ror#2
1273 	add	r6,r6,r11
1274 	vrev32.8	q2,q2
1275 	eor	r10,r7,r4
1276 	add	r5,r5,r9
1277 	vadd.i32	q9,q1,q14
1278 	ldr	r9,[sp,#36]
1279 	eor	r11,r10,r3
1280 	vst1.32	{q9},[r12,:128]!
1281 	add	r5,r5,r6,ror#27
1282 	mov	r7,r7,ror#2
1283 	add	r5,r5,r11
1284 	eor	r10,r6,r3
1285 	add	r4,r4,r9
1286 	ldr	r9,[sp,#40]
1287 	eor	r11,r10,r7
1288 	add	r4,r4,r5,ror#27
1289 	mov	r6,r6,ror#2
1290 	add	r4,r4,r11
1291 	eor	r10,r5,r7
1292 	add	r3,r3,r9
1293 	ldr	r9,[sp,#44]
1294 	eor	r11,r10,r6
1295 	add	r3,r3,r4,ror#27
1296 	mov	r5,r5,ror#2
1297 	add	r3,r3,r11
1298 	eor	r10,r4,r6
1299 	add	r7,r7,r9
1300 	ldr	r9,[sp,#48]
1301 	eor	r11,r10,r5
1302 	add	r7,r7,r3,ror#27
1303 	mov	r4,r4,ror#2
1304 	add	r7,r7,r11
1305 	vrev32.8	q3,q3
1306 	eor	r10,r3,r5
1307 	add	r6,r6,r9
1308 	vadd.i32	q10,q2,q14
1309 	ldr	r9,[sp,#52]
1310 	eor	r11,r10,r4
1311 	vst1.32	{q10},[r12,:128]!
1312 	add	r6,r6,r7,ror#27
1313 	mov	r3,r3,ror#2
1314 	add	r6,r6,r11
1315 	eor	r10,r7,r4
1316 	add	r5,r5,r9
1317 	ldr	r9,[sp,#56]
1318 	eor	r11,r10,r3
1319 	add	r5,r5,r6,ror#27
1320 	mov	r7,r7,ror#2
1321 	add	r5,r5,r11
1322 	eor	r10,r6,r3
1323 	add	r4,r4,r9
1324 	ldr	r9,[sp,#60]
1325 	eor	r11,r10,r7
1326 	add	r4,r4,r5,ror#27
1327 	mov	r6,r6,ror#2
1328 	add	r4,r4,r11
1329 	eor	r10,r5,r7
1330 	add	r3,r3,r9
1331 	eor	r11,r10,r6
1332 	add	r3,r3,r4,ror#27
1333 	mov	r5,r5,ror#2
1334 	add	r3,r3,r11
1335 	ldmia	r0,{r9,r10,r11,r12}	@ accumulate context
1336 	add	r3,r3,r9
1337 	ldr	r9,[r0,#16]
1338 	add	r4,r4,r10
1339 	add	r5,r5,r11
1340 	add	r6,r6,r12
1341 	it	eq
1342 	moveq	sp,r14
1343 	add	r7,r7,r9
1344 	it	ne
1345 	ldrne	r9,[sp]
1346 	stmia	r0,{r3,r4,r5,r6,r7}
1347 	itt	ne
1348 	addne	r12,sp,#3*16
1349 	bne	.Loop_neon
1350 
1351 	@ vldmia	sp!,{d8-d15}
1352 	ldmia	sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,pc}
1353 .size	sha1_block_data_order_neon,.-sha1_block_data_order_neon
1354 #endif
1355 #if __ARM_MAX_ARCH__>=7
1356 
1357 # if defined(__thumb2__)
1358 #  define INST(a,b,c,d)	.byte	c,d|0xf,a,b
1359 # else
1360 #  define INST(a,b,c,d)	.byte	a,b,c,d|0x10
1361 # endif
1362 
1363 .type	sha1_block_data_order_armv8,%function
1364 .align	5
1365 sha1_block_data_order_armv8:
1366 .LARMv8:
1367 	vstmdb	sp!,{d8,d9,d10,d11,d12,d13,d14,d15}		@ ABI specification says so
1368 
1369 	veor	q1,q1,q1
1370 	adr	r3,.LK_00_19
1371 	vld1.32	{q0},[r0]!
1372 	vld1.32	{d2[0]},[r0]
1373 	sub	r0,r0,#16
1374 	vld1.32	{d16[],d17[]},[r3,:32]!
1375 	vld1.32	{d18[],d19[]},[r3,:32]!
1376 	vld1.32	{d20[],d21[]},[r3,:32]!
1377 	vld1.32	{d22[],d23[]},[r3,:32]
1378 
1379 .Loop_v8:
1380 	vld1.8	{q4,q5},[r1]!
1381 	vld1.8	{q6,q7},[r1]!
1382 	vrev32.8	q4,q4
1383 	vrev32.8	q5,q5
1384 
1385 	vadd.i32	q12,q8,q4
1386 	vrev32.8	q6,q6
1387 	vmov	q14,q0	@ offload
1388 	subs	r2,r2,#1
1389 
1390 	vadd.i32	q13,q8,q5
1391 	vrev32.8	q7,q7
1392 	INST(0xc0,0x62,0xb9,0xf3)	@ sha1h q3,q0		@ 0
1393 	INST(0x68,0x0c,0x02,0xe2)	@ sha1c q0,q1,q12
1394 	vadd.i32	q12,q8,q6
1395 	INST(0x4c,0x8c,0x3a,0xe2)	@ sha1su0 q4,q5,q6
1396 	INST(0xc0,0x42,0xb9,0xf3)	@ sha1h q2,q0		@ 1
1397 	INST(0x6a,0x0c,0x06,0xe2)	@ sha1c q0,q3,q13
1398 	vadd.i32	q13,q8,q7
1399 	INST(0x8e,0x83,0xba,0xf3)	@ sha1su1 q4,q7
1400 	INST(0x4e,0xac,0x3c,0xe2)	@ sha1su0 q5,q6,q7
1401 	INST(0xc0,0x62,0xb9,0xf3)	@ sha1h q3,q0		@ 2
1402 	INST(0x68,0x0c,0x04,0xe2)	@ sha1c q0,q2,q12
1403 	vadd.i32	q12,q8,q4
1404 	INST(0x88,0xa3,0xba,0xf3)	@ sha1su1 q5,q4
1405 	INST(0x48,0xcc,0x3e,0xe2)	@ sha1su0 q6,q7,q4
1406 	INST(0xc0,0x42,0xb9,0xf3)	@ sha1h q2,q0		@ 3
1407 	INST(0x6a,0x0c,0x06,0xe2)	@ sha1c q0,q3,q13
1408 	vadd.i32	q13,q9,q5
1409 	INST(0x8a,0xc3,0xba,0xf3)	@ sha1su1 q6,q5
1410 	INST(0x4a,0xec,0x38,0xe2)	@ sha1su0 q7,q4,q5
1411 	INST(0xc0,0x62,0xb9,0xf3)	@ sha1h q3,q0		@ 4
1412 	INST(0x68,0x0c,0x04,0xe2)	@ sha1c q0,q2,q12
1413 	vadd.i32	q12,q9,q6
1414 	INST(0x8c,0xe3,0xba,0xf3)	@ sha1su1 q7,q6
1415 	INST(0x4c,0x8c,0x3a,0xe2)	@ sha1su0 q4,q5,q6
1416 	INST(0xc0,0x42,0xb9,0xf3)	@ sha1h q2,q0		@ 5
1417 	INST(0x6a,0x0c,0x16,0xe2)	@ sha1p q0,q3,q13
1418 	vadd.i32	q13,q9,q7
1419 	INST(0x8e,0x83,0xba,0xf3)	@ sha1su1 q4,q7
1420 	INST(0x4e,0xac,0x3c,0xe2)	@ sha1su0 q5,q6,q7
1421 	INST(0xc0,0x62,0xb9,0xf3)	@ sha1h q3,q0		@ 6
1422 	INST(0x68,0x0c,0x14,0xe2)	@ sha1p q0,q2,q12
1423 	vadd.i32	q12,q9,q4
1424 	INST(0x88,0xa3,0xba,0xf3)	@ sha1su1 q5,q4
1425 	INST(0x48,0xcc,0x3e,0xe2)	@ sha1su0 q6,q7,q4
1426 	INST(0xc0,0x42,0xb9,0xf3)	@ sha1h q2,q0		@ 7
1427 	INST(0x6a,0x0c,0x16,0xe2)	@ sha1p q0,q3,q13
1428 	vadd.i32	q13,q9,q5
1429 	INST(0x8a,0xc3,0xba,0xf3)	@ sha1su1 q6,q5
1430 	INST(0x4a,0xec,0x38,0xe2)	@ sha1su0 q7,q4,q5
1431 	INST(0xc0,0x62,0xb9,0xf3)	@ sha1h q3,q0		@ 8
1432 	INST(0x68,0x0c,0x14,0xe2)	@ sha1p q0,q2,q12
1433 	vadd.i32	q12,q10,q6
1434 	INST(0x8c,0xe3,0xba,0xf3)	@ sha1su1 q7,q6
1435 	INST(0x4c,0x8c,0x3a,0xe2)	@ sha1su0 q4,q5,q6
1436 	INST(0xc0,0x42,0xb9,0xf3)	@ sha1h q2,q0		@ 9
1437 	INST(0x6a,0x0c,0x16,0xe2)	@ sha1p q0,q3,q13
1438 	vadd.i32	q13,q10,q7
1439 	INST(0x8e,0x83,0xba,0xf3)	@ sha1su1 q4,q7
1440 	INST(0x4e,0xac,0x3c,0xe2)	@ sha1su0 q5,q6,q7
1441 	INST(0xc0,0x62,0xb9,0xf3)	@ sha1h q3,q0		@ 10
1442 	INST(0x68,0x0c,0x24,0xe2)	@ sha1m q0,q2,q12
1443 	vadd.i32	q12,q10,q4
1444 	INST(0x88,0xa3,0xba,0xf3)	@ sha1su1 q5,q4
1445 	INST(0x48,0xcc,0x3e,0xe2)	@ sha1su0 q6,q7,q4
1446 	INST(0xc0,0x42,0xb9,0xf3)	@ sha1h q2,q0		@ 11
1447 	INST(0x6a,0x0c,0x26,0xe2)	@ sha1m q0,q3,q13
1448 	vadd.i32	q13,q10,q5
1449 	INST(0x8a,0xc3,0xba,0xf3)	@ sha1su1 q6,q5
1450 	INST(0x4a,0xec,0x38,0xe2)	@ sha1su0 q7,q4,q5
1451 	INST(0xc0,0x62,0xb9,0xf3)	@ sha1h q3,q0		@ 12
1452 	INST(0x68,0x0c,0x24,0xe2)	@ sha1m q0,q2,q12
1453 	vadd.i32	q12,q10,q6
1454 	INST(0x8c,0xe3,0xba,0xf3)	@ sha1su1 q7,q6
1455 	INST(0x4c,0x8c,0x3a,0xe2)	@ sha1su0 q4,q5,q6
1456 	INST(0xc0,0x42,0xb9,0xf3)	@ sha1h q2,q0		@ 13
1457 	INST(0x6a,0x0c,0x26,0xe2)	@ sha1m q0,q3,q13
1458 	vadd.i32	q13,q11,q7
1459 	INST(0x8e,0x83,0xba,0xf3)	@ sha1su1 q4,q7
1460 	INST(0x4e,0xac,0x3c,0xe2)	@ sha1su0 q5,q6,q7
1461 	INST(0xc0,0x62,0xb9,0xf3)	@ sha1h q3,q0		@ 14
1462 	INST(0x68,0x0c,0x24,0xe2)	@ sha1m q0,q2,q12
1463 	vadd.i32	q12,q11,q4
1464 	INST(0x88,0xa3,0xba,0xf3)	@ sha1su1 q5,q4
1465 	INST(0x48,0xcc,0x3e,0xe2)	@ sha1su0 q6,q7,q4
1466 	INST(0xc0,0x42,0xb9,0xf3)	@ sha1h q2,q0		@ 15
1467 	INST(0x6a,0x0c,0x16,0xe2)	@ sha1p q0,q3,q13
1468 	vadd.i32	q13,q11,q5
1469 	INST(0x8a,0xc3,0xba,0xf3)	@ sha1su1 q6,q5
1470 	INST(0x4a,0xec,0x38,0xe2)	@ sha1su0 q7,q4,q5
1471 	INST(0xc0,0x62,0xb9,0xf3)	@ sha1h q3,q0		@ 16
1472 	INST(0x68,0x0c,0x14,0xe2)	@ sha1p q0,q2,q12
1473 	vadd.i32	q12,q11,q6
1474 	INST(0x8c,0xe3,0xba,0xf3)	@ sha1su1 q7,q6
1475 	INST(0xc0,0x42,0xb9,0xf3)	@ sha1h q2,q0		@ 17
1476 	INST(0x6a,0x0c,0x16,0xe2)	@ sha1p q0,q3,q13
1477 	vadd.i32	q13,q11,q7
1478 
1479 	INST(0xc0,0x62,0xb9,0xf3)	@ sha1h q3,q0		@ 18
1480 	INST(0x68,0x0c,0x14,0xe2)	@ sha1p q0,q2,q12
1481 
1482 	INST(0xc0,0x42,0xb9,0xf3)	@ sha1h q2,q0		@ 19
1483 	INST(0x6a,0x0c,0x16,0xe2)	@ sha1p q0,q3,q13
1484 
1485 	vadd.i32	q1,q1,q2
1486 	vadd.i32	q0,q0,q14
1487 	bne	.Loop_v8
1488 
1489 	vst1.32	{q0},[r0]!
1490 	vst1.32	{d2[0]},[r0]
1491 
1492 	vldmia	sp!,{d8,d9,d10,d11,d12,d13,d14,d15}
1493 	bx	lr					@ bx lr
1494 .size	sha1_block_data_order_armv8,.-sha1_block_data_order_armv8
1495 #endif
1496 #if __ARM_MAX_ARCH__>=7
1497 .comm	OPENSSL_armcap_P,4,4
1498 #endif
1499