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